Code:
'FL PIC18F4550
'TEST RTC TO SD CARD
'18F4550
'02/28/09
'
DEFINE OSC 48
@ __CONFIG _CONFIG1L, _PLLDIV_1_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H
@ __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_512_2H
@ __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _MCLRE_OFF_3H
@ __CONFIG _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L &_XINST_OFF_4L
' Alias PIC pins and registers for SD/MMC card
SD_WE Var PORTA.4 ' SD card write protect
SD_WE_TRIS Var TRISA.4 ' SD card write protect direction
'SDI Var PORTB.0 ' SPI data in SD #7
'SDI_TRIS Var TRISB.0 ' SPI data in direction
SDI Var PORTB.2 ' SPI data in SD #7
SDI_TRIS Var TRISB.2 ' SPI data in direction
SCL Var PORTB.1 ' SPI clock SD #5
SCL_TRIS Var TRISB.1 ' SPI clock direction
SD_CS Var PORTB.3 ' SD card chip select SD #1
SD_CS_TRIS Var TRISB.3 ' SD card chip select direction
SD_CD Var PORTB.4 ' SD card detect
SD_CD_TRIS Var TRISB.4 ' SD card detect direction
SDO Var PORTC.7 ' SPI data out SD #2
SDO_TRIS Var TRISC.7 ' SPI data out direction
ON INTERRUPT GOTO T_INT
INTCON = %10010000
CNT VAR WORD
CNT = 0
BOOT:
CLEAR
XCNT VAR LONG
OCNT VAR BYTE
OCNT = 0
TCNT VAR BYTE
TCNT = 0
Z VAR LONG
Z = 0
GPS VAR BYTE[53]
RTC_STR VAR BYTE[25]
N1 VAR BYTE[4]
N2 VAR BYTE[3]
TEMPERATURE VAR BYTE
T_ONES VAR BYTE
T_TENS VAR BYTE
TEMPERATURE = 99
T_TENS = TEMPERATURE/10
T_ONES = TEMPERATURE-(T_TENS*10)
'RTC DEFINES
DS_SCL VAR PORTD.1
DS_SDA VAR PORTD.0
RTC CON %11010000
'Setting the RTC so we can get out 1Hz tick output
'-------------------------------------------------
' -------------- RTC definitions -----------------
SecReg CON $00 ' seconds address (00 - 59) ' MSB of SecReg must be set to a 0 to enable RTC
ContReg CON $0E ' control register
cntrl CON %00000000 ' sets the SQW/OUT to 1Hz pulse, logic level low
' The variable below holds the values entered:
' entered by the user
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
SEC_O VAR BYTE
SEC_T VAR BYTE
MIN_O VAR BYTE
MIN_T VAR BYTE
HR_O VAR BYTE
HR_T VAR BYTE
'ALARM VARIABLES
A_MINs VAR BYTE ' minutes
A_hr VAR BYTE ' hours
I2CWrite DS_SDA, DS_SCL, RTC, ContReg, [cntrl]
' Include the SD/MMC subroutines
Include "SDFS.BAS"
SDC_UseHardSPI = FALSE ' Use hardware SSP port for SPI.
ADCON1 = 15 ' All I/O pins digital
TRISD =%00000000
PAUSE 1000
Serout2 PORTC.6, 16572, [ "MACKRACKIT ", $d, $a]
Serout2 PORTC.6, 16572, [ "RTC ", $d, $a]
Pause 1000
'###GOSUB SET_RTC
HIGH PORTD.7
'###########################################
CHECK:
IF CNT = 600 THEN
CNT = 0
GOSUB RUN
ENDIF
GOTO CHECK
RUN:
TOGGLE PORTD.7
I2CRead DS_SDA, DS_SCL, RTC, SecReg, [sec,MINs,hr,day,date,mon,yr]
pause 100
Serout2 PORTC.6, 16572, [ "RUN ", $d, $a]
Serout2 PORTC.6, 16572, [ "TIME ", HEX2 hr, ":", HEX2 MINs, ":", HEX2 sec,$d, $a]
Serout2 PORTC.6, 16572, [ "DATE ", HEX2 mon,"-",HEX2 date,"-",HEX2 yr,$d, $a]
Serout2 PORTC.6, 16572, [ "INT COUNT ", DEC CNT,$d, $a]
PAUSE 1000
SEC_T = sec & $70
SEC_T = SEC_T>>4
Serout2 PORTC.6, 16572,["SEC_T ",DEC SEC_T, $d, $a]
SEC_O = sec & $0F
Serout2 PORTC.6, 16572,["SEC_O ",DEC SEC_O, $d, $a]
MIN_T = MINs & $70
MIN_T = MIN_T>>4
Serout2 PORTC.6, 16572,["MIN_T ",DEC MIN_T, $d, $a]
MIN_O = MINs & $0F
Serout2 PORTC.6, 16572,["MIN_O ",DEC MIN_O, $d, $a]
HR_T = hr & $70
HR_T = HR_T>>4
Serout2 PORTC.6, 16572,["HR_T ",DEC HR_T, $d, $a]
HR_O = hr & $0F
Serout2 PORTC.6, 16572,["HR_O ",DEC HR_O, $d, $a]
'GOTO SD_MAIN
'GOTO RUN
'###############################################
SD_MAIN:
TOGGLE PORTD.7
' PAUSE 250
GOSUB SDINIT
GOSUB SDFILENAME
GOSUB SDOPEN_W
GOSUB SD_WRITE
GOSUB SDCLOSE
' GOSUB SD_READ
'GOTO SD_MAIN
'GOTO RUN
RETURN
'##############################################################
SDINIT:
' FSInit initializes the card and reads all the preliminary information from it
Gosub FSInit
Serout2 PORTC.6, 16572, ["Init: ", Dec FAT_error, " ", Dec SDC_status, " ", Dec SDC_response, $d, $a]
IF (FAT_error = 6) THEN SD_MAIN
If (FAT_error != 0) Then Stop
' Display card directory
Gosub FINDfirst ' Find first file on card
While (FAT_error = 0)
Serout2 PORTC.6,16572, [Str FAT_FileName\11, $d, $a]
Gosub FINDnext ' Find next file on card
Wend
RETURN
'################################################################
SDFILENAME:
' This section defines a specific short (8.3) filename
' Note that spaces are use in empty elements and must be upper case for Windows
FAT_FileName[0] = "G"
FAT_FileName[1] = "P"
FAT_FileName[2] = "S"
FAT_FileName[3] = " "
FAT_FileName[4] = " "
FAT_FileName[5] = " "
FAT_FileName[6] = $30+TCNT
FAT_FileName[7] = $30+OCNT
FAT_FileName[8] = "T"
FAT_FileName[9] = "X"
FAT_FileName[10] = "T"
' Set file time to 8:30:10 and date to 1/1/2008
FAT_seconds = sec
FAT_minutes = MINs
FAT_hours = hr
FAT_day = date
FAT_month = mon
FAT_year = 20+yr
RETURN
'############################################################
SDOPEN_W:
' Open a file for write
FAT_mode = "A" ' Write mode
Gosub FSfopen ' Open file pointed to by Byte array FAT_FileName
Serout2 PORTC.6, 16572, ["Open for write Error: ", Dec FAT_error, $d, $a]
Serout2 PORTC.6, 16572, [ "FILE NAME ", STR FAT_FileName\11, $d, $a]
Serout2 PORTC.6, 16572, [ "DISK_fat ", Dec DISK_fat, $d, $a]
Serout2 PORTC.6, 16572, [ "DISK_buffer ", Dec DISK_buffer, $d, $a]
Serout2 PORTC.6, 16572, [ "SDC_sector_addr ", Dec SDC_sector_addr, $d, $a]
Serout2 PORTC.6, 16572, [ "FAT_ccls ", Dec FAT_ccls, $d, $a]
Serout2 PORTC.6, 16572, [ "LAST_CLUSTER ", Dec LAST_CLUSTER, $d, $a]
Serout2 PORTC.6, 16572, [ "FAT_c ", Dec FAT_c, $d, $a]
Serout2 PORTC.6, 16572, [ "DISK_maxcls: ", Dec DISK_maxcls, $d, $a]
'IF (FAT_error = 10) THEN Stop
IF (FAT_error = 10) THEN XNAME
If (FAT_error != 0) Then BOOT 'SD_MAIN
RETURN
'###############################################################
SD_WRITE:
' Write to file
Z = 0
'FOR XCNT = 1 TO 33
FAT_src[0] =$30+HR_T
FAT_src[1] =$30+HR_O
FAT_src[2] = ":"
FAT_src[3] = $30+MIN_T
FAT_src[4] = $30+MIN_O
FAT_src[5] = ":"
FAT_src[6] = $30+SEC_T
FAT_src[7] = $30+SEC_O
FAT_src[8] = " "
FAT_src[9] = " "
FAT_src[10] = " "
FAT_src[11] = " "
FAT_src[12] = " "
FAT_src[13] = " "
FAT_src[14] = $d
FAT_src[15] = $a
FAT_count = 16
Gosub FSfwrite
Z = Z + 1
Serout2 PORTC.6, 16572, [ "ROLL OVER AT 100000 ", Dec Z," FCNT ",DEC TCNT,DEC OCNT, $d, $a]
'NEXT XCNT
Serout2 PORTC.6, 16572, [ "Write ",Dec FAT_error, $d, $a]
IF (FAT_error = 10) THEN Stop
If (FAT_error != 0) Then STOP
'GOSUB SDCLOSE
'Serout2 PORTC.6, 16572, [ "DONE ", $d, $a]
'STOP
RETURN
'###############################################################
XNAME:
'IF O = 10 THEN
'O = 1
'T = T + 1
OCNT = OCNT + 1
IF OCNT = 10 THEN 'TCNT = TCNT + 1 AND OCNT = 0
OCNT = 0
TCNT = TCNT + 1
ENDIF
IF TCNT = 10 THEN STOP
GOTO SD_MAIN
'##########################################################
SDCLOSE:
' Close file
Gosub FSfclose
Serout2 PORTC.6, 16572, [ "Close ", Dec FAT_error, $d, $a]
If (FAT_error != 0) Then Stop
RETURN
'############################################################
SD_READ:
' Open a file for read
FAT_mode = "r" ' Read mode
Gosub FSfopen ' Open file pointed to by Byte array FAT_FileName
Serout2 PORTC.6, 16572, ["Open: ", Dec FAT_error, $d, $a]
If (FAT_error != 0) Then Stop
' Read and display the whole file
FAT_count = 1 ' Read 1 byte to buffer at a time
Gosub FSfread
While (FAT_error = 0)
Serout2 PORTC.6, 16572, [FAT_dest[0]]
FAT_count = 1 ' Read 1 byte to buffer at a time
Gosub FSfread
Wend
Serout2 PORTC.6, 16572, [$d, $a, "Read: ", Dec FAT_error, $d, $a]
RETURN
'#################################################
SET_RTC:
yr = $10
mon = $02
date = $14
sec = $00
mins = $44
hr = $01
I2CWrite DS_SDA, DS_SCL, RTC, SecReg, [sec,mins,hr,day,date,mon,yr]
RETURN
DISABLE
T_INT:
CNT = CNT + 1
INTCON.1 = 0
RESUME
ENABLE
Bookmarks