mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2148 - macht immer wieder einen RESET!


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mein LPC2148 führt immer wieder einen ungewollten RESET aus! Aber nur 
WARUM?????? Ich kann das irgendwie nicht nachvollziehen!!

Der LPC2148 ist wie folgend konfiguriert:
- USB (2x IN EP BULK, 1x OUT EP BULK)
- 1x Timer0 mit Toggle-Funktion (2MHz)
- 1x Timer1 mit Toggle-Funktion (100kHz)
- 1x PWM -> habe ich missbraucht -> soll als stoppuhr funktionieren.
- AD-Converter Eingang

Nur das USB hat eine Interrupt routine. Alle anderen laufen im 
Hintergrund (Timer 0 & 1) oder werden gepollt ( PWM & AD)

Nun beim Start werden alle initialisiert. Die Kommunikation über USB 
findet sofort statt (1. EP IN & 1. EP OUT). Timer0 und 1 werden 
gestartet.

Während einer Messung werden Stoppuhr und AD gestartet und Timer0 & 1 
gestoppt. Wenn die Messung fertig ist, werden Stoppuhr und AD wieder 
gestoppt und Timer0 & 1 gestartet. Messdaten (8kByte) werden über 2. EP 
IN zum PC übertragen.

Wenn ich jetzt eine kontinuierliche Messungen durchführen will, dann 
läuft es eine Weile, und der Kontroller wird einfach und ungewollt 
resetet!!

Nach einigen Tests konnte ich das Problem etwas eingrenzen.
1. Läuft keine Messung. USB Kommunikation (1.EP IN & 1.EP OUT),Timer0 & 
1 laufen -> KEIN RESET.

2. Messung Läuft. USB Kommunkation (2. EP IN - Messdaten), Timer0 & 1 
immer gestoppt -> KEIN RESET.

3. Messung Läuft. USB Kommunkation (2. EP IN - Messdaten), Timer0 oder 1 
gestartet -> RESET.


Wie kann es passieren, dass ein Kontroller einfach einen RESET 
durchführt!


Gruß
Peter

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. pointer auf eine Adresse außerhalb des vorhandenen Ram, Rom.
2. pointer auf adresse 0x0000
3. nicht configurierter Interrupt
4. Falls ins Assembler programmiert ein falscher, oder in der Situation 
ungültiger Befehl  (Ein C-Compiler weiß so etwas und macht den Fehler 
nicht)
5. ............

Hast du einen JTAG ?
Wenn nicht, dann besorg dir einen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal wäre zu klären, ob er tatsächlich einen Reset macht, oder ob er 
einfach nur nach 0 springt. Lässt sich am Initialisierungszustand der 
Peripherie erkennen, bei Reset ist die frisch, beim Sprung nach 0 schon 
initialisiert.

Und wenn sich das dann wie meist als Sprung nach 0 herausstellt, dann 
hast du die ehrenvolle aber manchmal recht anspruchsvolle Aufgaben 
gewonnen, herauszufinden wo er die Sprungadresse im RAM überschreibt. 
Meist ist das eine Return-Adresse auf dem Stack, die irgendwelchen zu 
klein dimensionierten lokalen Variablen im Weg steht. Oder ein zu klein 
dimensionierter Stack.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke.

@Andreas:
du hast Recht, es ist kein RESET, es ist wahrscheinlich ein Sprung nach 
0.
Alle Variablen werden zwar zurückgesetzt (darauf habe ich immer 
geachtet), aber die Peripherie sind noch initialisiert.

>>>>Meist ist das eine Return-Adresse auf dem Stack, die irgendwelchen zu
klein dimensionierten lokalen Variablen im Weg steht.<<<
Was meinst du mit "..zu klein dimensionierten lokalen Variablen..."

>>>>Oder ein zu klein dimensionierter Stack.<<<<<
Kann der Stack erweitert/vergrössert werden?


@Ralph
- C-Compiler
- JTAG vorhanden
- Interrupts configuriert , geprüft.

>>>>1. pointer auf eine Adresse außerhalb des vorhandenen Ram, Rom.<<<<
>>>>2. pointer auf adresse 0x0000<<<<
würde der C-Compiler das tun?


Gruß
Peter

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote:

> Was meinst du mit "..zu klein dimensionierten lokalen Variablen..."

char temp[15];
strcpy(temp, "Hans-Heinrich Oskar von Langenamen");

> Kann der Stack erweitert/vergrössert werden?

Frag deinen Compiler/Entwicklungsumgebung. Meine Glaskugel streikt grad.

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann setz einen Breakpoint auf den Resetvektor, und sieh nach von wo auf 
diesen Vektor gesprungen wird.

Autor: Just another Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
möglicherweise ist es ein data- oder prefetch-abort. d.h. entweder zu 
hohe taktfrequenz der cpu oder mieser speicherzugriff (unaligned oder 
die adresse ist ungenutzt). hat der 2148 einen MAM? wenn ja, dann 
schalte den probeweise mal aus...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

@Ralph:
>>Dann setz einen Breakpoint auf den Resetvektor, und sieh nach von wo auf
>>diesen Vektor gesprungen wird.

habe ich getan. Ich kann zwar sehen wohin gesprungen wird, aber wie kann 
ich sehen von wo gesprungen wurde?
Er springt an die Adresse 0 und von dort an 0x00000040 (Reset_Handler).

@Peter:
>>möglicherweise ist es ein data- oder prefetch-abort.
wenn data- oder prefetch-abort wäre, dann müsste doch in die zugehörige 
IRQ-routine gesprungen wird!! Das tut er aber nicht!

>>hat der 2148 einen MAM? wenn ja, dann schalte den probeweise mal aus...
er hat einen MAM. Ich habe ausgeschaltet -> hilft leider nicht.

@Kaiser:
>>Kann der Stack erweitert/vergrössert werden?
>>Frag deinen Compiler/Entwicklungsumgebung. Meine Glaskugel streikt grad.

Es ist das µVision von Keil.
Ich habe den Stack verdoppelt -> hat leider auch nicht geholfen.



Es ist wie ein Geist, überall und nirgendwo!
noch was: Wenn es passiert, da befindet er sich gerade im 
Interrupt-Mode.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tritt der Effekt auch auf, wenn du den Code in einen Simulator lädtst?

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

Sieh dir das Linkeregister an (LR register 13 oder 14). Dieser Reset ist 
mit einem IRQ vergleichbar. Und in diesem Register steht die Adresse an 
der nach der IRQ behandlung der Rücksprung erfolgt.
Achte jedoch darauf das diese Adresse um die größe der Prozessor 
PIPELINE zu groß sein kann.

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.