PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Anfänger braucht Hilfe



dominikxy1
13.11.2006, 20:23
Ich wollte, dass Asuro beim starten die Status LED auf Grün schaltet und dann losfährt. Wenn ein Schalter betätigt wird, dann soll er mit allen roten leuchten was er hat und bremsen. Leider tut er dies nicht...er fährt immer weiter..
Hab ich einen fehler im Code? (fange erst mit c an..)

#include "asuro.h"

int main(void)
{
Init();

StatusLED (GREEN);
MotorDir (RWD,RWD);
MotorSpeed (120,120);


if (PollSwitch()>0)
{StatusLED (RED);
BackLED (ON,ON);
MotorDir (BREAK,BREAK); //hier bin ich mir nicht genau sicher
MotorSpeed (0,0);
}

while(1);
return 0;
}

Ich bitte um Hilfe, sitz jetz 2 Tage am zusammenbaun und fehlerkorigieren, jetz würds mich freuen wenn es funktioniert und ich dann schlafen gehen kann. ^_^

EDH
13.11.2006, 20:30
(1) wiseo nimmst du MotorDir(RWD,RWD), wenn du das weitverbreitete problem hast, das die motoren falschrunnm drheh, solltest du lieber die motorkabel umlötne
(2) Der code sieht eigentlcih doch ganz gut aus, vieleich postest du mal eine beschreibung, was der asuro bei dir denn macht
(3)haben die taster beim seelbst test FEHLERFREI funktioniert?

probier mal obs geht, wenn du MotorDir(BREAK,BREAK) rasulässt


mfg EDH

ps. schlafen wäre um diese zeit nötig. schon von wegen weil ich morgen früh wider in der schule anzutreten habe.

askazo
13.11.2006, 20:31
So, wie Du das geschrieben hast, macht er nach dem Start die if-Abfrage nur genau ein mal und bleibt dann auf ewig in der leeren while(1)-Schleife gefangen.

Die if-Abfrage muss in die while-Schleife, damit er diese Abfrage immer wieder durchführt.

Gruß,
askazo

EDH
13.11.2006, 20:34
vor müdigkeit hab ich das wohl übersehen. vergiss am besten alles was ich geschrieben habe

dominikxy1
13.11.2006, 21:01
Erstmal, danke.

1. Ich nehme Rwd weil ich zwar die motorkabeln richtig angelötet habe, aber sie trotzdem verkehrt drehn. ^^' (Muss ich morgen genau nachschaun, aber ich kann mich genau drann erinnern.. *grml*) -ist aber nicht so schlimm.

2. Er schaltet auf Grün und dann fährt er. und fährt und fährt...
Egal welchen schalter ich drücke.

3. Ja eigentlich schon, dass einzige das mir einmal aufgefallen ist, ist das er bei den beiden linken Schaltern (Wo die Status LED auf Grün+Rot bzw Orange schaltet) wenn ich beide drücke (also Orange) sich der eine Moter mitdreht.

edit: Ich mit meinen langsamen Tippen.
@EDH: trotzdem THX
@askazo.. mal testen.. melde mich dann.. *gg+

edit2:


#include "asuro.h"

int main(void)
{
Init();

StatusLED (GREEN);
MotorDir (RWD,RWD);
MotorSpeed (120,120);



while (PollSwitch()>0)
{StatusLED (RED);
BackLED (ON,ON);
MotorSpeed (0,0);
}



return 0;

Richtig? Wenn ja, geht aber ned -.-


edit3:

#include "asuro.h"

int main(void)
{
Init();

StatusLED (GREEN);
MotorDir (RWD,RWD);
MotorSpeed (120,120);



while (1)
{
if(PollSwitch()>0)
{StatusLED (RED);
BackLED (ON,ON);
MotorSpeed (0,0);
}
}


return 0;
}
so? ^^'

askazo
13.11.2006, 21:27
Ja, der letzte Code sollte gehen...

askazo

dominikxy1
13.11.2006, 21:33
Ja, der letzte Code sollte gehen...

askazo
Da fängt er gleich komplett Rot an zu leuchten und fährt gar nicht los...

edit:
Werd mich morgen drumm kümmern, ich finde den Fehler nicht. (Werde morgen das Testprogramm nochmal flashen..)

Mastermsc
13.11.2006, 22:52
Rufe PollSwitch(); noch einmal vor der while(1) Schleife auf !


#include "asuro.h"

int main(void)
{
Init();

StatusLED (GREEN);
MotorDir (RWD,RWD);
MotorSpeed (120,120);


PollSwitch();
while (1)
{
if(PollSwitch()>0)
{StatusLED (RED);
BackLED (ON,ON);
MotorSpeed (0,0);
}
}


return 0;
}

Wenn das nicht geht , versuchs hiermit :


#include "asuro.h"

int main(void)
{
Init();

StatusLED (GREEN);
MotorDir (RWD,RWD);
MotorSpeed (120,120);



while (1)
{
PollSwitch();
if(PollSwitch()>0)
{StatusLED (RED);
BackLED (ON,ON);
MotorSpeed (0,0);
}
}


return 0;
}

damaltor
14.11.2006, 10:26
das problem, dass trotz richtig angelöteter motorenkabel diese verkehrt herum drehen, haben viele. ich selbst habe 2 asuros zusammengebaut und hatte das problem bei beiden.

umlöten sollte seinl, dann laufen auch fremde programme richtig.

die meisten programme oben sollten funktionieren, das problem ist dass pollswitch gelegentlich falsche werte ausgibt. mehrmaliges aufrufen vor der eigentlich wichtigen abfrage hilft.

dominikxy1
14.11.2006, 16:52
Das mit den Motoren werd ich beheben...

Also, hab jetz nochmal den den SelfTest geflasht.. Taster gehen alle...

Dann hab ich beide Programme geflasht, wie sie normalerweise gehen sollten, doch er fängt nicht amal an zu fahren sondern schaltet gleich die Status und die Back LEDs auf Rot. -.-

vllt mach ich was falsch? (ich machs bestimmt -sonst würds gehen)

Ich übernehms im notepad, speichre es über test.c (verädnre ned den namen)
make.. und dann wähl ich die hex datei aus im flash prog und flashe alles richtig
o.o
bin ratlos

Mastermsc
14.11.2006, 17:50
Ne, es liegt eher am Programm... dieses BackLED(ON,ON); ist auch nicht ganz unschuldig .

Naja, mit so einer endlosen while Schleife ums ganze Programm läufts ja einigermaßen:

#include "asuro.h"


int main (void)
{

Init();
while(1){
MotorDir(FWD,FWD);
MotorSpeed(130,130);
StatusLED(GREEN);

while(PollSwitch()>0){MotorDir(BREAK,BREAK);StatusLED(RED);FrontLED(O N);BackLED(OFF,ON);}
}

return 0;
}


Doofe PollSwitch Funktion...

dominikxy1
15.11.2006, 00:05
Hurra! Danke. Er macht das was er soll. :D

So, die Frage ist nur, wieso?
Und das ist keineswegs ne dumme Frage, da viele mir nen Code gepostet haben, der dann trotzdem nicht funktionierte.
Ich versteh nicht ganz wieso die andren nicht funktioniert haben und dieser schon. (Und das will ich verstehen, denn copy&paste kann jeder :P)


#include "asuro.h"


int main (void)
{

Init();
while(1){ //Diese Schleife immer ausführen und
//wiederholen
MotorDir(FWD,FWD); //Motor auf vorwärts
MotorSpeed(130,130); //loschicken
StatusLED(GREEN); //Status auf Grün schalten

while(PollSwitch()>0) //wenn jetzt eine Taste gedrückt wird und
// somit der wert über eins kommt, dann die
//schleife wiederholen
{
MotorDir(BREAK,BREAK); //stehenbleben
StatusLED(RED); //Status auf Rot schalten
FrontLED(ON); //die "unterboden" Beleucthung an
BackLED(ON,ON); //Back LEDs an
}
}

return 0;
}

Soweit ist mir alles klar, ich weiss aber ned wieso das geht und das andre nicht. :/

damaltor
15.11.2006, 08:23
PollSwitch macht gern Probleme, du musst die Funktion oft abfragen um am ende einen richtigen wert zu erhalten.

im code vom mastermsc ist das problem, dass die motoren nur einmal aktiviert werden. der asuro fährt also. und sowie die taster gedrückt werden bleibt er stehen, und fährt von alleine nicht wieder los (motordir und motorspeed sind ausserhalb von while(1).
da die pollswitch funktion jedoch schon zu beginn einen falschen wert (!=0) liefert, bleibt der asuro sofort stehen bzw füängt gar nicht erst an zu fahren (in der millisekunde die er "fährt" sieht man nicht viel). und dann wars das: er wird ja nicht wieder gestartet...

dominikxy1
15.11.2006, 10:33
Achso, verstehe. :)

Ich danke für die Hilfe und werd mich mal an andren Sachen probieren.
(und vllt bald wieder melden ;P)

damaltor
15.11.2006, 12:13
Viel Glück!

Es ist nicht weiter schlimm, in jedem durchlauf der schleife immer wieder motordir und motorspeed festzulegen. das ist zwar nicht die eleganteste lösung, aber es funktioniert ganz gut =)

dominikxy1
15.11.2006, 16:18
Hi. =)

Ich hab jetzt verstanden wie man die Schleifen richtig anwendet. Deswegen hab ich auch schon mein fertig. :D

Der Asuro fährt los, trifft er auf Licht, weicht er den Licht aus und fäht in die andre Richtigung. Falls einer der Taster betätigt wird (sprich Kollision), dann beibt er stehen.
So weit so gut, funktioniert alles und alles selbst programmiert. *stolz*

der code:

#include "asuro.h"


int main (void)
{
unsigned int data[2];
Init();


while (1)
{
FrontLED (OFF);
StatusLED (GREEN);
MotorDir (RWD,RWD);
MotorSpeed (200,200);
LineData (data);
if (data[0]>data[1])
{MotorSpeed (200,70);
BackLED (OFF,ON);}
if (data[0]<data[1])
{MotorSpeed (70,200);
BackLED (ON,OFF);}
PollSwitch();
while (PollSwitch()>1)
{MotorDir (BREAK,BREAK);
MotorSpeed (0,0);
StatusLED (RED);
FrontLED (ON);}
}
return 0;
}


Jetzt zu meiner Frage..
wie kann ich die Werte die mir die Linienfolger ausgeben erhalten?
Weil ich würde gerne wissen wie viel Licht einen Wert ergibt.
Wenn ich das weiss dann mach ich 2 Variablen. hell und dunkel.
es wird gleich die lienenfolger ausgelesen und entschieden ob es hell oder dunkel auf den jeweiligen seiten ist.
1 hell 1 dunkel ->licht ausweichen
2 dunkel ->stehen bleiben
2 hell ->weiterfahren und schatten suchen..
so weit die theorie, aber mit der praxis happerts. :D

wie kann ich herausfinden welche werte die sensoren ausgeben?
oder muss ich herumtesten bis ich passende werte hab?
(ich weiss die werte hängen stark vom umgebungslicht ab usw.)

Könnt ihr mir helfen? :)

edit:
jönnt natrürlich auch sein, das mit den dunke-hell ein blödsinn ist und das nicht grade sinnvoll ist. ^^

EDH
15.11.2006, 16:31
also ausgeben kannst du die werte mit Ser Write()
Syntax: SerWrite(variable mit wert, 4)
genaueres dazu in der anleitung zum asuro

ABER: ob ein wert hell oder dunkel ist, hängt unter anderem vom umgebungslicht ab.
dehalb:
mach leiber ein arrey mit allen gemessenen werten. davon berechnest du den mittelwert.
ob ein wert hell oder dunkel ist, kann man nun mit einem vergleich mit dem mittelwert feststellen

mfg EDH

dominikxy1
15.11.2006, 16:42
Aso, ups. -.- Ich hab die Anleitung scho so oft glesen und nie drann gedacht.
DAchte vorhin eher an ein Prog wie das:
http://chris.lugr.de/AsuroCommunicator2.jpg



ABER: ob ein wert hell oder dunkel ist, hängt unter anderem vom umgebungslicht ab.
dehalb:
mach leiber ein arrey mit allen gemessenen werten. davon berechnest du den mittelwert.
ob ein wert hell oder dunkel ist, kann man nun mit einem vergleich mit dem mittelwert feststellen

mfg EDH
Wie genau meinst du das?
Er soll messen, wert speicher, messen, wert speicher, und dann den die summe des ganzen durch die anzahl dividieren?
es ne gute idee, aber ich bin mir nicht sicher wie man das machen soll
ungefähr so?


unsigned int data[2];
unsigned int mittel;
while(1)
{LineData(data);
mittel=(data[0]+data[1])/2; //so??

*jetzt die untercheidung hell dunkel+reaktion..*
}

Darf man das so schreiben?

EDH
15.11.2006, 16:53
als erster muss man rauskriegen, wie viele werte in das arrey schon geschrieben sind.
daur setzt man am besten als erster alle werte auf null. vor jeder berechnugn des mittelwertes überpfüft man dann welcher wert der erste ist, der null ist. das ist dann die anzahl. dann addiert man alle werte des arreys, und teilt durch die anzahl

ein anderes problem ist, wieviele werte speichert man ab ? (der asuro hat nicht unbegrenzten speicher). verkraftet der asuro ein arrey mit 500 elementen?

tja ähh soweit die theorie...
nun zu deinem code oben:
das geht eigentlcih schon, allerdings sind 2 werte ein bisschen wenig

mfg EDH

dominikxy1
15.11.2006, 17:29
Wenn ich ehrlich bin, hab ich ka wie ich das anstellen soll.

1. Weis ich nicht genau weiss wie man mit den den Strukturen zb data[5] umgeht. (Ich lerne C erst und da dass: http://www.fh-augsburg.de/informatik/vorlesungen/c_cplus/tutorial/cyris/c-kurs7.htm#7_1 meine einzige Bezugsquelle ist und ich es dort nicht ganz verstehe, hab ich ein Problem. xD
2. Weiss ich nicht ob ich z.b data[x+1] schreiben darf
3.ich nicht genau mit dem LineData(bla); umgehen kann.
zb


unsigned int bla[5];
LineData(bla);
//bla[0] ist der wert des linken sensors
und bla[1] der des rechtens..
gibts evt. auch bla[2,3,4..5?], wenn ja?
was für nen wert haben die?

fragen über fragen =)[/code]

EDH
15.11.2006, 17:41
in der anleitung steht ja schon alles was man für den anfang mit c braucht drinn. des weiteren solltest du vieleicht mal ein gutes buch über c durchwälzen. ich empfehle C von A bis Z, das gibts sogar als openbook im internet
http://www.galileocomputing.de/openbook/c_von_a_bis_z/

mfg EDH

dominikxy1
15.11.2006, 20:16
Wieso ist es nicht möglich && als Operater zu nehmen??


#include "asuro.h"


int main (void)
{
unsigned int data[2],mittelwert[5],mittelmittel;
unsigned char hell_links,dunkel_links,hell_rechts,dunkel_rechts, fahr_rechts,fahr_links,stop,los;
Init();

while(1)
{MotorDir (RWD,RWD);
fahr_rechts=0; fahr_links=0; los=0; stop=0;
LineData(data);
mittelwert[0]=(data[0]+data[1])/2;
LineData(data);
mittelwert[1]=(data[0]+data[1])/2;
LineData(data);
mittelwert[2]=(data[0]+data[1])/2;
LineData(data);
mittelwert[3]=(data[0]+data[1])/2;
LineData(data);
mittelwert[4]=(data[0]+data[1])/2;

mittelmittel=(mittelwert[0]+mittelwert[1]+mittelwert[2]+mittelwert[3]+mittelwert[4])/4;

if(data[0]>mittelmittel)
{hell_links=1;dunkel_links=0;}
if(data[0]<mittelmittel)
{hell_links=0;dunkel_links=1;}
if(data[1]>mittelmittel)
{hell_rechts=1;dunkel_rechts=0;}
if(data[1]<mittelmittel)
{hell_rechts=0;dunkel_rechts=1;}

if(hell_links=1 && dunkel_rechts=0)
{fahr_rechts=1;}
if(hell_rechts=1 && dunkel_links=0)
{fahr_links=1;}
if(hell_rechts=1 && hell_links=1)
{los=1;}
if(dunkel_rechts=0 && dunkel_links=0)
{stop=1;}
while(fahr_rechts==1)
{MotorSpeed(80,200);}
while(fahr_links==1)
{MotorSpeed(200,80);}
while(los==1)
{MotorSpeed(200,200);}
while(stop==1)
{MotorSpeed(0,0);}
}
}

Das is jetz das Scheu-vor-Licht Prog, ein bischen einfacher, aber er will && nicht als Operator.
Zuerst hatte ich es in der while schleife, da wollte er es nicht kompilieren und jetz so in der if, ich weiss nicht mehr weiter. -.-

edit:
gehört statt den && ein ,?
*mal probier*
edit2: so gehts :)
aber der asuro tut nicht das was ich wollte xD

askazo
16.11.2006, 09:05
Der &&-Operator ist schon richtig, Dein Fehler liegt beim =
Ein einfaches = ist eine Zuweisung.
Wenn Du in einer If-Abfrage vergleichen möchtest, musst Du == nehmen.

Also
if(dunkel_rechts==0 && dunkel_links==0)
{stop=1;}
askazo

damaltor
16.11.2006, 13:09
Manchmal musst du beide bedingungen in "unter"klammern setzen:


if ((Bedingung1)&&(Bedingung2))

zum thema arrays: wenn du eine variable deklarierst, z.b. werte[2], dann gibt es das array "werte" mit 2 elementen. die elemente heissen werte[0] und werte[1] (NICHT werte[1] und werte[2]!!)

zwischen den eckicgen klammern steht ein ausdruck, der ausgerechnet die aktuelle stelle im array zeigt. beispiel:



werte[1] // Das zweite element
werte[0] // Das erste Element
werte[99-98] // Das (99-98 = 1), also zweite Element

i=12;
werte[i/2-6] // Das (12/2-6 = 0), also erste element

werte[i] // Das i-te Element (Produziert einen Fehler wenn das Array nicht lang genug ist)




du kannst also zwischen die eckigen klammern schreiben was du willst.

sowas z.b. geht:



int i[50];

//Hier werden irgendwelche Werte in die Variablen des arrays geschreiben...

for(i=0;i<50,i++)
{
PrintInt(werte[i]); // Funktion aus der neuen lib, um integerwerte auszugeben ohne sie vorher umwandel zu müssen)
SerWrite("\n\r",2);
}



Dieser code würde nacheinander Die Werte von 0 bis 49 (also alle 50 werte des arrays), gefolgt von jeweios einem zeilenumbruch ausgeben.

Anmerkung: \n sowie \r werden zwar mit je zwei zeichen getippt, zählen jedoch bei der Übertragung als 1 byte.