working with external memory


Closed Thread
Results 1 to 16 of 16

Hybrid View

  1. #1
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    Six pins for an SD card.
    Dave
    Always wear safety glasses while programming.

  2. #2


    Did you find this post helpful? Yes | No

    Default Character delimiters recommended

    Your suggested data output string needs comma delimiters since you cannot be certain of the character length of each value. You could serout each word as Dec3 mYvAR to force them all to a known length but that can complicate the end use of the data. If you comma delimit each value, terminate the line with <cr><lf> and label the file as MyLog.csv then Excel can open the file and graphing the data is a breeze.

    I use word variables for TemperatureLogged = 1000 + (10*MeasuredTemperature) and depending on actual temperatures the number can have two or three digits. By adding 1000 I can send negative values without needind a sign bit. e.g 890 means -1.1C and 1234 +23.4C

    My data loggers record date & time, temperature, pressure, accelerometers for an activity indication and heart rate. I log the data to M25P128 serial memory chips.

    HTH
    BrianT

  3. #3
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Brian, thanks for the input.

    As Dave has already mentioned, the 6 pins were for the SSD card shown in his link.

    I gather that using I2C type memory chips I could use the same CLK and DTA lines that hook up to the DS1307 RTC chip, and just give the memory chip a different address, so that would save me a couple of pins?

    Given that all I really want to store is date, time, temp1, temp2, temp3, temp4 probably every two minutes what would be the ideal memory chip to get to hold a minimum of 7 days worth of data (if longer so much the better). I was also thinking of a rolling data process, so that when full it would simply delete the oldest data to make space for the most current set, ie so it retails the past 7 days (or what every it amount to) worth. Any suggestions of code to do this would be welcome.

  4. #4
    Join Date
    Aug 2004
    Posts
    64


    Did you find this post helpful? Yes | No

    Default read M25P128 ?

    Brian:
    Do you can share the read routines for the M25P128 ?. I am using the M25P16 but my reading
    is a little erratic.
    Thanks in advance...
    Ruben de la Pena V.

  5. #5


    Did you find this post helpful? Yes | No

    Default Code to read and write to M25P128

    Hi Ruben,

    Try this. I have several methods for reading and writing to the M25Pxxx family. All work but the ones not commented out are the fastest. In some infrequent calls I have left the slow routines in place as they don't add any significan time to the download of data from the M25Pxxx memory.

    [code]
    ReadFromM25P128:
    memclk = 0 'data change point
    memclk = 1 : reply.7 = memq : memclk = 0
    memclk = 1 : reply.6 = memq : memclk = 0
    memclk = 1 : reply.5 = memq : memclk = 0
    memclk = 1 : reply.4 = memq : memclk = 0
    memclk = 1 : reply.3 = memq : memclk = 0
    memclk = 1 : reply.2 = memq : memclk = 0
    memclk = 1 : reply.1 = memq : memclk = 0
    memclk = 1 : reply.0 = memq : memclk = 0
    'takes 50 uSecs per character
    debug #reply, ", " 'Debug takes 6.7 mSecs
    return


    RDSRWIP: 'reads the Status Register - waits for WIP bit to go low
    'Data from M25P128 changes on fall of clock so sample on rise of clock.
    code = $05 'Read Status Register code
    gosub sendcode
    WIPclr:
    for shift = 7 to 0 step -1 'read 8 bit reply
    high memclk : reply.0[shift] = memq : low memclk : pauseus 1
    next shift
    if reply.0 = 1 then wipclr
    return

    SendCode: 'Serial MSB first sends the CODE byte from PIC to M25P128
    TRISE.0 = 0 : PortE.0 = 0 : memclk = 0 'MemClk
    TRISC.0 = 0 : PortC.0 = 0 : memd = 0 'MemD
    ' for shift = 7 to 0 step -1 'send MSB first
    ' memclk = 0 : memd = code.0[shift] : memclk = 1: pauseus 1 : memclk = 0
    ' next shift 'this is SLOW ~500 uSecs per character
    memclk = 0
    memclk = 0 : memd = code.7 : memclk = 1
    memclk = 0 : memd = code.6 : memclk = 1
    memclk = 0 : memd = code.5 : memclk = 1
    memclk = 0 : memd = code.4 : memclk = 1
    memclk = 0 : memd = code.3 : memclk = 1
    memclk = 0 : memd = code.2 : memclk = 1
    memclk = 0 : memd = code.1 : memclk = 1
    memclk = 0 : memd = code.0 : memclk = 1
    ' much faster, takes about 52 uSecs per character
    return
    /[code]

    You can see here I have several methods for reading from the M25P128. The decrementing loop "... for shift = 7 to 0 step -1..." works and is simple BUT it takes about 500 uSecs per character.

    HTH
    BrianT

  6. #6
    Join Date
    Aug 2004
    Posts
    64


    Did you find this post helpful? Yes | No

    Default reading m25p16

    Brian:
    Thanks for your fast response...
    I am reading wav files stored in the M25P, and using this to send the address:
    cs1 = 0 'SEND COMMAND AND ADDRESS
    SHIFTOUT MOSI,SCK,1,[$03\8] 'read command $03
    SHIFTOUT MOSI,SCK,1 ,[PAGE.BYTE1\8,PAGE.BYTE0\8,00\7]'addr 000000
    I send the command and then the 24 bits address,but note in the last address byte I send
    only 7 bytes. then I go to a loop to read the data and send it to the port to convert to
    analog with a R2R network,until I find a special end of file char to stop the reading.
    If I send the 8 bits, I get shifted data. With 7 bits I got the correct data and I can identify
    the end of file byte. I do not know why.
    the read routine is this:
    ASM
    MOVLW 8
    MOVWF _CNT
    SIGUE
    BTFSS _MISO ;MOV BIT TO CHR,0
    BCF _CHR,0
    BTFSC _MISO
    BSF _CHR,0
    BSF _SCK ;READ AFTER SENDING THE CLOCK
    RLF _CHR,1
    BCF _SCK
    NOP
    NOP
    NOP
    NOP
    NOP
    DECFSZ _CNT,1
    GOTO SIGUE
    ENDASM

    Am I missing some previous command to set up the chip for reading..?

    I will test your routines to see if I got an improvement.
    Thanks again...
    Ruben de la Pena V.

  7. #7
    Join Date
    Aug 2004
    Posts
    64


    Did you find this post helpful? Yes | No

    Smile it works !...

    Brian:
    I only use the read routines for a little wav player. I use a 16F1826 at 16 mhz.(Internal Osc).
    The working routines:
    '************************************************* *****
    TESTREAD:
    CS1 = 1
    PAUSEUS 200
    CS1= 0
    code = 03 'read command
    gosub sendbyte
    code = 0 'higher add.
    gosub sendbyte
    code = 00 'high add.
    gosub sendbyte
    code = 0 'low add.
    gosub sendbyte
    nextread:
    GOSUB READBYTE
    SEROUT2 LED,32,[HEX2 REPLY," "]
    'PORTB = REPLY
    PAUSEUS 50
    GOTO nextread

    sendbyte:
    sclk = 0
    sclk = 0 : memd = code.7 : sclk = 1
    sclk = 0 : memd = code.6 : sclk = 1
    sclk = 0 : memd = code.5 : sclk = 1
    sclk = 0 : memd = code.4 : sclk = 1
    sclk = 0 : memd = code.3 : sclk = 1
    sclk = 0 : memd = code.2 : sclk = 1
    sclk = 0 : memd = code.1 : sclk = 1
    sclk = 0 : memd = code.0 : sclk = 1
    return
    Readbyte:
    sclk = 0 'data change point
    sclk = 1 : reply.7 = memq : sclk = 0
    sclk = 1 : reply.6 = memq : sclk = 0
    sclk = 1 : reply.5 = memq : sclk = 0
    sclk = 1 : reply.4 = memq : sclk = 0
    sclk = 1 : reply.3 = memq : sclk = 0
    sclk = 1 : reply.2 = memq : sclk = 0
    sclk = 1 : reply.1 = memq : sclk = 0
    sclk = 1 : reply.0 = memq : sclk = 0
    return
    '*********************************************
    I conected the M25P in port A and send the data to the PortB.
    It works up to 48 Mhz(audio), but I am using it at 16 KHZ.
    The M25P does not need anything aditional to work...
    Greetings and thanks again...
    Ruben de la Pena V.

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts