Let me elucidate (big word for a Friday afternoon!). When I posted point 5 saying not to use a constant in the I2C ADDRESS, I also intended to mean NOT to use a constant in the RTC Register ADDRESS as well. Sometimes it works, sometimes it doesn't. It'll be the subject of an FAQ shortly. However, the PBP manual in the I2CWrite section although mentioning this, isn't too clear either. This is the main problem you've been having.
Don't jump up and down for joy just yet, there's other problems in your code... you're still not using CPin, DPin and RTC consistantly throughout your code (by not being consistant it'll bite you one day). Also... where's the square brackets in your I2Cwrite statements?
I appended some sample code for you to cut, paste, compile, marvel and wonder at. It's basically your own code, rehashed and born again. Do I need any thanks? Of course not... just that big Diamond and Sapphire cluster from Macey's window.
PS. Count the number of Pause statements...Code:' ' Hardware Pin Defines ' -------------------- CPin var PortA.1 ' I2CLock DPin var PortA.0 ' I2CData Tick VAR PORTA.2 ' ' RAM Assignments and Variables ' ----------------------------- RTC var BYTE ' RTC Hardware Address RTCData var BYTE ' RTC Data RTCRegister var BYTE ' RTC Register Address Temp var BYTE ' Temporary variable (used in BCD conversions) ' ' Start Program ' ============= ' ' Initialise Processor ' -------------------- TRISA=%00000001 TRISB=%11001111 TRISC=%00000000 ADCON0=%11000000 ADCON1=%00000111 RTC = %11010000 ' RTC Hardware Address ($D0) Pause 750 ' Pause for external LCD to settle ' I saw in one of the responses to a similar problem, someone reset, set and reset again ' the CE bit. The lines below are an attempt at doing this... Cobblers! - see Note below - Melanie ' Cobblers! - A quaint olde English expression ' meaning a group of people that make or mend shoes ' ' Initialise RTC to starting Date & Time 23rd July 2004, 15:10:00 ' --------------------------------------------------------------- RTCData=4:RTCRegister=6:Gosub WriteRTC ' Write Year RTCData=7:RTCRegister=5:Gosub WriteRTC ' Write Month RTCData=23:RTCRegister=4:Gosub WriteRTC ' Write Days RTCData=15:RTCRegister=2:Gosub WriteRTC ' write Hours RTCData=10:RTCRegister=1:Gosub WriteRTC ' write Minutes RTCData=0:RTCRegister=0:Gosub WriteRTC ' write Seconds & activate RTC RTCData=%10010000:RTCRegister=7:Gosub WriteRTC ' write Control Register RTCData=6:RTCRegister=$11:Gosub WriteRTC ' This is your Test write to RAM ' ' Main Program Loop ' ----------------- Loop: IF tick = 0 Then SerOut PORTD.2,4, $FE,$83," " 'locate cursor 1st line position 3 Else SerOut PORTD.2,4, $FE,$83,":" 'locate cursor 1st line position 3 EndIF ' ' Your Debug Display ' ------------------ RTCRegister=$11:Gosub ReadRTC SerOut PORTD.2,4, $FE,$C4,#RTCData 'locate cursor & Display Data ' ' New Section - Display rolling time at Cursor ' -------------------------------------------- RTCRegister=2:Gosub ReadRTC ' Get and display Hours SerOut PORTD.2,4, $FE,$84,DEC2 RTCData RTCRegister=1:Gosub ReadRTC ' Get and display Minutes SerOut PORTD.2,4, ":",DEC2 RTCData RTCRegister=0:Gosub ReadRTC ' Get and display Seconds SerOut PORTD.2,4, ":",DEC2 RTCData Goto Loop ' Do it forever ' ' Subroutine Reads Data from RTC converting from BCD where required ' ----------------------------------------------------------------- ' RTCData is always in NUMERIC format on exit from this subroutine ' it is NEVER in BCD format. ReadRTC: I2CRead DPin,CPin,RTC,RTCRegister,[RTCData] If RTCRegister < 7 then ' Convert from BCD to Numeric Temp=RTCData & $7F ' Mask out Bit 7 in all cases Temp=Temp >> 4 RTCData=(RTCData & $0F)+(Temp*10) endif Return ' ' Subroutine Writes Data to RTC converting to BCD where required ' -------------------------------------------------------------- ' Caution: RTCData may be converted to BCD on exit from this subroutine ' if the Register address is less than 7. WriteRTC: If RTCRegister < 7 then ' Convert from Numeric to BCD Temp=RTCData DIG 1 Temp=Temp << 4 RTCData=(RTCData DIG 0)+Temp endif I2Cwrite DPin,CPin,RTC,RTCRegister,[RTCData] Pause 10 Return End
*smiles*
Melanie




Bookmarks