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

Обсуждаем контроллеры компании Atmel.
Ответить
koinex
Родился
Сообщения: 6
Зарегистрирован: Пн июн 10, 2013 00:46:34

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

Сообщение 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Мгц, перенастроил фуз биты, и сделал новые рассчеты для таймера и чтоб вы думали? Все тоже самое.
Если кто то сталкивался с такой проблемой или знает как ее решить помогите пожалуйста.
Реклама
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

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

Сообщение Pink-Pank »

может, проблема в осциллографе?
Fucking static initialization order fiasco
Реклама
koinex
Родился
Сообщения: 6
Зарегистрирован: Пн июн 10, 2013 00:46:34

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

Сообщение koinex »

Pink-Pank писал(а):может, проблема в осциллографе?
Я конечно допускаю любые варианты, но к сожалению нет эталонного сигнала чтобы проверить
koinex
Родился
Сообщения: 6
Зарегистрирован: Пн июн 10, 2013 00:46:34

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

Сообщение koinex »

Все же как оказалось дело в осцилограффе, проверил эталонным сигналом и как оказалось он врет
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Deals
Встал на лапы
Сообщения: 125
Зарегистрирован: Ср май 05, 2010 19:03:14
Откуда: Украина

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

Сообщение Deals »

Но еще напомню, что от внутреннего генератора точности ждать не стоит нигде. Только потому что там 3% или 1% может отклоняться. Написано в даташите. На 2313 тиньке делал часы для проверки внутреннего генератора - иногда в пол секунды разница была (продолжительно работал).
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение 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.
Но, думаю для задачи мигания светодиодом это не принципиально.
Реклама
Ответить

Вернуться в «AVR»