Hallo! Ich hätte mal gerne wieder eure Hilfe in Anspruch genomen:) Also mein Problem: Ich hab den Timer meines ATmega8 wie folgt eingestellt: ldi temp,0b00000001 ;timer0 no prescaler out TCCR0,temp ldi temp,0b00000001 ;timer0 overflow interrupt out TIMSK,temp des weiteren habe ich natürlich "sei" nicht vergessen und der Interruptvektor sollte auch stimmen. Was muss noch eingestellt werden, oder gibt es irgendwelche Besonderheiten? Hab das Datenblatt gelesen und meiner Meinung nach (welche aber in diesem Fall nicht ganz stimmen kann) das richtige eingestellt. Und noch eine kleine Frage: ist beim ATmega8 eine externe Reset.Beschaltung nötig oder von Vorteil? Grüsse und Danke für jeden Tip!
Was ist denn nun das Problem? ATmega8 braucht keinen Resetschaltkreis, einfach RC-Glied wie im Tutorial anschließen.
Achja, völlig vergessen das Problem zu schildern, irgendwie klappt heute garnichts...:) Also, der TimerOverflowInterrupt wird nie ausgelöst...
Hallo, du hast das falsche Timerinterruptbit gestzt, und den Timer nicht mit einem wert geladen. So müsste es gehen: ldi temp,0b00000010 <<<;timer0 overflow interrupt out TIMSK,temp ldi temp, wert out TCNT0, temp ldi temp,0b00000001 ;timer0 no prescaler out TCCR0,temp sei Gruß, Arno
Hallo .. Na hast du die Einsprungadresse am angang des Programms richtig definiert? z.b. .org 0x0009 ;weiß jetzt nicht ob das beim Atmega auch die 9 ist rjmp xxx aber das prinzip soll ja erkannt werden. xxx wäre dann dein ziel was angesprungen werden soll
Hallo! Danke für die Hilfe, hat aber leider nichts genutzt. Nun habe ich eine andere Mögliche Fehlerquelle: Darf man in einem Interrupt umherdpringen, also Befehle wie breq o.ä. verwenden um in der Interruptroutine umherzuspringen? Schreiben diese Operationen nicht daten auf den Stack. Damit würde dann am Ende der Interruptroutine nicht an die richtige Stelle zurückgesprungen. Oder ist das nicht so?
Hallo, Du darft in der Int-Poutine springen, nur mußt du zu jedem "rcall" auch ein "Ret" programmieren, sonst läuft der Stack über. Aus einer Int-Routine nicht mit "rjmp" rausspringen. Ausserdem sollen die Int-Routinen immer so kurz wie möglich sein und längere Sachen im Hauptprogramm erledigt werden. Am Anfang jeder Int-Routine sollte man das Statusregister und eventuell in der Routine auch benutzte Register auf dem Stack sichern. introutine: push temp in temp,sreg push temp .......... .......... pop temp out sreg,temp pop temp reti Ich hoffe das hilft dir weiter. Gruß, Arno
Hab noch was vergessen, meine Programme für den Mega8 fangen so an: ---------------------------------------------------------------------- .nolist .include "m8def.inc" .list .EQU fq = 7372800 ;Quarzfrequenz .def temp = r16 .cseg .org 0000 rjmp start .org OVF0addr ; Tim0_Over Overflow Interrupt Vector rjmp Tim0_Over .org SPMRaddr reti ;-----------------------------; Programmstart ------------------------ ;--------------------------------------------------------------------- start: ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, temp ; in Stackpointer Low ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, temp ; in Stackpointer High Hier folgt dein Programm --------------------------------------------------------------------- Gruß, Arno
Hallo! Habs rausgefunden, lag nicht an der Initialisierung sondern an der Interruptroutine, welche nicht korrekt verlassen wurde! Trotzdem Danke für die Hilfe!
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.