Forum: Mikrocontroller und Digitale Elektronik Watchdog / run time error


von Paule (Gast)


Lesenswert?

Hei Leute,

ich will meinem Mikrocontroller beibringen artig auf eine asynchrone
serielle Nachricht zu warten, und zwar unbegrenzt lang. Leider hab ich
es bis jetzt nie geschaft, dass das Programm stabil laeuft. es
erscheinen immer Fehler wie

Timeout wail waiting for response from target;
unexpected interrupt;
watchdog / run time error;

obwohl ich den Software-WatchDogTimer regelmaessig hitte und der
Hardware-WDT ausgeschaltet hab. Hat jemand von euch eine Idee was ich
verbessern koennte?

1. Was muss ich suchen/einstellen, damit mein Compiler nicht immer
meckert timeout wail waiting for response from target???

2. Warum spricht der WDT trotzdem an, oder hat jemand eine ANDERE
Loesung jeglicher Art fuer dieses Problem, wie man also einen uC auf
eien Nachricht warten lassen kann.

Waere sehr dankbar fuer Hilfe, den ich hock schon ne ganze Weile dran
und nix geht vorwaerts. verzweifle so langsam...

Gruss Paule

//************************************************
int SerEReceive(char *s) {

      static char ch;
      static int j;
      j=0;

      while((ch=serEgetc()) !='\0') //wartet auf Nullstring
                                    //zum Beenden des Empfangs
      {
      VdHitWd(wd);         //WDT wird gehittet(noetig sind alle 15s)

      if(ch!= -1)          //Emfangsfunktion
             {
             s1[j++]=ch;
             }
      }
      s1[j++]='\0';

      return 1;
                        }

//************************************************

von Peter D. (peda)


Lesenswert?

Da ist ja wieder die Kristallkugel gefragt:

Ich vermute mal, serEgetc() endet erst, nachdem ein Zeichen im Puffer
gelandet ist.

D.h. Dein Watchdog wird nie getriggert, wenn nichts ankommt.

Schalte ihn doch einfach ab, da Du ihn eh nicht gebrauchst.


Alternativ sollte es auch ne Funktion geben, die immer zurückkehrt und
im Returnwert signalisiert, ob ein Zeichen im Puffer ist oder nicht.


Peter

von Paule (Gast)


Lesenswert?

OK vielen Dank Peter, hattest Recht mit der Funktion SerEgetc(). hab das
problem geloest, indem ich die Bibliothek von SerEgetc veraendert hab.

Ich haette aber noch ne andre Frage, die bei mir aufgekommen ist.
Man kann ja die Buffer-Groesse des Eingangs angeben(ich habe zum Bsp.
255 Byte) angegeben. Die Bufferrung muss nach meinem Verstaendnis ja
rein hardwaretechnisch geschehen, da ich ja zum Bsp. bei angehaltenem
Programm kurz mal Daten in den Eingang schicken kann und dann viel
spaeter diese Abrufen kann.
Weiss jemand ob das wirklich rein hardwaretechisch geschieht(dann
muessten ja 255 HardwareSpeicher in meinem uC eingebaut sein. ist das
Realistisch??? Hoert sich viel an oder???
Oder weiss jemand wie das (wirklich) funktioniert, habe in den
Unterlagen nichts dergleichen gefunden.
Waere net wenn einer das posten koennte.

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.