Forum: Mikrocontroller und Digitale Elektronik AVR Interupts - kurze Frage


von annemarie (Gast)


Lesenswert?

Liebes Forum,

Ohne besondere Softwarekonstrukte kann ja ein AVR zunächst mal keine 
kaskadierten Interupts. Mir geht es um zwei Ints, die ich nutzen will

1) Timer-Overflow
2) Pinchange-Int (Flanke)

Ich möchte nur gerne wissen, ob ich ABSOLUT SICHER(!) sein kann, dass, 
wenn gerade der EINE Interupt bearbeitet wird, der jeweils andere 
zuverlässig vorgemerkt wird und dann danach dessen ISR angesprungen 
wird. Kann es Situationen geben, wo das nicht zutrifft?


Gruss
Anne

von Matthias L. (Gast)


Lesenswert?

>Ich möchte nur gerne wissen, ob ich ABSOLUT SICHER(!) sein kann, dass,
>wenn gerade der EINE Interupt bearbeitet wird, der jeweils andere
>zuverlässig vorgemerkt wird und dann danach dessen ISR angesprungen
wird.

Kannst du. Es steht sogar im Datenblatt, dass dabei der bereits 
bearbeitete ISR zuende bearbeitet wird. Danach wird EIN (asm) Befehl vom 
Hauptprogramm ausgeführt, bevor der nächste (priorität) anstehende 
Interrupt bedient wird.

>Kann es Situationen geben, wo das nicht zutrifft?

Ja, wenn du vorher das "Merkerflag" des Interrupts durch Schreiben einer 
EINS löschst.

von annemarie (Gast)


Lesenswert?

Danke Lippy, very good!

Anne

von Johannes M. (johnny-m)


Lesenswert?

Matthias Lipinsky wrote:
>>Kann es Situationen geben, wo das nicht zutrifft?
>
> Ja, wenn du vorher das "Merkerflag" des Interrupts durch Schreiben einer
> EINS löschst.
Und wenn während der Bearbeitung des ersten Interrupts ein anderes 
Interrupt-Ereignis mehrfach auftritt. Da es für jeden Interrupt nur ein 
Flag gibt, kann natürlich jeweils immer nur ein Ereignis festgehalten 
werden.

von Falk B. (falk)


Lesenswert?


von Kachel-Heinz (Gast)


Lesenswert?

> Interrupt

Richtig, aber in den 50er Jahren habe ich mal gelernt, dass man im 
ganzen Satz antworten sollte anstatt einfach nur ein Wort (auch wenn es 
sachlich richtig ist) hinzurülpsen, wenn man ernstgenommen werden 
möchte. Soviel Zeit muss sein.

KH

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

annemarie wrote:
> Liebes Forum,
>
> Ohne besondere Softwarekonstrukte kann ja ein AVR zunächst mal keine
> kaskadierten Interupts. Mir geht es um zwei Ints, die ich nutzen will
>
> 1) Timer-Overflow
> 2) Pinchange-Int (Flanke)
>
> Ich möchte nur gerne wissen, ob ich ABSOLUT SICHER(!) sein kann, dass,
> wenn gerade der EINE Interupt bearbeitet wird, der jeweils andere
> zuverlässig vorgemerkt wird und dann danach dessen ISR angesprungen
> wird. Kann es Situationen geben, wo das nicht zutrifft?

Es ist wie folgt: Es gibt beim AVR eine Vektor-Tabelle, hierbei ist die 
Prioritaet absteigend, das heisst Interrupts mit einer kleineren 
Vektornummer sind hoeher in ihrer Prioritaet. Vorgemerkt wird immer nur 
ein Interrupt. Werden nun waehrend der Ausfuehrung Deines ISR zwei 
unterschiedliche Interrupts vorgemerkt, wird zunaechst ein Befehl des 
Hauptprogramms ausgefuehrt (um Aushungern zu vermeiden) und dann wird 
erst der Interrupt mit der niedrigeren Vektornummer bearbeitet, da 
kannst Du Dir sicher sein. Das steht aber auch alles im Datenblatt.

Gruss,
Michael

von Falk B. (falk)


Lesenswert?

@  Kachel-Heinz (Gast)

>Richtig, aber in den 50er Jahren habe ich mal gelernt, dass man im
>ganzen Satz antworten sollte anstatt einfach nur ein Wort (auch wenn es

Dann solltest du mal 50 Jahre technische Entwicklung und 20 Jahre 
Netzkultur aufholen um festzustellen, dass das ein Link auf einen 
Artikel ist.

>sachlich richtig ist) hinzurülpsen, wenn man ernstgenommen werden
>möchte. Soviel Zeit muss sein.

Ich hab mir sogar die Zeit genommen, den verlinkten Artikel weitläufig 
zu üerarbeiten und zu erweitern. Soviel dazu.

MFG
Falk

von annemarie (Gast)


Lesenswert?

>>20 Jahre Netzkultur...

Netz und Kultur in einem Wort, das ist ja grausig.
Ist das nicht ein Widerspruch in sich...?

;-)
Anne

von AVRFan (Gast)


Lesenswert?

>[zwischen zwei Interrupts]
>ein Befehl des Hauptprogramms ausgefuehrt (um Aushungern zu vermeiden)

Für das "eine Hauptprogramm-Instruktion nach jedem Interrupt, bevor ein 
weiterer vorgemerkter Interrupt angesprungen wird" gibt es einen sehr 
speziellen Grund: Es ermöglicht einen Single-Step-Betrieb des 
Controllers, z. B. für Debuggingzwecke.

Das funktioniert so: Man benötigt einen freien externen Interrupt, z. B. 
INT0, der auf Pegeltriggerung konfiguriert wird.  Ans Ende des 
Interrupthandlers schreibt man zwei Schleifen, mit denen ein 
/zweifacher Pegelwechsel/ abgewartet wird.  Der Handler wird also erst 
verlassen, wenn der Pegel am Ext-Int-Pin von "Ativ" nach "Ruhe" und 
wieder zurück nach "Aktiv" gewechselt hat.  Dann passiert das 
Gewünschte: genau eine Instruktion des Hauptprogramms wird abgearbeitet 
und danach sofort wieder der Ext-Interrupthandler angesprungen.  An den 
Anfang dieses Handlers können beliebige Testroutinen geschrieben werden, 
z. B. zur Ausgabe von Registerinhalten etc.

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.