CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

"*Solved*"writing/reading external EEPROM

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
jake1272



Joined: 15 Mar 2021
Posts: 37

View user's profile Send private message

"*Solved*"writing/reading external EEPROM
PostPosted: Mon Mar 15, 2021 6:12 am     Reply with quote

The external EEPROM is - Microchip 24LC512
The compiler is CCS v5.015
The IDE is MPLAB X IDE v5.40
Using teraterm as terminal.

Hi, everyone
I am trying to input a string from the user and write it to EEPROM.
Then read and write the string back to the PC terminal and print the number of characters in the string on the terminal.
I have setup software I2C with the code below.
Any help will be appreciated.
Thanks,
Jake

Code:
#include <16F1847.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,MCLR,NOLVP
#use delay(clock=8000000)
#use rs232(Baud=9600, UART1)     //Set max BAUD rate on RS232
#define EEPROM_SDA PIN_A0       //Define I2C pins for EEPROM
#define EEPROM_SCL PIN_A1          //Add 2K resistor from each pin to +5V
#include <24512.c>     //Call EEPROM driver file

#use I2C(Master, SDA=eeprom_SDA, SCL=eeprom_SCL)


void TestEeprom (){             //Function to write 255 to EEPROM memory
unsigned long c=0;                    //locations 750 to 1000 the rest are set to 0
printf("\nInitialising Eeprom..");
init_ext_eeprom();                  //Driver function to initialise EEPROM
printf("..Ok.Now writing...\n");

while(c<1000){                           //Long variable counter from 1 to 1000
if(c<750) write_ext_eeprom (c, 0);               //Write 0 to all locations under address 750
if(c>=750) write_ext_eeprom (c, 255);             //Write 255 to the remaining addresses up to 1000
printf("\r\nWritten :%Lu-Read:%u", c, read_ext_eeprom (c));
c++ ; ///Print written and read values to RS232
}
printf("\r\n\nAll Done.\n");

}
void main(){
TestEeprom ();//Call on TestEeprom () subroutine
}


Last edited by jake1272 on Wed Mar 31, 2021 10:46 am; edited 2 times in total
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Mar 15, 2021 8:00 am     Reply with quote

so... does your test program actually work ??
jake1272



Joined: 15 Mar 2021
Posts: 37

View user's profile Send private message

PostPosted: Mon Mar 15, 2021 8:21 am     Reply with quote

temtronic wrote:
so... does your test program actually work ??


yes it does
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Mon Mar 15, 2021 8:38 am     Reply with quote

In which case, what are you actually asking?.

However a couple of comments. Currently you are using the basic 24512
driver. This only supports single byte writes to the EEPROM, so 5mSec/byte.
The 24LC512 driver supports page writes, so the whole 'string' when
you have it could be written with probably just one write. Hundreds of
times faster.
So instead of your current setup, use:
Code:

#include <16F1847.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,MCLR,NOLVP
#use delay(clock=8000000)
#use rs232(Baud=9600, UART1)     //Set max BAUD rate on RS232
#define EEPROM_SDA PIN_A0       //Define I2C pins for EEPROM
#define EEPROM_SCL PIN_A1          //Add 2K resistor from each pin to +5V
#include <24LC512.c>     //Load EEPROM driver file


Add 'ERRORS' to your RS232 #use. This should _always_ be used when
using the hardware UART, unless you add your own error handling.

Then you are going to have to read your 'string' from the UART. Look
possibly at using input.c, which has a nice simple routine 'get_string',
which allows you to specify a maximum length for your string, and
you can input this into a character array. Then instead of the byte based
write operation, use
write_ext_eeprom_bytes(ADDRESS, string_buffer, strlen(string_buffer)+1);

which will use a block write to write the entire buffer to the EEPROM.
jake1272



Joined: 15 Mar 2021
Posts: 37

View user's profile Send private message

PostPosted: Wed Mar 17, 2021 10:56 am     Reply with quote

Thank you. I have tried this instead but I could not read back the value. Any idea what I am missing ?
Many Thanks

Code:
#include <16F1847.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,MCLR,NOLVP
#use delay(clock=8000000)
#use rs232(Baud=9600, UART1)     //Set max BAUD rate on RS232
#define EEPROM_SDA PIN_A0       //Define I2C pins for EEPROM
#define EEPROM_SCL PIN_A1          //Add 2K resistor from each pin to +5V
#include <24512.c>     //Call EEPROM driver file

#include <STRING.h>

void WriteRead (){             //Function to write 255 to EEPROM memory
unsigned char inString[30];                   //locations 750 to 1000 the rest are set to 0
printf("\n\r Enter your string\n\r");

gets(inString);
printf("\n\r Input collect :%s" ,inString);

int size = 0;
while (inString[size]!= '\0')
{
    size++ ;
}
printf("\n\r Size of Input String is %d\n\r" , size);

 init_ext_eeprom();
 printf("\n\r ... Now writing %s to eeprom ..... \n\r" , inString);
 for (int i=0; i<size ; i++);
 {
     write_ext_eeprom (i, inString[i]);
 }
 printf("\n\r ... writing complete ... \n\r");
 printf("\n\r ...Reading back ... \n\r");
 
 printf(" Readback = :");
 for (int i2=0; i2 <size +1 ; i2++);
 {
     printf("%c " , read_ext_eeprom(i2));
 }}

void main(){
WriteRead ();//Call on TestEeprom () subroutine
}
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Thu Mar 18, 2021 2:36 am     Reply with quote

Rewritten to show what I was saying:
Code:

#include <16F1847.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,MCLR,NOLVP
#use delay(internal=8MHz)
#use rs232(Baud=115200, UART1, ERRORS)     //Set max BAUD rate on RS232
//you _must_ always use ERRORS, unless you are writing your own error
//handler.
//Not having this here will mean that if any character arrives on the serial
//while printing or in the EEPROM write, will mean that the UART will
//become hung...

#define EEPROM_SDA PIN_A0       //Define I2C pins for EEPROM
#define EEPROM_SCL PIN_A1          //Add 2K resistor from each pin to +5V

#include <24LC512.c>     //Load, not 'call' the EEPROM driver
#include <string.h>      //String handling
#include <stdlib.h>      //standard IO functions
#include <input.c>       //and input.c

#define STORE_AT 0L //location to store data at
#define BUFFLEN 32

void WriteRead ()
{             //Function to read string from serial and write to EEPROM
   unsigned char inString[BUFFLEN];                   //storage for input string
   
   printf("\n\r Enter your string\n\r");

   //gets(inString);
   //gets, is terrifyingly dangerous. If you type one character more than
   //the input length you have allocated, will result in complete disaster.
   //Do not use. Use get_string instead, which allows maximum length to
   //be limited
   get_string(inString, 32); //Max 31 characters with this
   printf("\n\r Input collect :%s" ,inString);

   printf("\n\r Size of Input String is %d\n\r" , strlen(inString));

   init_ext_eeprom();
   printf("\n\r ... Now writing %s to eeprom ..... \n\r" , inString);
   write_ext_eeprom_bytes(STORE_AT, inString, strlen(inString)+1);   
   printf("\n\r ... writing complete ... \n\r");
   
   printf("\n\r ...Reading back ... \n\r");
   //Read is fast. So just readback the 32bytes max allowed in the buffer
   //this then will include the null terminator.
   
   read_ext_eeprom_bytes(inString, STORE_AT, BUFFLEN);
   printf(" Readback = :%s\n\r", inString);
}
   
void main()
{
   WriteRead ();   //Call on TestEeprom () subroutine
   while (TRUE)    //prevent dropping off end, otherwise serial TX will lose last byte.
     ;
}


Be aware that this does require the EEPROM has

WP=Vss
A0=Vss
A1=Vss
A2=Vss
jake1272



Joined: 15 Mar 2021
Posts: 37

View user's profile Send private message

PostPosted: Thu Mar 18, 2021 4:20 am     Reply with quote

Thanks very much, Ttelmah.
My question might sound stupid but How can I load the 24LC512.c driver file?

I am getting the following errors
C:\Users\chris\MPLABXProjects\eeprom.X\newmain.c:20:10: Error#18 File can not be opened
Not in "C:\Program Files\PICC\devices\24LC512.c"
Not in "C:\Program Files\PICC\drivers\24LC512.c"
Not in local "24LC512.c"
Not in local "C:\Users\chris\MPLABXProjects\eeprom.X\24LC512.c"
Not in last "C:\Program Files\PICC\devices\24LC512.c"
Not in project "C:\Users\chris\MPLABXProjects\eeprom.X\24LC512.c"
C:\Users\chris\MPLABXProjects\eeprom.X\newmain.c:44:19: Error#12 Undefined identifier -- init_ext_eeprom
C:\Users\chris\MPLABXProjects\eeprom.X\newmain.c:46:26: Error#12 Undefined identifier -- write_ext_eeprom_bytes
C:\Users\chris\MPLABXProjects\eeprom.X\newmain.c:53:25: Error#12 Undefined identifier -- read_ext_eeprom_bytes
4 Errors, 0 Warnings.


Last edited by jake1272 on Thu Mar 18, 2021 4:28 am; edited 1 time in total
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Thu Mar 18, 2021 4:26 am     Reply with quote

The problem there is the age of your compiler. 5.015, is a very early V5 compiler. The LC driver was added in early 2016.
jake1272



Joined: 15 Mar 2021
Posts: 37

View user's profile Send private message

PostPosted: Fri Mar 19, 2021 5:45 am     Reply with quote

Ttelmah wrote:
The problem there is the age of your compiler. 5.015, is a very early V5 compiler. The LC driver was added in early 2016.

Thank you the code is working now
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group