BASIC4MCU | 질문게시판 | 답변 : ATmega128 2개로 UART통신하기
페이지 정보
작성자 master 작성일2019-05-28 16:44 조회8,443회 댓글2건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=8927
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-05-28 오후 4:51:56// by Ok-Hyun Park////마스터 코드 main.c#include <avr/io.h>//ISR(USART1_RX_vect){ UDR1=UDR0; }//int main(void){UCSR0B=0x90; UBRR0L=103; // 9600 // 터미널 입력UCSR1B=0x08; UBRR1L=103; // 9600 // 슬레이브로 출력SREG=0x80;while(1);}//// 슬레이브 main.c#include <avr/io.h>//ISR(USART1_RX_vect){ PORTA=UDR1; }//int main(void){DDRA=0xFF;UCSR1B=0x90; UBRR1L=103; // 9600SREG=0x80;while(1);}
너무 간단하죠?
잘 알면 소스가 간단해지고
잘 모르면 소스가 지저분해집니다.
// 16MHzUCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 0; // 1M // 0.0%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 1; //500.0k // 0.0%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 3; //250.0k // 0.0%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 3; //230.4k // 8.5%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 8; //115.2k //-3.5%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 12; // 76800 // 0.2%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 16; // 57600 // 2.1%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 25; // 38400 // 0.2%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 34; // 28800 //-0.8%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 51; // 19200 // 0.2%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L= 68; // 14400 // 0.6%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L=103; // 9600 // 0.2%UCSR0A=0; UCSR0B=0x18; UBRR0H=0; UBRR0L=207; // 4800 // 0.2%UCSR0A=0; UCSR0B=0x18; UBRR0H=1; UBRR0L=160; // 2400 //-0.1% 416// 16MHz, 더블보레이트UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 0; // 2M // 0.0%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 1; // 1M // 0.0%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 3; //500.0k // 0.0%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 7; //250.0k // 0.0%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 8; //230.4k //-3.5%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 16; //115.2k // 2.1%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 25; // 76800 // 0.2%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 34; // 57600 //-0.8%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 51; // 38400 // 0.2%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L= 68; // 28800 // 0.6%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L=103; // 19200 // 0.2%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L=138; // 14400 //-0.1%UCSR0A=2; UCSR0B=0x18; UBRR0H=0; UBRR0L=207; // 9600 // 0.2%UCSR0A=2; UCSR0B=0x18; UBRR0H=1; UBRR0L=160; // 4800 //-0.1% 416UCSR0A=2; UCSR0B=0x18; UBRR0H=3; UBRR0L= 64; // 2400 // 0.0% 832
115200에서는 2배속일 때와 아닐 때의 오차가 차이가 있기 때문에 2배속을 사용하지만
9600에서는 차이가 없으므로 2배속을 사용할 필요가 없습니다. (2배속을 사용해도 상관없습니다.)
댓글 2
조회수 8,443바다조아님의 댓글
바다조아 작성일답변 감사합니다! ISR 을 이용해서 해도 되겠군요! 테스트후에 답변 드릴게요!
바다조아님의 댓글
바다조아 작성일답변보고 가장 먼저 확인한게, MCU간 보드의 통신이 UART0 인지 1인지 구분하는거였습니다. 코드를 보니 맙소사 둘다 UART1인겁니다...그래서 구분을 위해 PC-마스터는 UART1으로 설정하고 마스터-슬레이브는 UART0으로 설정했습니다. 덕분에 뭐가 문젠지 알아서 감사했습니다.