sleep mode sul 644A

Come da titolo ho un 644A, che deve andare a nanna su comando. In verità a me non serve che vada a nanna per forza, sostanzialmente mi interessa:

  1. Spegnere il display 4x7 segments
  2. Abilitare solo il pulsante PWR on/off , dei 4 presenti.
  3. Spegnere tutte le uscite.
  4. Rendere insensibile il controller da eventi esterni o interni.

Tutto questo posso farlo già, ma ancora non ho scritto codice per farlo dormire.
Cosa importante: se va via la corrente elettrica al ritorno di questa il controller deve comportarsi nel seguente modo:

  1. Se prima di andare via la corrente il controller risultava spento da utente, al ritorno della corrente deve rimanere spento.
  2. Se prima di andare via la corrente il controller risultava acceso, al ritorno della corrente deve accendersi ed entrare nello stato di default.

L'unica soluzione logica e funzionale che riesco a pensare è la seguente:
Devo monitorare la tensione alternata di 220V o 12 (a seconda del tipo di alimentazione scelto in fase di assemblaggio), il periodo della forma d'onda è grande 20ms (50HZ) se entro 100ms non arriva altro periodo la corrente elettrica è venuta a mancare, in queste condizioni l'alimentatore deve riuscire a fornire sufficiente riserva di energia per poter scrivere in eeprom un flag che ha il significato seguente:

  • Ero acceso ed è andata via la corrente.

Con il display acceso e con i relè in funzione il consumo del circuito consuma la riserva di energia presente nei condensatori dell'alimentatore e non mi da il tempo di scrivere in eeprom. I condensatori non li posso aumentare di capacità a causa delle dimensioni ridotte dell'interro apparecchio. Posso sempre spegnere display e relè se entro 100ms non c'è altra semi onda.

Potrei fare come fanno tutti: Tutte le volte che il controller viene acceso dal tasto scrivo un flag in eeprom, quando viene spento dal tasto azzero il flag. Ciò comporta il consumo di quella cella eeprom e dopo x accensioni e spegnimenti l'intero apparecchio comincerebbe ad avere comportamenti anomali, del tipo prende iniziative e si accende a seguito di una mancanza di corrente anche quando doveva rimanere spento, o anche peggio non si riaccende quando dovrebbe. Questo malfunzionamento potrebbe rientrare tra i guasti possibili e accettabili o non è accettabile.

La tastiera e il display con il timer0 spento non funziona, per cui devo anche abilitare un interrupt pinchange per risvegliare il micro, sempre che sia possibile usare pinchange per questo scopo.

La eeprom usata è quella interna al 644A, non è possibile usare una esterna per mancanza di spazio e di costi.

Che faccio? faccio come fan tutti o cerco una best solution?

Voi come vi comportereste?

Ciao.

Devi usare un circular buffer in modo da scrivere il dato non sempre sulla stessa cella ma essere poi capace di recupare il punto in cui hai scritto l'ultima volta:

http://www.atmel.com/Images/doc2526.pdf

Ah, dimenticavo. Se usi l'AC (Analoc Comparator) interno, che è un op-amp a tutti gli effetti, puoi far entrare una tensione continua su un pin procurata dalla tensione alternata di rete. Nel momeno in cui la tensione continua sparisce, l'AC può sollevare un interrupt che tu usi per scrivere il dato sulla EEPROM.

Ho la lib analogComp fatta apposta, se ricordi :wink:

Grazie leo, quel documento sul circular buffer non lo ricordavo più.

Anche la lib per il comparatore che hai scritto ho dimenticato.
Caspita quante cose che ho dimenticato e tutte molto importanti.

Sicuramente userò il circular buffer e se possibile non userò il controllo della tensione di alimentazione.
Stasera ci lavoro un po, l'idea è quella di scrivere nel circular buffer all'accensione e spegnimento tramite pulsante, così se viene a mancare l'alimentazione leggo se era acceso o era spento e mi comporto di conseguenza.

Ciao grazie, sempre.

Figurati, ho piacere ad aiutarti perché anche tu dai un sacco di aiuto agli altri XD