Come far lavorare ATmega a 128KHz di clock

Piccolo chiarimento: dovendo considerare il consumo reale totale al fine di stimare la durata della batteria, perchè è errato misurare la tensione ai capi di essa??

Altra cosa, perchè non sottoporre il cavo di l'alimentazione delle periferiche esterne all'azione di un transistor che può quindi accenderle e spegnerle in prossimità dello sleep mode?

GianfrancoPa:
Piccolo chiarimento: dovendo considerare il consumo reale totale al fine di stimare la durata della batteria, perchè è errato misurare la tensione ai capi di essa??

E' il chiarimento che ho chiesto, non ho capito infatti se astrobeed pensava che ci fossero consumi dovuti a componenti esterni al micro, o se sta pensando a possibili dispersioni dovute alla bread e jumpers vari.

Altra cosa, perchè non sottoporre il cavo di l'alimentazione delle periferiche esterne all'azione di un transistor che può quindi accenderle e spegnerle in prossimità dello sleep mode?

Semplicemente perché non ce ne sono, oltre al sensore (meccanico) c'è un tx autoalimentato a 12V; l'SCR usato per attivare il tx è pilotata dal pin OUT del chip mediante una r da 10K e, in modalità sleep, non viene alimentato.

Questo link, che mi aveva indicato Marco Benini, http://www.rocketscream.com/blog/2011/04/26/mini-ultra-8-mhz-current-consumption-part-2/#more-349 mi pare possa essere una buona prova, essendo (a occhio :astonished:) un'implementazione del code che mi ha dato astrobeed; salvo altre info è la prova che vorrei fare appena possibile.

menniti:
Per ora mi interessa risolvere con AT328, anche perché dovrei realizzare un'altra applicazione in cui il tiny sarebbe inadeguato. Ti chiedo una grande cortesia: puoi descrivermi come hai montato il chip e misurato il consumo? Io nei primi test ho copia/incollato il tuo code per lo sleep e mi dava 96µA, ecco perché vorrei capire cosa hai fatto.

La corrente io l'ho misurata sul pin Vcc e Avcc (7 e 20), messi in parallelo, del micro, mi permetto di insistere su questo punto perché è il solo modo per valutare l'esatta corrente richiesta dal micro, se misuri dalla batteria hai solo l'immagine complessiva del tutto, ma non delle singole parti.
Per dipanare la matassa è indispensabile accertare che il consumo sia effettivamente del micro e non di qualcosa che sta attorno.
Tenuto conto che la prova la stai facendo con un ATmega 328 è inutile che mi metto a controllare la libreria visto che le condizioni sono le stesse, io ho per il test ho usato un Arduino, ho piegato leggermente i pin 7 e 20 in modo da lasciarli estratti dallo zoccolo e ho portato il +5V tramite il multimetro.
Le mie condizioni di test sono ancora più gravose delle tue visto che utilizzo l'alimentazione a 5V e il clock a 16MHz ed ottengo senza problemi il consumo minimo previsto in sleep.

Forse ho capito perché hai tutta quella corrente, nel mio test il pin di ingresso è tenuto alto dalla pull up interna e si aspetta una chiusura verso GND per il risveglio.
Nella tua condizione operativa è l'opposto, il pin normalmente si trova a 0, contatto chiuso, per poi andare a 1 per il risveglio.
Le pull up interne dell'ATmega hanno un valore tipico di circa 20k, se il pin è chiuso verso GND con 3.3V scorrono circa 165 uA attraverso la pull up, e questo succede indipendentemente dalla condizione di sleep o funzionamento normale.
Rifai la misura senza il sensore, cioè pin libero, e dovresti trovare un assorbimento compreso tra 100 e 200 nA per il solo micro.

Ho fatto queste prove:
1 - Ho inviato ad Arduino lo sketch sleep da solo
Ho tolto il chip e l'ho messo sulla breadboard, ma senza quarzo e C, alimentato a 3,6v.
Naturalmente c'ha messo un bel po' a fare i lampeggi (li ho ridotti a 4)
Risultato: 112,7µA

2 - Per scrupolo ho poi montato quarzo e C
Risultati:
alim. 5v: 142µA
alim. 3,6v: 115µA (l'ho ridotta direttamente mentre era in sleep)

3 - Dopo ho provato il tester:
3,6V applicati direttamente ad una R di 330K mi pare debbano dare 10,9µA circa
Risultato: 10,2µA
Non so più dove sbattere la testa :fearful:
Ti prego di credermi, se vuoi ti posto la foto con la misurazione del multimetro: sulla breadboard c'è il deserto, solo il chip e i ponticelli per collegare l'alimentazione.
Non è che avevi usato altri elementi di risparmio?
Grazie.

menniti:
Non è che avevi usato altri elementi di risparmio?

No, lo sketch che ho utilizzato per la prova è quello che ho postato.

Proverò con lo spegnimento delle periferiche, con l'altra libreria, è davvero un mistero.
Grazie comunque per tutta la pazienza che hai avuto, in ogni caso meglio 200µA che 3mA :slight_smile:
Un'ultima cosa, visto che 100µA se li mangia la pull-up con lo switch a massa stavo pensando di risparmiare almeno questi usando meglio il sensore: è un NC ma il problema è che, essendo rotante, a volte resta proprio sulla posizione aperta, quindi può capitare l'una o l'altra situazione; la pull-up l'ho dovuta mettere (prima era esterna) perché altrimenti il circuito a volte andava in loop, a causa dei troppi disturbi della meccanica. Hai un'idea su come poter gestire meglio questa cosa?
Tieni presente che il programmino che ho scritto ormai prevede ogni situazione, quindi comunque mi va in sleep, solo che se ci va col sensore in NC consuma 200µA, altrimenti ne consuma "solo" 100µA, e non posso eliminare la pull-up; forse potrei esternamente portarla ad un valore più elevato, tipo 47K o maggiore, oppure hai un'idea su come gestire la logica, magari collegandolo a 5V?

Stamattina ho fatto altri test.
Hardware utilizzato:

2 Luigino 328
1 Luigino 1000pads (stand alone)

Su tutte e tre le schede, quindi tre ATmega 328p diversi, il micro l'ho inserito con i pin 7 e 20 sollevati. L'alimentazione arriva da USB per le due 328 e da alimentatore esterno per la 1000pads, i pin 7 e 20 degli ATmega sono collegati in parallelo e alimentati dalla presa 5V sul connettore delle schede attraverso il multimetro, con questa configurazione escludo qualunque corrente estranea al micro.
Lo sketch utilizzato è lo stesso che ho già postato con la variante del CHANGE per l'interrupt, se tengo il pin 2 collegato a GND, quindi passa corrente attraveso la pull interna misuro queste correnti in stato di sleep:

L328 A 189 uA
L328 B 169 uA
1000pads 201 uA

Valori in linea con quanto atteso tenendo conto che il valore della pull up interna può essere compreso tra 20 e 50 kohm, 5V/20k = 250 uA, e le tolleranze sono alte in questo caso.

Staccando il GND dal pin 2 ottengo queste correnti:

L328 A 135 nA
L328 B 157 nA
1000pads 123 nA

Grazie astrobeed, temo di non meritare tutta questa pazienza :blush: :blush:
Praticamente i valori riscontrati col pin 2 (che poi sarebbe il 4 del chip?) a massa sono quelli che ho io col sensore in NC, solo che io alimento a 3,6V e lavoro a frequenza inferiore.
Ora, mentre tu levando il collegamento a GND hai una calo di consumo di circa 1000 volte (da 160µA medi a 160nA medi), il mio semplicemente dimezza (da 200µA a 100µA), è come se il pin 4 fosse ancora collegato a massa ma con resistenza raddoppiata.
Allora l'unica possibilità è una dispersione sulla breadboard o qualcosa di interno al chip, ma di chip ne ho provati 4.
Farò queste prove:
1 - Dal tuo sketch con "change" disattivo la pull-up
2 - Cambio posizione del chip sulla breadboard
3 - Faccio la tua stessa prova: chip su Arduino con pin 7 e 20 alzati, collegati in parallelo tra loro e tramite multimetro alla presa 5V
L'altra cosa che mi fa pensare è che le Luigino (ho una 328 prototype anch'io) lavorano col bootloader della 2009, quindi provo anche in tal senso.
Ti faccio sapere più tardi.
Grazie ancora.

Allora ho fatto tutt'e tre le prove ma il risultato no cambia :drooling_face:
Qui www.michelemenniti.it/VHD/Elettronica/Sleep1.jpg la foto della prova SU Arduino 2009, con il tuo code, ho provato anche a disattivare la pull-up e, ovviamente, la riattivazione, in modo da mandarlo a dormire per sempre, ma non cambia nulla.
Invece ho fatto la prova che ti dicevo (disabilitare le periferiche oltre allo sleep). Questo il code:

// **** INCLUDES *****
#include <avr/sleep.h>
#include <avr/power.h>
// ***** CONSTANT *****
#define MAX_PIN_COUNT 22    // Digital IO 0-13, Analog A0-A7

void setup()
{
    uint8_t pin;
    
    // Put all pins into output mode and low state
    for (pin = 0; pin < MAX_PIN_COUNT; pin++)
    {
        pinMode(pin,OUTPUT);
        digitalWrite(pin,LOW);
    }
    
    // Set sleep mode
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    // Enable sleep mode
    sleep_enable();
    // Disable ADC, must be done before calling 
    // power_all_disable() as to disable ADC, 
    // clock is required
    // Refer to datasheet page 45
    ADCSRA &= ~(1 << ADEN);
    // Disable all peripheral power
    power_all_disable();
    // Enter sleep mode
    sleep_mode();
}

void loop() 
{    
    // Zzz...
}

e questo il risultato nelle stesse condizioni hardware:
www.michelemenniti.it/VHD/Elettronica/Sleep2.jpg cioè 18µA invece di 90-100µA; oltretutto questo link, da cui ho preso il code

dice chiaramente di aver ottenuto un consumo di 2,1-2,4µA con questa microboard stand alone a 8MHz, quindi forse la differenza ci sta con i miei 18µA (16 a 3,6V sempre a 16MHz).
A questo punto temo davvero che tu sia riuscito in un'impresa unica, per cui ora sarebbe utile che qualcuno di buona volontà facesse la stessa prova per vedere i risultati.
Nel frattempo vorrei capire come dare a questo code la stessa organizzazione del tuo, visto che questo chiude tutto e se ne va a dormire; invece a me serve proprio di mandarlo a nanna richiamando una funzione quando dico io. Inoltre ho sempre il problema del contatto NC che comunque mi consumerebbe tanto, quindi dovrei impostare una logica diversa in considerazione del fatto che il sensore nella maggior parte dei casi è in posizione NC e ogni tanto capiterà in NA.
Risolti questi problemi col software io sarei a posto (al di là del dubbio che mi rode su questa cosa) in quanto una batteria di 1200mAh con un consumo che è quasi sempre di una paio di µA in teoria mi dura un tempo che va molto oltre la durata stessa della batteria, in termini di autoscarica, quindi lo scopo è raggiunto! :smiley:

EDIT: aggiungo l'ulteriore prova, lo stesso sketch caricato su un chip impostato a 1MHz o 8MHz in stand alone ora misura 0,0-0,1µA oscillanti, è la risoluzione minima del mio multimetro, quindi penso proprio che finalmente siamo nel "campo" dei nanoA (mettendo un qualsiasi pin a 5V mediante una R il consumo sale subito, segno che è vivo...). Quindi l'unico dubbio che mi viene è: non è che la tua libreria sleep integra anche questi altri comandi, io uso quella originale fornita con la 0022.
Grazie ancora.

EDIT_2: dopo 1 miliardo di prove sono giunto alla conclusione che è sufficiente aggiungere al tuo code la SOLA riga:
ADCSRA &= ~(1 << ADEN);
per portare il consumo a "0" (per dire alcuni nA), quindi ora il mio circuito in sleep mode consuma "0" oppure 100µA in base alla posizione del sensore, ma mi sono reso conto che la durata di NC e NA nella rotazione si equivalgono quindi è inutile invertire la logica.
Allora il problema di questo topic è risolto, il chip ora a riposo consuma corrente nell'ordine dei nA. Ora ne apro un altro per risolvere il problema del sensore, topic al quale sei UFFICIALMENTE invitato!
Grazie astrobeed, alla fine ce l'abbiamo fatta, devo naturalmente ringraziare anche ypkdani, Marco Benini, Leo72 e tutti coloro che sono intervenuti fornendomi indicazioni per risolvere il problema!

EDIT_3: ho risolto mettendo una pull-up esterna da 180K, lo so che è eccessiva ma riesce comunque ad evitarmi il loop del sensore ed il consumo scende a soli 20µA, ho provato con 4 diversi chip e nessuno mi ha dato problemi.

Tra poco mi sa che riuscirai addirittura a fargli produrre energia :slight_smile:

Già fatto, ora devo capire come immagazzinarla per poi sfruttarla :grin:
Grazie!

Se ti apri la finestra ti passo due fili :smiley:

Fa presto che mia moglie è diventata incandescente :~ l'ho usata come condens...(oops, speriamo che alexdb stia dormendo.... ]:D)
Ragazzi, scherzi a parte, ho fatto un conto sommario, con una pila da 1200mAh (4-5 euro), il circuito ha un'autonomia di circa 7 anni, la pila però si scarica prima perché ha una sua perdita naturale; praticamente la metto perché serve, in realtà mi basta nulla per alimentare.
Ora tu di sganascerai dalle risate, ma io ho pensato questa cosa: il sensore è fatto da una rotellina che gira su un perno, se io alllungo il perno e me lo porto fuori e lo infilo in un rotorino dentro un campo magnetico, p.es. un motorino delle automobiline a batterie, creo una micro dinamo; praticamente invece di alimentare il motorino e farlo girare, lo faccio girare e prelevo una micro corrente ai capi dell'avvolgimento; un microcircuito auto alimentato mi genera una tensione che immagazzino in un bel condens....( 8)) e lo metto a supporto dell'alimentazione. Ogni volta che apro o chiudo la tapparella immagazzino corrente da rilasciare durante il resto del tempo.
Oppure la faccio meno complicata e mi porto fuori due filini da collegare ad una piccola cella solare.
Servono tre cose:
1 - Il materiale necessario
2 - Un po' di tempo per fare gli esperimenti
3 - una moglie paziente
Me ne manca una delle tre, problema insuperabile =(

EDIT_3: ho risolto mettendo una pull-up esterna da 180K, lo so che è eccessiva ma riesce comunque ad evitarmi il loop del sensore ed il consumo scende a soli 20µA, ho provato con 4 diversi chip e nessuno mi ha dato problemi

EDIT_4: Ho risolto il mistero :smiley:
Il test l'ho fatto sul pc che normalmente uso per il lavoro e sopra c'è di tutto di più, incluso AVR studio 4, relativo compilatore C per AVR, varie librerie il tutto riportato nel path.
Tra le varie librerie che normalmente utilizzo per gli AVR, il mio uso lavorativo non è sotto forma di Arduino, c'è pure una sleep.h con relativo file sleep.c, nell'IDE di Arduino c'è solo la sleep.h che contiene varie define.
In pratica nel momento in l'DE di Arduino andava a compilare usava sia la sua sleep.h che l'altra sleep.h, e relativo sleep.c, presenti sul mio pc a causa dei path.
Per accorgermene ho fatto la compilazione da IDE premendo lo shift, attivando il modo "verbose", e mi appare una warning di GCC per la doppia definizione della libreria, dato che quella non facente parte della 0022 veniva invocata dopo rimaneva valida quest'ultima.
La "fregatura" è che i nomi delle funzioni invocate sono gli stessi nelle due librerie con la differenza che quella abbinata all'IDE 0022 si limita a settare il registro per lo sleep e attivarlo/disattivarlo, l'altra setta anche il registro per lo spegnimento delle periferiche non in uso a seconda del modo sleep impostato, a seconda del livello alcune periferiche rimangono attive con conseguente consumo di energia.
Per farla breve, a me funzionava correttamente perché la libreria utilizzata spegneva anche l'ADC, a te no perché la libreria sleep contenuta nella 0022 non lo spegne, infatti ho fatto la controprova su un altro pc dove c'è solo l'ide 0022 e infatti compilando così l'ATmega mi assorbe oltre 250 uA in sleep, spegnendo l'ADC e non collegando il PIN a GND torno all'assorbimento minore di 200 nA.
Per la pull up esterna, previa disabilitazione di quella interna puoi mettere anche 330k in modo da contenere la dispersione a circa 10 uA, però attenzione a tenere il cavo tra il sensore e la scheda corto e non farlo passare vicino a cavi della 220, meglio ancora se usi un cavetto coassiale.

Ufff :sweat_smile: meno male che ci siamo arrivati, mi stavano venendo le manie di persecuzione :grin: ormai mi ero autonomamente spostato dalla categoria dei newbies a quelle dei deficienti :blush:
Quindi ora i conti tornano, mi hai salvato sia il circuito che la faccia!
Riguardo la resistenza, in realtà avevo provato già una 220K, ma il problema è che sto benedetto sensore, ma d'altra parte come ogni "buon" contatto meccanico, invece di operare on-off (funzionamento teorico) genera un mare di contatti striscianti con conseguenti micro-impulsi che quando faccio le prove con i led (per "vedere" il funzionamento del software) mi manda tutto in loop; ho visto che togliendo i led apparentemente non succede, ma non posso fidarmi; se mi accadesse di notte, quanto l'allarme è home-attivo, finché apro il cassonetto e lo scollego sveglio la città e mi arrestano :fearful:
Con la R da 220K una volta su molti tentativi lo scherzo l'ha fatto; io sono un fedelissimo della Legge di Moore, tanto mi è bastato per rinunciare a qualche µA e ridurla a 180K (naturalmente avevo disabilitato quella interna).
Come detto ho calcolato che la batteria si esaurirà molto prima per autoscarica che per colpa del circuito, quindi inutile cercare l'estremo. XD
Voglio dirti un'ultima cosa, è già la seconda volta che, a motivo di un'informazione non completamente corretta, sono costretto a fare milioni di prove per risolvere il problema, col grande vantaggio di imparare molte cose sull'argomento, mi era successo col bootloader e ne è nata una Guida, ora scriverò qualcosa di minimo anche su questo argomento, quindi il mio ringraziamento è duplice, se tu mi avessi dato la dritta giusta subito avrei eseguito senza capirci più di tanto, invece così ho imparato.
Grazie!!!! XD XD XD

Michele ma non sarai anche un po' alchimista?? :smiley:
Moto perpetuo, energia creata dal nulla..... tra un po' l'Arduino filosofale.... o era la pietra filosofale?? :wink:

Arduicadabra, fiat currentis! 8)
No, no, è il mio laboratorio che ormai vive una vita propria, io arrivo, osservo e scrivo, ma non faccio nulla o meglio, ogni tanto scopiazzo :grin:

menniti:
Fa presto che mia moglie è diventata incandescente :~ l'ho usata come condens...(oops, speriamo che alexdb stia dormendo.... ]:D)
dell'avvolgimento; un microcircuito auto alimentato mi genera una tensione che immagazzino in un bel condens....( 8))
1 - Il materiale necessario
Me ne manca una delle tre, problema insuperabile =(

be se hai bisogno di millemila condensatori da millemila Farad io ce li ho! :grin: :grin: e sono anche molto testati!!