Willkommen in unserer Community

Werde Teil unserer Community und registriere dich jetzt kostenlos ...

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C Umrechnung von Zahlen

Dieses Thema im Forum "Software" wurde erstellt von achim S., 8. Oktober 2017.

  1. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Hallo
    Habe ein Problem mit der Eingabe und Umrechnung von Zahlen.
    Der Hersteller gibt in seinem Datenblatt an:

    Farbe(1,$FF00FF)

    Die 1 bedeutet dabei für Style Nr
    #FF00FF steht dabei für die Eingabe der Farben. Die ersten FF steht für Rot von 00 bis 255 und so weiter

    Eine Eingabe mit int geht so nicht da sie dezimal sind. Umrechnen aber wie?
    Die Ausgabe bzw. übertragung zum Display soll Farbe(1,$FF00FF) und muss dazu mit I2C übertrgen werden.
    Hat jemand eine Idee wie das geht?
    achim
     
  2. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.044
    Zustimmungen:
    100
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Hallo Achim,

    ich vermute, du möchtest die Farbwerte einzeln dezimal angeben.

    Vielleicht hilft dir folgendes C-Schnipsel weiter.

    Dirk :ciao:



    CodeBox C und C++
    uint32_t meinefarbe;
    uint8_t r, g, b;
    
    r = 10;   // 0..255
    g = 100;
    b = 190;
    
    meinefarbe = (uint32_t)(r<<16) | (uint32_t)(g<<8) | b;
    
    Farbe(1, meinefarbe);
     
  3. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Hallo Dirk
    habe es so eingegeben. Leider kein Erfolg. Habe mal die Angaben im Datenblatt kopiert, hilft vielleicht weiter.

    Füllfarbe definieren #CFC Drawstyle-nr, RGB, Opacity(100) Definiert einen Drawstyle Drawstyle-nr mit
    einer einfachen Farbfüllung RGB(z.B:
    $FF0000 für Rot) sowie deren Transparenz
    Opacity(0...100).

    Einfarbige Füllung
    Füllfarbe definieren, der Alphakanal ist optional,
    #CFC 1, $00FF00

    achim
     
  4. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Habe es übertragen:


    CodeBox C und C++
    void Graphik_EA5_Fuellung_definieren(int8_t f1, uint32_t f2, uint32_t f3, uint32_t f4)
        {
         int8_t bcc;
         uint32_t mf;
         mf = (uint32_t)(f2<<16) | (uint32_t)(f3<<8) | f4;
         bcc = DC1 + 0x07 + ESC + END + 'C' + 'F' + 'C' + f1 + mf; // + 0x62 + 0x00;   
         i2c_start(slave_adresse_1);
         i2c_write(DC1);
         i2c_write(0x07);   // 08 7 9
         i2c_write(ESC);     // ESC
         
         i2c_write('C');       // C
         i2c_write('F');       // F
         i2c_write('C');       // C
         
         i2c_write(f1);       // x1
         i2c_write(mf);       // y1
         i2c_write(END);
         i2c_write(bcc);
         i2c_stop();
         
         _delay_us(100);
         
         i2c_start(slave_adresse_2);
         e = i2c_readAck();
         i2c_stop();
         itoa( e, Buffer, 10 );
         lcd_printlc(2,5,Buffer);
          _delay_us(200);
        }
    

    achim
     
  5. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.044
    Zustimmungen:
    100
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Hallo Achim,

    die Parameter f2, f3 und f4 brauchen nur uint8_t sein.

    Ein Fehler hast du bei Zeile 17. Hier musst du drei Byte übertragen, du überträgst aber nur ein Byte.
    Ausserdem sieht die Zelie für mich wegen "// y1" wie eine Koordinate aus.

    Irgendwo sollte sowas vorkommen ...
    i2c_write(f2); // R
    i2c_write(f3); // G
    i2c_write(f4); // B
     
  6. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Hallo Dirk
    habe die Zeile 17 durch deine Angabe ersetzt. Das gleiche Ergebniss. Das //y1 ist ein Rest aus einem anderen Teil des Programmes und zählt nicht. Wozu nehme ich jetzt Meine Farbe?
    Habe für das Display bereits den Cursor in Betrieb. Mit der Angabe der Farben klappt es überhaupt nicht. Habe es für andere Displays mit dem Small Protikoll gleich gemacht und es geht alles. Ist irgendwie komisch
    achim
     
  7. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.044
    Zustimmungen:
    100
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Hallo Achim,

    beim Protokoll kann ich leider nicht weiter helfen, ich müsste mich auch erst in das Datenblatt des Displays "reinlesen". Ich vermute allerdings im Protokoll noch Fehler.

    Zum Beispiel funktioniert folgendes gar nicht ...


    CodeBox C und C++
    int8_t bcc;
    bcc = DC1 + 0x07 + ESC + END + 'C' + 'F' + 'C' + f1 + mf; // + 0x62 + 0x00;
    // ...
    i2c_write(bcc);
     
  8. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Hallo Dirk
    warum sollte das nicht funktionieren?
    Das Protokoll in der aktuellen Ausgabe ist mehr als dürftig beschrieben. Nach Auskunft der Herstellers ist es das gleich wie anderen Produkten.
    Diese Kombination gibt der Hersteller vor. Der Sinn ist dabei, es wird eine "Prüfsumme" gebildet aus den zu ¨übertragenden Werten". Dies kommt als letztes mit zum Slave. Im Slave wird die Summe überprüft und wenn dies mit dem angegeben Wert übereinstimmt wird ACK zurück gegeben. Es wird der Wert von 6 zurückgegeb und muss zwingend ausgelesen werden. Kommt eij anderer Wert zurück, werden die Eingaben verworfen und es wird eine andere Zahl ausgegeben. Dazu arbeite ich mit 2 verschiedenen Displays gleichzeitig. Auf dem TFT will ich die Ausgeben, Farben oder Figuren sehen. Auf dem anderen einfachen Display werden mir die Zahlen angzeigt. Kann auch Zwischenschritte eingeben oder mir Werte anzeigen lassen. Habe den gleichen Aufbau im Programm für das TFT3,3 von EA bereits gemacht, das sind ca. 50 Befehle und laufen alle super. Habe es für das uniTFT050 von EA genauso gemacht. Cursor Funktionen gehen super. Aber alles was mir Farbe oder Figuren zu tun nicht. Im Datenblatt steht dazu, das mann die Werte mit $FF00FF eingeben soll. Habe schon alle möglichen Werte getestet und es geht einfach nicht. Mal sehen was der Hersteller dazu sagt.


    CodeBox C und C++
    //   YCB - Curser aus=0 ein=1
    void Graphik_EA5_Cursor_blinken(int8_t a)           
      {             
       int8_t z;   
       z = a + 48;
       int8_t bcc;
       bcc = DC1 + 0x06 + ESC + END + 'Y' + 'C' + 'B' + z;
       i2c_start(slave_adresse_1);
       i2c_write(DC1);
       i2c_write(0x06);   // len 06
       i2c_write(ESC);     // ESC
       i2c_write('Y');       // Y
       i2c_write('C');       // C
       i2c_write('B');       // B
       i2c_write(z);       // a
       i2c_write(END);
       i2c_write(bcc);
       i2c_stop();
       
       _delay_us(50);
       
       i2c_start(slave_adresse_2);
       e = i2c_readAck();
       i2c_stop();
       itoa( e, Buffer, 10 );   
       lcd_printlc(1,7,Buffer);   
       _delay_us(200);
      }
    

    Habe mal ein anderes Stück angehängt. Kann damit das blinken des Cursor ein und ausschalten und geht super. Scheinbar sind noch einige Fehler drin. z.B. wenn ich das blinken ausschalte ist der Cursor unsichtbar und kann weder dauer ein- noch ausgeschaltet werden.
    Da werde ich wohl weiter suchen müssen.
    achim
     
  9. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.044
    Zustimmungen:
    100
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Ach ok, da wird eine Prüfsumme berechnet.
    Das ist dann sicherlich so in Ordnung. Wie geschrieben, kenne ich das Protokoll nicht.

    Wenn du die Farben einstellst, sind dann auch die Werte RGB in der Prüfsumme berücksichtigt?
     
  10. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Die Frage kann ich so nicht beantworten. Aus Erfahrung kenne ich das nur so. Auch wenn ich verschieden Koordinaten eingebe oder Farnwerte in dem anderen Display wure es nicht berücksichtigt. Nur bei der Eingabe von Texten mit unterschiedlicher Länge berechne ich die Länge des Strings extra und addiere es zu bcc


    CodeBox C und C++
    void Graphik_Text_ausgabe_L(int8_t x1, int8_t y1, char * Text)
        {       
         int8_t bcc,i;
         bcc = DC1 + 0x06 + ESC + 'Z' + 'L' + x1 + y1 + strlen(Text);
         for (i=0; i<=strlen(Text); i++)
         bcc += Text[i];
         i2c_start(slave_adresse_1);
         i2c_write(DC1);
         i2c_write(0x06 + strlen(Text));   // len 0x06+Text
         i2c_write(ESC);
         i2c_write('Z');       // Z
         i2c_write('L');       // L
         i2c_write(x1);
         i2c_write(y1);
         for (i=0; i<=strlen(Text); i++)
         i2c_write(Text[i]);
         i2c_write(bcc);
         i2c_stop();
         _delay_us(10);
         i2c_start(slave_adresse_2);
         e = i2c_readAck();
         i2c_stop();
         _delay_us(10);     
        }
    

    Das entspricht in etwa auch der Vorgabe des Herstellers. Bin Neugierig wo der Fehler liegt.
    achim
     
  11. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.044
    Zustimmungen:
    100
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Ich meinte eher, hast du es mal probiert?

    bcc = DC1 + 0x07 + ESC + END + 'C' + 'F' + 'C' + f1 + f2 + f3 + f4;



    CodeBox C und C++
         i2c_start(slave_adresse_1);
         i2c_write(DC1);
         i2c_write(0x07);   // 08 7 9
         i2c_write(ESC);     // ESC
         
         i2c_write('C');       // C
         i2c_write('F');       // F
         i2c_write('C');       // C
         
         i2c_write(f1);  // Drawstyle    
         i2c_write(f2);  // R
         i2c_write(f3);  // G    
         i2c_write(f4);  // B     
         i2c_write(END);
         i2c_write(bcc);
         i2c_stop();


    Opacity wird hier nicht übertragen, eventuell ist das aber notwendig?!

    Wenn ein Drawstyle definiert ist, muss dieser vielleicht vor Textausgaben noch aktiviert werden?
     
  12. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Hallo Dirk
    auch diese Version habe ich getestet. Musste nur die Prüfsumme (0x07) anpassen. Habe auch Zahlen fest im Programm drin gehabt und noch ein paar andere Sachen. Habe auch verschiedene Befehle ausprobiert, so mit Terminal, Rechtecke, Linien und andere Figuren, Vorder- und Hintergrund. Egal, es geht nicht. Mal anfragen ob es schon eine neue Software dazu gibt. Klingt irgend wie nach Software Fehler für das Display. Werde dich auf dem laufenden halte
    achim
     
  13. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Hallo Dirk
    nach Auskunft des Herstellers müssen ASCII Zeichen übertragen werden. Dann sollte es gehen.
    achim
     
  14. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.044
    Zustimmungen:
    100
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Hallo Achim,

    es ging ja um die Farbwerte RGB. Ich müsste mir Zeit nehmen und in das Datenblatt schauen, wie man die Farbwerte überträgt.

    Vielleicht hat jemand anderes eine Idee. Ich vermute es geht um ein EA TFT Display.


    EDIT:
    Vielleicht hilft dies weiter ...

    Als Dezimalzahl betrachten, also drei Ascii Zeichen:
    (Beispiel)


    CodeBox C und C++
    uint8_t d1, d2, d3;
    uint8_t d;
    
    d = 125;
    // oder
    d = 0x56;
    
    d1 = ((d / 100) % 10) + 0x30; // hunderter dezimal als Ascii
    d2 = ((d / 10) % 10) + 0x30;  // zehner dezimal als Ascii
    d3 = (d % 10) + 0x30; // einer dezimal als Ascii
    





    Hexadezimalzahl als zwei Ascii Zeichen betrachten:
    (Beispiel)


    CodeBox C und C++
    const uint8_t HEX[] = {"0123456789ABCDEF"};
    
    uint8_t i;
    uint8_t d1, d2;
    
    val = 0x4B;
    
    // High
    d1 = HEX[((val>>4) & 0x0F)];
    
    // Low
    d2 = HEX[(val & 0x0F)];



    Alternativ auch mal die Funktion itoa anschauen.

    Allerdings: In beiden Fällen muss man mehr Bytes übertragen, als eigentlich tatsächlich notwendig wären ... ob dies also so gewollt wird?!
     
    #14 Dirk, 10. Oktober 2017
    Zuletzt bearbeitet: 10. Oktober 2017
  15. achim S.

    achim S. Mitglied

    Registriert seit:
    16. Januar 2010
    Beiträge:
    245
    Zustimmungen:
    2
    Map
    Hallo Dirk
    du hast recht, es geht um ein EA TFT Display. Mache kein Geheimniss draus. Das Display mit 3,2 Zoll mit dem Smallprotokoll von EA habe ich soweit im Griff. Von dem neuen Display mit 5 Zoll habe ich eins zu liegen und versuche seit einiger Zeit mit dem I2C Bus anzusteuern. Da bei beiden Geräten das Protiokoll gleich sei soll, sollte es keine Schwierigkeiten geben, sollte ....
    Das Problem steckt in Detail. Man hat einige Einstellungen und Befehle geändert ohne das irgendwelche Infos oder gar kurze Beispiel dazu gibt. Hatte bis vor ein paar Tagen die Version 0.9 drauf. Ist die erste Version überhaupt und habe eines der ersten Displays überhaupt bekommen, zum testen. Habe schon verschiedene Sachen im Griff, bis auf die Farbe. Werde morgen noch mal mit dem Entwicklungsing. telefonieren und die Sache besprechen. Er hatte schon einiges gesagt dazu. Ein Beispiel vom 3,2 Zoll Display, muss dabei ca. 20 Parameter übertragen, mit der Längen Berechnung, Prüfsummen berechnen und Vergleichen und Ausgabe. Ansonsten sind das richtig geile Teile mit einer super Auflösung und einer Reaktionszeit von 8 Mikrosekunden. Da kommt China wohl nicht mit. Kanst ja mal bei EA nach dem uniTFT schauen. Im Datenblatt steht auf der entsprechenden Seite so gut wie nichts drin. Kannst nur die Befehle anschauen und da steht bei der Farbe z.B. #CFC1,$00FF00. Damit soll das Display in seiner vollen Grösse auf eine Farbe gesetzt werden. Dann kommen noch einige andere dazu, wie Rahmen Breite, Art, Dicke Anfang und Ende, Position. Dabei sprechen wir noch nicht bei der Farbe von einer log änderung, Farbverlauf negativ usw. Dann gibt es noch die verschiedenen Fonts, wieder mit unterschiedlicher Farbe oder Verlauf. Nicht zu vergessen die Formen und die Anker dazu und alles mit Touch und gespeicherten Bildern zum Abruf. Das alles noch mit ca. 10 Eingängen, Lautsprecher, AD Wandler mit 10 Bit und 2xI2C, SPI, USB, RS434 und Kamera .... und einiges mehr. Höre lieber auf
    Werde deine Sachen gleich mal testen. Wie meinst du das mit itoa? Die verwende ich bei der Ausgabe zum 2 Display bereits
    achim
     
  16. Dirk

    Dirk Administrator Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.044
    Zustimmungen:
    100
    Ort:
    Mittelhessen, Giessen
    Sprachen:
    C#, Assembler, Pascal, C++, PHP, Java
    Map
    Hallo Achim,
    ... ist eine Alternative zu meinem obigen Beispielcode für konvertieren dezimal nach Ascii und hexadzcimal nach Ascii.
     

Diese Seite empfehlen

  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)