Wenn man unvorsichtig die Formeln verändert, kann dies zu Überläufen und damit zu komischen Berechnungsergebnissen führen. Probier Mal folgende Formel:
wobei SWITCH_FACTOR wieder die Zahl um die 63 ist. Du wirst vermutlich eher größere Werte brauchen, probier Mal 63..67 oder so aus, die Formel verkraftet das ohne Überläufe.Code:return ((uint8_t) ((1024UL * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
Wenn du am Ende doch auf einen SWITCH_FACTOR von 63 oder weniger kommst, reicht dir auch eine leicht modifizierte Form, die weniger Rechenintensiv ist, weil sie mit einem uint16 statt uint32 arbeitet (man beachte die 1024U statt 1024UL):
Zusammengefasst und mit etwas Präprozessor-Magie musst du dir darum noch nicht Mal Gedanken machen:Code:return ((uint8_t) ((1024U * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
(Alles aus der Tiny ASURO Library)Code:#if SWITCH_FACTOR * 1024 + 512 > UINT16_MAX return ((uint8_t) ((1024UL * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR; #else return ((uint8_t) ((1024U * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR; #endif
mfG
Markus
PS: Was bei mir "value" ist, ist bei dir "i"







Zitieren

Lesezeichen