| das mit dem senden des programms ist so ne sache, wir haben über 10 module mit etlichen funktionen. Einige module dürfen wir aus lizenzrechtlichen gründen nicht veröffentlichen. Aber wir versuchen die wichtigsten teile zu schicken.
 
 Das Programm realisiert (oder soll es zumindest) ein Zugangskontrollsystem für mehrere Türen. Dazu wird eine usertabelle mit pin rechten usw verwaltet. Die identität wird über einen Fingerprint-sensor bestätigt.
 
 Das Problem tritt auf wenn das system ohne äu�ere einwirkung lange zeit (einige stunden) verbleibt. Dabei läuft der watchdog thred, der keyb thred und im main-teil wird periodisch watchdog.safetime aufgerufen.
 
 Wenn du uns helfen könntest, müssten wir uns nicht aus verzweiflung umbringen !!?
 
 gruss ..
 
 
 
 
--------------------------------------------------------------das modul fiu_var:
 --------------------------------------------------------------
 //variablen für alle module
 //
 //matthias siemÃ?   rico körner
 //28.05.2000
 
 
 const ok=1;     //rückgabe alles ok
 const err=0;    //rückgabe fehler
 const timeout=2;//rückgabe zeitüberschreitung
 const esc=3;    //rückgabe * für esc gedrückt
 
 const waittime=20; //wartezeit auf tastendruck in sec
 //für das menü und die menüfunktionen
 
 
 byte usertab[1000*8]; //cache für die UserTabelle (chip 2)
 //zur beschleunigung der zugriffe
 
 byte superpin[12];    //nimmt superpin für administratorzugang
 //ohne FP auf
 
 //------------------------------------------------------------
 // Türtabelle
 //
 
 //existenzbyte
 //jedes bit steht für eine Tür 1=existiert 0=existiert nicht
 const tueren=0b11111001;
 //bit 2 und 3 sind gesperrt (von swcom benutzt)!!!
 
 const tuer1="R 317";
 //const tuer2="-2-";  für swcom benutzt
 //const tuer3="-3-";  für swcom benutzt
 const tuer4="-4-";
 const tuer5="-5-";
 const tuer6="-6-";
 const tuer7="-7-";
 const tuer8="-8-";
 
 
 byte perm_open;  //sichert welche tür permanennt offen ist
 //wird bei reset auf 0 gesetzt
 
 
 --------------------------------------------------------------
 das main-modul:
 --------------------------------------------------------------
 
 
 thread main
 {
 //bei start keine tür permanent offen
 fiu_var.perm_open=0;
 
 //ports auf 0 setzten
 ports.setb(1,0);
 //für swcom benötigte ports deaktivieren
 ports.deact(9);
 ports.deact(10);
 
 //anzeige initialisieren
 lcdext.init();
 
 //zeit auf zuletzt gesicherten wert setzen
 watchdog.recalldata();
 
 keyb.keywert=255;
 run keyb.keyb2;      //tastaturüberwachung starten
 
 run watchdog.watchdog;  //wachhund starten
 
 //testen ob fiu ok
 funktion.testfiu();
 
 //-------------------------------------------
 //   Superpin festlegen
 //
 fiu_var.superpin[0]=1;
 fiu_var.superpin[1]=2;
 fiu_var.superpin[2]=3;
 fiu_var.superpin[3]=4;
 fiu_var.superpin[4]=5;
 fiu_var.superpin[5]=6;
 fiu_var.superpin[6]=7;
 fiu_var.superpin[7]=8;
 fiu_var.superpin[8]=9;
 fiu_var.superpin[9]=0;
 fiu_var.superpin[10]=1;
 fiu_var.superpin[11]=2;
 
 string z;
 int lastsec;
 
 lcdext.clear();
 lcdext.line2();
 lcdext.print("Please enter PIN");
 
 while 1
 {
 if lastsec!=system.second()
 {
 z="";
 str.putintf(z,system.hour(),2);
 z=z+':';
 str.putintf(z,system.minute(),2);
 z=z+':';
 str.putintf(z,system.second(),2);
 z=z+' ';    z=z+' ';    z=z+' ';
 str.putintf(z,system.day(),2);
 z=z+'.';
 str.putintf(z,system.month(),2);
 
 lcdext.home();
 lcdext.print(z);
 lastsec=system.second();
 }
 watchdog.safetime(); //ich lebe noch
 
 if keyb.keywert != 255
 {
 if keyb.keywert<10   zugang.zugang();
 keyb.keywert=255;
 
 lcdext.clear();
 lcdext.line2();
 lcdext.print("Please enter PIN");
 }
 }
 quit 1;
 }
 
 das modul keyb:
 -------------------------------------------------------------------
 byte keychar;
 byte keywert;
 
 
 //-----------
 thread keyb2
 //-----------
 { int x;
 while 1  {  if ports.adc(7)<900 break;  else sleep 125; }
 sleep 80;
 x=ports.adc(7);
 keychar=0;
 keywert=255;
 if x<875 if x>860 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x33; keywert=3;}//3
 if x<810 if x>795 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x36; keywert=6;}//6
 if x<740 if x>725 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x39; keywert=9;}//9
 if x<675 if x>660 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x23; keywert=200;}//#
 if x<605 if x>590 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x32; keywert=2;}//2
 if x<535 if x>520 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x35; keywert=5;}//5
 if x<465 if x>450 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x38; keywert=8;}//8
 if x<395 if x>380 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x30; keywert=0;}//0
 if x<320 if x>305 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x31; keywert=1;}//1
 if x<245 if x>230 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x34; keywert=4;}//4
 if x<170 if x>155 { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x37; keywert=7;}//7
 if x<90 if x>75   { plm.beep(1500); sleep 25; plm.beep(-1); keychar=0x2A; keywert=100;}//*
 sleep 125;
 }
 
 
 das modul watchdog:
 -------------------------------------------------------------------
 /* watchdog & safetime
 * watchdog:
 * überwacht das system,
 * bei 1 min keine reaktion -> system aufgehängt => reset
 *
 * safetime:
 * periodisch vom haupttask aufgerufen
 * sichert in 10 min intervallen die Zeit im EEPROM
 * registriert aktivität des haupt tasks
 *
 * matthias siemÃ?     rico körner
 * 28.05.2002  */
 
 long livingcount;  //zeitpunkt (timer nicht uhr) ab dem
 //das programm als aufgehängt betrachtet wird
 
 int min_lastsafe;
 int day_lastcheck; //tag der letzten prüfung
 
 byte verriegelung; //watchdog soll safetime nicht unterbrechen!
 
 
 thread watchdog
 {
 capture verriegelung;
 long l;
 l=system.timer();
 if ((l & 0xFFFF0000)shr 16) - ((livingcount & 0xFFFF0000) shr 16) >1
 or ((l & 0xFFFF0000)shr 16) - ((livingcount & 0xFFFF0000) shr 16) < -0xFFFE
 {
 quit -1;
 }
 release;
 sleep 250;
 }
 
 
 //überprüft die usertab und entfernt einträge die länger als
 //5 monate nicht benutzt wurden
 function check()
 {
 int i,ii;
 
 //zum löschen benötigte rücksetzwerte
 byte puffer[8];
 puffer[7]=system.month();
 puffer[0]=0;
 puffer[1]=0;
 puffer[2]=0xFF;
 puffer[3]=0xFF;
 puffer[4]=0xFF;
 puffer[5]=0xFF;
 puffer[6]=0xFF;
 
 //meldung ausgeben
 lcdext.clear();
 lcdext.print("AUTO CHECK ...");
 lcdext.line2();
 
 //löschen aller alten einträge
 i=0;
 while i<1000
 {
 //vergleich
 ii=fiu_var.usertab[(i*8)+7];
 ii=ii+5;     //+anzahl der Monate
 if ii>12 ii=ii-12;
 if fiu_var.usertab[(i*8)+2]!=0xFF and ii==system.month()
 {
 fium.FIUClearIndex(i);
 
 //speichern im eeprom
 for ii=0 ... 7   {  eeprom.writebyte(2,(i*8)+ii,puffer[i]);  }
 
 //speichern im ram durch auslesen aus eeprom
 for ii=0 ... 7
 {
 eeprom.readbyte(2,(i*8)+i);
 fiu_var.usertab[(i*8)+i]=eeprom.buf;
 }
 }
 i=i+1;
 if i==1000 {break;}
 }
 }
 
 
 
 //sichert die aktuelle zeit in 10 min abständen
 //registriert lebenszeichen des hauptprozesses
 function safetime()
 {
 capture verriegelung;
 //täglich 1 mal check
 if day_lastcheck!=system.day()
 {
 check();
 day_lastcheck=system.day();
 }
 
 livingcount=system.timer();  //counter speichern
 
 //zeit alle 10 min sichern
 if system.minute()-min_lastsafe > 10 or system.minute()-min_lastsafe < 0
 {
 // --------------------------------
 //aktuelles Datum & Zeit sichern
 //
 eeprom.writebyte(1,0,system.day() & 0x00FF);
 eeprom.writebyte(1,1,(system.day() & 0xFF00) shr 8);
 
 eeprom.writebyte(1,2,system.month() & 0x00FF);
 eeprom.writebyte(1,3,(system.month() & 0xFF00) shr 8);
 
 eeprom.writebyte(1,4,system.year() & 0x00FF);
 eeprom.writebyte(1,5,(system.year() & 0xFF00) shr 8);
 
 eeprom.writebyte(1,6,system.hour() & 0x00FF);
 eeprom.writebyte(1,7,(system.hour() & 0xFF00) shr 8);
 
 eeprom.writebyte(1,8,system.minute() & 0x00FF);
 eeprom.writebyte(1,9,(system.minute() & 0xFF00) shr 8);
 min_lastsafe=system.minute();
 }
 release;
 }
 
 
 //holt gesicherte zeit und setzt sie im system
 //kopiert die user-tablle in fiu_var.usertab
 function recalldata()
 {
 int i[3];  //zwischenspeicher
 
 //meldung ausgeben
 lcdext.clear();
 lcdext.print("RESTART!!!");
 lcdext.line2();
 lcdext.print("Please wait ...");
 
 //---------------------------------------------
 //User-tab kopieren
 //
 
 for i[1]=0 ... ((1000*8)-1)
 {
 eeprom.readbyte(2,i[1]);
 fiu_var.usertab[i[1]]=eeprom.buf;
 }
 
 
 // --------------------------------
 //aktuelles Datum & Zeit aus eeprom lesen und im
 //System setzen
 //
 
 eeprom.readbyte(1,0);
 i[0]=eeprom.buf;
 eeprom.readbyte(1,1);
 i[0]=i[0]+ 0x0100*eeprom.buf;
 
 eeprom.readbyte(1,2);
 i[1]=eeprom.buf;
 eeprom.readbyte(1,3);
 i[1]=i[1]+ 0x0100*eeprom.buf;
 
 eeprom.readbyte(1,4);
 i[2]=eeprom.buf;
 eeprom.readbyte(1,5);
 i[2]=i[2]+ 0x0100*eeprom.buf;
 
 system.setdate(i[2],i[1],i[0]);
 
 day_lastcheck=i[0];
 
 eeprom.readbyte(1,6);
 i[0]=eeprom.buf;
 eeprom.readbyte(1,7);
 i[0]=i[0]+ 0x0100*eeprom.buf;
 
 eeprom.readbyte(1,8);
 i[1]=eeprom.buf;
 eeprom.readbyte(1,9);
 i[1]=i[1]+ 0x0100*eeprom.buf;
 
 system.settime(i[0],i[1],0);
 
 min_lastsafe=i[1];
 
 lcdext.clear();
 }
 
 das modul eeprom:
 ---------------------------------------------------------------
 // Modul zum zugriff auf I^2C BUS Speicher
 byte buf;   //nimmt empfangenes Byte auf
 
 
 //ein byte aus einem Speicher lesen
 //Rückgabe 0=OK oder -1=ERROR
 function readbyte(int speicher,int address) returns int
 {
 int i; //Zähler
 byte addr[2]; //nimmt speicheradresse auf
 
 byte spnr; //nimmt adresse des Speicherbausteins auf
 
 //adresse in adr kopieren
 //addr[2] enthält high-teil
 //addr[3] enthält low-teil
 mem.putint(addr,0,address);
 
 //warten auf sendebereitschaft am IIC Bus
 for i=0 ... 255
 {
 if i2c.ready()==-1 break;
 if i==254 return -1;
 }
 
 //speichernummer in spnr schreiben
 if speicher==1 spnr=0b10100000;
 if speicher==2 spnr=0b10100010;
 if speicher==3 spnr=0b10100100;
 if speicher==4 spnr=0b10100110;
 
 //start mit schreibbefehll
 //um die adresse dem EEPROM mitzuteilen
 for i=0 ... 255
 {
 if i2c.start(spnr)==-1 break;
 if i==254 return -1;
 }
 i2c.write(addr[0]);
 i2c.write(addr[1]);
 
 //stop generieren und lesen anfordern
 i2c.stop();
 for i=0 ... 255
 {
 if i2c.start(spnr+1)==-1 break;
 if i==254 return -1;
 }
 buf=i2c.readlast();
 
 i2c.stop();
 return 0;
 }
 
 
 //ein byte in einem Speicher schreiben
 //Rückgabe 0=OK oder -1=ERROR
 function writebyte(int speicher,int address,byte wert) returns int
 {
 int i;         //Zähler
 byte addr[2]; //nimmt speicheradresse auf
 
 byte spnr; //nimmt adresse des Speicherbausteins auf
 
 //adresse in adr kopieren
 //addr[2] enthält high-teil
 //addr[3] enthält low-teil
 mem.putint(addr,0,address);
 
 //warten auf sendebereitschaft am IIC Bus
 for i=0 ... 255
 {
 if i2c.ready()==-1 break;
 if i==254 return -1;
 }
 
 //speichernummer in spnr schreiben
 if speicher==1 spnr=0b10100000;
 if speicher==2 spnr=0b10100010;
 if speicher==3 spnr=0b10100100;
 if speicher==4 spnr=0b10100110;
 
 //start mit schreibbefehll
 //um die adresse dem EEPROM mitzuteilen
 for i=0 ... 255
 {
 if i2c.start(spnr)==-1 break;
 if i==254 return -1;
 }
 i2c.write(addr[0]);
 i2c.write(addr[1]);
 i2c.write(wert);
 
 i2c.stop();
 return 0;
 }
 
 
 
 |