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