Pages: 1 2 [3]   Go Down
Author Topic: Oscillatore con durata TON e TOFF variabile per stazione metereologica  (Read 3130 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged


Parma
Offline Offline
Edison Member
*
Karma: 20
Posts: 2359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink
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.
Logged


Parma
Offline Offline
Edison Member
*
Karma: 20
Posts: 2359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:

#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!!!
« Last Edit: June 09, 2012, 06:38:18 am by great » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per la corrente però non so proprio come fare voi come avete fatto per misurarla.......  smiley-grin smiley-grin
Logged

Parma
Offline Offline
Edison Member
*
Karma: 20
Posts: 2359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: 1 2 [3]   Go Up
Jump to: