Hallo,
jetzt ohne deinen Code auswendig glernt zu haben, aber ein ADC wandelt immer egal was anliegt, irgend ein Wert kommt immer raus.
Bei 0Volt wird der Wert auch gegen 0 gehen.
Druckbare Version
Hallo,
jetzt ohne deinen Code auswendig glernt zu haben, aber ein ADC wandelt immer egal was anliegt, irgend ein Wert kommt immer raus.
Bei 0Volt wird der Wert auch gegen 0 gehen.
Achso,
klingt logisch. Das heißt, wenn ich keine Spannung anlege, dann wird trotzdem die Spannung um 0V gewandelt. Aber dann macht das ja auch keinen Sinn, dass ich die Werte jeweils nur in dieselben EEPROM-Speicherzellen abspeichere. D.h. auch wenn ich eine Taste gedrückt hatte und ein Wert abgespeichert wurde, wird dieser jedoch sofort wieder durch einen Wert von 0V überschrieben. Oder?
Genau, Du müsstest evtl. den Wert abfragen ob ein Mindestwert erreicht wurde, oder ob er innerhalb eines Bereiches liegt, falls nicht, wird nix gemacht.
Zitat:
Zitat von Johnny_112
Verstehe nicht ganz.
Sooft du den Wanlder startest sooft bekommst du einen Wert.
Habe das Prorgamm nun abgeändert. Jedoch erhalte ich trotzdem unlogische Werte.
Ich erhalte Werte, welche nichts mit dem Drücken der Tasten zu tun haben. Z.B. erhalte ich 0x014E, wenn ich Taste 5 drücke, welche jedoch mit dem Multimeter einen ungefähren Wert von 0,32 V liefert. Logischerweise müsste dort doch etwa 0x0080 herauskommen. Auch bei anderen Tasten kommen ganz andere Werte heraus.Code:.Include "m32def.inc"
.DEF tmp = R16
.DEF lowad = R17
.DEF highad = R18
.EQU wertadlow = 0x60
.EQU wertadhigh = 0x61
ldi tmp, (1<<ADEN)|(1<<ADPS1)|(1<<ADPS2)
out ADCSRA, tmp
ldi tmp,(1<<MUX2)|(1<<MUX1)|(1<<MUX0)
out ADMUX, tmp
sbi ADCSRA, ADSC ;Das Bit ADSC wird gesetzt und der ADC startet.
wait:
sbis ADCSRA,ADIF ;Das ADIF wird abgefragt, ob eine Spannung anliegt.
rjmp wait ;Warteschleife bis Spannung anliegt.
in lowad, ADCL ;Das Low-Byte des ADCs wird ausgelesen.
in highad, ADCH ;Das High-Byte wird ausgelesen.
;Überprüfung ob Werte im sinnvollen Bereich sind.
ldi R21,0x32 ;Es wird erst ab Wert 50 in EEPROM geschrieben.
sub R21,lowad
brpl wait
ldi R21,0x02 ;Es wird erst ab Wert 768 nicht mehr in EEPROM geschrieben.
sub R21,highad
brmi wait
write1:
sbic EECR,EEWE ;Ist der Schreibzyklus beendet, PC = PC +2
rjmp write1
ldi R19, 0xF0 ;Festlegen der Zieladresse.
ldi R20, 0x00
out EEARH, R20 ;Die Zieladresse des EEPROM wird übertragen.
out EEARL, R19
;Als Nächstes wird das Low-Byte des ADCs abgespeichert.
out EEDR, highad ;Byte in Zwischenspeicher laden.
;Folgende 2 Befehle sorgen dafür, dass der Wert im Zwischenspeicher nun endgültig in der Zieladresse des EEPROMs abgespeichert wird.
sbi EECR,EEMWE
sbi EECR,EEWE
write2:
sbic EECR,EEWE ;Ist der Schreibzyklus beendet, PC = PC +2
rjmp write2
;Nun wird die nächste Zieladresse festgelegt und das High-Byte des ADCs abgespeichert.
inc R19
out EEARL, R19 ;Es muss nur das Low-Byte geändert werden.
out EEDR, lowad
sbi EECR,EEMWE
sbi EECR,EEWE
;Ende
Am besten man überträgt das Programm einmal in den 1.4 RN-Control und schaut sich das selbst an.
Wie soll ich es denn dann bewerkstelligen, die verschiedenen Werte der Tasten richtig herauszulesen.
Ja wie gesagt,ich hab keine RN-Control aber ich hab mal eben nachgesehen.
Wenn ich richtig gesehen habe Von 5V runter 1x10K und 5x1K.
Zwischen den Widerständen dann 5 Taster als Schließer die alle auf den ADC7 gehen.
Ich sehe aber nirgens einen Pullup oder Pulldown für den offenen AD-Eingang.
Dh. der Eingang kann Antenne spielen was er vermutlich auch tut.
Häng mal an Port A8 nen 10K nach Masse dann sollte der Eingang ohne gedrückte Taste den Wert 0 (plus einige Digits) liefern.
Die zu erwartenden ADC-Werte kannste dir ja schnell neu berechnen.
Habe es probiert mit dem Widerstand. Bringt jedoch keine Änderung. Ich denke, dass es nicht daran liegt, da es mit dem Demoprogramm in Bascom ja ohne Problem funktioniert.
Stimmt mein Programm denn überhaupt von der Logik?
Zuerst alle Einstellungen am ADC vornehmen.
Dann den ADC starten.
Dann Warten bis ADIF = 1
Dann übertragen der Werte in EEPROM, wenn diese zwischen 50 und 768 sind.
Oder habe ich am ADC was falsches eingestellt?
Die Werte, welche ich erhalte liegen im Schnitt so zwischen 0x0155 und 0x0170 und ich komme so auf eine umgerechnete Spannung von ungefähr 0,9 V.
Hmm,lass mal schauen.
Angeschaltet ist
Prescaler auf 64
Mux auf 7
Und Go
Warten auf Adif (Fertig)
Auslesen des Ergebnisses.
Ja,alles soweit ok aber die Referenz solltest du noch definieren.
Also Bit 6 und 7 (Refs0/1) vom Admux-Register
REFS0 und REFS1 muss ich doch nicht setzen, wenn ich die Referenzspannung an Pin UREF einstelle (Entweder Jumper drauf, dann 2,5V oder nicht, dann 5 V), oder?
Nö,du mußt ihm schon sagen welche Quelle er nutzen soll.
Wenn du ihn mit einer Spannung an Aref beaufshclagst und er auf Intern steht dann riskierst du die Interne Quelle zu killen da die bei dieser Einstellung auf den Pin gelegt wird (Der Kondensator Entstört dabei einwenig)
Welche er per Default nutzt weiß ich nichtmal weil ich se immer mit angebe.
Kannst ja mal aus Jux das Register auslesen und Anzeigen.