Salve Kann ich davon ausgehen dass die Priorität der einzelnen Interrupts der Interruptadresse entspricht wobei 0x00 dem Interrupt mit der höchsten Priorität entspricht? Was passiert eigentlich wenn ein Interrupt von hoher Prorität ausgeführt wird und ein Interrupt von niederer Priorität auftritt? Diese Informationen konnte ich leider nicht im Datenblatt finden. mfg Sepp
Moin, Sepp, Mit hoher Wahrscheinlichkeit kannst Du davon ausgehen, aber schau besser in das Datenblatt. "Was passiert eigentlich wenn ein Interrupt von hoher Prorität ausgeführt wird und ein Interrupt von niederer Priorität auftritt?" Das hängt nicht nur von der Hardware des Prozessors ab, sondern auch vom Compiler und von Deinen Interrupt-Routinen. Daher kein Versäumnis der Datenblatt-Autoren. Mit meinem Compiler (GCC für AVR) kann ich zwei Arten von Routinen schreiben. Eine davon wird vom Interrupt höherer Priorität unterbrochen, die andere nicht. Ciao, und viel Spaß beim Programmieren und Debuggen :-) Wolfgang Horn
Tschuldigung. Hab ich ganz vergessen zu schreiben. Mich interresiert es wies generell bei den AVR-Risc aussieht. Speziell interresiert's mich bei den Controllertypen ATmega8 und ATtiny15. mfg Sepp
@Wolfgang Horn Ich programiere aAssambler mit AvrStudio und C mit Code Vision. Wie und wo kann ich ersehen ob der Interrupt unterbrochen wird? Ich hab's schon mit simulieren versucht, aber da hab ich's noch nicht geschafft dass ich 2 Interrußt's gleichzeitig auslöse. mfg Sepp
beim AVR gibt es keine echten Prioritäten. Treten allerdings mehrere Ints gleichzeitig auf, so wird die mit der kleineren Interruptadresse zuerst ausgeführt. Sind also Int0 und 1 freigegeben und treten beide gleichzeitig auf, wird zuerst Int0 ausgeführt. Kommt Int1 früher, wird dieser zuerst ausgeführt, ein in dieser Zeit auftretender Int0 interbricht NICHT die Ausführung von Int1. Ausnahme von dieser Regel: du gibst explizit weitere Interrupts in einer ISR frei ("sei"). Normalerweise wird bei Annahme eines Interrupts automatisch das i-flag gelöscht und damit weitere Interrupts unterbunden. Die Freigabe ermöglicht allerdings allen anderen Interupts, die gerade laufende ISR zu unterbrechen. Sowas wirklich korrekt zu programmieren, ist nicht ganz einfach und normalerweise nicht nötig. Ich habs noch nie gebraucht. Und wenn du eine einfache Regel beherzigst, wirst du es auch nicht brauchen: Interupt-Programme so kurz wie möglich halten!
Hi, Freunde, aus meinem Compiler: INTERRUPT() ist eine Routine, die selbst unterbrochen werden kann. Ich habe das noch nicht benutzt, aus Faulheit wegen der Risiken. Ciao Wolfgang Horn "SIGNAL(signame); Return Value Parameters signame Predetermined signal name Remarks Introduces an interrupt handler function that runs with global interrupts initially dis-abled." "INTERRUPT(signame); Return Value Parameters signame Predetermined signal name Remarks This macro creates the prototype and opening of a function that is to be used as an interrupt. The routine will be executed with interrupts enabled."
Danke für eure Hilfe Dass hat mir etwas weitergeholfen. Da ich mehrere Interrupt's verwende die leider etwas länger sind, muß ich mir wie's aussieht selbst eine Verriegelung programmieren. Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig sauber abzudrehen und danach wieder zu aktivieren? mfg Sepp
Hi, Sepp, "Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig sauber abzudrehen und danach wieder zu aktivieren?" Das ist eine Frage der Grundstruktur des Programms - ich benutze - aus Faulheit - * eine schnelle Schleife in main(), * Jede Interrupt-Routine macht nicht mehr als daß sie beispielsweise vom UART ein empfangenes Byte und die Fehlerflags liest und in einem Ringpuffer ablegt. * Main()-Routine fragt dann die Zeiger auf den Ringpuffer ab, ob es was Neues gibt. Aber ist das was Neues? Was könnte uns zwingen, Interrupt-Routinen so aufwendig zu machen, daß die sich schachteln müssen? Ciao Wolfgang Horn
Salve Ungefär so, wie du es beschrieben hast hatte ich es auch vor. Wir haben das Problem dass im aktuellen Fall alles über Interrupt's läuft. Und da der Mikrokontroller als Fail-Save funktioniert, sollten doch so viele Fehlermöglichkeiten wie möglich untersucht, bewertet und soweit wie möglich vermieden werden. Ich möchte also ganz genau wissen was der Mikrocontroller wie macht. Und die Interupt's sind ein Bereich den ich mir jetzt ganz genau anschaue. mfg Sepp
@Sepp, "Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig sauber abzudrehen und danach wieder zu aktivieren?" Jo, das nennt sich cli() und sei(). Ist z.B. nötig, wenn man Variablen mit Interrupts austauscht, auf die nicht atomar zugegriffen werden kann (16 oder 32 Bit). "Wir haben das Problem dass im aktuellen Fall alles über Interrupt's läuft." Dann verschenkst Du aber eine Ausführungsebene. Es programmiert sich einfacher, wenn man alle nicht eilige Sachen im Main macht, da dann nicht soviel gepusht und gepopt werden muß. D.h. der Code wird kleiner und schneller. Peter
Salve Klar sollte man so viel wie möglich im Main machen. Leider kann ich in dieser Anwendung nur mit Interrupts arbeiten. Ich muz dabei genaue Zeitintervalle einhalten und auf Pegeländerungen eines externen Eingangs reagieren. Ich habe in diesem Fall eigentlich keine Aufgaben die im Main abgearbeitet werden können. Es gibt da leider nur eilige sachen deren Dringlichkeit aber unterstuft ist. Danke für den Tipp mit cli(). Das werd ich gleich mal ausprobieren. mfg Sepp
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.