
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo, hat schon jemand den PCF8583 an die C-Control 1 V2 angeschlossen? Kristijan > > 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 |