BASIC4MCU | 질문게시판 | 답변 : atmega128 rfid 서보모터 제어
페이지 정보
작성자 master 작성일2018-01-16 14:23 조회7,719회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=37
본문
EICRA = 0b00000011;
EICRB = 0b01010000;
EIMSK = 0b00000001;
SREG = 0x80;
외부 인터럽트를 활성화 시켜놓았는데
인터럽트 함수가 없습니다.
인터럽트 플래그가 set 되는 순간 시스템이 먹통되거나 오동작 하게 됩니다.
//
unsigned char rx_buf[8];
실제 수신되는 데이터는 8바이트를 넘을 수 있습니다.프로그램에서 8이상을 받지 않으므로 문제되지는 않지만 버퍼 크기를 충분히 잡는 것이 좋습니다.//이 외에도 사소한 버그들이 여러개 보이지만 대충 소스를 재구성 해드리죠
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 #define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#include <stdio.h>#include <string.h>//unsigned char taga[]="1A6714B5"; //정해찬 1A6714B5unsigned char tagb[]="47E4A525"; //최문선 47E4A525unsigned char tagc[]="0A9708B5"; //성홍기 0A9708B5//volatile char rx_ch,rx_cnt=0,rx_buf[20];volatile int a=0,b=0,c=0;//ISR(USART0_RX_vect){rx_ch=UDR0;rx_buf[rx_cnt++]=rx_ch;if(rx_cnt==8){if(!memcmp(rx_buf,taga,8))a=1;if(!memcmp(rx_buf,tagb,8))b=1;if(!memcmp(rx_buf,tagc,8))c=1;rx_cnt=0;}}//ISR(INT0_vect){}//void main(void){int i;DDRA=0XFF; DDRB=0xFF; DDRC=0xFF; DDRE=0x08;TCCR3A=0xFE; TCCR3B=0xDB; ICR3=4999; // mode14 fast_PWM // 4us, 20msUCSR0B=0x98; UBRR0L=103; // 9600@16MHzEICRA=0x03; EIMSK=0x01; SREG=0x80;sei();while(1){if(a||b||c){for(i=1;i<8;i++){if(a)PORTA=1<<i; else PORTA=0;if(b)PORTB=1<<i; else PORTB=0;if(c)PORTC=1<<i; else PORTC=0;_delay_ms(100);}a=b=c=0;PORTA=PORTC=PORTE=0;OCR3A=250; _delay_ms(1000); OCR3A=455; // 1000us(-50도), 1820us(32도)}}}노이즈 데이터가 수신되거나데이터 끝에 '\n\ 문자가 붙거나 하면 위 소스는 많아봐야 1회밖에 처리하지 못합니다.//
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 #define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#include <stdio.h>#include <string.h>//unsigned char taga[]="1A6714B5"; //정해찬 1A6714B5unsigned char tagb[]="47E4A525"; //최문선 47E4A525unsigned char tagc[]="0A9708B5"; //성홍기 0A9708B5//volatile char rx_ch,rx_cnt=0,rx_buf[20];volatile int a=0,b=0,c=0;//ISR(USART0_RX_vect){rx_ch=UDR0;if(rx_cnt=='\n'){if(!memcmp(rx_buf,taga,8))a=1;if(!memcmp(rx_buf,tagb,8))b=1;if(!memcmp(rx_buf,tagc,8))c=1;rx_cnt=0;}else{if(rx_cnt<10){rx_buf[rx_cnt++]=rx_ch;}}}//ISR(INT0_vect){}//void main(void){int i;DDRA=0XFF; DDRB=0xFF; DDRC=0xFF; DDRE=0x08;TCCR3A=0xFE; TCCR3B=0xDB; ICR3=4999; // mode14 fast_PWM // 4us, 20msUCSR0B=0x98; UBRR0L=103; // 9600@16MHzEICRA=0x03; EIMSK=0x01; SREG=0x80;sei();while(1){if(a||b||c){OCR3A=250; // 1000us(-50도)for(i=1;i<8;i++){if(a)PORTA=1<<i; else PORTA=0;if(b)PORTB=1<<i; else PORTB=0;if(c)PORTC=1<<i; else PORTC=0;_delay_ms(100);}a=b=c=0;PORTA=PORTC=PORTE=0;OCR3A=455; // 1820us(32도)}}}
데이터 끝에 '\n' 문자가 붙어서 오는 경우에는 이 코드를 사용하세요
댓글 0
조회수 7,719등록된 댓글이 없습니다.