PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer 0 will nicht



Thopos
26.05.2005, 22:50
Möchte einen einfachen Timer programmieren - habe auch schon im TimerTutor und AtmelDatasheet nachgeschaut.

Nutze ich Timer1, dann gehts - folgender Code mit Timer 0 funzt nicht?!


.include "m8def.inc" ;Definitionsdatei laden
.cseg ;Beginn eines Code-Segmentes
;
;
.def temp = r16
.def counter = r17
.def leds = r18
.equ start = 256-1
.equ loops = 0
;
.org 0x000
rjmp reset ;Reset Handler
reti ;IRQ0 Handler
reti ;IRQ1 Handler
reti ;Timer1 Capture Handler
reti ;Timer1 compare Handler
reti ;Timer1 Overflow Handler
rjmp timer0
;reti ;Timer0 Overflow Handler
reti ;SPI Transfer Complete Handler
reti ;UART RX Complete Handler
reti ;UDR Empty Handler
reti ;UART TX Complete Handler
reti ;ADC Conversion Complete Interrupt Handler
reti ;EEPROM Ready Handler
reti ;Analog Comparator Handler

reset:
ldi temp,LOW(RAMEND) ;temp auf letzte Position im RAM setzen
out spl,temp ;LB vom SP mit LB vom Ramende
ldi temp,HIGH(RAMEND) ;temp auf letzte Position im RAM setzen
out sph,temp ;HB vom SP mit HB vom Ramende

ldi temp,0xff
out ddrd,temp
ldi temp,0b00001111
out portd,temp

ldi temp, 1
out TIMSK, temp

ldi temp, start
out TCNT0, temp

ldi temp, 0b00000101
out TCCR0, temp

ldi counter, loops
ldi leds,0xff

sei

main:
loop:
rjmp loop
;-------------------------------------
timer0:
dec counter
brne restart
ldi counter, loops
com leds
out portd, leds
restart:
ldi temp, start
out tcnt0,temp
reti

Thopos
26.05.2005, 23:20
Ich hab es schon. Man sollte die passenden Sprünge zu Anfang nutzen.
Also, anbei die Version die funktioniert.


;Im Sekunden Takt die LED's am Port D Schalten
;Quarz hat 3,6864MHZ
.include "m8def.inc" ;Definitionsdatei laden
.cseg ;Beginn eines Code-Segmentes
;
;
.def temp = r16
.def counter = r17
.def leds = r18
.equ start = 256-122
.equ loops = 30 ;für genau eine Sekune 29,5081
;
.org 0x000
rjmp reset ;1 Reset Handler
reti ;2 IRQ0 Handler
reti ;3 IRQ1 Handler
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
rjmp timer0
;reti ;10 TC0 Overflow
reti ;11 SPI Transfer Complete Handler
reti ;12 UART RX Complete
reti ;13 UART Data Empty
reti ;14 UART TX Complete
reti ;15 ADC Conversion Complete Interrupt Handler
reti ;16 EEPROM Ready Handler
reti ;17 Analog Comparator Handler
reti ;18 TWI I²C Serial Interface
reti ;19 Store Program Memory Ready

reset:
ldi temp,LOW(RAMEND) ;temp auf letzte Position im RAM setzen
out spl,temp ;LB vom SP mit LB vom Ramende
ldi temp,HIGH(RAMEND) ;temp auf letzte Position im RAM setzen
out sph,temp ;HB vom SP mit HB vom Ramende

ldi temp,0xff
out ddrd,temp
ldi temp,0b00001111
out portd,temp

ldi temp, 1 ;Interrupt on Overflow
out TIMSK, temp

ldi temp, 0b00000101 ;alle 1024 Takte wird der Zähler
out TCCR0, temp ;vom Timer0 um 1 inkrementiert

ldi temp, start ;Bis der Zähler überläuft vergehen
out TCNT0, temp ;122 * 1024 Takte = 124928
; = 0,033889 sekunden

ldi counter, loops
ldi leds,0xff

sei

main:
loop:
rjmp loop
;-------------------------------------
timer0:
dec counter
brne restart
ldi counter, loops
com leds
out portd, leds
restart:
ldi temp, start
out tcnt0,temp
reti