Come far lavorare ATmega a 128KHz di clock

leo72:
.......................
Che non so neanche la legge di Ohm a mente e che calcolo le resistenze con la funzione rnd()? :astonished:

Scusa! non avevo visto il post, mi ero immerso nel discorso filosofico di BrainBooster... :fearful:
La frase che ho riportato da oggi campeggia nel mio laboratorio, a ricordo del fatto che l'uomo può farsela addosso anche senza avere problemi di prostata; il calcolo a random è superlativo, il Dr. Ohm sarà anche un po' inczz ma di certo se la ride anche lui XD XD XD XD XD

Muahahahah XD XD XD XD

astrobeed:

menniti:
inoltre ho un altro problema: a volte questo strab sensore resta aperto, in base alla posizione, e potrebbe restarlo per tutto il giorno (il tx per attivarsi vuole una sequenza low-high), quindi poiché gestisco già questa cosa via software, secondo te potrei mettere in sleep il micro anche col sensore aperto?

La soluzione è semplice, invece di risvegliare su uno stato logico ben preciso, che può essere sia LOW che HIGH, risvegli quando c'è un cambio di stato, quindi sia HIGH->LOW che LOW->HIGH, per farlo basta che metti la keyword CHANGE nella modalità di attivazione dell'interrupt.
Ti allego solo come viene modificata la funzione che mette in sleep, commenta, o cancella, l'attivazione dell'interrupt che si trova in SETUP in modo da attivare l'interrupt solo prima di entrare in sleep e disattivarlo quando ne esce.

void A_nanna()                      // funzione attivazione sleep

{
   /*
   Modalità sleep per ATmega 328p
 
   SLEEP_MODE_IDLE
   SLEEP_MODE_ADC
   SLEEP_MODE_PWR_DOWN
   SLEEP_MODE_PWR_SAVE
   SLEEP_MODE_STANDBY
   SLEEP_MODE_EXT_STANDBY
   
   */

attachInterrupt(0, sbadiglio, CHANGE); // riattiva l'interrupt
   sleep_mode();                          // mette in stato di sleep
   sleep_disable();      // disattiva la modalità sleep e riporta il micro a piena operatività
   detachInterrupt(0);  // disattiva l'interrupt
}

Ciao, finalmente ho potuto fare un po' di prove: tra tutte le modalità migliore è proprio la “SLEEP_MODE_PWR_DOWN”; ho configurato il chip a 1MHz (ma non cambia nulla in sleep) e l’ho montato in configurazione minimal, solo col led sul 13; non ho ancora messo il mio code; quando va “a nanna” il mio tester (è un buon Velleman ma niente a che vedere col tuo strumento professionale!) misura 95-96 µA, quindi molto più di quanto mi hai indicato. Il tester ha una risoluzione di 0,1µA, misurando il tx (che dovrà essere pilotato dal chip) a riposo mi dà 8-9µA, quindi la cosa mi sembra attendibile anche se certamente imprecisa. Quindi vorrei qualche info in più, se possibile.
Inoltre mi sfugge il passaggio

L'interrupt su INT0 è sempre attivo, se vuoi attivarlo e disattivarlo solo per lo sleep togli i commenti alle relative righe all'interno della funzione per lo sleep.

La funzione sleep non ha righe di commento, a parte l’elenco delle modalità.
Infine vorrei un chiarimento proprio sul “funzionamento” di questa funzione:

    attachInterrupt(0, sbadiglio, CHANGE); // riattiva l'interrupt
    sleep_mode();                          // mette in stato di sleep
    sleep_disable();      // disattiva la modalità sleep e riporta il micro a piena operatività
    detachInterrupt(0);  // disattiva l'interrupt

Mette in stato di sleep e subito dopo lo disattiva?
grazie

menniti:
“SLEEP_MODE_PWR_DOWN”; ho configurato il chip a 1MHz (ma non cambia nulla in sleep)

Ovvio perché durante lo sleep il micro è fermo.

misura 95-96 µA, quindi molto più di quanto mi hai indicato. Il tester ha una risoluzione di 0,1µA, misurando il tx (che dovrà essere pilotato dal chip) a riposo mi dà 8-9µA, quindi la cosa mi sembra attendibile anche se certamente imprecisa. Quindi vorrei qualche info in più, se possibile.

La misura la devi fare solo sull'alimentazione del micro, cioè direttamente dal suo pin, e non dall'alimentazione generale dove trovi sommati tutti i consumi e perdite.

Inoltre mi sfugge il passaggio
La funzione sleep non ha righe di commento, a parte l’elenco delle modalità.

La sleep non ha nessun commento, era riferito ai controlli per l'interrupt, non è detto che lo vuoi tenere attivo solo per la sleep, potrebbe servire anche per altre cose.

Mette in stato di sleep e subito dopo lo disattiva?

Si, quando vai in sleep il micro blocca l'esecuzione del programma per farla poi ripartire quando si sveglia, appena riparte la prima cosa da fare è disattivare lo sleep, le due funzioni invocate non fanno altro che settare in modo opportuno alcuni registri dell'ATmega.

Chiarissimo, un'ultima cosa, il mio codice (a parte ovviamente definizioni e setup) risiede nel loop, a grandi linee legge il pin 2, dove è attaccato il sensore, e comincia a verificarne il comportamento, ad un certo punto o scatta l'allarme oppure io resetto i contatori (falso allarme); quindi pensavo di rimettere tutto nel loop, ed inserire il richiamo dello sleep come ultima operazione del mio "reset". La funzione "sbadiglio", se ho ben capito, non mi serve, visto che l'interrupt non deve pilotare null'altro. E' corretto?
Grazie ancora!

La funzione "sbadiglio" è associata all'interrupt e ci deve essere per forza, se non devi fare nulla al suo interno la lasci vuota.

Bene, finalmente ho finito :sweat_smile:
Il circuito funziona alla perfezione, sulla breadboard, devo ora testare i tempi teorici direttamente sul posto.
Comunque l'assorbimento in attività è di circa 1,5mA, a riposo va da 90 a 200µA.
Userò una batteria di questo tipo (esempio)http://www.webtronic.it/pages/ITA/prodotto.asp?ProdottoID=247720 3,6V 1200mAh.
Ogni giorno mediamente il circuito è attivo un paio di minuti la mattina, altrettanti la sera, quindi la quasi totalità delle 24 ore è a riposo; ho provato a fare un conteggio e dovrebbe durare circa 7 mesi, quindi è poco.
Mi date conferma dei tempi teorici?
Ci sono ulteriori possibili interventi sul risparmio?
Appena mi arriva proverò il circuito col micro ATtiny85; oltre alle dimensioni risparmio energia?
Ma la libreria usata per lo sleep è compatibile con questo micro?
Tante domande, ma ora che è finalmente superata la prima fase devo cercare di concludere il lavoro, ogni dritta è utile.

L'Attiny85 ha 3 modalità di risparmio energetico. Sui consumi il produttore dà a 1,8V in powerdown un consumo di 0,1 uA.

menniti:
Comunque l'assorbimento in attività è di circa 1,5mA, a riposo va da 90 a 200µA.

Cosa c'è sul circuito che consuma corrente oltre al micro ?
Se vuoi aumentare l'autonomia devi tagliare tutti i consumi, non solo quello del micro.

leo72:
L'Attiny85 ha 3 modalità di risparmio energetico. Sui consumi il produttore dà a 1,8V in powerdown un consumo di 0,1 uA.

OK, devo capire se posso traslare tutto dall'atmega all'attiny; vediamo appena arriva.

astrobeed:

menniti:
Comunque l'assorbimento in attività è di circa 1,5mA, a riposo va da 90 a 200µA.

Cosa c'è sul circuito che consuma corrente oltre al micro ?
Se vuoi aumentare l'autonomia devi tagliare tutti i consumi, non solo quello del micro.

Ora non voglio fare lo scolaretto bugiardo: praticamente nulla; te lo illustro al volo:
Chip in configurazione minimal (quindi senza componenti esterni)
Un sensore (specie di microswitch) normalmente chiuso tra il piedino 4 (INT0) del chip e massa
Una resistenza da 10k sul piedi 18 che pilota un piccolo SCR che mi serve per attivare il tx; anche eliminando questo circuito non cambia nulla; non so dove mettere mano onestamente.

Qualche altra idea in merito al risparmio di consumo energetico; tra i lin che mi sono stati postati, alcuni mostrano un consumo di 2,1µA!!! E' pur vero che si tratta di chip smd, mentre io ho un normale chip DIL però 100 volte tanto di consumo mi sembra davvero troppo.

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.