Go Down

Topic: Problem mit Wire und Serial (Read 1 time) previous topic - next topic

lord-maricek

Jan 09, 2011, 02:14 pm Last Edit: Jan 09, 2011, 03:05 pm by lord-maricek Reason: 1
Moin,

ich arbeite zurzeit an einem Autopiloten für Modellboote, der besteht aus 2 Platinen, mit jeweils einem Atmega 328 mit dem Arduino Bootloader. Die Boards Kommunizieren untereinander mit Serial und I2C.
Ich habe ein Problem, mit der Platine, die für Ansteuerung der Servos/Motoren usw. ist.

Wenn man das Board anschließt, wartet es, bis von dem anderem Board der String "Z0$" über Serial gesendet wird und antowrtet dann mit einem "Z1$". Sobald das passiert ist, soll über I2C alle 250ms vom Kompass Modul, der Kurs ausgelesen werden.
http://wiring.org.co/learning/libraries/hmc6352sparkfun.html
Dafür habe ich das hier im loop():
Code: [Select]
if(!compass_request&&(millis()>(last_request+250)))
 {
   compass_request = true;
   Wire.beginTransmission(compassAddress);
   Wire.send('A');        
   Wire.endTransmission();
   last_request = millis();
 }
 /*else if(compass_request&&(millis()>(last_request+6)))
 {
   digitalWrite(8,HIGH);
   Wire.requestFrom(compassAddress, 2);
   int tmp_compass = 0;
   if(2 <= Wire.available())    
   {
     tmp_compass = Wire.receive();  
     tmp_compass = tmp_compass << 8;    
     tmp_compass += Wire.receive();  
     tmp_compass /= 10;
     se.course = tmp_compass;
     compass_request = false;
     se.encode("C");
     Wire.beginTransmission(mainboard_ID);
     Wire.send(se.encoded);
     Wire.endTransmission();
   }
   digitalWrite(8,LOW);
 }*/


Aber wenn ich den Ausgeklammerten Teil wieder entklammere, können zwar noch Daten über die Serielle Schnittstelle empfangen werden, aber nicht mehr gesendet. (Teilweise können nicht mal mehr welche gesendet werden)

Hier ist nochmal der gesamte Code:
Code: [Select]
#include <Servo.h>
#include <Wire.h>
#include <SerialData.h>

SerialData se;
Servo servo;
Servo motor;
Servo bow;

/******BoardID******/
#define pc_ID 2
#define mainboard_ID 0
#define motorboard_ID 1
int compassAddress = 0x42 >> 1;

/*****Connection*****/
#define timeout 1000
#define next_check 10000

/*****Variablen*****/
unsigned long long time_send = 0;
unsigned long long time_blink = 0;
unsigned long long start_time = 0;

unsigned long long last_contact_mainboard = 0;
boolean mainboard_connected = false;

boolean compass_request = false;
unsigned long long last_request = 0;

boolean messages[20];
char tmp_message[10];

boolean autopilot = false;

int a_course;

//////////////////////////
////////Navigation////////
//////////////////////////
int coordinates[100][2]; //coordiantes[x][0] = lat //coordiantes[x][1] = lon
int homebase[1][2];      //homebase[0][0] = lat //homebase[0][1] = lon

/*****Funktionen****/
void serial_pass_on();
void led_mode();
void clean_tmp_message();
void create_message(int code);
void controls_init(Servo &tmp_servo, int pin);

void setup()
{
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 Serial.begin(9600);

 while(!mainboard_connected)
 {
   if(millis()>(time_blink+500))
   {
     digitalWrite(8,HIGH);
     time_blink = millis();
   }
   else if(millis()>(time_blink+250))
   {
     digitalWrite(8,LOW);
   }
   if(Serial.available())
   {
     if(se.decode((char)Serial.read()))
     {
       if(se.new_data('Z')&&(se.test==mainboard_ID))
       {
         mainboard_connected = true;
         Serial.print("Z1$");
         digitalWrite(8,HIGH);
       }
     }
   }
 }
 Wire.begin();
 controls_init(servo,2);
 controls_init(motor,3);
 controls_init(bow,4);
 digitalWrite(8,LOW);
 digitalWrite(9,HIGH);
}

void loop()
{
 led_mode();

 if(Serial.available())
 {
   if(se.decode((char)Serial.read()))
   {
     serial_pass_on();
   }
 }

 if(!compass_request&&(millis()>(last_request+250)))
 {
   compass_request = true;
   Wire.beginTransmission(compassAddress);
   Wire.send('A');        
   Wire.endTransmission();
   last_request = millis();
 }
 /*else if(compass_request&&(millis()>(last_request+6)))
 {
   digitalWrite(8,HIGH);
   Wire.requestFrom(compassAddress, 2);
   int tmp_compass = 0;
   if(2 <= Wire.available())    
   {
     tmp_compass = Wire.receive();  
     tmp_compass = tmp_compass << 8;    
     tmp_compass += Wire.receive();  
     tmp_compass /= 10;
     se.course = tmp_compass;
     compass_request = false;
     se.encode("C");
     Wire.beginTransmission(mainboard_ID);
     Wire.send(se.encoded);
     Wire.endTransmission();
   }
   digitalWrite(8,LOW);
 }*/

 if(millis()>(last_contact_mainboard+5000))
 {
   ;
 }
}

/***************************************************************/
/*                         Funktionen                          */
/***************************************************************/
void controls_init(Servo &tmp_servo, int pin)
{
 tmp_servo.attach(pin);
 tmp_servo.write(90);
 start_time = millis();
 while(millis()<(start_time+2000))
 {
   if(millis()>(time_blink+250))
   {
     digitalWrite(9,LOW);
   }
   if(millis()>(time_blink+500))
   {
     digitalWrite(9,HIGH);
     time_blink = millis();
   }
 }
}
/*****************/
/*Serial pass on */
/*****************/
void serial_pass_on()
{
 if(se.new_data('N')&&se.new_data('E')&&se.new_data('W'))
 {
   coordinates[se.new_WP][0] = se.lat;
   coordinates[se.new_WP][1] = se.lon;
 }
 if(se.new_data('A'))
 {
   autopilot = se.autopilot;
 }
 if(se.new_data('S'))
 {
   if(!autopilot)
   {
     servo.write(se.servo);
   }
 }
 if(se.new_data('M'))
 {
   if(!autopilot)
   {
     motor.write(se.motor);
   }
 }
 if(se.new_data('B'))
 {
   if(!autopilot)
   {
     bow.write(se.bow);
   }
 }
}


void led_mode()
{
}


void clean_tmp_message()
{
 for(int i=0;i<10;i++)
 {
   tmp_message[i] = 0;
 }
}


void create_message(int code)
{
 clean_tmp_message();
 int tmp = sprintf(tmp_message,"F%d$",code);
}


Die Klasse SerialData habe ich selbst geschrieben, die ist zum de- und encodieren der gesendeten/empfangenen Strings.

Habt ihr ne Idee, was falsch ist?

MfG
Philipp

Go Up