Forum: Mikrocontroller und Digitale Elektronik ADC beim Atmega8


von Jaro (Gast)


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.

von spess53 (Gast)


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

von Jaro (Gast)


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

von Karl H. (kbuchegg)


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.

von Jaro (Gast)


Lesenswert?

Ach ich muss ADCH auch auslesen damit die Sperre aufgehoben werden kann 
und der ADC den nächsten Wert konvertieren und ins Ergebnisregister 
schreiben kann.

von Stefan E. (sternst)


Lesenswert?

Jaro schrieb:
> Es sollte jedoch auch funktionieren wenn ich in ADLAR eine "0" schreibe
> und ADCL ausgebe, doch das funktioniert nicht.
> Weiß jemand wieso?

Spess hat doch die Passage des Datenblattes zitiert, die eindeutig 
erklärt, warum das nicht funktioniert.

von Jaro (Gast)


Lesenswert?

Super vielen Dank

von Jaro (Gast)


Lesenswert?

Weiß vielleicht noch jemand wie ich die Bereichsbreite verstellen kann?

von Spess53 (Gast)


Lesenswert?

Hi

>Weiß vielleicht noch jemand wie ich die Bereichsbreite verstellen kann?

Welche Bereichsbreite?

MfG Spess

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.