avr: Round hardware pwm clock ticks to nearest divisor

Instead of rounding down to the nearest supported pwm divisor, round
to the nearest divisor.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2018-01-29 11:54:15 -05:00
parent 077a56c2ca
commit b7b216af7f
1 changed files with 12 additions and 12 deletions

View File

@ -186,21 +186,21 @@ gpio_pwm_setup(uint8_t pin, uint32_t cycle_time, uint8_t val)
uint8_t flags = READP(p->flags), cs; uint8_t flags = READP(p->flags), cs;
if (flags & GP_AFMT) { if (flags & GP_AFMT) {
switch (cycle_time) { switch (cycle_time) {
case 0 ... 8*510L - 1: cs = 1; break; case 0 ... (1+8) * 510L / 2 - 1: cs = 1; break;
case 8*510L ... 32*510L - 1: cs = 2; break; case (1+8) * 510L / 2 ... (8+32) * 510L / 2 - 1: cs = 2; break;
case 32*510L ... 64*510L - 1: cs = 3; break; case (8+32) * 510L / 2 ... (32+64) * 510L / 2 - 1: cs = 3; break;
case 64*510L ... 128*510L - 1: cs = 4; break; case (32+64) * 510L / 2 ... (64+128) * 510L / 2 - 1: cs = 4; break;
case 128*510L ... 256*510L - 1: cs = 5; break; case (64+128) * 510L / 2 ... (128+256) * 510L / 2 - 1: cs = 5; break;
case 256*510L ... 1024*510L - 1: cs = 6; break; case (128+256) * 510L / 2 ... (256+1024) * 510L / 2 - 1: cs = 6; break;
default: cs = 7; break; default: cs = 7; break;
} }
} else { } else {
switch (cycle_time) { switch (cycle_time) {
case 0 ... 8*510L - 1: cs = 1; break; case 0 ... (1+8) * 510L / 2 - 1: cs = 1; break;
case 8*510L ... 64*510L - 1: cs = 2; break; case (1+8) * 510L / 2 ... (8+64) * 510L / 2 - 1: cs = 2; break;
case 64*510L ... 256*510L - 1: cs = 3; break; case (8+64) * 510L / 2 ... (64+256) * 510L / 2 - 1: cs = 3; break;
case 256*510L ... 1024*510L - 1: cs = 4; break; case (64+256) * 510L / 2 ... (256+1024) * 510L / 2 - 1: cs = 4; break;
default: cs = 5; break; default: cs = 5; break;
} }
} }
volatile uint8_t *rega = READP(p->rega), *regb = READP(p->regb); volatile uint8_t *rega = READP(p->rega), *regb = READP(p->regb);