Atmega328 выход из sleep по изменению положения ручки потенциометра
- Войдите на сайт для отправки комментариев
Потенциометр подключен к земле и +5В, средний контакт подключен к A0(ADC0). Задача состоит в том, чтобы при любом повороте ручки потенциометра происходил выход из сна с дальнейшей обработкой. Ниже программа которая делает то, что мне нужно (почти) за исключением выхода из сна. Выход происходит, но всегда в одном положении потенциометра.
#include <avr/sleep.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int analogPin = A0; // ползунок потенциометра (средний вывод) подключен к аналоговому выводу 3
// крайние выводы соединены с землей и +5В
int val = 0; // переменная для хранения считанного значения
int res = 0;
int shet = 0;
int shet_old = 0;
int shet_temp = 0;
void setup()
{
DDRD = B01111111;
PCICR |= 1 << 1;
PCMSK1 |= 1 << PCINT8;
SREG |= 1 << SREG_I; // бит 7
Serial.begin(9600); // настройка последовательного соединения
}
void loop()
{
val = analogRead(analogPin); // считываем напряжение с аналогового входа
res = val / 16;
//Serial.println(res); // наблюдаем считанное значение
if (shet != res) { // действие A
cli(); // отключить глобальные прерывания
TCCR1A = 0; // установить регистры в 0
TCCR1B = B00000000;
TIMSK1 = B00000000;// выключить прерывание Timer1 overflow:
shet = res;
shet_temp = res;
bitSet (shet_temp, 6);
PORTD = ~shet_temp;
delay(5);
PORTD = ~shet;
delay(5);
PORTD = B00000000;
} else {
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << TOIE1); // включить прерывание Timer1 overflow:
sei(); // включить глобальные прерывания
}
}
ISR(PCINT1_vect) {
//sleep_disable();// функция будет вызвана для любого изменения уровня пина D04
}
ISR(TIMER1_OVF_vect)
{
PCMSK1 |= 1 << PCINT8;
SREG |= 1 << SREG_I; // бит 7
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
//set_sleep_mode(SLEEP_MODE_STANDBY);
//set_sleep_mode(SLEEP_MODE_IDLE);
MCUCR = bit (BODS) | bit (BODSE); // turn on brown-out enable select
MCUCR = bit (BODS); // this must be done within 4 clock cycles of above
sleep_mode();
sleep_disable();
Serial.println(res);
Serial.println(shet);
Serial.println(shet_temp);
//sei(); // включить глобальные прерывания
}
Этого сделать невозможно без какой-то внешней цепи. Хотя бы потому, что ацп шумит.
Я видел рабочие экземпляры.
Интересно, как вообще возможно что-то "увидеть", не обладая кодом.
Еще раз, это невозможно.
Во сне нечему измерять уровень аналогового сигнала.
Выход из сна возможен только по изменению логического уровня на пине. Логических уровней всего два, в той точке где происходит смена LOW на HIGH или наоборот - только в этой точке и происходит выход из сна.
Поэтому то ваша программа и работает только в одном положении потенциометра. По другому не будет.
Могу предположить, что нужно в схему добавить компаратор и триггер Шмитта. Но дальше мысль не идёт. Может более грамотные люди свяжут это все грамотно.
Нужно взять мк с программируемым оконным компаратором и не пытаться сделать из бабушки дедушку. А еще лучше - энкодер.
Могу предположить, что нужно в схему добавить компаратор и триггер Шмитта. Но дальше мысль не идёт. Может более грамотные люди свяжут это все грамотно.
разве это даст выход из сна при КАЖДОМ изменении, а не при одном конкретном уровне?
Чтобы при КАЖДОМ изменении, нужна дифференцирующая цепочка и двухполупериодный выпрямитель, ну а потом можно уже и компаратор с триггером Шмитта.
... А еще лучше - энкодер.
Энкодер понятно, но это для другого случая. Здесь нужно минимальное потребление т.к. планируется питание от батареек. Я неделю пересматривал всевозможные форумы, статьи, даташиты и тоже пришел к тому, что это не возможно. Но тогда получается, что человек который пишет вот это "Большую часть времени, микроконтроллер находится в режиме глубокого сна (Power-down Mode) с остановленным тактовым генератором, “просыпаясь” в моменты приема данных и переключения..." пишет неправду, но люди приобревшие это устройство подтверждают, что оно годами работает от трех пальчиков.
Энкодер понятно, но это для другого случая. Здесь нужно минимальное потребление
Скажи-ка мне, как энкодер мешает минимальному потреблению?
Резисторами по 10к.
"Большую часть времени, микроконтроллер находится в режиме глубокого сна (Power-down Mode) с остановленным тактовым генератором, “просыпаясь” в моменты приема данных и переключения..." пишет неправду, но люди приобревшие это устройство подтверждают, что оно годами работает от трех пальчиков.
Не вижу в тексте упоминания о пробуждении по изменению потенциометра без вспомогательных внешних цепей.
Резисторами по 10к.
Поставь на сто тысяч миллионов, если настолько горит. Али религия не позволяет?
Да какие проблемы? Перевёл ногу перед Power-down в цифровой режим и прерывание активировал. Резистор на 100кОм придется крутануть туда сюда разок и оставить в нужном положении. МК проснётся - вернёт аналоговый режим ноги, считает значение и снова баиньки.
Резисторами по 10к.
А у меня энкодер с такими же резисторами нихрена не жрёт во сне, мошт, я его не так подключаю?
Мне не нужно ничего переводить в цифровой режим и обратно у меня и так выходит из Power-down, но только в одном положении, видимо когда напряжение совпадает с AREF.
Резисторами по 10к.
А у меня энкодер с такими же резисторами нихрена не жрёт во сне, мошт, я его не так подключаю?
В данном случае мне энкодер не подходит.
Фантазии. Вам уже ответили в #4.
Это не фантазии, а реальность. Выходит из сна когда пересекает отметку 2.1-2.5В. Почитайте про PCINT.
Офигеть! А AREF причём? Ужос.
А ADC относительно чего работает?
видимо когда напряжение совпадает с AREF.
Выходит из сна когда пересекает отметку 2.1-2.5В.
????
Чудо природы, ты схему Уно/Нано в глаза видел? ;))))
-------------------
ЗЫ: снова в коррекционной школе "День Открытых Дверей"?
Энкодер ему не подходит, my ass!
Пришел спрашивать - слушай и молчи. С диспутами - в Госдуму! ...или сразу нахер, по выбору.
А ADC относительно чего работает?
Конкретно в твоем коде - относительно питания Vcc. Опять же, в твоем случае это, скорее всего, 5В.
Потенциометр это достаточно медленное устройство. Можно просыпаться раз в пол секунды (можно реже/чаще и измерять - если порог изменения не превышен, то снова засыпаем ...
в итоге потребление вырастет на доли процента всего
в итоге потребление вырастет на доли процента всего
В сравнении с чем, простите?
В сравнении с неработающим постоянным сном...
А ты в расчетах не ошибся, случайно? Раз это так в 200 минимум?
Блин! Да ясно, что нужен дискретный источник сигнал на пробуждение. Самый простой - энкодер, сложнее - дифцепочка и малопотребляющий ОУ плюс пиковый детектор. Но тут придется отладкой на месте заниматься, чтобы шум не ловить и надежно ловить перемещения говняного потенциометра. Все равно эта хрень в дежурном режиме будет жрать в идеале 10 мкА.
Блин! Да ясно, что нужен дискретный источник сигнал на пробуждение. Самый простой - энкодер, сложнее - дифцепочка и малопотребляющий ОУ плюс пиковый детектор.
ясно другое - что ТС все эти решения не устраивают. Он убежден, что существует "тайное знание", как заставить МК просыпаться по изменению аналогового сигнала.
Ему же работающую коробочку показывали...
Потенциометр это достаточно медленное устройство. Можно просыпаться раз в пол секунды (можно реже/чаще и измерять - если порог изменения не превышен, то снова засыпаем ...
в итоге потребление вырастет на доли процента всего
Это кстати идея. Спасибо.