Hallo,
1. Warum erst SAVR pushen und dann das SREG sichern in einer normalen Unterroutine ? Register SAVR dient der bloßen Sicherung was der Stack genauso machen könnte und man so wieder ein Register frei hätte falls benötigt.
Sonst nur notwendig wenn man mit Interrupts arbeitet und z.B. Rechenoperatonen durchführt dann muss/sollte das SREG in der ISR gesichert werden wie folgt:
Code:
in Register , SREG
PUSH Register
Prgrammcode
POP REGISTER
2.
Code:
WADC: ;Schleife bis Messung
sbic ADCSRA,ADSC ;abgeschlossen = ADSC=0
rjmp wadc
cbi ADCSRA,ADEN ;ADC ausschalten
out SREG,savr
pop savr
ret
Wenn du den ADC jedesmal nach der Wandlung deaktivierst:
1. braucht der ADC jedesmal bei der ersten Wandlung 25 Zyklen alle weiteren ca 13 Zyklen
2. das erste Ergebniss ist meist Müll
3. Die Wandlungsgeschwindigkeit sollte zwischen 50kHz - 200kHz betragen, bei dir ist es 7812,5Hz
4. Erst alles einstellen und dann ADEN auf 1 setzen ist ungünstig da Spannungsreferenz und Kannalum/einstellung nicht angenommen werden!!!!
Also richtig
Code:
ADC_Init:
1. ADEN setzen
2. Kanal auf GND setzen
3. Referenz einstellen
4. Testwandlung starten, auslesen, Ergebniss verwerfen
ret
WADC:
1. Kanal GND auf Kanal X setzen
2. Wandlung anstoßen
3. Wandlungszeit warten
4. Ergebnis auslesen
(5. Kanal X auf Kanal GND setzen aber kein muss)
ret
Wenn man dann in den Sleep wechseln will wird vor dem Sleep der ADC deaktiviert und nach dem Sleep neu initalisiert.
3. Wann wird denn ein Key gepresst ?
Code:
rjmp bri ;loop until any key pressed
Lass die Routine komplett durchlaufen und mach die Keyabfrage ausserhalb dieser Routine (Wahrscheinlich auch beabsichtigt)
Ebenso bau dir mal eine Zeitverzögerung ein sonst springen deine Werte auf dem LCD zu stark.
4. Vorsichtig mit irgenwelchen Sprungadressen dieser Art mit dem jetzigen Wissensstand!
Verbesserungsvorschlag:
Code:
Init:
1. STACK
2. Power
3. PORTS
4. ADC_INIT (ADEN = 1, REF = 5V, Chanel = 11111, Testwandlung
5. LCD_ON
Hauptprogramm:
0. 150ms warten
1. Pinabfrage(SBIS/SBIC ?) wenn Bedingung erfüllt Sprung zu 2. sonst 3.
2. dspvals
3. rjmp Hauptprogramm
dspvals:
dein Programm
ret
Ein weiterer Hinweis betrifft:
Code:
push savr
in savr,SREG
.
.
.
.
out SREG,savr
pop savr
Was keinerlei Nährwert hat und kann komplett in allen Routinen entfernt werden.
Lesezeichen