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:
    

Anmelden zum Antworten