делается управление контрастом LCD.
таймер1 дрыгается с предделителем /32
по прерыванию в переполнении начинает считать от "TIMER1_START_VALUE"
т.е. содержимое таймера не может быть ниже "TIMER1_START_VALUE".
нужно на этом таймере сделать ШИМ.
в сравнении грузим в OCR1B "добавленное" к текущему TCNT1 значение то длину паузы, то длину импульса (пауза или импульс выбирается в зависимости от состояния ноги OC1B - PINB,2)
"добавленное" именно к текущему TCNT1 (а не OCR1B) сделал потому что предделитель маленький, может в каком то другом прерывании прошлёпать эти 32 такта.
Джиттер в пару тактов ТАЙМЕРА1 допускается.
TIMER1_START_VALUE+1 при "перебеге" сделано потому что (как я понял) при загрузке в TCNT1 значения TIMER1_START_VALUE прерывания сравнения не происходит. а на появляющийся при этом джиттер всё равно кладём.
ПРОБЛЕМА: после 100 (? ... зависит от vo_lcd_pwm) циклов "переполнения" OCR1B ШИМ перестаёт работать. Пока не отловил, где дырка.
мож, кто по коду сразу дурь увидит?
TIM1_COMPB:
;(push/pop регистров и SREG тут опустил)
mov temp3,vo_lcd_pwm
sbic PINB,2 ; skip if PINB,2 clr
com temp3
in temp0,TCNT1L
in temp1,TCNT1H
add temp0,temp3
adc temp1,zerro
brcc NO_OCR1B_OVERFLOW ; Branch if carry cleared
ldi temp3, low(TIMER1_START_VALUE+1)
ldi temp2,high(TIMER1_START_VALUE+1)
add temp0,temp3
adc temp1,temp2
NO_OCR1B_OVERFLOW:
out OCR1BH,temp1
out OCR1BL,temp0
reti