Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie deklariere ich die Pollswitches beim ASURO
#include "asuro.h"
#define POLLSWITCH KNOPF
int main(void)
{
Init ();
start:
MotorDir(FWD,FWD);
MotorSpeed(250,233);
StatusLED(GREEN);
FrontLED(ON);
if (PollSwitch()>0);
else if (PollSwitch()>0) {goto stop;}
else {goto start;}
stop:
MotorSpeed(0,0);
while(1);
return 0;
}
-----
das mein code für grade aus fahren und stehen bleiben wenn er irgendwo anstößt.
nur wie bestimm ich jetzt die PollSwitches?
also wenn K1 gedrückt wrd dreht er links rum bei K2 spielt er musik bei K3 fährt er rückwärts usw
eben für jeden einzelnen Taster eine einzelne Funktion.
in der Anleitung find ich es nicht.
ich hab mir aber gedacht:
if (PollSwitch(1,2,3)>0);
else if (PollSwitch(1,2,3)>0) {goto stop;}
else {goto start;}
eben für K1=1 für K2=2 K3=3 usw in die erste klammer nur da kommt en fehler der sagt mir
error: too many arguments to function `PollSwitch'
schon mal danke im vorraus.....
gruß xyphrox
die fkt Pollswitch bekommt keine argumente übergeben, sondern die klammer bleibt leer, dh du musst mit dem wert arbeiten, den sie zurückgibt.
wenn nur schalter 1 gedrückt ist, liefert sie 1, bei 2 2, bei 3 4, bei 4 8, bei 5 16 und bei 6 32. sind mehrere schalter gleichzeitig gedrückt, bekommt man die entsprechende summe
also angenommen
K1 und K2 werden gedrückt
dann hab ich den wert " 3 " da K1 1 und K2 2 liefert ?
und addiert gibt das 3 ...
hab ich das richtig verstanden ?
@ Flab
hab das was du geschrieben hast in der anleitung gefunden....
du hast einen fehler gemacht
K6 liefert den wert 1 und K1 liefert den wert 32
k1 - 32
k2 - 16
k3 - 8
k4 - 4
k5 - 2
k6 - 1
[ Seite 71 oben ]
:) trotzdem bin ich dem ergebnis noch nit näher gekommen
ich hab probiert :
if (PollSwitch()>73)
die 73 s die zahl die maximal eliefert werden kann wenn alle gleichzeitig gedrückt werden
da wir aber die bedingung größer als > haben kann er also im prinzip nie ausgehen
er geht aber aus wenn nur einer gedrückt wird
ich weiß noch nicht ganz wie ich mit den werten arbeiten muß.....
sorry, hab ich mich vertan 8-[
du aber auch, denn
1+2+4+8+16+32=63 ;)
ist aber auch egal, da scheint bei dir irgendwo anders noch ein wurm drin zu sein... sicher das er das richtige programm compiliert und geflasht hat?
hupsala
63 stimmt geb ich dir recht
irren is nun mal männlich ;)
mit den werten hast du mir ja nun schon geholfen.
danke
nur wie setze ich die wo richtig ein...?
Meine Version:
sw = PollSwitch();
// PrintInt(sw); /* will wissen was da kommt */
if (sw & 0x01)
{
tu_dies();
}
if (sw & 0x02)
{
tu_das();
}
if (sw & 0x04)
{
mach_was();
}
if (sw & 0x08)
{
mach_nix();
}
if (sw & 0x10)
{
tu_nochwas();
}
if (sw & 0x20)
{
fetich();
}
So geht es auch wenn mehrere Taste gleichzeitig gedrückt werden.
Oft bringt aber Pollswitch() falsche werte. Dann muss man noch in der asuro.c ändern:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=106332#106332
mhh ok danke
du schreibst da in jedem abschnitt:
& 0xXX
wofür steht z.b. die 10 und die 20 ?
das sind doch nicht diese zahlen die von einem taster ausgegeben werden oder etwa doch ...?
m.a.r.v.i.n
18.10.2005, 13:16
Hallo xyphrox,
die Zahlen 0xXX stehen für Hexadezimalzahlen.
Dezimal bedeutet 0x01=1, 0x02=2 0x04=4, 0x08=8, 0x10=16, 0x20=32.
Das & Zeichen ist eine logische UND-Verknüpfung und dient zur Verknüpfung des gelesenen Tastenwertes mit der entsprechenden Zahl.
Ist das Ergebnis des Vergleichs nicht 0 ist die Bedingung wahr.
Dadurch werden auch Tastenkombinationen erfaßt:
z.B Tastenwert 7 (Taste K6, K5 und K4 gedrückt) besteht aus 1+2+4.
Bei der Abfrage werden nacheinander die Funktionen tu_dies(), tu_das() und mach_was() aus vogons Beispiel aufgerufen, weil die Bedingung jeweils wahr ist.
Alles klar?
Gruß Peter
#include "asuro.h"
#define POLLSWITCH sw
// PrintInt(sw); /* will wissen was da kommt */
int main(void)
{
Init ();
start:
MotorDir(FWD,FWD);
MotorSpeed(250,233);
StatusLED(GREEN);
FrontLED(ON);
if (sw & 0x01)
{
MotorSpeed(0,0);
else {goto start;}
}
stop:
MotorSpeed(0,0);
while(1);
return 0;
}
---
ok es geht immer noch nicht....
wo liegt mein fehler....?
danke marvin
m.a.r.v.i.n
18.10.2005, 13:54
Hallo xyphrox,
gleich mehrere Fehler.
- Funktionsaufrufe in C immer mit () Klammern, auch wenn keine Parameter übergeben werden.
- Goto und Labels in C sollte man besser vermeiden.
- else Zweig innerhalb des if Blocks wird nie ausgeführt.
- while Schleife am Ende des Programms bedeutet oberer Programmteil wird nur einmal durchlaufen.
Probiers mal so:
#include "asuro.h"
#define PollSwitch sw
int main(void)
{
Init ();
MotorDir(FWD,FWD);
MotorSpeed(250,233);
StatusLED(GREEN);
FrontLED(ON);
while(1)
{
// if (sw()) /* irgendeine Taste gedrückt */
if (sw() & 0x01) /* Taste K6 gedrückt */
{
MotorSpeed(0,0);
StatusLED(RED);
}
else
{
MotorSpeed(250,233);
StatusLED(GREEN);
}
return 0;
}
Gruß Peter
thx für deinen beitrag nur lässt sich der roboter immer noch von jedem taster stoppen
und laut deinem programm darf nur k6 den robbi ausschalten oder?
so jetzt bin ich mehr als ratlos.... ;)
m.a.r.v.i.n
18.10.2005, 16:38
Hallo xyphrox,
ja, das Programm wäre so richtig. Aber halb so schlimm, das kriegen wir schon hin.
Die Probleme mit den Tastsensoren wurden hier im Forum ja des öfteren schon besprochen.
Auf meiner Homepage habe ich dazu auch einiges gesammelt.
http://asuro.pytalhost.de
Unter Programmierung | Beispielprogramme in C zu finden.
Probier mal:
- Mehrmaliges aufrufen der PollSwitch() Funktion
...
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
if (PollSwitch())
...
- oder Vergleich der zurückgegeben Werte
unsigned char t1, t2;
...
t1=PollSwitch();
t2=PollSwitch();
if (t1 && t2 && t1 == t2)
...
- oder Ausgabe der Werte im TerminalProgramm
unsigned char t;
...
t=PollSwitch();
if (t)
{
PrintInt(t)
SerWrite("\r\n");
}
Gruß Peter
moin marvin
so hab sozusagen nochmal ne nacht drüber geschlafen
also ich hab jetzt was einigermaßen geht
#include "asuro.h"
int main(void)
{
Init ();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
if (PollSwitch())
MotorDir(FWD,FWD);
MotorSpeed(250,233);
StatusLED(GREEN);
FrontLED(ON);
while(1)
if (PollSwitch() & 0x32)
{MotorDir(RWD,RWD);
MotorSpeed(250,233);}
else {MotorSpeed(250,233);}
return 0;
}
so das geht
0x32 <--- das is ja theoretisch der befehl das nur mein K1 schalten soll und das eht auch nur K1 schaltet sonst keiner.
nur wenn ich das jetzt umschreibe auf 0x01 das nur mein K6 schaltet schalten außer K6 auch noch K1 und K2 ......
hmpf woran liegt es ?
m.a.r.v.i.n
19.10.2005, 09:59
Hallo xyphrox,
- 0x20 = 32, nicht 0x32 in Hexadezimal Schreibweise (2*16).
- Das wiederholte Aufrufen der PollSwitch() Funktion innerhalb der while Schleife, nicht nur einmal am Programmbeginn.
- Motorrichtung wieder zurück auf vorwärts schalten.
so sollte es eigentlich funktionieren:
#include "asuro.h"
int main(void)
{
Init ();
MotorDir(FWD,FWD);
MotorSpeed(250,233);
StatusLED(GREEN);
FrontLED(ON);
while(1)
{
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
if (PollSwitch() & 0x20) // K1 gedrueckt
{
MotorDir(RWD,RWD);
MotorSpeed(250,233);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(250,233);
}
}
return 0;
}
Schön wäre es, wenn der Asuro ein Stück zurückfährt (zeitgesteuert) und dann wieder vorwärts.
Noch besser wenn er entsprechend der gedrückten Taster eine Kurve rückwärts fährt, um dem Hindernis auszuweichen.
Da solltest du aber selbst versuchen.
Ich empfehle dringend mal ein C-Tutorial durchzuarbeiten.
Gruß Peter
also die 0x32 hab ich mich vertippt
hab die 0x20 drin
das mit K1 geht ja auch.
nur wenn ich dann 0x01 schreibe spinnt er rum....
ein c tutorial?
wie mach ich das bzw wie gehe ich da am besten vor ?
und wegen deinem programmvorschlag das er dann rückwärts fährt und hindernis ausweicht usw...
...genau das hab ich vor das muss bis um 12uhr größtenteils alles funktionieren 8-[
danke für deine antwort....
m.a.r.v.i.n
19.10.2005, 10:39
Hallo xyphrox,
wenn es mit K6 immer noch nicht klappt, hilft nur noch sich die Werte ausgeben lassen.
Bau mal folgendes ein:
unsigned char taste;
...
if (taste = PollSwitch())
{
PrintInt(Taste);
...
Du brauchst zum Anzeigen ein Terminalprogramm. Da du den USB Transceiver verwendest, funktioniert Hyperterminal nicht. Hier gibt es ein Terminalprogramm für den USB Transceiver.
/http://asuro.pytalhost.de/pmwiki/uploads/Main/d2xxapp.zip
Gruß Peter
hat es ebínen tieferen sinn das du eben als antwort nochmal das selbe geschrieben hast wie vorhin? ;)
m.a.r.v.i.n
19.10.2005, 10:53
Sorry wg. Doppelpost
mit einem schalter z.b. K1 oder K2 funkktioniert es auch mit zeit rücklauf
zähler usw is drin.
nur wie geht das das ich sage K2 ODER K5 sollen ein signal bringen und dann fährt er rückwärts....?
und wenn 2 zusammen ein signal bringen müssen also im prinzip ne und-verknüpfung ?!
wäre das :
if (PollSwitch() & 0x10 & 0x02) <-- für UND
if (PollSwitch() & 0x10 or 0x02) <--- für oder
????
m.a.r.v.i.n
19.10.2005, 12:02
ganz einfach.
if (PollSwitch() & 0x12) // K2 oder K5 gedrückt
Die Bedingung ist wahr (!= 0) wenn einer der beiden Schalter betätigt ist.
if (PollSwitch() == 0x12) // K2 und K5 gedrückt
Die Bedingung ist nur wahr (!= 0) wenn beide Schalter betätigt sind.
Gruß Peter
woher kommen die 12 ?
danke es geht hast mir sehr geholfen
kennst dich ja prima aus hier :)
m.a.r.v.i.n
19.10.2005, 13:22
0x10 + 0x02 einfach addieren.
Der Wert den die PollSwitch() Funktion zurückgibt entspricht den untersten 6 Bits eines Bytes. Jedes Bit entspricht einer Taste.
Im Dualen Zahlensystem ausgedrückt:
00000001 = K6
00000010 = K5
00000100 = K4
00001000 = K3
00010000 = K2
00100000 = K1
Da der Compiler nicht mit Dualzahlen klarkommt, werden diese in Hexadezimalzahlen umgerechnet (ist einfacher als Dezimal)
Die Umrechnung in Hexadezimal erfolgt für jeweils 4 Bit:
0x01 = K6
0x02 = K5
0x04 = K4
0x08 = K3
0x10 = K2
0x20 = K1
Kombinationen von Tasten bekommt man einfach durch Addition.
z.B. K2+K5 = 0x10 + 0x02 = 0x12
Zur Anschauung empfehle ich http://de.wikipedia.org/wiki/Hexadezimalsystem
Gruß Peter
jo das soweit alles klar
hab nit dran gedacht das es ja hexadezimal is....
läuft gut
danke danke ^^
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.