Code:
.INCLUDE "m32def.inc"
; Registerdefinition
; Zählregister
.DEF SekX4 = R20 ; Register in dem die 250ms * 240 = 60s gespeichert werden (1s/250ms = 4)
.DEF Min = R21 ; Register in dem die Minuten gespeichert werden
.DEF Stunden = R22 ; Register in dem die Stunden gespeichert werden
.DEF temp = R25
; Konstantenregister
.DEF CSekX4 = R1 ; Register in dem die Konstante 250ms * 240 = 60sgespeichert ist (240)
.DEF CMin = R2 ; Register in dem die Konstante Minuten gespeichert ist (60)
.DEF CStunden = R3 ; Register in dem die Konstante Stunden gespeichert ist (24)
.DEF CTimer = R4 ; Register in dem die Konstante zum Vorladen des Timers gespeichert ist (10)
.DEF Config = R5 ; Reagister zeigt ob die Config schon mal asugeführt wurde
.DEF CompareMIN = R23 ; Vergleichsregister für die Sekunden
.DEF CompareSEC = R24 ; Vergleichsregister für die Minuten
; ... Erweiterung möglich
; Schreibregister für alle Einstellungen
.DEF Port = R16 ; Register für Port zugriffe
.DEF Inter = R17 ; Register für Interrupt zugriffe
.DEF Timer = R18 ; Register für Zeitintervall
.DEF SleepM = R19 ; Register für SleepModiekonfiguration
;Konstenatendefinition
.EQU CFaktor = 4 ; Faktor für die Multiplikation der Sekunden (1s/250ms = 4)
.EQU Initialisiert = 0 ; Bit das Zeigt ob Initialisiert wurde
.EQU LED = 3 ; LED Portbit 3 für 5V Output
.EQU Relai = 2 ; Realai Portbit 2 für 5V Output
.EQU INLang = 0 ; Eingang für 15min Laufzeit
.EQU INKurz = 1 ; Eingang für 1 min Laufzeit
; Lange Laufzeit
.EQU Langmin = 1 ; Laufzeit für die min. (15min)
.EQU Langsec = 0*CFaktor; Laufzeit für die sec. (0sec)
; ... Erweiterung möglich
; Kurze Laufzeit
.EQU Kurzmin = 0 ; Laufzeit für die min. (1min)
.EQU Kurzsec = 10*CFaktor; Laufzeit für die sec. (0sec)
; ... Erweiterung möglich
.ORG 0x000
rjmp main ; Reset Handler
.ORG OVF2addr
rjmp ovf2_handler ; Overflow Timer/Counter 2 Handler
;**************************************Interrupt-Handel-BEGINN**********************************************
ovf2_handler: ; Interrupt Handler für TimerOverflow
;#####################################################################################################
; Zeitzähler bei Jedem Interrupt
inc SekX4 ; Sekunde wird erhöt, da alle 250ms erhöt wird wird bis 240 gezählt
cp SekX4,CSekX4 ; Prüfen ob 60Sekunden um sind (1s/250ms = 4*60 = 240), wenn ja zur Erhöhung der
brne fertig
min:
clr SekX4 ; SekundenZähler wieder auf Null setzen wenn eine Minute um ist
inc Min ; Minuten wird erhöht wenn 60sec vorbei sind
cp Min, CMin ; Prüfen ob 60Minuten um sind, wenn ja zur Erhöhung der
brne fertig
clr Min ; MinutenZähler wieder auf Null setzen wenn eine Stunde um ist
sbis PINA, Relai
sbi PORTA, Relai ; LED anschalten
sbic PINA, Relai
cbi PORTA, Relai ; Relai anschalten
; ... Erweiterung möglich
fertig:
; ... Erweiterung möglich
cpse Min, CompareMin ; Minuten übereinstimmen
rjmp zeit_zaehler_ende
cpse SekX4, Comparesec ; Sekunden übereinstimmen
rjmp zeit_zaehler_ende
; Prozedur zum Ausschalten des AVR etc.
ende:
clr TIMER
ldi TIMER, (0<<TOIE2) ; Interrupt ausschalten
out TIMSK, TIMER ; Timer/Counter 2 Overflow Onterrupt aktivated
ldi SleepM,(1<<SE)|(1<<SM1) ; erste 1 für SE, Power-Down Sleep Modus eingeschalten (010)
out MCUCR, SleepM ; Sleep eingstellen
Sleep ; Sleep Modus Power-Down (010)
zeit_zaehler_ende: ; Sprungziehl für das Ende des ZeitzählerUnterprogramm
ldi temp, 12
out TCNT2, temp ; Timer/Counter 2 mit 12 vorladen (255-243 = 12 <aufgerundet wegen befehlslaufzeiten)
;#####################################################################################################
reti
;****************************************************Macros***************************************************
.MACRO CompareSetzen ; Start macro definition
ldi CompareMIN, @1 ; Vergleichsminuten mit der LangenZeit laden
ldi CompareSEC, @0 ; Vergleichssekundenmit der LangenZeit laden
rjmp Compare_gesetzt ; zurück zu main
.ENDMACRO ; End macro definition
;*************************************************Hauptprogramm***********************************************
.CSEG
main:
Config:
; Konstantendefinition Register
ldi temp, 240 ; CSekX4 Konstante 250ms * 240 = 60s (Sekunden) (240)
mov CSekX4,temp
ldi temp, 60 ; CMin Minuten (60)
mov CMin,temp
ldi temp, 24 ; CStunden Stunden (24)
mov CStunden,temp
ldi temp, 12 ; CTimer Konstante zum vorladen des Timer gespeichert ist (255-243 = 11)
mov CTimer,temp
; Interruptdifinition
sei ; Interrupts global aktivieren
; Ports initialisieren
clr PORT
ldi PORT, 0b00001100 ; Port A bis auf Bit3 und Bit4 alles Eingänge
out DDRA, PORT ; Richtungsregister DDRA als Ausgang konfigurieren
sbi PORTA, LED ; LED anschalten
sbi PORTA, Relai ; Relai anschalten
sbis PINA, INKurz ; Prüfen Ob Kurz oder Lange Laufzeit
rjmp lang
CompareSetzen KurzSec,KurzMin ; Compare werte auf Kurz setzten
lang:
CompareSetzen LangSec,LangMin ; Compare werte auf Lang setzten
Compare_gesetzt:
; SleepModus initialisieren (Idle)
ldi SleepM,(1<<SE) ; Sleep ModusAktivieren, |(0<<SM2)|(0<<SM1)|(0<<SM0) 000 ist der Idle Sleep Modus
out MCUCR, SleepM ; Sleep eingstellen
; Timer/Counter 2 initialisieren
clr TIMER
ldi TIMER, (1<<TOIE2) ;|(1<<OCIE2) < für Compare Interrupt
out TIMSK, TIMER ; Timer/Counter 2 Overflow Onterrupt aktivated
clr TIMER
ldi TIMER, (1<<CS22)|(1<<CS21)|(1<<CS20) ; noPWM, OCR2 update Normal + off, vorfaktor 1024
out TCCR2, TIMER ; Port Timer/Counter 2 mit Funktionen laden, Timer wird gestartet
out TCNT2, CTimer ; Timer/Counter 2 mit 12 vorladen (255-245 = 12 <aufgerundet wegen befehlslaufzeiten)
ldi temp, (1<<initialisiert)
mov Config, temp ; Config bereits ausgeführt !!!
rjmp back
back:
Sleep
wäre echt superdankbar wenn sich mal jemand das Programm anschaut.
Lesezeichen