Forum: Mikrocontroller und Digitale Elektronik Tímer Interrupt Problem


von Ingo L. (grobian)


Lesenswert?

Habe hier dem Timer 1 beim Tiny26 programmiert und er sollte eigentlich 
wenn er bei 120 angelangt ist einen Interrupt auslösen..habe ich hier 
was vergessen ??


.include"tn26def.inc"
.def temp = r16
.def leds = r17
.org 0x0000 rjmp main
.org OVF1addr rjmp timer1_overflow

main:

ldi temp,RAMEND
out SP,temp

ldi temp, 0xFF
out DDRB,temp

ldi leds, 0xFF

ldi temp,1<<CS10
out TCCR1B, temp


ldi temp,1<<TOIE1
out TIMSK, temp

ldi temp,120    ;Interrupt bei 120
out OCR1A, temp

sei

loop: rjmp loop

timer1_overflow:
out PORTB, leds
com leds
ldi temp,0
out TCNT1,temp

reti

von Jens (Gast)


Lesenswert?

1
ldi temp,120    ;Interrupt bei 120
2
out OCR1A, temp

Das musst du in TCNT0 laden.

von Jean P. (fubu1000)


Lesenswert?

Moin,
also XOR !
Du benutzt den Timer1 Overflow INT-Vektor. Setzt aber das Register 
OCR1A, welches für den CTC Modus, bzw. PWM gedacht ist.
Also entweder benutzt du dan auch den CTC Modus (würde ich tun) und 
benutzt deren INT-Vektor, oder du setzt TCNT1 entsprechend.

Gruß

von Jean P. (fubu1000)


Lesenswert?

@Jens : dann muss er aber auch den Timer0 benutzen, wenn er das in TCNT0 
schreibt. Zudem würde dann der INT nach 124 Takten und nicht nach 120 
ausgelöst werden. Also besser 124 reinschreiben.

Gruß

von Jens (Gast)


Lesenswert?

Jo hast ja recht :)

von Ingo L. (grobian)


Lesenswert?

Hatte jetzt irgendwie das falsche Programm drinne.
Also nochmal:
Ich möchte einen vergleich mit dem OCR1A (und nicht den Timer mit dem 
Wert 120 starten) machen was ja auch geling in dem mir das Bit OCF1A im 
TIFR Register auch gesetzt wird, wenn die 120 erreicht ist. Nur wie 
werte ich das jetzt aus.
Um der Frage vorzubeugen ich habe das Programm nich in ein Projekt 
eingebunde, ich will nur die Arbeitsweise von Timer 1 im Tiny26 kennen 
lernen.

.include"tn26def.inc"

.def temp = r16
.def leds = r17

.org   0x000       rjmp main
.org  INT0addr    rjmp noch_nichts
.org  PCI0addr      rjmp noch_nichts
.org  OC1Aaddr    rjmp timer1_overflow
.org  OC1Baddr    rjmp noch_nichts
.org  OVF1addr    rjmp timer1_overflow
.org  OVF0addr    rjmp noch_nichts
.org  USI_STARTaddr  rjmp noch_nichts
.org  USI_OVFaddr    rjmp noch_nichts
.org  ERDYaddr    rjmp noch_nichts
.org  ACIaddr    rjmp noch_nichts
.org  ADCCaddr    rjmp noch_nichts

main:

ldi temp,RAMEND
out SP,temp

ldi temp, 0xFF
out DDRB,temp

ldi leds, 0xFF

ldi temp,1<<CS10
out TCCR1B, temp


;ldi temp,(1<<TOIE1)
;out TIMSK, temp

ldi temp,(1<<OCIE1B)  ;setzt jetzt OCF1A im TIFR bei MATCH
out TIMSK, temp

ldi temp,120           ;Interrupt bei 120
out OCR1A, temp

sei

loop: rjmp loop

timer1_overflow:
out PORTB, leds
com leds
ldi temp,0
out TCNT1,temp
reti

noch_nichts:
reti

von Ingo L. (grobian)


Lesenswert?

sooo..nachdem jetzt alles funzt..das Programm erspare ich jetzt mal, die 
Profis hier werden ja wohl wissen wie es geht (ich weiß es jetzt auch 
aber vom Profi bin ich noch meilenweit entfernt) will ich den Timer 
jetzt mal extern Takten aber so wie ich das sehe, ist das mit Timer 1 
bein Tiny26 nicht möglich...oder ??

von Jean P. (fubu1000)


Lesenswert?

Ähm, wie kommst du denn jetzt darauf ???
Der Timer benutzt die Taktquelle, die in den Fuses eingestellt sind, 
also entweder internen RC-O. oder externen Quarz, ...

Gruß

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

T0 kann extern getaktet werden.

von Ingo L. (grobian)


Lesenswert?

hmmm..das meinte ich jetzt nicht.
Meinte eigentlich, dass ich externe Impulse zählen will, so wie es beim 
Timer 0 über den T0 Pin möglich ist..habe ich wohl etwas 
missverständlich geschrieben.

von Ingo L. (grobian)


Lesenswert?

@Traver Rec.
Timer 0 kann extern getaktet werden ist ja OK, aber es gibt kein 
Vergleichsregister OCR wie im Timer 1

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.