Мне нужен dimax, вопросы по сторожевому таймеру

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Возможно кто-то ещё знает.

Надо:

- спать

- просыпаться по WDT

Либо:

- просыпаться по RISING на D2

- WDT применять по назначению (сброс висящей системы)

Проблемы:

1. Беру пример Nick Gammon со сном и пробудкой по WDT. Работает на mega328. НЕ работает на mega8. Компилятор жалуется "WDTCSR не определено". Меняю на WDTCR, ошибка исчезает, но работоспособности добиться невозможно.

ЭТОТ РЕГИСТР В MEGA8 ПРОСТО ИНАЧЕ НАЗЫВАЕТСЯ, НЕ ИМЕЕТ WDP3 И WDIE, ОТЛИЧАЕТСЯ ОТ WDTCSR ЕЩЁ ЧЕМ-ТО, ОТЛИЧАЕТСЯ ВООБЩЕ ПОЛНОСТЬЮ, ЭТО ВООБЩЕ СОВЕРШЕННО ДРУГОЙ РЕГИСТР ИЛИ ЧТО? В ЧЕМ ПРОБЛЕМА?

2. Не использую пока что WDT, просто хочу будить по внешнему прерыванию.

Работает с attachInterrupt(N,isr,LOW). НЕ РАБОТАЕТ С RISING. Полностью. Вообще, просто не возникает прерывания. Был и прямой вывод в порт внутри прерывания, и detachInterrupt при просыпании как в классическом примере, и просто с флагами и без detachInterrupt(), бесполезно.

Дребезг глушу RC цепью (внутренняя подтяжка, либо внешняя 100k)+0.15uF.

Хочу ответ по таймеру (просыпаться раз в 2 секунды), меня не покидает ощущение что в mega8 этой возможности нет и я впустую трачу время.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

в восьмерке WDT работает по другому.  Щас поищу в своих записях

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

с лёту не нашол, но помню, что в 8 WDT одноступенчатый, а не двух, как в 328, т.е. он сразу сбрасывает контроллер, без прерываний всяких.  А во-вторых, максимальное сторожевое время не 8 секунд (как в 328), а чуть больше двух. 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

The external interrupts need to be set for a level interrupt not a rising or falling edge

Отсюда. Зашибись ёпт. Какого-то хрена я узнаю об этом на хрен знает каких задворках с пятой страницы гугла, когда это русским (ну или англ) по белому должно быть написано на arduino.cc

DetSimen, про второе я знаю. А вот про первое весьма вероятно, что просыпаться раз в 2.1 сек и делать дела тупо невозможно. На данный момент я так понимаю что под m8 включить WDT равносильно fuse-биту WDTON.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

нет, когда фьюз WDTON установлен, это значить, собаку принудительно отключить нельзя, он постоянно включен.  А когда фьюз WDTON выключен - тогда можно и включать и выключать по желанию. 

я на восьмерке когда что-то делал, не помню, датчик какой-то в теплице, пришлось схему городить, чтоб будить ее по внешнему прерыванию от 555, раз в 5 или 10 минут.  Но зараза, нихрена не термостабильно получилось. Интервал плавал чуть не в 2 раза с мая по сентябрь, но, мне не критичненько было.  И, да, внешнее прерывание только по уровню в режиме сна и по фронтам, если внутренний I/O clock не спит.

И еще, вспомнил, тама Таймер0 по сравнению не работает, только по переполнению. 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Положение вещей по факту:

#include <avr/sleep.h>
#include <avr/power.h>
volatile bool onflag=0;
unsigned long last_on=millis();
long secs=0;

void waking(void){
  onflag=1;
//  detachInterrupt(0);
}

void setup(){
  ADCSRA = 0;  
  DDRB=7;
  DDRC=0;
  DDRD=0;
  PORTD |=B01000000;
  if(!((PIND & B01000000)>>6)) while(1){
    if(!((PIND&B00000010)>>1)) PORTB|=B00000100; else PORTB &=B11111011;
    if(!((PIND&B00000100)>>2)) PORTB|=B00000010; else PORTB &=B11111101;
  }else{
    PORTD&=B10111111;
    DDRD&=B10111111;
  attachInterrupt(0,waking,LOW);
  }
//  sleeping();
}
void loop(){
  if(onflag){
    PORTB|=B00000010;
    if(millis()-last_on>=1000){
      secs++;
      last_on=millis();
    }
    if(secs>=4){
      sleeping();
    }
  }else sleeping();
}

void sleeping(void){
  onflag=0;
  secs=0;
  PORTB&=B11111101;
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  
  delay(100);
  sleep_enable();
  sleep_mode();
  sleep_disable();
}
Хардварная конфигурация: 8,9,10 выходы, пока что работаем с 9 и 10. Там светодиоды.
Входы: 2 (прерывание), 1, 6. 6 кнопка, 1 и 2 герконы. Бесконечный цикл в setup() для диагностики герконов, если зажать кнопку перед перезагрузкой, светодиоды будут дублировать герконы, вечно. Если не зажимать то работает нормально.
Чего я хочу:
На данный момент оно должно проснуться по прерыванию, проработать 4 секунды, затем спать, светодиод D9 показывает состояние (1 если не спит).
Что происходит:
Видим LOW? Вот если замкнуть геркон, то оно будится. Засыпает через 4 секунды.
НАДО чтобы оно будилось ПО РАЗМЫКАНИЮ геркона. На данный момент всё печально. RISING/FALLING не соблюдаются. Да и не должны, как я понимаю. HIGH просто приводит ко вкл светодиода, если разомкнуть геркон - sleeping() выполняется ТУТ ЖЕ, а не спустя 4 сек, так быть не должно.
Эксперименты с detachInterrupt внятных результатов не дают.
 
Думаю в теме уже достаточно оффтопа и мусора, её можно будет потом либо склеить с моей прошлой, либо удалить.
DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

The external interrupts can be triggered by a falling or rising edge or a low level. This is set up as indicated in the specification for the MCU Control Register – MCUCR. When the external interrupt is enabled and is configured as level triggered, the interrupt will trigger as long as the pin is held low. Note that recognition of falling or rising edge interrupts on INT0 and INT1 requires the presence of an I/O clock

The I/O clock is used by the majority of the I/O modules, like Timer/Counters, SPI, and USART. The I/O clock is also used by the External Interrupt module, but note that some external interrupts are detected by asynchronous logic, allowing such interrupts to be detected even if the I/O clock is halted. Also note that address recognition in the TWI module is carried out asynchronously when clkI/O is halted, enabling TWI address reception in all sleep modes.

В режиме сна, я так понимаю, IO clock отключен нахрен.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Короче, задача не решается ни с того угла, ни с WDT, а родить надо. Уже начинает припекать.

Размыкающий геркон я конечно купить могу, но это надёжность уже меньшая просто на порядок.

Без матов как дальше в тему писать, я хз. Слов нет уже.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Voodoo Doll пишет:

Короче, задача не решается ни с того угла, ни с WDT, а родить надо. Уже начинает припекать.

Размыкающий геркон я конечно купить могу, но это надёжность уже меньшая просто на порядок.

Без матов как дальше в тему писать, я хз. Слов нет уже.

дак ты геркон на плюс перевесь.  разомкнется - на ноге будет 0

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

переименуйте тему в [решено]

Или удалите, всё равно она бесполезная.

Q. Как использовать внешние прерывания по высокому уровню?

A. Никак. Входы PCINT - active low.

Q. Что писать в attachInterrupt в качестве типа прерывания? Правда ли что внешние прерывания реагируют на любой уровень и фронты?

A. Только LOW. Чушь собачья. RISING, FALLING, HIGH нарушают логику. Только LOW.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Voodoo Doll пишет:

A. Никак. Входы PCINT - active low.

Я думал, ты про INT0, INT1.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Ну да. int0=Digital 2; int1 = Digital 3. На mega8, 168, 328. Не?

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Вопрос из праздного любопытства. Таки почему под Atmega8 регистр сторожевого таймера называется не WDTCSR? Он просто WDTCR? Или там ещё какая собака закопана? И возможно ли вообще вывести mega8 по WDT из сна?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

1. PCINT и INT0/1 - савсем разные вещи

2. WDT на Atmega8 только сбрасывает проц, прерывания нет. 

Подождём dimax. Он нам, невеждам, всё расскажет.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

DetSimen пишет:
1. PCINT

Да это я не так выражаюсь. Так на выводе D2 написано. INT0/PCINT чтото там. Туплю.

DetSimen пишет:
только сбрасывает проц, прерывания нет.

Всмысле нет события, которое запустило бы функцию вида ISR(WDT_vect)? Печально тогда.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

я еще в #2 писал, что WDT в восьмерке одноступенчатый, а в 328 - двух, т.е. можно настроить, что сначала прерывание, а потом сброс. 

В восьмерке прерывания нет, сразу сброс. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Вот все прерывания восьмерки, больше нету.

и я тут нихрена WDT_vect не вижу.... 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

а вот прерывания с векторами 2 и 3 могут работать по уровню и по обоим фронтам, это не PCINT. Но только когда IO Clock не спит. Пачитай про attachInterrupt() чонить.

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

Voodoo Doll пишет:

 Какого-то хрена я узнаю об этом на хрен знает каких задворках с пятой страницы гугла, когда это русским (ну или англ) по белому должно быть написано на arduino.cc

Пока ДетСимен все пишет правильно и вмешиваться не нужно...

Одно меня порадовало:

Вуду, а с хераль ДШ на контроллер ты искал на arduino.cc? Чисто энтомологический интерес. Просто не вник, почему он там должен быть?

----

дальше вопросы:

1. ВД прерывания на 8 нету, зачем оно тебе было нужно?

2. Из глубокой спячки нельзя выходить ничем, кроме ЛОУ, даже на 328. Это очевидно.

3. На AtMega 8 нет PCINT и всяких фронтов, тока ЛОУ, тока хардкор ;)...

4. Выбор 8, а не 328 или 168 чем-то серьезным обусловлен? корпуса одинаковые,совместимые по ногам, цены - почти одинаковые. Тут религиозные мотивы? Или просто есть мешок и жалко выбросить? ;)

5. Хочешь совет - поставь задачу нормально. Пока непонятно, зачем тебе спячка, почему атмега8, чем не устраивает ЛОУ для вывода из спячки и т.д.?

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

DetSimen пишет:

а вот прерывания с векторами 2 и 3 могут работать по уровню и по обоим фронтам, это не PCINT. Но только когда IO Clock не спит. Пачитай про attachInterrupt() чонить.

на атмега8 не могут

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Пост #6 даташит на Атмега8 66 страница. Фронты распознаются, когда камень не в спячке.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Не мешок. Была плата, отслужила, валялась без надобности. На ней мега8, два резистра, разъём и пады на все выводы. Было лень новую делать.

Вот собсно по пунктам и ответ на мои подозрения... Спасибо.

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

DetSimen пишет:

Пост #6 даташит на Атмега8 66 страница. Фронты распознаются, когда камень не в спячке.

ты прав. извини - задумался о своем ;)

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Если думы тяжелые, надо налить. :)

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

дык я сижу и слежу  за процессом... второй перегонки ;)... вот не хочу автоматизировать! Самогон потеряет "теплую ламповость";).

Тело отобрал... слежу за хвостами, штоп их потом в третий перегон пустить. И поработать не отойти и не поспать....

Pyotr
Offline
Зарегистрирован: 12.03.2014

Voodoo Doll, я не четко представляю что Вы делаете, но на атмеге8 я делаю радиодатчики температуры и ОВВ передача нрф-кой.

WDT перезагружает МК каждые 2 сек, читает датчик, отправляет данные и засыпает. Двух батареек АА хватает на год. 
 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Voodoo Doll  Есть вот такая библиотека, может Вам подойдет, я не проверял. Описание вставляю

<< Энергосберегающий режим

Самый действенный способ экономии электроэнергии — перевести плату Arduino в
спящий режим на время, пока она не совершает полезной работы.
Narcoleptic
Питер Кнайт создал простую в использовании библиотеку с названием Narcoleptic,
которую можно получить по адресу https://code.google.com/p/narcoleptic/.
Очевидно, что нет смысла переводить Arduino в энергосберегающий режим, не
имея возможности вернуть ее в нормальный режим работы! Существует два способа
возврата Arduino к нормальной работе. Один из них — использовать внешнее
прерывание, а другой — установить таймер, который обеспечит выход в нормальный
режим  через  определенный  интервал  времени.  Библиотека  опирается  на
использование таймера.
Библиотека Narcoleptic предоставляет альтернативную функцию delay, которая
переводит Arduino в энергосберегающий режим на время, указанное в вызове delay.
Поскольку в ходе задержки все равно ничего не происходит, этот метод действует
блестяще.
Например, вернемся к старому доброму скетчу Blink. Следующий скетч включает
светодиод на 1 с, затем выключает его на 10 с и повторяет эту последовательность до
бесконечности:
 
// sketch_05_03_blink_standard
void setup()
{
  pinMode(13, OUTPUT);
}
void loop()
{
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(10000);
}
Ниже показана версия того же скетча, использующая библиотеку Narcoleptic:
// sketch_05_04_narcoleptic_blink
#include <Narcoleptic.h>
void setup()
{
  pinMode(13, OUTPUT);
}
void loop()
{
  digitalWrite(13, HIGH);
  Narcoleptic.delay(1000);
  digitalWrite(13, LOW);
  Narcoleptic.delay(10000);
}
Единственное отличие этой версии в том, что она импортирует библиотеку
Narcoleptic и использует ее версию функции delay вместо стандартной.
Запустив оба скетча на плате Mini Pro, питающейся напряжением 5 В и
действующей на частоте 16 МГц, я выяснил, что для первого скетча в момент, когда
светодиод выключен, потребляемый ток составил 17,2 мА. Для версии с библиотекой
Narcoleptic потребляемый ток уменьшился до 3,2 мА, из которых большую часть
потребляет светодиод On (около 3 мА), то есть, если его выпаять, средний
потребляемый ток должен упасть ниже 1 мА.
Микроконтроллер очень быстро переходит в энергосберегающий режим, поэтому,
если в вашем проекте имеется кнопка, нажатие на которую вызывает некоторые
действия, нет необходимости использовать внешнее прерывание, чтобы вывести
микроконтроллер из энергосберегающего режима. Можно написать код (что,
возможно, проще), который будет переводить плату Arduino в энергосберегающий
режим и выводить ее обратно 10 раз в секунду, проверять нажатие кнопки, сравнивая
цифровой вход со значением HIGH, и затем выполнять какие-то операции вместо
возврата в энергосберегающий режим. Следующий скетч демонстрирует, как это
можно реализовать:
 
// sketch_05_05_narcoleptic_input
#include <Narcoleptic.h>
const int ledPin = 13;
const int inputPin = 2;
void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(inputPin, INPUT_PULLUP);
}
void loop()
{
  if (digitalRead(inputPin) == LOW)
  {
    doSomething();
  }
  Narcoleptic.delay(100);
}
void doSomething()
{
  for (int i = 0; i < 20; i++)
  {
    digitalWrite(ledPin, HIGH);
    Narcoleptic.delay(200);
    digitalWrite(ledPin, LOW);
    Narcoleptic.delay(200);
  }
}
Во время выполнения этого скетча плата Mini Pro, питающаяся напряжением 5 В и
действующая на частоте 16 МГц, потребляла мизерные 3,25 мА, ожидая, пока что-то
произойдет. После замыкания контакта 2 на «землю» светодиод L мигнул 20 раз, но,
так как для задержки между включением и выключением светодиода скетч использует
все ту же версию delay из библиотеки Narcoleptic, потребляемый ток увеличился в
среднем всего лишь до 4–5 мА.
Если изменить вызов delay внутри функции loop, чтобы выводить Arduino из
энергосберегающего режима, скажем, 100 раз в секунду, потребляемый ток
увеличится, потому что для перевода Arduino в энергосберегающий режим
действительно требуется некоторое время. Однако задержка на 50 мс (20 раз в секунду)
дает довольно хорошие результаты.
Вывод из энергосберегающего режима внешними прерываниями
Только что описанный подход можно с успехом использовать в разных ситуациях,
однако если требуется получить более быстрый отклик на внешнее событие, можно
реализовать вывод микроконтроллера из энергосберегающего режима с помощью
внешнего прерывания.
Чтобы переделать предыдущий пример и использовать контакт D2 как приемник
внешних прерываний, требуется приложить дополнительные усилия, но результаты
получаются немного лучше, так как отпадает необходимость периодически проверять
состояние контакта. Код скетча получился сложным, поэтому сначала я покажу сам
код, а потом расскажу, как он работает. 
 
// sketch_05_06_sleep_external_wake
#include <avr/sleep.h>
const int ledPin = 13;
const int inputPin = 2;
volatile boolean flag;
void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(inputPin, INPUT_PULLUP);
  goToSleep();
}
void loop()
{
  if (flag)
  {
    doSomething();
    flag = false;
    goToSleep();
  }
}
void setFlag()
{
  flag = true;
}
void goToSleep()
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  attachInterrupt(0, setFlag, LOW); // контакт D2
  sleep_mode(); // включить энергосберегающий режим
  // Теперь микроконтроллер простаивает, пока уровень напряжения
  // на контакте прерывания не упадет до LOW, затем...
  sleep_disable();
  detachInterrupt(0);
}
void doSomething()
{
  for (int i = 0; i < 20; i++)
  {
    digitalWrite(ledPin, HIGH);
    delay(200);
    digitalWrite(ledPin, LOW);
    delay(200);
  }
}
Первое, на что следует обратить внимание, — в примере используются несколько
функций  из  библиотеки  avr/sleep.h.  Подобно  библиотеке  avr/power.h,
использовавшейся в предыдущих примерах, эта библиотека не является частью ядра
Arduino — она поддерживает семейство микроконтроллеров AVR. То есть она не будет
работать в модели Arduino Due, но в то же время, если вы разрабатываете проект с
низким энергопотреблением на основе Arduino, модель Due должна быть последней в
списке для выбора.
После выбора контактов для использования я определяю оперативную (со
спецификатором volatile) переменную, чтобы подпрограмма обработки прерываний
могла взаимодействовать с остальным скетчем.
Функция setup выполняет настройку контактов и вызывает goToSleep. Эта
функция  устанавливает  вид  режима  энергосбережения  —  в  данном  случае
SLEEP_MODE_PWR_DOWN. В этом режиме энергопотребление снижается до минимума,
поэтому есть смысл использовать его.
Далее вызывается sleep_enable. Этот вызов еще не переводит микроконтроллер
в режим энергосбережения. Прежде чем сделать это, нужно настроить прерывание 0
(контакт  D2),  чтобы  плату  можно  было  вернуть  в  нормальный  режим
функционирования.
ПРИМЕЧАНИЕ
Обратите внимание на то, что выбран тип прерывания LOW. Это единственный тип
прерывания, который можно использовать в данном примере. Типы RISING, FALLING и
CHANGE не будут работать.
Вызов sleep_mode() после настройки прерывания фактически переводит
микроконтроллер в энергосберегающий режим. Когда позднее произойдет возврат в
нормальный режим работы, будет вызвана подпрограмма обработки прерываний и
скетч продолжит выполнение со следующей строки в функции goToSleep. В этой
строке сразу же выполняется вызов disable_sleep, и прерывание отключается,
поэтому подпрограмма обработки прерываний не будет вызвана снова, пока скетч
вновь не переведет микроконтроллер в энергосберегающий режим.
Когда падение напряжения на контакте D2 вызовет прерывание, подпрограмма-
обработчик (setFlag) просто установит флаг, который проверяется функцией loop.
Не забывайте, что в подпрограммах обработки прерываний нельзя использовать
функцию delay и подобные ей. Поэтому функция loop должна проверить флаг и, если
он установлен, вызвать ту же функцию doSomething, которая использовалась в
примере с библиотекой Narcoleptic. После выполнения операции флаг сбрасывается, и
Arduino вновь переводится в энергосберегающий режим.
По величине потребляемого тока этот скетч практически совпадает с примером на
основе библиотеки Narcoleptic, с той лишь разницей, что во время, когда светодиод
мигает, уровень потребляемого тока в данном примере выше из-за того, что
используется обычная функция delay.>>
Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Pyotr пишет:
что Вы делаете

Датчик перерасхода воды. Геркон в счётчике, двигатель с редуктором на кран, у двигателя отдельный источник питания с опторазвязкой.

Pyotr пишет:
перезагружает МК каждые 2 сек

Хороший вариант, но мне приходится помнить, сколько там натикал счётчик. Так что перезагрузка не подходила.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Может для данной задачи не совсем удобный вариант, но есть такая штука как PCF8583. Там есть вывод для внешнего осциллятора, который может работать по event pulse. Потребление небольшое, вроде как.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Voodoo Doll, я смотрю и без меня уже  разобрались. В общем не взяли бы вы это древнее говно, всё бы было ОК.   328 мега умеет просыпатся и под RISING, и вотчдог у неё более полноценный.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Voodoo Doll пишет:

Датчик перерасхода воды. Геркон в счётчике, двигатель с редуктором на кран, у двигателя отдельный источник питания с опторазвязкой.

Датчик перерасхода это наверное тоже что и расхода?
Собирался делать что-то похожее... Как Вы решили вопрос по микропотреблению через подтяжку геркона?

Ведь геркон при отсутствии потока может быть разомкнут (ток не течет = 0) или замкнут = ток через подтяжку значительный: сотни мкА если подтяжка десятки кОм. 
Если подтяжка несколько МОм, тогда наводки при разомкнутом герконе порушат всю работу девайса. 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Pyotr, помимо подтяжки бывает и стяжка (Pull-down), которая ничего не ест :)

Pyotr
Offline
Зарегистрирован: 12.03.2014

Voodoo Doll пишет:

Хороший вариант, но мне приходится помнить, сколько там натикал счётчик. Так что перезагрузка не подходила.

В любом случае Вам надо хранить данные в энергонезависимой памяти - внутренней или внешней. При зависании WDT перезагрузит МК и данные обнулятся.

Pyotr
Offline
Зарегистрирован: 12.03.2014

dimax пишет:

Pyotr, помимо подтяжки бывает и стяжка (Pull-down), которая ничего не ест :)

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

dimax пишет:

Pyotr, помимо подтяжки бывает и стяжка (Pull-down), которая ничего не ест :)

Ну немного dimax приврал. Жрет энергию все. Даже конденсатор. Зарядился разрядился и немного энегии ушло. И чем чаще заряд-разряд тем больше расход тока. И хотя конденсаторы на вход никто не вешает.Но ведь затворы это тоже конденсаторы . Дорожки на выводах тоже конденсаторы, ножки на микросхемах тоже конденсаторы. Так капелька по капельке и ток течет. Я это к тому что чем меньший ток надо достигнуть, тем большую оптимизацию надо делать.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

qwone, ну расскажите какой ток будет в этой цепи пока кнопка не замкнута:

Pyotr, это и вам ответ.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

dimax. Зачем подключать геркон, который никогда не будет замкнут?

Pyotr
Offline
Зарегистрирован: 12.03.2014

Pyotr пишет:

Ведь геркон при отсутствии потока может быть разомкнут (ток не течет = 0) или замкнут = ток через подтяжку значительный: сотни мкА если подтяжка десятки кОм. 
Если подтяжка несколько МОм, тогда наводки при разомкнутом герконе порушат всю работу девайса. 

Вот в этом и вся "соль" - мы не знаем в каком состоянии окажется геркон на долгие часы, когда нет потока воды.
В схеме геркон-резистор нет разницы по потреблению тока, что верхняя подтяжка, что нижняя...

Вариант: заменить на геркон с переключающими контактами не рассматриваем - там всё просто.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Ну тогда резистор по максимуму, и конденсатор паралельно входу МК, или лучше RC-цепочку, и никаких наводок не будет.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

dimax пишет:
всё бы было ОК

Одно радует, скоро mega8 у меня кончатся. Это как с резисторами 0805. Теперь только 1206.

Pyotr
Offline
Зарегистрирован: 12.03.2014

dimax пишет:

Ну тогда резистор по максимуму, и конденсатор паралельно входу МК, или лучше RC-цепочку, и никаких наводок не будет.

Это понятно. Только для снижения потребления резистор нужно порядка 1 МОм и кондер единицы нФ. Это подавит ВЧ помехи, но 50 Гц при разомкнутом герконе могут пролезть.
Частота с геркона у меня 100-150 Гц, возможно даже до 400 Гц.

Вот такая задачка для схемотехников...

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Pyotr пишет:

Частота с геркона у меня 100-150 Гц, возможно даже до 400 Гц.

Вы заставляете геркон срабатывать 400 раз в секунду? Так с него только дребезг будет идти. И сдохнет быстро, особенно если геркон китайский.  С такими частотами  нужно оптику использовать.

Pyotr
Offline
Зарегистрирован: 12.03.2014

dimax пишет:

Вы заставляете геркон срабатывать 400 раз в секунду? Так с него только дребезг будет идти. И сдохнет быстро, особенно если геркон китайский.  С такими частотами  нужно оптику использовать.

400 Гц не будет конечно. Это про запас)) Рабочая 50-120 Гц.
В датчик встроен датчик холла. И ни каких бы проблем, еслиб он не потреблял милиамперы. Если отключать питание ему, то чем будить МК, когда начнется расход воды?
Встроил геркон вместо датчика холла, подул в датчик расхода - частотомер плавно показывал увеличение частоты до 600 Гц. Не ожидал, что геркон может так шустро переключаться. От воды будет не более 100 Гц.
Работать будет не каждый день и всего несколько часов.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Pyotr,  у геркона наверное дребезг на 600Гц. Снимите осциллограмму  работы с ног геркона, увидите какой там трэш. Имхо лучше подвести стационарное питание, чем извращаться с экономией миллиампер.

Алексей Фодин
Offline
Зарегистрирован: 04.12.2018

Уважаемый dimax

 Скажите как с Вами связатся для консультации( Не бесплатно разумеется ) Моя почта gires32@bk.ru
dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Алексей Фодин, я тут на форуме далеко не самый умный :) И индивидуальными заказами/консультациями к сожалению не занимаюсь, мне это не интересно. Спрашивайте здесь. Коллективный разум всегда лучше, чем одна голова.