www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sperren des externen Interrupts für gewisse Zeit


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
startflag = true;
ext_int = true;

ISR(INT0_vect)  // Interrupt routine for 
{
  if( (startflag == true) && (ext_int == true) ){
    EIMSK = 0x00;    // Stop external Interrupt
    counter = counter + 1;  //  Do something important
    TCNT1 = 0x0000;    // Reset Counter  
    TCCR1B |= (1<<CS12);  // Start Timer
    PORTD |= (1<<1);  // Yellow LED on
    ext_int = false;  // Set Interrupt Lock
  }
}


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

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

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Magnetus,

muss das Löschen des Interruptflags also direkt vor
EIMSK = 0x01;      // Start external Interrupt 
 erfolgen ?

Wie kann ich dieses Flag zurücksetzten?

Gruß Jens

Autor: Stefan Weßels (swessels)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ext_int
 sollte
volatile
 sein.

Gruß,
Stefan

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Wie kann ich dieses Flag zurücksetzten?

Eine 1 reinschreiben.
(Siehe Manual/Datenblatt)

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke noch mal an alle,

hier noch mal der Happen, der gefehlt hat zu meinem Feierabendbier:
  EIFR = (1<<INTF0);    // Reset Interrupt Flag
  EIMSK = 0x01;      // Start external Interrupt  

Gruß Jens

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Weßels schrieb:
> ext_int
>  sollte volatile
>  sein.

nein muss nicht, weil der compiler es überhaupt nicht optimierne kann, 
weil es beides ISR sind, volatile macht es nur langsamer.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.