
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo, Ich habe ein PCF8583 ,mit backup accu, an CC1 M-unit. Benutze multitreiber von CC-Tools. Benutze PCF8583.bas von CC-Tools ohne WD. (siehe unten) Program bleibt im den Sleife #secloop von #syncCC1 warten. Wenn ich bei "if datalo=wert then goto secloop" auskommentiere dann lauft Program. Wenn ich als Test versuche ein register zu lesen mit: sys RdWordBReg,2,PCF8583addr 'Sekunde & Minute lesen data=pop second=(datalo shr 4)*10 + (datalo and &hF) minute=(datahi shr 4)*10 + (datahi and &hF) print datalo,datahi bekomme ich immer "0" Was mache ich falsch? Benno '-------------------------------------------------------------- 'Ansteuereungsbeispiel für I²C-Bus-Multitreiber "int_i2c.s19" 'Ansteuerung des PCF8583 der Schaltungen ' PCF-UHR-WD und PCF-RTC-EEPROM 'CCTools 2004 cctools.hs-control.de (11.11.2004) '-------------------------------------------------------------- '-------------------------------------------------------------- 'Einsprungadressen von "int_i2c.s19" Release 19.09.04 '-------------------------------------------------------------- ' PCF8574: define PCFwrite &h101 define PCFread &h107 '-------------------------------------------------------------- ' Bausteine mit Byte-Adress-Register define WrByteBReg &h123 define WrWordBReg &h12F define RdByteBReg &h15C define RdWordBReg &h162 '-------------------------------------------------------------- ' Bausteine mit Word-Adress-Register define WrByteWReg &h139 define WrWordWReg &h141 define RdByteWReg &h16D define RdWordWReg &h175 '-------------------------------------------------------------- ' PCFLCD: define putCmd8Bit &h1a9 define putCmd &h17D define putChar &h1a3 define prnLCD &h1C2 '-------------------------------------------------------------- define pop DA[1] 'Trick zum Auslesen des Stacks(siehe ccintern.dharlos.de) define wert Byte[1] define data word[2] define datalo byte[3] define datahi byte[4] define WDtimeout 20 ' Watchdogtimeout in Sekunden define PCF8583addr 162 ' Adresse des PCF8583 define RAMyearAddr &h10 ' Speicheradresse für Jahreszahl define PCF8583Delay &h15' Verzögerung in Huntertstel, BCD-Kodiert #initRTC sys PCFread,PCF8583addr or 1 ' Abfrage Statusregister wert = pop 'Statusregister. Wert=5 : Reset durch Watchdog 'Die Aktivierung und das regelmäßige Zurücksetzen 'des Watchdogs betrifft nur die Schaltung PCF-Uhr-WD (#1083), 'nicht aber PCF-RTC-EEProm (#1084). Die WD-Zeilen 'können dann auskommentiert werden. sys WrByteBReg,4,0,PCF8583addr ' Watchdog aktivieren sys WrByteBReg,&h4A,8,PCF8583addr ' Watchdog aktivieren gosub resetWD 'Watchdogtimer zurücksetzen 'gosub syncCC1 'CC1-Uhr mit PCF8583-Zeit syncronisieren sys WrByteBReg,0,0,PCF8583addr #loop sys RdWordBReg,2,PCF8583addr 'Sekunde & Minute lesen data=pop second=(datalo shr 4)*10 + (datalo and &hF) minute=(datahi shr 4)*10 + (datahi and &hF) print datalo,datahi put 12 gosub printdate : print gosub printtime : print print "Menü: Leertaste drücken ..."; sys RdWordBReg,2,PCF8583addr 'Sekunde & Minute lesen data=pop print datalo,datahi data=timer #timerloop if rxd then goto menu if timer-49 gosub resetWD goto loop #menu gosub syncPCF8583 'CC1-Uhr mit PCF8583 syncronisieren put 12 print "1 - Uhrzeit stellen" print "2 - Datum stellen" print "3 - Absturz simulieren" print "4 - Watchdog deaktivieren & Programm beenden" print "0 - Menü verlassen" gosub getvalue wert=wert-&h30 on wert goto endmenu,settime,setdate,absturz,ende goto menu #endmenu goto loop #settime put 12 print "Uhrzeit stellen:" gosub printtime put 13 #enterhourhi gosub getvalue if (wert-&h30)>2 then goto enterhourHi put wert datalo=(wert-&h30)*10 if datalo=2 then datahi=3 else datahi=9 #enterhourlo gosub getvalue if (wert-&h30)>datahi then goto enterhourLo put wert datalo=datalo + (wert-&h30) hour=datalo put &h3A #enterminutehi gosub getvalue if (wert-&h30)>5 then goto enterMinuteHi put wert datalo=(wert-&h30)*10 #enterminutelo gosub getvalue if (wert-&h30)>9 then goto enterMinuteLo put wert datalo=datalo + (wert-&h30) minute=datalo put &h3A #entersecondhi gosub getvalue if (wert-&h30)>5 then goto enterSecondHi put wert datalo=(wert-&h30)*10 #entersecondlo gosub getvalue if (wert-&h30)>9 then goto enterSecondLo put wert datalo=datalo + (wert-&h30) second=datalo print "Uhrzeit übernehmen (1) / Neueingabe(0)" gosub getvalue wert=wert-&h30 if wert=1 then goto menu goto settime #setdate put 12 print "Datum stellen:" gosub printdate put 13 #enterdayhi gosub getvalue if (wert-&h30)>3 then goto enterDayHi put wert datalo=(wert-&h30)*10 if datalo=3 then datahi=1 else datahi=9 #enterdaylo gosub getvalue if (wert-&h30)>datahi then goto enterDayLo put wert datalo=datalo + (wert-&h30) day=datalo put &h2E #entermonthhi gosub getvalue if (wert-&h30)>5 then goto enterMonthHi put wert datalo=(wert-&h30)*10 if datalo=1 then datahi=2 else datahi=9 #entermonthlo gosub getvalue if (wert-&h30)>datahi then goto enterMonthLo put wert datalo=datalo + (wert-&h30) month=datalo put &h2E #enteryearhi gosub getvalue if (wert-&h30)>5 then goto enterYearHi put wert datalo=(wert-&h30)*10 #enteryearlo gosub getvalue if (wert-&h30)>9 then goto enterYearLo put wert datalo=datalo + (wert-&h30) year=datalo put 9 print "DOW: "; #enterDOW gosub getvalue if (wert-&h30)>6 then goto enterDOW put wert dow=wert-&h30 print "Datum übernehmen (1) / Neueingabe(0)" gosub getvalue wert=wert-&h30 if wert=1 then goto menu goto setdate #absturz print "Simuliere Absturz ..." print "Warte auf Reset durch Watchdog ..." #aloop goto aloop end #ende gosub deactWD print "Watchdog abgeschaltet und Programm beendet" end #getvalue gosub waitrxd get wert return #waitrxd if rxd then return if (second mod 5)=0 then gosub resetWD goto waitrxd #printtime put hour/10 +&h30 put hour mod 10 +&h30 put &h3A put minute/10 +&h30 put minute mod 10 +&h30 put &h3A put second/10 +&h30 put second mod 10 +&h30 return #printdate put day/10 +&h30 put day mod 10 +&h30 put &h2E put month/10 +&h30 put month mod 10 +&h30 put &h2E put year/10 +&h30 put year mod 10 +&h30 put 9 print "DOW: ";dow; return '------------------------------------------------------------------------------- #syncCC1 sys RdByteBReg,2,PCF8583addr 'Sekunde lesen wert=pop #secloop sys RdWordBReg,2,PCF8583addr 'Sekunde & Minute lesen data=pop if datalo=wert then goto secloop 'Sekundenwechsel abwarten second=(datalo shr 4)*10 + (datalo and &hF) minute=(datahi shr 4)*10 + (datahi and &hF) sys RdByteBReg,4,PCF8583addr 'Stunde lesen wert=pop hour=(wert shr 4)*10 + (wert and &hF) sys RdWordBReg,5,PCF8583addr 'Jahr/Tag & Wochentag/Monat lesen data=pop day=((datalo shr 4) and &b11)*10 + (datalo and &hF) month=((datahi shr 4) and &b1)*10 + (datahi and &hF) dow=datahi shr 5 sys RdByteBReg,RAMyearAddr,PCF8583addr 'Jahr lesen wert=pop datahi=(wert and &b11111100) or (datalo shr 6) if (wert and &b11) = (datahi and &b11) then goto noyearchanged wert=wert+1 sys WrByteBReg,wert,RAMyearAddr,PCF8583addr 'Jahr speichern #noyearchanged year=wert return #syncPCF8583 wert=second #waitsecchange if wert=second then goto waitsecchange wert=second datalo=PCF8583Delay datahi=((second / 10) shl 4) or (second mod 10) sys WrWordBReg,data,1,PCF8583addr '100stel & Sekunden speichern datalo=((minute / 10) shl 4) or (minute mod 10) datahi=((hour / 10) shl 4) or (hour mod 10) sys WrWordBReg,data,3,PCF8583addr 'Minuten & Stunden speichern datalo=(((day / 10) and &b11) shl 4) or (day mod 10) datalo=datalo or ((year mod 4) shl 6) datahi=(((month / 10) and 1) shl 4) or (month mod 10) datahi=datahi or ((DOW mod 7) shl 5) sys WrWordBReg,data,5,PCF8583addr 'Jahr/Tag & Monat/DOW speichern wert=year sys WrByteBReg,wert,RAMyearAddr,PCF8583addr 'Jahr speichern return #resetWD wert=99-WDtimeout wert=((wert/10) shl 4) or (wert mod 10) sys WrByteBReg,wert,7,PCF8583addr return #deactWD sys WrByteBReg,0,8,PCF8583addr return 'syscode "int_i2c.s19" 'nur einmal laden, dann auskommentieren |
| Antwort schreiben |