Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm Starten und Stoppen über Hyper Terminal
//[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
wenn ich das mache funkt aber der Liniensensor nicht mehr
wie meinst du das?
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
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
#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, 20: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
Ok werde ich machen
Ich habe gedacht ich machs mit farbe das es übersichtlicher wird
mfg
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')
...
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.
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, 19:35
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
radbruch
24.11.2010, 20: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 ;)
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, 21: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
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, 22: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
Ich habs jetzt so
SerRead(message,1,1);
aber es hat sich leider nichts geändert
:(
radbruch
24.11.2010, 23:00
Mit dem Fetzen kann man doch nichts anfangen. Poste dein komplettes Programm!
(Manche Leute muss man wohl echt durchs Ziel schieben)
#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
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')
...
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)
Was geht gar nicht? Wie nicht. Empfangt nichts? Sendet nichts? Steht still? Ein bisschen weitere Beschreibung, bitte.
Ich kann schreiben was ich will er macht nichts das statusLED leuchtet grün sonst nichts
Du bist doch nicht vergessen den .c datei zu speichern vor das Kompilieren?
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
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! ;)
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
Habt ihr noch was auf lager was mir helfen könnte ?
Ich wär euch sehr dankbar
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, 19: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
Ist ja nicht so schlimm jeder kann sich verschreiben
Bitte um hilfe
mfg
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.
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?
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, 19: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
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
Schade das du aufgeben möchtest. Gleich nun wen es zu den ursache kommt. :(
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, 20: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
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
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, 18:37
Gelegentlich ergeben Rundungsfehler falsche Angaben für die Seiten. Wenn das Flashen fehlerfrei beendet wurde, wurde das gesamte Programm geflasht.
Ok danke
Man lernt nie aus O:)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.