Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.74/255: Рейтинг темы: голосов - 255, средняя оценка - 4.74
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
#1

RTC на mega8 с часовым кварцем

08.07.2013, 01:26. Просмотров 45981. Ответов 66
Метки нет (Все метки)

прошелся по форуму поиском, прямого ответа не нашел

до этого искал гуглом - выяснил две вещи:
- часовой кварц капризен, желательны конденсаторы внешние, пайка максимально близко к выводам МК, заземление корпуса
- таймер в асинхронном режиме нужно инициализировать в порядке описанном в отдельной главе даташита

все это сделал, правда тестирую пока на макетке - корпус заземлил, но подсоединение не напрямую к выводам, а через макетку
не запускается! ((
пробовал два разных типа круглых резонаторов
схема работает если вместо кварца подать такую же частоту от внешнего генератора (на STK600)
схема так же работает если пальцами взяться за выводы кварца

в противном случае не работает
где копать?
ждать, что заработает на плате?

п.с. если не брать во внимание специальные режимы работы таймера в асинхронном режиме, то в чем преимущество использования часового кварца, если можно взять кварц 16мгц и поделить ровно на 16 000 000 и получить такие же секундные интервалы ? (1024 прескейлер + деление на 15625 на Timer1)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2013, 01:26
Ответы с готовыми решениями:

Arduino с неродным кварцем
Добрый день, уважаемые форумчане. Возник вопрос: как и что можно настроить,...

atmega8 с кварцем на 16МГц - проблема с isp
Помогите, пожалуйста, разобраться, в чем проблема. Делаю девайс по схеме из...

Fuse bit для тактирования 32768 кварцем
Знатоки, подскажите, как выставить CKSEL на tiny 2313, чтоб задать тактирование...

запарол две тиньки85 - как восстановить с внешним кварцем
салют! такое дело. пытаюсь воспроизвести usb-конструкцию на тине85,...

недопрошилась mega8
добрый день. спаял устройство по готовой схеме (чуть-чуть поменял - IR датчик...

66
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
08.07.2013, 01:42 #2
Цитата Сообщение от oxytt
где копать?
ждать, что заработает на плате?
... ...
в чем преимущество использования часового кварца, если можно взять кварц 16мгц и поделить ровно на 16 000 000 и получить такие же секундные интервалы ?
Преимущества использования часового кварца - это смотря как Вы его используете:
-- если как основной (а не асинхронный) кварц, то с часовым AVR практически ничего не ест, батарейки-таблетки на год может хватить, как в наручных часах;
-- а если как дополнительный (при том, что основное тактирование - Мегагерцы) - то это специальные энергосберегающие режимы, когда всё выключается, а часовой кварц (ведь он в этом случае асинхронный) вовремя разбудит программу.

Кстати, если Вы с первым использованием мучаетесь, то фьюзы не забыли настроить на Low-speed crystal?
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 02:10 #3
Цитата Сообщение от OtyxPM
Цитата Сообщение от oxytt
Кстати, если Вы с первым использованием мучаетесь, то фьюзы не забыли настроить на Low-speed crystal?
у меня второй вариант - сделал контроллер в котором есть часы, вот их то и тактирую в асинхронном режиме
преимущества асинхронного режима для экономии энергии мне понятны, не понятно есть ли смысл строить часы с часовым кварцем, если 1Гц можно получить и из мегагерцового резонатора

насчет не запускающегося кварца можете что-то подсказать?
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
08.07.2013, 02:26 #4
Цитата Сообщение от oxytt
не понятно есть ли смысл строить часы с часовым кварцем, если 1Гц можно получить и из мегагерцового резонатора
Думаю смысл только в сберегающем режиме..... По точности вряд ли разница будет.....

Цитата Сообщение от oxytt
насчет не запускающегося кварца можете что-то подсказать?
Да не заморачивайся, поставь DS1307, всего на маленький корпус больше, зато плюсов не счесть..... и безперебойное питание часов будет, и схема дубая, вообще красота.....
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 02:32 #5
Цитата Сообщение от ShodS
Да не заморачивайся, поставь DS1307, всего на маленький корпус больше, зато плюсов не счесть..... и безперебойное питание часов будет, и схема дубая, вообще красота.....
думал поставить тем более есть они, но не охота время тратить сейчас еще и на запуск 1307 - не работал с ними еще
к тому же места очень ограничено - тут как никак еще один корпус + батарейка
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
08.07.2013, 02:43 #6
Цитата Сообщение от oxytt
у меня второй вариант - сделал контроллер в котором есть часы, вот их то и тактирую в асинхронном режиме
... ...
насчет не запускающегося кварца можете что-то подсказать?
Я такое делал на ATmego32A, основное тактирование внутренний RC, часовой кварц без конденсаторов на соответствующие ного AVR (они в Меге32 отдельные от ног основного кварца, в отличие от Меги8), инициализация Timer2 и все процедуры/тайминги/флаги состояния - да, по отдельной главе даташита.
Там не просто, а главное - не быстро (многие вещи с Timer2 требуют долгого ожидания с проверками, в то время как у Timer0 и Timer1 просто сразу делаешь что надо).
CKOPT fuse посмотрите: не надо ли его включить.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
08.07.2013, 03:01 #7
Цитата Сообщение от oxytt
думал поставить тем более есть они, но не охота время тратить сейчас еще и на запуск 1307 - не работал с ними еще
А чего там запускать то, если что - вот моя лепнина для DS1307.....
Код
//#######################################################################################################################
//#
//#***ФУНКЦИИ*РАБОТЫ*С*ЧАСАМИ*DS1307
//#
//#######################################################################################################################

//включаемые*файлы
#define*F_CPU*8000000
#include*<util/delay.h>
#include*<avr/io.h>

//настройки*библиотеки
#define*IICDDR******DDRD****************/*порт*управления*I2C*/
#define*IICPORT*****PORTD****************/*порт*вывода*данных*на*линию*I2C*/
#define*IICPIN******PIND****************/*порт*ввода*данных*с*линий*I2C*/
#define*IICData*****(1<<5)****************/*линия*DATA*/
#define*IICClc******(1<<4)****************/*линия*CLC*/

//глобальные*переменные
volatile*char*ClockData*[7]*=*{};********//массив*часов*[0]секунды,*[1]минуты,*[2]часы,*[3]день,*[4]дата,*[5]месяц,*[6]год
#define*second*****ClockData[0]
#define*minute*****ClockData[1]
#define*hour*****ClockData[2]
#define*day*****ClockData[3]
#define*date*****ClockData[4]
#define*month*****ClockData[5]
#define*year*****ClockData[6]

//объявления*функций
void*IICClockReadData*(void);*************//ф-ции*работы*с*МС*часов*DS1307
void*IICClockWriteData*(void);
void*IICStart*(void);*******************//софтовая*реализация*I2C
void*IICStop*(void);
char*IICByteWrite*(char);
char*IICByteRead*(char);
char*IICByt*(char);

//ФУНКЦИЯ*ЧТЕНИЯ*БЛОКА*ДАННЫХ*ИЗ*МИКРОСХЕМЫ*ЧАСОВ*DS1307
//чтение*происходит*в*глобальный*массив*ClockData[7]
//последовательность*данных*-*[0]секунды,*[1]минуты,*[2]часы,*[3]день,*[4]дата,*[5]месяц,*[6]год
void*IICClockReadData*(void)
{
IICStart();
IICByteWrite*(0xD0);********************//запись*данных*в*DS1307
IICByteWrite*(0x00);********************//сбросить*указатель*адреса*DS1307*на*0

IICStart();
IICByteWrite*(0xD1);********************//команда*на*чтение*данных

char**pClockData*=*ClockData;********//указатель*на*массив*часов
for*(char*i*=*0;*i<6;*i++)
*pClockData++*=*IICByteRead*(0);****//пишем,*секунды,*минуты,*часы,*день,*дата,*месяц*(с*выдачей*подтверждением)
*pClockData*=*IICByteRead*(1);********//пишем*год*(без*подтверждения)
IICStop();
}

//ФУНКЦИЯ*ЗАПИСИ*БЛОКА*ДАННЫХ*В*МИКРОСХЕМУ*ЧАСОВ*DS1307
//запись*происходит*из*глобального*массива*ClockData[7]
//последовательность*данных*-*[0]секунды,*[1]минуты,*[2]часы,*[3]день,*[4]дата,*[5]месяц,*[6]год
void*IICClockWriteData*(void)
{
IICStart();
IICByteWrite*(0xD0);********************//запись*данных*в*DS1307
IICByteWrite*(0x00);********************//сбросить*указатель*адреса*DS1307*на*0

for*(unsykned*char*i*=*0;*i<7;*i++)
IICByteWrite*(ClockData*[i]);********//пишем,*секунды,*минуты,*часы,*день,*дата,*месяц,*год

IICStop();
}

//#######################################################################################################################
//#
//#*ФУНКЦИИ*ОБСЛУЖИВАНИЯ*ИНТЕРФЕЙСА*I2C*(софтовый*вариант)
//#
//#######################################################################################################################

//ФУНКЦИЯ*ФОРМИРОВАНИЯ*СОСТОЯНИЯ*START*ПО*ИНТЕРФЕЙСУ*IIC
void*IICStart*(void)
{
IICDDR*&=*~(IICData*|*IICClc);
_delay_us(2);

IICDDR*|=*IICData;********************//подтяжка*data*к*нулю
_delay_us(2);

IICDDR*|=*IICClc;********************//подтяжка*clc*к*нулю
_delay_us(2);
}

//ФУНКЦИЯ*ФОРМИРОВАНИЯ*СОСТОЯНИЯ*STOP*ПО*ИНТЕРФЕЙСУ*IIC
void*IICStop*(void)
{
IICDDR*|=*(IICData*|*IICClc);
_delay_us(2);

IICDDR*&=*~IICClc;********************//отпустить*data
_delay_us(2);

IICDDR*&=*~IICData;********************//отпустить*clc
_delay_us(2);
}

//ФУНКЦИЯ*ЗАПИСИ*БАЙТА*ПО*ИНТЕРФЕЙСУ*IIC
//АРГУМЕНТ*-*байт*данных*для*вывода*по*IIC
//ЗНАЧЕНИЕ*-*флаг*подтверждения*0*(есть*подтверждение)*или*1*(нет*подтверждения)
char*IICByteWrite*(char*byte)
{
for*(char*i*=*0;*i<8;*i++)
byte*=*IICByt*(byte);

byte*=*0x80;
return*IICByt*(byte);****************//возвращаем*бит*подтверждения*(0-есть*бит*подтверждения,*1-нет)
}

//ФУНКЦИЯ*ЧТЕНИЯ*БАЙТА*ПО*ИНТЕРФЕЙСУ*IIC
//АРГУМЕНТ*-*значение*бита*подтверждения*(0*-*есть*подтверждение,*1*-*нет*подтверждения)
//ЗНАЧЕНИЕ*-*принятый*байт
char*IICByteRead*(char*bit)
{
char*byte*=*0xFF;
for*(char*i*=*0;*i<8;*i++)
byte*=*IICByt*(byte);

bit*<<=*7;
IICByt*(bit);************************//передать*значение*бита*подтверждения
return*byte;****************************//возвращаем*принятый*байт
}

//ФУНКЦИЯ*ЗАПИСИ\ЧТЕНИЯ*БИТА*ПО*ИНТЕРФЕЙСУ*IIC
//выводится*значение*старшего*бита*аргумента
//принятый*бит*возвращается*в*младшем*бите*предварительно*сдвинутого*влево*аргумента
char*IICByt*(char*byte)
{
if*(byte*&*0x80)************************//выводимый*бит
IICDDR*&=*~IICData;****************//вывод*1*на*линию*данных
else
IICDDR*|=*IICData;****************//вывод*0*на*линию*данных
_delay_us(2);

IICDDR*&=*~IICClc;********************//старт*строб*импульса
while*(!*(IICPIN*&*IICClc)){}********//ожидание*формирования*строба
_delay_us(2);

char*temp;
if*(IICPIN*&*IICData)****************//принимаем*бит
temp*=*1;
else
temp*=*0;
IICDDR*|=*IICClc;********************//завершить*строб

byte*<<=*1;
byte*|=*temp;
return*byte;
}

//#######################################################################################################################
//#
//#*end
//#
//#######################################################################################################################
Тут примерчик использования http://asis-kbr.ru/forum/viewtopys.php?f=11&t=159

Цитата Сообщение от oxytt
к тому же места очень ограничено - тут как никак еще один корпус + батарейка
А в твоем варианте что батарейка отсутствует???
Что после каждого брыка напруги будеш заново устанавливать часы? Думаю - полюбому, раз часы - значит бесперебойное питание..... Только в случае питания контроллера, наверное надо каки-нибудь серьезные аккумулятры, а в случае с DS1307 можно батарейку совсем масипуханькую.....
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 03:34 #8
Цитата Сообщение от ShodS
А в твоем варианте что батарейка отсутствует???
Что после каждого брыка напруги будеш заново устанавливать часы? Думаю - полюбому, раз часы - значит бесперебойное питание..... Только в случае питания контроллера, наверное надо каки-нибудь серьезные аккумулятры, а в случае с DS1307 можно батарейку совсем масипуханькую.....
спасибо за примеры! еще пригодятся

современные технологии)))
батарейку можно встроить, но не обязательно
в устройстве встроен модуль с nrf24l01+ - отдельно будет стоять контроллер с подключением к интернет и рассылкой сообщений синхронизации времени, так что не только устанавливать часы не нужно (я даже не делаю никаких кнопок для этого), но и подводить
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
08.07.2013, 03:50 #9
Цитата Сообщение от oxytt
отдельно будет стоять контроллер с подключением к интернет и рассылкой сообщений синхронизации времени, так что не только устанавливать часы не нужно (я даже не делаю никаких кнопок для этого), но и подводить
Ух ты... это интересно...
Я тожа хочу двигатся в сторону веб сервера на контроллере. Надо будет подробнее это разжевать.....

А с другой стороны, если "диверсия".... (тырнет пропал, и света.. то приходит то уходит)..... вот тут бы и пригодились часики не прошибаемые..... а подстройка периодически, например раз в сутки.. или в неделю.....
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 03:57 #10
Цитата Сообщение от ShodS
А с другой стороны, если "диверсия".... (тырнет пропал, и света.. то приходит то уходит)..... вот тут бы и пригодились часики не прошибаемые..... а подстройка периодически, например раз в сутки.. или в неделю.....
да я согласен - небольшая автономность не помешает))
конкретно на этом устройстве пока могу пренебречь
к тому же подно примеров ухода в power down с асинхронными таймерами - много не сьест

но вот пока у меня концепт не держится из-за не работоспособности часового кварца.
0
ShodS
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 2,011
08.07.2013, 04:08 #11
Вот тоже человек помучился.... посмотри, мож у вас одинаковые грабли.....
http://www.getchip.net/posts/052-kak-za ... -32768-gc/

Прикол....
Искал в яндексе про "mega8 часовой кварц" и в первой же странице нашел текущую тему..... хотя вроде тока появилась.... во шустро поисковики работать стали!!!!!
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 04:10 #12
Цитата Сообщение от ShodS
Вот тоже человек помучился.... посмотри, мож у вас одинаковые грабли.....
http://www.getchip.net/posts/052-kak-za ... -32768-gc/
спасибо! это уже прочитал

главное посмотрел в местных нигазинах - везде такие же круглые китайские резонаторы
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
08.07.2013, 08:41 #13
Убрать внешние кондеры, если ставил. И фьюз CKOPT включить.
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
08.07.2013, 10:43 #14
У меня часы так сделаны. Точность - гумно! Надо подбирать внешние кварцы. Так что лучше делать на 1307 и им подобных аналогах.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 11:31 #15
Цитата Сообщение от DOOMSDOY
Убрать внешние кондеры, если ставил. И фьюз CKOPT включить.
да пробовал и так и так
пытаюсь сделать на мена8L - в даташите есть оговорка, что CKOPT подключает конденсаторы корректно только в мега8А
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 11:32 #16
Цитата Сообщение от PRS
У меня часы так сделаны. Точность - гумно! Надо подбирать внешние кварцы. Так что лучше делать на 1307 и им подобных аналогах.
а в чем разница? к 1307 цепляют точно такие же квацы
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
08.07.2013, 12:07 #17
Цитата Сообщение от oxytt
а в чем разница? к 1307 цепляют точно такие же квацы
В генераторе, встроенном в DS1307, нет никакой лишней херни, которая есть в генераторе часового кварца контроллера. Типа всяких цепей коммутации режимов, внутренних подключаемых емкостей, с присущим всему этому паразитными параметрами - утечками, емкостями, шумами, помехами от цифровой части контроллера.

А часовой кварц - штука весьма микромощная, оптимизированная для слаботочных схем с минимальным потреблением, и всего этого не любит.

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

Ведь даже хреновые китайские часы часто идут гораздо точнее, чем часы в контроллере даже с хорошими часовыми кварцами от материнских плат.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
08.07.2013, 15:23 #18
А можно взглянуть на код, ибо даже включение асинхронного режима таймера требует определённых манипуляций
0
omtomtubo
0 / 0 / 0
Регистрация: 23.03.2012
Сообщений: 1,017
08.07.2013, 18:11 #19
http://we.iosyitistromyss.ru/omtomtubo/ ... a-avr.html
Вот я делал на Мега16, код тоже есть, точность приемлемая для моих целей.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
08.07.2013, 20:30 #20
Цитата Сообщение от YTYOUT
А можно взглянуть на код, ибо даже включение асинхронного режима таймера требует определённых манипуляций
код
Код
   // timer2 pressotir 1/128
// timer2 overflow 1Hz (32768 ossiilator)
// asymhronous timer mode for timer 2 - RTC
TIMSK = 0;
ASSR = (1 << AS2);
_delay_ms(1200);

TCNT2 = 0;
OCR2  = 0;
TCCR2 = (1 << CS22) | (1 < CS20);

while(ASSR & ((1 << TCR2UB) | (1 << OCR2UB) | (1 << TCN2UB)));

// interrupts for timer2 overflow
TIFR |= (1 << OCF2) | (1 << TOV2);

TIMSK = (1 << TOIE2);
я уж по максимуму заложился - отключение прерываний (хотя после ресета они и так отключены), задержка на стабилизацию (по даталишиту1-2 сек), ожидание установки трех управляющих регистров

подаю частоту внешнюю (STK600) - работает, ставлю кварц - не работает
0
08.07.2013, 20:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2013, 20:30

Реанимация mega8
Привет форум. После долгого перерыва (5лет) решил вспомнить работу с мк....

BLDC на mega8
помогите с написанием программы,а то принцип понимаю а как отразить в...

mega8 and RF 433mhz
Здравствуйте, мужики подскажите, купил на днях mega8 и решил научить её...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru