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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.