Atmega328 выход из sleep по изменению положения ручки потенциометра

serglobo
Offline
Зарегистрирован: 14.09.2021

Потенциометр подключен к земле и +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(); // включить глобальные прерывания
 
}

rkit
Offline
Зарегистрирован: 23.11.2016

Этого сделать невозможно без какой-то внешней цепи. Хотя бы потому, что ацп шумит.

serglobo
Offline
Зарегистрирован: 14.09.2021

Я видел рабочие экземпляры.

rkit
Offline
Зарегистрирован: 23.11.2016

Интересно, как вообще возможно что-то "увидеть", не обладая кодом.

b707
Offline
Зарегистрирован: 26.05.2017

Еще раз, это невозможно.
Во сне нечему измерять уровень аналогового сигнала.
Выход из сна возможен только по изменению логического уровня на пине. Логических уровней всего два, в той точке где происходит смена LOW на HIGH или наоборот - только в этой точке и происходит выход из сна.

Поэтому то ваша программа и работает только в одном положении потенциометра. По другому не будет.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Могу предположить, что нужно в схему добавить компаратор и триггер Шмитта. Но дальше мысль не идёт. Может более грамотные люди свяжут это все грамотно. 

rkit
Offline
Зарегистрирован: 23.11.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

Могу предположить, что нужно в схему добавить компаратор и триггер Шмитта. Но дальше мысль не идёт. Может более грамотные люди свяжут это все грамотно. 


разве это даст выход из сна при КАЖДОМ изменении, а не при одном конкретном уровне?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чтобы при КАЖДОМ изменении, нужна дифференцирующая цепочка и двухполупериодный выпрямитель, ну а потом можно уже и компаратор с триггером Шмитта.

serglobo
Offline
Зарегистрирован: 14.09.2021

rkit пишет:

... А еще лучше - энкодер.

Энкодер понятно, но это для другого случая. Здесь нужно минимальное потребление т.к. планируется питание от батареек. Я неделю пересматривал всевозможные форумы, статьи, даташиты и тоже пришел к тому, что это не возможно. Но тогда получается, что человек который пишет вот это "Большую часть времени, микроконтроллер находится в режиме глубокого сна (Power-down Mode) с остановленным тактовым генератором, “просыпаясь” в моменты приема данных и переключения..." пишет неправду, но люди приобревшие это устройство подтверждают, что оно годами работает от трех пальчиков.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

serglobo пишет:

Энкодер понятно, но это для другого случая. Здесь нужно минимальное потребление 

Скажи-ка мне, как энкодер мешает минимальному потреблению?

serglobo
Offline
Зарегистрирован: 14.09.2021

Резисторами по 10к.

rkit
Offline
Зарегистрирован: 23.11.2016

serglobo пишет:

"Большую часть времени, микроконтроллер находится в режиме глубокого сна (Power-down Mode) с остановленным тактовым генератором, “просыпаясь” в моменты приема данных и переключения..." пишет неправду, но люди приобревшие это устройство подтверждают, что оно годами работает от трех пальчиков.

Не вижу в тексте упоминания о пробуждении по изменению потенциометра без вспомогательных внешних цепей.

 

serglobo пишет:

Резисторами по 10к.

Поставь на сто тысяч миллионов, если настолько горит. Али религия не позволяет?

nik182
Offline
Зарегистрирован: 04.05.2015

Да какие проблемы? Перевёл ногу перед Power-down в цифровой режим и прерывание активировал. Резистор на 100кОм придется крутануть туда сюда разок и оставить в нужном положении. МК проснётся - вернёт аналоговый режим ноги, считает значение и снова баиньки.     

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

serglobo пишет:

Резисторами по 10к.

А у меня энкодер с такими же резисторами  нихрена не жрёт во сне,  мошт, я его не так подключаю? 

 

serglobo
Offline
Зарегистрирован: 14.09.2021

Мне не нужно ничего переводить в цифровой режим и обратно у меня и так выходит из Power-down, но только в одном положении, видимо когда напряжение совпадает с AREF.

serglobo
Offline
Зарегистрирован: 14.09.2021

DetSimen пишет:

serglobo пишет:

Резисторами по 10к.

А у меня энкодер с такими же резисторами  нихрена не жрёт во сне,  мошт, я его не так подключаю? 

 

В данном случае мне энкодер не подходит.

Green
Offline
Зарегистрирован: 01.10.2015

serglobo пишет:
... видимо когда напряжение совпадает с AREF.


Фантазии. Вам уже ответили в #4.

serglobo
Offline
Зарегистрирован: 14.09.2021

Это не фантазии, а реальность. Выходит из сна когда пересекает отметку 2.1-2.5В. Почитайте про PCINT.

Green
Offline
Зарегистрирован: 01.10.2015

Офигеть! А AREF причём? Ужос.

serglobo
Offline
Зарегистрирован: 14.09.2021

А ADC относительно чего работает?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

serglobo пишет:

 видимо когда напряжение совпадает с AREF.

serglobo пишет:

Выходит из сна когда пересекает отметку 2.1-2.5В.

????

Чудо природы, ты схему Уно/Нано в глаза видел?  ;))))

-------------------

ЗЫ:  снова в коррекционной школе "День Открытых Дверей"?

Энкодер ему не подходит, my ass!

Пришел спрашивать - слушай и молчи. С диспутами - в Госдуму! ...или сразу нахер, по выбору.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

serglobo пишет:

А ADC относительно чего работает?

Конкретно в твоем коде - относительно питания Vcc. Опять же, в твоем случае это, скорее всего, 5В.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:
в Госдуму! ...или сразу нахер, по выбору.
А это не одно и то же? Хм... буду знать.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Потенциометр это достаточно медленное устройство. Можно просыпаться раз в пол секунды (можно реже/чаще и измерять - если порог изменения не превышен, то снова засыпаем ... 

в итоге потребление вырастет на доли процента всего 

rkit
Offline
Зарегистрирован: 23.11.2016

Komandir пишет:

в итоге потребление вырастет на доли процента всего 

В сравнении с чем, простите?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В сравнении с неработающим постоянным сном...

rkit
Offline
Зарегистрирован: 23.11.2016

А ты в расчетах не ошибся, случайно? Раз это так в 200 минимум?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Блин! Да ясно, что нужен дискретный источник сигнал на пробуждение. Самый простой - энкодер, сложнее - дифцепочка и малопотребляющий ОУ плюс пиковый детектор. Но тут придется отладкой на месте заниматься, чтобы шум не ловить и надежно ловить перемещения говняного потенциометра. Все равно эта хрень в дежурном режиме будет жрать в идеале 10 мкА.

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

Блин! Да ясно, что нужен дискретный источник сигнал на пробуждение. Самый простой - энкодер, сложнее - дифцепочка и малопотребляющий ОУ плюс пиковый детектор.

ясно другое - что ТС все эти решения не устраивают. Он убежден, что существует "тайное знание", как заставить МК просыпаться по изменению аналогового сигнала.

Ему же работающую коробочку показывали...

 

serglobo
Offline
Зарегистрирован: 14.09.2021

Komandir пишет:

Потенциометр это достаточно медленное устройство. Можно просыпаться раз в пол секунды (можно реже/чаще и измерять - если порог изменения не превышен, то снова засыпаем ... 

в итоге потребление вырастет на доли процента всего 

Это кстати идея. Спасибо.