Заголовок сообщения: Точность хода часов на Atmega8
Добавлено: Пт фев 24, 2012 20:21:51
Открыл глаза
Зарегистрирован: Ср сен 02, 2009 21:39:06 Сообщений: 52 Откуда: Николаев
Рейтинг сообщения:0
Доброго времени суток,товарищи! У меня к вам вопросик возник. Вторую неделю мучаюсь с часами, то спешат, то отстают. Так вот. Во-первых. Используется внутренний генератор на 8МГц. Недавно прочитал, что он нестабильно ведёт себя при изменении питания/температуры. Даст ли положительный результат использование внешнего кварца? Во-вторых. Какую лучше сделать программную корректировку? Кварц тоже не идеален( С использованием задержки или через определённый интервал времени добавлять секунды? Если отстают. И как "красивее" это сделать? Вот исходник:
// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц { // Place your code here TCNT1H=0; TCNT1L=0; sek++; // инкрементируем секунду PORTD=128; PORTB=253; // выводим точку
// роботаем с кнопками if (PINC.0==0) // если нажата первая кнопка { hour++; // к значению часы добавляем единицу } if (PINC.1==0) // если нажата вторая кнопка { hour--; // к значению часы вычитаем единицу у } if (PINC.2==0) // если нажата третья кнопка { min++; // к значению минуты добавляем единицу } if (PINC.3==0) // если нажата четвертая кнопка { min--; // к значению минуты вычитаем единицу } if (PINC.4==0) // кнопка RESET { sek=0; }
}
// Declare your global variables here
void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла { unsigned char Num2, Num3; Num2=0; while (Number >= 10) //десятичную { Number -= 10; Num2++; } Num3 = Number; //остаток Disp6 = Dig[Num2]; Disp7 = Dig[Num3]; } void Dig_init() //Массив для отображения цыфр на семисегментном индикаторе { Dig[0] = 95; // Сейчас у нас схема с общим катодом Dig[1] = 24; Dig[2] = 109; Dig[3] = 124; Dig[4] = 58; Dig[5] = 118; Dig[6] = 119; Dig[7] = 28; Dig[8] = 127; Dig[9] = 126; }
void main(void) { // Declare your local variables here
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00;
// LCD module initialization
// Global enable interrupts #asm("sei") Dig_init(); //инициализация массива с двоичным кодом while (1) {///// Условия часов. if(sek==60) // если сек = 60 { min++; // добавляем 1 к переменной "минута" sek=0; // зануляем переменную "секунда" } if(min==60) // если мин = 60 { hour++; // добавляем 1 к переменной "час" min=0; // зануляем переменную "минута" sek=0; } if (hour==24) // так как у нас часы имеют 24 часовый формат { // при достыжении 24 часов, онулируем все переменные. hour=0; min=0; sek=0; } // защита переполнения переменной, она нужна для того чтобы в моментах когда время не переходило в минус. if (hour==255) hour=0; if (min==255) min=0; // выводим переменные (стробирование) Display(hour); //разложили "часы" на 2 цифры и отобразили по очереди PORTB=254; //даем лог 0 для катода 1 разряда PORTD=Disp6; //1 цифра delay_ms(1); PORTB=253; //даем лог 0 для катода 2 разряда PORTD=Disp7; //2 цифра delay_ms(1); Display(min); //разложили "минуты" на 2 цифры и отобразили по очереди PORTB=251; //даем лог 0 для катода 3 разряда PORTD=Disp6; //3 цифра delay_ms(1); PORTB=247; //даем лог 0 для катода 4 разряда PORTD=Disp7; //4... delay_ms(1); }; }
Где взял, извините не помню( А было бы совсем приятно, если бы кто-нибудь поделился хорошо работающей схемой) Только желательно без DS13.. Мне нужны просто часы, без всяких наворотов)
_________________ Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
Нельзя делать часы, используя (для отсчета времени) внутренний тактовый RC-генератор, и его калибровка не поможет получить достаточную (для часов) точность, тем более, что для калибровки (если я все правильно понял), все равно должен быть какой-то кварц, например на входе асинхронного таймера. Так что кварцевый генератор (в разных вариациях), или RTC.
Заголовок сообщения: Re: Точность хода часов на Atmega8
Добавлено: Сб фев 25, 2012 14:14:51
Открыл глаза
Зарегистрирован: Ср сен 02, 2009 21:39:06 Сообщений: 52 Откуда: Николаев
Рейтинг сообщения:0
А теперь объясните, пожалуйста, как сделать, чтоб таймер работал от кварца 32...кГц, а сама Атмега от внутреннего ген. на 8МГц? (фузы, программу не учитывая) И, просто интересно, можно ли и то, и то делать от внешнего кварца?
_________________ Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
Заголовок сообщения: Re: Точность хода часов на Atmega8
Добавлено: Сб фев 25, 2012 16:59:53
Открыл глаза
Зарегистрирован: Ср сен 02, 2009 21:39:06 Сообщений: 52 Откуда: Николаев
Рейтинг сообщения:0
к каким ногам подключать часовой кварц, а каким на 8МГц? Я понимаю, что вы прекрасно разбираетесь, но я потому сюда и пишу, чтоб объяснили более простым языком. Спасибо за исчерпывающий ответ) Вам только преподами работать)
_________________ Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.
Преподом? Свят, свят, свят! Как вариант посмотрите здесь Правда, там, все на ассемблере. Без всяких дополнительных "часовых" кварцев. В конце ветки пришли Цешники, понаставили Далласов и, ветке пришёл "пушной северный зверек".
Можно поставить микросхему RTC (DS...), у нее будет свой кварц.
Можно основной тактовый генератор (КВАРЦЕВЫЙ, конечно) использовать и для отсчета времени. Иногда туда же и ставят кварц на 32,... кГц, заодно получают низкое потребление, полезное для резервного питания, лишь бы производительности хватило. Но вообще возможно использование кварцев разной частоты, лишь бы делением их частоты (посредством встроенного таймера) получались секунды. Это самый простой и дешевый способ, можно с этого начать.
Более изящный, но более сложный способ - подключение часового кварца (32,... кГц) к асинхронному таймеру (к нему можно). Тогда он будет делать секундный отсчет (например, через прерывание по переполнению). Дополнительное преимущество в том, что в современных AVR, при переходе в спящий режим, асинхронный таймер может работать, и будить МК раз в секунду для отсчета времени (при резервном питании от ионистора или резервной батарейки, во время пропадания сетевого питания). Основной тактовый генератор можно при этом оставить внутренний RC, и даже лучше - МК быстрее будет пробуждаться из спящего режима, а на точность он влиять не будет. Посмотрите конструкции тут, на форуме, например тему "Простые часы на светодиодных матрицах" - там как-то так сделано (автор O-LED).
Зачем восстанавливать коэффициент деления,перезагрузка тратит много времени, используйте регистр OCR. Например так: TCCR1B=0x0A;OCR1A=(8000000/(8*100));где 8000000 - частота кварца, 8- коэффициент деления, 100-мили сек. Часовой кварц используется очень просто, если мега8 то настраиваем внешнее тактирования TOSC1 и вешаем на него кварц и все получаем очень точные прерывания
Вот уж чем "сверхточный генератор" и прерывания - лучше точно "даллас" воткнуть. Я туго помню, но разве к меге8 нельзя прикрутить часовой кварц прямо к таймеру? Вроде бы в даташите даже было. Или это в тини2313?
Зачем восстанавливать коэффициент деления,перезагрузка тратит много времени, используйте регистр OCR. (skip)...и все получаем очень точные прерывания ...
Не получаем. Кварцы неточные и все разные. Аналоговая регулировка (подстроечным конденсатором) - неудобно и некрасиво, имея в руках вычислительную мощь микроконтроллеров. А цифровая коррекция - требует механизма изменения коэффициента пересчета как можно точнее (без фанатизма). Один из методов - дробный коэффициент деления. Его я и имел в виду. Достигается изменением числа, загружаемого в таймер во время прерывания в конце каждой секунды - это точная часть. В остальные прерывания грузится другое число - являющееся грубой частью коэффициента деления. Использовать при этом аппаратную схему совпадения или нет - дело вкуса.
Точность хода зависит еще и от кварца, и от его температуры. 1 секунду на 10000 можно получить просто поставив дешевый кварц, но ведь этого малова-то, будут уходить и плавать. Более точные кварцы обеспечат точность 1..10 сек на милион при тщательном подборе конденсатора.
А так же, надо обратить внимание что кварцы меняют свою частоту скачком после удара... уронил часы - и на перекалибровку.
Есть специальные источники опорной частоты, "ГЕОЦИНТ" например, но это бандура с термостатом потребляющая 1.4Вт в установившемся режиме, зато отдает частоту с точностью до 10^-9 - уход 1 секунда на милиард... но стоят такие источники как 20 штук обычных часов.
есть еще вариант - использовать GPS модуль, он всегда выдает точное время и очень часто у него имеется выход секундных импульсов.
Обычный кварц в обычном (не асинхронном) режиме с программной коррекцией даёт удивительные результаты. Особенно, если использоваться девайс будет дома (колебания температуры минимальны)
В принципе рассчет прост: для того чтобы обеспечить точность хода +-1 секунда в год необходимо обеспечить стабильность частоты на 8 порядков(1 секунда разницы на 31536000 секунд в году), используя кварц с 5-ти значной точностью программная коррекция должна обеспечить подстройку на 3 порядка. если программно обеспечить всего 2 порядка - получим точность +-1 секунду в месяц.
Еще нужно иметь в виду уход частоты из-за старения, который для дешевых кварцевых резонаторов производители обещают не хуже 1*10-6 (1ppm) - до 100 секунд ухода за год.
Дешевые и доступно продаваемые кварцы давно отучили доверять тому, что на них написано. Легко разница на 8000КГц может достигать 2-3КГц и больше. И обычно в плюс. Часы (с правильно посчитанными и правильно работающими делителями) секунд на 40 за сутки убегают. Без двухбайтового цифрового корректора не обойтись, потому как помимо диапазона еще и точность установки нужна. А никто не пробовал DCF77 приемник точного времени сделать? Это много чего бы решило... http://ru.wikipedia.org/wiki/DCF77
Легко разница на 8000КГц может достигать 2-3КГц и больше. И обычно в плюс.
Есть такое дело. Точный расчет на частоту кварца, как правило, заканчивается непонятками кто виноват - или лыжи не едут, или весна пришла. Так что только коррекция, а кварц пусть не обеспечивает абсолютную точность частоты, зато будет стабильно держать какую есть.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения