Forum: Mikrocontroller und Digitale Elektronik Probleme mit ADC im Free Running Mode und ADMUX


von Ralf Meiberg (Gast)


Lesenswert?

Hallo.

Ich hoffe nochmals auf Eure Hilfe. Bei meinem ersten Versuch hier zu
posten konnte mir leider keiner helfen, aber vielleicht ja jetzt.

Ich habe folgendes Problem:

Ein Unterprogramm soll hintereinander mehrere Spannungswerte
auswerten:


1.)Ausgangsspannung (PA0)
2.)Eingangsspannung (PA1)
3.)Ausgangsspannung (PA0)
4.)Spannung_an_Shunt_1 (PA6)
5.)Ausgangsspannung (PA0)
6.)Spannung_an_Shunt_2 (PA7)




Da dies zyklisch mit einem ganz bestimmten Takt geschehen soll,
betreibe ich den ADC im Free Running Mode und Interrupt. In der ADC_ISR
möchte ich nun synchron dazu die ADC_Kanäle ändern (bzw. einen Takt
vorher auf den gewünschten Kanal umstellen).
Ich initialisiere meinen ADC mit dem Kanal ADC0

ADC_ISR:

PUSH...
PUSH...
..

SBRS pruefbyte, ZUSTAND_BIT
RJMP zustand_inaktiv

IN temp, ADCL
IN temp, ADCH

LDI ZH, high(Tabelle)
LDI ZL, low(Tabelle)
ADD ZL, adc_channel
BRCC kein_ueberlauf_
INC ZH
kein_ueberlauf_:
IJMP

Tabelle:
RCALL Kanal_eingangsspg          ;Kanal auf PA1 umstellen
RJMP end_adc

RCALL Kanal_ausgangsspg          ;Kanal auf PA0 umstellen
RJMP end_adc

RCALL Kanal_spg_shunt1           ;Kanal auf PA6 umstellen
RJMP end_adc

RCALL Kanal_ausgangsspg          ;Kanal auf PA0 umstellen
RJMP end_adc

RCALL Kanal_spg_shunt2           ;Kanal auf PA7 umstellen
RJMP end_adc

RCALL Kanal_ausgangsspg          ;Kanal auf PA0 umstellen
end_adc:

IN temp_l, ADCL
IN temp_h, ADCH
SBR pruefbyte, ADC_STATUS

POP ...
POP ...
POP ...

RETI

Jetzt sollte es so sein daß der ADC beim ersten mal mit ADC0
initalisiert ist. Dann sollte er die Werte der Ausgangsspannung
einlesen den Kanal aud ADC1 umstellen, die ISR beenden, das
Unterprogramm aufrufen, die Spg. auswerten. Beim nächsten mal sollte er
die Eingangspg. einlesen, den Kanal auf ADC0 umstellen usw...

Eigentlich klappt ja alles, außer das der ADC nicht den gewünschten
Wert einliest obwohl ich doch vorher das Register ADMUX geändert habe.
Erst habe ich gedacht, daß der ADC zwei Durchläufe braucht um den Kanal
zu ändern, aber ich konnte da auch keine Regelmäßigkeit erkennen.

Vielleicht wisst Ihr eine Lösung für mein Problem, da ich den Fehler
einfach nicht finden kann.

MfG
Ralf

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.