www.mikrocontroller.net

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


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.