Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC in ATTINY25


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin gerade ziemlich ratlos, habe gestern den ganzen Nachmittag damit 
verbracht, den ADC im ATTINY25 zum laufen zu bringen... leider nur mit 
einem Teilerfolg. Da ich selbst nach einer Nacht drüber schlafen den 
Fehler nicht finde wende ich mich mal vertrauensvoll und mit der 
hoffnung um Hilfe an euch :-)

Den Schaltplan habe ich im Dateianhang angehängt. Die Beschaltung ist 
rein eine Testbeschaltung, mehr nicht. Sobald ich das Poti über einen 
Gewissen Schwellwert drehe sollte die LED leuchten.

Jetzt zu meinem Problem:

Wenn ich das Poti über den Schwellwert drehe und anschließend 
Betriebsspannung anlege leuchtet die LED, wenn ich anschließend das Poti 
unter den Schwellwert drehe bleibt die LED an. Nehme ich nun die 
Betriebsspannung weg, lasse den Poti unter dem Schwellwert und lege 
anschließend die Spannung wieder an bleibt die LED aus. Aber auch hier 
keine Veränderung wenn ich das Poti wieder über den Schwellwert drehe, 
die LED bleibt aus. Erst nach erneutem entfernen und wieder anlegen der 
Betriebsspannung leuchtet die LED.
Deshalb gehe ich davon aus das die Einstellungen soweit passen aaaaber 
irgendwie übernimmt der nach der ersten Messung keinen neuen Wert in das 
ADCL Register. Ich find den Fehler einfach nicht :-(

Hier ist der Code. Geschrieben in Assembler im AVR Studio.

;----- ANFANG CODE! ------

.nolist
.include "C:\Program Files\Atmel\AVR 
Tools\AvrAssembler2\Appnotes\tn25def.inc"
.list

.def temp = r16
.def low_reg = r17
.def mid_reg = r18
.def high_reg = r19
.def counter = r20

ldi temp,0x03         ;> definiert PB0, PB1 und PB2 als Ausgang
out DDRB,temp

ldi temp,0x03         ;> Setzt Ausgänge PB0, PB1 und PB2 auf "High"
out PortB,temp

ldi temp,0b10000000
out ACSR,temp         ;> schaltet Comparator aus!

ldi temp,0x00
out ADCSRB,temp

start:                ;> ab hier beginnt Programm!

;===========================================
; ANALOGWERT LESEN
;===========================================

ldi temp,0b00000011   ;> wählt als REF-Spannung VCC aus und ADC3 (PB3)
out ADMUX,temp

nop                   ;> wartet, damit Änderungen übernommen werden
nop

ldi temp,0b11000000   ;> Schaltet ADC ein und startet eine Single 
Conversion
out ADCSRA,temp

wait_mid:

in temp,ADCSRA        ;> Liest ADC Status Register ein
andi temp,0b00010000  ;> Maskiert ADIF aus (wird gesetzt wenn die 
Messung abgeschlossen ist!)
cpi temp,0b00010000   ;> Wenn ADIF = 1 dann weiter ansonsten warte 
weiter
brne wait_mid

ldi temp,0b00010000
out ADCSRA,temp       ;> ADIF löschen indem mit einer "1" überschrieben 
wird
in mid_reg,ADCL       ;> Lese ADC Result Register ein (nur LOW, HIGH 
wird nicht benötigt!)

;===========================================
; LED SOLL BEI SCHWELLWERT LEUCHTEN
;===========================================

cpi mid_reg,0x1F      ;> willkürlich den Wert 1F als Schwelle genommen 
und vergleich mit Ergebnis des ADC
brlo off              ;> wenn mid_reg < 1F dann LED "AUS", ansonsten LED 
"AN"

sbi PortB,0           ;> Schaltet LED "AN"
nop                   ;> Wartet damit Änderungen am Port überbommen 
werden können

rjmp start            ;> Sprung zurück zu "start"

off:

cbi PortB,0           ;> Schaltet LED "AUS"
nop                   ;> Wartet damit Änderungen am Port überbommen 
werden können

rjmp start            ;> Sprung zurück zu "start"

;----- ENDE CODE! ------

Bitte schaut mal drüber. Ich verstehe das einfach nicht wo da der Fehler 
liegen soll...

von holger (Gast)


Lesenswert?

Vieleicht ist es ja das hier:

>This means that if ADCL has been read, and a conversion completes before ADCH is
>read, neither register is updated and the result from the conversion is lost. 
>When ADCH is read,
>ADC access to the ADCH and ADCL Registers is re-enabled.

von Chris (Gast)


Lesenswert?

Hallo,

tatsache, daran lags. Hab jetzt ADCH in temp eingelesen und mach danach 
einfach clr temp. Somit ist der ADC wieder freigegeben.
Das gibts nicht, ich hab mir den ADC-Teil im Datenblatt alleine gestern 
bestimmt 10 mal durchgelesen...

Vielen Dank für die Hilfe. Hätte alleine glaube ich noch ne Woche dran 
gesessen.

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.