Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Hilfe beim lesen PCF8583 Kategorie: Programmierung Basic (von Kristijan - 20.12.2005 17:38)
 Als Antwort auf Hilfe beim lesen PCF8583 von Benno - 20.12.2005 14:01
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
>  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
>  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

Bisherige Antworten: