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?
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.
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
voidmain(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:
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.
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 :-/
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
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.
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:
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
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 ?