Browse Source

Fix bit loss in cie_lightness() when doing division.

pull/15344/head
Karl Shea 2 years ago
parent
commit
9831fe5eb3
1 changed files with 3 additions and 3 deletions
  1. +3
    -3
      quantum/backlight/backlight_avr.c

+ 3
- 3
quantum/backlight/backlight_avr.c View File

@ -232,19 +232,19 @@ ISR(TIMERx_OVF_vect) {
// See http://jared.geek.nz/2013/feb/linear-led-pwm
static uint16_t cie_lightness(uint16_t v) {
if (v <= ICRx / 12) // If the value is less than or equal to ~8% of max
if (v <= (unsigned long)ICRx / 12) // If the value is less than or equal to ~8% of max
{
return v / 9; // Same as dividing by 900%
} else {
// In the next two lines values are bit-shifted. This is to avoid loosing decimals in integer math.
uint32_t y = (((uint32_t)v + ICRx / 6) << 5) / (ICRx / 6 + ICRx); // If above 8%, add ~16% of max, and normalize with (max + ~16% max)
uint32_t y = (((uint32_t)v + (unsigned long)ICRx / 6) << 5) / ((unsigned long)ICRx / 6 + ICRx); // If above 8%, add ~16% of max, and normalize with (max + ~16% max)
uint32_t out = (y * y * y * ICRx) >> 15; // Cube it and undo the bit-shifting. (which is now three times as much due to the cubing)
if (out > ICRx) // Avoid overflows
{
out = ICRx;
}
return out;
return (uint16_t)out;
}
}


Loading…
Cancel
Save