xumuk писал(а):Код: Выделить всё
int light = 0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
if(light==1){
PORTB.3=1;
delay_us(13);
PORTB.3=0;
}
TCNT0+=0x06;
}
Похоже на правду?
(light это флаг, установкой которого я включаю или выключаю генерацию импульсов. Хотел сделать его булевым, но компилятор ругется
, пришлось инт делать)
Полностью согласен с
koolhatcker.
1 Надо присвоить TCNT0 новое значение, а не прибавлять к нему 6.
2 Крайне нежелательно использовать в прерываниях какие-либо временные задержки, если МК еще чем-либо в это время должен заниматься. Я так понимаю, 13 мкс - это длительность импульса при частоте 38 кГц и скважности 2? В этом случае лучше увеличить частоту таймера в два раза. И при каждом входе в прерывание менять состояние выхода на противоположное. А если генерация последовательности не нужна, просто запрещать прерывание по таймеру или обнулять его предделитель.
xumuk писал(а):я думал TCNT0 неприрвыно инкрементируется, даже во время обработки прерывания
А если я присвою 6, то выходит сбросится все что он
насчитал к моменту присвоения?
Все верно, непрерывно инкрементируется. Поэтому нужно менять его содержимое сразу при входе в прерывание и, еще раз, не использовать в прерывании никаких временных задержек. Но, даже в этом случае, порядка четырех тактов при входе в прерывание будут потеряны и частота не будет точно соответствовать установленной. Если точность частоты генерации важна, можно воспользоваться 16-тиразрядным таймером и увеличить значение предделителя.
Удачи
.