Помогите с асинхронным таймером на AtMega8a
- Сообщения: 91
- Зарегистрирован: Сб фев 17, 2018 00:08:56
Залил код от metan, за 14,5 часов ушло аж на 4 минуты, видимо все же придется делать свою "убогую" коррекцию.
- Реклама
- Сообщения: 593
- Зарегистрирован: Ср янв 06, 2010 10:01:46
Ничего не понимаю. Тут что-то явно не так. Кусочки кода, которые а вам дал, выдраны из полностью рабочего проекта.Jack-Sidr писал(а):код от metan, за 14,5 часов ушло аж на 4 минуты
Эти куски полностью созвучны с аппноутом производителя AVR134
Вот хорошая статья на это тему:
http://microsin.net/programming/AVR/avr ... timer.html
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
А чего тут понимать, ширпотреб китайский на 33кГц. Только вот не понятно где он может использоваться?
Такой же стоит в их платах DS1307.
У меня за 175 часов убежали на 4 секунды, на этом 33кГц.
Такой же стоит в их платах DS1307.
У меня за 175 часов убежали на 4 секунды, на этом 33кГц.
- Сообщения: 91
- Зарегистрирован: Сб фев 17, 2018 00:08:56
Странность в том, что два разных рабочих кода, которые по идеи эквивалентные, дают разный уход по времени
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
Нет не странно.
Любая операция записи в счетный регистр блокирует работу таймера на время одного периода тактового сигнала таймера,
а именно на время примерно 0,0038 секунды если считать за отправную точку кварц 33кГц.
0,0038 * 3600 = 13,7 секунды за час
В моем случае, я два раза в секунду обращаюсь к регистру, 13,7 * 2 = 27,4 секунды за час.
Либо так, либо искать нормальный кварц на 32768Гц.
Любая операция записи в счетный регистр блокирует работу таймера на время одного периода тактового сигнала таймера,
а именно на время примерно 0,0038 секунды если считать за отправную точку кварц 33кГц.
0,0038 * 3600 = 13,7 секунды за час
В моем случае, я два раза в секунду обращаюсь к регистру, 13,7 * 2 = 27,4 секунды за час.
Либо так, либо искать нормальный кварц на 32768Гц.
- Реклама
Решил, для себя, разобраться с работой в асинхронном режиме и POWER SAVE. Для начала, загрузил в m8 выложенный выше код Test_8_2, в котором в секундном прерывании вывел стробик на с лапы PB5 (просто удобный доступ на плате). Период, по мне, мало похож на секунду, да ещё при токе потребления >5мА (встроенный RC 8МГц). Оставил в покое эту программу.
В программе ниже на PB5 формируется минутный интервал. Ток потребления < 10мкА. Стоящая в седьмом разряде числа 59'999'99x,x просто радует глаз. FUSE-биты встроенный RC 8МГц CKSEL=0100, SUT10=10, CKOPT=0. Проверил с N=64, получил тоже самое, только ток возрос до 15мкА.
В программе ниже на PB5 формируется минутный интервал. Ток потребления < 10мкА. Стоящая в седьмом разряде числа 59'999'99x,x просто радует глаз. FUSE-биты встроенный RC 8МГц CKSEL=0100, SUT10=10, CKOPT=0. Проверил с N=64, получил тоже самое, только ток возрос до 15мкА.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
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;
};
} Вы делаете ошибку, полагая частоту часового кварца равной 32'768Гц. У меня, к примеру, генерирует на частоте 32'776Гц. Получается, что программа, отсчитав 256*128=32'768 говорит - секунда прошла и, 32776-32768=8 тактов как не бывало, а это ~244мкс. За час коррекцией OCR2 не отделаетесь. Поэтому, кто-то ставит подстроечный конденсатор и крутит его до посинения, кому-то и так сойдёт, кто-то, типа меня, занимается программной коррекцией. 
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
akl не знаю на сколь у меня кварц.6 часов прошло, как бы секунда в секунду. 6 часов мало, надо больше.
И да, ток потребления 6-7мкА.
Спойлер
Код: Выделить всё
// 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-7мкА.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
akl после многих экспериментов мои часики приняли видКорректировка была один раз в 680 секунд.
За 60 часов наблюдается отставание в 1 секунду, +-там милли секунды не контролирую.
Опять ексель, опять расчеты, и получаю что корректировать надо уже через 853 секунды.
Меняю в прошивке 680 на 853, опять сброс счетчика и ждемс.....
Это как решать уравнение о трех неизвестных, без спец приборов это очень долго и мучительно.
Спойлер
Код: Выделить всё
// 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;
}
}
}
}
}За 60 часов наблюдается отставание в 1 секунду, +-там милли секунды не контролирую.
Опять ексель, опять расчеты, и получаю что корректировать надо уже через 853 секунды.
Меняю в прошивке 680 на 853, опять сброс счетчика и ждемс.....
Это как решать уравнение о трех неизвестных, без спец приборов это очень долго и мучительно.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
[uquote="Dimon456",url="/forum/viewtopic.php?p=3323978#p3323978"]без спец приборов это очень долго и мучительно.[/uquote]
может пригодится:
у меня давно "ходят" радиокотовские часики на меге16 тоже с асинхронным таймером
http://radiokot.ru/circuit/digital/home/103/
коррекцию производил всего два раза - уже несколько лет не трогаю
может пригодится:
у меня давно "ходят" радиокотовские часики на меге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 сек/сутки.


