Hallo, kann mir jemand helfen, mein Interrupt geht nicht!! Ziel ist LEDs blinken zu lassen!
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.
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???
> was kann ich da machen???
Die Symbole (Bezeichnungen, Namen) benutzen, die im Datenblatt
aufgelistet sind und in der Include-Datei definiert sind.
...
> 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.
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
@Michael: Wenn er den Timer im Overflow-Modus betreiben will, dann muss er ihn zwangsläufig in der ISR mit dem Startwert nachladen (Ich gehe davon aus, dass Du das damit meintest...).
> 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. ...
@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...
Ach so, ich dachte, es ginge um den Mega8515. Wußte gar nicht, daß es einen Vorgängertyp gibt. Auf jeden Fall gilt von meiner Antwort aber noch das mit den nicht gesicherten Registern.
@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... ;-) ...
> Wußte gar nicht, daß es einen Vorgängertyp gibt.
Jaja, die (Netz-)Polizei, Dein Freund und Helfer...
Die wissen bekanntlich so Manches nicht...
Duck & wech...
...HanneS...
>weggebeamt
weg ge Beamt(et)...
Wusste gar nicht, dass Beamte das Beamen erfunden haben...
(Duck & Elch)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.