mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Reset


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Watchdog deaktiviert/reset'ed?

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

Autor: Reinhard Biegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AxelR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.