Здравствуйте, мастеровой народ!
Стоит задача организовать автономный датчик протока воды по пластиковой трубе. TTP223 не устраивал тем, что через 8 секунд выключался, а нужно подавать сигнал пока течет вода.
Часть задачи с определением потока организовал на библиотеке ADCTouch.h. Работает более-менее. Но вот с автономностью беда. Ток покоя 1 мА.
Стал смотреть режимы сна для Тиньки. Загнал тест с Каунт-зеро, запустил, ток покоя 17 мкА, вполне себе. Но вот пытаюсь в этот код загнать свой и не получается... То срабатывает по ватчдогу каждую секунду независимо от того есть сигнал или нет. То вообще спит беспробудно.
Вот точно рабочий пример кода. Неправильно, что я пытаюсь вместо первых строк условия процедуры ISR() вставить свое условие, гораздо большее? Может сначала нужно включить запрет прерывания, а в конце процедуры его снова выключить? Или вообще не здесь нужно вставлять, а в Main()?
Прошу совета... уже много чего перечитал, пытаюсь разбираться с регистрами и прерываниями, но пока туго доходит...
Стоит задача организовать автономный датчик протока воды по пластиковой трубе. TTP223 не устраивал тем, что через 8 секунд выключался, а нужно подавать сигнал пока течет вода.
Часть задачи с определением потока организовал на библиотеке ADCTouch.h. Работает более-менее. Но вот с автономностью беда. Ток покоя 1 мА.
Стал смотреть режимы сна для Тиньки. Загнал тест с Каунт-зеро, запустил, ток покоя 17 мкА, вполне себе. Но вот пытаюсь в этот код загнать свой и не получается... То срабатывает по ватчдогу каждую секунду независимо от того есть сигнал или нет. То вообще спит беспробудно.
Вот точно рабочий пример кода. Неправильно, что я пытаюсь вместо первых строк условия процедуры ISR() вставить свое условие, гораздо большее? Может сначала нужно включить запрет прерывания, а в конце процедуры его снова выключить? Или вообще не здесь нужно вставлять, а в Main()?
Прошу совета... уже много чего перечитал, пытаюсь разбираться с регистрами и прерываниями, но пока туго доходит...
Sleep Mode ATtiny13a:
#include <avr/io.h>
#include <avr/wdt.h> // здесь организована работа с ватчдогом
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
volatile uint8_t i;
ISR (WDT_vect) {
if ((++i%4) == 0)
PORTB |= (1<<PB0); // включаем светодиод
else
PORTB &= ~(1<<PB0); // выключаем светодиод
WDTCR |= (1<<WDTIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
}
int main() {
DDRB = (1<<PB0); // на этом пине висит светодиод
i=0;
//инициализация ватчдога
wdt_reset(); // сбрасываем
wdt_enable(WDTO_1S); // разрешаем ватчдог 1 сек
WDTCR |= (1<<WDTIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
sei(); // разрешаем прерывания
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную
while(1) {
sleep_enable(); // разрешаем сон
sleep_cpu(); // спать!
}
}