PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer Interrupt



ttiny
22.06.2006, 18:06
Hallo
Ich habe ein Testprogramm geschrieben für einen Attiny2313.Leider bekomme ich im Simulator vom AVR Studio nicht hin das ein Interrupt im Label Timer ausgelöst wird um dann nach Licht_80s zu springen.
Kann mir jemanden sagen was ich falsch gemacht habe.Danke
ttiny



PS: kann man eigentlich Anhänge irgenwie hier einstellen,bin neu hier
machs erst mal so


.nolist
.include <tn2313def.inc>
.list
.cseg
.def zahl=r18
.def temp=r16
.def sregsave=r19
.def tmp=r21
.org 0x000


rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp Licht_80s
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
reset:

ldi zahl,1 ;legt die anzahl der umläufe fest
ldi temp,128 ;gibt die interrupts frei
out SREG,temp
ldi temp, low(ramend) ;stackpointer initialisiert
out spl, temp
ldi temp,0b11111111 ; portb ist ausgang
out ddrb,temp
ldi temp,0b00000000
out ddrd,temp ;portd ist eingang
ldi Temp, 2 ;hier wird der timer interupt freigegeben
out TIMSK, Temp
sei
ldi temp,5
out TCCR0,temp ; mit 1024 geteilte frequenz

timer: ldi tmp , 255
out TCNT0, tmp ;timer zählt bis 255
ldi temp,0
cp zahl,temp
breq licht_aus
rjmp timer



licht_aus:
ldi temp,0b11111111
out portb,temp
rjmp ende


Licht_80s:

in sregsave ,SREG
push sregsave
dec zahl
pop sregsave
out SREG,sregsave
reti


ende:

rjmp ende

izaseba
22.06.2006, 18:14
timer: ldi tmp , 255
out TCNT0, tmp ;timer zählt bis 255
ldi temp,0
cp zahl,temp
breq licht_aus
rjmp timer

Dein Interrupt kommt nie zum tragen, weil Du den Timer immer wieder mit 255 neu belegst.

besser wäre sowas:


timer: ldi tmp , 255
out TCNT0, tmp ;timer zählt bis 255
timer1:
ldi temp,0
cp zahl,temp
breq licht_aus
rjmp timer1


außerdem


timer: ldi tmp , 255
out TCNT0, tmp ;timer zählt bis 255

stimmt das auch nicht der timer zählt genau einen Takt bis der Überlauf stattfindet, warum, darfst Du Dir selber gedanken machen...

Gruß Sebastian

ttiny
22.06.2006, 18:25
Hi
Verstehe ich nicht.Der Timer müsste doch von 0-255 zählen und dann ein interrupt verursachen und in licht_80s springen.oder habe ich das falsch verstanden

linux_80
22.06.2006, 21:10
Hallo,
wie izaseba schon sagte, wenn Du in der Schleife den Timer immer mit 255 lädst, kommt er nicht zum zählen.

ttiny
27.06.2006, 07:21
hallo
weiss jetzt was ihr meint.habe auch sonst noch eineiges geändert.
danke für die hilfe
ttiny