Code:
' [ Device Declaration ]
ASM ; 18F2550/4550, 8mhz crystal
__CONFIG _CONFIG1L, _PLLDIV_2_1L & _CPUDIV_OSC4_PLL6_1L & _USBDIV_2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _VREGEN_ON_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
__CONFIG _CONFIG3H, _PBADEN_OFF_3H ; PortB resets as digital
__CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
ENDASM
Include "Modedefs.Bas"
INCLUDE "DT_INTS-18.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP-18.bas"
INCLUDE "ALLDIGITAL.pbp" ' Sets all registers for digital ops.
DEFINE OSC 16
DEFINE I2C_SLOW 1
DEFINE I2C_HOLD 1
' Initialize Hardware
TRISA = 0 ' all outputs for LCD use
TRISB =%00001100 ' RB2 & RB3 set as RTC Alarm1/2 inputs
TRISC = 0
TRISD = 0
TRISE = 0
'[ Declare Variables, Aliases & Constants ]
rng0 VAR Byte ' Range LSB when right justified
rng1 VAR Byte ' Range MSB when right justified
ext_pwr VAR PORTC.6 ' Controls power to SRF02
SCL VAR PORTB.1
SDA VAR PORTB.0
' Constants
rtcdevice CON $D0 ' Address for DS1337
srfdevice CON $E0 ' Address for SRF02
'SETUP FOR USING DS1337 Real Time Clock
' Setup Hardware for uart
DEFINE HSER_BAUD 115200
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_CLROERR 1
' Aliased Variables for CLock
Alarm1 VAR PORTB.2 ' Alarm1 input from DS1337 INTA (pin-3)
Alarm2 VAR PORTB.3 ' Alarm2 input from DS1337
contrl CON %00000101 ' Starts oscillator, enables INTA interrupt
' from A1F, INTA/SQW off.
' RTC Address definitions
SecReg CON $00 ' seconds (00 - 59)
' must set MSB of SecReg to 0 to enable RTC
MinReg CON $01 ' minutes (00 - 59)
HrReg CON $02 ' hours (01 - 12) or (00 - 23)
DayReg CON $03 ' day (1 - 7)
DateReg CON $04 ' date (01 - 28/29, 30, 31)
MonReg CON $05 ' month (01 - 12)
YearReg CON $06 ' year (00 - 99)
' Alarm 1 Address definitions
Alm1sec CON $07 ' Alarm 1 seconds (00-59)
Alm1min CON $08 ' Alarm 1 minutes (00-59)
Alm1hr CON $09 ' Alarm 1 hours (01-12) or (00-23)
Alm1Day CON $0A ' Alarm 1 day (1-7)
' Alarm 2 Address definitions
Alm2min CON $0B ' Alarm 2 minutes (00-59)
Alm2hr CON $0C ' Alarm 2 hours (01-12) or (00-23)
Alm2Day CON $0D ' Alarm 2 day (1-7)
' Alias of Clock register addresses
ContReg CON $0E ' CONTROL register
StatusReg CON $0F ' STATUS register
' Clock Variables
sec VAR BYTE ' seconds
MINs VAR BYTE ' minutes
hr VAR BYTE ' hours
day VAR BYTE ' day
date VAR BYTE ' date
mon VAR BYTE ' month
yr VAR BYTE ' year
' ALARM1 VARIABLES
A1sec VAR BYTE ' seconds
A1MINs VAR BYTE ' minutes
A1hr VAR BYTE ' hours
A1day VAR BYTE ' day
' ALARM2 VARIABLES
A2MINs VAR BYTE ' minutes
A2hr VAR BYTE ' hours
A2day VAR BYTE ' day
GoSub SetTimeAndDate ' Setup current time & alarm settings
'[ SETUP FOR INTERRUPTS ]
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
;INT_Handler USB_Handler
INT_Handler INT2_INT, _Alarm, PBP, yes
endm
INT_CREATE
ENDASM
@ INT_ENABLE INT2_INT ; enable external (INT) interrupts
' Per DT, DT_INTS already takes care of setting INTCON and RCON registers
' but this doesn't work unles INTCON2 set per below:
INTCON2.4 = 0 ' Set INT2 for falling edge (Bit4-low)interrupt
INTCON2.7 = 1 ' Disable all PortB Pull-ups
RTC_INT_FLG VAR INTCON3.1 'Alias for RB2 INTA interrupt flag from RTC
'[ Begin Main Program Loop ]
Main:
PAUSE 100 ' ?? For some reason this 100 millisec delay is required
' to keep INT2 interrupts from happening every 11 secs ??
Low PORTC.0 ' Turn off Test LED while in Main loop
GoTo Main ' Endless Loop waiting for interrupt
End
'[ Begin Interrupt Handler ]
Alarm:
High PORTC.0 ' Turn on Test LED to indicate Alarm interrupt entered
HIGH ext_pwr ' Turn on power to the SRF02 during interrupt service
' in order to use the I2C bus without distortion.
PAUSE 3000 ' Delay to let I2C bus stabilize after SRF02 turn on
'DEFINE WRITE_USED 1 'Required if only writing WORD variables in v2.6
' Process the RTC alarm
' Read the current time
I2CREAD SDA,SCL,RTCdevice,SecReg,[sec,MINs,hr,day,date,mon,yr]
PAUSE 10
'Write time to EEPROM
WRITE 21,hr
PAUSE 20
WRITE 22,MINs
PAUSE 20
WRITE 23,sec
Pause 20
' Read the ALARM settings from the DS1337
I2CREAD SDA,SCL,RTCdevice,Alm1sec,[A1sec,A1MINs,A1hr,A1day]
Pause 10
I2CRead SDA,SCL,RTCdevice,Alm2min,[A2MINs,A2hr,A2day]
PAUSE 10
' Make SRF02 Range Measurement
I2CWRITE SDA,SCL,$E0,0,[80]' Request start of ranging in inches
pause 100 ' Wait for ranging to finish
I2CREAD SDA,SCL,$E0,2,[rng1,rng0] ' Get ranging results
WRITE 253,rng1 ' Write range to EEPROM for testing
Write 254,rng0
' Clear the Alarm flags to be ready for next day intterupt
' Clear STATUS register
I2CWrite SDA,SCL,RTCdevice, StatusReg,[$00]
Pause 1000
WRITE 255, MINs
PAUSE 20
LOW ext_pwr ' Turn off power to the SRF02 at end of interrupt
' This statement will distort the I2C bus and ext_pwr
' must be HIGH before any attempts are made to use the
' I2C bus.
PAUSE 1000 ' Delay to permit I2C bus to stabilize after SRF02 off
' Resume Main Program
@ INT_RETURN
End ' Safety measure to insure program stops if reaches here
'{ End of Interrupt Handler ]
' [ START LIST OF SUBROUTINES ]
SetTimeAndDate: ' Subroutine to set current time, date and alarms
HIGH ext_pwr ' Turn on power to the SRF02 during this routine
PAUSE 3000 ' Delay to let I2C bus stabilize after SRF02 turn on
' Initialize clock variables to 0
yr=0:date =0:mon =0:day=0:hr=0:MINs=0:sec=0
A1sec=0:A1MINs=0:A1hr=0:A1Day=0
A2MINs=0:A2hr=0:A2day=0
' The BCD constants below set the RTC to: 11:00:00 on 12-20-2009
hr=$11
MINs=$00
sec=$00
day=$07
mon=$12
date=$20
yr=$09
' Per MAXIM TechSupport, proper sequencing requires setting INTCN = 1,
' & A2IE=A1IE=0 before setting alarms.
I2CWrite SDA, SCL, RTCdevice, ContReg,[%00000100]
Pause 20
'Define ALARM1 FOR 11:01:00 & to alarm when secs match (1/min).
' This requires A1M1=0 and A1M2=A1M3=A1M4=1
' (A1xxx + $80 or A1xxx + 128d sets bit 7 as A1Mx = 1)
A1hr = %10010001 '$11 + $80 = %10010001, for A1M3 = 1
'Bit6 must be 0 for 24 hour clock
A1MINs = %10000001 '$501 + $80 = %10000001, for A1M2 = 1
A1sec = $00 '$00 = %00000000, for A1M1 = 0
A1day = %10000111 '$07 + $80 = $10000111, for A1M4 = 1
'DY/_DT Bit6 = 0 for using Day of month alarm
' Per MAXIM TechSupport, reset control register for desired Alarm
' after setting alarms.
I2CWrite SDA, SCL, RTCdevice, ContReg,[%00000101]
PAUSE 20
'Set the main Time
I2CWrite SDA, SCL, RTCdevice, SecReg,[sec,MINs,hr,day,date,mon,yr]
Pause 20
'Set the Alarm1 Time
I2CWrite SDA, SCL, RTCdevice, Alm1sec,[A1sec,A1MINs,A1hr,A1day]
PAUSE 20
'DISABLED...Set the Alarm2 Time ' Alarm2 disabled for this application
'I2CWrite SDA, SCL, RTCdevice, Alm2min,[A2MINs,A2hr,A2day]
'Pause 20
' Clear STATUS and set CONTROL registers
I2CWrite SDA, SCL, RTCdevice, StatusReg,[$00] ' Clear STATUS register
PAUSE 20
I2CWrite SDA, SCL, RTCdevice, ContReg,[%00000101]
' Starts the oscillator,
' enables INTA interrupt from A1F.
Pause 20
'Post setup test to see if Time set correctly by reading EEPROM stored time
I2CREAD SDA, SCL, RTCdevice, SecReg,[sec,MINs,hr,day,date,mon,yr]
PAUSE 20
WRITE 13,sec 'Write time to EEPROM for check after post run test
I2CREAD SDA, SCL, RTCdevice, MinReg,[MINs]
PAUSE 20
WRITE 12,MINs
I2CREAD SDA, SCL, RTCdevice, HrReg,[hr]
PAUSE 20
WRITE 11,hr
'Post setup test to see if Alarm set correctly by readig EEPROM stored time
I2CREAD SDA,SCL,RTCdevice,Alm1sec,[A1sec,A1MINs,A1hr,A1day]
PAUSE 20
WRITE 14,A1hr
PAUSE 20
WRITE 15,A1MINs
Pause 20
Return
END
Bookmarks