Forum: Mikrocontroller und Digitale Elektronik Arduino due und EA eDIPTFT3-A Probleme


von needhelp123456 (Gast)


Lesenswert?

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?

von Adam P. (adamap)


Lesenswert?

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
von Nickel (Gast)


Lesenswert?

needhelp123456 schrieb:

> Hat jemand was ähnliches schon gehabt / hat eine Lösung?

Zeile 42 auskommentieren.

von Hamster R. (needhelp123456)


Lesenswert?

Watchdog müsste eigentlich schon richtig konfiguriert sein...

Was meinst du genau mit selber Prozessor Reset durchführen?

von Thomas Z. (usbman)


Lesenswert?

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.
von Hamster R. (needhelp123456)


Lesenswert?

Ich habe so Watchdog implementiert:

#include "advancedFunctions-h"
#include "myWdt.h"

void setup()
{
wdt.enable(1000)
}

void loop()
{
wdt.restart()
}

von Adam P. (adamap)


Lesenswert?

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
}

von myWdt.h (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Axel R. (axlr)


Lesenswert?

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.

von Axel R. (axlr)


Lesenswert?

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
}

von Adam P. (adamap)


Lesenswert?

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
von Axel R. (axlr)


Angehängte Dateien:

Lesenswert?

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?

von Axel R. (axlr)


Lesenswert?

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)

von needhelp123456 (Gast)


Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

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.

von Axel R. (axlr)


Lesenswert?

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

von Adam P. (adamap)


Lesenswert?

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.

von Adam P. (adamap)


Lesenswert?

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ß

von Adam P. (adamap)


Lesenswert?

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
von Hamster R. (needhelp123456)


Lesenswert?

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

von Adam P. (adamap)


Lesenswert?

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
von Adam P. (adamap)


Lesenswert?

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
Noch kein Account? Hier anmelden.