Добрый день уважаемые дамы и господа. Постараюсь изложить суть вопроса наиболее подробно. Есть у меня микроконтроллер - atmega8, и столкнулся я с такой проблемой. Решил я написать простую прогу для свечения светодиода - секунду горит секунду не горит. Для этого использую библиотеку <util/delay.h> и функцию _delay_ms. Микроконтроллер я настроил на тактирования от внутреннего резонатора 8Мгц. Вот фуз биты:
Подумал, что дело в библиотеке, тогда настроил нулевой таймер на прерывание и чтобы каждую секунду мигал светодиод и получил тоже самое. Вот код настройки таймера и функция прерывания:
Подумал что дело в контроллере, взял другой и нацепил внешний кварц на 16Мгц, перенастроил фуз биты, и сделал новые рассчеты для таймера и чтоб вы думали? Все тоже самое.
Если кто то сталкивался с такой проблемой или знает как ее решить помогите пожалуйста.
Но еще напомню, что от внутреннего генератора точности ждать не стоит нигде. Только потому что там 3% или 1% может отклоняться. Написано в даташите. На 2313 тиньке делал часы для проверки внутреннего генератора - иногда в пол секунды разница была (продолжительно работал).
During reset, hardware loads the 1MHz calibration byte into the OSCCAL Register and thereby automatically calibrates the RC Oscillator. At 5V, 25°C and 1.0MHz Oscillator frequency selected, this calibration gives a frequency within ±3% of the nominal frequency.
т.е. регистром OSCCAL можно регулировать частоту внутреннего генератора в пределах ±3%.
Зависимости частоты внутреннего генератора от температуры и от напряжения питания предоставлены в документации в виде графиков.
Методы калибровки внутреннего генератора ( ±1%) описаны в соответствующих Application Note, например - AVR053: Calibration of the internal RC oscillator.
Но, думаю для задачи мигания светодиодом это не принципиально.