AVR Atmega8-16PU Probleme mit ADC

OP #2243143
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
#2243169
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
Gast #2243252
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 :)
OP #2243285
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!!!!!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren