LCD에 대한 의존성


위는 INT.c의 소스이다.

위 처럼 LCD_Str없이는 Interrupt를 쓸 수 없게 된다. 이를 의존성(Depandency)라고 한다.


다른곳에도 인터럽트 활용해 보기

인터럽트를 여러곳에 사용하기 위해 INT.h에 있던 인터럽트 활성화 소스 부분을 smart.h로 이동하여 전체적으로 사용 가능하도록 위치를 바꿔주었다.




ADC에 인터럽트 활성화 


ADC인터럽트를 활성화 하기 위해서는 레지스터 ADCSRA의 3번 포트인 ADIE를 통하여 인터럽트 활성화를 해주어야 한다.

인터럽트 벡터를 보면 ADC인터럽트 22번에 있는것을 확인할 수 있다. 그렇기 때문에 함수로 선언하기 위해서는 1을 뺀 __vector_21로 함수를 선언해 주어야 한다.(ADC 변환이 완료되면 인터럽트 발생)

기존의 ADC.c 소스를 활용하여 인트럽트 함수를 따로 선언하고 인터럽트 전체를 0으로 만드는 함수인 cli() 을 호출해 준 뒤 기존의 소스의 오른쪽 정렬을 왼쪽 정렬로 바꾸고 인터럽트 활성화 부분인 ADCSRA의 ADIE를 1로 바꿔준다.

그런 뒤 변환부분에서 while로 돌리던 부분을 없애주고 반환값도 없애준 뒤 벡터함수 21(vocter 22번 ADC)을 선언해 준다. 이 인터럽트는 ADC 변환이 완료되면 자동으로 이 함수로 이동하여 LCD_Num(ADC); 를 호출해 준다. 그렇게 변환이 완료된 값이 10비트이나 LCD에 숫자로 출력하는 함수가 8비트까지 출력하도록 설정 해 놓았기 때문에 변환된 값을 가지는 ADCH,ADCL 레지스터의 H레지스터를 사용하기 위해 초기 선언을 왼쪽 정렬로 하고 ADC의 주소설정값을 H로 바꿔주었다.


Main.c

인터럽트 설정은 다 끝이났기 때문에 메인 부분에서 호출을 해주면 된다.

먼저 LCD로 출력된 값을 보여주기 때문에 LCD초기화 부터 해준다.  다음에 ADC인터럽트 부분을 초기화 해준다. 인터럽트를 한꺼번에 켜기 위해 sei()함수를 호출해 준다. 마지막으로 LCD 동작을 알아보기 위해 먼저  Start를 출력하고 ADC변환 함수를 호출 한다.

ATMega 칩의 ADC0 번에 선을 연결하여 사용하여 채널 0을 설정한다.

ADC에 Interrupt 활성화 시키기 +에 꽂을 때


ADC에 Interrupt 활성화 시키기 -에 꽂을 때

 +일때 uart 통신을 통하여 값을 알아본 결과 1023이 출력되었었다.

그러나 지금은 8비트로 11 두개가 날라가고 1111 1111이 출력되어 최대 255 가 출력되는 것을 확인 가능하다.

가운데는 아무곳도 연결 안한 상태로 값이 reset을 눌러줄 때 마다 값이 계속 바뀐다.

마지막은 GND(-)에 연결했을 때의 출력 모습이다.


USART에 인터럽트 활성화


 

UART에서도 인터럽트를 활성화 하기 위해서는 레지스터를 봐야 하는데 보게되면 인터럽트 활성화 하는 부분이 여러개 있다. 그러나 우리는 RX 송신시 인터럽트 발생이 되도록 설정하려고 한다.

벡터표를 보게 되면 우리가 사용중인 UART0에서 RX 인터럽트 부분의 벡터 번호는 19번이다. 그렇기 때문에  함수 선언부분의 번호는 18번이 된다.

먼저 마찬가지로 인터럽트들을 모두 활성화를 꺼준다.

RX 인터럽트 활성화가 있는 UCSR0B에 RXCIE를 1로 송신이 완료되면 인터럽트가 발생하도록 설정해 준다.

인터럽트 함수 벡터_18을 선언 해주고 인터럽트 발생시 수행하는 함수호출을 넣어주면 끝!

송신이 완료되면 인터럽트 함수가 호출되면서 LCD_Data(UDR0); 를 호출하여 LCD에 찍어주게 된다.


Main.c에서 호출을 하고 하이퍼터미널을 통하여 통신을 하게 하고

키보드로 입력해 주게 되면 한 문자씩 LCD로 출력이 된다.

USART에 Interrupt 활성화 시키기



하이퍼터미널에서 USART통신으로 키보드에 입력 받아 LCD에 보이는 모습

HI!!I'm Owen.K