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 

 Hilfe beim lesen PCF8583 Kategorie: Programmierung Basic (von Benno - 20.12.2005 14:01)
Benno nutzt:  CC1-M-Unit V1.1

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:

Re: Hilfe beim lesen PCF8583 (von Naturbanause - 21.12.2005 0:00)
    Re: Hilfe beim lesen PCF8583 (von Benno - 21.12.2005 9:58)
        Re: Hilfe beim lesen PCF8583 (von Naturbanause - 21.12.2005 17:06)
            Re: Hilfe beim lesen PCF8583 (von Benno - 22.12.2005 21:59)
Re: Hilfe beim lesen PCF8583 (von Kristijan - 20.12.2005 17:38)