Interrupt funktioniert nicht

Gast #362258
Lesenswert?

Deine Interruptvektor-Tabelle ist falsch. Timer1 hat zwei
Compare-Match-Interrupts. Deine Interrupt-Routine wird nicht beim
Timer0-Overflow, sondern beim Timer1-Overflow angesprungen, der
natürlich nicht aktiviert ist.

Deine Interrupt-Routine benutzt r16 und verändert die Flags, ohne diese
vorher zu sichern.

Statt den Timerwert jedesmal manuell zu ändern, könntest du auch gleich
den CTC-Mode verwenden und statt des Overflow-Interrupts den
Compare-Match-A. Dann kannst du nämlich einfach einmal in OCR0A
schreiben, wie weit der Timer laufen soll, und er macht das dann
automatisch bei jedem Durchlauf.

Übrigens: Du solltest dir angewöhnen, bei den I/O-Registern die
Bitnamen zu verwenden statt Ziffernkolonnen, z.B. statt
1
ldi temp, 0b00000101  ;Timer 0 auf CK 1024 einstellen
2
out TCCR0, temp

lieber
1
ldi temp, (1 << CS02) | (1 << CS00) ;Timer 0 auf CK 1024 einstellen
2
out TCCR0, temp

Dann ist es mit dem Nachschlagen im Datenblatt einfacher.
Gast #362259
Lesenswert?

hallo, es hat funktioniert danke.

1. Ich habe versucht in diesem CTC-Mode interrupt zu initialisieren,
leider hat es nicht funktioniert, er gibt mir ständig den Fehler
heraus. error: Undefined symbol: OCR0
Eigentlich sollte dieser Register in Definitonsdatei bekannt sein, aber
ich habe ihn nicht drin gefunden: .include "8515def.inc", oder mache
ich es falsch.


  ldi temp, 0b11111111
  out DDRB, temp      ;Port B als Ausgang


  ldi temp, 0b00001000  ;Timer 0 CTC-Mode
  out TCCR0, temp

  ldi temp, 61      ;Timer 0 auf 195 einstellen
  out TCNT0, temp

  ldi temp, 61      ;nachlade register
  out OCR0, temp

  ldi temp, 0b00000001  ;Timer 0 Interrupt initialisieren
  out TIMSK, temp

2. du hast mir empfohlen so zu schreiben
ldi temp, (1 << WGM01) ; auch mit CTC0 probiert
TCCR0, temp

leider funktioniert es nicht --> Fehler error: Undefined symbol: WGM01
und CTC0

was kann ich da machen???
Gast #362261
Lesenswert?

>  ldi temp, 61      ;Timer 0 auf 195 einstellen
>  out TCNT0, temp

>  ldi temp, 61      ;nachlade register
>  out OCR0, temp

Das Compare-Register ist kein "Nachlade"-Register! Entweder Du
arbeitest mit CTC oder Du lädst das TCNT mit einem Startwert vor.
Beides auf einmal macht keinen Sinn!

>  Undefined symbol: OCR0

>  Fehler error: Undefined symbol: WGM01
>  und CTC0

Der 90S8515 ist ja auch hoffnungslos veraltet. Der hat manche Features
noch nicht (afaik hat der Timer 0 da auch noch keine Compare-Einheit
und demzufolge auch keinen entsprechenden Interrupt!) und einige Bits
heißen anders.
Gast #362262
Lesenswert?

Ich bin zwar kein Assemblerspezialist, aber du überschreibst das TCNT0 2
mal mit neuen Werten. Entwerder die Einstellungen in einem Befehl
reinschreiben oder die Folgebefehle mit dem Inhalt verodern, sodass der
bestehende Inhalt nicht überschrieben wird.

MW
#362264
Lesenswert?

> Der 90S8515 ist ja auch hoffnungslos veraltet.

Das sehe ich etwas anders. Er hat zwar etliche Features noch nicht,
aber gerade deshalb ist das Kapitel "Timer" im Datenblatt für den
Einsteiger besser verständlich (weil nicht so überladen) als das des
Mega8515.
Ich will damit sagen, dass der Einsteiger, der den AVR nicht nur
benutzen will (BASCOM, C mit fremden Bibliotheken), sondern auch
verstehen will, keinen Fehler macht, sich intensiv mit dem AT90S8515 /
8535 / 2313 zu beschäftigen, ehe man sich den moderneren Typen widmet.
Wenn nämlich die Grundfunktionen der Timer verstanden wurden, dann hat
man auch eine Chance, die zusätzlichen Features der neuen AVRs richtig
einzuordnen. Es gibt halt weniger Möglichkeiten für Missverständnisse.

...
Gast #362266
Lesenswert?

@Hannes:
Da geb ich Dir völlig Recht. Der Datenblattaspekt ist für Einteiger
sicher nicht zu vernachlässigen. Und mittlerweile sind selbst die
Datenblätter von den "winzigen" Tinys signifikant umfangreicher als
die von den "alten großen" AT90S8515 / 8535. Da ist es tatsächlich
nicht verwunderlich, wenn manch ein Anfänger vor der Informationsflut
kapituliert...
#362268
Lesenswert?

@Johnny:
Genau... Wenn man aber erstmal anhand der alten AVRs verstanden hat,
wie Timer-Overflov, -Cpmpare, -Input-Capture, Pin-Toggeln und einfache
PWM funktioniert, dann findet man das auch im Datenblatt der neueren
AVRs wieder und hat den Kopf frei für die zusätzlichen Features. Im
Zweifel kann man sich dann immernoch auf das beschränken, "was man
kennt" (und bereits versteht).

Kennt man aber die Standardfunktionen nicht, dann wird man vom
Datenblatt erschlagen. Das ist wahrscheinlich auch ein Grund, warum
immer mehr Einsteiger das Datenblatt nicht mehr lesen wollen und nach
Hochsprachen mit Standardbibliotheken schreien... ;-)

...

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