Code Frage



  • Moin moin.

    Ich bin neu hier und wollte mal fragen ob mir jemand den folgenden Code Zeile für Zeile übersetzen kann.

    Ich bin sicher es gibt einige schlaue Köpfe hier!!

    void setXY(uint16_t X, uint16_t Y)
    {
    	uint32_t *p;
      uint32_t Ch1 = (((uint32_t)X << 1) | 0x20000ul) & 0x3fffeul;
      uint32_t Ch2 = (((uint32_t)Y << 1) | 0x20000ul) & 0x3fffeul;
      uint8_t parity1 = 0;
      uint8_t parity2 = 0;
      
      const uint16_t Sync1[4] = { 0xd2c3, 0x9687, 0x5a4b, 0x1e0f  };
      const uint16_t Sync0[4] = { 0xf0e1, 0xb4a5, 0x7869, 0x3c2d  };
      
      lastX = X;
      lastY = Y;
      
      for(int i=0; i<20; i++) {
        if(Ch1 & (1 << i)) parity1++;
        if(Ch2 & (1 << i)) parity2++;
      }  
      if(parity1 & 1) Ch1 |= 1;
      if(parity2 & 1) Ch2 |= 1;
    
    	if(txPing & 1) {
        p = ((uint32_t *) pingBuffer);
      } else {
        p = ((uint32_t *) pongBuffer);
      }
      
      // Clock cycle: 1-0, Sync 111...0
      for(int i=19; i>=0; i--) {
        int j = 0;
        uint32_t d;
        if(Ch1 & (1 << i)) j = 1;
        if(Ch2 & (1 << i)) j |= 2;
        d = Sync1[j];
        i--;
        j = 0;
        if(Ch1 & (1 << i)) j = 1;
        if(Ch2 & (1 << i)) j |= 2;
        if(i != 0) d |= (uint32_t)Sync1[j] << 16; 
              else d |= (uint32_t)Sync0[j] << 16;
        *p++ = d;
      }
      
      noInterrupts();
      txPing ^= 1;
      txPing |= 2;
      interrupts();
    }
    


  • @Hamstaaa sagte in Code Frage:

    Ich bin neu hier und wollte mal fragen ob mir jemand den folgenden Code Zeile für Zeile übersetzen kann.

    In welche Sprache denn?

    Und wo hast du Probleme?



  • @wob sagte in Code Frage:

    @Hamstaaa sagte in Code Frage:

    Ich bin neu hier und wollte mal fragen ob mir jemand den folgenden Code Zeile für Zeile übersetzen kann.

    In welche Sprache denn?

    Und wo hast du Probleme?

    Am besten in Deutsch 🙂

    Ich möchte eigentlich nur wissen was der Code so macht. Habe es nicht so mit Bits und HEX 😉



  • Am besten gehst du schrittweise vor und schaust dir an, wie die Zahlen in Binärformat aussehen. Dazu kannst du einen Taschenrechner oder aber std::bitset verwenden.

    Du kannst auch mal schauen, was "long" auf deinem System für eine Größe hat.

    uint32_t Ch1 = (((uint32_t)X << 1) | 0x20000ul) & 0x3fffeul;

    Du kannst z.B. mal cout << std::bitset<32>(0x3fffeul) << '\n'; schreiben (bei mit ist long sogar 64 bit lang, aber ist hier egal). Oder von anderen Zahlen. Da kommt raus: 00000000000000111111111111111110. Also 17x1 und dann 0. D.h. es wird bei der Und-Verknüpfung das "rechte" Bit entfernt und alles "links" von der linkesten 1.
    Das 0x20000ul ist offenbar 2172^{17}. Also genau eine 1 mit 17 Nullen dahinter.

    Und dann machst du so weiter.



  • @wob sagte in Code Frage:

    Am besten gehst du schrittweise vor und schaust dir an, wie die Zahlen in Binärformat aussehen. Dazu kannst du einen Taschenrechner oder aber std::bitset verwenden.

    Du kannst auch mal schauen, was "long" auf deinem System für eine Größe hat.

    uint32_t Ch1 = (((uint32_t)X << 1) | 0x20000ul) & 0x3fffeul;

    Du kannst z.B. mal cout << std::bitset<32>(0x3fffeul) << '\n'; schreiben (bei mit ist long sogar 64 bit lang, aber ist hier egal). Oder von anderen Zahlen. Da kommt raus: 00000000000000111111111111111110. Also 17x1 und dann 0. D.h. es wird bei der Und-Verknüpfung das "rechte" Bit entfernt und alles "links" von der linkesten 1.
    Das 0x20000ul ist offenbar 2172^{17}. Also genau eine 1 mit 17 Nullen dahinter.

    Und dann machst du so weiter.

    Danke schon mal für den Ansatz!

    wie kann ich denn z.B.

    const uint16_t Sync1[4] = { 0xd2c3, 0x9687, 0x5a4b, 0x1e0f };

    übersetzen?



  • @Hamstaaa uint16_t Sync1[4] ist ein zusammenhängender Speicherbereich aus vier 16Bit großen vorzeichenlosen Ganzzahlen. Und { 0xd2c3, 0x9687, 0x5a4b, 0x1e0f }; sind eben die Hexadezimalzahlen, die dort hinein geschrieben werden.



  • Vielleicht hat ja jemand sonst eine andere Idee, wie ich ein Signal mit meinem ESP32 erstellen kann, was folgenden Kriterien entspricht?:

    https://dvd.ilphotonics.com/Ray-Motion - galvanometers - 1D-2D-3D scanners/Motion Control - Optomechanics/Interface XY2-100.pdf

    Ich denke 2 MHz sollten doch kein Problem sein !?



  • push 🙂



  • @Hamstaaa
    Was erwartest du jetzt?


Log in to reply