Tob
07.10.2007, 14:40
Hallo zusammen,
Ich hab mich in der letzten Tagen mit dem Ansprechen der Timer/Counter im Atmega 32 beschäftigt.
Dazu wollte ich zum Ausprobieren mithilfe des Timer/Counter0 den PortA in kurzen Abständen,
nach jedem Zählerüberlauf An- und Auschalten.
Hierzu habe ich den folgenden Programmcode von microcontroller.net verwendet
und lediglich die Includedatei für meinen AVR geändert und den Ausgabeport auf "PORTA" umgeschrieben:
.INCLUDE "C:\Programme\Atmel\AVR Studio\Appnotes\m32def.inc"
.def temp = r16
.def leds = r17
.org 0x0000
rjmp main ; Reset Handler
.org OVF0addr
rjmp timer0_overflow ; Timer Overflow Handler
main:
ldi temp, LOW(RAMEND) ; Stackpointer initialisieren
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0xFF ; Port B auf Ausgang
out DDRA, temp
ldi leds, 0xFF
ldi temp, 0b00000001 ; CS00 setzen: Teiler 1
out TCCR0, temp
ldi temp, 0b00000001 ; TOIE0: Interrupt bei Timer Overflow
out TIMSK, temp
sei
loop: rjmp loop
timer0_overflow: ; Timer 0 Overflow Handler
out PORTA, leds
com leds
reti
Mein Problem ist nun, dass das Programm, nachdem es durch den Overflow Interrupt
das Unterprogramm "timer0_overflow:" ausgeführt hat,
auf die Adresse 0x0000 Springt und die Programmzeilen nach "main:" immer wieder ausführt.
Normalerweise müsste das Programm doch wieder in die Endlosschleife
bei "loop:" Zurückspingen, oder? :-k
Wäre nett wenn ihr mir helfen könntet, thx shon mal im Vorraus! O:)
Ich hab mich in der letzten Tagen mit dem Ansprechen der Timer/Counter im Atmega 32 beschäftigt.
Dazu wollte ich zum Ausprobieren mithilfe des Timer/Counter0 den PortA in kurzen Abständen,
nach jedem Zählerüberlauf An- und Auschalten.
Hierzu habe ich den folgenden Programmcode von microcontroller.net verwendet
und lediglich die Includedatei für meinen AVR geändert und den Ausgabeport auf "PORTA" umgeschrieben:
.INCLUDE "C:\Programme\Atmel\AVR Studio\Appnotes\m32def.inc"
.def temp = r16
.def leds = r17
.org 0x0000
rjmp main ; Reset Handler
.org OVF0addr
rjmp timer0_overflow ; Timer Overflow Handler
main:
ldi temp, LOW(RAMEND) ; Stackpointer initialisieren
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, 0xFF ; Port B auf Ausgang
out DDRA, temp
ldi leds, 0xFF
ldi temp, 0b00000001 ; CS00 setzen: Teiler 1
out TCCR0, temp
ldi temp, 0b00000001 ; TOIE0: Interrupt bei Timer Overflow
out TIMSK, temp
sei
loop: rjmp loop
timer0_overflow: ; Timer 0 Overflow Handler
out PORTA, leds
com leds
reti
Mein Problem ist nun, dass das Programm, nachdem es durch den Overflow Interrupt
das Unterprogramm "timer0_overflow:" ausgeführt hat,
auf die Adresse 0x0000 Springt und die Programmzeilen nach "main:" immer wieder ausführt.
Normalerweise müsste das Programm doch wieder in die Endlosschleife
bei "loop:" Zurückspingen, oder? :-k
Wäre nett wenn ihr mir helfen könntet, thx shon mal im Vorraus! O:)