Electronic Projects, forums and more.

Go Back   Electronic Circuits Projects Diagrams Free > Electronics Categories > Micro Controllers


Micro Controllers Discuss all aspects of micro controllers - building them, coding them, etc. All controllers are welcome - PIC, BASIC, Z8 Encore!, etc.

Reply
 
Tools
Old 24th May 2008, 07:57 PM   #1
Exclamation Problem to write and read from EEPROM - 16F877

Hello hi everyone... i got a problem to read and write from PIC16877 EEPROM. Here i attached together my code using PIC C LITE compiler...I hope all of u can help me. Thank You very much.


// Project 8.1 We are Online
#include <pic.h> // standard pic header file

/* Xtal frequency */
#define XTAL 4000000

// Hardware Notes:
// PIC16F627 Running at 4MHz

// Configuration Fuses
#if defined(_16F877A)
#warning PIC16F877A Selected
__CONFIG(0x3F61);

#error Unsupported PICmicro MCU Selected
#endif

// Global Variables

#define TRISLED1 TRISB0
#define TRISLED2 TRISB1
#define TRISLED3 TRISB2
#define TRISLED4 TRISB3
#define TRISLED5 TRISB4
#define TRISLED6 TRISB5
#define TRISLED7 TRISB6
#define TRISLED8 TRISB7

#define LED1 RB0
#define LED2 RB1
#define LED3 RB2
#define LED4 RB3
#define LED5 RB4
#define LED6 RB5
#define LED7 RB6
#define LED8 RB7

volatile unsigned CMCONNEW @ (unsigned) &CMCON; // LED Physical Bits
ANSEL = 0x00; // Digital I/O



// ---------------------------- Delay Function -------------------------------------------------
void Delay500Us() //500 Usec Delay Routine
{
unsigned char cnt500Us = 165; // Delay Cycle to achieve 500Us delay
while(--cnt500Us != 0) // Delay Timing is approximately 3 usec per loop
continue; // Note this routine is for 4MHz crystal frequency
}

void Delay100Ms() //100 msec Delay Routine
{
unsigned char cnt100Ms = 200; // 200 * 500 Usec = 100 msec
do
{
Delay500Us();
}while(--cnt100Ms != 0);
}

void Delay1s() // 1 sec Delay Routine
{
unsigned char cnt1Ms = 1; //10 * 100 msec = 1 sec
do
{
Delay100Ms();
}while(--cnt1Ms != 0);
}

// ---------------------------- Delay Function -------------------------------------------------


unsigned char ReadByteFromEE(unsigned char address)
{
unsigned char byte; // Variable hold the data that is read

EEADR = address; // Read from this address

RD = 1; // Initiate a read cycle

byte = EEDATA; // Fetch byte from dataregister
return byte; // Return the read byte
}


void WriteByteToEE(unsigned char data, unsigned char address)
{

EEADR = address; // Address to write to 0x00 to 0xFF
EEDATA = data; // Data to write

WREN = 1; // Enable writes to the EEProm
while(GIE)
GIE = 0; // Disable interrupts during write

EECON2 = 0x55; // Register not implemented on 16F684
EECON2 = 0xAA; // strange that this is required
WR = 1; // Initiate a write cycle


while(!EEIF); // Wait for write to complete

WREN = 0; // Disable writes to EEProm
EEIF = 0; // Clear "write complete" flag
GIE = 1; // Reenable interrupts

}



// ---------------------------- main program ---------------------------------------------------
void main()
{

TRISLED1 = 0;
TRISLED2 = 0;
TRISLED3 = 0;
TRISLED4 = 0;
TRISLED5 = 0;
TRISLED6 = 0;
TRISLED7 = 0;
TRISLED8 = 0;

LED4 = 0;
LED3 = 0;
LED2 = 0;
LED1 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;

CMCONNEW = 0b00000111; // Disabled analog function at port A

while (1 == 1) // Loop forever
{

WriteByteToEE(0x0A, 0x00);
PORTB = ReadByteFromEE(0x00);
Delay1s();
}
}
isaac82 is offline  
Old 25th May 2008, 05:00 AM   #2
Default

I can't see anything wrong with your code.

This is working code for the 18 series chips,
Code:
unsigned char ReadEEPROM(unsigned char address){
    EECON1=0;                   //ensure CFGS=0 and EEPGD=0 
    EEADR = address;
    EECON1bits.RD = 1;
    return(EEDATA);
}

void WriteEEPROM(unsigned char address,unsigned char data){
char SaveInt;
    SaveInt=INTCON;             //save interrupt status
    EECON1=0;                   //ensure CFGS=0 and EEPGD=0
    EECON1bits.WREN = 1;        //enable write to EEPROM
    EEADR = address;            //setup Address
    EEDATA = data;              //and data
    INTCONbits.GIE=0;           //No interrupts
    EECON2 = 0x55;              //required sequence #1
    EECON2 = 0xaa;              //#2
    EECON1bits.WR = 1;          //#3 = actual write
    INTCON=SaveInt;             //restore interrupts
    while(!PIR2bits.EEIF);      //wait until finished
    EECON1bits.WREN = 0;        //disable write to EEPROM
}
As you can see it is almost identical to yours. The only thing you are not doing is clearing the EEPGD bit, this bit is undefined at reset and so will need clearing.

Can you also check the generated code and make sure that the necessary sequence of asm is generated? You will find the sequence on page 35 of the data sheet.

Mike.
Pommie is online now  
Old 25th May 2008, 07:34 AM   #3
Default

What the other guy said. If you could post a hex file that I can disassemble, I could help you.
__________________
Feels good, man.
ArtemisGoldfish is offline  
Old 25th May 2008, 08:08 AM   #4
Default

I should have deleted the first line of my last post as I later found the error in your code. You need to clear the EEPGD bit in your code. It would have been nice if I could have edited my post above rather than filling the board with pointless corrections like this one.

Mike.
Pommie is online now  
Old 27th May 2008, 02:16 AM   #5
Default

thank you very much for your help. I have set EEPGD = 0, but after i compile using MPLAB, value for EEPROM still 0%. Below is my HEX file.

:06000000A001A101CB2FBD
:100F5800A5308301A000A00BAF2F08008301A001DA
:100F6800A00AB927A00BB52F0800C8308301A0003C
:100F7800AC27A00BBC2F08008301A00003178D002D
:100F880083160C1483120C080313A1000800073001
:100F9800831603139C009D0111308312A0000A30B0
:100FA800D9271130C0278600D02F8301A1008316CE
:100FB80003178C1383120313200803178D000313E0
:100FC800210803178C0083160C15EB2F8B138B1B32
:100FD800EA2F5530831603178D00AA308D008C1424
:100FE800831203130D1EF42F831603170C1183129B
:080FF80003130D128B17080012
:02400E00613F10
:00000001FF
isaac82 is offline  
Old 27th May 2008, 04:55 AM   #6
Default

I could be completely wrong here because C is not my thing. My reading of both your code and hex throws this up at me...

You don't seem to be pointing at the E2prom in your read routine, although in this particular case it's already been set to point to it by your write routine. Best to be explicit and set it to point to either Flash or E2prom in case it gets changed later on inadvertently in your code.

Also and more to the point, where are you defining your PortB output directions ?
I ask this merely because I don't see it being set in your hex file...

I don't see any other obvious problems with your read or write routines, but like I said, C is not my thing so take my comments with a pinch of salt, check em out and let us all know the outcome

rgds
tunedwolf is offline  
Old 27th May 2008, 08:07 AM   #7
Default

Quote:
Originally Posted by Pommie View Post
I should have deleted the first line of my last post as I later found the error in your code. You need to clear the EEPGD bit in your code. It would have been nice if I could have edited my post above rather than filling the board with pointless corrections like this one.

Mike.
Hi Mike,
Off topic, but I agree with your comments regarding the EDIT feature, someone in the future will try to use your original code.

The same applies to a circuit drawing errors.

Perhaps, Admin may consider our comments.
__________________
Eric " Good enough is Perfect "
I will NOT answer PM's requesting technical help, please use the Forum
PIC tutorials: Nigel's www.winpicprog.co.uk/ Bill's: www.blueroomelectronics.com/
ericgibbs is offline  
Old 27th May 2008, 08:20 AM   #8
Default

Quote:
Originally Posted by ericgibbs View Post
Hi Mike,
Off topic, but I agree with your comments regarding the EDIT feature, someone in the future will try to use your original code.

The same applies to a circuit drawing errors.

Perhaps, Admin may consider our comments.
I agree too.We need the EDIT button permanently.Some program adjustments comes to mind later time it was happend to me also.Also to edit the Circuit drawings.15 mins expire like 1 second.
__________________
Gayan

My Website
http://gsmicro.blogspot.com/

Last edited by Gayan Soyza; 27th May 2008 at 08:29 AM.
Gayan Soyza is offline  
Reply

Tags
eeprom, problem, read, write

Thread Tools
Display Modes


Similar
Title Starter Forum Replies Latest
Parallel port control port: is it Write Only or Read/Write elexhobby Electronic Projects Design/Ideas/Reviews 6 23rd December 2008 11:18 AM
Read/Write AT24CXX Serial EEPROM Using 89C51 MjWasHere Electronic Projects Design/Ideas/Reviews 3 29th February 2008 04:20 AM
data write/read from EEPROM in pic16f877 flemmard Micro Controllers 4 6th September 2007 02:07 PM
How to read & write in a Compact flash register, addressing problem? Sems Electronic Projects Design/Ideas/Reviews 0 8th February 2007 10:11 PM
Write/Read EEPROM - Basic Stamp 2 ratep2001 Micro Controllers 0 27th July 2003 06:20 PM



All times are GMT. The time now is 06:12 AM.


Electronic Circuits  |  Learning Electronics
eXTReMe Tracker