Let's find out together what makes a PIC Tick!

Main Menu

Proton24 SD File System

Started by Nickma, Mar 04, 2021, 07:37 AM

Previous topic - Next topic


Hi everyone
I am designing an SD Card recording device using the Proton24 SD FAT File System (by top204). Don't know how to set record of file attributes (date / time). If anyone has examples, please share.


Hi Nickman

This was written from GPS date and time received and was taken from Les's Examples.
SD Card Wired up as per Les's Example.
Pic 24FJ64GA004

' Setup the SD Card - SPI For Use with The SD Card And Les's Inc SD Card File!
' Must ADD 10K Pull Up on (SDI Data In Pin) To Pic Otherwise It Might Get Stuck and Can't Initialize!!
        $define SD_CLK        =  PORTB.14     ' (0) SPI CLK to SD cards CLK pin
        $define SD_SDI         =  PORTC.8      ' (I) SPI DI To SD cards  DO pin   
        $define SD_SDO       =  PORTB.9      ' (0) SPI Do To SD cards  DI pin   
        $define SD_CS          =  PORTA.7      ' (0) SPI CS to SD cards  CS pin [CHIP Dectect] (active low)[Output]
        $define SD_Power     =  PORTA.8      ' Enable/Disable the SD card's VDD (active low)
        Symbol Card_Dete    =  PORTC.7      ' (I) SD CARD Detect [Low Card IN, High Card OUT] [Input]

' Set up the Include Files
        Include ""                                            ' Load the PIC24 SPI procedures into the program       
        Include ""                                         ' Load the FAT file system procedures into the program

' SD Card
    If Card_Detect = 0 Then
     DelayMS 10
     High RF_LED
    Else Low RF_LED

    MyFilename = "TEST.csv"                                                       ' "file1.csv" Excel
    If FAT_Init() = cErrOK Then                                                  ' Can we initialise the FAT?
     If File_Exists(MyFilename) = False Then                                     ' Does the file already exist?
      File_Create(MyFilename)                                                    ' No. So create it
      File_Close()                                                               ' Then close it

    If DistFlag = 115 Then                                                   
      If File_Append(MyFilename) = cErrOK Then                                    ' Can we append to an existing file?
      ''  HRSOut "Writing", 13                                                    ' Yes. So transmit a message
      string2Hold = ","                                                           ' (Prints SD CARD ICON),string2Hold = "SD"   
      Print_At(Arial_Symbols,6,50,Str string2Hold,0)                              ' ST7565R Eadog Diaplay
 ' Write to the file
      File_Write "TEST TIME:    ",
      File_Write "TIME: " ,Dec HOURS, " : " ,Dec2 MINUTES ," : " ,Dec2 SECONDS, " "       
      File_Write "   DATE: " ,DATA_STRING_0, DATA_STRING_1," : ", DATA_STRING_2, DATA_STRING_3," : 20", DATA_STRING_4, DATA_STRING_5," "
      File_Write 13                                                             ' Null Terminate File
      File_Close()                                                              ' Close the file
' ------------------------------------------------------------------------------------
' Read from the file
      If File_Open(MyFilename) = cErrOK Then                                     ' Can we open the file?
      While File_tEOF = False                                                    ' Yes. So read until the file is finished
      MyChar = File_Read                                                         ' Read from the file
      ' HRSOut MyChar                                                            ' Transmit what was read from the file
       Print At 2,1, Str MyChar
       string2Print = Str$(Dec MyChar)
       File_Close()                                                              ' Close the file
       Else                                                                      ' Otherwise...
      ' HRSOut "Cannot open ", MyFileName, 13                                    ' Transmit an error response
       string2Hold = "Cant Open"
       string2Print = MyFilename + string2Hold
       Print_At(ArialNarrow8,4,5,"SD:" + Str string2Print + "     ",0)
      ' HRSOut "Cannot append ", MyFileName, 13
       string2Hold = "Cant appd"
       string2Print = MyFilename + string2Hold
       Print_At(ArialNarrow8,4,5,"SD:" + Str string2Print + "     ",0)
       Else                                                                      ' Otherwise...
       ' HRSOut "Cannot initialise SD\r"                                         ' Transmit an error response
       string2Hold = "Cant Int"
       Print_At(ArialNarrow8,4,5,Str string2Hold,0)




Craig, thanks for the answer.
In your example, the time and date are recorded as data to be written to a file. These data are not ATTRIBUTES of the file. Time and date attributes are created via Global_bMinutes, Global_bHours etc. (see the file in Includes for Proton24) My attributes are being written, but the data that I am trying to write is not written at all.


Hi everyone.
Proton24 SD FAT File System problem.
I'm stumped with writing the attributes of the data file being created. I tried many options, but nothing works.

    Device = 24FJ64GA004
    Declare Xtal = 8
       PORTA = 0: PORTB = 0: PORTC = 0
       TRISA = 0: TRISB = 0: TRISC = 0
    $ define SD_CLK PORTB.13 'SPI CLK to SD card pin5 CLK pin
    $ define SD_SDO PORTB. 14 'SPI DO to SD card pin2 DI pin
    $ define SD_SDI PORTB. 12 'SPI DI to SD card pin7 DO pin
    $ define SD_CS PORTB. 15 'SPI CS to SD card pin1 CS pin
       Include "" 'Load the FAT file system
    Declare LCD_Type ALPHA
    Declare LCD_DTPin = PORTB.4
    Declare LCD_RSPin = PORTA.0
    Declare LCD_ENPin = PORTA.1
    Declare LCD_Interface = 4
    Declare LCD_Lines = 4
    Declare LCD_CommandUs = 2000
    Declare LCD_DataUs = 50
      Declare HRSOut1_Pin = PORTB.2
      Declare Hserial1_Baud = 9600 'Set baud rate to 9600
     Dim CR As $ 0D 'Carriage Return
    Dim LF As $ 0A 'Line Feed
    Dim i As Word
    Dim MyFileName As String * 11
      CLKDIV = 0 'CPU peripheral clock ratio set to 1: 1
      Write_OSCCONH (% 00000000) 'Internal OSC 8MHz
      PPS_Output (cOut_Pin_RP2, cOut_Fn_U1TX)
  PPS_Output (cOut_Pin_RP13, cOut_Fn_SCK1OUT) 'To SPI peripheral's CLK pin
  PPS_Output (cOut_Pin_RP13, cOut_Fn_SDO1) 'To SPI peripheral's SDO pin
  PPS_Input (cIn_Pin_RP12, cIn_Fn_SDI1) 'From SPI peripheral's SDI pin
  PPS_Input (cIn_Pin_RP15, cIn_Fn_SS1IN) 'SS1 Slave Select Input (SS1IN)
            Cls: DelayMS 1500
'************************************************ *************************
       MyFileName = "VL-101.DAT"
    If FAT_Init () = cErrOK Then 'Can we initialise the FAT?
        If File_Exists (MyFileName) = False Then 'Does the file already exist?
            File_Create (MyFileName) 'No. So create it
            File_Close () 'Then close it
        If File_Append (MyFileName) = cErrOK Then 'Can we append to an existing file?
            HRSOut "Writing \ r" 'Yes. So transmit a message
            Print At 2.4, "Writing"
                  GoSub Pause_1000
            File_Write "Integer Data \ r"
            For MyWord = 0 To 6 '\
                File_Write Dec MyWord, "," '| Write ASCII data to the file
            Next '/
            File_Write 13
              Global_bSeconds = 0
              Global_bMinutes = 15
              Global_bHours = 11
              Global_bDay = 12
              Global_bMonth = 11
              Global_bYear = 21
            File_Close () 'Close the file
            HRSOut "Finished Writing \ r"
            Print At 2,4, "Finished Writing"
                  GoSub Pause_1000
            HRSOut "Cannot append", MyFileName, 13
            Print At 2,4, "Cannot append"
                  GoSub Pause_1000
    Else 'Otherwise ...
        HRSOut "Cannot initialise SD \ r" 'Transmit an error response
        Print At 2,1, "Cannot initialise SD"
                  GoSub Pause_1000
'************************************************ *************************
 Pause_10: For i = 1 To 10: DelayMS 1: Next i: Return
 Pause_1000: For i = 1 To 1000: DelayMS 1: Next i: Return
 Pause_1500: For i = 1 To 1500: DelayMS 1: Nexti: Return
'************************************************ *************************
'For internal 8MHz oscillator without PLL
'OSC pins are general purpose I / O

As a result, I get: VL-101.DAT 08/01/2021 12:15
moreover, if I change the value of the day or month, then nothing changes. Only the year is recorded correctly.
I ask for help (especially from top204 as the author of the File System)


The post is quite old, but I assign all the variables (Global_bSeconds etc.) just before writing to SD and the attributes are correctly saved.

Now I'm trying to reverse the to send to a serial port the directory list of a SD card with file name, extension AND creation date & creation time ?


Hello Wimax. Can you provide a fragment of your program for recording data on an SD Card. I'm interested in where in the program you assign all the variables (Global_bSeconds etc.)


Hello Nickma,

My date & time info come from an RTC: RTC_Day, RTC_Month, RTC_Year  and so on. I assign these variables to Global_bDay, Global_bMonth etc within library.
I modified as follows:

' Set modified time & date for file
' Input     : Global variables contain the date and time
' Return    : pSectorPos
' Notes     : None
Proc FAT_SetFileTimeModified(pSectorPos As Word)

 '***************  ADDED ***************


    FAT_InsertByteIntoBuffer(pSectorPos, (Global_bSeconds / 2) | (Global_bMinutes << 5))    ' Create time & date - Seconds/Minutes
    Inc pSectorPos
    FAT_InsertByteIntoBuffer(pSectorPos, (Global_bMinutes >> 3) | (Global_bHours << 3))     ' Create time & date - Minutes/Hours
    Inc pSectorPos
    FAT_InsertByteIntoBuffer(pSectorPos, Global_bDay | (Global_bMonth << 5))                ' Create time & date - Day/Month
    Inc pSectorPos
    FAT_InsertByteIntoBuffer(pSectorPos, (Global_bMonth >> 3) | ((Global_bYear + 20) << 1)) ' Create time & date - Month/Year

In this way, when I write to SD, the creation date & time are correctly written.
Let me know if this works  ;)


Wimax, thank you. I don't have a chance to check right now, but I hope everything will be OK.


Luck does not exist: there is a moment when talent meets opportunity. SENECA