Проблема с delay_ms и не только в Atmega8
Добавлено: Вс июл 20, 2014 20:25:21
Добрый день уважаемые дамы и господа. Постараюсь изложить суть вопроса наиболее подробно. Есть у меня микроконтроллер - atmega8, и столкнулся я с такой проблемой. Решил я написать простую прогу для свечения светодиода - секунду горит секунду не горит. Для этого использую библиотеку <util/delay.h> и функцию _delay_ms. Микроконтроллер я настроил на тактирования от внутреннего резонатора 8Мгц. Вот фуз биты:
Вот код:
На вид все хорошо, но если глянуть осцилографом, то временная задержка получается не 1 секунда, даже приблизительно, а в районе 820 миллисекунд:
Подумал, что дело в библиотеке, тогда настроил нулевой таймер на прерывание и чтобы каждую секунду мигал светодиод и получил тоже самое. Вот код настройки таймера и функция прерывания:
Подумал что дело в контроллере, взял другой и нацепил внешний кварц на 16Мгц, перенастроил фуз биты, и сделал новые рассчеты для таймера и чтоб вы думали? Все тоже самое.
Если кто то сталкивался с такой проблемой или знает как ее решить помогите пожалуйста.
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD |= (1<<0);
while(1)
{
PORTD |= (1<<0); // включаем
_delay_ms(1000); // ждём 1000мс
PORTD &= ~(1<<0); // выключаем
_delay_ms(1000); // ждём 1000мс
}
}Код: Выделить всё
TCCR0 = (0<<CS02)|(1<<CS01)|(1<<CS00); // делитель 64
TIMSK |= (1<<TOIE0); // разрешить прерывание по переполнению таймера счетчика
sei();
ISR( TIMER0_OVF_vect )
{
if (count == 488)
{
if( PIND & ( 1 << PD0 ) ) {
PORTD &= ~( 1 << PD0 );
}
else {
PORTD |= ( 1 << PD0 );
}
count=0;
return;
}
count++;
}Если кто то сталкивался с такой проблемой или знает как ее решить помогите пожалуйста.