Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > > 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 .. > > > <pre> > -------------------------------------------------------------- > 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; > } > > > </pre>