Например TDA7294

Форум РадиоКот • Просмотр темы - Точность хода часов на Atmega8
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср сен 17, 2025 21:34:52

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 24 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Точность хода часов на Atmega8
СообщениеДобавлено: Пт фев 24, 2012 20:21:51 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср сен 02, 2009 21:39:06
Сообщений: 52
Откуда: Николаев
Рейтинг сообщения: 0
Доброго времени суток,товарищи! У меня к вам вопросик возник. Вторую неделю мучаюсь с часами, то спешат, то отстают. Так вот. Во-первых. Используется внутренний генератор на 8МГц. Недавно прочитал, что он нестабильно ведёт себя при изменении питания/температуры. Даст ли положительный результат использование внешнего кварца? Во-вторых. Какую лучше сделать программную корректировку? Кварц тоже не идеален( С использованием задержки или через определённый интервал времени добавлять секунды? Если отстают. И как "красивее" это сделать? Вот исходник:

#include <mega8.h>
#include <delay.h> // подключаем библиотеку задержки

unsigned char sek; // переменная сек.
unsigned char min; // пересенная мин.
unsigned char hour; // переменная часов
unsigned char Dig[10];
char Disp6, Disp7;

// 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

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0xFF;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// 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.. Мне нужны просто часы, без всяких наворотов)

_________________
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Пт фев 24, 2012 20:30:45 
Друг Кота

Карма: 27
Рейтинг сообщений: 206
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Сообщений: 6015
Откуда: Москва
Рейтинг сообщения: 0
Нельзя делать часы, используя (для отсчета времени) внутренний тактовый RC-генератор, и его калибровка не поможет получить достаточную (для часов) точность, тем более, что для калибровки (если я все правильно понял), все равно должен быть какой-то кварц, например на входе асинхронного таймера. Так что кварцевый генератор (в разных вариациях), или RTC.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Сб фев 25, 2012 14:14:51 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср сен 02, 2009 21:39:06
Сообщений: 52
Откуда: Николаев
Рейтинг сообщения: 0
А теперь объясните, пожалуйста, как сделать, чтоб таймер работал от кварца 32...кГц, а сама Атмега от внутреннего ген. на 8МГц? (фузы, программу не учитывая) И, просто интересно, можно ли и то, и то делать от внешнего кварца?

_________________
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Сб фев 25, 2012 16:20:06 
Мудрый кот
Аватар пользователя

Карма: 25
Рейтинг сообщений: 79
Зарегистрирован: Вт окт 05, 2010 01:08:57
Сообщений: 1800
Рейтинг сообщения: 0
погуглите - работа асинхронного таймера atmega

_________________
KIT


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Сб фев 25, 2012 16:50:22 
Друг Кота

Карма: 64
Рейтинг сообщений: 1015
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4348
Откуда: Ижевск
Рейтинг сообщения: 0
within писал(а):
...просто интересно, можно ли и то, и то делать от внешнего кварца?
Именно так и нужно делать часы на микроконтроллере. :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Сб фев 25, 2012 16:59:53 
Открыл глаза
Аватар пользователя

Зарегистрирован: Ср сен 02, 2009 21:39:06
Сообщений: 52
Откуда: Николаев
Рейтинг сообщения: 0
к каким ногам подключать часовой кварц, а каким на 8МГц? Я понимаю, что вы прекрасно разбираетесь, но я потому сюда и пишу, чтоб объяснили более простым языком. Спасибо за исчерпывающий ответ) Вам только преподами работать)

_________________
Очень жаль, когда люди упираются лбом в что-то, хотя это и не логично совсем. А свою логику не объясняют.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Сб фев 25, 2012 17:29:39 
Друг Кота

Карма: 64
Рейтинг сообщений: 1015
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4348
Откуда: Ижевск
Рейтинг сообщения: 0
Преподом? Свят, свят, свят! Как вариант посмотрите здесь Правда, там, все на ассемблере. Без всяких дополнительных "часовых" кварцев. В конце ветки пришли Цешники, понаставили Далласов и, ветке пришёл "пушной северный зверек". :oops:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Сб фев 25, 2012 21:14:55 
Друг Кота

Карма: 27
Рейтинг сообщений: 206
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Сообщений: 6015
Откуда: Москва
Рейтинг сообщения: 0
Можно поставить микросхему RTC (DS...), у нее будет свой кварц.

Можно основной тактовый генератор (КВАРЦЕВЫЙ, конечно) использовать и для отсчета времени. Иногда туда же и ставят кварц на 32,... кГц, заодно получают низкое потребление, полезное для резервного питания, лишь бы производительности хватило. Но вообще возможно использование кварцев разной частоты, лишь бы делением их частоты (посредством встроенного таймера) получались секунды. Это самый простой и дешевый способ, можно с этого начать.

Более изящный, но более сложный способ - подключение часового кварца (32,... кГц) к асинхронному таймеру (к нему можно). Тогда он будет делать секундный отсчет (например, через прерывание по переполнению). Дополнительное преимущество в том, что в современных AVR, при переходе в спящий режим, асинхронный таймер может работать, и будить МК раз в секунду для отсчета времени (при резервном питании от ионистора или резервной батарейки, во время пропадания сетевого питания). Основной тактовый генератор можно при этом оставить внутренний RC, и даже лучше - МК быстрее будет пробуждаться из спящего режима, а на точность он влиять не будет. Посмотрите конструкции тут, на форуме, например тему "Простые часы на светодиодных матрицах" - там как-то так сделано (автор O-LED).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вт мар 06, 2012 03:20:26 
Опытный кот

Карма: 12
Рейтинг сообщений: 26
Зарегистрирован: Вс апр 10, 2011 02:24:06
Сообщений: 772
Откуда: г.Северодонецк
Рейтинг сообщения: 0
На ассмблере сам пересчетчик времени выглядет как-то так.
Код:
;---------- прерывания 5 мс ----------
         dec rtc      ;предварительный делитель
         brne ex_int
         ldi r16,200   ;восстанавливем коэф деления
         mov rtc,r16
               ;здесь уже секундный интервал
         lds r16,r_sec   ;секунды
         inc r16      ;наращиваем
         cpi r16,60      ;проверяем
         brcs int00      ;меньше 60 - переход
               ;здесь минутный интервал
         lds r16,r_min   ;минуты
         inc r16      ;наращиваем
         cpi r16,60      ;проверяем
         brcs int11      ;меньше 60 - переход
               ;часовой интервал
         lds r16,r_hou   ;часы
         inc r16      ;наращиваем
         cpi r16,24      ;проверяем
         brcs int22      ;меньше 24 - переход
         clr r16
int22:      sts r_hou,r16      ;обнуление часов
         clr r16
int11:      sts r_min,r16      ;обнуление минут         
         clr r16
int00:      sts r_sec,r16      ;обнуление секунд
ex_int:   ...

корекцию можно сделать, изменяя число, перезагружаемое в таймер при прерывании от переполнения. Причем делать это надо не каждое прерывание.

_________________
C0FFEE=‭12648430‬


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вт мар 13, 2012 16:23:46 
Мучитель микросхем
Аватар пользователя

Карма: -14
Рейтинг сообщений: 9
Зарегистрирован: Вс июн 29, 2008 13:53:03
Сообщений: 429
Рейтинг сообщения: 0
Зачем восстанавливать коэффициент деления,перезагрузка тратит много времени, используйте регистр OCR.
Например так: TCCR1B=0x0A;OCR1A=(8000000/(8*100));где 8000000 - частота кварца, 8- коэффициент деления, 100-мили сек.
Часовой кварц используется очень просто, если мега8 то настраиваем внешнее тактирования TOSC1 и вешаем на него кварц и все получаем очень точные прерывания :beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вт мар 13, 2012 23:01:10 
Вымогатель припоя
Аватар пользователя

Карма: 4
Рейтинг сообщений: 33
Зарегистрирован: Пт июн 04, 2010 17:40:13
Сообщений: 544
Откуда: Непокорный город-герой Севастополь
Рейтинг сообщения: 0
А никто не рассматривал как вариант сделать сверхточный генератор секундных импульсов и считывать его прерыванием контроллера?

_________________
Даже у стен есть уши...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вт мар 13, 2012 23:44:03 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
Вот уж чем "сверхточный генератор" и прерывания - лучше точно "даллас" воткнуть. Я туго помню, но разве к меге8 нельзя прикрутить часовой кварц прямо к таймеру? Вроде бы в даташите даже было. Или это в тини2313? :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вс мар 18, 2012 01:49:31 
Опытный кот

Карма: 12
Рейтинг сообщений: 26
Зарегистрирован: Вс апр 10, 2011 02:24:06
Сообщений: 772
Откуда: г.Северодонецк
Рейтинг сообщения: 0
Илья79 писал(а):
Зачем восстанавливать коэффициент деления,перезагрузка тратит много времени, используйте регистр OCR.
(skip)...и все получаем очень точные прерывания ...

Не получаем. Кварцы неточные и все разные. Аналоговая регулировка (подстроечным конденсатором) - неудобно и некрасиво, имея в руках вычислительную мощь микроконтроллеров. А цифровая коррекция - требует механизма изменения коэффициента пересчета как можно точнее (без фанатизма). Один из методов - дробный коэффициент деления. Его я и имел в виду. Достигается изменением числа, загружаемого в таймер во время прерывания в конце каждой секунды - это точная часть. В остальные прерывания грузится другое число - являющееся грубой частью коэффициента деления. Использовать при этом аппаратную схему совпадения или нет - дело вкуса.

_________________
C0FFEE=‭12648430‬


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Чт мар 22, 2012 17:01:25 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Точность хода зависит еще и от кварца, и от его температуры. 1 секунду на 10000 можно получить просто поставив дешевый кварц, но ведь этого малова-то, будут уходить и плавать.
Более точные кварцы обеспечат точность 1..10 сек на милион при тщательном подборе конденсатора.

А так же, надо обратить внимание что кварцы меняют свою частоту скачком после удара... уронил часы - и на перекалибровку.

Есть специальные источники опорной частоты, "ГЕОЦИНТ" например, но это бандура с термостатом потребляющая 1.4Вт в установившемся режиме, зато отдает частоту с точностью до 10^-9 - уход 1 секунда на милиард... но стоят такие источники как 20 штук обычных часов.

есть еще вариант - использовать GPS модуль, он всегда выдает точное время и очень часто у него имеется выход секундных импульсов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Пт мар 23, 2012 08:15:59 
Друг Кота

Карма: 64
Рейтинг сообщений: 1015
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4348
Откуда: Ижевск
Рейтинг сообщения: 0
Вы имели ввиду Гиацинт


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Пт мар 23, 2012 08:42:53 
Модератор
Аватар пользователя

Карма: 68
Рейтинг сообщений: 424
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Сообщений: 13490
Откуда: Тамбовская обл.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Обычный кварц в обычном (не асинхронном) режиме с программной коррекцией даёт удивительные результаты. Особенно, если использоваться девайс будет дома (колебания температуры минимальны)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Сб мар 24, 2012 10:49:21 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
В принципе рассчет прост: для того чтобы обеспечить точность хода +-1 секунда в год необходимо обеспечить стабильность частоты на 8 порядков(1 секунда разницы на 31536000 секунд в году), используя кварц с 5-ти значной точностью программная коррекция должна обеспечить подстройку на 3 порядка. если программно обеспечить всего 2 порядка - получим точность +-1 секунду в месяц.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вс мар 25, 2012 11:39:28 
Друг Кота

Карма: 27
Рейтинг сообщений: 206
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Сообщений: 6015
Откуда: Москва
Рейтинг сообщения: 0
Еще нужно иметь в виду уход частоты из-за старения, который для дешевых кварцевых резонаторов производители обещают не хуже 1*10-6 (1ppm) - до 100 секунд ухода за год.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вт мар 27, 2012 01:43:07 
Опытный кот

Карма: 12
Рейтинг сообщений: 26
Зарегистрирован: Вс апр 10, 2011 02:24:06
Сообщений: 772
Откуда: г.Северодонецк
Рейтинг сообщения: 0
Дешевые и доступно продаваемые кварцы давно отучили доверять тому, что на них написано. Легко разница на 8000КГц может достигать 2-3КГц и больше. И обычно в плюс. Часы (с правильно посчитанными и правильно работающими делителями) секунд на 40 за сутки убегают. Без двухбайтового цифрового корректора не обойтись, потому как помимо диапазона еще и точность установки нужна.
А никто не пробовал DCF77 приемник точного времени сделать? Это много чего бы решило...
http://ru.wikipedia.org/wiki/DCF77

_________________
C0FFEE=‭12648430‬


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Точность хода часов на Atmega8
СообщениеДобавлено: Вт мар 27, 2012 06:50:03 
Модератор
Аватар пользователя

Карма: 68
Рейтинг сообщений: 424
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Сообщений: 13490
Откуда: Тамбовская обл.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Цитата:
Легко разница на 8000КГц может достигать 2-3КГц и больше. И обычно в плюс.

Есть такое дело. Точный расчет на частоту кварца, как правило, заканчивается непонятками кто виноват - или лыжи не едут, или весна пришла. Так что только коррекция, а кварц пусть не обеспечивает абсолютную точность частоты, зато будет стабильно держать какую есть.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y