BASIC4MCU | 질문게시판 | 답변 : 답변 : 아트메가128 USART 통신
페이지 정보
작성자 master 작성일2018-12-15 20:07 조회20,313회 댓글8건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-15 오후 8:12:34// by Ok-Hyun Park//#define F_CPU 16000000UL#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include <stdio.h>#include <string.h>//volatile unsigned char rx1_flag=0,rx1_cnt=0;volatile char rx1[100],buf1[100];//void TX1_char(char c){ while(!(UCSR1A&0x20)); UDR1=c; }void TX1_STR(char *s){ while(*s)TX1_char(*s++); }//ISR(USART1_RX_vect){char r;r=UDR1;if(r=='\n'){rx1[rx1_cnt++]=0; // nullmemcpy((char*)buf1,(char*)rx1,rx1_cnt);rx1_cnt=0; rx1_flag=1;}else if((r>='0')&&(r<='9')){rx1[rx1_cnt++]=r;}}//int main(void){DDRA=0xFF;UCSR1B=0x98; UBRR1L=8;SREG=0x80;while(1){if(rx1_flag){ rx1_flag=0;if(!memcmp((char*)buf1,"1234",4)){ // 바코드값PORTA=0x01;}if(!memcmp((char*)buf1,"5678",4)){ // 바코드값PORTA=0x02;}}}}
짧은 코드로 테스트 해보세요
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-15 오후 9:50:48// by Ok-Hyun Park//#define F_CPU 16000000UL#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include <stdio.h>#include <string.h>//volatile unsigned char rx1_flag=0,rx1_cnt=0;volatile char rx1[100],buf1[100];//void TX1_char(char c){ while(!(UCSR1A&0x20)); UDR1=c; }void TX1_STR(char *s){ while(*s)TX1_char(*s++); }//ISR(USART1_RX_vect){char r;r=UDR1;if(r=='\n'){rx1[rx1_cnt++]=0; // nullmemcpy((char*)buf1,(char*)rx1,rx1_cnt);rx1_cnt=0; rx1_flag=1;}else if((r>='0')&&(r<='9')){rx1[rx1_cnt++]=r;}}//int main(void){DDRA=0xFF;UCSR1B=0x98; UBRR1L=8;TX1_STR("START\r\n");SREG=0x80;while(1){if(rx1_flag){ rx1_flag=0;TX1_STR("---");if(!memcmp((char*)buf1,"1234",4)){ // 바코드값TX1_STR("CW\r\n");PORTA=0x01;}if(!memcmp((char*)buf1,"5678",4)){ // 바코드값TX1_STR("CCW\r\n");PORTA=0x02;}}}}
모터 테스트는 간단한 코드로 하세요
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-15 오후 9:53:57// by Ok-Hyun Park//#define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>//int main(void){DDRA=0xFF;while(1){PORTA=0x01; _delay_ms(1000);PORTA=0x00; _delay_ms(2000);PORTA=0x02; _delay_ms(1000);PORTA=0x00; _delay_ms(2000);}}
댓글 8
조회수 20,313cjoer님의 댓글
cjoer 작성일테스트를 해봤는데 모터가 돌아가질 않네요..ㅠㅠ
master님의 댓글
master
아랫쪽에 코드를 하나 더 올렸으니 저 것으로 돌려보세요
뭔가 받으면 TX1_STR("---"); 출력하도록 했고
if()문 조건에 맞으면 TX1_STR("CW\r\n"); 이런식으로 출력하도록 변경했습니다.
cjoer님의 댓글
cjoer
아래 코드로 실행시켜봤는데요
아무런 값을 출력하지않습니다. 모터도 돌아가지 않고요..
master님의 댓글
master
int main(void){
DDRA=0xFF; // <---- 추가
UCSR1B=0x98; UBRR1L=8;
TX1_STR("START\r\n"); // <--- 추가
SREG=0x80;
while(1){
위 두라인 추가해서 다시 돌려보시고요
UART1이 맞나요?
SRART가 나오는지 체크 해보세요
cjoer님의 댓글
cjoer
네 START는 제대로 나옵니당
master님의 댓글
master
키입력하지 않고 위 소스를 복사해서 돌리는 것이 맞죠?
간혹 키입력 하면서 오타를 발생하는 일이 있습니다.
cjoer님의 댓글
cjoer
네.. 복사해서 돌렸습니다..
모터 테스트도 해봤는데 모터는 제대로 동작하고있습니다..
master님의 댓글
master
그러면 한 가지 이유밖에 없습니다.
어떤 이유에서 PC에서 송신하는 데이터가 AVR로 전달되지 못하고 있습니다.
PC(TXD)------->(RXD1)AVR
UART1에 MAX232가 연결되어 있을 수도 있고요
아무 회로도 연결되어 있지 않다면 RXD1 핀 고장입니다.
UART1에 MAX232가 연결되어 있을 것으로 추정됩니다.
이 경우 MAX232의 출력과 PC쪽에 연결된 USB-to-UART 모듈의 출력이 충돌하게 되는데
출력이 쇼트나면 둘 중 하나 또는 둘 다 고장나게 됩니다.