BASIC4MCU | 질문게시판 | ATMEGA AVR 관련 문의(인터럽트)
페이지 정보
작성자 총체적난국 작성일2021-06-15 15:36 조회2,589회 댓글1건본문
안녕하세요. 하기 코드는 INT0 핀의 스위치를 누르면 1씩 증가하고, INT1 핀을 누르면 리셋이 되는 값을 FND 4자리 수에 표현하는 코드입니다.
관련해서 두 가지 질문이 있습니다.
1.
ISR(INT1_vect)
{
i=0;
}
이 코드는 스위치를 누르면 바로 i = 0으로 만드는 코드인데 이것을 한번 누를 때는 i 를 -i로 바꾸고, 3초 이상 누르고 있을 때 i = 0으로 바꾸게 하고 싶은데 이런 식으로 코드를 짤 수 있나요?
2. FND 표현하는 자리가 한 자리수일때는 괜찮은데 두 자리수가 될 때부터 1씩 증가하면 제일 앞자리가 깜빡이며 1씩 증가합니다.
(ex: 12 -> 13될 때 1이 깜빡, 623->624될 때 6이 깜빡, 7123 -> 7124될 때 7이 깜빡)
이러한 증상을 어떻게 없애는 방법 조언 가능하실까요?
c언어도 하나도 모르는 상태에서 덕분에 계속 배우고 있습니다. 늘 감사합니다.
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#define DELAY_TIME_MS (5)
char fnd[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int buff4,buff3,buff2,buff1;
unsigned int var1,var2;
unsigned int i=0;
;
ISR(INT1_vect)
{
i=0;
}
ISR(INT0_vect)
{
i++;
_delay_ms(200);
}
int main()
{
DDRC=0xff; // FND 출력
DDRD=0b11110000; // TN 출력(7~4), 카운터,리셋 입력(3,2)
DDRA= 0x00; // ADC 입력
GICR = 0xc0;
MCUCR = 0x00;
SREG = 0x80;
while(1)
{
var2 = 1;
display();
fnd_on_0();
if(i>9999)
{
i=0;
}
}
}
void display()
{
buff4 =i/1000;
buff3 =i%1000/100;
buff2 =i%100/10;
buff1 =i%10;
}
void fnd_on_0()
{
if(i < 10)
{
PORTD=0b10000000; PORTC=fnd[buff1]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
}
else if(i < 100)
{
PORTD=0b10000000; PORTC=fnd[buff1]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
PORTD=0b01000000; PORTC=fnd[buff2]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
}
else if(i < 1000)
{
PORTD=0b10000000; PORTC=fnd[buff1]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
PORTD=0b01000000; PORTC=fnd[buff2]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
PORTD=0b00100000; PORTC=fnd[buff3]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
}
else if(i < 10000)
{
PORTD=0b10000000; PORTC=fnd[buff1]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
PORTD=0b01000000; PORTC=fnd[buff2]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
PORTD=0b00100000; PORTC=fnd[buff3]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
PORTD=0b00010000; PORTC=fnd[buff4]; _delay_ms(DELAY_TIME_MS); PORTC=0xff;
}
}
댓글 1
조회수 2,589master님의 댓글
master 작성일
오래 눌렀다는 것을 판별하려면 누른 시간을 측정해야 하는데요
로우레벨 트리거 모드를 사용해서는 시간측정이 어렵습니다.
타이머 인터럽트를 사용해서 시간을 측정하는 것이 더 편하죠
https://cafe.naver.com/circuitsmanual/184532
https://cafe.naver.com/circuitsmanual/184533
mcu 디바이스가 다르고 컴파일러가 달라도 기본적인 처리방법은 동일하므로 참고해서 공부해보세요