Wenn man unvorsichtig die Formeln verändert, kann dies zu Überläufen und damit zu komischen Berechnungsergebnissen führen. Probier Mal folgende Formel:
Code:
return ((uint8_t) ((1024UL * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
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.
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):
Code:
return ((uint8_t) ((1024U * SWITCH_FACTOR + value / 2) / value)) - (uint8_t) SWITCH_FACTOR;
Zusammengefasst und mit etwas Präprozessor-Magie musst du dir darum noch nicht Mal Gedanken machen:
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
(Alles aus der Tiny ASURO Library)
mfG
Markus
PS: Was bei mir "value" ist, ist bei dir "i"
Lesezeichen