Gast
#792313
Hallo erstmal,
ich fange ambesten zuerst mit den Daten an.
MCU: atmega 168 + STK500 mit 16MHZ Crystal (habe den Teiler 8 für die
Frequenz ausgeschaltet)
Ziel:
Ich möcht den AD-Wandler benutzen mit externer Rerferenzspannung von
10V.
das habe ich schon geschaft:
Wandlungen über den interen Spannung (Vcc) mit dem Eingang VBG=1.1 hat
schon geklappt.
Problem:
1) ich habe eine Spannung von 23V, die habe ich mit einem
Spannungsteiler (R1= 1,3K OHM und R2= 1K Ohm) auf ca. 10 V gebracht
sobalt ich es den Pin "REF" (STK500) anlege sinkt die Spannung am R2,
warscheinlich weil der Widerstand vom Pin viel kleiner ist
als R2= 1K Ohm (parallel Schaltung). Zurstabilität habe ich einen
Kondensator mit 10nF angelegt(hatte keinen Anderen da).
Frage:
Kann ich dies mit einem Op-Verstärker (positive Verstärkung)
realisieren, ohne das die Spannung einbricht? -> (OP-Verstärker kleiner
Ausgangswiderstand)Oder liegt es doch an etwas Anderm?
2) ich habe es geschaft an Pin "Ref" 7V anzulegen und habe die
Referenzspannung vo STK500 auf 0 gestzt und die Aref brücke geschlossen,
aber alle Messungen waren Falsch. Als Fehler habe ich 3LSB
angenommen,aber
die Werte waren nicht mal inder nähe.
Frage:
Woran kann das Liegen? Kann ich überhaupt Referenzspannungen über 6V
benutzen?
3) Trotz der Schleife (sehe unten Code) wandelt anscheinend der
AD-Wanlder nur einmal.
Frage:
Woran kann das Leigen, muss ich den ADIF löschen obwohl ich kein
Interrupt benutze?
Ich bin dankebar für jede Hilfe.
PS. der Code und Doku liegt im Anhang als zip :
.include "m168def.inc"
.def temp_1 = r16
.def temp_2 = r17
.def data_H = r18
.def data_L = r19
.cseg
MAIN:
;Stackpointer initialisieren
ldi temp_1,low(ramend)
out spl,temp_1
ldi temp_1,high(ramend)
out sph,temp_1
;PortD liegt an LED's an
ldi temp_1,0xFF
out DDRD,temp_1
;Init AD-Wandler
;Reverenz Spannung und Mux-Eingang einstellen
ldi temp_1,(0<<REFS1)|(0<<REFS0)|0x0E
ldi XH,high(ADMUX)
ldi XL,low(ADMUX)
st X,temp_1
;Alle Digitalbuffer ausschalten für PortC
ldi temp_1,0xff
ldi XH,high(DIDR0)
ldi XL,low(DIDR0)
st X,temp_1
;
ldi temp_1,0x00
ldi XH,high(ADCSRB)
ldi XL,low(ADCSRB)
st X,temp_1
loop:
;Start ADC, Single
ldi temp_1,(1<<ADEN)|(1<<ADSC)|0x03
ldi XH,high(ADCSRA)
ldi XL,low(ADCSRA)
st X,temp_1
;Warten bis messung vertig
ldi XH,high(ADCSRA)
ldi XL,low(ADCSRA)
w_L_1:
ld temp_1,X
sbrc temp_1,ADSC
rjmp W_L_1
;Daten lessen
ldi XH,high(ADCH)
ldi XL,low(ADCH)
ld data_H,X
ld data_L,-X
;Invertieren und an Ergebnisausgeben, LED leuchtet bei 0
com data_L
out PORTD,data_L
rjmp loop