Arduino Code not executing after Wire.endTransmission line

匿名 (未验证) 提交于 2019-12-03 09:58:14

问题:

I am working on a project, syncing Nintendo Nunchuk with Arduino. I found a code online for the same from http://letsmakerobots.com/node/5684

Here, is the code

#include <Wire.h>;  void setup(){ Serial.begin(19200); nunchuck_setpowerpins(); nunchuck_init(); Serial.print("Nunchuck ready\n"); }  void loop(){ nunchuck_get_data(); nunchuck_print_data(); delay(1000); } //======================================================================================================================================================================================================// //Do not modify!!!!!!!! //======================================================================================================================================================================================================//   // // Nunchuck functions //  static uint8_t nunchuck_buf[6]; // array to store nunchuck data,  // Uses port C (analog in) pins as power & ground for Nunchuck  static void nunchuck_setpowerpins() { #define pwrpin PORTC3 #define gndpin PORTC2 DDRC |= _BV(pwrpin) | _BV(gndpin); PORTC &=~ _BV(gndpin); PORTC |= _BV(pwrpin); delay(100); // wait for things to stabilize }  // initialize the I2C system, join the I2C bus, // and tell the nunchuck we're talking to it void nunchuck_init() { Wire.begin();    // join i2c bus as master Wire.beginTransmission(0x52);   // transmit to device 0x52 Wire.send(0x40);     // sends memory address Wire.send(0x00);     // sends sent a zero. Wire.endTransmission(); // stop transmitting }  // Send a request for data to the nunchuck // was "send_zero()" void nunchuck_send_request() { Wire.beginTransmission(0x52);   // transmit to device 0x52 Wire.send(0x00);     // sends one byte Wire.endTransmission(); // stop transmitting }  // Receive data back from the nunchuck, // returns 1 on successful read. returns 0 on failure int nunchuck_get_data() { int cnt=0; Wire.requestFrom (0x52, 6); // request data from nunchuck while (Wire.available ()) { // receive byte as an integer nunchuck_buf[cnt] = nunchuk_decode_byte(Wire.receive()); cnt++; } nunchuck_send_request(); // send request for next data payload // If we recieved the 6 bytes, then go print them if (cnt >= 5) { return 1; // success } return 0; //failure }  // Print the input data we have recieved // accel data is 10 bits long // so we read 8 bits, then we have to add // on the last 2 bits. That is why I // multiply them by 2 * 2 void nunchuck_print_data() { static int i=0; int joy_x_axis = nunchuck_buf[0]; int joy_y_axis = nunchuck_buf[1]; int accel_x_axis = nunchuck_buf[2]; // * 2 * 2; int accel_y_axis = nunchuck_buf[3]; // * 2 * 2; int accel_z_axis = nunchuck_buf[4]; // * 2 * 2;  int z_button = 0; int c_button = 0;  // byte nunchuck_buf[5] contains bits for z and c buttons // it also contains the least significant bits for the accelerometer data // so we have to check each bit of byte outbuf[5] if ((nunchuck_buf[5] >> 0) & 1) z_button = 1; if ((nunchuck_buf[5] >> 1) & 1) c_button = 1;  if ((nunchuck_buf[5] >> 2) & 1) accel_x_axis += 2; if ((nunchuck_buf[5] >> 3) & 1) accel_x_axis += 1;  if ((nunchuck_buf[5] >> 4) & 1) accel_y_axis += 2; if ((nunchuck_buf[5] >> 5) & 1) accel_y_axis += 1;  if ((nunchuck_buf[5] >> 6) & 1) accel_z_axis += 2; if ((nunchuck_buf[5] >> 7) & 1) accel_z_axis += 1;  Serial.print(i,DEC); Serial.print("\t");  Serial.print("joy:"); Serial.print(joy_x_axis,DEC); Serial.print(","); Serial.print(joy_y_axis, DEC); Serial.print(" \t");  Serial.print("acc:"); Serial.print(accel_x_axis, DEC); Serial.print(","); Serial.print(accel_y_axis, DEC); Serial.print(","); Serial.print(accel_z_axis, DEC); Serial.print("\t");  Serial.print("but:"); Serial.print(z_button, DEC); Serial.print(","); Serial.print(c_button, DEC);  Serial.print("\r\n"); // newline i++; }  // Encode data to format that most wiimote drivers except // only needed if you use one of the regular wiimote drivers char nunchuk_decode_byte (char x) { x = (x ^ 0x17) + 0x17; return x; }  // returns zbutton state: 1=pressed, 0=notpressed int nunchuck_zbutton() { return ((nunchuck_buf[5] >> 0) & 1) ? 0 : 1; // voodoo }  // returns zbutton state: 1=pressed, 0=notpressed int nunchuck_cbutton() { return ((nunchuck_buf[5] >> 1) & 1) ? 0 : 1; // voodoo }  // returns value of x-axis joystick int nunchuck_joyx() { return nunchuck_buf[0]; }  // returns value of y-axis joystick int nunchuck_joyy() { return nunchuck_buf[1]; }  // returns value of x-axis accelerometer int nunchuck_accelx() { return nunchuck_buf[2]; // FIXME: this leaves out 2-bits of the data }  // returns value of y-axis accelerometer int nunchuck_accely() { return nunchuck_buf[3]; // FIXME: this leaves out 2-bits of the data }  // returns value of z-axis accelerometer int nunchuck_accelz() { return nunchuck_buf[4]; // FIXME: this leaves out 2-bits of the data } 

When I write, Serial.Println("End"), in the line after Wire.endTransmission(); in function nunchuck_init(), it does not display on Serial Monitor.

Also, it does not display Nunchuck ready on Serial Monitor since it is written after nunchuck_init() has been called. I am working on Arduino 0023, Windows 7.

回答1:

A existing problem with the stock Arduino Wire library is that there is no timeout.
It is possible for the endTransmission function to hang the microcontroller in different scenarios.

This issue has been discussed in several other forums, and the best solution I've found so far is to use an alternate library.

The Arduino I2C Master Library by Wayne Truchsess
http://www.dsscircuits.com/index.php/articles/66-arduino-i2c-master-library

With proper timeout, it fixed the problem on my system reading the MMA7455 accelero

In the source code provided, there's an example where it shows how the same piece of program is done using Wire vs the I2C Master Library. You can use that example to easily modify your code to adopt the new library.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!