Ниче не понимаю, поставил просто waitms 10, после записи в EE, и прошил 3 устройства и все три уже 20 мин без сбоев. Посмотрим, что дальше
Спящий режим (Powersave)
Сообщений 31 страница 53 из 53
Поделиться322014-03-19 13:41:33
Ниче не понимаю, поставил просто waitms 10, после записи в EE, и прошил 3 устройства и все три уже 20 мин без сбоев. Посмотрим, что дальше
А я Вам про что! Waitms - это просто время для записи в EEPROM/
Быстрее будет подымать флажок в прерывании от EEPROM.
Грёбаный аглицкий, вполне возможно мы неправильно переводим документацию!
Отредактировано sasha_1973 (2014-03-19 13:42:28)
Поделиться332014-03-19 13:45:10
Если использовать Idle, можно задействовать регистр "PRR" - управления питанием аппаратных средств МК.
А при использовании PowerSave, толку от этого регистра не много? Разве что будет меньше потреблять при обработке прерывания от Timer2, но с учетом времени сна/работы вряд ли получится существенная экономия.
Поделиться342014-03-19 13:51:34
А при использовании PowerSave, толку от этого регистра не много? Разве что будет меньше потреблять при обработке прерывания от Timer2, но с учетом времени сна/работы вряд ли получится существенная экономия.
У меня пока идут эксперименты с режимом "Idle" - 4.7 мкф ~ 100 сек. Счётчик по TIMER2 и передача полученного по USART. Мучаю Picopower basics.pdf
Отредактировано sasha_1973 (2014-03-19 13:52:32)
Поделиться352014-03-19 14:06:40
sasha_1973 написал(а):
А при использовании PowerSave, толку от этого регистра не много? Разве что будет меньше потреблять при обработке прерывания от Timer2, но с учетом времени сна/работы вряд ли получится существенная экономия.
У меня пока идут эксперименты с режимом "Idle" - 4.7 мкф ~ 100 сек. Счётчик по TIMER2 и передача полученного по USART. Мучаю Picopower basics.pdf
В Idle генератор работает, меньше 0,8мА тока не получится добиться
Поделиться362014-03-19 14:11:18
kostr написал(а):
А я Вам про что! Waitms - это просто время для записи в EEPROM/
Быстрее будет подымать флажок в прерывании от EEPROM.
Грёбаный аглицкий, вполне возможно мы неправильно переводим документацию!
Возможно, сегодня погоняю все по полной программе, посмотрим, как будет работать.
Только все равно не понимаю, даже если записываться не успевает переменная в EE, то почему остальные переменные в ОЗУ то портятся?
Поделиться372014-03-19 19:53:31
Возможно, сегодня погоняю все по полной программе, посмотрим, как будет работать.
Только все равно не понимаю, даже если записываться не успевает переменная в EE, то почему остальные переменные в ОЗУ то портятся?
Переменные могут портится из за перезагрузки (это легко проверить вставив какой то код маячачщий в начале программы до главного цикла ) или из за переполнения какого то буфера/стека. Либо из за возврата по левому адресу (портится адрес команд). Это проверить куда сложнее, все что знал уже предложил. Ну разве что буфферизированый порт может как то конфликтовать в прерывании... зачем там кстати буфферизация если прерывание идет по приему каждого байта и все это сохраняется в строку? Командный указатель, POP неверный, это что то со стеком, вроде его исключили. Я бы буферизированный ввод убрал, все равно прием побайтный. Взможно какой то конфликт из за скорости обработки после запуска тактового генератора, он как известно не сразу выходит на частоту...
Поделиться382014-03-19 20:13:18
Контроллер точно не перегружается, сначала думал перезагружается, ан нет. По поводу буферизации порта не помню почему так делаю уже много лет - работает вроде.
У меня несколько устройств на подобии стоит в реально жестоких условиях и работают без перерыва уже почти два года без косяков. Код аналогичный и размеры стеков те же, но они работают от сети и не засыпают, а также от внешнего кварца 16Мег. Я и тему то создал с названием Спящий режим (Powersave), потому что чую здесь что то не так, опыта вообще нет.
Поделиться392014-03-19 21:34:53
У меня с описанными выше параметрами работает несколько устройств на Tiny26. Не используют UART и работают как часы. 
Поделиться402014-03-19 22:23:40
У меня с описанными выше параметрами работает несколько устройств на Tiny26. Не используют UART и работают как часы.
Enable Urxc
On Urxc Getchar
теперь сделал без буфера UART, запустил работает пока. Уже столько ошибок исправил, что мама не горюй. Но вот с записью в EE и UART, я думаю, самые существенные. Посмотрим как будет работать. Но то что критическая ситуация возникает при выходе из сна -это уже точно. Мож и правда буфер что то дурил, посмотрим, короче.
Поделиться412014-03-21 22:05:52
вот двое суток проработало восемь идентичных приборов с безбуферным UARTом, без ошибок. Сегодня один, при выходе из режима сна, опять перезагрузился не с того не с сего)
Поделиться422014-03-25 11:13:19
Нет, все таки корректной работы не наблюдается...
Хоть и писал я, что контроллер не перезагружается - перезагружается, а не переменные портятся.
Перезагрузка наступает сразу после того как Timer3_schet досчитает до 800 и идет вход в сравнение
If Timer3_schet >= 800 Then
Pvr_save_bit = 0
Incr Analog
Incr Schet
Schet_ee = Schet
waitms 10
End If
Причем я заметил одну интересную деталь. Работает или нет прибор, зависит от того, как вставлена батарейка. Т.е. в один и тот же прибор с одной и той же прошивкой вставляем батарейку (4,2В) и начинаются перезагрузки. Вынимаем батарейку, вставляем заново и о чудо, почти неделя бесперебойной работы, пока батарейка не умерла...
Где искать уже не знаю, даже не знаю, что искать. Но косяк где-то есть
Поделиться432014-03-25 13:06:20
Настрой BOD и в самом начале вставь код определения причины перезагрузки. Что то типа этого:
Dim V_MCUSR as Byte
$asm
Sts {V_MCUSR} , R0
$end asm
If V_MCUSR.PORF = 1 then Call ...
If V_MCUSR.EXTRF = 1 then Call ...
If V_MCUSR.BORF = 1 then Call ...
If V_MCUSR.WDRF = 1 then Call ...где:
PORF включение питания, EXTRF внешний сброс, BORF провал питания, WDRF - Собака.
Может Reset нажирает, может контакт плохой с батарейкой, на микротоках окисная пленка не пробивается, поэтому резервные батарейки стараются впаивать.
Поделиться442014-03-25 13:24:10
BOD настроен на 2.7В
Вечером буду пробовать чем сбрасывается
А то что окисел - маловероятно, потому что перезагрузка идет именно после того как счетчик досчитывает до 800 и идет вход в сравнение.
Отредактировано kostr (2014-03-25 13:26:44)
Поделиться452014-03-25 13:32:14
Dim V_MCUSR as Byte $asm Sts {V_MCUSR} , R0 $end asm If V_MCUSR.PORF = 1 then Call ... If V_MCUSR.EXTRF = 1 then Call ... If V_MCUSR.BORF = 1 then Call ... If V_MCUSR.WDRF = 1 then Call ...
при внедрении этого кода перезагрузки не произойдет, как я понял? Просто выполнится кусок кода, который за Call?
Поделиться462014-03-25 14:06:10
при внедрении этого кода перезагрузки не произойдет, как я понял? Просто выполнится кусок кода, который за Call?
Выполнится подпрограмма, которая будет указана в в каждом Call. У меня обычно она пикает бипером, или мигает светодиодиком, или делает икнремент счетчика в энергонезависимой памяти, в общем как то сигналит, что было.
Инициализация идет раньше, переменные будут уже испорчены, что бы не портились надо код этот ставить в Init. И возможно тогда не Call делать а Goto если нужно переменные сохранять по вачдогу например.
Пётр в ветке atbanned68 и прерывание от WD дал ссылку http://avrhelp.mcselec.com/index.html?_initmicro.htm Я сам не пробовал.
Отредактировано IgorL (2014-03-25 14:07:48)
Поделиться472014-03-25 14:46:59
EXTRF внешний сброс - сброс по RESET? Просто сейчас моделирую этот код в протеусе мне все время пишет V_MCUSR.EXTRF = 1, что ресет нажимаю, что WDR ставлю
Поделиться482014-03-25 15:18:45
И еще вопрос. Может ли сброс быть связан как то с ADC?
Отредактировано kostr (2014-03-25 15:24:53)
Поделиться492014-03-25 18:47:01
EXTRF внешний сброс - сброс по RESET? Просто сейчас моделирую этот код в протеусе мне все время пишет V_MCUSR.EXTRF = 1, что ресет нажимаю, что WDR ставлю
Протеус не отрабатывает данный режим.
Вот вариант проверен в железе - atbanned68 и прерывание от WD
Поделиться502014-03-26 05:15:44
Протеус вообще с WD и режимами не дружит. Не знаю как в новых версиях, раньше с OSCALL были у протеуса глюки.
Dim Причина_сброса_мк As Byte
!sts {Причина_сброса_мк} , R0
.....
If Причина_сброса_мк.1 = 1и
Dim V_MCUSR as Byte
$asm
Sts {V_MCUSR} , R0
$end asm
....
If V_MCUSR.EXTRF = 1одно и то же.
Лично мне второе понятней.
Поделиться512014-03-26 08:11:55
Друзья, нашлась проблема...
Коротко объясню. Добрался я вчера ночью уже до друга с осцилоскопом, и вот что оказалось. У меня микроконтроллер управляет силовым транзисторным ключом (n-канальным) и в момент подачи лог нуля (для включения, а это как раз происходило после просыпания контроллера) питание на контроллере где то на 50мкс становилось равным 1В - вот отсюда и стали портится переменные. А когда я поставил BOD на 2,7 и вовсе перезагрузка пошла. Такой провис вызван был разрядом подзатворной емкости, я думаю. Перепаял немного железо, все как рукой сняло. Спасибо за помощь, узнал много нового и исправил излишний буфер UART. Век живи, век учись
Поделиться522014-03-26 21:24:01
Вот поэтому я и забросил Протеус, то, что в нем работает в железе может глючить. Жаль к Баскому AVRDragon просто не подцепить, бряк в реальной железке много что расскажет.
Поделиться532014-03-27 07:51:55
Режимы энергосбережения и Watchdog на МК Atmega48P_88P_168_328P, отрабатываются в Протеусе 8.1. Проверено.