Forum: Mikrocontroller und Digitale Elektronik Atmega328P - Timer0 Interrupt klappt nicht so


von Teddy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin im moment dabei den Timer Interrupt zu konfigurieren. Dabei bin 
ich euren Tut Schritt für Schritt gefolgt.

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer

Aber es will nicht funktionieren.
Ich will lediglich, dass die LEDs jede Sekunde an und aus gehen.

Im Interrupt Handler wird bis 61 gezählt, weil durch den Prescaler von 
1024 und einen Takt von 16Mhz wird in 1 Sekunde 61 Overflows erzeugt, 
gemäß der Formel im Link oben.

Lg

von Stefan F. (Gast)


Lesenswert?

> Ich will lediglich, dass die LEDs jede Sekunde an und aus gehen.

Ok, erste Hürde überwunden: Beschreibung des erwarteten Ergebnisses.

> Aber es will nicht funktionieren.

Was genau funktioniert nicht? Was funktioniert? Wass passiert anstelle 
des erwarteten Ergebnisses?

Läuft der Timer überhaupt (das kannst du mit dem Simulator in AVR Studio 
ganz leicht prüfen)?

1
ldi temp, 0x01
2
sts TIMSK0, temp  ;Interrupt aktivieren

Muss es nicht "out TIMSK0, temp" heissen?

von Stefan E. (sternst)


Lesenswert?

1
.org 0x001C
2
         rjmp Timer0_handler    ; Timer0 Handler
Falsche Adresse.

von S. Landolt (Gast)


Lesenswert?

>Muss es nicht "out TIMSK0, temp" heissen?

Nein.

von Stefan F. (Gast)


Lesenswert?

Also wenn sts richtig ist, dann ist das aber fragwürdig:
1
ldi temp, 0b00000101
2
out TCCR0B, temp ;Prescaler auf 1024

von Stefan E. (sternst)


Lesenswert?

Stefan U. schrieb:
> Also wenn sts richtig ist, dann ist das aber fragwürdig:

Nö, das passt auch.

von S. Landolt (Gast)


Lesenswert?

Auch nicht; fragwürdig ist nur, warum es nicht trotz des Adressfehlers 
läuft, ich dachte, dass die paar 0xFFs einfach so durchlaufen werden.

von Thomas F. (igel)


Lesenswert?

1
> ldi temp, 0x01
2
> sts TIMSK0, temp  ;Interrupt aktivieren

Damit wird der Overflow-Irq aktiviert.

In der Irq-Sprungtabelle wird aber wie sternst schon schrieb
1
> .org 0x001C
2
>          rjmp Timer0_handler    ; Timer0 Handler

der Compare-Irq adressiert.

Richtig:
1
> .org 0x0020
2
>          rjmp Timer0_handler    ; Timer0 Handler

von Stefan E. (sternst)


Lesenswert?

S. Landolt schrieb:
> Auch nicht; fragwürdig ist nur, warum es nicht trotz des Adressfehlers
> läuft, ich dachte, dass die paar 0xFFs einfach so durchlaufen werden.

Welche 0xFFs? Die tatsächliche Adresse liegt hinter der angegebenen. Der 
Interrupt springt also irgendwo in main rein.

von S. Landolt (Gast)


Lesenswert?

Autsch, falsch gedacht - OVF0addr liegt ja nach 0x001C.

von Teddy (Gast)


Lesenswert?

Die Adresse war falsch. Direkt geändert und es lief sofort wie es 
sollte.
Danke an euch. Ihr seid die besten :D

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.