Hast du Valens antworten denn ausprobiert?
Bringt ja nix wenn du schon wieder codesnippets postest.
LG Raz
Druckbare Version
Hast du Valens antworten denn ausprobiert?
Bringt ja nix wenn du schon wieder codesnippets postest.
LG Raz
Ja habe schon umgeschrieben funkt auch nicht
Bin gerade dabei ein kürzeres Programm zu schreiben wo er nur eine Linie verfolgt aber da ist auch der selbe Fehler(mach ich deswegen weil ich nicht immer beim langen Programm schauen will )
LG
probieren schauen bis es auf einmal kalppt
Hallo
Valen hat schon recht, bei deiner Version bleibt SerRead() in einer Endlosschleife hängen solange kein Zeichen empfangen wird. Ob man wirklich mit SerRead(message,1,1); prüfen muss, ob ein neues Zeichen angekommen ist, hängt vom restlichen Programm ab. Aber so ist SerRead() auf jeden Fall keine Endlosschleife mehr.
Ich habe dein Programm mal etwas umformatiert:
Ist quasi dein Programm mit geänderten Einrückungen/ Zeilenvorschüben.Code:#include "asuro.h"
#include "stdlib.h"
int main(void)
{
int x=0,LANG=0,z=0,t=0;
unsigned int data[2];
char data0[5], data1[5];
Init();
/*
x++;
if (x > 1000)
LANG++;
if (x > 1000)
x = 0;
*/
while( 1 )
{
char message[] = "1";
SerRead(message,1,0);
if(message[0] == 'G')
{
FrontLED(ON);
{ // ein Block
LineData(data);
itoa (data[0], data0, 5);
itoa (data[1], data1, 5);
SerWrite (data0, 4);
SerWrite (" links\n\r", 8);
SerWrite (data1, 4);
SerWrite (" rechts\n\r", 9);
for (t=0; t < 2; t++)
{
Sleep (72);
} // for
} // ein Block
{ // noch ein Block
MotorDir(FWD,FWD);
MotorSpeed(110,100);
BackLED(OFF,OFF);
if ( data[0] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(ON,OFF);
for(z=0 ; z < 40 ; z++)
{
Sleep(216);
} // for
} // if
if ( data[1] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);
for(z=0 ; z < 40 ; z++)
{
Sleep(216);
} // for
} // if
} // noch ein Block
if (PollSwitch() >= 1)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);
for(z=0 ; z < 100 ; z++)
{
Sleep(216);
} // for
} // if PollSwitch()
} // if(message[0] == 'G')
if(message[0] == 'S')
{
MotorDir(FREE,FREE);
FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
StatusLED(OFF);
} // if(message[0] == 'S')
} // while( 1 )
return 0;
} //main(void)
Gruß
mic
P.S.: Vielleicht magst du das als Basis für weitere Versuche verwenden ;)
Danke
die Übersicht ist viel besser wie bei meinen CODE´s
Ich habe es 1 zu 1 rübergeflashed aber es funkt nicht
:(
War ja zu erwarten, denn es ist dein Programm von ein paar Beiträgen weiter oben. Ich habe am Programm nichts verändert (außer der X++/LANG++ -Geschichte), also sind auch nicht die Vorschläge von Valen eingebaut.Zitat:
Ich habe es 1 zu 1 rübergeflashed aber es funkt nicht
Mach es selbst, du bist auf dem richtigen Weg ;)
Gruß
mic
Ok ich werds versuchen
Ich habe ja auch den Willen es selber zu können
wenn ich mir wo ein Programm rauskopiere möchte ich es verstehen
ein kleiner Tipp wär super
lg
Den Tipp hast du dir selbst schon gegeben. Wenn du SerRead() mit Timeout 0 aufrufst, bleibt dein asuro hier hängen, solange er kein neues Zeichen empfängt, und kann deshalb die Liniensensoren nicht mehr auswerten:
(Aus der Funktion SerRead() in asuro.c)Code:/* blocking */
else { // timeout ist 0
while (i < length) { // solange zuwenig Zeichen empfangen wurden
if (UCSRA & 0x80) // hat der USART ein Zeichen eingelesen?
data[i++] = UDR; // Zeichen in Übergabevariable kopieren
}
}
Deshalb lautet der Kommentar über dem Else-Zweig von "if (timeout != 0) {" auch "blocking".
Gruß
mic
Ah klingt gut
lg
Ich habs jetzt so
aber es hat sich leider nichts geändertCode:SerRead(message,1,1);
:(
Mit dem Fetzen kann man doch nichts anfangen. Poste dein komplettes Programm!
(Manche Leute muss man wohl echt durchs Ziel schieben)