Ich würde diesen partmal umschreiben, so dass es so aussihtCode:if (sw1 || sw2 && 0x01){dann müst es funktionirenCode:if ((sw1==sw2)&&(sw1>0)){
Hallo Board Mitglieder,
ich beschäftige mich noch nicht lange mit Asuro und stehe sozusagen eigentlich noch ganz am Anfang der Programmierung von Asuro. Ich versuche gerade die verschiedenen Knöpfe mit an Asuro mit verschiedenen Funktionen zu belegen, ich hab mir dazu mal den Quellcode des Selftests angesehen und hab dann versucht einen Knopf mit einer Funktion zu belegen, ich häge hier mal den Code an:
Code:#include "asuro.h" unsigned char sw1, sw2; int main(void){ Init(); StatusLED(OFF); FrontLED(OFF); BackLED(OFF,OFF); sw1=PollSwitch(); sw2=PollSwitch(); if (sw1 || sw2 && 0x01){ StatusLED(RED); Msleep(200); StatusLED(GREEN); Msleep(200); StatusLED(YELLOW); Msleep(200); } StatusLED(OFF); BackLED(OFF,OFF); FrontLED(OFF); while(1); return(0); }
Nur passiert nichts, egal auf welchen Knopf ich drücke, was hab ich am Code falsch gemacht ?
Gruß DoubleU
PS: Ich muss auch sagen, dass ich noch nicht all zu viel Erfahrung in C# habe.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
Bild hier
Ich würde diesen partmal umschreiben, so dass es so aussihtCode:if (sw1 || sw2 && 0x01){dann müst es funktionirenCode:if ((sw1==sw2)&&(sw1>0)){
[schild=14 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Roboter sind cool[/schild]
Hmm, scheint irgendwie auch nicht zu gehen. Ist es nicht so, dass wen ich das so mache "(sw1>0)", dass dann alle Tasten die gleiche Funktion ausführen ?
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
Bild hier
Der Code wird nur einmal ausgeführt und hängt dann am Ende in der while-Schleife.
if (sw1 || sw2 && 0x01){
prüft ob sw1 und sw2 einen Wert != 0 haben. Das && 0x01 bedeutet ein unnötiges && true Deshalb kann man auch schreiben:
if (sw1 || sw2){
was eben nur auf einen Wert != 0 prüft.
Gurß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ok, dass die Funktion nur abläuft wenn der Knopf gedrückt ist muss ich die Abfrage immer wieder machen oder ? Oder geschieht das nun schon durch die while Schleife am Ende ?
Ok, ich hab gesehen, dass wenn ich gleich beim Anschalten einen Finger auf einem Knopf habe, dass es dann geht, also muss ich die Abfrage immer wieder machen. Und wie würde das dann aussehen ?
Werd mal kurz im Inet suchen wie das geht.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
Bild hier
So nun bin ich ein bisschen weiter, ich konnte mir mit dem Selftest Code soweit abhelfen, dass ich nun mit diesem Code ungefähr das ergebniss habe, welches ich wollte:
Code:#include "asuro.h" unsigned char sw; unsigned int i; void SwitchTest(void) { sw = PollSwitch(); BackLED(OFF,OFF); if (sw & 0x01) { BackLED(OFF,ON); } } int main(void){ Init(); StatusLED(OFF); i=0; for (i = 0; i < 0xFE00; i++) SwitchTest(); BackLED(OFF,OFF); while(1); return(0); }
Nur kann man jetzt nicht nur mit einem Taster die BackLED zum leuchten bringen sondern gleich mit vier ? Was muss ich machen, das z.B. nur durch den ersten Schalter die LED leuchtet ?
Und was bedeutet eigentlich das "0xFE00" ? Werd auch gleich im Inet danach schauen.
Gruß DoubleU
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
Bild hier
Code:#include "asuro.h" unsigned char sw1, sw2; int main(void){ Init(); StatusLED(OFF); FrontLED(OFF); BackLED(OFF,OFF); while(1){ sw1=PollSwitch(); sw2=PollSwitch(); if (sw1 || sw2 && 0x01){ StatusLED(RED); Msleep(200); StatusLED(GREEN); Msleep(200); StatusLED(YELLOW); Msleep(200); } } return(0); }
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Danke Radbruch,
ich hab das ganze nun noch ein bisschen erweitert:
Und nun sind drei Tasten mit einer extra Funktion belegt, nur die anderen drei, wo eigentlich nichts passieren sollte durchlaufen irgendwie alle drei verschiedenen Funktionen nacheinander.Code:#include "asuro.h" unsigned char sw1, sw2; int main(void){ Init(); while(1){ sw1=PollSwitch(); sw2=PollSwitch(); StatusLED(OFF); BackLED(OFF,OFF); FrontLED(OFF); if (sw1 && sw2 & 0x01){ StatusLED(RED); Msleep(200); StatusLED(GREEN); Msleep(200); StatusLED(YELLOW); Msleep(200); } if (sw1 && sw2 & 0x02){ BackLED(OFF,ON); Msleep(200); BackLED(ON,OFF); Msleep(200); } if (sw1 && sw2 & 0x04){ FrontLED(ON); Msleep(200); FrontLED(OFF); Msleep(200); } if (sw1 && sw2 & 0x08){ StatusLED(OFF); BackLED(OFF,OFF); FrontLED(OFF); } if (sw1 && sw2 & 0x16){ StatusLED(OFF); BackLED(OFF,OFF); FrontLED(OFF); } if (sw1 && sw2 & 0x32){ StatusLED(OFF); BackLED(OFF,OFF); FrontLED(OFF); } } return(0); }
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
Bild hier
Hallo Doubleyou
Erstmal noch ein herzliches Willkommen im RN-Forum. Ich bin echt beeindruckt, was du alles findest, wenn du "Werd auch gleich im Inet danach schauen." machst.
Zu deinem Problem: Du hast zwar nun eine Überprüfung auf einzelne Werte, aber "doppelte" Tasten werden nicht abgefangen. Die Standartlösung sieht so aus:
if ((sw1 == sw2) && (sw1 == 0x01)) {
Gruß
mic
[Edit]
btw ist das natürlich Quatsch:
if (sw1 && sw2 & 0x01){
(sw2 & 0x01) ergibt true wenn in sw2 mindestens Bit0 gesetzt ist, auch wenn mehrere Bits gesetzt sind. Dieses true erklärst du dann für gültig wenn in sw1 irgendein Bit gesetzt ist.
Das hattest du vermutlich eh anders gedacht, oder hast du die Rangfolge der Funktionen beachten (quasi das punktvorstrich):
Bitweises & kommt vor logischem &&, d.h. deine Abfrage wird so ausgewertet:
if (sw1 && (sw2 & 0x01)){
du meintest aber vermutlich:
if ((sw1 && sw2) & 0x01){
Das macht dann die Abfrage auch nicht wesentlich besser. Wenn irgendwas in sw1 und irgendwas in sw2 steht, ist das Ergebniss true und du vergleichst dieses true (das der Compiler irgendwie speichert hat) dann bitweise mit 0b00000001...
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Danke für das Willkommen und danke auch für die gute und vorallem auch schnelle Hilfe.
Ich habs nun verstande und auch hinbekommen, mitmüssen die Pollswitches die gleiche Ausgabe haben und dürfen nur einen Bit enthalten und je nach Schalter, die verschieden viele Bits ausgeben, kann ich das dann korrekt anpassen.Code:if ((sw1 == sw2) && (sw1 == 0x01)) {
Danke nochmal für die Hilfe, hätte vielleicht noch ein bisschen mehr nachdenken solle. Aber wie gesagt, ich steh noch am Anfang und bin auch dankbar, dass man so geduldig mirgegenüber ist.
Gruß DoubleU
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
Bild hier
Lesezeichen