Помогите с асинхронным таймером на AtMega8a

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 91
Зарегистрирован: Сб фев 17, 2018 00:08:56

Сообщение Jack-Sidr »

Залил код от metan, за 14,5 часов ушло аж на 4 минуты, видимо все же придется делать свою "убогую" коррекцию.
Реклама
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

Jack-Sidr писал(а):код от metan, за 14,5 часов ушло аж на 4 минуты
Ничего не понимаю. Тут что-то явно не так. Кусочки кода, которые а вам дал, выдраны из полностью рабочего проекта.
Эти куски полностью созвучны с аппноутом производителя AVR134
Вот хорошая статья на это тему:
http://microsin.net/programming/AVR/avr ... timer.html
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

А чего тут понимать, ширпотреб китайский на 33кГц. Только вот не понятно где он может использоваться?
Такой же стоит в их платах DS1307.

У меня за 175 часов убежали на 4 секунды, на этом 33кГц.
Встал на лапы
Аватара пользователя
Сообщения: 91
Зарегистрирован: Сб фев 17, 2018 00:08:56

Сообщение Jack-Sidr »

Странность в том, что два разных рабочих кода, которые по идеи эквивалентные, дают разный уход по времени
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Нет не странно.
Любая операция записи в счетный регистр блокирует работу таймера на время одного периода тактового сигнала таймера,
а именно на время примерно 0,0038 секунды если считать за отправную точку кварц 33кГц.
0,0038 * 3600 = 13,7 секунды за час
В моем случае, я два раза в секунду обращаюсь к регистру, 13,7 * 2 = 27,4 секунды за час.

Либо так, либо искать нормальный кварц на 32768Гц.
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Решил, для себя, разобраться с работой в асинхронном режиме и POWER SAVE. Для начала, загрузил в m8 выложенный выше код Test_8_2, в котором в секундном прерывании вывел стробик на с лапы PB5 (просто удобный доступ на плате). Период, по мне, мало похож на секунду, да ещё при токе потребления >5мА (встроенный RC 8МГц). Оставил в покое эту программу.
В программе ниже на PB5 формируется минутный интервал. Ток потребления < 10мкА. Стоящая в седьмом разряде числа 59'999'99x,x просто радует глаз.
TEST_M8.zip
(1.17 КБ) 132 скачивания
FUSE-биты встроенный RC 8МГц CKSEL=0100, SUT10=10, CKOPT=0. Проверил с N=64, получил тоже самое, только ток возрос до 15мкА.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

akl в Test_8 было по совпадению TIM2_COMP.
Какая разница, вводим переменную и корректируем как хотим, к примеру так
Спойлер

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

interrupt [TIM2_COMP] void timer2_ovf_isr(void)
{
// Place your code here
   if(millis_t== 0) {
    OCR2A=127; }
   if(++millis_t ==3600) // допустим раз в 3600 секунд коррекция
   {
     millis_t=0;
     OCR2A = 127+-сколько надо; // один тик таймера примерно равен 0,0078 секунды, +учитываем эти же 0,0078сек на перенастройку таймера
   }
    sec++;
    if (sec == 60)
      {
          sec = 0;
          min ++;
      };

    if (min == 60)
      {
          min = 0;
          hour ++;
      };
    if (hour > 23)
      {
         hour = 0;
      };
} 
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вы делаете ошибку, полагая частоту часового кварца равной 32'768Гц. У меня, к примеру, генерирует на частоте 32'776Гц. Получается, что программа, отсчитав 256*128=32'768 говорит - секунда прошла и, 32776-32768=8 тактов как не бывало, а это ~244мкс. За час коррекцией OCR2 не отделаетесь. Поэтому, кто-то ставит подстроечный конденсатор и крутит его до посинения, кому-то и так сойдёт, кто-то, типа меня, занимается программной коррекцией. :)
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

akl не знаю на сколь у меня кварц.
Спойлер

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

// Timer/Counter 2 initialization
// Clock source: Crystal on TOSC1 pin
// Clock value: PCK2/256
// Mode: CTC top=OCR2A
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=(0<<EXCLK) | (1<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (1<<CS22) | (1<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2A=127;	
OCR2B=0x00;


interrupt [TIM2_COMPA] void timer2_compa_isr(void)
{
// Place your code here
   if (++t.second==60)
   {
      t.second=0;
      if (++t.minute==60)
      {
         t.minute=0;
         if (++t.hour==24)
         {
            t.hour=0;
            if (++t.date==31)
            {
               t.date=1;
            }
         }
      }
  } 
}

  
6 часов прошло, как бы секунда в секунду. 6 часов мало, надо больше.
И да, ток потребления 6-7мкА.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

akl после многих экспериментов мои часики приняли вид
Спойлер

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

// Timer/Counter 2 initialization
// Clock source: Crystal on TOSC1 pin
// Clock value: PCK2/256
// Mode: CTC top=OCR2A
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=(0<<EXCLK) | (1<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (1<<CS22) | (1<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2A=127;   
OCR2B=0x00;


interrupt [TIM2_COMPA] void timer2_compa_isr(void)
{

   if(millis_t== 0)
    OCR2A=127;
   if(++millis_t ==680)  
   {
     millis_t=0;
     OCR2A = 129;
   }

   if (++t.second==60)
   {
      t.second=0;
      if (++t.minute==60)
      {
         t.minute=0;
         if (++t.hour==24)
         {
            t.hour=0;
            if (++t.date==31)
            {
               t.date=1;
            }
         }
      }
  }
}
Корректировка была один раз в 680 секунд.
За 60 часов наблюдается отставание в 1 секунду, +-там милли секунды не контролирую.
Опять ексель, опять расчеты, и получаю что корректировать надо уже через 853 секунды.
Меняю в прошивке 680 на 853, опять сброс счетчика и ждемс.....

Это как решать уравнение о трех неизвестных, без спец приборов это очень долго и мучительно.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3323978#p3323978"]без спец приборов это очень долго и мучительно.[/uquote]
может пригодится:
у меня давно "ходят" радиокотовские часики на меге16 тоже с асинхронным таймером
http://radiokot.ru/circuit/digital/home/103/
коррекцию производил всего два раза - уже несколько лет не трогаю
Коррекция хода производится один раз в сутки, в 00-00. Если часы спешат к примеру на 5 сек в сутки, то в 00-00-00 время установится в 23-59-55, если же часы отстают на 5 сек, то в 00-00-00 время установится в 00-00-05. Шаг коррекции – 0,1 сек. Максимальная коррекция – 59,9 сек/сутки.
исходник присутствует
Ответить

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