FIRST Robotics Competition Discussions

cancel
Showing results for 
Search instead for 
Did you mean: 

C/C++ I2C implementation on the cRio

I see from various discussions on Cheif Delphi and my personal experience that teams are having a hard time talking to the I2C accelerometer that was included in the 2010 KOP. There was also no supporting documentation for it in the material I downloaded. Using the data sheet from Analog Devices and some mods to the  code from the compass class in the WPI library I thought we had a solution but no luck. Is there anything we should know about as far as the NI implementation of a I2C driver or the WPI I2C Class that isn't obvious?

Has anyone got it working? Did the compass code from last year ever work? There are so many layers of abstraction in the WPI library that is a real head ache to try to track down anything.

At this point I am only interested in C or C++ solutions and not a running commentary on the pros and cons of using LabVIew vs C/C++.

Thanks in advance and Good luck programmers and mentors.


Brian

0 Kudos
Message 1 of 11
(12,126 Views)

There isn't anything especially tricky about the C++ implementation of the I2C class in WPILib.  The only thing a little bit tedious about the sensor is that it starts up with measurements disabled... so you have to turn it on.

I've written up a quick example of what it should look like, but don't have hardware here to test it.  This should at least get you started.  A tested version of this will be added to WPILib in the next update.

Cheers!

-Joe

0 Kudos
Message 2 of 11
(4,073 Views)

I've tested the implementation and fixed a bug in what I initally posted.  I've attached the fixed files.

Also in testing, I discovered a bug in the current I2C class for C++.  Please see the information here for how to fix it in the mean time (until the next update).  This is required to make the ADXL345 work as well.

Cheers!

-Joe

0 Kudos
Message 3 of 11
(4,073 Views)

Thanks for taking the lead on this Joe....We'll test it out tonite  and give you an update...

Brian

Programming Mentor Team 1714

Sr Firmware Engineer

Rockwell Automation

0 Kudos
Message 4 of 11
(4,073 Views)

One more question....How do I change I2C.cpp....Thinking I would create an alternate I2C.cpp file and make the fix, I looked at the WPI1764.zip file and examined the I2C.cpp file and did not find the bit wise or vs logical or bug you mentioned at at firstforge..Do we have access to the WPI files(I see include files  but not code files)  or code via the windriver ide? Or do we have to wait for the update.

This is what I2C::Write() looks like in the library I have...Is it the wrong stuff?

void I2C::Write(UINT8 registerAddress, UINT8 data)
{
    Synchronized sync(m_semaphore);
    m_module->m_fpgaDIO->writeI2CConfig_Address(m_deviceAddress, &status);
    m_module->m_fpgaDIO->writeI2CConfig_Register(registerAddress, &status);
    m_module->m_fpgaDIO->writeI2CConfig_DataToSend(data, &status);
    m_module->m_fpgaDIO->writeI2CConfig_Read(false, &status);
    UINT8 transaction = m_module->m_fpgaDIO->readI2CStatus_Transaction(&status);
    m_module->m_fpgaDIO->strobeI2CStart(&status);
    while(transaction == m_module->m_fpgaDIO->readI2CStatus_Transaction(&status)) taskDelay(1);
    while(!m_module->m_fpgaDIO->readI2CStatus_Done(&status)) taskDelay(1);
}

Thanks,

Brian

0 Kudos
Message 5 of 11
(4,073 Views)

The code that you posted is from last year and does not work with the current FPGA (rev 1.3.0).

Here is a link to the current source code snapshot: http://firstforge.wpi.edu/sf/frs/do/viewRelease/projects.wpilib/frs.wpilib_c_source_snapshot.wpilib_...

You can also access the source code in the svn server here: http://firstforge.wpi.edu/sf/scm/do/listRepositories/projects.wpilib/scm  You will need to be logged in to first forge to access the svn server.

Cheers!

-Joe

0 Kudos
Message 6 of 11
(4,073 Views)

well....we can download the code but we keep

getting a no robot code message on the driver console.we also cannot see any debug data on the laptop.

This is true even with un modified default code.

an old laptop with old libraries lets up down load and everything is ok....

we are using v19 of the crio image...we did the latest workbench update (I think it was the latest it is the one on the web site list of mandatory updates.

any clues??

Brian

0 Kudos
Message 7 of 11
(4,073 Views)

Run what code?  The code I posted here is library routines.  It is not an example program.  It doesn't run stand-alone.

You need to create one of these objects in your code and call the get method on it.

-Joe

0 Kudos
Message 8 of 11
(4,073 Views)

Hi Joe,

All is working now... ...we re-imaged the cRIO and made sure ALL the updates were installed...

Thanks for all the help and especially thanks for your patience....Hopefully your posts will be time stamped on the PM side of midnite soon...

If not let me know where to send the Starbucks gift card.

Brian

0 Kudos
Message 9 of 11
(4,073 Views)

Hi, I am fairly new to programming, and I have been having a similar problem with the accelerometer. I downloaded the sample code but I cannot figure out what to do after that. Can someone please give me a list of instructions.

0 Kudos
Message 10 of 11
(4,073 Views)