Re: Watchdog Kategorie: Programmierung (von GPL - 29.09.2009 22:55) | ||
Als Antwort auf Re: Watchdog von nitraM - 29.09.2009 15:35 | ||
| ||
Hallo nitraM! > Welche Version von PCF8583 nutzt du??? > > > nitraM Die letzte V1.55! Ich fahre immer nur mit den letzten Updates!!! Schau Dir mal die init -Funktion an. Da werden die Uhrenchip-Register 0 und 8 nur initialisiert wenn der watchdogtimeout ungleich 0 ist. Also die 1. Variante mit dem thread. Wenn watchdogtimeout 0 ist, werden die Uhrenchip-Register 0 und 8 weder von dieser noch von einer anderen Funktion initialisiert! Da liegt der Hund begraben! /*************************************/ /* PCF8583 initialisieren */ /*************************************/ function init(byte A0,byte setCC2clock, byte autosync, byte watchdogtimeout, byte enableHostKey) returns byte // watchdogtimeout = 0 bis 99 (sec.) {byte reg; if watchdogtimeout>99 timeout=99; else timeout=watchdogtimeout; // device=((A0!=0) and 0b10) or 160; device=Addr[(A0!=0) and 1]; if i2c.cstart(device) { i2c.write(0x00); i2c.start(device or 1); reg=i2c.readlast() and 0x05; i2c.cstop(); i2c.start(device); i2c.write(0x00); i2c.write(0x04 and (watchdogtimeout!=0)); if watchdogtimeout { i2c.cstop(); i2c.start(device); i2c.write(0x08); i2c.write(0x4A); } i2c.stop(); if setCC2clock synccc2(); if autosync run sync; enHostKey=enableHostKey!=0; if timeout run watchdog; if reg==0x05 return 0x80; //= Reset durch Watchdog verursacht else return 0xFF; } i2c.stop(); return 0; } Ich glaube jetzt auch eine Möglichkeit gefunden zu haben, warum es bei Dir trotzdem funktioniert: 1.) Man bekommt einen neuen PCF-Baustein geliefert. Da sind natürlich alle Register auf 0. 2.) Da dieser PCF-Baustein eigentlich nur Sinn macht, wenn man ihn mit einer Batterie, GoldCup o.ä. puffert, bleiben die Registerinhalte auch erhalten. 3.) Natürlich möchte man ihn testen. Deswegen nimmt man das Testprogramm von Andre Helbig. 4.) Wenn man das so wie es ist startet, wird die 1. Variante mit dem thread ausgeführt. 5.) Es funktioniert perfekt, da ja bei dieser Variante die Uhrenregister richtig gesetzt werden! 6.) Wenn man jetzt ein eigenes Programm macht, wird das auch in der Variante 2 ohne thread funktionieren, weil die Uhrenregister durch die Pufferung des RAM ja richtig gesetzt sind!!! 7.) Wenn man Glück hat und die gesetzten Uhrenregister nicht ändert, wird man nie einen Fehler bemerken. 8.) Der Haken kommt allerdings, wie bei mir, wenn man ein unbenutztes Modul verwendet. 9.) Ich musste den Chip in einem Modul tauschen und habe noch 2 neue gehabt. 10.) Plötzlich funktionierten meine Watchdogprogramme, alle mit Variante 2 ohne thread programmiert, mit keinem der neuen Module mehr und ich war am verzweifeln. 11.) Auch Andre hat den Bug wahrscheinlich beim Erstellen des Testprogrammes nicht bemerkt, da er auch sicherlich ein gepuffertes RAM verwendet hat! 12.) Meine bereits gepostete �nderung in der setWDtimeout Funktion hat für mich die Lösung gebracht! Alle meine Watchdog-Programme funktionieren auf einmal wieder! Gruss GPL | ||
Antwort schreiben Antworten: Re: Watchdog (von nitraM - 30.09.2009 10:57) |