Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Часы реального времени на M8 или M88
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Electronic)
Здравствуейте. У меня свой проэкт в котором 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 могу символически капнуть за помощь.
Заранее всем огромное СПАСИБО!!!
SysRq
У вас задача стоит именно сделать RTC на МК? ИМХО, проще внешнюю микросхему подключить, коих множество.
Electronic)
Цитата(SysRq @ Oct 5 2008, 14:54) *
У вас задача стоит именно сделать RTC на МК? ИМХО, проще внешнюю микросхему подключить, коих множество.


я тоже так хотел, но получается новые платы, + запаивать кварц и микруху RTC из них я нашол только PCF8583 (2$) а она хоть и доступная и не дорогая но большая сама по себе) хоть и смд, я собираюсь начать производство этих устройств и если это рельно сделать RTC на МК толучше на МК сделать, это будет дёшево и сердито. меньше пайки дыма и бегони за деталями. конечно в крайнем случае переделаю платы и буду ствить просто PCF8583. но это очень не практично считаю. Жду реальной помощи по вопросам!
umup
Цитата
если исптользовать таймер 2 асинхронно то получается нужно использовать внутрений RC генератор. а его стабильность в зависимости температуры не известна
есть же часовой кварц - можно периодически калибровать частоту RC генератора по прерыванию часового таймера - для этого есть регистр OSCCAL. за несколько секунд частота выходит на точное значение, связь работает отлично. Калибровочный байт тут не поможет, разве что плата будет в термостатированном корпусе, ну и калибровать каждое изделие - не очень эффективный выход.
Цитата
Второе это как именно организовать отсчёт времени , ведь Т2 переполняется после 255
32768 - это 128*256, то есть нужно просто включить предделитель 128 для таймера 2.
Цитата
Ещё есть впрос как пробуждать контролер если появилось питание?
в основном цикле - проверять напряжение внешн.питания, если появилось - запустить всю периферию и работать в нормальном режиме, если нет - засыпать дальше.
Electronic)
Цитата(umup @ Oct 5 2008, 17:38) *
есть же часовой кварц - можно периодически калибровать частоту 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 уходить?

Вобщем вопросы открыты, весем гуру срочно сюда!) только есть просьба поподробнее описывать как всё реализовывается! я ведь и сам понимаю что в основном цикле можно всё делать, только вот как в него войти!)
MrYuran
Цитата(Electronic) @ Oct 5 2008, 19:14) *
ведь программа на С++, это на асемблере можно считать сколько должна тактов пройти программа...

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

не принципиально. В одном случае время будет квантоваться по 1с, в другом - по 8
Цитата
я ведь и сам понимаю что в основном цикле можно всё делать, только вот как в него войти!)

main() smile.gif

После пробуждения и обработки прерывания автоматически вываливаетесь в основной поток и продолжаете с места последнего "засыпания". Там проверяете всё что нужно, выполняете все необходимые действия и засыпаете дальше.
smac
Цитата(Electronic) @ Oct 5 2008, 15:27) *
.... но я посмотрел асинхнно внешние прерывания в мегах 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
Electronic)
Цитата(smac @ Oct 5 2008, 19:34) *
может я чего-то не понимаю, но вот цитата из даташита на мегу88

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

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

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

Цитата(MrYuran @ Oct 5 2008, 18:42) *
Никто не запрещает вставлять ассемблерные вставки в с(++), тем более что это стандартные фишки

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

main() smile.gif

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

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

Я так например в обратную сторону синхронизирую часы. smile.gif
Огурцов
Не совсем. Кушать-то можно и мегой очень мало, но только если в схеме больше ничего нет. Так конечно, лучше ставить ds1307 и не мучаться. Кстати, в данный момент тестирую часики со встроенным генератором - несколько суток идут из секунды в секунду, в отличие от обычных кварцев, которые разбегаются в течение очень короткого времени.
ARV
непонятно только, почему для UART вам требуется такая точность... во многих случаях и 5% отклонения не страшны, а 3% - так вообще практически норма...
singlskv
Цитата(ARV @ Oct 5 2008, 23:56) *
непонятно только, почему для UART вам требуется такая точность... во многих случаях и 5% отклонения не страшны,
Отлично, эксперимент проводить будем ?
Вы делаете +5% на приемнике а я -5% на передатчике smile.gif



Цитата(Огурцов @ Oct 5 2008, 23:56) *
Кстати, в данный момент тестирую часики со встроенным генератором - несколько суток идут из секунды в секунду, в отличие от обычных кварцев, которые разбегаются в течение очень короткого времени.
Поясните пожалуйста что это за магический генератор ? термостабилизированный ?
Или еще какое неведомое изобретение ?
Electronic)
не флудите))))) тут серьёзная тема. RTC на М8/88! насчёт потребления... PCF8583 у меня на 1Фараде работала 2 недели точно. её потребление 30мкА. думаю у М88 c часовым кварцем для Т2 будет потреблять не больше.
Qwertty
Цитата(Electronic) @ Oct 6 2008, 01:10) *
не флудите))))) тут серьёзная тема. RTC на М8/88! насчёт потребления... PCF8583 у меня на 1Фараде работала 2 недели точно. её потребление 30мкА. думаю у М88 c часовым кварцем для Т2 будет потреблять не больше.

Однофарадовый ионистор по цене и габаритам может запросто переплюнуть связку например pcf8563+0.22F. Проиграв при этом во времени автономной работы - pcf8563 кушает всего 0.25uA. Но если Вы уже все решили в пользу софтового RTC, то дерзайте. Не забудте только что Вам надо считать не секунды, а реальное время/дату с високосными годами, разным количеством дней в месяце и т.д.
hainiken
Цитата(SysRq @ Oct 5 2008, 15:54) *
У вас задача стоит именно сделать RTC на МК? ИМХО, проще внешнюю микросхему подключить, коих множество.

и правильней !

Хотя РАБОЧИЙ пример часов програмных с часовым кварцем есть в примерах CVAVR.
Electronic)
Цитата(Qwertty @ Oct 6 2008, 01:11) *
Однофарадовый ионистор по цене и габаритам может запросто переплюнуть связку например pcf8563+0.22F. Проиграв при этом во времени автономной работы - pcf8563 кушает всего 0.25uA. Но если Вы уже все решили в пользу софтового RTC, то дерзайте. Не забудте только что Вам надо считать не секунды, а реальное время/дату с високосными годами, разным количеством дней в месяце и т.д.

1Ф стоит 10грн 0.33Ф стоит 8.5грн M8/88-10грн pcf8583-10грн. потребление pcf8583 в даташите написано10-30мка. откуда вы взяли цифру 0,25мкА?
SasaVitebsk
У меня пару изделий работает на М48 с часовым кварцем и СЦ2032. Но потом я, всё же отказался от такой реализации. В пользу DS1307.

Правда тоже хапнул романтики. Уже по другому поводу. smile.gif
Последнее время на питание как-то не смотришь - всё работает от 3.3V. smile.gif
Ну а тут - осечка. smile.gif А платы сделаны уже. Ноги свободные были - вывел частоту на OC1, и вольтдобавку на питание DS. Там такая плата была, что эти изменения не критичны - так и выпускается - не стал переделывать.
Electronic)
Цитата(SasaVitebsk @ Oct 6 2008, 02:45) *
У меня пару изделий работает на М48 с часовым кварцем и СЦ2032. Но потом я, всё же отказался от такой реализации. В пользу DS1307.

Правда тоже хапнул романтики. Уже по другому поводу. smile.gif
Последнее время на питание как-то не смотришь - всё работает от 3.3V. smile.gif
Ну а тут - осечка. smile.gif А платы сделаны уже. Ноги свободные были - вывел частоту на OC1, и вольтдобавку на питание DS. Там такая плата была, что эти изменения не критичны - так и выпускается - не стал переделывать.

и сколько DS1307 стоит, и есть ли у неё преимущества перед8583 ?
SasaVitebsk
Цитата(Electronic) @ Oct 6 2008, 02:48) *
и сколько DS1307 стоит, и есть ли у неё преимущества перед8583 ?

Мы брали "фирменные" и китайские. smile.gif Первые - около 1$ вторые 0.4 при 10 - 20 штуках. smile.gif

Насчёт преимуществ с 8583 - не знаю. Я не пользовал 8583.

Насчёт m88/48 - её реально использовать только в варианте megaX8p. То есть picopower. Иначе весь кайф ломает BOD. Встроенный, если мне не изменяет память, потребляет 1.6ма. smile.gif Что чудовищно много для таких приложений, а внешний - стоит теже деньги, что и внешние часы. А гимору - на порядок больше. Начнём с того, что при применении внешних часов вам надо просто завести батарейку на пустую ногу часов, а не городить огород с переключением на батарейное питание. Ну и так далее и тому подобное...
Electronic)
я уже писал что там потребление будет в пределах 30-40мкА, и как раз всё будет проще если я не буду ставить внешний RTC) получится диод ионистор на 1ф и контролер.. все дела... питание пропало он ушол в спячку , потом проснулся при появлении питания и работает дальше сохранив в себе время.
SysRq
Получается что в режиме сна события вы не регистрируете и только время считаете? Далее появляется питание, вы регистрируете события и записываете их в память с какой-то отметкой времени. Далее включается комп и забирает из МК список событий.
А зачем вообще RTC? Выдать компу события, и пусть вычислит реальное время событий с отсчетом времени назад от текущего по отметкам времени в МК. При этом отметки времени в МК можете считать как угодно (в лоб: инкременировать счетчик времени smile.gif по любому таймеру\событию\etc с нужной точностью)..
Electronic)
Цитата(SysRq @ Oct 6 2008, 04:14) *
Получается что в режиме сна события вы не регистрируете и только время считаете? Далее появляется питание, вы регистрируете события и записываете их в память с какой-то отметкой времени. Далее включается комп и забирает из МК список событий.
А зачем вообще RTC? Выдать компу события, и пусть вычислит реальное время событий с отсчетом времени назад от текущего по отметкам времени в МК. При этом отметки времени в МК можете считать как угодно (в лоб: инкременировать счетчик времени smile.gif по любому таймеру\событию\etc с нужной точностью)..

в режиме сна считает только время...(когда питания нет) когда появляется питания (но комп не включен) начинается запись событий в память, у событий должно быть время. можно конечно записывать только разницу времени но смысла это не меняет, в спящем режиме должен вестись отчёт времени(или разница времени), тактирование от внутренего генератора, вобщем вопросы как были так и остаются открытыми...
demiurg_spb
Основываясь на личном опыте тоже хочу сказать, что RTC ПРОЩЕ и НАДЁЖНЕЕ делать на DS1307.
Потребление Меги не идёт ни в какое сравнение с DS1307.
В Росии бывают ооочень длительные выходные на Новый Год - это тоже надо учитывать.
Огромный ионистор - это не совсем оптимально...
Rst7
Цитата
Иначе весь кайф ломает BOD. Встроенный, если мне не изменяет память, потребляет 1.6ма


Изменяет. Примерно 20-30мкА, в зависимости от температуры и питания. График есть в даташите M48-88-168
VladimirYU
Цитата(singlskv @ Oct 6 2008, 00:14) *
Поясните пожалуйста что это за магический генератор ? термостабилизированный ?
Или еще какое неведомое изобретение ?

Например DS32C35 имеет встроенные генератор и термодатчик, взависимости от которого переключаются корректирующие емкости генератора, обеспечивается та самая термокомпенсация плюс еще 4к FRAM (все по I2C). Конечно по цене не 1307, зато очень функциональное устройство, для батарейки отдельный вход, никакие праздники даже бразильский карнавал не страшен.
Electronic)
Цитата(VladimirYU @ Oct 6 2008, 13:32) *
Например DS32C35 имеет встроенные генератор и термодатчик, взависимости от которого переключаются корректирующие емкости генератора, обеспечивается та самая термокомпенсация плюс еще 4к FRAM (все по I2C). Конечно по цене не 1307, зато очень функциональное устройство, для батарейки отдельный вход, никакие праздники даже бразильский карнавал не страшен.

ну вот как бы Вы должны меня тогда понять больше всех biggrin.gif
так как вот цены в грн! :
микросхемы DS32C35-33# MAX/DALL SO20 108.72
микросхемы DS32C35-33IND# MAX/DALL SO20 116.42

да и не нужен мне RTC на месяцы. 2-3 дня максимум 7 дней нужно что бы время шло. обычный режим ночь без света. а утром правильное время с компа в ком порт и по новой! + будут варианты исполнения в которых оябзателен будет акумулятор на 2.5Ач! и ионистор уже не надо будет. тоесть микропотребление не сама цель. цель в нормальной реализации RTC без доплаты!



Всем спасибо за помощь! Остался последний вопрос!-

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

Вам же сказали, что во-первых 0,5% такая точность не нужна, во-вторых сделайте калибровку внутреннего RC от вашего часового кварца, соответствующий апноут на сайте атмела есть и точность получите вполне достаточную для КОМ-порта.
kaf
Цитата(GDI @ Oct 6 2008, 19:53) *
сделайте калибровку внутреннего RC от вашего часового кварца

или от приамбулы поступающей с COM-порта, если нет веры в покупаемые часовые кварцы
ARV
Цитата(singlskv @ Oct 6 2008, 00:14) *
Отлично, эксперимент проводить будем ?
Вы делаете +5% на приемнике а я -5% на передатчике smile.gif
разница, как вы понимаете, будет 10%... хотя на счет 5% я, пожалуй, погорячился - скорее все же 3% предел...
singlskv
Цитата(ARV @ Oct 6 2008, 21:52) *
разница, как вы понимаете, будет 10%... хотя на счет 5% я, пожалуй, погорячился - скорее все же 3% предел...
НемогоOFF:
И 3% уже бывает много 3+3 = 6% а это уже больше чем нужно для 8N1

Имел недавно разборки с соединеннием PC и платки с АРМ7, там ошибки сыпало примерно
один раз на 100 пакетов. После безрезультатного перекапывания почти всего кода(код был чужой),
решил проверить все с самого начала, оказалось что была ошибка округления
при настройке делителя UART.
Ошибка установки скорости была ~2,5% вместо ~1,25% и ошибки уже сыпало...
После правки ошибки исчезли совсем.
Так что ИМХО 1,5-2% с одной стороны, это максимум на который можно закладываться.
ARV
вы снова говорите о суммировании отклонений... а если один "абонент" имеет стабильную частоту - второму можно отклоняться и на 3%... а иногда получается и больше...
rezident
Цитата(ARV @ Oct 6 2008, 23:52) *
разница, как вы понимаете, будет 10%... хотя на счет 5% я, пожалуй, погорячился - скорее все же 3% предел...

0,5% работает в подавляющем большинстве случаев. Там же где погрешность baudrate выше, работает или случайно или "до поры до времени" smile.gif Погрешности тактовых двух независимых источников в общем случае также независимы, поэтому погрешности являются аддитивными, т.е. их нужно суммировать. 2,5%+2,5% это будет конечно 5%, что вроде как допустимо для 8N1. Но тут еще нужно учитывать среду передачи, в которой фронты импульсов далеки от прямоугольных. Особенно, если опторазвязка какая-нибудь используется.
Так что стремиться нужно к 0,5% и тогда не будет лишнего геморроя и загадочных эффектов.
singlskv
Цитата(ARV @ Oct 6 2008, 22:34) *
вы снова говорите о суммировании отклонений... а если один "абонент" имеет стабильную частоту - второму можно отклоняться и на 3%... а иногда получается и больше...
Я же показал реальную ситуацию, сколько погрешность на моем PC я не знаю,
сколько будет на компе у клиента я тоже не знаю, поэтому нельзя закладываться на лучший
вариант, типа на компе будет 0% а на девайсе 3-5% и все будет работать...
Поэтому как минимум делим погрешность пополам и плюс еще запас, хотя
лучше стремится вобще к отсутствию этой "цифровой" погрешности.
В описываемом мною примере, после нахождения правильных коэф PLL,
вносимая погрешность стала =0%, хотя и при 1,25% все уже работало без сбоев.
Integral
Извиняюсь за оффтоп.... но где на Украине можно купить DS3102/DS3107 и т.п. Желательно проверенные места.
Maik-vs
Во-первых, хочу поддержать автора за его стремление сделать красивый экономичный девайс. Добавить микросхему, аккумулятор и написать инструкцию, куда не нажимать - это просто, но НЕ ПРАВИЛЬНО. Правильно когда девайс работает несмотря ни на что.

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


Из чего тут следует, что питания не бывает сутками?

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

Всё правильно - один кварц уже есть, под него подгоняем RC генератор. Есть аппнота AVR055: Using a 32kHz XTAL for run-time calibration of the internal RC. Точность частоты COM-порта должна быть 2%. Это согласуется с 5%, о которых говорят другие авторы, если учитывать погрешность н аобеих сторонах канала. Калибровочный байт называется OSCCAL, адрес его 0x31(0x51) в даташите на мегу8 есть про него много. Он читается программатором, напрмер avreal'ом:
Device connected, MEGA16 detected
Chip not locked
Fuses
OSCCAL = BD, BD, B7, B7
BODLEVEL = 1
BODEN = 1
SUT = 2
CKSEL = F
BLB1 = 3
BLB0 = 3
OCDEN = 1
JTAGEN = 1
CKOPT = 0
EESAVE = 1
BOOTSZ = 0
BOOTRST = 1

Цитата(Electronic) @ Oct 5 2008, 15:27) *
Второе это как именно организовать отсчёт времени , ведь Т2 переполняется после 255. (при частоте кварца 32768 и коэфициенте деления 1024 частота работы таймера будет 32). тоесть переполнение произойдёт после 8 секундн. а контролер находится в слип режиме, тоесть надо получается через 8 сек пробудить его и добавить +8 секунд в переменну памяти и снова отправить в слип

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

Глядя на таблицу 14 даташита "Table 14. Active Clock Domains and Wake-up Sources in the Different Sleep Modes" вижу, что светит Вам режим Power save, в котором Wake-up Sources INT0,1 и Timer2. Если не получается с INT, что мешает проверить какую-нибудь ногу на наличие высокого уровня от основного источника питания? Всё равно по таймеру просыпаться - время наращивать.
Electronic)
Спасибо! уже всё работает не смотря не на что, благодарен что ответили чётко. остался вопрос почему в слипе Т2 спешит на 1 сек за час ? ... я грешу на флюс.. на сам знаю что это не очень верное предположение...
вот прерывание от Т2

#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
g=g^1;if(g==1){LED_ON;}else{LED_OFF;}
sec_pl=1;
}

и то что в main его обрабатывает
if(sec_pl==1){

sec++;if(sec>=60){sec=0;}
if(sec==0){min++;if(min>=60){min=0;}
if(min==0 && sec==0){hor++;if(hor>=24){hor=0;}}}
sec_pl=0;

if(V==0x01 && sleep_en==1){sleep_en=2;sleep_off();}
if(sleep_en==1){asm("sleep");asm("nop");}

if(sleep_en==2){clock(0,0);}

}//end if(sec_pl==1)
что скажет народ?
rezident
Цитата(Electronic) @ Oct 10 2008, 04:31) *
остался вопрос почему в слипе Т2 спешит на 1 сек за час ?

Видимо потому, что кусок функции часов
Цитата(Electronic) @ Oct 10 2008, 04:31) *
и то что в main его обрабатывает
if(sec_pl==1){

sec++;if(sec>=60){sec=0;}
if(sec==0){min++;if(min>=60){min=0;}
if(min==0 && sec==0){hor++;if(hor>=24){hor=0;}}}
sec_pl=0;

должен выглядеть как-то так
Код
  if(sec_pl!=0)
  { if (sec<59)
      sec++;
    else
    { sec=0;
      if (min<59)
        min++;
      else
      { min=0;
        if (hour<23)
          hour++;
        else
          hour=0;
      }
    }
    sec_pl=0;
  }
Electronic)
Спасибо. Переписал код обработки времени как вы сказали, но всё так же спешеат в нормальном режиме на 2 сек за час. в слипе не пробывал. Но я так понял они у меня спешат и норм режиме и в слипе одинаково, странно как то... sad.gif
Electronic)
да уход одинаковый... проверил. 2 сек в час не зависимо от того слип или не слип
MrYuran
Цитата(Electronic) @ Oct 11 2008, 14:03) *
да уход одинаковый... проверил. 2 сек в час не зависимо от того слип или не слип

Делаете подстройку на 2 с в час - и проблема решена.
Можно ещё поиграться с разными кварцами
rezident
Цитата(Electronic) @ Oct 11 2008, 14:33) *
Спасибо. Переписал код обработки времени как вы сказали, но всё так же спешеат в нормальном режиме на 2 сек за час. в слипе не пробывал. Но я так понял они у меня спешат и норм режиме и в слипе одинаково, странно как то... sad.gif
Все-таки непонятно от какого источника у вас сейчас тактируются часы? Т.е. переменная sec_pl как и когда инкрементируется? Может система тактирования или таймер неправильно инициализированы?
Electronic)
//TIMER2 initialize - prescale:1024
// WGM: Normal
// desired value: 1Hz
// actual value: 1,000Hz (0,0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x08; //set async mode
TCNT2 = 0x00; //setup
OCR2 = 0x00;
TCCR2 = 0x05; //start*
}
demiurg_spb
Цитата(Electronic) @ Oct 11 2008, 14:03) *
да уход одинаковый... проверил. 2 сек в час не зависимо от того слип или не слип

Почитайте доку на используемый кварц.
Почитайте доку MCU.
Обратите внимание на параметр "емкостная нагрузочная способность".
Кварцы бывают разные 6pf, 12pf.
Это сильно влияет на точность хода часов (проверено опытным путём).
smac
Цитата(Electronic) @ Oct 12 2008, 13:49) *
//TIMER2 initialize - prescale:1024
// WGM: Normal
// desired value: 1Hz
// actual value: 1,000Hz (0,0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x08; //set async mode
TCNT2 = 0x00; //setup
OCR2 = 0x00;
TCCR2 = 0x05; //start*
}


Пересмотрел всю тему, может я невнимателен, но так и не нашел, какова частота кварца? Если предположить, что "часовой" зачит 32,768 кГц, то при делителе 1024 Вы никак не получите прерывание по переполнению таймера частотой в 1 Гц при начальном значении TCNT2==0, значит либо нужен более высокочастотный кварц, либо в регистр TCNT2 нужно записать какое-то число каждый раз при переполнении (в данном режиме работы таймера). Если в TCNT2 что-то пишется, то действия при записи и могут быть причиной неточности.
Electronic)
ой... то просто у меня оставалось с давних пор. кварц 32768. делитель 128 (0х05 в 3-ем варианте исполнеия Т2 это clk/128) а 128*256 =32768
Electronic)
Значит ТАК! перевёл на платформу М88 и время стало идти нормально! секунда в секунду... незнаю что это значит... но алгоритм я не менял! Новички учтите!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.