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
Hallo Andreas, klar steht das im Datenblatt 12.4 "Interrupt Vectors in ATmega328 and ATmega328P" S65f. Lese die Tabelle bitte von nach oben. Ok ?
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."
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 ...
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
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
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
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.