Hallo zusammen! Ich hab ein größeres Programm geschrieben und gerade festgestellt, dass es manchmal während des Programmablaufs sich selbst in den Reset schickt. Das Programm wäre zum posten etwas zu umfangreich. Mich würde nur interessieren, welche Möglichkeiten ihr seht, einen Controller (ATmega8515) per Software zu reseten. Also in welchen Ecken ich den Fehler suchen muss. Programmiersprache ist ARV Embedded Workbench. Danke! Grüße Steffen
stack overflow heapüberschreiber returns aus nem interrupt unter umständen div durch 0 das fällt mir auf die schnelle dazu ein... 73 de oe6jwf /hans
Hallo Andy, ich verwende keinen Watchdog. Hier meine verwendeten Peripherien: - Timer0 Overflow -> Interrupt - Timer1 Output Compare -> OCA1 Toggle - USART - I2C (als Software) Kann das irgendwie mit dem Stack zusammenhängen? Ich habe ihn auf 0x80 Bytes und Return adress stack auf 24 levels gestellt. Es ist mir sonst unerklärlich, wie er wieder an den Anfang springt und in der ersten Schleife wieder hängenbleibt (gewollt).. Grüße Steffen
Hallo Hans: stack overflow -> möglich - siehe oberen Beitrag heapüberschreiber -> ich verwende keine dynamische Speicherreservierung returns aus nem interrupt -> hm - kann man da in C nen Fehler machen? unter umständen div durch 0 -> darauf werd ich das Programm mal checken. Das Resetsignal ist zum Zeitpunkt des Resets einwandfrei (gerade mit dem Oszi überprüft). Grüße Steffen
Hi wieso soll ne Division durch 0 auf dem AVR zu einem Reset führen? Der Controller hat ja schon gar keine Möglichkeit zur hardwaremäßigen Division die evtl. einen Interrupt auslösen könnte. Und ich kann mir nicht vorstellen das ein Compilerbauer da was selber zusammenbastelt. Wenn doch -> RTFM. Neben den von meinen Vorschreibern genannten Möglichkeiten: Könnte es evtl. ein Hardwareproblem sein? Matthias
Hallo! Ich verwende keine Division. Das habe ich gerade nochmals sicher gestellt. Ein Hardwareproblem kann ich sicher ausschließen - die Resetleitung liegt auch während des Resets sicher auf 5V. Was ist mit dem Stack? Kann ich den so wählen, wie ich oben geschrieben habe? Grüße Steffen
Ist es möglich, dass der Controller Resetet, wenn man auf einen nicht vorhandenen Array zugreift? Sollte zwar nicht der Fall sein, aber wäre evtl. möglich. Bsp: int test[100]; n = 102; test[n] = 0x12; Grüße Steffen
Hi Das kann durchaus passieren wenn du durch den schreibenden Zugriff im Stack herummanipulierst. Sowas nennt sich dann Buffer Overflow. Matthias
Hallo! test[102] = 0x12 würde 0x12 an die 102. Speicherstelle nach dem Beginn des array schreiben... also Startadresse + 202 bytes (int = 2 byte). Was sich dort aber tatsächlich befindet (das array hast du ja nur mit 100 definiert) weiß wohl niemand... kann also durchaus zu nem Fehler führen. mfg
hallo Steffen, sieh mal in den Assembler-Quelltext: in meiner Interrupttabelle waren die Interruptaufrufe mit "rjmp" versehen. Wenn das Programm zu groß wird, wird die Inttable zwar angesprungen aber der intvector wird nicht erreicht (+-2K relative Sprungweite). Den FastAVR-"Compiler", den ich in jedem dritten Posting so hoch lobe, kümmerts sich z.B. nicht darum, wie gros mein Programm wird und ob da die RJMP's in der Tabelle noch reichen... Ich habe da zu fuß "JMP" reingetan, und dann ging alles wieder. Bei mir trat der effekt bei Zeichenemfang auf der UART auf. Gruß Axel
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.