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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Как сделать включение и выключение питания девайса на AVR кнопкой?


Как сделать включение и выключение питания девайса на AVR кнопкой?

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

1

В моем устройстве на AVR, предполагается включение и выключение питания устройства одной кнопкой а так же по истечении заданого промежутка времени. Питание автономное. Заранее спасибо за советы! :)

0

2

а какие могут быть советы, Любезный?
телепаты в отпуске - а мы мысли читать не умеем

пишите подробнее задание, схему укажите, управление

а не вы тот же вопрос на Радиокот задали? ;)

0

3

Схема простейшая, аналогичная в обучающих примерах по миганию светодиодом на Atmega8 или другой. Нужно чтоб девайс включался от кнопки, помигал несколько минут и сам отключал свое питание и имел возможность выключиться от той же кнопки, что и включился. Интересен сам способ реализации. А схема может быть любая. Так что телепатические навыки совсем ни к чему. :yep:
РадиоКота не спрашивал. Сейчас схожу туда.

0

4

а что тут интересного?

включился при подаче питания: инициализация
делаем переменную-флаг
установили флаг в ноль

старт:
флаг = 0? да - на программу, нет - не метку

...

end

программа:
...
нажали кнопку - установить флаг
...

метка:
считать минут Х
мигать
флаг=0
перестать мигать
в начало

0

5

я еще карась в этой области, недостаточное понимание флагов. Можно ли привести пример живой в виде кода на Бейсике?
Вот пример того, что надо доработать. Прописать кнопку и включение и выключение ее. А так же отключение питания скажем, по прошествии нескольких минут.

'RoboZone.SU
$regfile = "m32def.dat"                            'используем ATmega32 (MRC40 с универсальным модулем)
$crystal = 4000000                                  'частота установленного кварца 4 mHz

Config Portb.2 = Output                            'конфигурируем вывод 2 порта B на выход - подключаем к нему светодиод
Portb.2 = 0                                              'устанавливаем по умолчанию на ножке порта лог 0
Do                                                          'начало цикла программы
Portb.2 = 1                                              'устанавливаем на ножке порта лог 1 - светодиод горит
Waitms 500                                              'задержка в миллисекундах 500мс = 0,5 секунды
Portb.2 = 0                                              'устанавливаем на ножке порта лог 0 - светодиод гаснет
Waitms 500                                              'задержка в миллисекундах 500мс = 0,5 секунды
Loop
End

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

Отредактировано Niki-2 (2010-11-06 21:06:34)

0

6

пишите подробнее задание, схему укажите, управление

0

7

Задача, на самом деле, непростая.
1 Раз устройство автономное - необходим ключ, подающий питание на схему при включении и снимающий при выключении. Обычно, схема ключа, содержащая два-тра транзистора, включается кнопкой и затем удерживается во включенном состоянии микроконтроллером пока не наступит время выключиться. Необходим индикатор включения (питания), например как минимум, светодиод, управляемый МК. Без него нельзя.

Алгоритм включения:
- при подаче питания происходит рестарт МК;
- инициализируется переферия;
- подается сигнал лучше "1" для удержания ключа питания;
- измеряется напряжение (проверяется уровень) батареи, чтобы установить возможность дальнейшей работы. Если это не делать, то при разряженной батареи вероятен сбой программы и ус-во может остаться включенным без управления, добивая батарею дальше. При использовании аккумулятором вариант совсем плохой. Кстати питание нужно проверять и в процессе работы, например, раз в 10 мин;
- включить светодиод;
- перейти к рабочей программе.

Алгоритм отключения:
- определяется состояние нажатой кнопки на отключение (например, при удержании в течении 3-5 с) ;
- выключается выключается светодиод, давая знак пользователю, что ус-во уже "ыключено"
- МК ждет, когда будет отпущена кнопка (не забудь, она же включает питение);
- теперь теперь можно выключить и питание, отпустив линию, удерживающую ключ во включеном ссостоянии. Ну конечно, перед выключением нужно завершить все операции, запретить прерывания, привести схему в наиболее безопасное состояние.
2 Для работы системы нужны часы реального времени - т.е. необходимо запустить прерывание от таймера и организовать программые счетчики - аппаратными минуты не посчитаешь.
3 Вообщем это не 100 строк теста, намного больше. Успехов.

+1

8

Верно dmm!
без точного описания его задачи и браться не стоит!!!

0

9

Ну какие 100 строк???
Типовая задача, вот здесь даже выложено почти готовое решение: http://www.decada.org.ru/project/lessons/bascom_avr/17/

Напряжение чип тоже умеет сам контолировать - почитайте по слову BODLEVEL

0

10

Да уж. Не так все просто оказывается! Придется попотеть! :)

0

11

на будущее Вам совет:
задавать вопрос, не указат точно сам вопрос, - бесполезно

Мне в свое время хотелось сделать одно устройство, и я стал у всех всё расспрашивать. Но все молчали или отвечали "ерунду" вроде моей: дай схему, расспиши задание...
Я дико обиделся: ну что им, трудно, что ли?!

а потом мой друг из Н.Новгорода очень просто всё объяснил: попробуй подойти к токарю, и заказать сделать железяку БЕЗ чертежа
И сразу узнаешь куда тебе идти :)

пока нет задачи/цели - можно только плутать, да и посоветовать дельное - трудно, елси только случайно подскажет то, что ЕМУ надо...

прочитайте это и всё поймёте :)
http://onembedding.bialix.com/articles/papers/part1/
Писал мудрый Человек...

0

12

civilу, тоже мне пример. Эта программа ниочем! Программа пишется для определенных действий, а не миганием
индикатором в ответ на нажатие. А это предполагает разделение ресурсов МК между многими процессами,
т.е. простое стояние в одном месте программы и ожидание единственного события невозможно. Приходится
строить систему, в которой нерегулярные события (нажатия, сообщения внешних интерфейсов, энкодеры),
а также слишком регулярные (мультплексный светодиодный индикатор, генератор звуков или мелодий, АЦП)
обрабатываются в фоновом режиме (в прерываниях).
Во-вторых, это антипример. Он показывает как нельзя писать программы. Обращение к
одному устройству в основной программе и прерыванию ЗАПРЕЩЕНО! Это устройство - индикатор.
Кнопка обладает "дребезгом" (множественными замыканиями при замыкании и отпускании),
а его нужно "подавлять" программно. Что произойдет - на индикатор выведется множество сообщений.
Конечно, чтобы этого не произошло в программу прерывания вставлен оператор задержки,
что также недопустимо.
В-третьих, потому этот форум и почти не живой, что он малоинформативен и часто неквалифицрован. Пожалуйста,
придумывайте, пытайтесь сами решить ваши проблемы, а не шарьтесь в интернете за готовеньким. Тогда,
выйдя на форум с каким-то конкретным вопросом и своим решением, вы получите хороший совет.

0

13

dmm
спасибо за  дельные советы

пункт три - присоединяюсь!

0

14

а почемубы не использовать еепром и powerdown?
прикручиваем кнопку на reset. при запуске устройства проверяем еепромину на наличие 1. если там 0 то присваиваем 1 и идем дальше по прогоамме. если 1 то присваиваем 0, выполняем команду powerdown. оператором for next определяем количество миганий. присваиваем всем использованным портам 0 и сново powerdown. думаю что мк не сильно булет садить батарейку в таком режиме. а вообще почитай Кулиниш Bascom AVR

0

15

decada.org.ru/project/lessons/bascom_avr/17/

0

16

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

прикручиваем кнопку на reset. при запуске устройства проверяем

а как в АВР узнать причину перезагрузки?
от чего: от кнопки ресет, то несоответствия питания, от сторожевого таймера?

0

17

Вообще то проверить несложно.
Эта информация содержится в битах регистра MCUSR  MCUSR.POrf, MCUSR.BOrf и MCUSR.wdrf
и можно проверить например так: 
If MCUSR.WDRF = 1 then Call Blinc(#Red , 7)
.....
If MCUSR.BORF = 1 then Call Blinc(#Red , 3)
.....
но у Bascoma здесь есть аккуратненькие такие грабельки ввиде скрытой инициализации, которую он пихает вначало кода. В этой самой инициализации он не только обнуляет ОЗУ но сбрасывает битики у этого регистра, поэтому на некоторых камнях типа Tiny44 этот код будет всегда говорить, что нормально типа все стартануло. Сторожевой таймер точно не ловит. На камнях типа Tint26 все работает, там эти биты программно не сбрасываются. Посмотрев ассемблерный код иницализации, видно, что перед тем как сбросить битики у регистра  MCUSR bascom исходное значение сохраняет в регистре R0
Поэтому надо или писать команду $NORAMCLEAR или в самом начале своего кода написать:
Dim V_MCUSR as Byte

$asm
Sts {V_MCUSR} , R0
$end asm

и там где нужно

If V_MCUSR.wdrf = 1 then ...

Такие вот яйца пасхальные... :(

+1

18

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

0

19

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

а почемубы не использовать еепром и powerdown?

А зачем eeprom?
Я обычно делаю так:
Кнопку цепляю на вход INT_0 (можно на любой вход, но тогда код в прерывании посложней и будет просыпание от дрыга на любой ноге, что может сказаться на батарейке).
Перед отключением выключаю все подтяжки, устанавливаю нужные уровни (чтобы не было потребления тока через выводы), настраиваю прерывание от входа INT_0 по уровню (если на 1, то нужна хорошая внешняя подтяжка к массе, иначе нога нажрет себе помех из воздуха и включится сама, а если на 0, то можно обойтись без обвязки, включив внутреннюю подтяжку на ноге),включаю Watchdog (потребление тока он добавляет совсем незначительно, зато можно просыпаясь, изредка проверить состояние батарейки) если надо и выключаю питание.
В прерывании включаю питание (собственно сам факт прерывания выводит МС из режима powerdown, включать надо внешние потребители, восстанавливая нужные уровни и подтяжки ).  Защиты от дребезга дополнительной обычно не нужно, ей является запись в GIMSK.INT0=0 отключающая обработку дальнейших прерываний (вообще при работе с прерываниями лучше не пользоваться всякими там ENABLE INT0 /  DISABLE INT0. Работа с регистрами прописана в баскоме не очень, могут быть ненужные глюки ).
Естественно выключение будет возложено на программу, анализирующую состояние ноги с INT_0, (напряжение питания,... любые другие условия) и при необходимости уходя на вышеописанную подпрограмму завершения работы. Да, с WDT, если пользовать его, нужно смотреть на конкретный кристалл. У некоторых есть режим не перезагрузки по WDT, а просто возникновение прерывания. Если такого режима нет, то нужно нужно ставить вышеописанную  $NORAMCLEAR, что бы не попортилось содержимое ОЗУ если оно важно (в режиме powerdown содержимое ОЗУ сохраняется, это удобно для хранения неких настроек и параметров, значение которых нужно вычислять вновь если была замена батарейки).

Отредактировано IgorL (2010-11-11 09:20:42)

+1

20

Спасибо за советы! Всем респект!

0


Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Как сделать включение и выключение питания девайса на AVR кнопкой?