В некоторых АВРках есть режимы в которых верхнее значение можно задавать. А так, как уже и сказали аксакалы, только вручную в начале процедуры обработки прерывания по совпадению в счетный регистр таймера ноль записывать. И таймер начнет барабанить с нуля, а процедура будет себе выполняться. И им будет глубоко друг на друга все равно .
// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) //Прерывание происходит 100 раз в сек, сохраняем в глобальные переменные текущее время { TCNT1H=0x00; TCNT1L=0x00; milliseconds++; }
часы отстают в сутки на полторы минуты. Кварц 16 МГц, тинька2313, прерывания 100 раз в сек. Даже если на каждом прерывании терять по 10 тактов - то не должно быть такой погрешности. Кварц дохлый или грабли в другом месте? Собственно вопросы были по этой причине
указанный способ не подходит. Во первых часы отстают а это значит что придется изменять параметры таймера, а во вторых этих NOP будет слишком много, да и кварц не термостатирован, что означает что корректирующую величину придется менять в зависимости от условий эксплуатации. В данному случае проще ввести корректировку времени 4 раза в сутки добавляя или вычитая настраиваемую константу.
Хелп, нимагу понять, есть у меня Mega8, я двумя кнопками подключенными к прерываниям включаю и выключаю ШИМ на ножке В2, включается он очень даже на ура, а вот после выключения ШИМа на порте остается то высокий, то низкий уровень.
так ты шим скорей всего останавливаешь в случайном состянии. отсюда то 1 то 0 на выходе. выходы Порта сконфигурированы как шим и программированию типа порт=1 или 0 не поддаются.
Блин все равно не получается, уже уменьшаю ШИМ до нуля, останавливаю таймер, но никакого результата, при ШИМе 100% после выключения на ножке все равно высокий уровень.
OCR1B=0x00; //уменьшаем ШИМ до нуля delay_ms(1); //БЕЗ ЭТОЙ ПАУЗЫ НИФИГА НЕ РАБОТАЕТ ШИМ ОСТАНАВЛИВАЕТСЯ В ВЫСОКОМ ПОЛОЖЕНИИ TCCR1B=0x08; //останавливаем ШИМ
ну, блин, OCR (Output Compare Register) там какой-нибудь OCR1A, OCR1B и протча. Если там ноль, то и на ножке будет ноль, а если там максимальное значение, то на выходе будет 1.