Forum: Mikrocontroller und Digitale Elektronik Interrupt Override


von Manuel H. (manu77)


Lesenswert?

Es hapert gerade an einem kleinen Verständnis-Problem.
Mein ATMega328 hat einen ADC, der alle 400Hz abtastet. In der 
Interrupt-Routine wird übergangsweise noch gerechnet (Später in der 
Main, gepuffert). Die Berechnung dauert ca. 240µs.
Der Timer1 feuert mit einer Frequenz von 38000Hz. Der Interrupt vom 
Timer löst folglich alle 26µs aus.
Jetzt frag ich mich, wieso das funktioniert. Der ISR vom ADC blockiert 
ja 240µs alle anderen Interrupts, somit würde dem Timer ja Takte fehlen. 
Es funktioniert aber. Wo ist mein Denkfehler?

von Peter II (Gast)


Lesenswert?

Manuel H. schrieb:
> Es funktioniert aber. Wo ist mein Denkfehler?

warum sollen dem Timer Takte fehlen, nur weil die ISR nicht bearbeitet 
wird?

von Manuel H. (manu77)


Lesenswert?

Peter II schrieb:
> warum sollen dem Timer Takte fehlen, nur weil die ISR nicht bearbeitet
> wird?

In der ISR wird für eine Millisekunde bis 37 gezählt. Wenn die ISR nicht 
abgearbeitet werden kann, wird das Flag nicht zurückgesetzt. Folgen 
jetzt weitere Überläufe, werden die ja nicht berücksichtig. So war es 
mir geläufig.

von Peter II (Gast)


Lesenswert?

Manuel H. schrieb:
> In der ISR wird für eine Millisekunde bis 37 gezählt. Wenn die ISR nicht
> abgearbeitet werden kann, wird das Flag nicht zurückgesetzt. Folgen
> jetzt weitere Überläufe, werden die ja nicht berücksichtig. So war es
> mir geläufig.

richtig, und was hat das mit Takte verlieren zu tun?

von Manuel H. (manu77)


Lesenswert?

Peter II schrieb:
> richtig, und was hat das mit Takte verlieren zu tun?

Ich meinte die hoch laufende Variable, da habe ich mich wohl schlecht 
ausgedrückt.

Trotzdem gehen keine Interrupts verloren. Ich frage mich wieso?

von Karl H. (kbuchegg)


Lesenswert?

Manuel H. schrieb:
> Peter II schrieb:
>> richtig, und was hat das mit Takte verlieren zu tun?
>
> Ich meinte die hoch laufende Variable

welche hoch laufende Variable?

> Trotzdem gehen keine Interrupts verloren. Ich frage mich wieso?

Das kann nicht sein.
Wenn deine ISR 230µs zur Abarbeitung braucht, aber alle 26µs neu 
angestossen werden würde, dann fallen einige der Abarbeitungen unter den 
Tisch. Den Timer selbst kümmert das nicht. Der zählt ungerührt weiter. 
So wie es deinen Wecker auch nicht die Bohne kümmert, ob du beim 
klingeln aufstehst oder nicht. Morgen früh um 7 klingelt er wieder.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Karl H. schrieb:

> Den Timer selbst kümmert das nicht. Der zählt ungerührt weiter.
> So wie es deinen Wecker auch nicht die Bohne kümmert, ob du beim
> klingeln aufstehst oder nicht. Morgen früh um 7 klingelt er wieder.

Schöner Vergleich, das muß ich dir lassen. Absolut simpel dem RL 
entnommen und trotzdem tatsächlich (fast) völlig zutreffend. Du 
unterschlägst hier nur die Speicherwirkung des IRQ-Flags.

Aber auch die hätte man in dem RL-Vergleich problemlos noch mit 
unterbringen können, der Sachverhalt entspricht ja zumindest 
näherungweise der Snooze-Funktion eines generischen RL-Weckers. Bloß 
dass "wer anders" auf die GROSSE Taste haut. Wenn man jetzt in den 
RL-Vergleich noch eine oder mehrere Bettgenoss_Inn_en (*politically 
gender corrected*) für diese Rolle einbaut, verstehen vielleicht auch 
die notorischen Interrupt-Nichtversteher irgendwann, was man von so 
einem Ding tatsächlich erwarten kann und was nicht...

von Manuel H. (manu77)


Lesenswert?

Karl H. schrieb:
> Das kann nicht sein.
> Wenn deine ISR 230µs zur Abarbeitung braucht, aber alle 26µs neu
> angestossen werden würde, dann fallen einige der Abarbeitungen unter den
> Tisch. Den Timer selbst kümmert das nicht. Der zählt ungerührt weiter.
> So wie es deinen Wecker auch nicht die Bohne kümmert, ob du beim
> klingeln aufstehst oder nicht. Morgen früh um 7 klingelt er wieder.

Es sind zwei Interrupts. Der Erste wird mit 400Hz getaktet und er 
braucht 240µs. Der Zweiter taktet mit 38kHz und zählt eine Variable 
hoch. Erreicht diese die Zahl 37, ist eine ms vergangen.
Mich wundert, dass die erste Interrupt-Routine die zweite nicht negativ 
beeinflusst, da diese innerhalb der 240µs ja ca. 10 mal ausgeführt 
werden sollte, es aber nicht wird, weil der erste Interrupt blockiert.

von Walter S. (avatar)


Lesenswert?

Manuel H. schrieb:
> Mich wundert, dass die erste Interrupt-Routine die zweite nicht negativ
> beeinflusst, da diese innerhalb der 240µs ja ca. 10 mal ausgeführt
> werden sollte, es aber nicht wird, weil der erste Interrupt blockiert.

wenn du in der ersten Routine den Interrupt nicht explizit wieder 
freigibst werden auch ein paar Timerinterrupts verschluckt, 
wahrscheinlich merkst du es nur nicht weil es nur aale paar ms passiert 
(400Hz)

von Manuel H. (manu77)


Lesenswert?

Walter S. schrieb:
> wenn du in der ersten Routine den Interrupt nicht explizit wieder
> freigibst werden auch ein paar Timerinterrupts verschluckt,
> wahrscheinlich merkst du es nur nicht weil es nur aale paar ms passiert
> (400Hz)

Der Interrupt wird nicht wieder freigegeben. Es ist kein "Multitasking". 
Ich sehe auf dem Ozi aber ein sauberes 1ms Signal.

von Christian (Gast)


Lesenswert?

Hast du mal gemessen wie lange diese Millisekunde wirklich dauert?

von Dieter F. (Gast)


Lesenswert?

Manuel H. schrieb:
> Ich sehe auf dem Ozi aber ein sauberes 1ms Signal

Was misst Du denn da genau? Toggelst Du per Counter im CTC-Mode den 
OC..-Pin?

Erhellend wären die (alle) Einstellungen von Timer1 und die zugehörige 
ISR, welche ja sicher sehr übersichtlich ist.

von Manuel H. (manu77)


Lesenswert?

Christian schrieb:
> Hast du mal gemessen wie lange diese Millisekunde wirklich dauert?

Das werde ich morgen nochmal machen. Allerdings müsste die Abweichung 
mindestens 30% sein und das kann ich mit hoher Wahrscheinlichkeit 
ausschließen, so wie es aussah.

von Manuel H. (manu77)


Lesenswert?

Dieter F. schrieb:
> Was misst Du denn da genau? Toggelst Du per Counter im CTC-Mode den
> OC..-Pin?
>
> Erhellend wären die (alle) Einstellungen von Timer1 und die zugehörige
> ISR, welche ja sicher sehr übersichtlich ist.

Der Zeit-Timer ist ein 38000Hz Overflow des Timers1. Der Timer ist im 
Fast PWM, wobei ICR1 die Frequenz und OCR1B den Duty Cycle festlegt. 
Ausgabe am B-Pin vom Timer. Prescaler ist 8 von Baudquarz ~14 MHz. Das 
PWM Signale habe ich geprüft, passt. Im Timer hab ich einen Pin 
getoggelt (Timer eingestellt auf 1ms --> 37 Counts).

Gemessen habe ich die Zeit für die Rechenroutine, die aus dem anderen 
ISR gestartet wird, indem ich vor und nach der Routine einen Port auf 
Low, bzw. high gesetzt habe.

Die Messungen habe ich alle mit einem Oszilloskop durchgeführt.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Manuel H. schrieb:
> Im Timer hab ich einen Pin
> getoggelt (Timer eingestellt auf 1ms --> 37 Counts).

Dieses Toggeln in der ISR des Timer1 (und nicht die PWM-Ausgabe am 
B-Pin) kannst Du mit dem Oszilloskop korrekt messen?

Pack doch mal statt der Rechenroutine ein entsprechendes delay (pöhse, 
pöhse) in den 400 Hz Interrupt, entferne alles, was für die beiden ISR 
mit Steuerung nicht erforderlich ist und stelle den Code mal hier ein 
(falls dann immer noch alles so funktioniert ... :-) ).

Das würde ich gerne mal nachspielen ...

von Karl H. (kbuchegg)


Lesenswert?

Manuel H. schrieb:

> Die Messungen habe ich alle mit einem Oszilloskop durchgeführt.

Ich denke ehrlich gesagt nicht, dass du bei der Auflösung am Oszi 
siehst, wenn alle heiligen Zeiten mal ein Puls bzw. ein Abstand zwischen 
den Pulsen ein  kleines bischen länger ist. Der huscht am Schirm vorbei 
und das oszi triggert auf den nächsten Puls.

Wenn schon dann brauchst du eine Messmethode, bei der sich der Fehler 
akkumuliert.

: Bearbeitet durch User
von Manuel H. (manu77)


Lesenswert?

Karl H. schrieb:
> Ich denke ehrlich gesagt nicht, dass du bei der Auflösung am Oszi
> siehst, wenn alle heiligen Zeiten mal ein Puls bzw. ein Abstand zwischen
> den Pulsen ein  kleines bischen länger ist. Der huscht am Schirm vorbei
> und das oszi triggert auf den nächsten Puls.
>
> Wenn schon dann brauchst du eine Messmethode, bei der sich der Fehler
> akkumuliert.

Wenn der ISR vom ADC 240µs dauert und der ISR vom Timer alle 26µs feuert 
sind es 9 Werte die fehlen, das sind knapp über 24%. würde man doch 
direkt sehen wenn die fehlen, will man meinen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Manuel H. schrieb:

> Wenn der ISR vom ADC 240µs dauert und der ISR vom Timer alle 26µs feuert
> sind es 9 Werte die fehlen, das sind knapp über 24%. würde man doch
> direkt sehen wenn die fehlen, will man meinen.

> Mein ATMega328 hat einen ADC, der alle 400Hz abtastet.

aber der ADC Interrupt schlägt nur 400 mal pro Sekunde zu.
Ja, dir fehlen 24% .... alle heiligen Zeit mal.

Du hast eine Uhr, die am 24. Dezember (und NUR am 24. Dezember) um 5 
Minuten nachgeht. Wie wahrscheinlich ist es, dass du mit Stichproben, 
die du das ganze Jahr über nimmst, da drauf kommst?

: Bearbeitet durch User
von Manuel H. (manu77)


Lesenswert?

Karl H. schrieb:
> aber der ADC Interrupt schlägt nur 400 mal pro Sekunde zu.
> Ja, dir fehlen 24% .... alle heiligen Zeit mal.
>
> Du hast eine Uhr, die am 24. Dezember (und NUR am 24. Dezember) um 5
> Minuten nachgeht. Wie wahrscheinlich ist es, dass du mit Stichproben,
> die du das ganze Jahr über nimmst, da drauf kommst?

400Hz -> Alle 2.5 ms. Dann müsste jede 2. oder 3. - 1 ms Impuls auf dem 
Ozi länger sein, als die davor, da dann 9 Werte von 37 fehlen. Ich werde 
es morgen nochmal genau prüfen.

von Thomas E. (thomase)


Lesenswert?

Manuel H. schrieb:
> 400Hz -> Alle 2.5 ms. Dann müsste jede 2. oder 3. - 1 ms Impuls auf dem
> Ozi länger sein, als die davor, da dann 9 Werte von 37 fehlen. Ich werde
> es morgen nochmal genau prüfen.

Das ist auch richtig. Auf einem Analog-Oszi wackelt das wie verrückt.

Wenn das Bild steht, wird die ADC-ISR nicht ausgeführt oder ist 
(deutlich) kürzer als 26µs. Wenn sie nicht ausgeführt wird, ist 
irgendwas faul.

Wie lang ist die Timer-ISR?

Edit: Wenn die Laufzeit der Timer-ISR länger als 26µs ist, kommt die 
ADC-ISR auf Grund der Interrupt-Priorität nie zum Zuge und das Oszi-Bild 
steht wie eine 1-.


mfg.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Auf dem Weg zur Arbeit nachgedacht :-)

1. Beide Timer laufen unabhängig von der Abarbeitung der ISR unbeirrt 
weiter.
2. Jede ISR wird abgearbeitet - es bleibt ausreichend Zeit

Je nachdem in welcher Reihenfolge und mit welchem Abstand die Timer 
gestartet werden ergibt sich ein - in jedem Fall alle 4 ms (eigentlich 
alle 2 ms) wiederkehrendes - Muster:

Aus "Sicht" des Toggle-Pin in der 1 ms-ISR habe der jeweils erste und 
dritte sowie der jeweils zweite und vierte Toggle-Impuls genau 2 ms 
Abstand. Die Abstände zwischen dem ersten und zweiten sowie dem dritten 
und vierten Toggle-Impuls hängen von der Verzögerung durch die 
Verschiebung der ISR untereinander ab - minimal ca. 2 ms +/-40 us, 
maximal ca. 2 ms +/- 240 us.

Ich wundere mich, dass das dem TO nicht aufgefallen ist. Wenn er einen 
PIN  in der 1 ms-ISR (B-..) per Timer toggeln lässt hat er einen 
verlässlichen 1ms Trigger für den Trigger-Kanal am Oszilloskop. Der 2. 
PIN (in der ISR getoggelt) auf dem 2. Kanal müsste eigentlich vorstehend 
genannte Periodizität aufweisen.

In Summe wird korrekt gezählt - jedoch mit max. 240 us Verzögerung ...

von Thomas E. (thomase)


Lesenswert?

Dieter F. schrieb:
> In Summe wird korrekt gezählt - jedoch mit max. 240 us Verzögerung ...

Wie soll das gehen?

Wenn in einer ISR gezählt wird, diese ISR aber mehrmals nicht ausgeführt 
wird, wird auch nicht korekt gezählt.

mfg.

von Dieter F. (Gast)


Lesenswert?

Thomas E. schrieb:
> Wenn in einer ISR gezählt wird, diese ISR aber mehrmals nicht ausgeführt
> wird, wird auch nicht korekt gezählt.

Oh, sorry - da habe ich doch glatt gelesen, was ich Lesen wollte :-( 
nämlich, dass die Timer1-ISR wirklich nur alle 1 ms "zieht".

Wenn dem wirklich nicht so ist (bisher kennen wir nur Prosa, kein 
Programm), dann verstehe ich die Aussage des TO bezüglich der Messungen 
erst recht nicht.

von Manuel H. (manu77)


Angehängte Dateien:

Lesenswert?

Das Problem hat sich gerade gelöst.
Entweder habe ich gestern falsch gemessen oder es lag daran, dass ich 
hinter einem Mosfet gemessen habe, nevermind.

Anbei das Ozi Bild. Man sieht sehr gut wie der Timer länger braucht.
Vielen Dank für die vielen Denkanstöße!

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.