mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Noch mal Interrupt (ATMEGA64 mit WinAVR)


Autor: bitbo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

Ja, ich habe gesucht !

Ich habe ein Problem mit gleichzeitigen Interrupts.

1. Habe einen INT4 auf einer positiven Flanke
2. Habe einen ICP3 auf einer positiven Flanke (kein Prescaler, 16 MHz 
Takt)
3. Habe einen T3_OVF bei Überlauf von T3

(Alle Interrupt-Routinen sind nicht unterbrechbar (ISR_BLOCK) und sehr 
kurz.


Während ich im INT4 bin, kommt ein ICP3 und ein T3_OVF nahezu 
gleichzeitig.
(Voriger Zählerstand=65430, aktueller Zählerstand=53, Zähler wird nicht 
zurückgesetzt)
Wenn ich im INT4 fertig bin, wird die ICP3 Routine vor der T3_OVF 
gerufen, da diese in der "Vector-Tabelle" zuerst kommt. Jetzt ist mein 
Timer-Wert schon übergelaufen, aber ich "weiss" es nicht, da die T3_OVF 
noch nicht dran war. Da kann man (wahrscheinlich) auch nix machen.

Ich möchte nur wissen, ob und wie ich in "C" die noch anstehenden 
Interrupts auslesen kann. Gibt es da eine Möglichkeit ?

Danke
bitbo

Autor: Marc Donner (cosinus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau einfach die Interrupt Flags fuer die betroffenen Interrupts an.

Fuer z.B. Timer3 overflow:

das TOV3 Bit im ETIFR Register

Gruss
Marc

Autor: bitbo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, Danke für den Hinweis, aber das habe ich auch schon gemacht.
Merkwürdigerweise ist das immer gesetzt ?!?!
(Ich lese das am Anfang der ICP3 aus)

Sollte die T3_OVF Interrupt-Funktion das nicht beim Verlassen löschen ?
Soll/muss ich das in der T3_OVF selbst löschen ?

Unabhängig davon ist die Methode aber nicht sicher, denn bis die erste 
Anweisung in der ICP3 erreicht wird, könnte das Bit im Hintergrund doch
noch "eben" reinrutschen. Das ist doch ein Hardware-Bit, oder ?

Mir wäre wohler, wenn ich die aktuell anstehenden Interrupts auslesen 
könnte...Aber warte: Ist das dann nicht das Gleiche? Bis ich zum 
Auslesen komme, kann es ja dann auch "eben" reinrutschen ?!

Eine Idee?

Gruß
bitbo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist bekannt. Man liest einen Timer und etwas später das 
Überlaufbit. Und nun weiß man nicht, war es schon vor oder erst nach dem 
Timerlesen gesetzt.
Die Lösung findest Du hier:

Beitrag "AVR Timer mit 32 Bit"


Peter

Autor: bitbo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi !

Vielen Dank, bei mir funktioniert es nun einwandfrei !!!

Aber ich habe einen kleinen Bug in Timer32.c gefunden.
(siehe Link in vorigem Beitrag)

Thanks and bye, bitbo

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.