Все чаще и чаще наблюдаются жутковатые перлы. По теме:
CODE
#include <avr/io.h>
#include <avr/pgmspace.h>
PROGMEM char brightness[] = "888888888888888888888888888";
volatile unsigned char pwm;
volatile unsigned int pd;
volatile unsigned char pwm_ch[14];
int main(void)
{
if(pwm)
{
unsigned char *pwmch = &pwm_ch;
int d = 0;
for(char i=0; i<14; i++)
{
unsigned int msk = 1;
if(pwm <= pgm_read_byte(&brightness[*pwmch++])) pd |= msk;
msk <<= 1;
}
pd = d;
}
else
{
pd = 0;
}
return 0;
}
В таком (страшненьком) виде (-О2) - уже 317 тактов на меге 8
Копнуть можно, если выровнять таблицу констант на границу 256 байт и упростить обращения к 16-битному pd |= msk;
Несколько апдейтов.
1. if(pwm <= pgm_read_byte(&brightness[*pwmch++])) pd |= msk; - конечно же надо
if(pwm <= pgm_read_byte(&brightness[*pwmch++])) d |= msk;
2. При -О3 дало 192 такта - попробуйте работоспособность, листинг на вид рабочий, больше не разбирался.