News:

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

Nickma

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.

Craig

#1
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 "SPI_24.inc"                                            ' Load the PIC24 SPI procedures into the program       
        Include "filesys24.inc"                                         ' Load the FAT file system procedures into the program

'-----------------------------------------------------------------------------------------------------------------------------
' SD Card
'=============================================================================================================================
SD_Card:
   
    If Card_Detect = 0 Then
     DelayMS 10
     High RF_LED
    Else Low RF_LED
    EndIf

    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
     EndIf

    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
    EndIf                                                                     
' ------------------------------------------------------------------------------------
' 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)
       Wend
       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)
       EndIf
       Else
      ' HRSOut "Cannot append ", MyFileName, 13
       string2Hold = "Cant appd"
       string2Print = MyFilename + string2Hold
       Print_At(ArialNarrow8,4,5,"SD:" + Str string2Print + "     ",0)
       EndIf
       Else                                                                      ' Otherwise...
       ' HRSOut "Cannot initialise SD\r"                                         ' Transmit an error response
       string2Hold = "Cant Int"
       Print_At(ArialNarrow8,4,5,Str string2Hold,0)
      EndIf
 
Return

'--------------------------

Regards
Craig

Nickma

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 FileSys.inc file in Includes for Proton24) My attributes are being written, but the data that I am trying to write is not written at all.

Nickma

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 "FileSys24.inc" '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
'************************************************ *************************
Main:
       MyFileName = "VL-101.DAT"
                  Cls
    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
        EndIf
         
        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
        Else
            HRSOut "Cannot append", MyFileName, 13
            Print At 2,4, "Cannot append"
                  GoSub Pause_1000
        EndIf
    Else 'Otherwise ...
        HRSOut "Cannot initialise SD \ r" 'Transmit an error response
        Print At 2,1, "Cannot initialise SD"
                  GoSub Pause_1000
    EndIf
 End
'************************************************ *************************
 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
   Config Config1 = JTAGEN_OFF, GCP_OFF, BKBUG_OFF, COE_OFF, ICS_PGx1, FWDTEN_OFF, WINDIS_OFF, FWPSA_PR128, WDTPOST_PS256
   Config Config2 = IOL1WAY_OFF, COE_OFF, IESO_OFF, FNOSC_FRC, FCKSM_CSECME, OSCIOFNC_ON, POSCMOD_NONE

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)

Wimax

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 problem...how to send to a serial port the directory list of a SD card with file name, extension AND creation date & creation time ?

Nickma

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.)

Wimax

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 FileSys24.inc library.
I modified FileSys24.inc 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 ***************
 '**************************************
 
Global_bDay=RTC_Day 
Global_bMonth=RTC_Month 
Global_bYear=RTC_Year 

Global_bHours=RTC_Hour
Global_bMinutes=RTC_Minute
Global_bSeconds=RTC_Second 

    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
EndProc

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


Nickma

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

wirecut

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

Nickma

Wimax, thanks for the tip. The solution is simple and effective. Everything works well.
There was a problem with the length of the file name. The file with the name "VLA105.DAT" is created normally,  the file named "VLAG105.DAT" is created, but the name is cut off, but the file name "VLAGA101.DAT" (format 8.3) the file itself is not created. I hope you have a solution to this problem. If possible, I would like to receive your corrected file FileSys.24 (can be sent to e-mail). Thank you.







Wimax

Hello Nickma,

I'm glad it worked out.
Regarding the problem you reported, I made some trials and I can confirm that the VLAGA101.DAT" is correctly created.
I'll send you a PM.


Nickma

Thank you, I'll be waiting...

Wimax

Hi,

I sent you the file just now. Let me know if it works as I hope.