- 12V Akku mit 280 Ah bauen         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Asuro PollSwitch() für Anfänger

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.02.2008
    Ort
    /home/doubleu
    Beiträge
    8

    Asuro PollSwitch() für Anfänger

    Anzeige

    Praxistest und DIY Projekte
    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  

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.11.2007
    Beiträge
    152
    Ich würde diesen part
    Code:
    if (sw1 || sw2 && 0x01){
    mal umschreiben, so dass es so aussiht
    Code:
    if ((sw1==sw2)&&(sw1>0)){
    dann müst es funktioniren
    [schild=14 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Roboter sind cool[/schild]

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    16.02.2008
    Ort
    /home/doubleu
    Beiträge
    8
    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  

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    16.02.2008
    Ort
    /home/doubleu
    Beiträge
    8
    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  

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    16.02.2008
    Ort
    /home/doubleu
    Beiträge
    8
    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  

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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!

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    16.02.2008
    Ort
    /home/doubleu
    Beiträge
    8
    Danke Radbruch,

    ich hab das ganze nun noch ein bisschen erweitert:

    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);
    }
    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.
    IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
    Bild hier  

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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!

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    16.02.2008
    Ort
    /home/doubleu
    Beiträge
    8
    Danke für das Willkommen und danke auch für die gute und vorallem auch schnelle Hilfe.

    Ich habs nun verstande und auch hinbekommen, mit
    Code:
    if ((sw1 == sw2) && (sw1 == 0x01)) {
    mü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.

    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  

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad