Timer0 überlauf

OP #1076328
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
Persönliche Seite #1076372
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.
Gast #1076614
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren