BASIC4MCU | 질문게시판 | 답변 : atmega128 UART통신으로 FND출력
페이지 정보
작성자 master 작성일2024-06-10 20:01 조회430회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=23766
본문
//TCCR2=0x0B; OCR2=250; TIMSK=0x80;
TCCR2=0x0B; OCR2=249; TIMSK=0x80; //16000000/64/(1+249),1ms
1작은 값으로 설정해야지 정확한 시간을 얻을 수 있습니다.//void Uart0_Init(){UBRR0L=103; UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0);}수신인터럽트 이네이블 시켰다면 인터럽트 함수를 사용해야 합니다.그렇지 않다면 코드가 먹통되거나 엉뚱하게 동작할 수 있습니다.현재 작성한 코드로는 수신인터럽트를 사용하지 않아야겠습니다.UBRR0L=103; UCSR0B=(1<<TXEN0)|(1<<RXEN0);//마지막 딜레이는 없어도 될 것 같습니다.//인터럽트에서 사용하는 전역 변수는 volatile를 사용해야 합니다.//#define F_CPU 16000000UL#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>//volatile char seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};volatile char x,y,z,index=0;int n=0;//char Rx0_Data(void){ while(!(UCSR0A&0x80)); return UDR0; }//ISR(TIMER2_COMP_vect){static char c=0;PORTB=0xFF;if(c==0){ PORTC=seg[x]; PORTB=~0x20; } // 백if(c==1){ PORTC=seg[y]; PORTB=~0x40; } // 십if(c==2){ PORTC=seg[z]; PORTB=~0x80; } // 일if(++c>2)c=0;}//int main(void){char num;DDRB=0xff;DDRC=0xff;UBRR0L=103; UCSR0B=0x18;TCCR2=0x0B; OCR2=249; TIMSK=0x80; //16000000/64/(1+249),1mssei();while(1){num=Rx0_Data();if(num>='0'&&num<='9'){n=n*10+num&0x0F;if(++index==3){ index=0; x=n/100; y=n/10%10; z=n%10; n=0; }}}}
댓글 1
조회수 430Rion님의 댓글
Rion 작성일너무 감사합니다! 3일동안 고민해서 안되던게 전역변수랑 수신 인터럽트 때문이었을줄은...ㅠㅠㅠ