ATMega16 - ADC mit 2 Kanälen

Gast #729901
Lesenswert?

Hallo,

ich habe ein kleines C Programm für den ATMega16 geschrieben welches bei 
jedem Interrupt (Flanke an PD2) eine ADC am Analogeingang (PA0) 
vornimmt.

Das klappt wunderbar, ich initalisiere den ADC am Anfang und in meiner 
Endlosschleife springt er bei jeder Flanke am Port in meine 
ISR(INT0_vect) Routine. Dort lese ich einfach den Wert aus dem ADCL und 
ADCH und fertig.

Nun will ich das erweitern, sodass in der ISR jedes mal 2 Kanäle 
ausgelesen werden. Doch er wandelt mir die Werte doch automatisch bei 
jedem Interrupt. Ich müsste ja insgesamt 2 mal wandeln und den Kanal 
entsprechend umschalten. Wie funktioniert das bei der Benutzung mit 
Interrupt?

Gruss
#729914
Lesenswert?

> ich initalisiere den ADC am Anfang

Das wird dann nicht mehr gehen, da ja (wahrscheinlich) die
Kanalnummer ein Teil deiner Initialisierung ist.

Es gibt jetzt mehrere Möglichkeiten, jenachdem wie
das Timing an deinem INT0 aussieht.

* Wenn der INT0 regelmässig kommt.
  Du kannst nach wie vor das Ergebnis der letzten Wandlung
  abholen. Danach schaltest du den ADC auf den nächsten Kanal,
  startes die Wandlung und verlässt den INT0 Interrupt wieder.

  Wenn der nächste INT0 auftritt, dann hast du wieder das Ergebnis
  der vorhergehenden Wandlung da, etc. etc.

* Wenn der INT0 nur sporadisch und in nicht zu kurzen Abständen
  kommt.
  Einfach im Interrupt Handler beide ADC Kanäle hintereinander
  sampeln.

* ....

Dreh und Angelpunkt ist es aber, dass du irgendwann die Kanal-
umschaltung im ADMUX Register machen musst.
Gast #729936
Lesenswert?

Ok, danke.

Hatte ich mir schon gedacht dass man das nicht automatisieren kann. 
Benutze den ADC nun nur noch im Single Conversion Mode und starte den 
ADC in meiner ISR eben 2 mal mit jeweils nem anderen Kanal.

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