Maestro
27.09.2004, 03:34
Hallo,
ich sitze jetzt schon seit gut 2 Tagen vor meinem Programm und finde einfach nicht den Fehler. ](*,)
Ich wollte im Grunde nur eine billige StopUhr machen, sprich ein Port soll eine gewisse Zeit 5V führen und wenn die Zeit abgelaufen ist soll der Port auf 0V wechseln.
Mein Problem konnte ich jetzt schon auf die Interrupt rutine eingrenzen.
Momentan verhält sich sich sobald ich mehr als 4 Zeilen Code in ihr stehen habe nicht mehr so wie ich es will.
Gibt es vielleicht dinge die man beachten muss wenn man eine Interrupt Rutine schreibt? 8-[
.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.
Es soll erstmal auf einem ATMega 32, mit Batterie, laufen mit (hoffentlich) 1MHz internen Takt.
Das Problem sollte nach meinem Debuggen im bereich der "##" linien zu finden sein.
Bitte um Hilfe ....
Thx
ich sitze jetzt schon seit gut 2 Tagen vor meinem Programm und finde einfach nicht den Fehler. ](*,)
Ich wollte im Grunde nur eine billige StopUhr machen, sprich ein Port soll eine gewisse Zeit 5V führen und wenn die Zeit abgelaufen ist soll der Port auf 0V wechseln.
Mein Problem konnte ich jetzt schon auf die Interrupt rutine eingrenzen.
Momentan verhält sich sich sobald ich mehr als 4 Zeilen Code in ihr stehen habe nicht mehr so wie ich es will.
Gibt es vielleicht dinge die man beachten muss wenn man eine Interrupt Rutine schreibt? 8-[
.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.
Es soll erstmal auf einem ATMega 32, mit Batterie, laufen mit (hoffentlich) 1MHz internen Takt.
Das Problem sollte nach meinem Debuggen im bereich der "##" linien zu finden sein.
Bitte um Hilfe ....
Thx