8. ATmega162 시리얼 통신 - 인터럽트 이용

|

[뇌를 자극하는 하드웨어 - 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 이런식으로 리턴이 오더라구요... 이거 왜 그런지 아시는분좀 알려주세요 ^.^



And