Forum: Mikrocontroller und Digitale Elektronik Bascom: ADC-Interrupt Wie auswerten???


von Christoph (Gast)


Lesenswert?

Wenn ich in einem normalen Prgramm  Wert = Getadc(channel) schreibe ist 
das ja klar. Aber wenn ich den ADC oder den IDLE-sleep mode verwende, 
dann startet dieser sleep mode den ADC automatisch. Nur wie werte ich 
den ADC dann aus? Mit Getadc würde ich den Vorgang ja nochmals starten. 
Das hat ja keinen Sinn. Muß ich da dann ADCL und ADCH auswerten und wie 
stelle ich den aktuellen Kanal ein? Übrigens ich verwende den Mega8

von Hannes L. (hannes)


Lesenswert?

Christoph wrote:
> Wenn ich in einem normalen Prgramm  Wert = Getadc(channel) schreibe ist
> das ja klar. Aber wenn ich den ADC oder den IDLE-sleep mode verwende,
> dann startet dieser sleep mode den ADC automatisch. Nur wie werte ich
> den ADC dann aus? Mit Getadc würde ich den Vorgang ja nochmals starten.
> Das hat ja keinen Sinn.

Genau, es macht keinen Sinn, die ADC-Quelle erst dann einzustellen, wenn 
man das Ergebnis haben möchte. Denn dann muss man warten, bis das 
Ergebnis da ist.

> Muß ich da dann ADCL und ADCH auswerten und wie

Ja, ADCL und ADCH in eine Variable einlesen, wenn Du 10 Bit Auflösung 
brauchst. Reichen Dir 8 Bit Auflösung, dann kannst Du mittels ADLAR in 
ADMUX auf linksbündige Ausgabe umschalten und brauchst dann nur ADCH 
auslesen.

> stelle ich den aktuellen Kanal ein?

Das machst Du, bevor Du in den Sleep gehst. Oder noch besser, wenn Du 
das Ergebnis ausgelesen hast (in der ISR ADC-Complete), dann gleich 
(vorausschauend) die Quelle für die nächste Messung einstellen.

Alternativ kannst Du den ADC auch im Free-Run-Mode klappern lassen und 
im Timer-Interrupt (der meist noch andere Dinge zu tun hat) ganz 
nebenbei mit abfragen. Nach der Abfrage (dem Einlesen von ADCH) dann 
gleich die als nächstes benutzte Quelle in ADMUX eintragen. Und 
insgesamt darauf achten, dass der ADC-Takt so schnell eingestellt wird, 
dass immer mindestens zwei neue Messungen fertig sind, ehe die Timer-ISR 
zuschlägt. Dann hast Du nämlich stabile Werte, der erste Messwert nach 
Start oder Quellenumschaltung ist nicht immer korrekt (liest man öfters 
mal).

Wenn Du dann noch mit Sleep (Idle) arbeitest, dann erfolgt die letzte 
Wandlung vor dem Auslesen auch noch im Sleep, was Störungen etwas 
unterdrückt und somit genauere (rauschärmere) Werte liefert.

> Übrigens ich verwende den Mega8

Ich auch manchmal, allerdings in ASM, deshalb bekommst Du auch keine 
BASCOM-Codebeispiele von mir...

...

von Christoph (Gast)


Lesenswert?

@Hannes:
Habe schon versucht ADCL und ADCH auszulesen. Dazu definiere ich eine 
Word-Variable mit overlay und definiere an der gleichen Stelle 2-Byte 
Variablen. So fasse ich dann ADCL und ADCH zu einer Word-Variablen 
zusammen. Alles recht umständlich wenn man das mit dem Getadc Befehl 
vergleicht. So ganz ist mir immer noch nicht klar wie ich ohne Getadc 
den aktuellen Kanal einstelle. Assembler kann ich auch in Bascom 
einfügen. Einige ASM-Instruktionen könnnten da schon weiterhelfen. Mit 
dem Timing glaube ich nicht daß ich Schwierigkeiten bekomme, weil der 
Mega8 erst dann aufwacht, wenn die Wandlung abgeschlossen ist.

von Christoph (Gast)


Lesenswert?

@Hannes:
Habe soeben herausgefunden, daß man bei der Kanaleinstellung die 
Mux-Bits setzt. Kann immer noch nicht ganz glauben wie umständlich das 
plötzlich wird, nur weil man den Sleep-mode verwendet.

von Hannes L. (hannes)


Lesenswert?

Schau Dir mal im Datenblatt die Beschreibung der Bits im I/O-Register 
ADMUX an. Da wird in einem Byte Referenzquelle, Ergebnisformat und 
Messquelle zusammengefasst. Du musst also mit logischen Verknüpfungen 
(AND, OR) dafür sorgen, dass nur die Bits verändert werden, die auch 
verändert werden sollen.

Ein Beispiel mit 6 ADC-Eingängen (Mega48) findest Du hier.

http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html

Allerdings schaltet die Timer-ISR den ADC ein und die ADC-ISR wieder 
aus. Zu beachten ist auch, dass der Mega48 die I/Os in anderen 
Adressbereichen hat, was andere Zugriffsarten erfordert. Ein weiteres 
Beispiel mit AT90S4433 (Vorgänger des Mega8) findest Du als Link auf der 
Seite.

...

von Hannes L. (hannes)


Lesenswert?

Christoph wrote:
> @Hannes:
> Habe soeben herausgefunden, daß man bei der Kanaleinstellung die
> Mux-Bits setzt.

Richtig. Auch mal ins Datenblatt schaun...

> Kann immer noch nicht ganz glauben wie umständlich das
> plötzlich wird, nur weil man den Sleep-mode verwendet.

Was ist daran umständlich? Da ist der Code, den BASCOM erzeugt, 
vermutlich umständlicher. Nicht vergessen, der AVR kann kein BASCOM, der 
kann nur Maschinencode, ASM entspricht 1 zu 1 Maschinencode. Deutlicher 
als mit ASM kann man dem AVR nicht sagen was er tun soll.

...

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.