Go Down

Topic: Oscillatore con durata TON e TOFF variabile per stazione metereologica (Read 3850 times) previous topic - next topic

leo72

@great:
il watchdog non è nato per l'uso a cui vuoi destinarlo tu.
Per fare n cicli si usa appunto un timer.

Il progetto è qui:
http://arduino.cc/forum/index.php/topic,104723.0.html

flz47655

Il WatchDog ha diverse modalità operative previste, anche se la più famose è il reset, è stato pensato anche per risvegliare il micro dallo Sleep tramite il suo timer a basso consumo, ho spiegato come impostare un intervallo a piacere ben oltre gli 8 secondi.

Se il progetto di great non prevede già un RTC mi sembra abbastanza costoso aggiungerne uno appositamente.. minimo tra cristallo, IC RTC ed eventualmente batteria esterna a bottone gli costa 5 euro in più di componenti (dai cinesi più economici) e aumenta lo spazio occupato se deve inscatolare il tutto in maniera compatta..

Te leo72 nel tuo progetto Micrologio (non l'ho ancora letto, dimmi se sbaglio) suppongo che avevi già un RTC per tenere traccia in maniera precisa del tempo, quindi giustamente l'hai sfruttato anche per lo sleep, è molto diversa la situazione in cui il progetto non necessita di suo di un RTC però..

Come consumi.. tra le due soluzioni siamo li.. col watchdog non si ha una precisione al millisecondo ma su due ore.. non mi sembra così importante anche se sgarra addirittura di mezzo secondo.
Anche se ogni 8 secondi si sveglia il micro per controllare la variabile è un'operazione veramente veloce (es. meno di 1ms ogni 8000) e non incide sulla media dei consumi.. il vantaggio è che non necessita di altro hardware e comunque può utilizzare questo sistema anche se deve fare una piccola pausa ad esempio di un secondo per aspettare che qualche sensore legga dall'ambiente i suoi valori.
Ad ogni modo con il modulo RTC ha comunque un piccolo consumo costante da aggiungere sempre al micro, sia quando sveglio sia quando in sleep.

La parte dei registri provo a spiegartela meglio oggi a pancia piena dopo mangiato, comunque in sostanza è del codice preso da degli articoli su internet che è molto illeggibile e andrebbe riscritto

Ciao

leo72

Incomprensione: ho detto "attivare il modulo RTC". Si tratta del modulo Real-Time Counter contenuto all'interno del 328, non ho parlato di un Real-Time Clock esterno  ;)
Nel Micrologio uso il modulo RTC, non un chip RTC.

Il modulo RTC è un modulo tarato appositamente per operare con un cristallo esterno da 32768 Hz. Dà tempi precisi.

flz47655

Ok ora ho capito cosa intendevi, il contatore "Real-Time Counter" del micro.

Io preferisco la soluzione basata su WD per questi motivi:

- è possibile svegliare il micro ogni 8 secondi invece che ogni secondo per aggiornare la variabile del tempo trascorso, quindi minor consumo energetico (in teoria, da verificare)

- non necessita di un quarzo apposito e dei relativi condensatori, quindi minor costo, lasciando i pin XTAL per un eventuale clock di sistema (es. da 16 MHz) o due IO aggiuntivi

Ad ogni modo se è richiesta molta precisione, per esempio per un orologio, trovo più interessante il contatore RTC del micro col cristallo esterno da 32768Hz

Ciao

great

Conta  come un maledetto!!! grazie Flz !!! e a tutti gli altri!!

Code: [Select]


#include <avr/sleep.h>
#include <avr/wdt.h>

const byte LED = 12;
volatile int counter = 0;

void flash ()
 {
 pinMode (LED, OUTPUT);
 digitalWrite (LED, HIGH);
 delay (1000);
 counter = 0;
 pinMode (LED, INPUT);
   
 }  // end of flash
 
// watchdog interrupt
ISR (WDT_vect)
{
  wdt_disable();  // disable watchdog
}  // end of WDT_vect

void setup () { Serial.begin(9600); }

void loop ()
{
if (counter==899)
{
 flash ();
}
else
{
 counter=counter+1;
 
}
Serial.print ("Numero cicli: ");
Serial.println (counter);
delay (500);
 // disable ADC
 ADCSRA = 0;  

 // clear various "reset" flags
 MCUSR = 0;    
 // allow changes, disable reset
 WDTCSR = _BV (WDCE) | _BV (WDE);
 // set interrupt mode and an interval
 WDTCSR = _BV (WDIE) | _BV (WDP3) | _BV (WDP0);    // set WDIE, and 8 seconds delay
 wdt_reset();  // pat the dog
 
 set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
 sleep_enable();

 // turn off brown-out enable in software
 MCUCR = _BV (BODS) | _BV (BODSE);
 MCUCR = _BV (BODS);
 sleep_cpu ();  
 
 // cancel sleep as a precaution
 sleep_disable();
 
 } // end of loop

Appena riesco provo con arduino e la shield ethernet!!!

great

Per la corrente però non so proprio come fare voi come avete fatto per misurarla.......  :D :D

flz47655

Un normale multimetro (il mio ha un'accuratezza di circa 1uA con un fondoscala di 2mA) o l'oscilloscopio misurando la caduta di tensione su una resistenza fittizia messa in serie

Ciao

Go Up