Forum: Mikrocontroller und Digitale Elektronik Timer0 überlauf


von Ingo L. (grobian)


Lesenswert?

Habe hier aus dem Forum das unten aufgeführte Programm und will es auf 
dem Tiny26 laufen lassen, nur löst der Interrupt beim Timerüberlauf 
nicht aus..wo ist hier der Fehler



.include"tn26def.inc"

.def temp = r16
.def leds = r17


.org 0x0000
  rjmp   main
.org OVF0addr
  rjmp  timer0_overflow

main:
    ldi temp,(RAMEND)
    out SP,temp

    ldi  temp,  0xFF
    out  DDRB,  temp

    ldi  leds,  0xFF

    ldi  temp,  0b00000001
    out  TCCR0,  temp

    ldi  temp,  0b00000001
    out  TIMSK,  temp

    sei

loop:  rjmp   loop


timer0_overflow:
    out  PORTB,  leds
    com  leds
    reti

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ingo Laabs wrote:

> Habe hier aus dem Forum das unten aufgeführte Programm und will es auf
> dem Tiny26 laufen lassen, nur löst der Interrupt beim Timerüberlauf
> nicht aus..wo ist hier der Fehler
> ...
>     ldi  temp,  0b00000001
>     out  TIMSK,  temp

Das Bit TOIE0 ist zu setzen. Das Makro dafür steht in "tn26def.inc" und 
es wird so angewendet:

    ldi  temp,  (1<<TOIE0) ; 0b00000001
    out  TIMSK, temp

Die Werte für den Prescaler

>    ldi  temp,  0b00000001
>    out  TCCR0,  temp

habe ich nicht kontrolliert. Vom Sourcecode her könnte dort das gleiche 
Problem vorliegen. Lässt man die 0b00000001 dort stehen und simuliert 
man mit 4 Mhz im AVR Studio, geht PORTB nach 68,25 µs dauerhaft auf 
HIGH.

von Ingo L. (grobian)


Lesenswert?

bewirkt den aber:

ldi  temp,  0b00000001
out  TIMSK,  temp

und:

ldi  temp,  (1<<TOIE0)
out  TIMSK, temp

nicht dasselbe ? in beiden Fällen wird das entsprechende Bit doch 
gesetzt.

von Tom (Gast)


Lesenswert?

Versuch doch mal einen Vorteiler von 1024.

ldi temp, 0b00000101
out TCCR0, temp

Bei einem Vorteiler von 1 wirste die LED´s nich einmal flackern sehen.

Ansonsten probier mal Dein Programm im Simulator.

Mfg, tom.

von Ingo L. (grobian)


Lesenswert?

ich teste das Programm ja im Simulator nur wird bein Timerüberlauf die 
Interruptroutine nicht angesprungen .....und das war ja ursprünglich 
meine Frage. Mit dem Mega8 funktioniert die Sache im Simulator, nur wenn 
ich den Tiny26 im Simulator verwende nicht.

von Tom (Gast)


Lesenswert?

TOIEO das InterruptBit für Timer0 liegt auf bit1 im TIMSK, nicht auf 
bit0.
Deswegen hatte der Stefan Recht.

Entweder:
  ldi  temp,  (1<<TOIE0)
  out  TIMSK, temp

oder:
  ldi temp, 0b00000010
  out TIMSK, temp

Dann gehts.

von Ingo L. (grobian)


Lesenswert?

ohhh..rotwerd
Blick ins Datenblatt hätte wohl genügt, schätze ich. Beim Mega8 ist das 
TOIE0 Bit an Stelle 0 und beim Tiny26 ist es an Stelle 1 im TIMSK 
Register.

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.