From: Black, M. <Michael.Black@EssexCorp.com> - 2007-06-28 14:57:04
|
580 =3D 0x244 324 =3D 0x144 512 =3D 0x200 256 =3D 0x100 So you've got a bit-shift on the high byte. Are you acking each byte? ___________________ Michael D. Black Essex bl...@es... -----Original Message----- From: gum...@li... [mailto:gum...@li...] On Behalf Of fo...@it... Sent: Thursday, June 28, 2007 9:44 AM To: gum...@li... Subject: Re: [Gumstix-users] Unusually Long Delay for ATMega128 Hi Dave, Thanks for looking at this. After carrying out many tests, I found that the error is not related to the timer code after all. Instead, it appears that the data is being corrupted in the I2C transfer. For example, I passed 580 across I2C, and I decoded 324 on the gumstix. Passing 512 from the robostix resulted in 256 on the gumstix. Here is what I am doing: // ***************************************************************** // < In i2c-Sensor-io.h typedef struct { uint8_t SensorIdx; ///< Index of the sensor to be triggered. uint8_t Sts; ///< Status of the Read command uint16_t dist; ///< Distance value returned by the sensor. } I2C_IO_TrgrPing_Snsr_t; #define I2C_IO_TRGR_PING_SNSR 0x21 // ***************************************************************** //< In I2C-Sensor-io-api.c int I2C_IO_Trgr_PING_Snsr( int i2cDev, uint8_t SensorIdx, uint16_t* range, uint8_t* status ) { uint8_t bytesRead =3D 0; I2C_IO_TrgrPing_Snsr_t trgrPing; trgrPing.SensorIdx =3D SensorIdx; if ( I2cProcessBlock( i2cDev, I2C_IO_TRGR_PING_SNSR, &SensorIdx, sizeof( SensorIdx ), &trgrPing, sizeof( trgrPing ), &bytesRead ) !=3D 0 ) { LogError( "I2C_IO_Trgr_PING_Sensor: I2cProcessBlockFailed: %s (%d)\n", strerror( errno ), errno ); return FALSE; } *range =3D trgrPing.dist; *status =3D trgrPing.Sts; return TRUE; } // I2C_IO_Trgr_PING_Sensor // ***************************************************************** // < In I2C-Sensor.c (runs on the robostix). Part of my ProcessCommand() // function. case I2C_IO_TRGR_PING_SNSR: { uint8_t *SensorIdx =3D (uint8_t *)&packet->m_data[2]; PingStatus[(*SensorIdx)] =3D ReadPingSensor( *SensorIdx, Dist ); I2C_IO_TrgrPing_Snsr_t *trgr =3D (I2C_IO_TrgrPing_Snsr_t *)&packet->m_data[ 1 ]; // +1 for cmd, +1 for len trgr->Sts =3D PingStatus[(*SensorIdx)]; trgr->dist =3D Dist[(*SensorIdx)]; packet->m_data[ 0 ] =3D sizeof( *trgr ); return sizeof( *trgr ) + 1; // + 1 for len; } // ***************************************************************** Daniel > I took a look at the code and nothing really obvious stands out at me. > > A few things I noticed, which might just be because I don't have all of the code. > > 1 - TIM16_StartTCNT1 enables the overflow interrupt without clearing it first. So if the flag happened to be set it would cause the handler to fire immediately. > 2 - I didn't see a handler for the overflow interrupt on timer 1. 3 - What optimization flags are ------------------------------------------------------------------------ - This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ gumstix-users mailing list gum...@li... https://lists.sourceforge.net/lists/listinfo/gumstix-users =20 =20 =20 =20 =20 =20 =20 This electronic message and any files transmitted with it contain = information which may be privileged and/or proprietary. The information = is intended for use solely by the intended recipient(s). If you are not = the intended recipient, be aware that any disclosure, copying, = distribution or use of this information is prohibited. If you have = received this electronic message in error, please advise the sender by = reply email or by telephone (301-939-7000) and delete the message. |