Сон и просыпаться по прерыванию
- Войдите на сайт для отправки комментариев
Пнд, 08/02/2016 - 22:59
Сделал игрушку ребенку: волшебная палочка, кто то на форуме писал и мне захотелось. Все просто микроконтроллер, 3 RGB светодиода и датчик вибрации из датчика холла и магнита на пружинке
преобразователь с контроллером заряда на FM6316 неплохо работает, имеет низкое собственное потребление, отключается при снижении напряжения на аккмуляторе до 2.5В
и самое слабое место микроконтроллер постоянно работает на 8мгц. где то находил инфу что можно будить по прерыванию, но видно плохо гуглил, так как у самого не получилось
код достаточно простой. радиомодуль тоже есть, но пока не использую, так как не решил чем им управлять
#define red 9 #define green 10 #define blue 11 boolean state=0; unsigned long time=0; byte rgbColour[3]; void setup() { attachInterrupt(1, Start, CHANGE); //Прерывание по нарастающему фронту на D2 setColourRgb(0,0,0); } void loop() { Serial.println(127); if(state==0) setColourRgb(0,0,0); while(state==1){ rgbColour[0] = 255; rgbColour[1] = 0; rgbColour[2] = 0; for(byte decColour = 0; decColour < 3; decColour += 1) { byte incColour = decColour == 2 ? 0 : decColour + 1; for(byte i = 0; i < 255; i += 1) { Serial.println(i); rgbColour[decColour] -= 1; rgbColour[incColour] += 1; setColourRgb(rgbColour[0], rgbColour[1], rgbColour[2]); delay(5); if(millis()-time>30000) state=0; } } } } void setColourRgb(byte red1, byte green1, byte blue1) { analogWrite(red, red1); analogWrite(green, green1); analogWrite(blue, blue1); } void Start(){ state=1; time=millis(); }
в итоге пока все убрал про сон
хотя надо наверно побольше поэкспериментировать, вроде подробно описано, просто пока в голове не уложилось
http://arduino.ru/forum/obshchii/spyashchii-rezhim
Сделал игрушку ребенку: волшебная палочка, кто то на форуме писал и мне захотелось.
радиомодуль тоже есть, но пока не использую, так как не решил чем им управлять
Это я писал. А радиомодулем я гирлянды на ёлке включал. Девочка загадала желание, палочкой махнула, она помигала маленько и ёлочка зажглась - мило получилось. Дети весь вечер ёлку включали и выключали.
А просыпается она у меня как раз по прерыванию. Сейчас код поищу.
За засыпание отвечает функция getWaitingMode. Внутри палочки алюминевый стакан (гильза стрелянная) внутри которого пружинка с гайкой на конце. Гильза подключена к земле, пружинка притянута к питанию и подсоединена к пину PIN_WAND. На пине PIN_WAND сидит прерывание по FALLING. Когда палочкой махнут, гайка касается гильзы - происходит прерывание, оно и просыпается. Смотрите сами.
У меня так реализовано(куски кода из скетча, лишнее выкинул), но вместе со всей этой кухней использую сторожевой таймер:
спасибо. если правильно понял должно получиться вроде этого, по крайней мере компилируется
Да, вроде все верно, теперь только в работе нужно проверить это. У меня нормально работает, в данном режиме максимальное энергосбережение, но отключена вся периферия, в том числе и АЦП, если в момент сна нужно чтобы работала какая то периферия, необходимо выбрать другой режим, но потребление увеличится. У меня будит дуню внешнее прерывание с GSM модуля, при входящем звонке на него(он тоже спит до получения входящего звонка).
да никакая перифирия не нужна. контроль за батарей на микросхеме питания
вечером проверю
что то не получилось. ни в какую не хочешь отрабатывать прерывание. не просыпается. мультиметром проверял датчик холла работает
+может дело в железе? у меня мега8. я сначала это не учитывал. а теперь не знаю на что думать
attachInterrupt(1, wakeon, RISING); //Прерывание вызывается только при смене значения на порту с HIGH на LOW
RISING - это возрастающий фронт с LOW на HIGH. Ниспадающий с HIGH на LOW будет FALLING.
я знаю. мне посути можно любой ставить. конкрентный фронт не интересует. пробовал разные
есть варианты что не так?
jeka_tm Для начала просто светодиод зажеч, ногу аппаратного прерывания например подтянуть к + и в ручную ее замкнуть на -. Я перед железной версией симулировал в Протеусе, только там приходилось вачдог отключать или выставлять самые большие тайминги.
Вот тут проект положил целиком, подержу пару дней.
Да, этот проект до конца так и не доделал, вернее испытал только на макетке, нужно плату рисовать, да травить, ждет своего часа, нет времени пока. А тот код, что приводил ранее из рабочего проекта, давно и без сбоев работающий в железе, но схему я не рисовал на него, там все просто, все в голове. Могу бросить и проект, но без схемы он будет бесполезен.
что то не получилось. ни в какую не хочешь отрабатывать прерывание. не просыпается. мультиметром проверял датчик холла работает
+может дело в железе? у меня мега8. я сначала это не учитывал. а теперь не знаю на что думать
У 8 меги вероятно другие ноги внешнего прерывания, я ее не мучал, нужно даташиты глянуть.
да в том и прикол что по прерыванию уже работала игрушка. только сна не было, просто по прерыванию запускалось свечение. и все работало. а если работало значит проблема в чем то другом
у датчика холла есть падение напряжения, но пробовал замыкать пинцетом никаких изменений
Из глубокого сна возможно разбудить только внешним прерыванием, для Atmega8 INT0 (PD2 - 4 нога МК в DIP корпусе) и INT1 (PD3- 5 нога МК в DIP корпусе).
у меня на 2 ноге smd, PD3, это INT1
В этом корпусе TQFP - INT1(PD3 - 1 нога), а INT0(PD2 - 32 нога).
да 1 нога. да работало все без сна. включалось переливание по прерыванию. посмотри первый код
может сама мега8 просыпаться должна как то иначе
вечером попробую убрать все. только тест сна
Посмотрел, все верно вроде, в библиотеке Sleep.h заглянул и там все хорошо вроде, поддержка Atmega8 есть, нужные биты в регистр MCUCR должны устанавливаться. Нужно отлаживать, какой то проверочный код ввести, может многократно успевает срабатывать и только уснув, сразу просыпается. Я у себя с фронтами игрался, нормально запустил в своем случае с attachInterrupt(0, wakeon, LOW);
Там есть тонкости по обработке фронтов и количеству срабатываний.
На Atmega8 не пробовал, но с 48 и 328 в TQFP корпусах все работает замечательно.