BASIC4MCU | 질문게시판 | 답변 : atmega128 avr usart 질문
페이지 정보
작성자 master 작성일2022-06-21 07:53 조회13,133회 댓글5건본문
//
// usart 에 1,2 입력시 led 좌,우측 순차점등이고
// atmega128 array Fnd 가 좌,우측 나뉘어서 1,2 입력 한 숫자만큼 증가
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include "1.h"
#define CPU_CLOCK 7372800UL
#define BAUD_RATE 19200
#define BAUD_RATE_L(CPU_CLOCK/(161*BAUD_RATE))-1
#define BAUD_RATE_H((CPU_CLOCK/(161*BAUD_RATE))-1)>>8
//
volatile unsigned char FND[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
volatile unsigned char digit=0,display_num[4]={0.0.0.0}
volatile unsigned int tic_time=0;
//
char U0_rxChar(){ while(!(UCSR0A&0x80)); return UDR0; }
void U0_txChar(char d){ while(!(UCSR0A&(1<<UDRE0))); UDR0=d; }
void U0_txStr(char *s){ while(*s)U0_txChar(*s++); }
//
void delay(unsigned int dsec){ tic_time=0; while(dsec>tic_time); }
//
ISR(TIMER0_COMP_vect){ // 998.2638888888889us
tic_time++;
PORTA=FND[display_num[digit]]; PORTG=~(1>>digit);
if(++digit>3)digit=0;
}
//
int main(void){
int i,count,count1;
unsigned char byte;
unsigned char buf1[]="1.led 좌측부터 순차점등 \r\n";
unsigned char buf2[]="2.led 우측부터 순차점등 \r\n";
unsigned char buf3[]="input number(1-2):";
DDRA=0xFF; DDRC=0xFF; DDRG=0xFF; PORTG=0xFF;
UCSR0B=0x18; UBRR0L=23;
TCCR0=0x0C; OCR0=114; TIMSK=2; //7372800Hz/64/(1+114)=1001.739130434783Hz,998.2638888888889us
sei();
for(;;){
U0_txStr(buf1); U0_txStr(buf2); U0_txStr(buf3);
byte=U0_rxChar(); U0_txChar(byte); U0_txStr("\r\n");
if(byte=='1'){
if(++count>99)count=0;
display_num[0]=count/10;
display_num[1]=count%10;
for(i=0;i<8;i++){ PORTC=0x01<<i; delay(125); } PORTC=0;
}
if(byte=='2'){
if(++count1>99)count1=0;
display_num[2]=count1/10;
display_num[3]=count1%10;
for(i=0;i<8;i++){ PORTC=0x80>>i; delay(125); } PORTC=0;
}
}
return 0;
}
댓글 5
조회수 13,133snoflak님의 댓글
snoflak 작성일
timsk 저렇게 설정하면 256분주로 설정되는건가요?
그리고 답변 감사합니다 많은 도움이 됐습니다.
master님의 댓글
master
7372800Hz/256=28800Hz
1ms로 만들기 위해서는 1000Hz가 나와야 하는데 28.8로 나누어야 하므로
근사치인 29로 나누면
7372800Hz/256/29=993.1034482758621Hz
64분주에 비해서 오차가 더 큽니다.
snoflak님의 댓글
snoflak 작성일
그렇군요 감사합니다 그리고 만약 256분주를 쓴다면
TCCR0=0x0E; OCR0=29; TIMSK=2; 로 설정하고
delay 함수는 124로 설정하면 되는 건가요?
master님의 댓글
master
설정은 맞습니다. 약 1ms
delay(125) 하면 대충 125ms가 되는거죠
snoflak님의 댓글
snoflak
감사합니다 delay 는125로 그대로 설정하면 되는군요
많은 도움이 됐습니다 도와주셔서 감사합니다.