Forum: Mikrocontroller und Digitale Elektronik Atmega 16 - ADC und Interrupts


von Thomas H. (thoern)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Thomas H. (thoern)


Lesenswert?

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

von Cyblord -. (cyblord)


Lesenswert?

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

von Thomas H. (thoern)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Welches Flag meinst genau? Und was meinst du mit I-Bit? ADIF?

Das I-Flag in SREG.

MfG Spess

von Cyblord -. (cyblord)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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

von Thomas H. (thoern)


Lesenswert?

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
Noch kein Account? Hier anmelden.