Forum: Mikrocontroller und Digitale Elektronik Timer0 und fusebits


von Joerg S. (joerg_seemann)


Lesenswert?

hallo

ich hab probleme mit dem timer0.
im avrstudio-simulator läufts perfekt.
auf den ATmega168 gespielt und nix funktioniert.
möglicherweise ne fusebit sache?
Der Atmel soll mit dem 7.3728MHz Crystal laufen und macht es nich.

HILFE, schon zwei Tage versaut...

von ecslowhand (Gast)


Lesenswert?

Was genau läuft denn nicht ???

von Joerg S. (joerg_seemann)


Angehängte Dateien:

Lesenswert?

naja, ich teste mich grad mit nem "einfachen LED an und nach 1s 
aus"-Programm
siehe anhang durch

von johnny.m (Gast)


Lesenswert?

Also mit dem Programm geht ganz sicher nichts an und wieder aus. Was 
soll das?

von Joerg S. (joerg_seemann)


Angehängte Dateien:

Lesenswert?

sorry falsche datei...

von ecslowhand (Gast)


Lesenswert?

Immerhin,  PIND6 und PIND7 sind als Ausgang initialisiert und gehen auf 
"High"......

Wo ist denn die Timerinitialisierung ????

mhh.......

von Joerg S. (joerg_seemann)


Lesenswert?

        ldi     temp, 0x00
        out     TCCR0A, temp

        ldi     temp, 0x01
        out     TCCR0B, temp

    ldi     temp, 0x00
    out     TCNT0, temp

        ldi     temp, 1 << TOIE0      ; TOIE0: Interrupt bei Timer 
Overflow
        sts     TIMSK0, temp
    sei

...dachte ich

von Joerg S. (joerg_seemann)


Lesenswert?

... TCCR0B hab ich auf 0x05 für Teiler 1024 gestellt, zusammen mit dem 
dekrement von count sollte ca. 1s rauskommmen, sollte...

von Alex M. (Gast)


Lesenswert?

Hi
 Interruptfreigabe Befehl "sei" gehört nicht in den Interrupt.
Das Interrupt Flag wird mit reti gesetzt.

von Alex M. (Gast)


Lesenswert?

Ich habe deinen Code bizzle getunt. Versuchs mal damit. Mir gefällt das 
springen ausm Interrupt(BRNE) nicht.

loop:   rjmp    loop

timer0_overflow:
    ;sei
    dec count
    cpse count,0x00 ;->
     reti
    ;brne loop
    call LED_aus
    reti



von Stefan (Gast)


Lesenswert?

> Das Interrupt Flag wird mit reti gesetzt.

Du meinst die Interruptroutine sollte in der Art aussehen:
1
timer0_overflow: 
2
        dec count
3
        cpi count,0x00
4
        brne lreturn
5
        call LED_aus
6
lreturn:
7
        reti

Wo genau hängt die LED wie dran? Sie hätte derzeit nur an PD6 und PD7 
eine Chance zu funktionieren.

von Alex M. (Gast)


Lesenswert?

@  Stefan
Deine ist eindeutig die bessere Lösung.
Hab's vergesse dass "cpse" nur unter Registern geht.

von joerg_seemann (Gast)


Lesenswert?

Danke, danke, aber

geändert, geladen, getestet, LED an, aber nich aus.

doch die Fuses, oder mein unvermögen?

ja, PD6 und PD7 sind LED

von joerg_seemann (Gast)


Lesenswert?

danke männers, das klappt.

einen wunderschönen tag noch und danke...

von Stefan (Gast)


Lesenswert?

1
    ldi     temp, 0x00
2
    out     TCNT0, temp

Der Timer0 ist mit diesem Code angehalten.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer#TCCR0
1
        ;ldi     temp, 0x00      ; CS00 setzen: Teiler 1
2
        ;out     TCCR0A, temp
3
4
        ;ldi     temp, 0x01      ; CS00 setzen: Teiler 1
5
        ;out     TCCR0B, temp
6
     
7
        ldi     temp, 0x01       ; CS02=0 CS01=0 CS00=1 => Teiler 1
8
        out     TCNT0, temp

von Stefan (Gast)


Lesenswert?

Quatsch. TCCR0 und TCNT0 verwechselt. Dummer Stefan ;-)

von Uwe (Gast)


Lesenswert?

Hi!
Nochwas ganz wichtiges: Flagregister bei Eintritt in die ISR sichern und 
am Ende zurückschreiben, sonst sind böse Überraschungen sicher.

Viel Erfolg, Uwe

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.