Перейти к содержанию
    

Часы реального времени на M8 или M88

Здравствуейте. У меня свой проэкт в котором M8 работает как регистратор внешних событий, а внешний комп записывает приходящие на СОМ порт дные и подписывает их время. И есть задание сделать так что бы если комп отключен то что бы логи записывались в память а потом скидывались на сом порт при подключении компа. память я выбрал 24LC256 microchip (5ms). Так как ночью могут отключать вобще рубильник света а включать утром то устройство должно включится в рабочий режим с правильным временем.

 

Как имено грамотно сделать RTC немного не понятно. начну с главного вопроса. если исптользовать таймер 2 асинхронно то получается нужно использовать внутрений RC генератор. а его стабильность в зависимости температуры не известна. а ведь довольно важно что бы скорость обмена с СОМ портом (UART) была в районе +/- 0.5 %. Так же не смог найти калибровочный байт (нужен для частоты 8Мг). Подскажите плиз как и где его прочитать!? В книгах написано что он должен прочитатся программатором при програмировании и т.д. у меня програматор STK 200\300самодельный а программа ICC_AVR V7. 000. я вощем не смог разобратся.

 

Второе это как именно организовать отсчёт времени , ведь Т2 переполняется после 255. (при частоте кварца 32768 и коэфициенте деления 1024 частота работы таймера будет 32). тоесть переполнение произойдёт после 8 секундн. а контролер находится в слип режиме, тоесть надо получается через 8 сек пробудить его и добавить +8 секунд в переменну памяти и снова отправить в слип или я что то не понимаю? (я так понял что пока мега спит я же не могу ничего записывать программно так как тактирование алу и памяти отключены)

 

Ещё есть впрос как пробуждать контролер если появилось питание? Физически могу организовать изменение напряжения на практичски любой из ножек (0-нет питания, 4В - есть питание, или наоборот). но я посмотрел асинхнно внешние прерывания в мегах 8/88 определятся не могут. тоже нужен совет!

 

 

Всем кто реально может подсказать, особено по аське(7277332), очень прошу помочь! если есть кошелёк webmoney могу символически капнуть за помощь.

Заранее всем огромное СПАСИБО!!!

Изменено пользователем Electronic)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас задача стоит именно сделать RTC на МК? ИМХО, проще внешнюю микросхему подключить, коих множество.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас задача стоит именно сделать RTC на МК? ИМХО, проще внешнюю микросхему подключить, коих множество.

 

я тоже так хотел, но получается новые платы, + запаивать кварц и микруху RTC из них я нашол только PCF8583 (2$) а она хоть и доступная и не дорогая но большая сама по себе) хоть и смд, я собираюсь начать производство этих устройств и если это рельно сделать RTC на МК толучше на МК сделать, это будет дёшево и сердито. меньше пайки дыма и бегони за деталями. конечно в крайнем случае переделаю платы и буду ствить просто PCF8583. но это очень не практично считаю. Жду реальной помощи по вопросам!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если исптользовать таймер 2 асинхронно то получается нужно использовать внутрений RC генератор. а его стабильность в зависимости температуры не известна
есть же часовой кварц - можно периодически калибровать частоту RC генератора по прерыванию часового таймера - для этого есть регистр OSCCAL. за несколько секунд частота выходит на точное значение, связь работает отлично. Калибровочный байт тут не поможет, разве что плата будет в термостатированном корпусе, ну и калибровать каждое изделие - не очень эффективный выход.

Второе это как именно организовать отсчёт времени , ведь Т2 переполняется после 255
32768 - это 128*256, то есть нужно просто включить предделитель 128 для таймера 2.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть же часовой кварц - можно периодически калибровать частоту RC генератора по прерыванию часового таймера - для этого есть регистр OSCCAL. за несколько секунд частота выходит на точное значение, связь работает отлично. Калибровочный байт тут не поможет, разве что плата будет в термостатированном корпусе, ну и калибровать каждое изделие - не очень эффективный выход.

32768 - это 128*256, то есть нужно просто включить предделитель 128 для таймера 2.

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

 

"есть же часовой кварц - можно периодически калибровать частоту RC генератора по прерыванию часового таймера" вобще идея интересна только как подсчитывать количество тактов встроеного RC генератора с частотой 8Мг....

ведь программа на С++, это на асемблере можно считать сколько должна тактов пройти программа...

 

"32768 - это 128*256, то есть нужно просто включить предделитель 128 для таймера 2." там вобще вопрос в другом я пределитель вобще поставил бы 1024 (я там писал)

 

"в основном цикле - проверять напряжение внешн.питания, если появилось - запустить всю периферию и работать в нормальном режиме, если нет - засыпать дальше." - тоесть я так понял по напряжению на ножках никак нельзя прерывания получить? и ещё... как запустить основной цикл? ведь всё спит... в справочнике написано что из PowerDown возможно выйти 1- WDT 2- BOD 3-I2C 4- внешнее прерываение если оно обнаруживается аснхронно(!

или Вы предлагаете WDT перегружать каждые 2сек раз M8 и смотреть питание и снова в sleep уходить?

 

Вобщем вопросы открыты, весем гуру срочно сюда!) только есть просьба поподробнее описывать как всё реализовывается! я ведь и сам понимаю что в основном цикле можно всё делать, только вот как в него войти!)

Изменено пользователем Electronic)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ведь программа на С++, это на асемблере можно считать сколько должна тактов пройти программа...

Никто не запрещает вставлять ассемблерные вставки в с(++), тем более что это стандартные фишки

там вобще вопрос в другом я пределитель вобще поставил бы 1024 (я там писал)

не принципиально. В одном случае время будет квантоваться по 1с, в другом - по 8

я ведь и сам понимаю что в основном цикле можно всё делать, только вот как в него войти!)

main() :)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.... но я посмотрел асинхнно внешние прерывания в мегах 8/88 определятся не могут. тоже нужен совет!

....

может я чего-то не понимаю, но вот цитата из даташита на мегу88

... Pin change interrupts on PCINT23..0 are detected asynchronously. This implies that these interrupts can be used for waking the part also from sleep modes other than Idle mode.

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

а это из даташита на мегу8

Low level interrupts on INT0/INT1 are detected asynchronously. This implies that these interrupts can be used for waking the part also from sleep modes other than Idle mode.

смысл тот же, только для прерываний инт0, инт1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может я чего-то не понимаю, но вот цитата из даташита на мегу88

 

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

а это из даташита на мегу8

 

смысл тот же, только для прерываний инт0, инт1

Спасибо!!! уже засел проверять на практике! просто наши переводчики так переводят что я умный человек не могу понять что они перевели) надо оригиналы смотреть ты прав)

 

Никто не запрещает вставлять ассемблерные вставки в с(++), тем более что это стандартные фишки

 

не принципиально. В одном случае время будет квантоваться по 1с, в другом - по 8

 

main() :)

 

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

флудер!) :07:

Изменено пользователем Electronic)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если цель всего лишь сохранить правильное время, то ИМХО лучше использовать внешние часы. Тогда не придется в устройство устанавливать батарею питания, rtc типа ds1307 от ионистора 0,22А работают несколько суток. При построении программных часов потребуется батарея, так как Вы получите потребление порядка 20-50uA, что примерно в 40 раз больше, чем кушают часы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да... И кроме того знаю место в цепи м8-компьютер, где уже есть часы с батарейкой. :)

 

Я так например в обратную сторону синхронизирую часы. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

непонятно только, почему для UART вам требуется такая точность... во многих случаях и 5% отклонения не страшны, а 3% - так вообще практически норма...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

непонятно только, почему для UART вам требуется такая точность... во многих случаях и 5% отклонения не страшны,
Отлично, эксперимент проводить будем ?

Вы делаете +5% на приемнике а я -5% на передатчике :)

 

 

 

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

Или еще какое неведомое изобретение ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не флудите))))) тут серьёзная тема. RTC на М8/88! насчёт потребления... PCF8583 у меня на 1Фараде работала 2 недели точно. её потребление 30мкА. думаю у М88 c часовым кварцем для Т2 будет потреблять не больше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не флудите))))) тут серьёзная тема. RTC на М8/88! насчёт потребления... PCF8583 у меня на 1Фараде работала 2 недели точно. её потребление 30мкА. думаю у М88 c часовым кварцем для Т2 будет потреблять не больше.

Однофарадовый ионистор по цене и габаритам может запросто переплюнуть связку например pcf8563+0.22F. Проиграв при этом во времени автономной работы - pcf8563 кушает всего 0.25uA. Но если Вы уже все решили в пользу софтового RTC, то дерзайте. Не забудте только что Вам надо считать не секунды, а реальное время/дату с високосными годами, разным количеством дней в месяце и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...