Code:
;*****************************************************************************
;*
;* DATEINAME: entlader.asm
;* TITEL :
;* DATUM : 16.6.08
;* AUTOR : STK
;* VERSION : 1.0
;*
;*
;*****************************************************************************
.include "m8515def.inc"
;--KONSTANTENDEKLARATION---------------------------------------------
; status register bits
.equ CarryFlag = 0
.equ ZeroFlag = 1
.equ NegativeFlag = 2
.equ TwosFlag = 3
.equ SignFlag = 4
.equ HalfCarryFlag = 5
.equ TransferFlag = 6
.equ GlobalFlag = 7
.equ Frequenz = 4000000
.equ Teiler = 4000
;--VARIABLENDEKLARATION----------------------------------------
.def tmp = R16 ;Temp. Variable
.def tmp2 = R17
.def sek_zaehler = R18
.def spg = R19
.def entprell = R20
.def sreg_save = r21
.CSEG
.org 0x0000
rjmp MAIN ;Reset
rjmp UnusedInt_ISR ;Ext. Int0
rjmp UnusedInt_ISR ;Ext. Int1
rjmp UnusedInt_ISR ;Timer1 Capture Event
rjmp timer ;Timer1 Compare Match A
rjmp UnusedInt_ISR ;Timer1 Compare Match B
rjmp UnusedInt_ISR ;Timer1 Overflow
rjmp UnusedInt_ISR ;Timer0 Overflow
rjmp UnusedInt_ISR ;Serial Transfer Complete
rjmp UnusedInt_ISR ;USART Rx Complete
rjmp UnusedInt_ISR ;USART Data Reg. Empty
rjmp UnusedInt_ISR ;USART Tx Complete
rjmp UnusedInt_ISR ;Analog Comperator
rjmp UnusedInt_ISR ;Ext. Int Request 2
rjmp pause ;Timer0 Compare Match
rjmp UnusedInt_ISR ;EEPRom Ready
rjmp UnusedInt_ISR ;Store Program memory ready
UnusedInt_ISR: reti
;--Hauptprogramm------------------------------------------------
MAIN:
;Stackpointer initialisieren
ldi tmp,low (RAMEND) ; RAMEND ist eine im include file vorgegebene Konstante,
out SPL,tmp
ldi tmp, high(RAMEND)
out SPH,tmp
rjmp init
Main_loop:
;Hauptprogramm
;Akku angesteckt?
in tmp2, pina
ldi tmp, 0b01001101 ;Akku erkennung ab 3V
;Akku ist angeschloßen
cp tmp2,tmp
brsh akku_an
;Akku ist nicht angeschloßen
cp tmp2, tmp
brlo akku_ab
rjmp Main_loop;
;--Unterprogramme-----------------------------------------------------
akku_ab:
;Ausgabe auf Display
;"Akku"
;"anhängen"
rjmp main_loop
akku_an:
;Ausgabe auf Display
;SPG:x,xx
;Entl:x,x
;Warte auf Start-Taste
in tmp2, pind ;Liest Eingangsport ab
andi tmp2, 0b00000001 ;Nur das Start-tasten-Bit einlesen
ldi tmp, 0b00000001
cp tmp2,tmp
breq start ;Ist Bit gesetzt, Spring in die Start- Fkt.
;Warte auf Entladespg senken:
;Warte auf Entladespg erhöhen
rjmp main_loop
start:
;Akku wurde erkannt und die Starttaste gedrückt
;Start-Taste entprellen
clr entprell
wh1:
ldi tmp, 0b00000010
cp entprell, tmp
brlo wh1
clr sek_zaehler
;Entladevorgang starten
rjmp entladen_ein
entladen_ein:
;Kontrolle ob der Akku noch angeschloßen ist
;Wenn nicht ins Startmenü zurück springen
in tmp, pinc
ori tmp, 0b00000001 ;Relais aktivieren
out portc, tmp
;in tmp2, pina
;ldi tmp, 0b01001101 ;Akku erkennung ab 3V
;cp tmp2, tmp
;brlo entladen_aus
;Akkuspg. überwachen
;Wenn zu niedrig Entladevorgang abbrechen
in tmp2, pina
ldi tmp, 0b10000000
cp tmp2, tmp
brlo entladen_aus
;Warte auf Stop-Taste
in tmp2, pind ;Liest Eingangsport ab
andi tmp2, 0b00000001 ;Nur das Start-tasten-Bit einlesen
ldi tmp, 0b00000001
cp tmp2,tmp
breq entladen_stop ;Ist Bit gesetzt, Spring in die Start- Fkt.
;Ausgabe auf Display
;A: x,xx
;00:00
rjmp entladen_ein
entladen_aus:
;Entladevorgang stoppen weil die Akkuspannung unter
;einem bestimmter Wert gefallen ist
in tmp, pinc
andi tmp, 0b11111110
out portc, tmp
clr sek_zaehler
rcall automatik
rjmp akku_an
automatik:
;Nach 30 Sekunden soll der Entladevorgang erneut
;gestartet werden
ldi tmp, 0b00011110
cp sek_zaehler,tmp
brsh start
;Schreibe auf Display
;Beendet
;WH in xx
;Warte auf Stop-Taste
in tmp2, pind ;Liest Eingangsport ab
andi tmp2, 0b00000001 ;Nur das Start-tasten-Bit einlesen
ldi tmp, 0b00000001
cp tmp2,tmp
breq akku_an
in tmp2, pina
ldi tmp, 0b01001101 ;Akku erkennung ab 3V
;Akku ist nicht angeschloßen
cp tmp2, tmp
brlo main_loop
rjmp automatik
entladen_stop:
clr entprell
wh2:
ldi tmp, 0b00000010
cp entprell, tmp
brlo wh2
;Entladevorgang abbrechen
in tmp, pinc
ldi tmp2, 0b00000001
sub tmp, tmp2
out portc, tmp
rjmp main_loop
init:
ldi spg, 0b01010000 ;vorderen 4 Bit vor Komma, hinteren 4 Bit nach Komma
clr sek_zaehler
;Ausgänge setzen
ser tmp
out ddrc, tmp
;Eingänge setzen
clr tmp
out ddra, tmp
out ddrd, tmp
;Timer1 setzen
clr tmp
out tccr1a, tmp
ldi tmp, 0b00001001 ;nur zu Testzwecken (normal 0b00001101)
out tccr1b, tmp
ldi tmp, 0b01100001 ;Timer Einstellungen
out tIMSK, tmp
ldi tmp, HIGH(Frequenz / Teiler)
out ocr1ah, tmp
ldi tmp, LOW(Frequenz / Teiler)
out ocr1al, tmp
;Timer0 setzen
ldi tmp, 0b00000001 ;nur zu Testzwecken (normal 0b00000101)
out tccr0, tmp
ldi tmp, 0b01001110
out ocr0, tmp
sei
rjmp main_loop
;*********Interrupt***********
;Zähler für die Sekundenzählung
timer:
in sreg_save,SREG
inc sek_zaehler
out SREG,sreg_save
reti
;Zähler für die Entprellung
pause:
in sreg_save,SREG
inc entprell
out SREG,sreg_save
reti
Lesezeichen