Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Watchdog Kategorie: Programmierung (von GPL - 29.09.2009 22:55)
Als Antwort auf Re: Watchdog von nitraM - 29.09.2009 15:35
Ich nutze:
C-Control II Station, OSOPT V3.1
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)