|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
|
|
#1
|
||||
|
||||
|
EEPROM Code
I've just posted software that can be used to read and write the Electrically Erasable Programmable Read-Only Memory (EEPROM) found in IFI's robot controllers. The code can be found here: http://kevin.org/frc. As always, if you find a bug in the code or a problem with the documentation, please let me know.
-Kevin Here's the readme file: Code:
The source code in eeprom.c/.h contains software to read from and write to the Electrically Erasable Programmable Read-only Memory (EEPROM) contained within your robot controller's processor. Storing information in EEPROM has the advantage of being permanent, unlike Random Access Memory (RAM), which gets reinitialized each time you reset or restart your robot controller. See the code in Process_Data_From_Master_uP() for an example application of this software. This source code will work with the Robovation (A/K/A EDU-RC) robot controller and the FIRST Robotics robot controller. The included project files were built with MPLAB version 7.20. If your version of MPLAB complains about the project version, the best thing to do is just create a new project with MPLAB's project wizard. Include every file except: FRC_alltimers.lib and ifi_alltimers.lib and you should be able to build the code. **************************************************************** Three things must be done before this software will work correctly with your robot controller: 1) You need to add eeprom.c and eeprom.h to your project. Do this by copying the two files to your project directory and then right clicking on "Source Files" in the project tree, selecting "Add Files...", if necessary, navigate to the project directory and then double click on eeprom.c. Repeat the above procedure for eeprom.h under "Header Files". 2) A #include statement for the eeprom.h header file must be included at the beginning of each source file that calls the functions in eeprom.c. The statement should look like this: #include "eeprom.h". 3) The function EEPROM_Write_Handler() function must be called from Process_Data_From_Master_uP() each time it executes. **************************************************************** Here's a description of the functions in eeprom.c: EEPROM_Read() Reads data from EEPROM. EEPROM_Write() Places new write data on the EEPROM write queue. This function returns a value of one if there was an available slot on the queue, zero if there wasn't. EEPROM_Queue_Free_Space() should be called to determine if enough free space is available on the queue before calling EEPROM_Write(). By default, there are sixteen slots available. The number of usable slots is defined in eeprom.h. EEPROM_Write_Handler() If buffered EEPROM write data is present (i.e., EEPROM_Write() has been called), this function will write one byte to EEPROM each time it is called. A call to this function should be placed in and called each time Process_Data_From_Master_uP() is called. If, on average, you need to write more than one byte of data to EEPROM each time Process_Data_From_Master_uP() is called, you can call it multiple times each loop. If you start experiencing wacky behavior when your 'bot runs or get the red-light-of-death, you might be attempting to write too much data too quickly. Because it takes 2 milliseconds to write each byte of data to EEPROM and all interrupts are disabled during this period, don't write data to EEPROM when you need to service interrupts. EEPROM_Queue_Free_Space() Returns the number of free slots available on the EEPROM write queue. This function should be called to determine if enough free space is available on the write queue before calling EEPROM_Write(). |
|
#2
|
||||
|
||||
|
Re: EEPROM Code
THANK YOU!!!!!!!!!
(Bows and kisses Kevin's feet) The possibilities are so good. P.S. Do you know if this will work on the VEXtroller? P.P.S: Did I say thak you? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (Rather than Double Post) How does data need to be formatted when you pass it to the EEPROM_Write() function? Can you send variables by name? Could you call this function using your printf/serial driver. For instance, type "Field Side: Left," and then have this set a variable (such as "rss" - robot start side") equal to 1 (for instance). And then have the handler write to the EEPROM so that when the robot is turned on again, it knows what side it is on without a switch. Also, I am assuming that the read time is negligable compared to the write time (I.E. one does not need to woory about avoiding interrupts when reading?) Last edited by CJO : 11-10-2005 at 20:00. |
|
#3
|
|||||
|
|||||
|
Re: EEPROM Code
Sweet.
We were considering using the EEPROM when we ran out of code space last year, and this ought to make it a lot easier to do. Thanks! |
|
#4
|
||||
|
||||
|
Re: EEPROM Code
Quote:
Code:
#include <math.h>
#include "eeprom.h"
unsigned int i;
unsigned char data;
//create a zero to ninety degree lookup table
for(i=0; i<=90; i++)
{
// wait, if necessary, for a free slot on the circular queue
while(EEPROM_Queue_Free_Space() == 0);
// normalize the output to the maximum value a byte variable can hold
data = (unsigned char)(255.0 * sin((float)i * 3.14159 / 180.0));
EEPROM_Write(i, data);
}
-Kevin Last edited by Kevin Watson : 11-10-2005 at 22:02. |
|
#5
|
||||
|
||||
|
Re: EEPROM Code
Very cool, thanks.
|
|
#6
|
||||
|
||||
|
Re: EEPROM Code
Hi Kevin,
Thanks for all the effort, it looks great and we'll definately be using it. I'd like to make one suggestion though. With so many novice progammers using your code, it's likely that someone will use the EEPROM_Write() function too much, even when the data doesn't need to be updated. A small change to EEPROM_Write() might avoid problems for these folks. Code:
unsigned char EEPROM_Write(unsigned int address, unsigned char data)
{
unsigned char return_value;
// determine if this is really new data
if(data == EEPROM_Read(address))
{
return_value = 1;
}
else if(eeprom_queue_full == FALSE) // return error flag if the queue is full
{
// put the byte and its address on their respective circular queues
eeprom_queue_data[eeprom_queue_write_index] = data;
eeprom_queue_address[eeprom_queue_write_index] = address;
Thanks again for all the hard work. |
|
#7
|
||||
|
||||
|
Re: EEPROM Code
Quote:
-Kevin |
|
#8
|
||||
|
||||
|
Re: EEPROM Code
So, to write "127" to the first data block would be
Quote:
Quote:
|
|
#9
|
||||
|
||||
|
Re: EEPROM Code
Yes, that will work.
-Kevin |
|
#10
|
||||
|
||||
|
Re: EEPROM Code
hrmm. I love the simplicity of this. Last year, i wrote overly complex EEPROM routines to allow data of arbitrary length to be stored with dynamic allocation and FAT table. It turns out, not a whole lot of that functionality was ever needed. A scheme like yours would have workded just fine. It makes me want to smack myself in the face and say "duh".
|
|
#11
|
|||
|
|||
|
Re: EEPROM Code
How much variable is space is available in the onboard EEPROM?
|
|
#12
|
||||
|
||||
|
Re: EEPROM Code
Quote:
-Kevin |
|
#13
|
||||
|
||||
|
Re: EEPROM Code
It will write only when there is no free space in the write que?
|
|
#14
|
||||
|
||||
|
Re: EEPROM Code
It risks getting caught in an infinite loop waiting for the queue and breaks the comm sync on the controller?
|
|
#15
|
||||
|
||||
|
Re: EEPROM Code
Quote:
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Out of the Box Camera Code | russell | Programming | 9 | 21-10-2009 05:28 |
| Code suddenly fails to initialize | miketwalker | Programming | 11 | 19-02-2005 15:23 |
| Team THRUST - Kevin's Code and Camera Code Combine | Chris_Elston | Programming | 3 | 31-01-2005 22:28 |
| Sourceforge for Code Repository and other stuff | SilverStar | Programming | 9 | 15-01-2005 21:16 |
| heres the code. y this not working | omega | Programming | 16 | 31-03-2004 15:18 |