Страница 1 из 1

Проблема с delay_ms и не только в Atmega8

Добавлено: Вс июл 20, 2014 20:25:21
koinex
Добрый день уважаемые дамы и господа. Постараюсь изложить суть вопроса наиболее подробно. Есть у меня микроконтроллер - atmega8, и столкнулся я с такой проблемой. Решил я написать простую прогу для свечения светодиода - секунду горит секунду не горит. Для этого использую библиотеку <util/delay.h> и функцию _delay_ms. Микроконтроллер я настроил на тактирования от внутреннего резонатора 8Мгц. Вот фуз биты:
Снимок1.PNG
(12.65 КБ) 133 скачивания
Вот код:

Код: Выделить всё

#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мс
    }
}
На вид все хорошо, но если глянуть осцилографом, то временная задержка получается не 1 секунда, даже приблизительно, а в районе 820 миллисекунд:
Снимок2.png
(12.14 КБ) 123 скачивания
Подумал, что дело в библиотеке, тогда настроил нулевой таймер на прерывание и чтобы каждую секунду мигал светодиод и получил тоже самое. Вот код настройки таймера и функция прерывания:

Код: Выделить всё

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++;
}
Подумал что дело в контроллере, взял другой и нацепил внешний кварц на 16Мгц, перенастроил фуз биты, и сделал новые рассчеты для таймера и чтоб вы думали? Все тоже самое.
Если кто то сталкивался с такой проблемой или знает как ее решить помогите пожалуйста.

Re: Проблема с delay_ms и не только в Atmega8

Добавлено: Вс июл 20, 2014 21:53:54
Pink-Pank
может, проблема в осциллографе?

Re: Проблема с delay_ms и не только в Atmega8

Добавлено: Вс июл 20, 2014 23:29:46
koinex
Pink-Pank писал(а):может, проблема в осциллографе?
Я конечно допускаю любые варианты, но к сожалению нет эталонного сигнала чтобы проверить

Re: Проблема с delay_ms и не только в Atmega8

Добавлено: Пн июл 21, 2014 00:30:19
koinex
Все же как оказалось дело в осцилограффе, проверил эталонным сигналом и как оказалось он врет

Re: Проблема с delay_ms и не только в Atmega8

Добавлено: Пн июл 21, 2014 08:18:44
Deals
Но еще напомню, что от внутреннего генератора точности ждать не стоит нигде. Только потому что там 3% или 1% может отклоняться. Написано в даташите. На 2313 тиньке делал часы для проверки внутреннего генератора - иногда в пол секунды разница была (продолжительно работал).

Re: Проблема с delay_ms и не только в Atmega8

Добавлено: Пн июл 21, 2014 10:24:10
oleg110592
в даташите написано:
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.
Но, думаю для задачи мигания светодиодом это не принципиально.