Timer0
-
Ich habe mal eine Frage zu einem Programm das ich geschrieben habe (in dem Fall nur ein Ausschnitt) welches meiner Meinung nach funktionieren sollte, dies aber nicht tut.
Wie man im nachstehenden Programm sieht sollte ein Sekundentakt erzeugt werden:
Da ich mit einem ATmega644P mit 16MHz Taktfrequenz arbeite habe ich die Berechnung aufgestellt 1024*125*125 = 16MHz
Einmal läuft die Schleife schön bis zum Interrupt und dekrementiert die Variable teiler, aber dann während die Schleife sinnlos durchläuft bis der nächste Interrupt fällig wird springt das Programm auf einmal wieder in die Stackpointerinitialisierung.
Da ich noch relativ neu auf dem Gebiet bin versteh ich irgendwie nicht wieso das Programm das macht. Auch nicht wundern wenn meine Programmiertechnik schlecht ist (würdfe mich über Verbesserungsvorschläge freuen).
Meine Frage nun: Wieso läuft das Programm nicht reibungslos bis die Variable teiler 0 ist?Hier das Programm (bei dem Label operation sollte es dann noch weiter gehen, der Teil funktioniert aber):
.include "m644def.inc" .list .DEF vergleich = r15 .DEF akku = r16 .DEF teiler = r17 .DEF zahl = r18 .EQU clock = 16000000 .equ HWTeiler = 125 ;************************************************************************************** .cseg .org 0x0000 rjmp reset .org OC0Aaddr rjmp interrupt reset: jmp start .org INT_VECTORS_SIZE start: initstack: ldi akku, LOW(RAMEND) out spl, akku ldi akku, HIGH(RAMEND) out sph, akku initports: ldi akku,$ff out DDRC,akku ;PORT C als Ausgang inittimer0: ldi teiler,HWTeiler ldi akku,(1<<WGM01) out TCCR0A,akku ldi akku,(1<<CS02|1<<CS00) out TCCR0B,akku ldi akku,HWTeiler out OCR0A,akku ldi akku, TIMSK0 sbr akku, OCIE0A ;OCIEA0 sets without influecing other Pins sts TIMSK0,akku sei; loop: rjmp loop interrupt: dec teiler brne weiter rjmp operation weiter: reti operation: