BASIC4MCU | 질문게시판 | Atmega128 UART통신 echo 반복 질문
페이지 정보
작성자 ming2ming 작성일2022-05-23 13:48 조회511회 댓글2건본문
uart통신으로 PA0의 led1과 PA1의 LED2 를 제어하면서 에코로 하나의 문자를 출력하는 코드를 짜고 있습니다.
LED의 켜고 꺼짐은 문제 없으나 에코가 수없이 많이 출력되는 문제가 발생하여 한번만 출력 가능하게 하는 방법을 알고싶습니다.
아래는 제가 짠 코드입니다.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#define BAUD_38400 25
#define UART0_RX_INT_ENABLE (UCSR0B|=(1<<RXCIE0))
char RByte;
char echo[] = {'A','B','C','D'};
ISR ( USART0_RX_vect ){
RByte = UDR0;
//UDR0 = RByte;
}
int main ( void ) {
DDRA=0x0F;
PORTA=0x00;
UCSR0B |= (1 << RXEN0 ) | (1 << TXEN0 );
UCSR0C |= (1 << UCSZ00 ) | (1 << UCSZ01 );
UBRR0L = BAUD_38400 ;
UART0_RX_INT_ENABLE;
sei();
while (1){
if (RByte == '1'){
PORTA|= 0x01;
UDR0 = echo[0]; //문제 부분
}
else if (RByte == '2'){
PORTA = PORTA &~ 0x01;
UDR0 = echo[1];
}
else if (RByte == '3'){
PORTA|=0x02;
UDR0 = echo[2];
}
else if (RByte == '4')
{
PORTA = PORTA &~ 0x02;
UDR0 = echo[3];
}
}
}
문제부분의 다음줄에 break를 작성하면 다음 명령을 받지 못하고 멈춰 버리는 문제가 있었습니다.
해결방향성을 제시해 주시면 감사하겠습니다!
댓글 2
조회수 511master님의 댓글
master 작성일
ISR ( USART0_RX_vect ){
RByte = UDR0;
//UDR0 = RByte;
}
여기서 UDR0에 값을 직접 넣을 수 있는 이유는
아무리 짧게 인터럽트가 걸린다고 해도 보레이트 1바이트 수신 시간보다 짧지는 못하기 때문에 직접 넣어도 되는 겁니다.
//
메인 무한루프의 루프 시간은 몇us 안될텐데 저렇게 빠르게 UDR0에 값을 넣는다면 제대로 값이 전송 되지 않습니다.
반복해서 보내고 싶다고하면 UDR0 = echo[0]; _delay_ms(2); 1바이트 송신 시간보다 더 긴 딜레이를 사용하고
1회만 보내고 싶다면 UDR0 = echo[0]; RByte=0;
RByte를 변경하세요
ming2ming님의 댓글
ming2ming
감사합니다!