Konvertiere float to uint8_t

OP #3324478
Hallo,

ich stehe gerade vor einem Anfängerproblem, welches ich nicht so ganz 
verstehe. Es geht um folgenden Code:
1
#define MSG_LEN 7
2
union MSG
3
{
4
  uint8_t data[MSG_LEN];
5
  struct
6
  {
7
    uint8_t b0;
8
    uint8_t b1;
9
    uint8_t b2;
10
    uint8_t b3;
11
    uint8_t b4;
12
    uint8_t pwmOut;
13
    uint8_t pwmVal;
14
  } bytes;
15
};

1
int16_t  aktDrehz = 50;
2
float liter, ber, pwm;
3
int ipwm;
4
uint8_t diffLiter = 50;
5

6

7
ber = ((100 - diffLiter) * aktDrehz / 100);
8
liter = pow(0.000000016886 * ber, 5) - pow(0.00000585112 * ber, 4) + pow(0.000648028 * ber, 3) - pow(0.0218385796 * ber, 2) + (0.534156384 * ber) - 0.4682274;
9
pwm   = pow(0.000888526 * liter, 3) -  pow(0.108956237 * liter, 2) + (5.900433784 * ber) + 77.628376829;
10
ipwm = (int)(round(pwm));
11

12
msg->bytes.pwmVal = (uint8_t)ipwm;

Warum bekomm ich hier folgende Fehlermeldung?
1
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(log.o): In function `log':
2
(.text.avr-libc.fplib+0x46): relocation truncated to fit: R_AVR_13_PCREL against symbol `__addsf3' defined in .text section in c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_addsub_sf.o)
3
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(log.o): In function `log':
4
(.text.avr-libc.fplib+0x4e): relocation truncated to fit: R_AVR_13_PCREL against symbol `__addsf3' defined in .text section in c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_addsub_sf.o)
5
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(modf.o): In function `modff':
6
(.text.avr-libc.fplib+0x3e): relocation truncated to fit: R_AVR_13_PCREL against symbol `__subsf3' defined in .text section in c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_addsub_sf.o)
7
make: *** [komfort_main.elf] Error 1
8
Build failed with 1 errors and 0 warnings...


Setze ich dann für "ipwm" eine natürliche Zahl ein, wird fehlerfrei 
compeliert.

Vielen Dank für Eure Hilfe!
Gast
> Setze ich dann für "ipwm" eine natürliche Zahl ein, wird fehlerfrei
> compeliert.

ja, weil alles wegoptimiert wird.


schein mir ein Platz problem zu sein, du mustet die kleinen AVR ziemlich 
viel zu. Hast du mit lib m (-lm ) eingetragen?
Gast
pal ... schrieb:
> Aber was hab ich jetzt damit bewirkt?

jetzt sind die float berechnung etwas mehr für den AVR optimiert.

Aber du solltest auch mal Prüfen ob deine Berechnungen am ende ein 
sinnvolles ergebniss liefert. float ist nicht so genau wie man eventuell 
denkt. Außerdem is das schon harte arbeit für so eine AVR. und er wird 
dadurch auch recht stark ausgelastet sein. (wenn das nicht stört, ist es 
kein Problem)
OP
Die Berechnung wir nicht oft ausgeführt. Das ist überschaubar....

Was die float-Ausgabe angeht.. ich benötige später nur ganze Zahlen. Das 
Ergebnis schau ich mir noch mal durch eine UART-Ausgabe an.

Aber vielen Dank für die Hinweise.

SUPER!
OP
Das würde bedeuten, dass ich eine Tabelle anlege und die bei 
Initialisierung einlesen. Oder?

Aber mein Problem ist nur, dass die Variable "diffLiter" hier eine 
Unbekannte ist.
1
ber = ((100 - diffLiter) * aktDrehz / 100);
Gast
pal ... schrieb:
> Das würde bedeuten, dass ich eine Tabelle anlege und die bei
> Initialisierung einlesen. Oder?

nein sie kann auch direkt aus dem flash verwendet werden.

> Aber mein Problem ist nur, dass die Variable "diffLiter" hier eine
> Unbekannte ist.

wert = tabelle[ diffLiter ];

das macht aber nur sinn wenn diffLiter eine überschaubare wertemenge hat 
(z.b. 0-255 )

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.