C Umrechnung von Zahlen

achim S.

Mitglied
16. Jan. 2010
704
13
18
Berlin Biesdorf
Sprachen
  1. ANSI C
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
 
Hallo Achim,

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

Vielleicht hilft dir folgendes C-Schnipsel weiter.

Dirk :ciao:



CodeBox 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);
 
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
 
Habe es übertragen:


CodeBox 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
 
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
 
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
 
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
int8_t bcc;
bcc = DC1 + 0x07 + ESC + END + 'C' + 'F' + 'C' + f1 + mf; // + 0x62 + 0x00;
// ...
i2c_write(bcc);
 
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
//   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
 
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?
 
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
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
 
Die Frage kann ich so nicht beantworten.

Ich meinte eher, hast du es mal probiert?

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



CodeBox 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?
 
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
 
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
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
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?!
 
Zuletzt bearbeitet:
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
 
Hallo Achim,
Wie meinst du das mit itoa? Die verwende ich bei der Ausgabe zum 2 Display bereits

... ist eine Alternative zu meinem obigen Beispielcode für konvertieren dezimal nach Ascii und hexadzcimal nach Ascii.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)