Forum: Mikrocontroller und Digitale Elektronik AVR Atmega8-16PU Probleme mit ADC


von Bernhard N. (nett)


Lesenswert?

Hallo zusammen,
ich hoffe, dass mir hier jemand weiterhelfen kann.
Ich möchte eine variable Spannung (von Poti) am Analogeingang1 (Pin24) 
einlesen und die höherwertigen 8 bits am PortD darstellen. Dieser 
steuert erst nur LEDS an, um zu sehen, ob sich etwas tut. Leider 
funktioniert hier gar nichts. Testweise Ansteuern der LEDs mittels 
Festwert funktioniert.
Folgend der Assembler Code:

.nolist
.include "m8def.inc"
.nolist

main:

    ;PortD als Ausgang

ldi r18,0xff
out ddrd,r18

    ;Einlesen Analogwert

ldi r16,0x61    ;Avcc als Referenz, ADLAR ein, Mux1 (0110 0001)
out ADMUX,r16

ldi r16,0xC7    ;ADEN auf 1, ADSC auf 1, ADC Prescaler auf 128 (1100 
0111)
out ADCSRA,r16

Warte:
sbic ADCSRA,ADSC     ;Warte bis ADSC auf 0
rjmp Warte

in R16,ADCH

     ;ADCH an PortD
out portd,r16

rjmp main

Wie oben gesagt, es tut sich gar nichts an den Ausgängen.
Über Tipps oder Hilfestellungen bin sehr dankbar

von Thomas F. (igel)


Lesenswert?

> ldi r16,0xC7    ;ADEN auf 1, ADSC auf 1, ADC Prescaler auf 128 (1100

Mit dieser Schreibweise vergraulst du potentielle Helfer. Nur wenige 
haben Lust, hier die Steuerbits rauszufummeln.

So liest es sich besser:

ldi r16, 1<<ADEN|1<<ADPS2|1<<ADPS1|1<<ADPS0 ;ADEN auf 1, Prescaler 128
out ADCSRA,r16
;Das ADSC habe ich weggelassen Versuche es mal so:

ADC_loop:
sbi ADCSRA, ADSC        ; den ADC starten

Warte:
sbic ADCSRA,ADSC     ;Warte bis ADSC auf 0
rjmp Warte

in R16,ADCH
out portd,r16 ;ADCH an PortD

rjmp ADC_loop

von Bernhard N. (nett)


Lesenswert?

Erstmal vielen Dank für die schnelle Antwort!!!!
Es funktioniert jetzt. Mich interresiert jetzt natürlich auch, was dass 
Problem war.

von Joachim (Gast)


Lesenswert?

Moin,

also 100%ig sicher bin ich nicht, aber ich vermute der ADC mag es nicht, 
daß du ihn gleichzeitig aktivierst und startest:
> ldi r16,0xC7    ;ADEN auf 1, ADSC auf 1, ADC Prescaler auf 128 (1100
0111)

In dem Beispiel von Thomas wird das schön der Reihe nach gemacht. Also 
erst konfigurieren und aktivieren, DANN starten.
Außerdem durchratterst du jedes mal ja die komplette Initialisierung 
mit. Das ist überhaupt nicht gut.
Es reicht ja (so wie bei Thomas), wenn deine Endlosschleife nur den ADC 
startet, wartet, Wert an Port übergibt, startet, wartet, usw...

Programmier es einfach nochmal, ich wette jetzt kriegst du das spontan 
auch hin :)

von Bernhard N. (nett)


Lesenswert?

Hab gerade mal die Endlosschleife weggenommen, so dass die 
Initialisierung jedesmal mit durchläuft. Da dies auch funktioniert, 
scheint wirklich das Problem gewesen sein, dass Aktivierung und starten 
gleichzeitig stattgefunden hat.
> ldi r16,0xC7    ;ADEN auf 1, ADSC auf 1, ADC Prescaler auf 128 (1100
0111)

Nochmals vielen Dank für eure Antworten!!!!!!!

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.