[뇌를 자극하는 하드웨어 - ATmega162 시리얼 통신 - 인터럽트 이용, IAR]
인터럽트를 이용한 시리얼 통신에 대해서 살펴보겠습니다.
1. 목표
-인터럽트를 이용해서 시리얼 통신을 한다. ( 단, 수신시에만 인터럽트 이용)
-수신 완료시 인터럽트가 걸리면 특정 문자를 리턴한다.
2. 소스
#include<iom162.h> #include<ina90.h> char rx=0; void Putch(char data) { while(!(UCSR0A & 0x20)); UDR0=data; } void PRINTMESSAGE(char *temp) { char *pStr; pStr=temp; while(*pStr) { Putch(*pStr++); } } #pragma vector=USART0_RXC_vect __interrupt void USART0_RXC(void) { __disable_interrupt(); rx=UDR0; PRINTMESSAGE("\r\n메시지를 잘 받았습니다. --> "); Putch(rx); Putch('\r'); Putch('\n'); __enable_interrupt(); } void main(void) { DDRB=0xFF; PORTB=0xFF; UCSR0A=0x00; UCSR0B=0x98; UBRR0L=103; UBRR0H=0; __enable_interrupt(); PRINTMESSAGE("안녕하세요\r\n"); while(1); }
-#pragma vector=USART0_RXC_vect : 메시지 수신 이벤트를 정의한다. 아래의 함수에서 하고자 하는 내용을 구현한다.
-UCSR0B=0x98 : 수신완료시 인터럽트 기능 활성화
3. 결과
4. 피드백
-USART0_RXC(void) 함수에서 PRINTMESSAGE 함수를 사용하지 않고 PRINTMESSAGE 의 내용을 똑같이 쓰면 결과가 수신한 문자를 "메시지를
잘 받았습니다. --> " 의 갯수만큼 리턴을 합니다.(난감... 왜그런지 이해가 안됨...). 그래서 함수로 똑같이 구현해서 처리하니 되더군요.... -.-;
-위에서 1을 찍어서 보내면 111111111111 이런식으로 리턴이 오더라구요... 이거 왜 그런지 아시는분좀 알려주세요 ^.^
'하드웨어 > 1. 뇌를 자극하는 하드웨어 입문' 카테고리의 다른 글
9. ATmega162 시리얼 통신 - 프로토콜 (0) | 2012.08.19 |
---|---|
7. ATmega162 시리얼 통신 (2) | 2012.08.16 |
6. 입력회로 실험 (0) | 2012.08.16 |
5. AVR LED 제어 - 타이머(내부 인터럽트) 이용 (0) | 2012.08.15 |
4. AVR LED 제어 (0) | 2012.08.15 |