Hast du das Programm mal im AVR-Studio-Simulator laufen lassen, was da rauskommt? Bzw. versuch mal, die beiden Variablen sowohl innen als auch aussen mit "volatile" zu deklarieren, ob dann beide Male das gleiche rauskommt.
Hallo,Code:#include "RP6RobotBaseLib.h" #include <math.h> int16_t x_start = 0; int16_t y_start = 0; int main (void) { initRobotBase(); int16_t x_ziel = 500; int16_t y_ziel = 500; int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI; int16_t c = (y_ziel - y_start) / sin(alpha2); char* c2 = ""; dtostrf(alpha2, 10, 0, c2); writeString(c2); writeString_P("\n"); while (true) { } return 0; }
wenn ich x_start u. y_start außerhalb von main definiere, kommt bei alpha2 44 raus. Wenn ich x_start u. y_start innerhalb definiere, kommt 45 raus. Richtig ist 45. Wieso ist das so? x_start u. y_start sind ja in der main funktion trotzdem noch 0, auch wenn sie außerhalb definiert werden.
Hast du das Programm mal im AVR-Studio-Simulator laufen lassen, was da rauskommt? Bzw. versuch mal, die beiden Variablen sowohl innen als auch aussen mit "volatile" zu deklarieren, ob dann beide Male das gleiche rauskommt.
#ifndef MfG
#define MfG
dtostrf erwartet einen Zeiger auf einen Block aus mehreren Zeichen, wo der ASCII-String gespeichert werden soll. In Deinem Fall ist da aber kein Platz für den String, weil dieser genau 0 Zeichen aufnehmen kann (""). Deshalb wird Speicher von anderen Variablen beim Aufruf von dtostrf überschrieben und es kommt zu dem. o.g. Verhalten.
Wenn die beiden Variablen x_start und y_start außerhalb der main deklariert sind, ergibt das Ganze ein anderes Speicherlayout als wenn sie in der main deklariert sind, weshalb es bei der einen Variante zufälligerweise richtig funktioniert.
-> Lege ein Array mit genügend Elementen an, damit der mit dtostrf erzeugte String auch Platz darin hat.
Code:#include "RP6RobotBaseLib.h" #include <math.h> int16_t x_start = 0; int16_t y_start = 0; int main (void) { initRobotBase(); int16_t x_ziel = 500; int16_t y_ziel = 500; int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI; int16_t c = (y_ziel - y_start) / sin(alpha2); char c2 = [12]; // <---- Platz für max. 11 Zeichen dtostrf(alpha2, 10, 0, c2); writeString(c2); writeString_P("\n"); while (true) { } return 0; }
So geht mein Script. Bisjetzt hat kein Lösungsweg funktioniert. Von main soll ein Punkt übergeben werden, zu dem dann gefahren wird. Wenn ich x_start u. y_start in punkt definiere funktioniert alles. aber sobald ich es außerhalb mache, geht es wieder nicht. Der Roboter fährt dann einfach "unendlich" geradeaus.Code:#include "RP6RobotBaseLib.h" #include <math.h> int16_t alpha = 0; void punkt (int16_t x_start, int16_t y_start) { int16_t x_ziel = 500; int16_t y_ziel = 500; int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI; if (alpha < alpha2) { rotate(50, RIGHT, alpha2 - alpha, true); } else if (alpha > alpha2) { rotate(50, LEFT, alpha - alpha2, true); } alpha = alpha2; int16_t c = (y_ziel - y_start) / sin(alpha2); changeDirection(FWD); int16_t s_left = getLeftDistance(); moveAtSpeed(80,80); while (getLeftDistance() - s_left < DIST_MM(c)) { task_RP6System(); } moveAtSpeed(0,0); } int main (void) { initRobotBase(); powerON(); punkt(0,0); while (true) { task_RP6System(); } return 0; }
Der Fehler muss in
liegen.Code:int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI;
Wenn ich in
alpha2 durch 45 ersetzte fährt er nämlich die richtige Strecke, und nicht "unendlich".Code:int16_t c = (y_ziel - y_start) / sin(alpha2);
Hoffe ihr könnt mir helfen.
Wie gross ist denn bei dir geschätzt die Differenz (x_ziel - x_start) und wie genau sieht M_PI aus? Ich vermute, dass er da einfach die Nachkommastellen fallenlässt.
#ifndef MfG
#define MfG
y_ziel - y_start sollte hier 500 sein und M_PI ist einfach Pi.
Aber ich habe keine Ahnung, wie das weiterhelfen soll. Denn wenn ich x_start u. y_start innerhalb der funktion definiere, funktioniert es ja. Bloß wenn ich x_start... außerhalb definiere gehts net.
Ich habs jetzt gelöst.
Sehr gut gemacht.
...sagts Du uns kurz woran es nun gelegen hat, damit andere diesen Fehler möglicherweise schneller finden oder vermeiden können.
Vielen Dank vorab.
mfg
Code:double parameter = (y_ziel - y_start)/(x_ziel - x_start); double alpha2 = atan(parameter) * 180/M_PI;
Lesezeichen