PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm Starten und Stoppen über Hyper Terminal



Problem
23.11.2010, 15:16
//[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);



{

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);}
}


if ( data[1] < 50 )

{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);

for(z=0 ; z < 40 ; z++){Sleep(216);}
}
}



if (PollSwitch() >= 1)

{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);

for(z=0 ; z < 100 ; z++){Sleep(216);}
}





}
else if (message[0] == 's')
{
MotorDir(FREE,FREE);
MotorSpeed(0,0);
FrontLED(OFF);
StatusLED(OFF);
}


}

return 0;
}
//[code]




Mit dem Blauen Teil möchte ich das Programm über Hyper T starten und Pausieren (Stoppen)

wenn ich das mache funkt aber der Liniensensor nicht mehr
hat da wer ne idee was es da heben könnte


mfg Problem

ASUR0
23.11.2010, 16:45
wenn ich das mache funkt aber der Liniensensor nicht mehr



wie meinst du das?

Problem
23.11.2010, 17:01
Mein roby fährt dann immer über den schwarzen Fleck drüber

Noch was wichtiges wenn ich g drücke fährt er rückwärts los wenn ich nochmal g drücke färht er vorwärts noch mal g rückwärts .......... wenn ich dann mal s drücke bleibt er stehen


kennst du dich aus

ein bisschen komisch da ich ja über das ganze Programm die {} Klammer gemacht habe


mfg

ASUR0
23.11.2010, 17:13
wozu sind data0[] und data1[] ??

Die werden gar nicht gebraucht.

Banale Antwort auf dein Problem: Es fehlt die Liniensensorabfrage:


LineData(data);

ohne dem funktioniert es natürlich nicht....

Gruß

DL

Problem
23.11.2010, 17:19
#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);

{ 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);
}
}

{

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);}
}


if ( data[1] < 50 )

{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);

for(z=0 ; z < 40 ; z++){Sleep(216);}
}
}



if (PollSwitch() >= 1)

{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);

for(z=0 ; z < 100 ; z++){Sleep(216);}
}





}
if(message[0] == 'S')
{
MotorDir(FREE,FREE);
FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
StatusLED(OFF);
}


}

return 0;
}

so sieht jetzt aus funkt auch nicht


sie data sind dass ich am hyper T sehe wie groß der WErt der sensoren ist

radbruch
23.11.2010, 19:00
Hallo

Es macht überhaupt keinen Sinn hier im RN-Forum und auch bei arexx wegen jedem minimalen Problemchen einen neuen Thread zu starten. Versuche es selbst zu lösen sonst lernst du es nie. Ich sag mal grob zwei Tage eigenes Ausprobieren sollten schon vergehen bevor man sich hilfesuchend in einem Forum meldet.

Und noch ein Tipp: Verwende mehr Kommentare. Zum einen wird dir selbst dann klar, was du da machst. Zum anderen können wir leichter nachvollziehen, was du machen willst. Programme mit Kommentaren braucht man auch nicht mit farbigen Markierungen versehen und kannst deshalb die Codetags verwenden. Für meinen Geschmack verwendest du auch zuviele Leerzeilen, dadurch werden dein Programme für mich nahezu unleserlich.

Gruß

mic

Problem
23.11.2010, 19:24
Ok werde ich machen

Ich habe gedacht ich machs mit farbe das es übersichtlicher wird

mfg

Valen
23.11.2010, 22:35
In deinem Thread auf das Arexx Forum habe ich geschrieben das entweder den Deklaration von de message 'Zeichenketten' oder den Standard-wert von SerRead (wann kein Zeichen empfangen wird) den eintrit von den if-abfragen verhindert. Aber nach weitere Gedanken bin ich sicher das den SerRead Befehl dein komplete Program Blockiert biss ein Zeichen empfangen wird. Dein Asuro reagiert nicht auf den Liniensensor weil er einfach nicht weiter als SerRead geht.(Eben wenn du doch den fehlende LineData(data); in dein Program geschrieben hatte.) Den 0 parameter am ende von SerRead meint das es immer warten bleibt biss irgendeiner Zeichen empfangen wird. Das es Forwärts oder Ruckwärts fahrt ist nicht ein Zeichen das es dauernt dein Code ablauft. Den Motoren drehen einfach dumm weiter.

Das soll besser gehen:


#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];
char message[] = "1";

Init();

...

while( 1 )
{

SerRead(message,1,1); //1 Zeichen empfangen, weiter gehen nacht 1 Zeichen 'Zeitbasis'!

LineData(data); //Messe die Linienhelligkeit



if(message[0] == 'G')
...

Valen
23.11.2010, 22:56
Das empfangene zeichen im message zuruck senden zum Rechner mit SerWrite kann auch helfen verstehen wieso es nicht Korrekt reagiert. Einfach darauf verlassen das das Zeichen Korrekt ankommt bei Asuro kann man nicht.

Problem
24.11.2010, 18:24
Ich möchte in diesen Forum weiterschreiben

Hier das steht in asuro.c drinen




void SerRead(unsigned char *data, unsigned char length,unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
UCSRB = 0x10; // enable receiver
/* non blocking */
if (timeout != 0) {
while (i < length && time++ < timeout) {
if (UCSRA & 0x80) {
data[i++] = UDR;
time = 0;
}
}
if (time > timeout) data[0] = 'T';
}
/* blocking */
else {
while (i < length) {
if (UCSRA & 0x80)
data[i++] = UDR;
}
}
}

Razzorhead
24.11.2010, 18:35
Hast du Valens antworten denn ausprobiert?
Bringt ja nix wenn du schon wieder codesnippets postest.

LG Raz

Problem
24.11.2010, 18:57
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

radbruch
24.11.2010, 19:04
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:


#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)

Ist quasi dein Programm mit geänderten Einrückungen/ Zeilenvorschüben.

Gruß

mic

P.S.: Vielleicht magst du das als Basis für weitere Versuche verwenden ;)

Problem
24.11.2010, 19:48
Danke
die Übersicht ist viel besser wie bei meinen CODE´s

Ich habe es 1 zu 1 rübergeflashed aber es funkt nicht


:(

radbruch
24.11.2010, 20:00
Ich habe es 1 zu 1 rübergeflashed aber es funkt nichtWar 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.

Mach es selbst, du bist auf dem richtigen Weg ;)

Gruß

mic

Problem
24.11.2010, 20:16
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

radbruch
24.11.2010, 21:08
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:


/* 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
}
}
(Aus der Funktion SerRead() in asuro.c)

Deshalb lautet der Kommentar über dem Else-Zweig von "if (timeout != 0) {" auch "blocking".

Gruß

mic

Problem
24.11.2010, 21:32
Ah klingt gut

lg

Problem
24.11.2010, 21:56
Ich habs jetzt so

SerRead(message,1,1);

aber es hat sich leider nichts geändert

:(

radbruch
24.11.2010, 22:00
Mit dem Fetzen kann man doch nichts anfangen. Poste dein komplettes Programm!

(Manche Leute muss man wohl echt durchs Ziel schieben)

Problem
24.11.2010, 22:03
#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,1);

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)





Aktueller stand

Valen
24.11.2010, 23:49
Was passiert im Hyperterminal (oder was du auch verwendest dafur) wann du es wie folgendes macht:


...
while( 1 )
{
char message[1]; // Ein zeichen, kein Anfangswert geben.
SerRead(message,1,1);
SerWrite(message[0],1); // Empfangenes Zeichen Zuruck senden zur Kontrolle

if(message[0] == 'G')
...

Problem
25.11.2010, 16:45
Jetzt geht gar nichts mehr

Was ich auch komisch finde ist ,dass beim flashen die PAGE 32 nicht gesendet wird aber All Pages flashed !! schreibt er trotzdem hin kann das die ursache sein



#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,1);

SerWrite(message[0],1);

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)

Valen
25.11.2010, 16:47
Was geht gar nicht? Wie nicht. Empfangt nichts? Sendet nichts? Steht still? Ein bisschen weitere Beschreibung, bitte.

Problem
25.11.2010, 17:10
Ich kann schreiben was ich will er macht nichts das statusLED leuchtet grün sonst nichts

Valen
25.11.2010, 17:30
Du bist doch nicht vergessen den .c datei zu speichern vor das Kompilieren?

Problem
25.11.2010, 17:32
Nein es kommt nichts an wenn ich so wie du sagst ändern möchte




char message[1];
while( 1 )
{

SerRead(message,1,1);

SerWrite(message[0],1);
Serwrite("\n\r", 2);


Kann ich nicht compilieren es kommt diese meldung:

C:\ASURO_src\FirstTry/test.c:20: undefined reference to
`Serwrite'


Geschpeichert habe ich auch wie immer

Valen
25.11.2010, 17:37
Das stimmt. Im C-sprache kommt es ganz genau auf Schreibfehler an. Die lib asuro.c hat eine Beschreibung von SerWrite, aber nicht von Serwrite.

Radbruch, schämme dich! ;)

Problem
25.11.2010, 17:41
er macht auch keinen zucker aber im hyper T macht er immer eine Zeile und die nächste ........ wenn ich was schreibe steht das da und wieder zeile zeile zeile .....


LG

Problem
25.11.2010, 18:01
Habt ihr noch was auf lager was mir helfen könnte ?

Ich wär euch sehr dankbar

Valen
25.11.2010, 18:12
Vielleicht ist es auch eine gute Sache das Problem mit dein Programm und Hyperterminal zu reduzieren biss auf nur den StatusLED anschalten auf Rot oder Grün. Nun habest du Code drin das ihn fahren last, und das ist schwer mit den IR modul zu folgen mit der Hand. Und alles was nicht wirklich wichtig ist macht nur unübersichtlich.

Was denkst du von:

#include "asuro.h"
#include "stdlib.h"

int main(void)
{
char message[1];

Init();

StatusLED(OFF); // Keine Grune StatusLED bitte. Das verwirrt.


while( 1 )
{
SerRead(message,1,1); //Was für Zeichen gibt es nun? Aber nicht für immer warten.

SerWrite("\n\r", 2); // Neue Zeile, nicht hinter das Lokalles Echo schreiben
SerWrite("SerRead antwortet: ",19);
SerWrite(message[0],1); //Empfangene Zeichen zurück senden, damit wir sehen können was schief geht.
SerWrite("\n\r", 2); // Neue Zeile, sonnst kommt alles hintereinander, und wird es unübersichtlich.

if (message[0] == 'g' || message[0] == 'G') //!!! Kann kleine g und grosse G verstehen
{
StatusLED(GREEN);
} // ende von if(message[0] == 'g')

if(message[0] == 's'|| message[0] == 'S') //!!! Kann kleine s und grosse S verstehen
{
StatusLED(OFF);
} // ende von if(message[0] == 's')

if !(message[0]=='g' || message[0]=='s' || message[0]=='G' || message[0]=='S') // nicht ein 'g/G' empfangen oder nicht ein 's/S' empfangen, also ich bekomme etwas was nicht erwartet ist.
{
StatusLED(YELLOW);
}

} // ende von while( 1 )
return 0;
} //main(void)

radbruch
25.11.2010, 18:13
Hallo


Radbruch, schämme dich!Ja, tut mir leid. Ich habe den unglücklichen Beitrag auch inzwischen gelöscht (ohne zuvor zu prüfen, ob neue Beiträge danach geschrieben wurden).

Bis ich meinen asuro reaktiviert habe, halte ich mich wohl besser zurück. Es bringt auch nicht viel, wenn ich ungetestete Programme, die nicht mal fehlerfrei kompilierbar sind, unter die Leute bringe.

Gruß

mic

Problem
25.11.2010, 18:19
Ist ja nicht so schlimm jeder kann sich verschreiben

Bitte um hilfe

mfg

Valen
25.11.2010, 18:21
Hallo


Radbruch, schämme dich!Ja, tut mir leid. Ich habe den unglücklichen Beitrag auch inzwischen gelöscht (ohne zuvor zu prüfen, ob neue Beiträge danach geschrieben wurden).

Bis ich meinen asuro reaktiviert habe, halte ich mich wohl besser zurück. Es bringt auch nicht viel, wenn ich ungetestete Programme, die nicht mal fehlerfrei kompilierbar sind, unter die Leute bringe.

Gruß

micAch neh, deine Programm Beispielen sind nicht so schlimm. Das war nur einer Witz.

Problem
25.11.2010, 18:29
Hi



Vielleicht ist es auch eine gute Sache das Problem mit dein Programm und Hyperterminal zu reduzieren biss auf nur den StatusLED anschalten auf Rot oder Grün. Nun habest du Code drin das ihn fahren last, und das ist schwer mit den IR modul zu folgen mit der Hand. Und alles was nicht wirklich wichtig ist macht nur unübersichtlich.


Wie ist das gemeint soll ich das Programm lassen (weil es so komplex)
ist oder inzwischen die Teile einfügen mit der Linienverfolgung?

Valen
25.11.2010, 18:36
Ich empfehle den Linienverfolgung (und was sonnst) für dieses moment weg zu lassen. Du möchtest laut den Threadtitel etwas starten und stoppen über HyperTerminal. Das korrekt reagieren auf den gesendete Zeichen ist nun das Wichtigste, wurde ich sagen. Das Linienverfolgung kannst du später wieder rein Programmieren wann es funktioniert wie du wünscht. Also, für mein Beispiel kannst du bestes ein neues Programm Ordner machen.

Ich habe mein letztes Beispiel hier ober etwas geändert damit es was schöner aus sieht im Hyperterminal. ... Das heißt, ich habe das auch nicht ausprobiert auf meine Asuro. Ich hoffe...


...
SerRead(message,1,1); //Was für Zeichen gibt es nun? Aber nicht für immer warten.

SerWrite("\n\r", 2); // Neue Zeile, nicht hinter das Lokalles Echo schreiben
SerWrite("SerRead antwortet: ",19);
SerWrite(message[0],1); //Empfangene Zeichen zurück senden, damit wir sehen können was schief geht.
SerWrite("\n\r", 2); // Neue Zeile, sonnst kommt alles hintereinander, und wird es unübersichtlich.
...

radbruch
25.11.2010, 18:52
Hallo

Ich würde das Problem auch mal aufbröseln und nur versuchen ein Echo vom empfangenen Zeichen zurückzuschicken.

Ich habe zusätzlich noch ein eigenes Problem beim Testen: In der aktuellen WinAVR-Version erzeugen die SerWrite() und SerRead()-Funktionen eine Kompilerwarnung:

test.c:45: warning: pointer targets in passing argument 1 of 'SerRead' differ in signedness
test.c:46: warning: passing argument 1 of 'SerWrite' makes pointer from integer without a cast

Das sind diese Befehle:
45: SerRead(message,1,1);
46: SerWrite(message[0],1);

Nun weiß ich seit meiner Systemumstellung und dem ersten Auftreten dieser Warnung aber dafür schon eine Lösung. Diese scheint hier aber nicht zu funktionieren. Ob das an der Variable message liegt oder an den Libraries meines asuro-Clon kann ich im Moment leider noch nicht sagen.

Gruß

mic

Problem
25.11.2010, 19:01
Ok ich gebe vorerst mal auf und werde mal mein Ultraschall anbauen

Da kann ich ja dann auch noch solche Sachen testen (Liniensensoren habe ich dann ja nicht mehr )



Danke für die Hilfe


Mfg

Valen
25.11.2010, 19:03
Schade das du aufgeben möchtest. Gleich nun wen es zu den ursache kommt. :(

Valen
25.11.2010, 19:05
Hallo

Ich würde das Problem auch mal aufbröseln und nur versuchen ein Echo vom empfangenen Zeichen zurückzuschicken.

Ich habe zusätzlich noch ein eigenes Problem beim Testen: In der aktuellen WinAVR-Version erzeugen die SerWrite() und SerRead()-Funktionen eine Kompilerwarnung:

test.c:45: warning: pointer targets in passing argument 1 of 'SerRead' differ in signedness
test.c:46: warning: passing argument 1 of 'SerWrite' makes pointer from integer without a cast

Das sind diese Befehle:
45: SerRead(message,1,1);
46: SerWrite(message[0],1);

Nun weiß ich seit meiner Systemumstellung und dem ersten Auftreten dieser Warnung aber dafür schon eine Lösung. Diese scheint hier aber nicht zu funktionieren. Ob das an der Variable message liegt oder an den Libraries meines asuro-Clon kann ich im Moment leider noch nicht sagen.

Gruß

micDen SerialTest code im Selbtest Program hat ein Ampersand neben den Zeichenketten Variabele. Ich weiss leider nicht mehr was das macht.


/* ----------------------------------------- */
/* -------------- Serial Test -------------- */
/* ASURO sends recieved data+1 directly */
/* when TIMEOUT occures ASURO is sending 'T' */
/* ----------------------------------------- */
void SerialTest(void)
{
unsigned char data;
unsigned char i;
for (i = 0; i < 0xFE; i++) {
StatusLED(GREEN);
SerRead(&data,1,0xFFFE);
StatusLED(RED);
if (data != 'T') data += 1;
SerWrite(&data,1);
}
}
/* END Serial Test -------------------------- */

radbruch
25.11.2010, 19:33
Hallo

Zeiger sind auch nicht mein Gebiet (was kann ich überhaupt?). Das Ampersand & bedeutet die Speicheradresse der Variablen. Ich hab's nun so gelöst (Vorsicht beim Betrachten!) und kann nun warnungsfrei Übersetzen:

char message[5], *zeiger_auf_message;

zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren


Zurück zum Problem: Das Hyperterminal sendet nur, wenn man auch [Enter] drückt! Es werden also mindestens zwei Zeichen gesendet. Mein aufgebockter (=Räder berühren nicht den Boden) Clon reagiert nun mit diesem Testcode:


#include "asuro-probot.h"
#include "asuro-probot.c"

//#include "asuro.h"
//#include "stdlib.h"

void BackLED(char left, char right){}; // Dummi
void SerRead(char *data, unsigned char length,unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
UCSRB = 0x10; // enable receiver
/* non blocking */
if (timeout != 0) {
while (i < length && time++ < timeout) {
if (UCSRA & 0x80) {
data[i++] = UDR;
time = 0;
}
}
if (time > timeout) data[0] = 'T';
}
/* blocking */
else {
while (i < length) {
if (UCSRA & 0x80)
data[i++] = UDR;
}
}
}

void pause_ms(unsigned int dauer)
{
while(dauer--) Sleep (36); // Sleep(72) bei asuro-CD-Library!
}

int main(void)
{
unsigned int data[2];
char data0[5], data1[5];
char message[5], *zeiger_auf_message;

Init();
SerWrite("Hallo :)\n\n\r", 11);

while( 1 )
{
pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
StatusLED(RED);
SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
SerWrite("\n\r", 2);
StatusLED(YELLOW);

if(message[0] == 'g')
{
FrontLED(ON);
Sleep(10); // Eine LED wird nicht schlagartig hell
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);

pause_ms(2);

MotorDir(FWD,FWD);
MotorSpeed(110,100);
BackLED(OFF,OFF);

if ( data[0] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(ON,OFF);

pause_ms(120);
} // if

if ( data[1] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);

pause_ms(120);
} // if

if (PollSwitch() >= 1)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);

pause_ms(300);
} // 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)


Das ist im wesentliche immer noch das alte Programm, allerdings etwas geputzt. Neu ist pause_ms() für die Wartezeiten. Das ist natürlich noch die Variante für meinen Clon. Man muss im Moment die Befehle mehrmals senden bis er reagiert.

Ungetestet für den orginalen asuro:

#include "asuro.h"
#include "stdlib.h"

void pause_ms(unsigned int dauer)
{
while(dauer--) Sleep (72);
}

int main(void)
{
unsigned int data[2];
char data0[5], data1[5];
char message[5], *zeiger_auf_message;

Init();
SerWrite("Hallo :)\n\n\r", 11);

while( 1 )
{
pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
StatusLED(RED);
SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
SerWrite("\n\r", 2);
StatusLED(YELLOW);

if(message[0] == 'g')
{
FrontLED(ON);
Sleep(10); // Eine LED wird nicht schlagartig hell
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);

pause_ms(2);

MotorDir(FWD,FWD);
MotorSpeed(110,100);
BackLED(OFF,OFF);

if ( data[0] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(ON,OFF);

pause_ms(120);
} // if

if ( data[1] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);

pause_ms(120);
} // if

if (PollSwitch() >= 1)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);

pause_ms(300);
} // 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

Problem
27.11.2010, 08:21
Hallo

Aufgeben will ich nicht ich lass es nur mal eine weile gehen weil ich jetzt gerade mein Ultraschall löte und dann mach ich da weiter


Lg

Problem
28.11.2010, 17:21
Ich glaube der Fehler liegt darin das beim Flashen nur 32 von 33 seiten übertragen werden

aber keine Ahnung wie ich die 33 PAGE auch noch flashen soll

Bei allen anderen Programmen werden immer alle Seiten geflasht

Mfg

radbruch
28.11.2010, 17:37
Gelegentlich ergeben Rundungsfehler falsche Angaben für die Seiten. Wenn das Flashen fehlerfrei beendet wurde, wurde das gesamte Programm geflasht.

Problem
28.11.2010, 18:05
Ok danke

Man lernt nie aus O:)