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?
Manuel H. schrieb: > Es funktioniert aber. Wo ist mein Denkfehler? warum sollen dem Timer Takte fehlen, nur weil die ISR nicht bearbeitet wird?
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.
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?
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?
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
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...
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.
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)
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.
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.
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.
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
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 ...
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
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
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
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.
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
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 ...
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.