Hallo,
Ich probiere gerade den ADC ans laufen zu kriegen, klappt leider nicht
so wie gedacht ;)
Ich hoffe ihr konnt mir bei meinem kleinen Problem helfen.
1
.include "tn13def.inc"
2
ldi r16, 0b11101111
3
out DDRB, r16
4
ldi r16, 0b00001000
5
out PORTB, r16
6
ldi r16, 0b01100010
7
out ADMUX, r16
8
ldi r16, 0b11000101
9
out ADCSRA, r16
10
11
12
ldi r16, 0b00000000
13
schleife: cp r5, r16
14
breq schleife
15
16
17
18
ldi r16, 0b00000000
19
out PORTB, r16
20
21
22
ende: rjmp ende
Das kleine Programm soll eigentlich nur überprüfen ob der ADC überhaupt
einen Wert ungleich Null ins Register 5 ( ADCH ) ablegt, und wenn ja
eine LED anschalten. Als Eingang für den ADC hab ich einen
Spannungsteiler aus einem Widerstand 100kohm und einem LDR.
Na ja, es klappt halt nicht, der Inhalt von r5 bleibt konstand 0. Wo ist
der Fehler?
Tiny schrieb:> Das kleine Programm soll eigentlich nur überprüfen ob der ADC überhaupt> einen Wert ungleich Null ins Register 5 ( ADCH ) ablegt,> ldi r16, 0b00000000> schleife: cp r5, r16> breq schleife
also noch unverständlicher kann man das nun wirklich nicht schreiben.
Und nein, das vergleicht nicht, ob das Register ADCH jemals ungleich 0
wird. r5 ist nicht ADCH
Lies doch bitte im AVR-Tutorial über den ADC nach. Im Tiny 13
funktioniert zwar die Einstellung der Referenzspannung im Detail ein
wenig anders, aber das Prinzip ist trotzdem identisch.
Vielen Dank erstmal für eure Hilfe. Ich hab noch weiter gemacht, aber es
klappt leider immer noch nicht.
1
include "tn13def.inc"
2
ldi r16, 0b11101111
3
out DDRB, r16
4
ldi r16, (1<<REFS0) | (1<<ADLAR) | (1<<MUX1)
5
out ADMUX, r16
6
ldi r16, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0)
7
out ADCSRA, r16
8
sbi ADCSRA, ADSC
9
schleife: sbic ADCSRA, ADSC
10
brne schleife
11
12
ldi r16, ADCH
13
cpi r16, 100 ; Schwellwert
14
brlo aus
15
16
ldi r16, 0b00001000
17
out PORTB, r16
18
rjmp ende
19
20
aus: ldi r16, 0b00000000
21
out PORTB, r16
22
ende: rjmp ende
Was Cih machen möchte ist folgendes. Die LED soll je nach Lichteinfaall
an oder aus geschaltet werden. Für den Schwellwert hab schon viele Werte
ausprobiet und habe entdeckt, dass ADCH immer 5 ist. Egal ob ich den
Finger auf den LDR halte oder nicht.
Ich sehe einfach nicht, was ich falsch machen. Vielleicht fällt einem
von euch der Fehler auf.
Vielen Dank im Vorraus.
Hi
>Für den Schwellwert hab schon viele Werte>ausprobiet und habe entdeckt, dass ADCH immer 5 ist.
Wie?
Und du weißt auch, das dein Programm nach maximal ein paar ms, eher
wesentlich weniger, nichts mehr macht?
MfG Spess
Schwellwert im Quellcode geändert, neu kompiliert, auf den mc gezogen
und wieder laufen lassen. Ist der Wert kleiner 5 Leuchtet die LED, bei
größeren Werten nicht.
Das das Programm erstmal nicht viel macht ist mir schon klar, entweder
leuchtet die LED am Ende oder nicht. Wenn das mit dem ADC so klappt wie
ich mir das denke kommt da natürlich noch eine Schlaife rum.
Vorwiderstand ist dran, hab ich nur vergessen einuzeichnen. Zu den
anderen Widerstandswerten: (ich glaube das war mit LD gemeint?)
R1: 10kohm
R2: 100kohm
LDR: 1kohm unter der Lampe 200kohm mit Finger drauf
Ach das ist ein 2-er und kein L
Tschuldigung, konnte ich nicht identifizieren.
d.h. mit Finger drauf hast du einen Spannungsteiler 100k-200k, das sind
dann ca. 3.6V am ADC Pin (mit Voltmeter nachmessen).
Und wenn die Lampe draufscheint sind das 100k-1k, also praktisch 0V.
Das sollte sich im ADC Wert bemerkbar machen. Schwellwert so ungefähr
100 müsste gehen. Wobei man der ersten Messung des ADC nach dem
Einschalten (angeblich) nicht so ganz trauen kann (daher auch die
Schleife)
Sp folgendes hab ich jetzt gemacht:
-Schleife ist drum
-Vcc ist als Referenz eingestellt
- Ich hab zwischen dem ADC Pin und GND gemessen. 0.54V im Hellen, 2.6
mit Finger drauf.
- hab nen anderen attiny13 genommen, ergebniss bleibt gleich
Hab wieder diverse Schwellwerte ausgetestet. ADCH bleibt bei 5
OK. Ändere den brne noch auf einen rjmp.
Jetzt seh ich auch nichts mehr im Programm, was mich stutzig machen
würde. Die Konfig-Register hab ich mit dem Datenblatt gecheckt. Sind m.M
nach vernünftig.
Doch
Da seh ich noch was
ldi r16, ADCH
das geht so nicht.
Das erklärt auch, wo deine 5 herkommen :-)
ldi (LoaD Immediate) wird benutzt um einen konstanten Zahlenwert in ein
Register zu laden. In deinem Fall, ist das dann die Adresse vom Register
ADCH. Das willst du aber nicht. Du willst den Inhalt von ADCH! Und weil
ADCH zu den I/O Registern gehört:
in r16, ADCH