Ich habe ein Arduino due mit touchscreen display EA eDIPTFT43-A verbunden über RS-232 Schnittstelle. Das Display ist im Auto und soll während einer Autofahrt als Bargraph verschiedene Werte zum Beispiel Geschwindigkeit darstellen. Ab un zu, stürzen Arduino und das Display ab. Der Bildschirm wird eingefroren und erst nachdem die Stromversorgung ab- und angeschaltet wird, geht alles wieder. Ich habe ein watchdog in mein Arduino code implementiert aber der hilft nicht. Hat jemand was ähnliches schon gehabt / hat eine Lösung?
needhelp123456 schrieb: > über RS-232 Schnittstelle Du meinst wohl UART / USART. needhelp123456 schrieb: > Ich habe ein watchdog in mein Arduino code implementiert aber der hilft > nicht. Ist der Watchdog richtig konfiguriert? Oder führst du selbst ein Prozessor Reset im Interrupt Handler durch? Sartet dein µC überhaupt neu?
:
Bearbeitet durch User
needhelp123456 schrieb: > Hat jemand was ähnliches schon gehabt / hat eine Lösung? Zeile 42 auskommentieren.
Watchdog müsste eigentlich schon richtig konfiguriert sein... Was meinst du genau mit selber Prozessor Reset durchführen?
Hamster R. schrieb: > Watchdog müsste eigentlich schon richtig konfiguriert sein... na offensichtlich nicht sonst würde das ja funktionieren. Vermutung Der watchdog wird in einer Timer ISR zurückgesetzt und nicht in der Mainloop, oder er wird erst gar nicht gestartet.
:
Bearbeitet durch User
Beitrag #6338194 wurde vom Autor gelöscht.
Ich habe so Watchdog implementiert: #include "advancedFunctions-h" #include "myWdt.h" void setup() { wdt.enable(1000) } void loop() { wdt.restart() }
Hamster R. schrieb: > Ich habe so Watchdog implementiert: > ... > wdt.enable(1000) > ... Ist das jetzt dein Ernst? Sorry, aber da vergeht selbst mir die Lust am helfen. Das ist so als würde ich sagen "mein OS funktioniert nicht" und poste dann:
1 | void main(void) |
2 | {
|
3 | OS.run(); |
4 | }
|
Viel interessanter wäre es zu sehen, wie diese Funktionen implementiert sind...in deiner myWdt.h & myWdt.c Da es um die Config. der WDT Register geht. Weiterhin kann es auch sein, dass deine loop() mit dem WDT.restart() zwar ausgeführt wird, aber dein Code sich durch irgendwelche Bedingungen selbst in der Funktionalität aussperrt und der µC zwar läuft aber dein Code keine Auswirkung mehr hat. z.B. sowas:
1 | bool foo; |
2 | |
3 | void setup() |
4 | {
|
5 | wdt.enable(1000); |
6 | foo = false; |
7 | }
|
8 | |
9 | void loop() |
10 | {
|
11 | wdt.restart(); |
12 | |
13 | if (irgendwas_passiert) |
14 | {
|
15 | foo = true; |
16 | }
|
17 | |
18 | if (!foo) |
19 | {
|
20 | display_ansteuern(); |
21 | }
|
22 | }
|
den Code habe ich von folgenden GitHub bekommen: https://github.com/leomil72/advancedFunctions da sind die zwei Libraries drin die ein Italiener mal erstellt hat, und im zugehörigen Beispiel von ihm war watchdog auch nur so wie ich es geschrieben habe hinzugefügt, daher. Überall wo ich im Internet watchdog Beispiele gesehen habe, war die Implementierung recht ähnlich wie meins... als Beginner weiß ich ja auch nicht wie kompliziert das überhaupt aussehen soll.
Wie kann man denn aber als selbstbekennder Beginner (was ja nicht schlimm ist) gleich mit so 'nem Projekt an den Start gehen? Weil es entsprechende Libs gibt, die ein Italiener mal ins Git gestellt hat? Wo finden wir dein Repositiory, dass wir uns das mal ansehen können? Das kann alles mögliche sein(Spannungsversorgung zB). Selbst wenn der WDT richtig konfigurtiert wäre, würde dein Bildschirm nicht einfrieren, sondern der Arduino ständig neu resetten. Das kann ja auch nicht die Lösung sein. Wurschelt euch doch erstmal mitn paar einfachen Beispeilen durchs Datenblatt des verwendeten Prozessors, damit überhaupt ersteinmal ein Verständnis und eine Beziehung zum Ganzen entsteht.
https://github.com/leomil72/advancedFunctions/blob/master/myWdt.cpp https://github.com/leomil72/advancedFunctions/blob/895dde96121fb793df24017331e281e13f4e8240/myWdt.cpp#L42 es ist tatsächlich zeile 42 ;) sicher das das so stimmt? mal mit dem Datenblatt abgeglichen?
1 | void myWdt::restart() { |
2 | WDT->WDT_CR = 0xA5000001; |
3 | }
|
Axel R. schrieb: > sicher das das so stimmt? mal mit dem Datenblatt abgeglichen? Ja das passt soweit... ABER ich hab da so ein Gefühl, hab das mal als Projekt nachgebastelt und mir die Register im SerialMonitor ausgegeben. Der WDT läuft wirklich nicht, da das WDDIS Bit gesetzt ist und da das Register "Read-write Once" ist, kann man den nachträglich nicht aktivieren. Irgendwo im StartUp Code wird der wohl disabled :-/
:
Bearbeitet durch User
https://www.microchip.com/wwwproducts/en/ATsam3x8e --> "View Datasheet" das scheint ja soweit schonmal zu stimmen. Was sagen deine 3.3Volt im System? gibts nen Schaltplan zum Projekt? Wenn ja, wo?
Adam P. schrieb: > Axel R. schrieb: >> sicher das das so stimmt? mal mit dem Datenblatt abgeglichen? > > Ja das passt soweit... > ABER ich hab da so ein Gefühl, hab das mal als Projekt nachgebastelt und > mir die Register im SerialMonitor ausgegeben. > > Der WDT läuft wirklich nicht, da das WDDIS Bit gesetzt ist und da das > Register "Read-write Once" ist, kann man den nachträglich nicht > aktivieren. > > Irgendwo im StartUp Code wird der wohl disabled :-/ jajaja, GENAU das mein ich aber! Man kann nicht einfach mit'm32bitter umherschießen, wenn man sich nicht mit dem Datenblatt beschäftigt. nebenher: ich finds auch cool, wenn im Auto noch'n kleines Display aus der Armaturenbrettabdeckung klappt und der Sound der elektrischen HochleistungsHupe auswählbar ist (Beispielsweise). Aber: man sollte sich da schon ernsthaft ne Weile mit beschäftigt haben. Dabei liegt die Betonung auf "ernsthaft". Das dauert eben seine Zeit. Um die Frage aus dem Eingangspost zu beantworten: needhelp123456 schrieb: > Hat jemand was ähnliches schon gehabt / hat eine Lösung? Nein - habe ich noch nicht gehabt und leider, bei den rudimentären Informationen, leider auch keine Lösung für dich. Ich tippe auf deine Stromversorgung oder IO (3.3V<->5V)
da ich das für meine Arbeit mache, habe ich wenig Wahl was anderes zu machen... die haben hohe Anforderungen von uns leider ja 0xA5000001 übereinstimmt mit dem Datenblatt
Nun der Watchdog hilft nur wenn aus irgendeinem Grund die Mainloop nicht mehr ausgeführt wird. Das ist im gezeigten Beispiel wohl ziemlich unmöglich.. Der TO hat ein Problem mit der Displayansteuerung also würde ich dort genauer hinschauen.
Ich dachte, wäre ein privates Bastelprojekt. In dem Falle bin ich leider raus. Da scheint dann die Stellenbeschreibung nicht zu deinem Profil zu passen. Ändere das...
Also ich habs teilweise gefunden: C:\Users\*DEIN BENUTZER*\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.8\co res\arduino\main.cpp Zeile 45 (knapp dran an 42) :-D In dem Ordner gibts dann die watchdog.cpp wo watchdogSetup(); als
1 | extern "C" |
2 | void _watchdogDefaultSetup (void) |
3 | {
|
4 | WDT_Disable (WDT); |
5 | }
|
6 | void watchdogSetup (void) __attribute__ ((weak, alias("_watchdogDefaultSetup"))); |
definiert ist. Soweit so gut, aber laufen tut er noch nicht...bin dran :) jetzt störts mich auch, wie können die den WDT pauschal einfach deaktivieren.
LÖSUNG: die oben genannte main.cpp anpassen: Da sinds 3 Sek.
1 | int main( void ) |
2 | {
|
3 | // Initialize watchdog
|
4 | //watchdogSetup();
|
5 | watchdogEnable(3000); |
6 | |
7 | // usw ...
|
8 | }
|
und dann im eigenen Code watchdogReset(); verwenden. Klar kann man das schöner machen, aber das ist nicht meine Aufgabe :-D Gruß
Adam P. schrieb: > LÖSUNG: > die oben genannte main.cpp anpassen: Also ich muss mich etwas korrigieren. Die main.cpp muss nicht angepasst werden! Man muss in seinem Sketch einfach eine watchdogSetup() einfügen, damit überschreibt ihr diese und anstatt der _watchdogDefaultSetup() wird eure aufgerufen. Fertig. WDT Test:
1 | void watchdogSetup(void) |
2 | {
|
3 | watchdogEnable(3000); |
4 | }
|
5 | |
6 | void setup() |
7 | {
|
8 | Serial.begin(115200); |
9 | |
10 | watchdogSetup(); |
11 | |
12 | Serial.println("setup end"); |
13 | }
|
14 | |
15 | void loop() |
16 | {
|
17 | Serial.println("loop begin"); |
18 | |
19 | watchdogReset(); |
20 | |
21 | // WDT Test
|
22 | while(1); |
23 | |
24 | Serial.println("loop end"); |
25 | }
|
:
Bearbeitet durch User
vielen dank schonmal! ich hatte in ein von den früheren versionen meines skriptes watchdogsetup sogar als ovveride des weak funktion drin- hat aber nicht funktioniert, wahrscheinlich wegen dem while (1) was ich nicht hatte. das while (1) ist wohl da um watchdog immer aktiv zu halten oder...?
jaein, das ist einfach nur eine leere endlosschleife. da er da nie rauskommt und somit kein reset macht, schlägt der watchdog zu. kannst auch so schreiben while(1) { // mach nichts } er verlässt die while nie wieder, somit ruft er nie wieder den wdt.reset auf
:
Bearbeitet durch User
da dein watchdog nie funktioniert hat, gehe ich stark davon aus, dass dein code sich mit der zeit aufhängt und deshalb nix mehr geht. das würde ich suchen. den watchdog dafür zu gebrauchen, dass wenn mal was nicht tut einfach mal reset ausführen ist net so schick... wünsche ich mir von keinem auto oder flugzeug ?
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.