|
|
View previous topic :: View next topic |
Author |
Message |
hobiadami
Joined: 17 Oct 2006 Posts: 35 Location: City of Concrete
|
18F4620 internal eeprom problem. |
Posted: Fri Feb 12, 2010 4:02 pm |
|
|
Hi all,
The Microchip datasheet says the 18F4620 has got 1024 bytes of eeprom.
But my program seems to overwrite the data from the start when the address given in write_eeprom() exceeds 0xFF. So I can only use 256 bytes of eeprom of my pic18f4620.
I've written a simple sample code for testing.
The code writes to address 0 first and checks it to verify.
Then writes to address 0x100 and again checks it to verify.
Then it reads and displays the data written at address 0 again.
and the data in address 0 is overwritten with the data that should be in 0x100.
The serial port output is like this:
EEPROM TEST 1
OK
value in address 0 is 123
EEPROM TEST 2
OK
value in address 0 is 56
What should I do to use the entire 1kbyte eeprom range of the pic 18f4620?
Thanks in advance.
Code: |
#include <18F4620.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
void main() {
printf("EEPROM TEST 1\r\n");
write_eeprom( 0 , 123 );
if ( read_eeprom( 0 ) == 123 ) printf("OK\r\n");
else printf("FAILED\r\n");
printf("value in address 0 is %u\r\n", read_eeprom( 0 ));
printf("EEPROM TEST 2\r\n");
write_eeprom( 0x100 , 56 );
if ( read_eeprom( 0x100 ) == 56 ) printf("OK\r\n");
else printf("FAILED\r\n");
printf("value in address 0 is %u\r\n", read_eeprom( 0 ));
while(TRUE); // wait for a reset
}
|
_________________ www.endtas.com |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Feb 12, 2010 4:27 pm |
|
|
Post your compiler version. |
|
|
hobiadami
Joined: 17 Oct 2006 Posts: 35 Location: City of Concrete
|
|
Posted: Fri Feb 12, 2010 4:40 pm |
|
|
it is 4.084 _________________ www.endtas.com |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Feb 12, 2010 5:21 pm |
|
|
It worked for me. I installed an 18F4620 on a PicDem2-Plus board
and I installed PCH vs. 4.084, and ran it, and I got this result:
Quote: |
EEPROM TEST 1
OK
value in address 0 is 123
EEPROM TEST 2
OK
value in address 0 is 123
|
Are you doing this test in real hardware or are you running Proteus ? |
|
|
hobiadami
Joined: 17 Oct 2006 Posts: 35 Location: City of Concrete
|
|
Posted: Fri Feb 12, 2010 5:33 pm |
|
|
Sorry to take your time, I tried on a real pic and it worked. At first trial, it was on proteus. _________________ www.endtas.com |
|
|
hobiadami
Joined: 17 Oct 2006 Posts: 35 Location: City of Concrete
|
|
Posted: Sat Feb 13, 2010 2:56 am |
|
|
Hello again, I've now written a small code to produce a table for saving the users of a specific device that is powered by this pic18F4620.
Every row the table consists of 5 bytes for identity card data, 10 bytes for name, and 4 bytes for password.
Sending 'u' on the serial port makes the program list saved users on the same serial port. there are 6 first users embedded in the code.
Sending 'c' makes the device add one more user to the table.
It adds users without problems until user 10.
It adds user 10 with a spoiled password then the following users with completely corrupt data.
What am I doing wrong?
Code: |
#include <18F4620.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOLVP
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=MODEM)
#rom int8 0xf00000={1} // MODE
#rom int8 0xf00001={25} // SET1
#rom int8 0xf00002={22} // SET2
#rom int8 0xf00005={6} // # of saved users
// 5 byte identity card no | 10 byte name record | 4-6 chr password
#rom int8 0xf0003A={ 0x1C,0x00,0x40,0xD8,0xF4, 'H','a','k','k','i',' ',' ','B','e','y', 1,1,1,1 }
#rom int8 0xf0004D={ 0x1C,0x00,0x40,0xC8,0x00, 'T','e','k','n','i','s','y','e','n','2', 2,2,2,2 }
#rom int8 0xf00060={ 0x1C,0x00,0x40,0xC8,0x4B, 'T','e','k','n','i','s','y','e','n','3', 3,3,3,3 }
#rom int8 0xf00073={ 14, 0, 42, 181, 64, 'Z','a','f','t','r','a',' ','t','a','n', 4,4,4,4 }
#rom int8 0xf00086={ 160, 0, 3, 227, 225, 'M','u','s','t','a','f','a','B','e','y', 5,5,5,5 }
#rom int8 0xf00099={ 11, 0, 3, 7, 61, 'A','l','u','v',' ','y','o','t','a','n', 6,6,6,6 }
///////////////////////////////////
void kulist(){
int sayma;
for (sayma = 0 ; sayma < read_eeprom(5) ; sayma++ ) {
fprintf( MODEM , "Person:%02u Card:%03u %03u %03u %03u %03u ",sayma, read_eeprom( 0x3A + sayma * 19 ),read_eeprom( 0x3B + sayma * 19 ),read_eeprom( 0x3C + sayma * 19 ),read_eeprom( 0x3D + sayma * 19 ),read_eeprom( 0x3E + sayma * 19 ) );
fprintf( MODEM , "Name:%c%c%c%c%c%c%c%c%c%c ", read_eeprom( 0x3F + sayma * 19 ),read_eeprom( 0x40 + sayma * 19 ),read_eeprom( 0x41 + sayma * 19 ),read_eeprom( 0x42 + sayma * 19 ),read_eeprom( 0x43 + sayma * 19 ),read_eeprom( 0x44 + sayma * 19 ),read_eeprom( 0x45 + sayma * 19 ),read_eeprom( 0x46 + sayma * 19 ),read_eeprom( 0x47 + sayma * 19 ),read_eeprom( 0x48 + sayma * 19 ) );
fprintf( MODEM , "Pass:%1u%1u%1u%1u\n\r", read_eeprom( 0x49 + sayma * 19 ),read_eeprom( 0x4A + sayma * 19 ),read_eeprom( 0x4B + sayma * 19 ),read_eeprom( 0x4C + sayma * 19 ) );
}
}
//------------------------------------------------------
void kulyap(){
int sayma;
sayma = read_eeprom(5);
sayma++;
write_eeprom(5, sayma);
sayma--;
write_eeprom((int16) sayma*19 + 0x3A, 0);
write_eeprom((int16) sayma*19 + 0x3B, 0);
write_eeprom((int16) sayma*19 + 0x3C, 0);
write_eeprom((int16) sayma*19 + 0x3D, 0);
write_eeprom((int16) sayma*19 + 0x3E, 0);
write_eeprom((int16) sayma*19 + 0x3F, '-');
write_eeprom((int16) sayma*19 + 0x40, '-');
write_eeprom((int16) sayma*19 + 0x41, '-');
write_eeprom((int16) sayma*19 + 0x42, '-');
write_eeprom((int16) sayma*19 + 0x43, '-');
write_eeprom((int16) sayma*19 + 0x44, '-');
write_eeprom((int16) sayma*19 + 0x45, '-');
write_eeprom((int16) sayma*19 + 0x46, '-');
write_eeprom((int16) sayma*19 + 0x47, '-');
write_eeprom((int16) sayma*19 + 0x48, '-');
write_eeprom((int16) sayma*19 + 0x49, 0);
write_eeprom((int16) sayma*19 + 0x4A, 0);
write_eeprom((int16) sayma*19 + 0x4B, 0);
write_eeprom((int16) sayma*19 + 0x4C, 0);
kulist();
}
//------------------------------------------------------
void main() {
int komut;
while(TRUE){
if( kbhit(MODEM)) {
komut = getc(MODEM);
fprintf( MODEM , "Command : %c\n\r" , komut );
if ( komut == 'u' ) kulist(); // List users
if ( komut == 'c' ) kulyap(); // Create new user
}
}
}
|
|
|
|
hobiadami
Joined: 17 Oct 2006 Posts: 35 Location: City of Concrete
|
|
Posted: Sat Feb 13, 2010 3:08 am |
|
|
I've got an ICD-U64 but I can not use it as a debugger, I only use it as an in-circuit serial programmer.
When I enable the debugger on the ide's debug menu, it connects and loads etc, and at the bottom of the debug window it says 'Ready MCU, 1Mhz.
But the pic18f4620 should be running at 8mhz. Though it runs slower than written in the #use delay(clock=8000000) line, it can not communicate with the other chips on the board, RTC, exEE, LCD screen, serial ports etc.
How can I fix this and enable the debugger run my pic with the correct oscillator freq? _________________ www.endtas.com |
|
|
hobiadami
Joined: 17 Oct 2006 Posts: 35 Location: City of Concrete
|
ICD |
Posted: Sun Feb 14, 2010 3:49 am |
|
|
After fixing the cable between the ICD unit and my circuit board, the ICD started working, thanks god.
The white plastic telephone connector on the unit is not good, it is the same for both ICD units at my hand. when I insert the connector in a normal way until I hear the click, unit doesnt work. But if I wrap a rubber o-ring around the unit which more firmly presses the connector in, then the units start working.
The MCU oscillator speed shown in the debugger is still 1mhz and the debugging is very very slow.
the lines in the code which send a stream of data to the pc for example, each character take around 5 seconds to be sent. this makes debugging very difficult and time consuming.
any suggestions? _________________ www.endtas.com |
|
|
hobiadami
Joined: 17 Oct 2006 Posts: 35 Location: City of Concrete
|
SOLVED |
Posted: Sun Feb 14, 2010 6:48 am |
|
|
Thanks guys,
It had been because of using 8 bit addresses for write_eeprom statements. Now all is working fine. _________________ www.endtas.com |
|
|
the_dalga
Joined: 27 Jun 2012 Posts: 5
|
PIC18F4620 And Proteus |
Posted: Sun Aug 05, 2012 2:24 am |
|
|
It doesn't works on Proteus.
But in real pic it is okay.
İs there anybody now how to simulate it in Proteus (higher eeprom address 255 for pic18f4620) ? |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Sun Aug 05, 2012 9:14 am |
|
|
Your question does not belong here. This is not a Proteus forum.
Go try your question in the Proteus forum.... _________________ Google and Forum Search are some of your best tools!!!! |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Mon Aug 06, 2012 6:34 am |
|
|
Quote: | It doesn't works on proteus.
But in real pic it is okay.
İs there anybody now how to smulate it in proteus (higher eeprom address 255 for pic18f4620) |
You've answered your own question.
It works on real hardware.
So, why waste time working with Proteus?
Nobody here will help you with Proteus, it's so full of bugs. Throw it away.
Mmike |
|
|
the_dalga
Joined: 27 Jun 2012 Posts: 5
|
|
Posted: Tue Aug 07, 2012 3:43 pm |
|
|
Mike Walne wrote: | Quote: | It doesn't works on proteus.
But in real pic it is okay.
İs there anybody now how to smulate it in proteus (higher eeprom address 255 for pic18f4620) |
You've answered your own question.
It works on real hardware.
So, why waste time working with Proteus?
Nobody here will help you with Proteus, it's so full of bugs. Throw it away.
Mmike |
Mike I have no debug card so I need for debugging. I apply your opinion. Proteus have so many bugs. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
Debugging |
Posted: Tue Aug 07, 2012 4:40 pm |
|
|
At the risk of having my knuckles rapped again, you can simulate most functions with MPLAB SIM.
It has the advantage of being free, it's not perfect, but gives reasonable results.
Mike |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Tue Aug 07, 2012 6:31 pm |
|
|
and if all the 'simulators' still fail...
use the tried and true method, squared paper,the listing and a pencil.
'play PIC' and single step your program line by line.
Yes, it's slow..until you've done it a few times
Yes, it's NOT hitech...
Yes, it's an 'old school' approach
YES, it does work 100% of the time. |
|
|
|
|
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
|