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.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
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.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

jimbo.we

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

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy