Atmega 16 - ADC und Interrupts

OP #2868380
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
#2868388
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.
#2868389
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.
Gast #2868390
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
OP #2868411
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
#2868427
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
#2868449
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
#2868455
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.
OP #2868526
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren