-
Ich habe nun ein Programm erstellt, welches den Wert des ADCs in den EEPROM abspeichert. Jedoch erhalte ich die ganze Zeit ungefähr die gleichen Werte, ohne dass ich irgend eine Taste drücke. Diese Werte sind im Bereich 0x0150 bis 0x0180. Wenn ich eine Taste drücke kriege ich auch nur einen Wert dazwischen geliefert. Wo ist der Fehler im Programm?
Wollte eigentlich nur den jeweiligen Wert in den EEPROM speichern, wenn eine Taste gedrückt wird.
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,(0<<REFS0)|(0<<REFS1)|(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
Als Referenzspannung habe ich AREF mit Jumper angegeben. (Also 2,56 V.)
Wäre auch gut, wenn jemand das Programm mal in seinem RN-Control testen könnte und mir sagen kann, ob dort die gleichen Werte gespeichert werden.
Danke!
-
Hallo,
wenn du die RN-Control hast, solltes Du auch die CD dazu bekommen haben, da ist auch ein C-Beispiel dabei, Dateiname (tastenled.bas ja, stimt schon so !) das lässt sich leicht auf ASM anwenden.
Der Jumper URef sollte gesteckt sein, und als Referenz nur so:
ADMUX = (1<<REFS0)|...
Der Sprung bei den Abfragen zu wait: haut irgendwie nicht hin, denn da wird nix mehr neu gemessen, nur überprüft ob gemessen wurde, also bleibt der Wert immer dergleiche.
-
So, habe die Bedingungen verbessert. Nun sollte so zwischen AD-Wert 0x6E und 0x82 die LED1 leuchten. Jedoch leuchtet diese, manchmal ohne Taste 5 gedrückt zu haben, oder sogar wenn ich Taste 4 oder Taste 3 drücke.
Die Werte des ADCs sind ohne irgendeine Taste gedrückt zu haben, so um 0x0140 bis 0x0180. Das sind umgerechnet so 0,9V. Jedoch sollte doch 0V anliegen, wenn keine Taste gedrückt ist?
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<<REFS0)|(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.
u1:
ldi R21,0x00
sub R21,highad
brmi u2
ldi R21,0x14 ;Es wird 20 vom gesamten ADC-Wert abgezogen.
sub R21,lowad
brmi write1
u2:
ldi R21,0x02 ;Es wird erst ab Wert 768 nicht mehr in EEPROM geschrieben.
sub R21,highad
brpl write1
rjmp wait ;Falls Werte nicht zwischen 20 und 768 -->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
;Abfrage Bereich 110 bis 130
ldi R21,0x00
sub R21,highad
brmi ende
ldi R21,0x5A
sub R21,lowad
brpl ende
ldi R21,0x7D
sub R21,lowad
brmi ende
;LED1 leuchtet bei Taste 5
led1:
ldi R22,0x01
out DDRC,R22
ldi R22,0b11111110
out PORTC,R22
ende:
;Ende
Ich verstehe nicht, wo mein Fehler liegt und wo ich ihn suchen soll.
-
In dem Programm wird aber nur einmal am Anfag der AD-Wandler angeworfen, also nur einmal überhaupt gemessen, danach wird immer mit dem selben Wert gearbeitet (oder irgedwas zufälliges), weil das Label wait: nach dem Start des AD-Wandlers steht !
-
Habe das nun geändert und (wait:) übder das (ADCSRA,ADSC) geschrieben. Jedoch macht das Programm noch immer die gleichen Probleme.
Das mit dem (wait:) erklärt jedoch nicht wieso ich immer irgendeine Spannung am ADC liegen habe, wenn keine Taste gedrückt wurde.
Edit: Habe das Problem gefunden.
Es lag nicht direkt am Programm. Habe die ganze Zeit beim Versuchen den ISP-Dongle vom Computer dran gehabt. D.h. es ist irgendwie eine Spannungsschwankung entstanden. Diesen gleichen Effekt, habe ich auch wenn ich mit dem Multimeter am PA7 messe und beim Abnehmen des Messfühlers geht die LED auch an.
Hätte nicht gedacht, dass der ADC so empfindlich auf Spannungsschwankungen und Kriechströme reagiert.
Das einzige was mich noch stört, ist dass es ab und zu vorkommt, dass die LED angeht ohne irgendwas zu machen. Aber das liegt vielleicht daran, dass die Grenze zu nahe bei 0 liegt.
Edit1: Die LED geht auch manchmal an, wenn ich das Board in der Hand halte.
-
Das Problem ist auch mit der Stromversorgung über Netzteil noch immer da. Scheint doch nicht die Lösung zu sein.
Weiß denn keiner irgendwie weiter. Komm einfach nicht dahinter.
Wenn ich ein Programm in C schreibe, dann geht das Schalten der LEDs über die Auswertung der Tasten mit dem ADC ohne Problem. Das gleiche mit Bascom.
Dann kann es doch wohl nur am Programm selbst liegen.