Forum: Mikrocontroller und Digitale Elektronik AVR Reset


von Steffen (Gast)


Lesenswert?

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

von Andy (Gast)


Lesenswert?

Watchdog deaktiviert/reset'ed?

von hans (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

Hi

Das kann durchaus passieren wenn du durch den schreibenden Zugriff im
Stack herummanipulierst. Sowas nennt sich dann Buffer Overflow.

Matthias

von Reinhard Biegel (Gast)


Lesenswert?

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

von AxelR (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.