da bin ich jetzt gespantn (ich habs noch nicht hingekriegt, evtl was falsch verstanden)
Werbung
da bin ich jetzt gespantn (ich habs noch nicht hingekriegt, evtl was falsch verstanden)
Ich habe doch geschrieben, wo ich denke, dass das Problem liegt. Dass Du die Berechnung auf 8 Bit erzwingst.
mach bitte so:
Code:void Color16bit2colorRGB(uint16_t color16, uint16_t &R, uint16_t &G, uint16_t &B) { R = (color16 / 2048)*8; ; G = (color16 & 2016)/8;; B = (color16 & 31)*8; Serial.println(""); Serial.println("Unterprogramm color16 zu RGB:"); Serial.println( (String)"color16="+(String)color16); Serial.println( (String)"R="+(String)R); Serial.println( (String)"G="+(String)G); Serial.println( (String)"B="+(String)B); }![]()
Ich hoffe, dass es jetzt besser ist!
hatte ich das nicht gemacht?
R = (uint8_t)(color16 / 2048 )*8; ;
G = (uint8_t)(color16 & 2016)/8;;
B = (uint8_t)(color16 & 31)*8;
ach so, du meinst ich soll das nicht machen?
Das wäre nicht korrekt, denn es sind ja uint8_t Zahlen, die zurückgegeben werden sollen.
Probier doch mal bitte selber!
Ich hatte das hier schon geschrieben (Beirag #20): https://www.roboternetz.de/community...l=1#post646541
Ich denke, er führt die Berechnung mit 8 Bit aus.Du brauchst aber 16 Bit während der Berechnung, weil zumindest Dein Farbwert color16 ja 16 Bit umfasst.Code:so: (uint8_t)(color16 / 2048 )*8;
Du müsstest hinterher eine Umwandlung vornehmenAber das funktioniert nicht!Code:(uint8_t)R = (color16 / 2048 )*8;
Deshalb habe ich jetzt das probiert, da gibt es kein Gemecker:Code:void Color16bit2colorRGB(uint16_t color16, uint16_t &R, uint16_t &G, uint16_t &B) { R = (color16 / 2048)*8; ; G = (color16 & 2016)/8;; B = (color16 & 31)*8; R = (uint8_t)R; G = (uint8_t)G; B = (uint8_t)B; Serial.println(""); Serial.println("Unterprogramm color16 zu RGB:"); Serial.println( (String)"color16="+(String)color16); Serial.println( (String)"R="+(String)R); Serial.println( (String)"G="+(String)G); Serial.println( (String)"B="+(String)B); }
Geändert von Moppi (10.09.2018 um 18:22 Uhr)
bittebittebitte mal selber testen!
- - - Aktualisiert - - -
...ach so, jetzt habe ich deinen Einwand verstanden!
Klammer ums ganze, dann erst casten!
- - - Aktualisiert - - -
nein, stimmt auch nicht dann.
Schau noch mal im letzten Beitrag vor Deinem. Habe es geändert.
Allerdings glaube ich auch, dass dasüberflüssig ist. Weil der kleinste Typ, den der Arduino kennt, ist: integerCode:R = (uint8_t)R;
Er würde den von Dir geglaubten 8-Bit-Wert vermutlich als Integer ablegen/speichern. So, wie er nach der Berechnung schon vorliegt.
das habe ich verstanden und auch so gemacht.
aber nein, der kleinste Wert ist uint16_t , nicht int, denn int ist bei mir int32_t (ARM Cortex M0 = Arduino M0/Zero), deshalb ist es immer explizit auf uint16_t oder uint8_t gecastet.
Tipps sind wirklich sehr willkomen, aber bitte immer vorher selber testen!
Lesezeichen