im hyperterminal (oder anderes programm) musst du nichts berücksichtigen, nur im code musst du wie oben erwähnt if (ir == 'w') schreiben. das habe ich damit gemeint
also ir hat unsigned char....
wie muss ich des mit dem ascii code schreine dass wenn ich w drücke asuro nach vorne fährt???
im hyperterminal (oder anderes programm) musst du nichts berücksichtigen, nur im code musst du wie oben erwähnt if (ir == 'w') schreiben. das habe ich damit gemeint
mfg hai1991
P.S.: wer großbuchstaben oder rechtschreibfehler findet darf sie behalten
also ich hab jetzt ein programm geschrieben....:
das funktioniert aber nicht..Code:#include "asuro.h" int main(void) { Init(); unsigned char ir; while(1) { SerRead(ir, 1, 0); if (ir == "w"){ MotorDir(FWD, FWD); MotorSpeed(100, 100); } if (ir == "s"){ MotorDir(RWD, RWD); MotorSpeed(100, 100); } } }
Ich schätze mal hai1991 meint, dass du im Programm eine unsigned char variable deklarieren musst. In diese schreibst du dann mittels serread den Wert. Dieser wird mittels Hyperterminal übertragen.
Und dann machst du einfach if (die unsigned char variable (255 zeichen, also passen alle asciis rein) == 'w') also vergleiche ob "w" gedrückt wurde -> und dann eben Motor bewegen.
ich check des nich mit dem ascii....
was muss ich da jetzt genau schreiben???
Hallo
" - Bei Zeichenketten (strings, auch bei Länge==1!)
' - Bei Einzelzeichen wenn der ascii-Wert des Zeichens gemeint ist
z.B.: 'a' ist dann ein Platzhalter für eine Konstante mit 65. Man könnte auch direkt 65 schreiben. Oder als Hex oder Bin, entscheidend ist nur, wie man als Programmierer leichter erkennt was gemeint ist. Wenn man bestimmte Bits testen will sagt (PINC & &b110010) mehr aus als (PINC & 50) und wenn man Zeichen einer Tastatur prüfen will ist ein 'w' oder 'Z' einfacher als direkt mit dem asciiwert zu vergleichen.
GrußCode:#include "asuro.h" int main(void) { Init(); unsigned char ir[]="123"; // Seite 65 der asuro-Anleitung while(1) { SerRead(ir, 1, 0); if (ir[0] == 'w') { MotorDir(FWD, FWD); MotorSpeed(100, 100); StatusLED(RED); } if (ir[0] == 's') { MotorDir(RWD, RWD); MotorSpeed(100, 100); StatusLED(YELLOW); } if (ir[0] == 'x') { MotorDir(BREAK, BREAK); MotorSpeed(0, 0); StatusLED(GREEN); } } }
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
thx......
es funktioniert...!!!
aber asuro fährt solange bis ich eine andere aste drücke....
wie kann ich des machen das asuro stoppt wenn ich die taste los lasse??
Bin mir nicht sicher aber versuch mal am Ende der while ir auf 0 zu setzen.
Eigentlich müsste er stehen bleiben wenn du die Taste loslässt weil beim nächsten Schleifendurchlauf ja kein Buchstabe mehr empfangen wird. Aber vielleicht schreibt das Programm intern einfach nichts neues nach ir wenn nichts empfangen wird und somit bleibt die zuvor gedrückte Taste erhalten. Bin mir aber nicht sicher, dazu müsste man sich serRead genauer ansehen.
Guten Morgen
Also wenn die Taste(z.B 'w') los gelassen wurde, ist ir immer noch "w23" . Beginnt jetzt der neue Schleifendurchlauf, wird mit dem Befehl SerRead(ir,1,0) so lange gewartet bis ein Zeichen eingelesen wurde. Gibst du 10 Sekunden lang kein Zeichen, führt dieser Befehl auch da zu, dass der Schleifendurchlauf 10 Sekunden lang nicht weiter geht.
Dein Asuro fährt deswegen einfach weiter, weil du ihm nicht gesagt hast, dass er stoppen soll, wenn kein Zeichen mehr eingelesen wird.
Wenn man z.B. folgendes Programm schreibt,
Hier fährt der Asuro los, da i = 5 ist und setzt danach i auf 0. Bei den darauf folgenden Schleifendurchläufen passiert gar nix, da die If-Bedingung nicht erfüllt wird. Der Asuro fährt jetzt so lange weiter bis die Batterien alle leer sind, da nirgendwo steht, das er stoppen soll, wenn i nicht mehr 5 ist.Code:#include "asuro.h" int main(void) { char i = 5; while(1) { if (i == 5) { MotorDir(FWD,FWD); MotorSpeed(120,120); i = 0; } } return 0; }
Also die Lösung deines Problems:
-ändere SerRead(ir,1,0) auf SerRead(ir,1,1) oder eine andere Zahl >0, damit er nicht unendlich lang auf die Eingabe eines Zeichens wartet (näheres im Handbuch auf S.65)
-setze nach jedem Schleifendurchlauf ir[0] = 'x' , somit ist beim nächsten Schleifendurchlauf ir = "x23" und da nun nicht mehr bei SerRead gewartet wird, wird die 3. If-abfrage erfüllt und dein Asuro hält automatisch nach loslassen der Taste an.
(hab ich nicht ausprobiert, ist mir nur spontan eingefallen, müsste aber trotzdem klappen)
Gruß
Flo
ich schreibe in meinem programm jetzt ir = 'y'
(ich hab jetzt eine andere if abfrage geschrieben mit y....)
aber jetzt kommt immer diese fehlermeldung...:
error: incompatible types in assignment
Lesezeichen