Frage zu PicoC Bitmasken

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Riemen
    Smart Home'r
    • 01.10.2016
    • 40

    #1

    Frage zu PicoC Bitmasken

    Hallo,
    kann mir jemand den Zusammenhang zwischen der Bitmaske und den Eingängen in PicoC-Bausteinen erklären?

    Soweit ich bisher verstanden habe schränkt die Zeile "if (nEvents & 0xe)" die EIngänge ein, die berücksichtigt werden.

    In der Loxone-Doku steht folgendes:


    This code snippet is likely for the program block with 4 inputs. You can change the bitmask in line 8 to make the code suitable for the other program blocks:

    Program 8: if(nEvents & 0x1c)

    Program 16: if(nEvents & 0x38)
    // write program here in PicoC
    char szBuffer[128];
    float f1,f2,f3,f4;
    int nEvents;
    while(TRUE)
    {
    nEvents = getinputevent();
    if (nEvents & 0xe)
    Der Baustein hat 16 EIngänge, also wäre es logisch, wenn die Bits bestimmen würden, auf welche der 16 EIngänge gelauscht wird.
    0x1c = (0000 0000 000)1 1100 -> Was bedeutet "Program 8"? Nahc meiner Logik wären hier Eingang 12-14 aktiv?
    0x38 = 111000 -> Was bedeutet "Program 16"? Anscheinend wieder 3 EIngänge aktiv, aber um einen verschoben. also Eingang 11-13?
    0xe = 1110 -> also diesmal Eingang 13-15???

    Irgendwie macht das Ganze so keinen Sinn. Ich habe das Gefühl, mein Denkansatz ist komplett falsch.

    Kann mir jemand erklären, wie das Ganze funktioniert?

    Viele Grüße
    Tobias
  • miqa
    MS Profi
    • 03.06.2016
    • 782

    #2
    Die Doku von Loxone ist nicht aktuell.

    Früher gab es drei Programmbausteine mit unterschiedlich vielen Eingängen. Seit (ich glaube) v8 gibt es nur noch einen mit insgesamt 16 Eingängen. Die ersten drei davon sind Texteingängen. Wenn du mit reinen Zahlen arbeitest musst du die immer überspringen.

    Der hex-Wert gibt an welche Eingänge sich das Programm anschauen soll. Wenn du den Wert in Binär umrechnest steht jeweils eine Stelle für einen Eingang. Von hinten angefangen mit den analogen Eingängen, je weiter vorne die "1" steht desto höher der (digitale) Eingang der betrachtet wird.

    Beispiel für den alten Baustein mit einem Texteingang und drei analogen Eingängen: 0x2 -> 0010 TI1 wird nicht ausgewertet. AI1 wird ausgewertet, AI2 und AI3 werden nicht ausgewertet.

    Den Baustein gibt es aber nicht mehr. für den aktuellen Baustein wäre das: 0x8 - 1000 TI1 bis TI3 werden nicht ausgewertet, AI1 wird ausgewertet. AI2 bis AI13 werden nicht ausgewertet. Die führenden nullen in der Binärdarstellung hab ich weg gelassen.

    Beispiel für 0x38
    0x38 -> 111000 TI1 bis TI3 werden nicht ausgewertet. AI1 bis AI3 werden ausgewertet. AI4 bis AI13 werden nicht ausgewertet.


    Du musst also immer nur die "38" aus deinem Beispiel durch den hex-Wert für die Eingänge ersetzen die du betrachten willst.
    Zuletzt geändert von miqa; 29.01.2018, 14:03.

    Kommentar

    • Riemen
      Smart Home'r
      • 01.10.2016
      • 40

      #3
      OK, super. Das ging ja schnell. Vielen Dank, jetzt weiß ich bescheid.

      Vielleicht sollte Loxone hier mal die Doku aktualisieren...

      Kommentar

      • miqa
        MS Profi
        • 03.06.2016
        • 782

        #4
        Kannst sie ja mal danach fragen. Aber die wahrscheinlich noch damit beschäftigt 50.000 Klicks einzusparen

        Kommentar

        • Riemen
          Smart Home'r
          • 01.10.2016
          • 40

          #5
          OK, ich bräuchte nochmal Eure Hilfe:

          Meine ersten Versuche eines Programms:

          Code:
          // Umrechnen von RGB-Werten nach HSV
          
          int i = 1;
          int nEvents;
          float rgbvalue;
          float red,green,blue;
          float hue,sat,bri;
          
          while(TRUE) {
              nEvents = getinputevent();
              if(nEvents & 0x8) {
          
                  rgbvalue = getinput(0);
          
                  //RGB-WErte aufsplitten (red + green*1000 + blue*1000000)
                  blue = floor(rgbvalue/1000000);
                  green = floor((rgbvalue-blue*1000000)/1000);
                  red = rgbvalue-blue*1000000-green*1000;
          
                  // umrechnen nach hue
                  hue = 0;
                  sat = 0;
                  bri = 0;
          
                  if (blue > 0 || green > 0 || red > 0) {
          
                      if ((red >= green) && (green >= blue)) {
                          if (red == blue) {
                               hue = 0; 
                          } else {
                               hue = 60*(green-blue)/(red-blue);
                          }
                          sat = (red - blue) / red;
                          bri = red;
                      } else if ((green > red) && (red >= blue)) {
                          hue = 60*(2 - (red-blue)/(green-blue));
                          sat = (green - blue) / green;
                          bri = green;
                      } else if ((green >= blue) && (blue > red)) {
                          hue = 60*(2 + (blue-red)/(green-red));
                          sat = (green - red) / green;
                          bri = green;
                      } else if ((blue > green) && (green > red)) {
                          hue = 60*(4 - (green-red)/(blue-red));
                          sat = (blue - red) / blue;
                          bri = blue;
                      } else if ((blue > red) && (red >= green)) {
                          hue = 60*(4 + (red-green)/(blue-green));
                          sat = (blue - green) / blue;
                          bri = blue;
                      } else if ((red >= blue) && (blue > green)) {
                          hue = 60*(6 - (blue-green)/(red-green));
                          sat = (red - green) / red;
                          bri = red;
                      }
                  }    
          
                  // Auf 0-100% normieren, wird für Glastaster gebraucht
                  hue = hue / 360 * 100;
                  sat = sat * 100;    
                  //bri = bri * 2.55;
          
                 setoutput(0,hue);
                 setoutput(1,sat);
                 setoutput(2,bri);
              }
              sleep(100);
          }
          Der Baustein soll die RGB-Werte einer Lichtsteuerung oder RGB-Szene in HUE-Werte (0-100 normiert) umwandeln, damit ich auf den Glastastern eine Rückkopplung bekomme, wenn über die Webobefläche oder App ein Wert geändert wurde (später will ich das in den HUE-Bausten integrieren, aber zunächst erstmal getrennt testen, um mir nicht die Hue-Steuerung zu zerschießen und zu sehen, wie das ganze überhaupt funktioniert.

          Das Coding habe ich aus den HUE-Baustein kopiert.


          Leider tut der Baustein momentan rein gar nichts. 0x8 müsste doch passen, wenn es nur einen Eingang gibt? Oder hab ich sonst noch nen Fehler drin?
          Gibt es eine Möglichkeit die Bausteine zu Debuggen?

          Kommentar

          • romildo
            Lebende Foren Legende
            • 25.08.2015
            • 5169

            #6
            Der Baustein liefert doch genau das was er gemäss Code liefern soll.
            Damit da was kommt, muss der Baustein im Miniserver gespeichert sein.
            An AI1 muss zudem eine Wertänderung erfolgen.
            Über die LiveView kannst Du dann sehen was an welchem Ausgang kommt.
            LG Romildo

            Kommentar

            • Riemen
              Smart Home'r
              • 01.10.2016
              • 40

              #7
              Ich hatte es vorher nur mit der Simulation versucht. Da liefert der Baustein aber nichts raus. Schade eigentlich.

              Aber Danke für die Hilfe.

              Kommentar


              • romildo
                romildo kommentierte
                Kommentar bearbeiten
                Bitte gerne.
                TeQ ist im übrigen der Fehlerausgang. Dieser hilft wenigstens etwas bei der Fehlersuche.

              • Jan W.
                Jan W. kommentierte
                Kommentar bearbeiten
                Kleine Ergänzung zu dem Tip von Romildo: an TeQ kannst Du einen Statusbaustein hängen und im Statustext <v1> eingeben. Dann siehst Du "Start", solange kein Fehler in Deinem Pico-C Programm auftritt.
            • miqa
              MS Profi
              • 03.06.2016
              • 782

              #8
              Im Loxwiki hat jemand einen PicoC Interpreter verlinkt.

              Hab ich nicht selber probiert, aber vielleicht hilft es ja.

              Kommentar


              • romildo
                romildo kommentierte
                Kommentar bearbeiten
                Aus meiner Sicht, für Programm wie in #5 leider nicht wirklich geeignet.

              • Riemen
                Riemen kommentierte
                Kommentar bearbeiten
                Ich hatte das auch schon versucht, aber anscheinend fehlen dem Interpreter sämtliche Bibliotheken und der "Kontext", der in den Loxone-Bausteinen zur Verfügung stehen.
                Bei mit ist der Interpreter schon an dem TRUE gescheitert, ok durch 1=1 ersetzt aber dann hat ihm die erste Methode getinputevent() gefehlt.
                Weiter hab ich's nicht versucht, aber wenn schon das nicht geht, dürfte das Tool in den wenigsten Fällen hilfreich sein...
            Lädt...