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
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... ...
@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.
@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.
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. ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.