Hallo, ich hätte mal eine Frage zum ADC- und Interrupt-Verhalten: Gemäß Datenblatt dauert eine ADC-Conversion ja 13 Controller-Takte, im Anschluss erfolgt ein Interrupt (ADIF geht auf high) und die ISR wird aufgerufen. Angenommen, ADC läuft im Free Running Mode und ISR benötigt 10 Controller-Takte zur Abarbeitung. Wann wird jetzt dann immer eine neue ADC-Conversion durchgeführt? Trotzdem nach 13 CPU Takten, oder erst nach 23? Sprich, läuft die ADC-Conversion parallel zur ISR oder muss erst auf die Abarbeitung der ISR gewartet werden? Danke jetzt schon für die Info, thoern
Thomas H. schrieb: > Gemäß Datenblatt dauert eine ADC-Conversion ja 13 Controller-Takte Nein, 13 ADC-Takte. Thomas H. schrieb: > Angenommen, ADC läuft im Free Running Mode und ISR benötigt 10 > Controller-Takte zur Abarbeitung. Mit 10 Takten kommst du längst nicht aus. Thomas H. schrieb: > Sprich, läuft die ADC-Conversion parallel zur ISR oder muss erst auf die > Abarbeitung der ISR gewartet werden. Parallel. Die ADC-Hardware interessiert sich nicht im Geringsten für deine ISR.
Thomas H. schrieb: > Angenommen, ADC läuft im Free Running Mode und ISR benötigt 10 > Controller-Takte zur Abarbeitung. Wann wird jetzt dann immer eine neue > ADC-Conversion durchgeführt? Trotzdem nach 13 CPU Takten, oder erst nach > 23? Sobald die alte fertig ist. Im Free-Runnning-Mode ist der Trigger für den ADC das ADIF Bit. > Sprich, läuft die ADC-Conversion parallel zur ISR oder muss erst auf die > Abarbeitung der ISR gewartet werden? ADC Conversion läuft unabhängig vom Programm.
Hi >Gemäß Datenblatt dauert eine ADC-Conversion ja 13 Controller-Takte, im >Anschluss erfolgt ein Interrupt (ADIF geht auf high) und die ISR wird >aufgerufen. Nein. Es sind 13 ADC-Takte. Der ADC-Takt soll zwischen 50 und 200 kHz liegen. MfG Spess
Ok, danke euch. Gut, Controllertakte und ADC-Takte sind verschiedene Sachen und ADC läuft unabhängig, verstanden! Aber was würde jetzt passieren, wenn die Abarbeitung der ISR länger dauern würde, als eine ADC-Conversion? Würde der nächste auftretetende Interrupt einfach verworfen werden? Danke & Gruß, thoern
Thomas H. schrieb: > Aber was würde jetzt passieren, wenn die Abarbeitung der ISR länger > dauern würde, als eine ADC-Conversion? Würde der nächste auftretetende > Interrupt einfach verworfen werden? Wie bei jedem Interrupt. Das Flag wird gesetzt, die ISR aber nicht angesprungen (weil I-Bit gelöscht). Sobald aus der ISR zurückgekehrt wird, wird das I-Bit wieder gesetzt. Ist dann das Flag noch gesetzt wird sofort wieder die ISR aufgerufen. Ergo, du hängst dann nur noch in der ISR rum. gruß cyblord
cyblord ---- schrieb: > Wie bei jedem Interrupt. Das Flag wird gesetzt, die ISR aber nicht > angesprungen (weil I-Bit gelöscht). Hallo und Danke! Welches Flag meinst genau? Und was meinst du mit I-Bit? ADIF? Nochmals Danke & Gruss, thoern
Hi
>Welches Flag meinst genau? Und was meinst du mit I-Bit? ADIF?
Das I-Flag in SREG.
MfG Spess
Thomas H. schrieb: > cyblord ---- schrieb: > Welches Flag meinst genau? Ja genau. Das ADC Interrupt Flag = ADIF >Und was meinst du mit I-Bit? ADIF? Bitte schau dir im Datenblatt mal das Interrupt-System an bevor du damit spielst. Das I-Bit im SREG schaltet die Interrupts global an und aus, und wird automatisch beim Eintritt und beim Verlassen einer ISR verändert. Es lässt sich mittels SEI und CLI manuell verändern. gruß cyblord
Der generelle Interrupt Mechanismus funktioniert ja so erst mal gibt es ein Flag, in welchem festgehalten wird, dass eine Interrupt Bedingung aufgetreten ist. Sobald die entsprechende Bedingung vorliegt, wird das Flag gesetzt. zum zweiten gibt es ein 'Freigabe-Flag', in welchem geregelt wird, ob eine ISR aufgerufen werden soll. und dann gibt es noch das globale Interrupt Flag, mit dem alle ISR Aufrufe unterbunden werden. Letzteres war mit dem I-Bit gemeint. Ist es nicht gesetzt, so erfolgen auch keine ISR Aufrufe. Beim Eintritt in eine ISR wird es automatisch gelöscht und beim Verlassen der ISR wird es automatisch wieder gesetzt. D.h. erst mal kann es nicht passieren, dass eine ISR durch eine andere ISR unterbrochen wird. Und du kannst natürlich mittels cli() bzw. sei() dieses Flag beeinflussen und so auf einen Schlag die Bearbeitung aller ISR erst mal auf Eis legen. Ist dein ADC mit der Wandlung fertig, dann setzt er das erste dieser Flags: Ereignis aufgetreten. Nach jedem Befehl überprüft der µC alle möglichen Interrupt Quellen * ist das entsprechende Ereignis - Flag gesetzt? * ist das Flag zur Freigabe des ISR Aufrufs gesetzt? * und: ist die globale Interrupt Freigabe freigegeben Wenn alle 3 Fragen mit ja beantwortet werden erfolgt der ISR AUfruf und das Ereignis-Flag wird zurückgesetzt. (Ausnahem: Usart Receive. Da erfolgt das Rpcksetzen erst mit dem Auslesen von UDR. Ist hier aber nicht weiter von Belang) D.h. aber auch: Wird ein Ereignis Flag gesetzt, dann geht das nicht einfach verloren, sondern der ISR Aufruf (sofern einer freigegeben ist) wird bei der nächsten möglichen Gelegenheit nachgeholt.
Wie immer, wunderschön erklärt. Ich hätte jetzt zwar gesagt, das kann man auch im DB nachlesen, aber so gehts natürlich auch. gruß cyblord
Hallo, ihr seit spitze. Hab das zwar nachgelesen, aber ihr wisst ja - so ein Datenblatt ist mächtig und ich befasse mich (nach 20J Pause) erst seit kurzem wieder mit Microcontrollern. Habe auch mein Programm (Schattenbahnhofsteuerung f. die Eisenbahn meines Sohnes) schon geschrieben und es funktioniert sogar einwandrei. Hab das in C gemacht und was sei(), etc. tut, ist mir auch klar, allerdings bin ich von Assembler und tatsächlichen Registern schon noch etwas weg (C abstrahiert ja gott-sei-dank einiges, oder sollte ich sagen, "leider"? .-) Also, danke euch nochmals ausdrücklich! Gruß, thoern
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.