Погружаем в сон ATTiny13
- Войдите на сайт для отправки комментариев
Чт, 27/07/2017 - 06:16
Как погрузить в сон цикл на 5-8 секунд ATTiny13 , прошита с помощью ардуино, все работает но жрет 1мА, проект на дачу, уровень воды в баке, управляет серво краном, электричества нет, серва жрет 80мА, помогите с кодом сна пожалуйста для тиньки
void setup()
{
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
delay(2000);
digitalWrite(4, LOW);
}
void loop()
{
int val=0;
int X = analogRead(3);
if (X < 111){
digitalWrite(4, HIGH);
delay(100);
digitalWrite(4, LOW);
delay(1000);
}
if (X > 111){
digitalWrite(4, HIGH);
delay(2000);
digitalWrite(4, LOW);
delay(1000);
val++;
}
if (val == 1)
while(1){
digitalWrite(4, HIGH);
delay(100);
digitalWrite(4, LOW);
delay(1000);
}
}
вот есть статья: http://we.easyelectronics.ru/AVR/avr-power-management-ili-kak-pravilno-s...
да в курсе, перерыл весь инет, мозгом слаб, сетаб не могу выставить в примерах
здесь все работает на ура но сетап не могу выставить как у меня
#include <avr/io.h> #include <avr/wdt.h> // здесь организована работа с ватчдогом #include <avr/sleep.h> // здесь описаны режимы сна #include <avr/power.h> #include <avr/interrupt.h> // работа с прерываниями #include <util/delay.h> #define led 4 // PB0 int main( void ) // по аналогии как void setup() { PORTB=0b00010000; //pb2 - вход pb3 - выход1 pb4 - выход2 DDRB= 0b00001000; //pb2 - вход pb3 - выход1 pb4 - выход2 wdt_reset(); // сначало нужно сбросить вачдог // иначе может быть ребут pinMode(led, OUTPUT); while(1){ // вечный цикл, аналог void loop() int V = analogRead(A2); int L = 10000000; if(V<100 ) { digitalWrite(led,HIGH); delay(L); digitalWrite(led,LOW); delay(L); digitalWrite(led,HIGH); delay(L); digitalWrite(led,LOW); delay(L); } } sleepFewSeconds(); // сон на 8 сек. } return 0; } void sleepFewSeconds() { wdt_reset(); // сбрасываем ватчдог PORTB = 0x00; // подаём лог. 0 на все порты DDRB = 0x00; ADCSRA &= ~(1 << ADEN); // отключаем АЦП // иначе будет лишний ток потребления в режиме сна MCUSR &= ~(1<<WDRF); /* Start the WDT Config change sequence. */ WDTCR |= (1<<WDCE) | (1<<WDE); /* Configure the prescaler and the WDT for interrupt mode only*/ // Раскомментируй тот интервал, какой нужно WDTCR = (1<<WDP0) | (1<<WDP3) | (1<<WDTIE); // 8sec //WDTCR = (1<<WDP2) | (1<<WDP1) | (1<<WDTIE); // 2sec //WDTCR = (1<<WDP2) | (1<<WDP0) | (1<<WDTIE); // 0.5sec WDTCR |= (1<<WDTIE); sei(); // Enable global interrupts set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную while(1) { sleep_enable(); // разрешаем сон sleep_cpu(); // спать! sleep_disable(); } }вот тоже рабочий но как в него интегрировать мой не знаю
#include <avr/interrupt.h> #include <avr/sleep.h> ISR(WDT_vect) { // Toggle Port B pin 4 output state PORTB ^= 1<<PB4; } int main(void) { // Set up Port B pin 4 mode to output DDRB = 1<<DDB4; // temporarily prescale timer to 4s so we can measure current WDTCR |= (1<<WDP1); // (1<<WDP2) | (1<<WDP0); // Enable watchdog timer interrupts WDTCR |= (1<<WDTIE); sei(); // Enable global interrupts // Use the Power Down sleep mode set_sleep_mode(SLEEP_MODE_PWR_DOWN); for (;;) { sleep_mode(); // go to sleep and wait for interrupt... } }вот тоже рабочий но как в него интегрировать мой не знаю
#include <avr/interrupt.h> #include <avr/sleep.h> ISR(WDT_vect) { // Toggle Port B pin 4 output state PORTB ^= 1<<PB4; } int main(void) { // Set up Port B pin 4 mode to output DDRB = 1<<DDB4; // temporarily prescale timer to 4s so we can measure current WDTCR |= (1<<WDP1); // (1<<WDP2) | (1<<WDP0); // Enable watchdog timer interrupts WDTCR |= (1<<WDTIE); sei(); // Enable global interrupts // Use the Power Down sleep mode set_sleep_mode(SLEEP_MODE_PWR_DOWN); for (;;) { sleep_mode(); // go to sleep and wait for interrupt... } }#include <avr/io.h> #include <avr/wdt.h> // здесь организована работа с ватчдогом #include <avr/sleep.h> // здесь описаны режимы сна #include <avr/power.h> #include <avr/interrupt.h> // работа с прерываниями #include <util/delay.h> int main( void ) // по аналогии как void setup() { pinMode(4, OUTPUT); digitalWrite(4, HIGH); delay(2000); digitalWrite(4, LOW); wdt_reset(); // сначало нужно сбросить вачдог // иначе может быть ребут while(1){ // вечный цикл, аналог void loop() int val=0; int X = analogRead(3); if (X < 111){ digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); delay(1000); } if (X > 111){ digitalWrite(4, HIGH); delay(2000); digitalWrite(4, LOW); delay(1000); val++; } if (val == 1) while(1){ digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); delay(1000); } sleepFewSeconds(); // сон на 8 сек. } return 0; } void sleepFewSeconds() { wdt_reset(); // сбрасываем ватчдог PORTB = 0x00; // подаём лог. 0 на все порты DDRB = 0x00; ADCSRA &= ~(1 << ADEN); // отключаем АЦП // иначе будет лишний ток потребления в режиме сна MCUSR &= ~(1<<WDRF); /* Start the WDT Config change sequence. */ WDTCR |= (1<<WDCE) | (1<<WDE); /* Configure the prescaler and the WDT for interrupt mode only*/ // Раскомментируй тот интервал, какой нужно WDTCR = (1<<WDP0) | (1<<WDP3) | (1<<WDTIE); // 8sec //WDTCR = (1<<WDP2) | (1<<WDP1) | (1<<WDTIE); // 2sec //WDTCR = (1<<WDP2) | (1<<WDP0) | (1<<WDTIE); // 0.5sec WDTCR |= (1<<WDTIE); sei(); // Enable global interrupts set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную while(1) { sleep_enable(); // разрешаем сон sleep_cpu(); // спать! sleep_disable(); } }Не знаю... Правильно или нет, но вроде бы как-то так.
да я так делал, крутит вот это все
int main( void ) // по аналогии как void setup() { pinMode(4, OUTPUT); digitalWrite(4, HIGH); delay(2000); digitalWrite(4, LOW);ПОМОГИТЕ, Все работает на Ардуино НАНО, на ПРО и самое главное Тиньки 13 отказывается
грешит на эту строку MCUCR = bit (BODS) | bit (BODSE); пишет BODS was not declared in this scope (BODS не было объявлено в этой области) в какой области?
#include <avr/sleep.h> #include <avr/wdt.h> const byte LED = 13; // watchdog interrupt ISR (WDT_vect) { wdt_disable(); // disable watchdog } // end of WDT_vect void setup () { } void loop () { pinMode (LED, OUTPUT); digitalWrite (LED, HIGH); delay (50); digitalWrite (LED, LOW); pinMode (LED, INPUT); // disable ADC ADCSRA = 0; // clear various "reset" flags MCUSR = 0; // allow changes, disable reset WDTCSR = bit (WDCE) | bit (WDE); // set interrupt mode and an interval WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP1); // set WDIE, and 1 second delay wdt_reset(); // pat the dog set_sleep_mode (SLEEP_MODE_PWR_DOWN); sleep_enable(); // turn off brown-out enable in software MCUCR = bit (BODS) | bit (BODSE); MCUCR = bit (BODS); sleep_cpu (); // cancel sleep as a precaution sleep_disable(); } // end of loopВ Ардуино НАНО и Ардуино ПРО МИНИ используется совсем другой микроконтроллер - ATmega328P. Регистры у разных микроконтроллеров зачастую отличаются.
Откройте даташит на ATtiny13A (стр. 33) и убедитесь, что в регистре MCUCR нет битов BODS и BODSE, как в ATmega328P. Вместо них три бита SE, SM1, SM0.
А вот в регистре BODCR есть биты BODS и BODSE.
так же рунается BODCR тоже самое, что делать
#include <avr/sleep.h> #include <avr/wdt.h> const byte LED = 13; // watchdog interrupt ISR (WDT_vect) { wdt_disable(); // disable watchdog } // end of WDT_vect void setup () { } void loop () { pinMode (LED, OUTPUT); digitalWrite (LED, HIGH); delay (50); digitalWrite (LED, LOW); pinMode (LED, INPUT); // disable ADC ADCSRA = 0; // clear various "reset" flags BODCR = 0; // allow changes, disable reset WDTCSR = bit (WDCE) | bit (WDE); // set interrupt mode and an interval WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP1); // set WDIE, and 1 second delay wdt_reset(); // pat the dog set_sleep_mode (SLEEP_MODE_PWR_DOWN); sleep_enable(); // turn off brown-out enable in software BODCR = bit (BODS) | bit (BODSE); BODCR = bit (BODS); sleep_cpu (); // cancel sleep as a precaution sleep_disable(); } // end of loopеще одна проблема перестают после прошивки определятся тиньки 13 через програматор ардуино, пишет не определен процессор или Дважды проверьте чип или используйте -F, чтобы переопределить эту проверку. что делать уже 3 тиньки убил
еще одна проблема перестают после прошивки определятся тиньки 13 через програматор ардуино, пишет не определен процессор или Дважды проверьте чип или используйте -F, чтобы переопределить эту проверку. что делать уже 3 тиньки убил
https://habr.com/ru/post/249967/