Well that version of the project didn't work so well in the field...
I'm now working on a second version which uses a RTC. Basically I already have half the code written for one of my other projects so most of this will be a cut and paste. But something is really puzzling me and would welcome your advice.
I'm using a 16F690 (20 pin DIP) because it has both a basic UART and IC2 interface, and I happened to have a sample in my project box. I could be cleaver (yeah right) and use the full capabilities of the DS1307 and program the times for each month so it takes care of BST and GMT etc, but for now I thought the easiest way would be to use a serial utility to set the time and trigger value as required. Using PicMultiCalc to get the coms values I am able to connect and receive data, however the time is shown as 00:00 in the following code. Now like I mentioned , I've cut and pasted the section and same variables in a previous project so there should be no reason for it not to work. To prove the DS1307 is working on the breadboard (it hasn't been removed since I took a break from the previous project) I removed the 16F690 and replaced it with the 18F4580 and connected the jumper to the EasyPIC5 board - clock was displaying the time set by the code. Noted the correct clk and dta pins, powered down the EP5 board and mapped the connections to the pins used by the 16F690. Replaced the 16F690 and tested again - the serial monitor in Microcode Studio connected and displayed "Time : 00:00"
I've looked at the data sheet, but not sure if I am missing anything (probably some register needs setting but I'll be dammed if I can see it) so hopefully someone here might be able to assist.
Here's the code
Code:
'****************************************************************
'* Name : Chicken Coop Door Control *
'* Author : Malcolm Crabbe *
'* Date : 30th January 2014 *
'* Version : 1.0 *
'* Notes : Uses PBP 2.60c *
'* : 16F690, int osc 4MHz *
'* : Program uses RTC to turn *
'* : on an electric motor and open a sliding door. *
'* : Door travel controlled by limit switches *
'****************************************************************
ASM
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF
endasm
ANSEL=%00000000
ADCON1=7
ADCON0 = %00000000 'AD converter module disabled
ADCON1 = %00001111
TRISA=%00000011 'set PORTA as all output
TRISC=%00000001 'set PORTC as all output apart from RC0
TRISB=%00000011
DEFINE HSER_RCSTA 90h 'Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h 'Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25 '9600 Baud @ 0.16%
DEFINE HSER_CLROERR 1 'Clear overflow automatically
day var byte
RTCMin var byte 'RTC Minutes
RTCHour var byte 'RTC Hours
RTCsec var byte 'RTC Seconds
TimeH var byte 'variable to store Hours
TimeM var byte 'variable to store Minutes
SS VAR Byte 'variable to store Seconds
CounterA var byte 'General purpose Variable
CounterB var byte 'General purpose Variable
Counter1 var word 'used to store the current time as a digit. Counts minutes from 0000 at midnight (to be added later)
Relay var PortA.5 'used to activate relay and thus reverse direction
Motor var PortA.4 'used to drive the motor
SW1 VAR PortA.0 'Door open limit switch
SW2 VAR PortA.1 'Door closed limit switch
Tx var PortB.7 'used for sending time value in testing
Rx Var PortB.5 'used for receiving time value in testing
SetMN var byte 'Used to set time Minutes
SetHR var byte 'Used to set time Hours
SetSS var byte 'Used to set time Seconds
RCIF VAR PIR1.5 'USART receive flag
GIE VAR INTCON.7
RCIF=1
SCLpin var PORTB.6 'RTC pin - clk
SDApin var PORTB.4 'RTC pin - data
setHR = 08 'initial time to 8am
setMN = 00
'convert initial time to BDC and write it to the DS1307
CounterA=SetMN
Gosub ConvertBCD
RTCMin=CounterB
CounterA=SetHR
Gosub ConvertBCD
RTCHour=CounterB
I2Cwrite SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour]
test:
I2CREAD SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour] ; read DS1307 chip
timeH=(RTCHour>>4) 'convert the BCD format of the hours register and store in variable timeH
timeH=(timeH &$03)*10
timeH=timeH+(RTCHour&$0F)
timeM=(RTCMin>>4) 'convert the BCD format of the mins register and store in variable timeM
timeM=(timeM &$07)*10
timeM=timeM+(RTCMin&$0F)
ss=(RTCSec>>4) 'convert the BCD format of the sec register and store in variable ss
ss=(ss &$07)*10
ss=ss+(RTCSec&$0F)
Counter1 = (TimeH *60)+ TimeM 'take hours and multiply it by 60 then add odd minutes to get the total minutes into counter1
Hserout["Time: ",#TimeH DIG 1,#TimeH DIG 0,":",#TimeM DIG 1,#TimeM DIG 0,10]
pause 1000
goto test
'*******************************************************************************
' convert BDC format to decimal
ConvertBCD:
CounterB=CounterA DIG 1 ' CounterA is the entry variable
CounterB=CounterB<<4 ' CounterB holds the converted BCD result on exit
CounterB=CounterB+CounterA DIG 0
Return
'*******************************************************************************
Bookmarks