hi everyone...
i am facing a problem in my college project...
i have a 16bit unsigned integer variable and i need to store it in the 24C02 EEPROM, but that saves 8bit variable at a time...
the number i need to save is in the form of a decimal integer, how do i split it into 2 unsigned char variables..
i am using the following method
unsigned int val; unsigned char a,b; a= (val & 0xFF00)>>8; b=(val * 0x00FF);
is this code right?
and when i read it back i read it like this
unsigned int val; val= (((a & 0x00FF)<<8) | (b & 0x00FF));
is this code right? or is there any other way?
note: i obtain val initially from the user input by using this routine
unsigned int Temp2=0; Temp2*=10; Temp2+=Keypress-'0';
Keypress is the input obtained from the keyboard which is ASCII and in the range '0' to '9' and Temp2 is stored in the EEPROM using the Routine i tried
Error:
i tried saving 1234 and when i read it back i got 1024 6666 was read back as 6656 5555 was read back as 5376 1600 was read back as 1536
i wanted to know if i was splitting them right
ubit_8 unsigned char ubit_16 unsigned int
bit EEPROM24C02_Save_Data_8Bit(ubit_8 Data, ubit_8 Addr); //Data is 8bit and Addr is a 8bit adress, return 1 when sucessful
bit EEPROM24C02_Read_Data_8Bit(ubit_8 Addr); // Adress to be read, return 1 when sucessfull
what i am trying to do is split the integer into two Character bytes and place them at location ADDR and ADDR+0x01, like Big Endian method, (higher order at first and lower order at last)
/*------------------------------------------------------------------*/ bit EEPROM24C02_Save_Data_16Bit(ubit_16 Data,ubit_8 ADDR) { while(!(EEPROM24C02_Save_Data_8Bit(((Data & 0xFF00)>>8),ADDR)) && (EEPROM24C02_Save_Data_8Bit((Data & 0x00FF),ADDR+0x01))); return 1; } /*------------------------------------------------------------------*/ ubit_16 EEPROM24C02_Read_Data_16Bit(ubit_8 ADDR) { ubit_16 Temp2=0; Temp2|= EEPROM24C02_Read_Data_8Bit(ADDR); Temp2<<=8; Temp2|=EEPROM24C02_Read_Data_8Bit(ADDR+0x01); return Temp2; }
my main function is as follows to check these two functions
void main() { LCD_Initialize(); EEPROM24C02_Save_Data_16Bit(1600,Load1_Page_SL); Convert_Num_Display_16bit(EEPROM24C02_Read_Data_16Bit(Load1_Page_SL)); while(1); }
1600(dummy value) is being shown as 1536 on the LCD, The function Convert_Num_Display_16bit(ubit_16); is correct, i have double checked it.. What is wrong with the code? any corrections
With debugging, you would be able to take the value 0x1234 and split and see yourself if you get 0x12 in one byte and 0x34 in another byte.
Then you would know if you have an issue splitting, or if you have an issue merging.
I'm not joking when I say you have to figure out how to verify issues yourself. First when you do know something doesn't work and can't figure out why is it meaningful to ask on a forum. But your progress will be much higher if you do try to verify statements yourself.
Integer promotion is that a 8-bit char is converted to "int" first, before performing arithmetic on it. This is a requirement in the C language. Cheap to do for a 16-bit or 32-bit processor, but costly for an 8-bit processor where "int" is larger than any register.
So Keil have optioned to generate non-standard code with C51 depending on compiler flags. This means that when you do a shift with your 8-bit char, you shift out real bits into air. You not to explicitly typecast to (unsigned int) before you do the shift, so you have room to store your 8 "high" bits after the shift.