Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
7 years, 8 months ago.
The integer value above 250 is giving different values in 24LC256 EEPROM?
the input value is the same as output value but as we increase the value to 300 the output value is different. it comes in 2 digit units. I can't figure out what. Please tell me what i am doing wrong.
eeprom 24lc256
#include "mbed.h" #include "SerialLCD.h" SerialLCD lcd(p13,NC); int Q=300; I2C i2c(p28, p27); // sda, scl //DigitalOut wp(p29); // write protect int main() { //wp = 0; // disable write protect lcd.clear(); lcd.setPosition(0, 2); lcd.printf("Writing bytes 0-16\n"); wait(0.3); char data[10]; for(int i=0; i<16; i++) { data[0] = 0; // MSB address data[1] = i; // LSB address data[2] = i*3; // data if(i2c.write(0xA0, data, 3)) { error("Write failed\n"); } while(i2c.write(0xA0, NULL, 0)); // wait to complete } wait(0.3); data[0] = 0; // MSB address data[1] = 255; // LSB address data[2] = Q; // data if(i2c.write(0xA0, data, 3)) { error("Write failed\n"); } while(i2c.write(0xA0, NULL, 0)); // wait to complete lcd.clear(); lcd.setPosition(0, 2); lcd.printf("Setting read pointer to 0\n"); wait(0.3); data[0] = 0; // MSB address data[1] = 0; // LSB address if(i2c.write(0xA0, data, 2)) { // send address, but no data error("Write failed\n"); } lcd.printf("Reading back data bytes 0-16\n"); wait(0.3); char response[1]; for(int i=0; i<256; i++) { if(i2c.read(0xA0, response, 1)) { error("Read failed\n"); } lcd.clear(); lcd.setPosition(0, 0); lcd.printf("add %03d = %d", i, response[0]); } }
1 Answer
7 years, 8 months ago.
Data is a char array, a char is 8 bits. So you are trying to set an 8 bit value to 300, 300 required 9 bits to represent in binary. The most significant bit will be dropped and you'll get a value of 4.
If you need to write values over 255 but under 65535 (the max for 16 bits) then you need to use two bytes and set them to the high and low 8 bits of the 16 bit value. If you need more than that then you will need more than two bytes.
Thank you. so what should I change in the code. Also I would like to read more about this. Please guide me a good reading source/
posted by 20 Mar 2017#include "mbed.h" #include "SerialLCD.h" SerialLCD lcd(p13,NC); //int Q=257; I2C i2c(p28, p27); // sda, scl //DigitalOut wp(p29); // write protect int Q=257; // Point at low byte of integer int main() { //wp = 0; // disable write protect lcd.clear(); lcd.setPosition(0, 2); lcd.printf("Writing bytes 0-16\n"); wait(0.3); char data[4]; for(int i=0; i<8; i++) { data[0] = 0; // MSB address data[1] = i; // LSB address data[2] = i * 4; // data if(i2c.write(0xA0, data, 4)) { error("Write failed\n"); } while(i2c.write(0xA0, NULL, 0)); // wait to complete } data[0] = 0; // MSB address data[1] = 255; // LSB address data[2] = Q; // data data[3] = Q >> 8; if(i2c.write(0xA0, data, 4)) { error("Write failed\n"); } while(i2c.write(0xA0, NULL, 0)); // wait to complete lcd.clear(); lcd.setPosition(0, 2); lcd.printf("Setting read pointer to 0\n"); wait(0.3); data[0] = 0; // MSB address data[1] = 0; // LSB address if(i2c.write(0xA0, data, 2)) { // send address, but no data error("Write failed\n"); } lcd.printf("Reading back data bytes 0-16\n"); char response[1]; for(int i=0; i<256; i++) { if(i2c.read(0xA0, response, 1)) { error("Read failed\n"); } lcd.clear(); lcd.setPosition(0, 2); lcd. printf("addr %03d = %d", i, response[0]); } }
I tried this code but still not working
posted by 21 Mar 2017