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


von Peter (Gast)


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

von Ralph (Gast)


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.

von Andreas K. (a-k)


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.

von Peter (Gast)


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

von Andreas K. (a-k)


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.

von Ralph (Gast)


Lesenswert?

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

von Just another Peter (Gast)


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...

von Peter (Gast)


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.

von Uhu U. (uhu)


Lesenswert?

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

von Ralph (Gast)


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.

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.