Witam,
napisałem program, w którym chciałem użyć przerwania do zliczania ilości naciśnięć, ale program nie działa prawidłowo, nie zlicza równomiernie, tak jakbym za jednym naciśnięciem naliczało po 2 czy 3 razy, oto kod programu:
napisałem program, w którym chciałem użyć przerwania do zliczania ilości naciśnięć, ale program nie działa prawidłowo, nie zlicza równomiernie, tak jakbym za jednym naciśnięciem naliczało po 2 czy 3 razy, oto kod programu:
/*
Program obsługujący przerwania, po naciśnięciu przycisku podpiętego pod PD2 (INT0)
Diody zapalają się kolejno od Led1 do Led5 po każdym naciśnięciu zapala się kolejna dioda
Po naciśnięciu przycisku PD3 (INT1) Sekwencja się resetuje i diody gasną
Diody podłączone są pod PC0, PC1, Pc2, PC3, PC4
uC: Atmega8
Autor: Adrian Wojak
*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define Led1 0
#define Led2 1
#define Led3 2
#define Led4 3
#define Led5 4
volatile long n; //zmienna przechowująca ilośc naciśnięć przycisku PD2(INT0)
void clear(void) {
PORTC &= ~(1<<Led1 | 1<<Led2 | 1<<Led3 | 1<<Led4 | 1<<Led5); //zgaszenie diód
n = 0;
}
SIGNAL (SIG_INTERRUPT0) {
//_delay_ms(80); //czekanie aż dragania styków wygasną
//while(!(PIND & 0x04)) {} //czekanie na zwolnienie przycisku
//_delay_ms(80); //czekanie aż dragania styków wygasną
n++; //zwiększ zmienną n
//cli(); //wyłącz przerwania
}
SIGNAL (SIG_INTERRUPT1) { //przywrócenie początkowego stanu mrugania diodami
//_delay_ms(80); //czekanie aż dragania styków wygasną
//while(!(PIND & 0x08)) {} //czekanie na zwolnienie przycisku
//_delay_ms(80); //czekanie aż dragania styków wygasną
clear();
//cli(); //wyłącz przerwania
}
int main(void) {
n = 0; //inicjacja zmiennej n
DDRD = 0x00; //Wszystkie PinyD wejściami
PORTD = ( 1<<PORTD2 | 1<<PORTD3 ); //Pull-up na wejściach PD2(INT0) i PD3(INT1)
DDRC = ( 1<<Led1 | 1<<Led2 | 1<<Led3 | 1<<Led4 | 1<<Led5 ); //ustawienie wyjść dla diód led
PORTC = 0x00;
DDRB = (1<<Led1 | 1<<Led2 | 1<<Led3 | 1<<Led4 | 1<<Led5); //ustawienie wyjść dla diód led
PORTB = 0x00;
MCUCR|=(1<<ISC01) | (1<<ISC00); //zbocze opadające na INT0
MCUCR|=(1<<ISC11) | (1<<ISC10); //zbocze opadające na INT1
GICR |= (1<<INT0 | 1<<INT1); //Włączamy przerwanie INT0 i INT1
sei(); //pozwolenie na przerwania
// cli(); //zabronienie wykonywania przerwania
//gówna pętla programu
for(;;){
switch(n) {
case 1:
PORTC |= 1<<Led1;
break;
case 2:
PORTC |= 1<<Led2;
break;
case 3:
PORTC |= 1<<Led3;
break;
case 4:
PORTC |= 1<<Led4;
break;
case 5:
PORTC |= 1<<Led5;
break;
default:
clear();
}
//sei(); //pozwolenie na pezerwania
}
}
