Code:
; *******************************************************
; * Akku prüfen mit A/D-Wandler *
; *******************************************************
AkkuCheck:
dec YL ; Low-Byte des Durchlaufzählers -1
brne AkkuCheckEnde ; Nicht 0, dann Sprung zum Ende.
dec YH ; Sonst High-Byte des Durchlaufzählers -1
brne AkkuCheckEnde ; Nicht 0, dann Sprung zum Ende
ldi YL, low (ADPause) ; Sonst Zählerstartwert low und high
ldi YH, high (ADPause) ; mit Anfangswert wieder laden.
AkkuCheck1:
sbrs Status, ADFirst ; Ist 1.Durchlauf gesetzt?
rjmp AkkuCheck2 ; Nein, dann weiter
cbr Status, 1<<ADFirst ; Sonst Kennung 1. Durchlauf löschen.
AkkuCheck2:
in TMP1, ADCSR ; AD-Kontrollregister einlesen
sbr TMP1, 1<<ADEN | 1<<ADSC | 1<<ADPS2 |1<<ADPS1 | 1<<ADPS0 ; und AD-Wandler einschalten.
out ADCSR, TMP1 ; Warten damit sich die Referenzspannung
rcall Wait12ms ; stabilisieren kann.
ADFertig:
sbic ADCSR, ADSC ; Solange warten bis die AD-Wandlung
rjmp ADFertig ; abgeschlossen ist.
in ZL, ADCL ; und AD-Ergebnis auslesen (zuerst Low-Byte).
in ZH, ADCH ; Es wird nur das High-Byte weiterverwendet.
cbi ADCSR, ADEN ; AD-Wandler abschalten.
; *****************************************
; * Akku leer Erkennung *
; *****************************************
cpi ZH, AkkuLeer ; Meßwert > Vorgabewert?
brcc Hysterese1 ; Ja, dann Offset.
sbrc Status, AkkuLow ; Wurde Akku leer bereits erkannt?
rjmp AkkuCheckEnde ; Dann Sprung zum AkkuCheck Ende
in TMP1, PORTB ; PortB einlesen und grüne Led durch
sbr TMP1, 1<<PORTB3 ; Ausgabe einer 1 an PB3 ausschalten.
cbr TMP1, 1<<PORTB4 ; Rote Led durch Ausgabe einer 0 an PB4.
out PORTB, TMP1 ; einschalten und ausgeben.
cbr Status, 1<<AkkuReady | 1<<AkkuFull ; Andere Kennungen in Status löschen
sbr Status, 1<<AkkuLow ; Kennung Akku leer in Status setzen
in TMP1, TCCR1 ; PWM-Timer Steuerregister laden und
cbr TMP1, 1<<COM1A1 | 1<<COM1A0 | 1<<CS12 | 1<<CS11 | 1<<CS10 ; diesen ausschalten.
out TCCR1, TMP1 ; Alles Speichern.
in TMP1, PORTB ; Falls Scheinwerfer-LED Ausgang geschaltet
cbr TMP1, 1<<PORTB1 ; ist, diesen auf jeden Fall ausschalten.
out PORTB, TMP1 ; Lampen-LED wird sonst zerstört!
rjmp AkkuCheckEnde ; und Sprung zum Abfrageende.
; *****************************************
; * Hysterese 1.Zustand zu 2.Zustand *
; *****************************************
Hysterese1:
cpi ZH, AkkuLeer + OffSet ; Zu Vergleichswert einen Offset addieren
brcc AkkuR ; In diesem Bereich wird keine Veränderung
rjmp AkkuCheckEnde ; des Akkustatus vorgenommen.
; *****************************************
; * Akku bereit Erkennung *
; *****************************************
AkkuR:
cpi ZH, AkkuBereit ; Meßwert > Vorgabewert?
brcc Hysterese2 ; Ja, dann zur AkkuOK Abfrage
sbrc Status, AkkuReady ; Wurde Akku bereit bereits erkannt?
rjmp AkkuCheckEnde ; Dann Sprung zum AkkuCheck Ende
in TMP1, PORTB ; PortB einlesen und beide Led's durch
sbr TMP1, 1<<PORTB4 | 1<<PORTB3 ; Ausgabe einer 1 an PB3 + PB4
out PORTB, TMP1 ; ausschalten und ausgeben.
cbr Status, 1<<AkkuLow | 1<<AkkuFull ; Andere Kennungen in Status löschen
sbr Status, 1<<AkkuReady ; Kennung Akku bereit in Status setzen
rjmp AkkuCheckEnde ; und Sprung zum Abfrageende.
; *****************************************
; * Hysterese 2.Zustand zu 3.Zustand *
; *****************************************
Hysterese2:
cpi ZH, AkkuBereit + Offset ; Zu Vergleichswert einen Offset addieren
brcc AkkuOK ; In diesem Bereich wird keine Veränderung
rjmp AkkuCheckEnde ; des Akkustatus vorgenommen.
; *****************************************
; * Akku voll Erkennung *
; *****************************************
AkkuOK:
cpi ZH, AkkuVoll ; Meßwert > Vorgabewert?
brlo AkkuCheckEnde ; Ja, dann zum Abfrageende
sbrc Status, AkkuFull ; Wurde Akku voll bereits erkannt?
rjmp AkkuCheckEnde ; Dann Sprung zum AkkuCheck Ende
in TMP1, PORTB ; PortB einlesen und rote Led durch
sbr TMP1, 1<<PORTB4 ; Ausgabe einer 1 an PB4 ausschalten.
cbr TMP1, 1<<PORTB3 ; Grüne Led durch Ausgabe einer 1 an
out PORTB, TMP1 ; PB3 einschalten und ausgeben.
cbr Status, 1<<AkkuReady | 1<<AkkuLow ; Andere Kennungen in Status löschen
sbr Status, 1<<AkkuFull ; Kennung Akku voll in Status setzen
AkkuCheckEnde:
ret ; Rücksprung
Lesezeichen