BASIC4MCU | 질문게시판 | LED와 FND의 출력이 제가 생각한대로 나오지 않아요.
페이지 정보
작성자 킹왕짱 작성일2024-07-24 20:40 조회790회 댓글4건본문
잘 모르겠습니다. 제발 도와주세요.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char digit_0=0, digit_1=0, digit_2=0, digit_3=0;
unsigned char fnd_data_a[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x67};
unsigned int result = 0;
char str1[10];
void adc_init(){
DDRF &= ~(1<<0);
ADMUX = 0;
ADCSRA = (1<<ADEN) | (7<<ADPS0);
}
unsigned short read_adc(){
unsigned char adc_low, adc_high;
unsigned short value;
ADCSRA |= (1<<ADSC);
while((ADCSRA & (1<<ADIF)) != (1<<ADIF));
ADCSRA |= (1<<ADIF); // Clear ADIF by writing 1
adc_low = ADCL;
adc_high = ADCH;
value = ((unsigned short)adc_high << 8) | (unsigned short)adc_low;
return value;
}
void usart0_init(unsigned int UBRR0){
UBRR0L = (unsigned char)UBRR0;
UCSR0B = (1<<TXEN0)|(1<<RXEN0);
}
void tx0_ch(unsigned char data){
while(!(UCSR0A & (1<<UDRE0)));
UDR0=data;
}
void tx0_str(char *str){
while(*str){
tx0_ch(*str++);
}
}
void fnd_display(unsigned int value){
int i;
for(i=0; i<50; i++){
digit_0 = value%10;
digit_1 = (value/10)%10;
digit_2 = (value/100)%10;
digit_3 = (value/1000)%10;
PORTG=0x01; PORTC = fnd[digit_0]; _delay_ms(5);
PORTG=0x02; PORTC = fnd[digit_1]; _delay_ms(5);
PORTG=0x04; PORTC = fnd[digit_2]; _delay_ms(5);
PORTG=0x08; PORTC = fnd[digit_3]; _delay_ms(5);
}
}
ISR(INT4_vect){
PORTA = result/4;
_delay_ms(10);
}
ISR(INT5_vect){
while(1){
fnd_display(result);
}
}
void io_setting(){
DDRG = 0x0f;
DDRE = 0x00;
DDRC = 0xff;
DDRA = 0xff;
sei();
EIMSK = 0x30;
EICRB = 0x0a;
}
int main(void){
io_setting();
adc_init();
usart0_init(103);
while(1){
result = read_adc();
_delay_ms(10);
sprintf(str1, "result= %d \r\n", result);
tx0_str(str1);
}
}
하이퍼터미널이라는 외부 프로그램에 출력하는 코드인데하이퍼터미널에 값은 잘 출력됩니다만,정작 기판의 FND와 LED에는 잘 안됩니다.각각 인터럽트가 발생하면 1초마다 result 값을 받아서 출력했음 좋겠습니다.제발 도와주세요
댓글 4
조회수 790master님의 댓글
master 작성일LED와 FND의 출력이 제가 생각한대로 나오지 않아요. <-- "생각한대로" 라는 것이 "각각 인터럽트가 발생하면 1초마다 result 값을 받아서 출력했음" 이 말인가요?
master님의 댓글
master 작성일
ISR(INT4_vect){ PORTA = result/4; }
//
ISR(INT5_vect){ fnd_display(result); }
두 개의 인터럽트가 있고, 인터럽트가 발생하면 인터럽트 함수안의 출력이 계속해서 반복되면 될텐데요
구지 1초에 한번씩 출력할 필요 없이 연속으로 출력하면 되지 않나요?
한번 더 인터럽트가 발생하면 멈추고요
맞죠?
master님의 댓글
master 작성일
volatile char int4_flag=0,int5_flag=0;
코드 상단에 전역변수를 추가합니다.
//
ISR(INT4_vect){ int4_flag^=1; } // 인터럽트 플래그 반전(토글)
ISR(INT5_vect){ int5_flag^=1; }
인터럽트에서는 플래그를 토글시킵니다.
int main(void){
io_setting();
adc_init();
usart0_init(103);
while(1){
result = read_adc();
sprintf(str1, "result= %d \r\n", result); tx0_str(str1);
if(int4_flag)PORTA=result>>2; else PORTA=0;
if(int5_flag)fnd_display(result); else{ PORTG=0; _delay_ms(10); }
}
}
형저님의 댓글
형저 작성일넵 정말 감사합니다 선생님