Go Down

Topic: I2C is different between MEGA and UNO? (Read 1 time) previous topic - next topic

jimbo.we

I have been experience some I2C problems between MEGA and UNO. First I wire a I2C device#1 to MEGA, and works fine. Then I wire the device#1 to UNO and the same program, and it doesn't work.

A few days later, I did another experiment. I wire I2C device#2?which works with UNO each time) to MEGA, and it doesn't work with the same program.

Then I did a final test with I2C device#3, I work with MEGA at both 400kbps and 100kbps rate, but device#3 can only works with UNO at 100kbps rate.

Can anyone tell me the reason?
http://www.geekonfire.com
Open Source, open-minded!

Nick Gammon

What program? What wiring? More details.
http://www.gammon.com.au/electronics

jimbo.we

#2
Sep 04, 2012, 06:16 pm Last Edit: Sep 05, 2012, 11:15 am by jimbo.we Reason: 1

What program? What wiring? More details.

One of the device is http://www.geekonfire.com/wiki/index.php?title=I2C_OLED_Panel(128x64)#Resources. It works on UNO and MEGA at 100kbps, but at 400kbps only works at MEGA.(I have tested it on MEGA2560,MEGA1280 and MEGA Olympic)

code in library:
   //uint8_t twbrbackup = TWBR;
   //TWBR = 12; // upgrade to 400KHz!
//    TWBR = twbrbackup;
if I enable the above sentences, It doesn't work at UNO.
Code: [Select]

void GOFi2cOLED::display(void) {
 sendCommand(0x00 | 0x0);  // low col = 0
 sendCommand(0x10 | 0x0);  // hi col = 0
 sendCommand(0x40 | 0x0); // line #0

   // save I2C bitrate
   //uint8_t twbrbackup = TWBR;
   //TWBR = 12; // upgrade to 400KHz!

   // I2C
   #if defined(ARDUINO) && ARDUINO >= 100
   for (uint16_t i=0; i<(128*64/8); i++)
   {
     // send a bunch of data in one xmission
     Wire.beginTransmission(SlaveAddress);
     Wire.write(GOFi2cOLED_Data_Mode);            // data mode
     for (uint8_t x=0; x<16; x++)
     {
       Wire.write(buffer[i]);
       i++;
     }
     i--;
     Wire.endTransmission();
   }      
   #else
   for (uint16_t i=0; i<(128*64/8); i++)
   {
     // send a bunch of data in one xmission
     Wire.beginTransmission(SlaveAddress);
     Wire.send(GOFi2cOLED_Data_Mode);            // data mode
     for (uint8_t x=0; x<16; x++)
     {
       Wire.send(buffer[i]);
       i++;
     }  
     i--;
     Wire.endTransmission();
   }
   #endif    
//    TWBR = twbrbackup;
}
http://www.geekonfire.com
Open Source, open-minded!

johnnyonthespot

#3
Sep 04, 2012, 09:47 pm Last Edit: Sep 04, 2012, 09:50 pm by johnnyonthespot Reason: 1
There is confusion when you say "enable all above sentences". Please post the specific code which works on the atmega2560 but not the Uno. (code that I can copy and paste into an IDE, without having to physically take out specific comments you have).

Nick Gammon

Please edit your post, select the code, and put it between [code] ... [/code] tags.

You can do that by hitting the # button above the posting area.
http://www.gammon.com.au/electronics

jimbo.we

http://www.geekonfire.com
Open Source, open-minded!

Go Up