Hallo ich habe an meinem ATmega8 einen 4MHz Quarz angeschlossen. Kapazitäten habe ich nach Datenblatt ausgewählt. Ich kann den ATmega ohne Probleme brennen und auch das Programm läuft (einfacher Blinker). Allerdings bleibt das Programm nach ein paar Sekunden stehen. Habe sämtliche Funktionen überprüft; Jede Funktion arbeitet eingenständig -> egal von wo sie aufgerufen wird, bzw. ein Interrupt sie unterbricht. Nun vermute ich, dass das Quarz nicht richtig schwingt; Habe ein 30MHz Oszi da; wie kann ich messen, ob das Quarz richtig schwingt? Habe es zwischen Masse und Xtal versucht - ohne großen Erfolg. Nun kann es natürlich sein, dass das schon aussagekräftig genug ist. Wie schaut eine Schwingung des Quarzes aus?
Das ist wenn ein Sinus.. nur einige Oszis koenen das nicht Messen, weil der Quarz zusammenbricht (Kapazitive belastung) Programmierst du in ASM? Ich hatte am WE mal einen Fehler gehabt und stadt RETI nud RET geschrieben naja da lief der Controller zwar aber er ging nicht mehr in die Interruptroutine, weil er dachte noch darin zu sein Gruss
> Wie schaut eine Schwingung des Quarzes aus?
Ungefährer Sinus. Aber Vorsicht! Durch die Belastung des Tastkopfes
kann dieser Sinus zusammenbrechen, deshalb 10:1 Einstellung wählen.
Sind die Fusebits richtig gesetzt? Wenn nicht läuft die MCU evtl. auf
dem internen RC-Clock.
Fuses sollten richtig sein... Der Blinker ist auf Sekundentakt parametriert. Mit falschen Fuses würde der Blinker nicht im Sekundentakt blinken. Aber nochmal zur Sicherheit, wie sollten die Fuses für externen Clock gesetzt werden?
Ja, ich programmiere ASM - derweil tippe ich dann doch auch auf irgendeinen Überlauf. Shit, kann nicht OnChip debuggen. Reti habe ich eingehalten; - keine Ahnung, was da los ist... itemp wird nirgends mehr verwendet TIM0_OVF: lds itemp,mySREG sbrs itemp,0 ;überspringe, wenn erstes BIT gelöscht ist rjmp timer0restart timer0mydelay: inc mydelay_azyk ;jeden Timer2 überlauf inkrementieren timer0restart: ldi itemp,0xdb ;Timerstartwert schreiben out TCNT0,itemp reti ;
Ich würde eher auf ein Softwareproblem tippen, Stichwort Stack-Overflow (z.B. Unterprogramm mit RJMP statt RCALL aufgerufen), oder Stack nicht richtig initialisiert. Probier Deinen Code mal im Simulator und beobachte Stackpointer und SRAM-Inhalt. MfG Olaf
So...für die Leute, die über den gleichen Fehler stolpern. Olaf_K hat den entscheidenen Hinweis gegeben. die mainLoop war keine wirklich schleife mehr ;-) Sie hat sich immer wieder selber mit rcall aufgerufen...
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.