PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie deklariere ich die Pollswitches beim ASURO



xyphrox
18.10.2005, 09:11
#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

Flab
18.10.2005, 09:35
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

xyphrox
18.10.2005, 09:48
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 ?

xyphrox
18.10.2005, 10:19
@ 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ß.....

Flab
18.10.2005, 10:30
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?

xyphrox
18.10.2005, 10:33
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...?

Vogon
18.10.2005, 10:58
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

xyphrox
18.10.2005, 11:47
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, 12: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

xyphrox
18.10.2005, 12:24
#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, 12: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

xyphrox
18.10.2005, 13:06
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, 15: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

xyphrox
19.10.2005, 08:23
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, 08: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

xyphrox
19.10.2005, 09:10
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, 09: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

xyphrox
19.10.2005, 09:52
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, 09:53
Sorry wg. Doppelpost

xyphrox
19.10.2005, 10:12
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, 11: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

xyphrox
19.10.2005, 11:47
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, 12: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

xyphrox
19.10.2005, 12:56
jo das soweit alles klar
hab nit dran gedacht das es ja hexadezimal is....

läuft gut
danke danke ^^