Погружаем в сон ATTiny13

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

Как погрузить в сон цикл на 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); 
}
}

 

 

 

ykropchik22
Offline
Зарегистрирован: 30.05.2017
splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

да в курсе, перерыл весь инет, мозгом слаб, сетаб не могу выставить в примерах

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

здесь все работает на ура но сетап не могу выставить как у меня




#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();
  }
}

 

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

вот тоже рабочий но как в него интегрировать мой не знаю

 

#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...
   }
}

 

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

вот тоже рабочий но как в него интегрировать мой не знаю

 

#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...
   }
}

 

ykropchik22
Offline
Зарегистрирован: 30.05.2017
#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();
  }
}

Не знаю... Правильно или нет, но вроде бы как-то так. 

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

да я так делал, крутит вот это все

int main( void ) // по аналогии как void setup()  
{
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH); 
  delay(2000);   
  digitalWrite(4, LOW); 
splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

ПОМОГИТЕ, Все работает на Ардуино НАНО, на ПРО и самое главное Тиньки 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

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

В Ардуино НАНО и Ардуино ПРО МИНИ используется совсем другой микроконтроллер - ATmega328P. Регистры у разных микроконтроллеров зачастую отличаются.

Откройте даташит на ATtiny13A (стр. 33) и убедитесь, что в регистре MCUCR нет битов BODS и BODSE, как в ATmega328P. Вместо них три бита SE, SM1, SM0.

А вот в регистре BODCR есть биты BODS и BODSE.

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

так же рунается 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

 

splans
splans аватар
Offline
Зарегистрирован: 06.07.2015

еще одна проблема перестают после прошивки определятся тиньки 13 через програматор ардуино, пишет не определен процессор или  Дважды проверьте чип или используйте -F, чтобы переопределить эту проверку. что делать уже 3 тиньки убил

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

splans пишет:

еще одна проблема перестают после прошивки определятся тиньки 13 через програматор ардуино, пишет не определен процессор или  Дважды проверьте чип или используйте -F, чтобы переопределить эту проверку. что делать уже 3 тиньки убил


https://habr.com/ru/post/249967/