Come far lavorare ATmega a 128KHz di clock

@dani:
ma la seriale a quanto la fai lavorare?
Secondo me si tratta di un problema di velocità: scalando ad 1 MHz non penso il micro riesca a gestire temporizzazioni molto elevate. Prova 2400, 4800, 9600 baud non di più.

Tornando al discorso del bootloader, devi riflashare anche quello altrimenti credo poi avrai problemi di sincronizzazione nell'invio degli sketch. Cmq un chip impostato ad 1 MHz, non lo puoi più usare nell'Arduino, quindi lo programmerai con la tecnica ISP: a 'sto punto, avere un bootloader a bordo è solo uno sbattimento inutile perché non lo usi.

@mick:
hai ragione, alla fine ne esci pazzo XD
Dammi retta, freeza tutto ad ora, concludi la guida e non stare più dietro ad altro. Se qualcosa non sei riuscito ad implementarlo, rimandalo alla prox versione della guida. Se continui a chiedere, io continuo a metterti nuova carne sul fuoco :stuck_out_tongue:

Si allora se imposto 1mhz in board.txt e tramite la funzione setClockPrescaler(CLOCK_PRESCALER_16); faccio lavorare tutto ad 1mhz la seriale funzione fino a 14400bps poi niente da fare.

Tornando al discorso del bootloader, devi riflashare anche quello altrimenti credo poi avrai problemi di sincronizzazione nell'invio degli sketch. Cmq un chip impostato ad 1 MHz, non lo puoi più usare nell'Arduino, quindi lo programmerai con la tecnica ISP: a 'sto punto, avere un bootloader a bordo è solo uno sbattimento inutile perché non lo usi.

per il momento non ho avuto prob a caricare i sketch.

@mick:
hai ragione, alla fine ne esci pazzo
Dammi retta, freeza tutto ad ora, concludi la guida e non stare più dietro ad altro. Se qualcosa non sei riuscito ad implementarlo, rimandalo alla prox versione della guida. Se continui a chiedere, io continuo a metterti nuova carne sul fuoco

Me ne sono accorto, una caramellina alla volta mi farai diventare un pachiderma :grin:, ed io non sono uno stecchino :blush: Comunque alla fine ho trovato una soluzione soddisfacente, con la quale ho risolto contemporaneamente la problematica della Guida e la questione del clock out, ogni tanto un po' di cose tutte dritte XD
Ti anticipo il nocciolo, anche perché tutto parte dal tuo eccellente lavoro con gli attiny: in pratica sono partito col fusecalc al rovescio, cioè ho messo i 3 valori di Arduino UNO per vedere cosa usciva, e lì ho trovato la soluzione: praticamente Arduino NON è impostato per lavorare con "clock esterno" generico, come provavamo noi, bensì con clock esterno a 8MHz; non ho approfondito la problematica dell'oscillatore, altrimenti ero ancora lì a leggere :cold_sweat: :astonished:, però attivando il clock out a partire da quella configurazione mi ha funzionato al primo colpo, inoltre sempre partendo da quei valori ho ricavato quelli per gli stand alone a 8MHz e 1MHz con oscillatore interno su board minimal; devo fare un paio di controprove ma sono ragionevolmente convinto di aver risolto tutto.
Poi proseguirò con le prove di prescaler ma soprattutto con quelle di sleep, ma prima pubblico la guida. Grazie del prezioso aiuto! XD

Qui ti devo bacchettare ]:smiley:
Arduino è preimpostato per operare con clock esterno da 8 MHz in su. Difatti se guardi bene nel FuseCalc, quando metti i valori dei fuse dell'Arduino Uno che trovi nel file boards.txt, ti esce "Ext. Crystal Osc.; Frequency 8.0**-** MHz; ecc..."
Ecco quel segno "-" dopo 8.0 significa "da 8.0 in poi" XD
Mi sa che quel tuo monitor da laboratorio è ora che tu lo butti via :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

No, non mi posso nascondere dietro il monitor per questo, è che nelle convenzioni che conosco si usa + per dire maggiore, non - :astonished:, quindi questa mi è onestamente nuova; e infatti ho scritto che non avevo approfondito e poi mi pare questa storia dell'oscillatore esterno, senza indicazione da frequenza, non era partita da me.... io ieri ho cambaito percorso per risolvere i problemi, non per crearmene XD
Sei una fonte di informazioni, ma io imparo in fretta non è vero? :wink:

Se dici che io sono una fonte di informazioni, mi fai vergognare come un gatto nudo! :fearful:
Io che dovrei dire, all'ombra di voi guru dell'elettronica? :sweat_smile:
Che non so neanche la legge di Ohm a mente e che calcolo le resistenze con la funzione rnd()? :astonished:

tutti questi dubbi e problemini nascono dal fatto che il file boards.txt mischia varii concetti...
e come se in un unico file ci fossero configure make e make install.

azz come sei ermetico :astonished:

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 ?