Hmm, versuch die selbe code eins mal mit encoder[0]. Wie geht das? Im vergleich mit dem encoder[1] fall.
Druckbare Version
Hmm, versuch die selbe code eins mal mit encoder[0]. Wie geht das? Im vergleich mit dem encoder[1] fall.
Ohh man, das ich da nicht früher drauf gekommen bin ](*,)
Wenn ich mit encoder[0] arbeite hab ich genau das gleiche Problem.
Werd also die Schaltung noch mal in diese Richtung prüfen müssen.
Vielen Vielen Dank!!!!
Hab da aber ein anderes kleines Programmtechnisches Problem.
Vielleicht kann mir da mal jemand helfen. Hab wahrscheinlich ne kleine Denkblockade.
Denn jedesmal wenn ein case im Switch fertig ist hängt sich mein Programm auf.
Schon einmal Danke im Vorraus O:)Code:
#include "asuro.h"
#include "myasuro.h"
int x=0; //Zählvariablen für diverse Zählschleifen
char emfangene_daten[10];
void Goo(int d,int l) //eigene go anweisung
{
StatusLED(GREEN);
SetMotorPower(d,d+5); //Fahr los mit vorgegebenem Tempo,richtung über +/- Wert
l=l*38/10; //l ist die Strecke die zurück gelegt werden soll. 1cm = 3.8 ticks
EncoderInit();
for(encoder[1]=0; encoder[1]<=l; ) //Abfrage nur von einem Encoder, da der andere defekt ist!
{
Msleep (10);
}
MotorSpeed(BREAK,BREAK);
}
int main(void)
{
Init(); //Devinierter Zustand vom ATMEL
while(1)
{
while (PollSwitch() == 0)
{
StatusLED (GREEN);
Msleep (500);
StatusLED (RED);
Msleep (500);
}
switch (PollSwitch()) //Auswahlmenü gesteuert über Pollswitch
{
case 1:emfang(); //aufruf von Emfang
break;
case 4: //Kleine Fahranweisung zu Demo zwecken.
StatusLED (YELLOW); //Funktioniert nicht!!!!
Msleep (2000);
EncoderInit ();
for (x=1; x<=4; x++) //Asuro fährt ein quadrat
{GoTurn ( 0, 45, 200); //45° hier entspricht 90° drehung im real, da "grobe" encoderscheibe eingebaut
GoTurn (150, 0, 200);}
Msleep(1000);
for (x=1; x<=2; x++) //Asuro fährt einen kreis vorwärts und rückwärts
{if (x==1)
GoTurn (300, 90, 255);
else
GoTurn (-300, -90, 255);
Msleep(500);}
break;
default: //Bei falscheingabe blinkt die Status LED 5x Gelb
for(x=1; x<=5; x++)
{StatusLED(OFF);
Msleep(500);
StatusLED(YELLOW);
Msleep(500);}
break;
}
return 0;
}
}
int emfang(void) //Steuerung über Seriel
{
EncoderInit ();
StatusLED (YELLOW);
BackLED (ON, OFF);
Msleep (500);
BackLED (OFF,ON);
Msleep (500);
BackLED (OFF,OFF); //AUS damit, sonst probleme mit Odometrie!!!!
SerWrite ("READY", 10);
SerPrint ("\n\r");
SerRead (emfangene_daten, 1, 0); //Warte auf Daten, ohne timeout!!
switch (emfangene_daten[0])
{
case'T': //keine Daten erhalten
break;
case '1': //Wenn daten =1 fahr vor.
Goo( 100, 10);
break;
case '2': //wenn daten =2 fahr zurück
Goo (-100, 10);
break;
default: //sonst sendefehler 5xgelb
for(x=1; x<=5; x++)
{
StatusLED(OFF);
Msleep(500);
StatusLED(YELLOW);
Msleep(500);
}
break;
}
return 0;
}
Hinter dem Case Statement ist das programm ja auch irgendwie zuende. Das Resturn 0 ist da zuviel, da sollte das Porgramm nie hinkommen. Wo solle es auch zurück hingehen von Main.
Hallo schocksnert (erinnert mich an 'Schock schwere Not'),
erst einmal ein 'Willkommen im Forum'.
Wenn ich alles richtig mitbekommen habe, dann hast du dir selber schon die Lösung gegeben.
Der rechte Motor tut es 'angeblich' nicht. Aber halt nur beim GoTurn().
Im letzten Post von dir steht im Kommentar: "Abfrage nur von einem Encoder, da der andere defekt ist! "
Jepp, [1] ist der rechte Motor. Und da scheint deine Odometrie ja zu funktionieren.
Also ist klar, das deine linke ODO-Seite eine Macke hat.
In GoTurn() aber versuchen beide Seiten ausgewogen zu agieren. Also muss bei defekter linker ODO-Seite der Motor drehen, drehen, drehen. Aber es passiert nichts an den linken ODOs.
Das Programm denkt also links ist keine Drehung und regelt die RECHTE Seite auf 0-Speed bis endlich Impulse von der linken Seite kommen.
Die aber bleiben aus, und somit dreht der linke Moter die Zahnräder platt.
Du hast also die mühevolle Aufgabe, dass du erst die linke Odometrie reparieren musst.
Gruß Sternthaler.
P.S.: Schön, dass dir mein Programm gefällt. Auch wenn es hier nicht helfen kann.
Gib mal ne'n Tipp, wo hier Schnaps getrunken wird. Den Thread muss ich mir unbedingt ansehen ;-)
Hey danke für die schnelle Antwort.
Werd die änderungenspäter mal ins Programm einpflegen und dann natürlich darüber berichten. Das mit dem Schnapps hatte ich bei der Suche nach der "Perfekten" abdeckung der Odometrie entdeckt und fand die Idee einfach nur Klasse Underberg
Das ist am ende deine main code:
Siehst du warum er absturtzt? Den einer-letzte hacke ist noch von den while(1)-schleife. Den return 0; gehört dahinter.Code:...
return 0;
}
}
Hey danke für die Hilfe, manchmal sieht man vor lauter Bäumen den Wald nicht.
Aber jetzt Funktioniert er einigermaßen. Muss jetzt nur noch den Fehler am Encoder finden. Bin aber guter Dinge das ich das Finde.
Noch einmal VIELEN VIELEN DANK an alle die mir geholfen haben!!!!
Grüße Alexander