Hallo, ich habe ein Display mit o.g. Chip per SPI an meine MCU PIC32MZ angeschlossen. MISO ist nicht angeschlossen, es kann also nur ins Display geschrieben werden. Wenn ich das Datenblatt richtig verstanden habe, kann der Chip maximal 15 MHz SPI Takt. Größere Datenmengen werden per DMA-SPI zum Display geschaufelt. Kleine Steuerbefehle via normal SPI. Bei 10 MHz läuft alles sauber. Wenn ich 20 MHz SPI Frequenz oder größer einstelle, kommt es sporadisch nach Sekunden/Minuten zum Reset der MCU. Warum ist das so ? Ich hätte erwartet, dass das Display eben nicht mehr funktioniert, aber warum schmiert die MCU ab ? Es kommen ja keine Daten vom Display zurück, die falsch sein könnten.
Dirk F. schrieb: > Auszug aus dem Datenblatt. Fehlende Abblockkondensatoren vielleicht? Gibt der PIC einen Grund für den Reset an? LG, Sebastian
Sebastian W. schrieb: > Fehlende Abblockkondensatoren vielleicht? Sind an der MCU vorhanden. 100nF || 10nF pro Versorgungspaar. > Gibt der PIC einen Grund für den Reset an? Ja, WDT Reset. Ist auf 2 Sekunden eingestellt.
Dirk F. schrieb: > Ja, WDT Reset. Ist auf 2 Sekunden eingestellt. Nun, dann wird die Funktion, die Du verwendest, um den WD ruhigzustellen, wohl nicht mehr aufgerufen. Ich denke, der Fehler liegt in der Schleif in Zeile 42.
Dirk F. schrieb: > Ich hätte erwartet, dass das Display eben nicht mehr funktioniert, aber > warum schmiert die MCU ab ? Eine CPU schmiert nicht einfach so ab. Sie führt eine Exception oder ein Reset aus. Der Grund läßt sich dann in den entsprechenden Registern auslesen. Am einfachsten setzt man dazu entsprechende Breakpoints und läßt sich die Register im Debugger anzeigen.
Peter D. schrieb: > Eine CPU schmiert nicht einfach so ab. Sie führt eine Exception oder ein > Reset aus. Der Grund läßt sich dann in den entsprechenden Registern > auslesen. Am einfachsten setzt man dazu entsprechende Breakpoints und > läßt sich die Register im Debugger anzeigen. Er zeigt nach dem Reset 7 an:
1 | //... perform application specific startup tasks
|
2 | // next, check the cause of the Reset
|
3 | debug[4] = 1; |
4 | |
5 | if(RCON & 0x0003) |
6 | {
|
7 | // execute a Power-on Reset handler
|
8 | debug[4] = 2; |
9 | }
|
10 | if(RCON & 0x0002) |
11 | {
|
12 | // execute a Brown-out Reset handler
|
13 | debug[4] = 3; |
14 | }
|
15 | if(RCON & 0x0080) |
16 | {
|
17 | // execute a Master Clear Reset handler
|
18 | debug[4] = 4; |
19 | }
|
20 | if(RCON & 0x0040) |
21 | {
|
22 | // execute a Software Reset handler
|
23 | debug[4] = 5; |
24 | }
|
25 | if (RCON & 0x0200) |
26 | {
|
27 | // execute a Configuration Mismatch Reset handler
|
28 | debug[4] = 6; |
29 | }
|
30 | if (RCON & 0x0010) |
31 | {
|
32 | // execute Watchdog Time-out Reset handler
|
33 | debug[4] = 7; |
34 | }
|
Dirk F. schrieb: > Ja, WDT Reset. Ist auf 2 Sekunden eingestellt. Na dann hängst Du in einer Schleife fest.
Peter D. schrieb: > Na dann hängst Du in einer Schleife fest. Ja bestimmt. Aber warum geht es bei 10 MHz ?
Dirk F. schrieb: > Aber warum geht es bei 10 MHz ? Irgendwas ist zu schnell fertig und Du machst irgendwas zu spät. Oftmals ist ein Fehler in der Reihenfolge von Zugriffen die Ursache. Du kannst ein Timeout aufsetzen, das kürzer als der Watchdog ist und mit dem Watchdog rücksetzen. Im Timerinterupt gibst Du dann die Adresse auf dem Stack aus, d.h. die von ihm unterbrochen wurde.
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.