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"vielen dank im vorraus
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;
}
gruß
philipp
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
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.
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.
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
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; }
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:
und in deinen code:Code:while(1) { //der teil der hier steht wird immmer wieder wiederholt! }
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; }
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.
Hallo zusammen,Zitat von damaltor
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:
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 . )Code:if ( taster & (1<<4) )
Fröhliches Programmieren,
Thomas
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 =)
Lesezeichen