Forum: Mikrocontroller und Digitale Elektronik Interrupt Priorität


von Andreas W. (andi_wo)


Lesenswert?

Hallo,

ich bin mir nicht sicher wie ich das richtig
ausdrücken/suchen soll :-(
Ich hab hier ein Arduino mit 328er Chip und nutze im
Programm bis jetzt > TimerOne.h < für einige Funktionen.
Nun möchte ich, zusätzlich, INT0 und INT1 für einen Inkremental-Weggeber
nutzen.
Das Datenblatt gibt zwar alle Interrupts her aber nicht in welcher
Priorität diese bearbeitet werden. Aus alten Zeiten (8080,8085,Z80...)
bin ich gewohnt das diese verschiedene Prioritäten haben.
Das eigendliche Problem ist das ich die Flankenauswertung nutzen möchte
und befürchte das in der TimerOne-Routiene der zweite Interrupt
verlorengeht.

In der Hoffnung mich klar genug ausgedrückt zuhaben bedanke ich mich 
schon
mal im Vorraus.

Andreas

von Uwe (de0508)


Lesenswert?

Hallo Andreas,

klar steht das im Datenblatt 12.4 "Interrupt Vectors in ATmega328 and 
ATmega328P" S65f.

Lese die Tabelle bitte von nach oben.

Ok ?

von prio (Gast)


Lesenswert?

Und auch

7.7 Reset and Interrupt Handling
"The complete list of vectors is shown in ”Interrupts” on page 57. The 
list also determines the priority levels of the
different interrupts. The lower the address the higher is the priority 
level."

von Dieter F. (Gast)


Lesenswert?

Datenblatt - Punkt 11.4 (doc8161) - war wohl etwas spät ... :-)

Die Reihenfolge der Interrupts bildet auch die Aufruf-Priorität ab.

-> Zu Risken und Nebenwirkungen ist das AVR-GCC-Tutorial empfehlenswert 
...

von (prx) A. K. (prx)


Lesenswert?

Andreas Wobig schrieb:
> Das Datenblatt gibt zwar alle Interrupts her aber nicht in welcher
> Priorität diese bearbeitet werden. Aus alten Zeiten (8080,8085,Z80...)

Die Prioritäten der ATmega/tinys betreffen nur die Frage, welcher Vektor 
angesprungen wird, wenn es zu diesem Zeitpunkt mehrere Kandidaten gibt. 
Danach interessieren sie nicht mehr.

Wird im Handler der Interrupt nicht explizit freigegeben, dann wird er 
nicht unterbrochen. Wird er freigegeben, dann wird er von jedem 
unterbrochen.

> und befürchte das in der TimerOne-Routiene der zweite Interrupt
> verlorengeht.

Kurz halten oder Interrupts im Handler freigeben. Dann aber drauf 
achten, dass der Stack für alle Eventualitäten gerüstet ist.

: Bearbeitet durch User
von Andreas W. (andi_wo)


Lesenswert?

Joo,
Schlägensind angekommen.
Danke Dieter, hab die Liste gesehen aber nur als
Auflistung und nicht Priorität verstanden.
Von "GCC" halte ich mich noch fern und benutze die
Arduino-IDE. Ich hab als Bastelobjekt mir einen alten
HP-Drucker > Andiplotter-Umbau vorgenommen. Der hat keine
Schrittmotoren und Inkrementalgeber. Jetzt will ich erst mal
ausloten ob das, mehr oder weiger, realistisch umzusetzen ist.
Möchte erst mal die Schrittweite der Geberbänder/Scheibe rauskriegen.

Gruß Andreas

von Uwe (de0508)


Lesenswert?

Haha Arduino IDE und was werkelt da im Untergrund ?

von Andreas W. (andi_wo)


Lesenswert?

Hallo Uwe,

ich bin mir dessen bewust.
Aber das Studio zu benutzen ist mir zu aufwendig.
ich will, einfach und schnell, die Geberauflösung
ermitteln. Der Hersteller der Lichtschranken ist mir bekannt
aber der Aufdruck führt mich zu keinem "Typ" in seinem Sortiment.
Und mit der Auflösung steht und fällt das Projekt.

Gruß Andreas

von m.n. (Gast)


Lesenswert?

Hast Du vielleicht auch einen ATmga48/88, den Du Dir programmieren 
kannst? Dann lade Dir die Datei "QCNT_6LED.a90" auf den ATmega und 
stecke ihn aufs Arduino-Board; es ist eine Intel-Hex-Datei: 
Beitrag "4-fach Flankenauswertung per Interrupt mit ATmega48/88"
Direkt auf einem ATmega328 läuft sie leider nicht :-(

Über INT0 und INT1 werden die Quadratursignale mit höchster (4-fach) 
Auflösung ausgewertet und das Ergebnis über TxD ausgegeben. In der 
Arduino IDE kann man sich unter "tools/serial monitor" die Ausgabe auf 
den PC holen.

Alternativ könntest Du auch ein Programm mit 2-fach Auswertung auf den 
Arduino laden, wobei C1 bei optischen Drehgebern entfallen kann: 
Beitrag "Drehgeber per Interrupt auswerten, AVR"
So könntest Du schnell die Auflösung der Drehgeber bewerten, auch wenn 
hier der Interrupt über PCINTx ausgelöst wird.

von Erwin (Gast)


Lesenswert?

Die Priorität, wie sie durch die Interrupt-Nummer vorgegeben ist,
bedeutet aber nur (!), dass gleichzeitig eingetroffene, oder während
der Bearbeitung eines Interrupts neu dazugekommene
Interrupt-Anforderungen in dieser Reihenfolge abgearbeitet werden!

Es gibt z.B. keinen "NMI", wie beim Z80!

Wenn zwei hoch-priorisierte Interruptaufforderungen von der gleichen
Quelle kommen, während eine zu lange andere Interruptroutine (die auch 
niedrigste Priorität haben kann), bearbeitet wird, geht
wahrscheinlich IRGENDWANN mal was Wichtiges verloren!
Dann geht das Rätseln los...

Daher ist (bei mehreren IRQs) immer:
1) Jede IRQ-Routine so kurz, wie es nur geht, zu halten.
2) Der nachteiligste zeitliche Ablauf zu betrachten.
3) Erst dann versuchen, etwas mit Interrupt-Enable (+ Register-
   Bereitstellung, bzw. genügend freiem Stack!) innerhalb von
   IRQ-Routinen zu optimieren...

von m.n. (Gast)


Lesenswert?

Erwin schrieb:
> Daher ist (bei mehreren IRQs) immer:

Die von Dir genannten drei Punkte, würde ich in der Reihenfolge genau 
umdrehen :-)
Und als 1. Punkt würde ich noch ergänzen, den µC mit maximaler 
Taktfrequenz laufen zu lassen.

Eine Interruptroutine für z.B. einen 10ms Timer, braucht nicht kurz zu 
sein; sie kann ruhig 1ms lang diverse Aktionen ausführen. Wichtig ist 
vielmehr, beim Aufruf gleich den betreffenden Interrupt zu deaktivieren 
(disable) und den globalen Interrupt wieder freizugeben (sei()).

Sofern weitere Interrupts gleichzeitig mit INT0/INT1 auftreten, werden 
diese Beiden immer mit Priorität ausgeführt. Darum sind sie eine gute 
Wahl für die Flankenauswertung.

Als Einschätzung: auf einem mit 16-20MHz betriebenen AVR sind 
Inkremental- oder Drehgeber bequem bis 100kHz auswertbar, auch wenn 
weitere Interrupts im Programm aktiv sind. Bei 4-fach Auswertung 
bedeutet dies, der Flankenabstand ist >= 10µs, was einer Frequenz von 
25kHz/Kanal entspricht. Schneller werden die betreffenden Drehgeber 
(hier) kaum arbeiten, eher deutlich langsamer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.