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
> 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.
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.
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.