Come far lavorare ATmega a 128KHz di clock

Gia spente le varie periferiche come ti avevo fatto notare in questo (o nell'altro) post ?

@Michele:
per capire se l'Attiny fa per te bisogna capire cosa fa esattamente il tuo circuito.
Se leggi solo da 1 pin ed usi un altro pin come output, non ci dovrebbero essere problemi.

ypkdani:
Gia spente le varie periferiche come ti avevo fatto notare in questo (o nell'altro) post ?

Ciao ypkdani, ho letto un milione di cose e alla fine :astonished: mi pare d'aver capito che lo spegnimento delle periferiche "manuale" presuppone un'impostazione di sleep "inferiore" alla power_save che, in base a quanto è scritto nei commenti del tutorial che mi avete linkato, dovrebbe essere la migliore possibile; comunque mi ero riservato di farla, lo stesso la prova, visto che usa un'altra libreria. Quindi ti farò sapere.

leo72:
@Michele:
per capire se l'Attiny fa per te bisogna capire cosa fa esattamente il tuo circuito.
Se leggi solo da 1 pin ed usi un altro pin come output, non ci dovrebbero essere problemi.

Ciao Leo, è un semplicissimo contaimpulsi, all'ingresso il sensore dell'antifurto, all'uscita il tx wireless, in mezzo il micro che mi gestisce gli impulsi spurii ed i falsi contatti via software, ecco perché ho già ritirato gli ATtiny, ma l'idea era soprattutto di fare una cosa piccola e che non consumi. I contaimpulsi commerciali che ho visto in giro costano un sacco di soldi, sono ingombrandi e soprattutto consumano tanto; se disponessi di un'alimentazione a rete o da centralina avrei risolto tutto, ma questa è l'unica strada possibile.
Tieni presente che non posso scendere a 1,8V, almeno in questa fase, visto che dispongo (e vorrei usarle prima che scadono, dato il costo che hanno) di una decina di batterie del tipo che ho detto. Poiché gli ATtiny arrivano settimana prox, intanto volevo affinare le tecniche e comunque avere una soluzione valida nel caso non riuscissi a farla andare con buoni risultati.

menniti:
mi pare d'aver capito che lo spegnimento delle periferiche "manuale" presuppone un'impostazione di sleep "inferiore" alla power_save che,

Col modo power_down vengono spente tutte le periferiche non in uso, vale per tutti gli ATmega che supportano tale modaliltà ATtiny inclusi.
Non c'è nessuna differenza tra modelli in case SDM e in case DIP per quanto riguarda le caratteristiche elettriche, in power down il consumo è circa 0.1 uA sempre e comunque.
Il valore di corrente che misuri durante lo sleep è altissimo, ti ripeto la mia domanda, la misura l'hai fatta direttamente sulla batteria oppure direttamente sul pin Vdd del micro ?
Io la prova l'ho fatto con un ATmega 328p, c'è la possibilità che la libreria non esegua tutte le necessarie operazioni per l'ATtiny, però la libreria non è limitata ad Arduino perché fa parte del compilatore AVRgcc, e qui il discorso si estende molto, quindi mi pare strano che non funzioni in modo corretto con i modelli di micro supportati, un bug simile è macroscopico e sarebbe stato corretto subito.
Oggi provo a dare una controllata a quello che fa esattamente la libreria con gli ATtiny e verifico se setta opportunamente tutti i vari registri per lo sleep, ma non credo che il problema sia questo.

astrobeed:

menniti:
mi pare d'aver capito che lo spegnimento delle periferiche "manuale" presuppone un'impostazione di sleep "inferiore" alla power_save che,

Col modo power_down vengono spente tutte le periferiche non in uso, vale per tutti gli ATmega che supportano tale modaliltà ATtiny inclusi.
Non c'è nessuna differenza tra modelli in case SDM e in case DIP per quanto riguarda le caratteristiche elettriche, in power down il consumo è circa 0.1 uA sempre e comunque.
Il valore di corrente che misuri durante lo sleep è altissimo, ti ripeto la mia domanda, la misura l'hai fatta direttamente sulla batteria oppure direttamente sul pin Vdd del micro ?
Io la prova l'ho fatto con un ATmega 328p, c'è la possibilità che la libreria non esegua tutte le necessarie operazioni per l'ATtiny, però la libreria non è limitata ad Arduino perché fa parte del compilatore AVRgcc, e qui il discorso si estende molto, quindi mi pare strano che non funzioni in modo corretto con i modelli di micro supportati, un bug simile è macroscopico e sarebbe stato corretto subito.
Oggi provo a dare una controllata a quello che fa0,5mA esattamente la libreria con gli ATtiny e verifico se setta opportunamente tutti i vari registri per lo sleep, ma non credo che il problema sia questo.

Hai ragione scusa, davo per scontato... Io ho misurato sulla batteria, ma sulla bread c'è il solo ATmega328, infatti la misura resta tale anche eliminando il circuito sul pin di uscita; non mi sono disperato a togliere il sensore perché mi dava il change e mi risvegliava il micro, ma è uno switc NC collegato tra il pin 4 del micro e la massa; a meno che i consumi non siano dovuti ai 7-8 jumper che mi portano l'alimentazione al micro; altra cosa: io come detto ho impostato via fuses (per non usare quarzo, ecc) il micro a 1MHz e lo alimento a 3,6V; a 16MHz il consumo sale a 570µA. 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.

EDIT: aggiungo che questo consumo di 96µA, in alcune combinazioni di funzionamento, andando in sleep me lo dà ancora, ma la maggior parte delle volte e 200µA.

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 =(