Доброго времени суток!
Вопрос мучает уже третий день, не могу понять что не так.
У меня есть atmega16, сервомашинка HX12K, использую восьмибитный таймер(0), внешний кварц на 12Мгц.
В CVAVR выбрал свой контроллер, выставил частоту вн. кварца, выбрал таймер 0, делитель - 1(12 000 кГц), по переполнению.
Итого выходит 1/12*256 = 21.33333333333333 мкс (частота 1 прерывания таймера)
Чтобы управлять серво нужно ждать 20 мс и затем от 0.8 до 2.3 можно давать импульс
0.0213333333333333 мс = 21.33333333333333 мкс
20 мс / 0.0213333333333333 мс = 937.5000000000015 (это число прерываний таймера отсчитывающее 20 мс)
К примеру я хочу подождать 1.55 мс и поставить серво по центру.
1.55 мс / = 0.0213333333333333 мс = 72.65625000000011
Итак получается программа:
...
volatile unsigned int cnt=0;
volatile unsigned char state=0;
ISR(TIMER0_OVF_vect)
{
if ((state == 0) && (cnt > 937))//ждем 20мс
{
cnt=0;
state=1;
PORTB=0xFF;
}
if ((state == 1) && (cnt > 72))//импульс 1.55 мс
{
cnt=0;
state=0;
PORTB=0;
}
cnt++;
}
...
PORTB=0;//изначально 0
DDRB=0xFF;//на выход
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;
TIMSK=0x01;
sei();
while(!0)
{
}
...
В итоге, если серво машинка отключена до запуска МК, то после ее подключение к работающему МК она дергается в одну из сторон и замолкает. Если же МК запускается уже с подключенной серво то никакой реакции у сервы нет.
Подскажите, что я не так считаю?