Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа в режиме POWERDOWN


Работа в режиме POWERDOWN

Сообщений 1 страница 8 из 8

1

Добрый всем день и с наступающим Новым годом!
Вот такой вопрос появился.
Есть некое устройство, которое питается от батареи и необходимо максимально увеличить срок её службы. Естественно процессор должен как можно больше спать
Работает всё это так.
После инициализации процессора он засыпает крепким сном. Иногда на его входы, обозначенные, как GVS и HVS приходят импульсы. По прерыванию на пинах он их подсчитывает, записывает в память и снова на боковую.
Он не просто их подсчитывает и запоминает, их нужно передать на сервер. Это может происходить один-два раза в сутки. В свою очередь на процессор могут приходить команды от сервера через USART и тут засада.
Нужно разбудить процессор. Пробовал несколько вариантов:
1. Перейти на MSP430 со всеми вытекающими отсюда проблемами. Отказался.
2. Просыпаться от WDT или TIMER2 в асинхронном режиме. Не пойдёт, т.к. во первых слишком часто, а во вторых не синхронно с поступлением запроса от сервера.
3. Придумал добавить обычный RS триггер. Сигнал с линии RxD процессора свои спадом переключает триггер в 1, которая по прерыванию на INT2 будит процессор. По окончании всех действий процессор
выдаёт импульс на вход R триггера и он возвращается в своё первоначальное положение. Процессор засыпает и ждёт следующего события.
Собственно вопрос в том, что может есть более элегантные способы разбудить его при приёме по USART?
http://s1.uploads.ru/t/sM5vH.jpg

0

2

"Элементарно Ватсон", я сейчас использую в проектах, в основном аттини84/85. Как мы знаем, у них нет аппаратного UART-а, а только USI (универсальный интерфейс), который баском особо-то и не поддерживает, НО, есть софтварная эмуляция.
Ещё мы знаем, что у МК есть много разных спящих режимов, нужно брать тот, что пробуждает МК от INT.
Следовательно, если использовать под RX INT0, то можно сигналом пробуждать контроллер и передавать команды в него, но тут надо провести эксперимент, как быстро он проснется до готовности. Возможно потребуется перед обменом делать отдельную команду на пробуждение.
Идем дальше, берём скажем "ATmega48A/PA/88A/PA/168A/PA/328/P", RX МК соединяем с INT0 (для подстраховки можем добавить подвязку резистором к питанию), а INT1/PCINTx можно использовать для пробуждения от обработки входящих сигналов/кнопок.

0

3

Т.е. на тини85 можно замутить UART?   А поподробнее можно?

0

4

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

-NMi- написал(а):

Т.е. на тини85 можно замутить UART

Да, при помощи INT0 + софтварного UART-а, через INPUT и иже ему подобных.
Идея в следующем:

- настраиваем по INT на прерывание от внешнего сигнала;
- в самом прерывании устанавливаем приём самих данных (к примеру INPUT по ноге INT0, т.е. RX);
- не забываем обнулить гифром, после приёма всех данных.

зы: ну и не забываем обвязать соответствующи в коде (запрет прерываний на время приёма).
зы2: естественно т.к. уарт у нас софтварный, на момент приёма чип не может параллельно что-то ещё делать, иначе будет растяжка во времени (ну или может, но надо позаботиться о минимальном отвлечении и данные в этом случае не могут течь большим потоком (одним пакетом).

0

5

RDW написал(а):

Ещё мы знаем, что у МК есть много разных спящих режимов, нужно брать тот, что пробуждает МК от INT.

Это да, но режим может быть только POWERDOWN. У меня естественно.
UART только железный.
INT0 не годится в этом случае. Он будит МК только по уроню.
И ещё, как мы все знаем посылка по UART это куча импульсов. Представляете себе сколько будет инициировано прерываний если например принять 2048 символов + служебная информация?
Дело в том, что само прерывание это просто установка флага, который сигнализирует, что пришёл пакет. Обработка пакета производится в основном теле программы, поэтому пока МК дойдёт до основной программы, будет куча прерываний.
Примерно так:

Код:

Main:

'RS232
If RS_int = 1 Then
    RS_int = 0
     Print "End Cikl{013}"
'Тут сбросим внешний триггер прерывания
    Reset_RS = 0
      Waitus 100
    Reset_RS = 1
End If

Config Powermode = POWERDOWN
Goto Main
STOP

'Прерывание от RS232
RS:
 $asm
  push R25
  ldi R25,1
  sts {RS_int} , R25                                        'Загрузим в переменную флаг 1
  pop R25
 $end asm
Return

Отредактировано sva-don (2017-12-26 14:37:13)

0

6

sva-don написал(а):

INT0 не годится в этом случае

Как раз ещё как годится! Прерывание по инту и протокол обмена по уарты - ровны по физике.
А как это организовать - это уже от задачи зависит.

sva-don написал(а):

Он будит МК только по уроню.

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

sva-don написал(а):

И ещё, как мы все знаем посылка по UART это куча импульсов. Представляете себе сколько будет инициировано прерываний если например принять 2048 символов + служебная информация?

Опять - легко! Никаких проблем, тебе нужно же только пробудить МК - это одна посылка, потом уже начать передавать - это вторая часть. Возможно можно успеть и на лету всё это делать. Только надо не забывать про инициализировать весь МК под работу после спячки.

sva-don написал(а):

Дело в том

Ну а как ты хотел, ты ещё толком не разобрался как этот алгоритм работает, а пытаешься уже свой код написанный ДО навязать принципиально другой логике.
Отталкиваться надо последовательно и от режима: просыпания, инициализации, алгоритма взаимодействия всех блоков. Если в голове логика не укладывается, нарисую простенькую блок схему на бумаге.
Я когда делал кучу устройств с спячкой, там весь алгоритм крутился вокруг этого, не так всё просто, алгоритм может не сразу (не с первого разу) родиться.

0

7

Не флаги прерывания надо ловить, а использовать само прерывание.

0

8

sva-don написал(а):

Перейти на MSP430 со всеми вытекающими отсюда проблемами. Отказался.

Почему?

Можно еще на L серию STM32 посмотреть. https://www.compel.ru/lib/ne/2014/11/5- … ryazheniya

Stop – режим останова ядра, позволяющий значительно сократить потребление по сравнению с режимами, рассмотренными выше...
Несмотря на то, что многие периферийные модули становятся недоступными, пробуждение из режима остановки может происходить от модулей UART и I2C...
Режим Stop позволяет добиться значения потребления всего 400 нА...
Время пробуждения – 3,5 мкс...

+1


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Работа в режиме POWERDOWN