BASIC4MCU | 질문게시판 | 답변 : Atmega128 UART통신에서 ECHO 관련 질문드립니다.
페이지 정보
작성자 master 작성일2022-05-22 09:18 조회351회 댓글1건본문
#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[20]={};
char EMPTY[20]={};
char EMPTY2[20]={};
unsigned char i=0;
char answer[]="LED1 ON";
char answer2[]="LED1 OFF";
char answer3[]="LED2 ON";
char answer4[]="LED2 OFF";
//
ISR(USART0_RX_vect){
RBYTE[i]=UDR0;
i++;
if(strcmp(RBYTE,"1")==0){
i=0;
for(int k=0;k<30;k++){ UDR0=answer[k]; }
for(int j=0;j<20;j++){ RBYTE[j]=EMPTY[j]; UDR0=EMPTY2[j]; }
}
}
interrupt를 사용한 uart 통신 작업에서 질문 있습니다.
comport master에서 1을 입력받으면 echo로 LED1 ON을 출력하는 코드를 만들려고 하는데
ECHO가 "LE" 까지 밖에 출력이 안 되는데 이유를 모르겠습니다.
for문의 k값을 조정하거나 for문 대신
while(answer[k] !=0){ UDR0=answer[k]; k++; }
이렇게 while을 써도 L 하나만 출력되거나 LE만 출력됩니다. 부탁드려요!
//다음부터는 전체 소스코드를 첨부하세요보레이트가 34000 이라면1비트 전송시간은 1/38400=26.04166666666667us1바이트 전송시간은 10비트 기준으로 260.4166666666667usfor(int k=0;k<30;k++){ UDR0=answer[k]; _delay_us(261); }
for(int j=0;j<20;j++){ RBYTE[j]=EMPTY[j]; UDR0=EMPTY2[j]; _delay_us(261); }
적어도 261us 이상의 딜레이를 줘야지 정상적으로 데이터가 송신됩니다.#include <avr/io.h>#include <avr/interrupt.h>#include <string.h>//#define BAUD_38400 25#define UART0_RX_INT_ENABLE (UCSR0B|=(1<<RXCIE0))//volatile char RBYTE[20]={},EMPTY[20]={},EMPTY2[20]={};volatile char answer[]="LED1 ON",answer2[]="LED1 OFF",answer3[]="LED2 ON",answer4[]="LED2 OFF";volatile unsigned char i=0;//void U0_TX(char c){ while(!(UCSR0A&0x20)); UDR0=c; }void U0_STR(char *s){ while(*s)U0_TX(*s++); }//ISR(USART0_RX_vect){char r;r=UDR0;if(r=='1'){ U0_STR(answer); }if(r=='2'){ U0_STR(answer1); }if(r=='3'){ U0_STR(answer2); }if(r=='4'){ U0_STR(answer3); }}보레이트를 계산해서 딜레이를 계산하는 것보다는 송신 함수를 사용하는 것이 좋겠죠
댓글 1
조회수 351dsfdfsa님의 댓글
dsfdfsa 작성일
답변 정말 감사합니다. 열심히 찾아봤다고 생각했는데도 보레이트에 따른 딜레이의 필요성은 전혀 알지 못했던 내용이었습니다.
함수를 사용한 방법까지 달아주셔서 도움 됐습니다.
다음부터 전체 코드 첨부하겠습니다. 감사합니다!