Sperren des externen Interrupts für gewisse Zeit

Gast #1859218
Lesenswert?

Hallo zusammen,
ich habe folgende Aufgabe zu lösen (AT90USB1287):

nachdem ein externer Interrupt (fallende Flanke) vom MC detektiert 
wurde, soll der externe Interrupt-Eingang für 100ms für weitere Flanken 
gesperrt werden und nach Ablauf der Zeit wieder für den Empfang 
freigegeben werden.

Anbei meine beiden Interruptroutinen:
1
startflag = true;
2
ext_int = true;
3

4
ISR(INT0_vect)  // Interrupt routine for 
5
{
6
  if( (startflag == true) && (ext_int == true) ){
7
    EIMSK = 0x00;    // Stop external Interrupt
8
    counter = counter + 1;  //  Do something important
9
    TCNT1 = 0x0000;    // Reset Counter  
10
    TCCR1B |= (1<<CS12);  // Start Timer
11
    PORTD |= (1<<1);  // Yellow LED on
12
    ext_int = false;  // Set Interrupt Lock
13
  }
14
}
15

16

17
ISR(TIMER1_COMPA_vect)
18
{
19
  TCCR1B &= ~(1 << CS12);    // Stop Timer  
20
  EIMSK = 0x01;      // Start external Interrupt  
21
  ext_int = true;      // Reset Interrupt Lock
22
  PORTD &= ~(1<<1);    // Yellow LED off
23
}

Sobald ein externer Interrupt empfangen wird, wird durch die zugehörige 
Interruptroutine das Maskregister auf 0 gesetzt und ein Timer aktiviert. 
Nach 100ms erfolgt ein Timerinterrupt, welcher die Sperrung des externen 
Interrupts rückgängig machen soll. Allerdings funktionieren die Routinen 
nicht so wie sie sollen, da innerhalb der Totzeit auf weitere externe 
Flanken reagiert wird.

Was mache ich falsch?

Gruß Jens
Persönliche Seite #1859227
Lesenswert?

Jens schrieb:
> Nach 100ms erfolgt ein Timerinterrupt, welcher die Sperrung des externen
> Interrupts rückgängig machen soll. Allerdings funktionieren die Routinen
> nicht so wie sie sollen, da innerhalb der Totzeit auf weitere externe
> Flanken reagiert wird.

Bevor du den Interrupt wieder frei gibst solltest du das Interruptflag 
löschen.

Gruß,
Magnetus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren