PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : neuling braucht hilfe beim programmieren



modellbauphi
18.02.2007, 14:21
hallo

ich will folgendes programm schreiben asuro soll mit den taster vorraus im zimmer rumfahren und wenn k1, k2 oder k3 gedrückt wird sich rechtsrum drehen wenn k4, k5 oder k6 gedrückt wird sich linksrum drehen und danach wieder geradeaus weiterfahren allerdings kommt wenn ich make ausführe immer error:
parse error before '[' token (in Zeile 8 )
parse error before "else" (in Zeile13 )
parse error before "else" (in Zeile 18 )
hier mein programmcode


#include "asuro.h"

int main(void)
{
int i;
Init();
while(1);
if((PollSwitch()& [0x01]&[0x02]&[0x04])) <-- zeile 8
MotorDir(FWD,FWD);
MotorSpeed(150,90);
for(i=0;i<790;i++)
{Sleep(144);}
else if((PollSwitch()& [0x08]&[0x16]&[0x32])) <-- zeile 13
MotorDir(FWD,FWD);
MotorSpeed(90,150);
for(i=0;i<790;i++)
{Sleep(144);}
else <-- zeile 18
MotorDir(RWD,RWD);
MotorSpeed(120,120);
return 0;
}
vielen dank im vorraus
gruß
philipp

jeffreydj
18.02.2007, 14:34
Schau mal hier:

http://www.asurowiki.de/pmwiki/pmwiki.php/Main/KollisionsTestC
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25280#232210

modellbauphi
18.02.2007, 14:48
das hab ich bereits entdeckt allerdings würd ich gerne verstehen was ich bei meiner programmierung falsch mache damit später nicht dauern etwas aus dem forum kopieren muss.
Philipp

Pascal
18.02.2007, 14:54
Was willst du genau mit den Zahlen in eckigen Klammern bezwecken? Ich weiß leider nicht, wofür die stehen sollen.

Falls du 0x1 & 0x2 & 0x4 meinst, wirst du trotzdem was anderes wollen, als dies bewirkt. Denn dabei kommt wohl 0 raus. Du brauchst eher 0x1 | 0x2 | 0x4. Setz den Ausdruck aber noch in Klammern, also so:
PollSwitch()& (0x01 | 0x02 | 0x04)

Ansonsten kann ich auf Anhieb nichts erkennen. Könnte aber auch dran liegen, dass der Code ungünstig formatiert ist, was ihn sehr unübersichtlich macht.

Bitsch
18.02.2007, 15:08
Hallo ich hab hier ein ähnliches Beispiel,
hier habe ich aber nicht mit 'if'-Funktionen gearbeitet sondern mit 'switch' und 'case', was manchmal bei solchen Abfragen wesentlich einfacher ist.

modellbauphi
18.02.2007, 15:19
danke erstmal für die hilfe jetzt kommt keine fehlermeldung mehr,
allerdings hab ich jetzt fogendes problem mein asuro fährt nicht los hab noch Leds eingebaut um die schalter zu prüfen die leuchten allerdings auch nicht wenn ich einen taster drücke



#include "asuro.h"

int main(void)
{
int i;
Init();
while(1);
if
((PollSwitch()&(0x01|0x02|0x04))){
MotorDir(FWD,FWD);
MotorSpeed(150,90);
BackLED(OFF,ON);
for(i=0;i<790;i++)
{Sleep(144);}}
else if
((PollSwitch()&(0x08|0x16|0x32))){
MotorDir(FWD,FWD);
MotorSpeed(90,150);
BackLED(ON,OFF);
for(i=0;i<790;i++)
{Sleep(144);}}
else {
MotorDir(RWD,RWD);
MotorSpeed(120,120);}
BackLED(OFF,OFF);
return 0;
}

gtacelt
18.02.2007, 16:10
Er bleibt schon bei while(1); hängen. ;)
Das ; beendet gleich die while Schleife und der Rest wird nie ausgeführt.
Korrekt würde es so heißen:



while(1)
{
//der teil der hier steht wird immmer wieder wiederholt!
}

und in deinen code:


#include "asuro.h"

int main(void)
{
int i;
Init();
while(1)
{
if
((PollSwitch()&(0x01|0x02|0x04))){
MotorDir(FWD,FWD);
MotorSpeed(150,90);
BackLED(OFF,ON);
for(i=0;i<790;i++)
{Sleep(144);}}
else if
((PollSwitch()&(0x08|0x16|0x32))){
MotorDir(FWD,FWD);
MotorSpeed(90,150);
BackLED(ON,OFF);
for(i=0;i<790;i++)
{Sleep(144);}}
else {
MotorDir(RWD,RWD);
MotorSpeed(120,120);}
BackLED(OFF,OFF);
}
return 0;
}

damaltor
19.02.2007, 21:35
ob eine null hinter dem x steht oder nicht, ist egal. auch 0x000001 wäre in ordnung, allerdings dann kein integer mehr.
der asuro nimmt übrigens auch gern dezimale zahlen, damit spart man sich umrechnungen und tipparbeit. die werte für die taster sind dann 1,2,4,8,16 und 32.

Thowil
20.02.2007, 12:57
der asuro nimmt übrigens auch gern dezimale zahlen, damit spart man sich umrechnungen und tipparbeit. die werte für die taster sind dann 1,2,4,8,16 und 32.

Hallo zusammen,
diesen Hinweis habe ich nun schon mehrfach gelesen, muss allerdings sagen, dass ich persönlich die dezimale Schreibweise eher kontraproduktiv finde, wenn es darum geht, den Zustand bestimmter Bits festzustellen oder zu manipulieren. Das Umrechnen eines Nibbles in eine Hexziffer (und damit von byte zu einem Literal der Form 0x12 o.ä.) ist auf Dauer wesentlich schneller und unanfälliger für Fehler als das Umrechnen ins Dezimalsystem.

Hinzu kommt noch die Möglichkeit der zugegebenermaßen zunächst merkwürdig erscheinenden Schreibweise mit Shift-Operator:


if ( taster & (1<<4) )

fragt z.B. auf Bit4 in taster ab. Hat man diese Art der Abfrage einmal gesehen (und vllt einfach hingenommen), so ist sie möglicherweise sogar die einfachste und "fehlerresistenteste" Art, mit Bitmanipulationen und Abfragen umzugehen. (...und im Übrigen nutzt man sie ja ohnehin wahrscheinlich permanent, wenn man z.B. die Konfigurationsregister des Controllers beschreibt ;). )

Fröhliches Programmieren,
Thomas

damaltor
20.02.2007, 15:04
ja diese schiebe-anweisungen sind natürlich ein guter vorteil, haben aber eher was mit binären als mit hexadezimalen zahlen zu tun. aber an sich ist es egal, hauptsache man macht keine fehler. gerade für neulinge ist es allerdings deutlich einfacher dezimalzahlen zu lesen, als hex-zahlen zu interpretieren.

edit: das ist nichts gegen dich, ihc meine damit nur dass dadurch auch neulinge deine programme besser verstehen können =)