ADC beim Atmega8

Gast #3181400
Lesenswert?

Hallo,

ich bekomme einfach keine Ausgabe auf PORTB. Der PINC1 liegt an einem 
Poti dran und der wiederum an VCC von 5V. Der PORTB ist komplett an 
LED´s angeschlossen (Pro Ausgang eine LED).
Wo könnte der Fehler in meinem Programm liegen?


.include "m8def.inc"

 ldi r16, 0x00
 out DDRC, r16   ; Datenrichtungsregister von C komplett auf Eingang 
setzen

 ldi r16, 0xFF
 out DDRB, r16   ; Datenrichtungsregister von B komplett auf Ausgang 
setzen

 ldi r16, 0xC1
 out ADMUX, r16  ; Kanal Einstellung (Kanal 1 PIN PC1) und 
Referenzquelle                                                 ;(Interne 
Referenz 2,56V)

 ldi r16, 0xE7
 out ADCSRA, r16 ; Funktion (Eigenständig und Eingeschaltet) und 
Vorteiler ;(128)

 loop:

 in r17, ADCL
 out PORTB, r17  ; Die höchsten 8 Bits am PortB ausgeben
 rjmp loop

Vielen Dank.
Gast #3181419
Lesenswert?

Hi

> ldi r16, 0xC1

Benutzt bitte die Bitnamen->

ldi r16,1<<REFS1|1<<REFS0|1<<MUX0

>in r17, ADCL
> out PORTB, r17  ; Die höchsten 8 Bits am PortB ausgeben

In ADCL befinden sich die niederwertigsten 8 Bit. Die höherwertigsten 
bekommst du bei gesetztem ADLAR in ADMUX. Und da ADLAR nicht gesetzt ist 
trifft folgendes zu (Datenblatt)

When ADCL is read, the ADC Data Register is not updated until ADCH is 
read. Consequently, if
the result is left adjusted and no more than 8-bit precision is 
required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH.

MfG Spess
Gast #3181533
Lesenswert?

Hat funktioniert.
Ich mußte nur das Ergebnisregister wechseln und bei ADLAR eine "1" für 
das linksbündige ausrichten des Ergebnisses.

Es sollte jedoch auch funktionieren wenn ich in ADLAR eine "0" schreibe 
und ADCL ausgebe, doch das funktioniert nicht.
Weiß jemand wieso?
1
 ldi r16, 0x00
2
 out DDRC, r16   ; Datenrichtungsregister von C komplett auf Eingang setzen 
3

4
 ldi r16, 0xFF
5
 out DDRB, r16   ; Datenrichtungsregister von B komplett auf Ausgang setzen
6

7
 ldi r16, (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1<<MUX0)
8
 out ADMUX, r16  ; Kanal Einstellung (Kanal 1 PIN PC1) und Referenzquelle (Interne Referenz 5V) 
9
 ldi r16, (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
10
 out ADCSRA, r16 ; Funktion (Eigenständig und Eingeschaltet) und Vorteiler            
11

12
 loop:
13
 in r17, ADCL      
14
 out PORTB, r17  ; Die 8 niederwertigsten Bits sollten an PortB ausgegeben
15
 rjmp loop
#3181537
Lesenswert?

Jaro schrieb:
> Hat funktioniert.
> Ich mußte nur das Ergebnisregister wechseln und bei ADLAR eine "1" für
> das linksbündige ausrichten des Ergebnisses.
>
> Es sollte jedoch auch funktionieren wenn ich in ADLAR eine "0" schreibe
> und ADCL ausgebe, doch das funktioniert nicht.
> Weiß jemand wieso?

Wie spess schon schrieb:

Du MUSST ADCH lesen(!).
Wenn du nur ADCL liest, dann werden die beiden ADC Register gegen 
UPdates verriegelt. Erst ein lesen von ADCH löst diese Verriegelung 
wieder.

D.h. ADCL kannst du beim auslesen auslassen. Aber ADCH  MUSST du auf 
jeden Fall immer lesen.

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