Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 13:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 29 gru 2016, o 16:04 
Offline
Nowy

Dołączył(a): 19 gru 2014
Posty: 7
Pomógł: 0

Witam
Szukałem przykładu jak uśpić Atmegę328 programowaną w C pod Eclipse. Znalazłem fajny przykład pod Arduino i działa spoko w Arduino:
Kod:
/*
 * Sketch for testing sleep mode with wake up on WDT.
 * Donal Morrissey - 2011.
 *
 */
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

#define LED_PIN (13)

volatile int f_wdt=1;



/***************************************************
 *  Name:        ISR(WDT_vect)
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Watchdog Interrupt Service. This
 *               is executed when watchdog timed out.
 *
 ***************************************************/
ISR(WDT_vect)
{
  if(f_wdt == 0)
  {
    f_wdt=1;
  }
  else
  {
    Serial.println("WDT Overrun!!!");
  }
}


/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Enters the arduino into sleep mode.
 *
 ***************************************************/
void enterSleep(void)
{
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);   /* EDIT: could also use SLEEP_MODE_PWR_DOWN for lowest power consumption. */
  sleep_enable();
 
  /* Now enter sleep mode. */
  sleep_mode();
 
  /* The program will continue from here after the WDT timeout*/
  sleep_disable(); /* First thing to do is disable sleep. */
 
  /* Re-enable the peripherals. */
  power_all_enable();
}



/***************************************************
 *  Name:        setup
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Setup for the serial comms and the
 *                Watch dog timeout.
 *
 ***************************************************/
void setup()
{
  Serial.begin(9600);
  Serial.println("Initialising...");
  delay(100); //Allow for serial print to complete.

  pinMode(LED_PIN,OUTPUT);

  /*** Setup the WDT ***/
 
  /* Clear the reset flag. */
  MCUSR &= ~(1<<WDRF);
 
  /* In order to change WDE or the prescaler, we need to
   * set WDCE (This will allow updates for 4 clock cycles).
   */
  WDTCSR |= (1<<WDCE) | (1<<WDE);

  /* set new watchdog timeout prescaler value */
  WDTCSR = 1<<WDP0 | 1<<WDP3; /* 8.0 seconds */
 
  /* Enable the WD interrupt (note no reset). */
  WDTCSR |= _BV(WDIE);
 
  Serial.println("Initialisation complete.");
  delay(100); //Allow for serial print to complete.
}



/***************************************************
 *  Name:        enterSleep
 *
 *  Returns:     Nothing.
 *
 *  Parameters:  None.
 *
 *  Description: Main application loop.
 *
 ***************************************************/
void loop()
{
  if(f_wdt == 1)
  {
    /* Toggle the LED */
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
   
    /* Don't forget to clear the flag. */
    f_wdt = 0;
   
    /* Re-enter sleep mode. */
    enterSleep();
  }
  else
  {
    /* Do nothing. */
  }
}

Jednak po przeniesieniu do Eclipse to nie chce chodzić. Oczywiście wyrzuciłem typowe dla Arduino polecenia. Procesor idzie spać na zawsze przy takim ustawieniu w Eclipse. Zaczęło to działać dopiero po dodaniu biblioteki z przerwaniami #include <avr/interrupt.h>, włączeniu przerwań sei() w funkcji enterSleep() przed linijką sleep_mode() i wyłączeniu cli() po niej. Tak powinno być czy robię coś bardzo naokoło? Arduino dodaje coś podczas kompilacji, że to działa tam od strzału?
Znacie inne sposoby na uśpienie Atmegi na określony czas? Usypianie w Arduino jest takie sobie, bo cały układ z interfejsem RS/USB do bootloadera zżera więcej prądu niż sama Atmega, dlatego wolę to robić na czystym procku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2017, o 23:18 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

Robisz dobrze, ale daj sei() przed pętlę główną i nie dawaj cli(). Aby jeszcze mocniej ograniczyć zużycie energii możesz użyć usypiania w trybie Power Down.

P.S. Popraw formatowanie kodu w swoim poście. Wstaw w Syntax C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 kwi 2017, o 11:56 
Offline
Nowy

Dołączył(a): 19 gru 2014
Posty: 7
Pomógł: 0

O, ktoś odpowiedział, nie zaglądałem tu już w lutym...
@piotr529, nie ma zmartwienia. Każdy kto się bawi AVR wie, że [...kolega zadaje tu pytania czy bawi się w jakąś reklamę ? - wycięte - mirekk36 ]
@HomoChemicus, dzięki za odpowiedź, właśnie używam powerdown, zresztą jest to pokazane w przykładowym kodzie:

"set_sleep_mode(SLEEP_MODE_PWR_SAVE); /* EDIT: could also use SLEEP_MODE_PWR_DOWN for lowest power consumption. */"

Ja używam takiej funkcji w Eclipse:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Włączam przerwania przed uśpieniem i wyłączam zaraz po, bo tylko tu ich używam, do wybudzenia.
Działa na attiny13a i atmedze328.
Jak będę miał czas to posprawdzam jak się zachowuje gdy nie wyłączę (cli), przypuszczam, że wdt może coś tam sobie dalej dłubać, a ja w przerwaniu zliczam cykle wdt by wydłużyć spanie do wielokrotności 8s.
Ciekawi mnie tylko czemu nie musiałem włączać przerwań w Arduino i od razu zadziałało, domyślam się, że włączane są przy okazji innych inicjalizacji, np. uart. Kiedyś sprawdzę.
Gdzieś przeczytałem, że powinno się właśnie tylko raz włączać przerwania i ich nie wyłączać. Ale od każdej reguły są pewnie wyjątki.
Niestety czasu na AVR i Arduino mam mało, czasami jak w czymś się zatnę to wracam po paru miesiącach do tematu i zaczynam od nowa - czasami takie świeże podejście nawet pomaga.
Jak ktoś może potwierdzić przypuszczenia to proszę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 16 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO