Certo che ti faccio sapere, come anche a Leo e Astrobeed, che pazientemente sono riusciti nell'impresa di farmi mettere la libreria e le varie cartelle del tiny, dove andavano messe ![]()
Sul pin 7 le prove le ho fatte sempre, ma mi accettava solo il LOW.
Comunque con quella lib dovresti poter gestire l'evento FALLING tranquillamente (tranne che con clock a 16MHz)
sono curioso di vedere l'interazione della lib con sleep
BrainBooster:
Comunque con quella lib dovresti poter gestire l'evento FALLING tranquillamente (tranne che con clock a 16MHz)
sono curioso di vedere l'interazione della lib con sleep
Cos'è? quella cosa scostumata
? Io devo lavorare a 1MHz, devo ridurre i consumi al ridicolo, sono partito dal code che mi ha dato Astrobeed, nel quale ho integrato lo spegnimento dell'ADC e col 328 vado a meraviglia, ma vorrei realizzare sti scatolini col tiny (fa pure rima....), anche se, a occhio, mi sta consumando di più, ma comunque in teroria avrei una autonomia superiore al tempo di autoscarica della batteria, quindi XD XD
tranquillo, era solo per precisare che in caso qualcuno volesse usare la lib per altre cose, il funzionamento a 16Mhz non è testato.
Comunque credo che il settaggio dell'interrupt si possa fare anche senza la lib e scrivendo direttamente nei registri MCUCR A, GIMSK, GIFR, PCMSK, come fà la libreria
e scriverti la tua ISR per il tuo mcu invece che usare la libreria che contiene informazioni riguardanti anche altre mcu, cosi in caso di problemi di spazio potresti snellire un pò il codice.
ref. pag53 del datasheet
non infierire
il mio sketch occupa 900 bytes, altro che libreria, posso metterci ancora la biblioteca dei Musei Vaticani.
Ci sentiamo pomeriggio.
Grazie ancora, magari tra vent'anni approfondiremo quella cosa del muuh! ![]()
Well!!!!! XD XD XD XD
Funziona, qualsiasi pin imposto come interrupt accetta il change, GRAZIE!!!
Ora, se possibile il passaggio successivo; dovrei riuscire ad impostare il chip per lavorare a 1MHz per ridurre i consumi al massimo ma, con la solita tecnica ArduinoISP riesco ad inviare lo sketch ma non il bootloader. Nel file "bords.txt" di Leo, la board che mi interessa ha queste righe:
attiny85arduinoisp.name=ATtiny85 (w/ Arduino as ISP)
attiny85arduinoisp.upload.using=arduino:arduinoisp
attiny85arduinoisp.upload.maximum_size=8192
attiny85arduinoisp.build.mcu=attiny85
attiny85arduinoisp.build.f_cpu=1000000L
attiny85arduinoisp.build.core=attiny45_85
ma non va, con questa carico lo sketch ma non il bl, questi sono gli errori:
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: invalid byte value (null) specified for immediate mode
avrdude: write to file 'null' failed
Leo aveva scritto di ignorare i messaggi sul PAGEL, infatti escono anche quando carica correttamente lo sketch, ma qui ci sono quei null e il bl non viene caricato.
Se unifico la cartella di Leo con quella ufficiale tiny (ho provato a sovrascrivere in un senso e nell'altro i file doppi) e cambio l'ultima riga in:
attiny85arduinoisp.build.core=tiny
non cambia nulla; allora ho inserito i fuses prendendo queste righe dal file della 1MHz originale, insomma una specie di mix:
attiny85arduinoisp.name=ATtiny85 (w/ Arduino as ISP)
attiny85arduinoisp.upload.using=arduino:arduinoisp
attiny85arduinoisp.upload.maximum_size=8192
attiny85arduinoisp.bootloader.low_fuses=0x62
attiny85arduinoisp.bootloader.high_fuses=0xD7
attiny85arduinoisp.bootloader.extended_fuses=0xFF
attiny85arduinoisp.bootloader.file=empty85at1.hex
attiny85arduinoisp.bootloader.unlock_bits=0xFF
attiny85arduinoisp.bootloader.lock_bits=0xF
attiny85arduinoisp.build.mcu=attiny85
attiny85arduinoisp.build.f_cpu=1000000L
attiny85arduinoisp.build.core=tiny
esce l’errore:
avr_read(): error reading address 0x0000
read operation not supported for memory "lock"
avrdude: failed to read all of lock memory, rc=-2
ho notato che deriva dal fatto che aggiungo le due righe unlock/lock, se le tolgo escono gli errori di prima.
Quindi l'altro aiuto che mi serve è come configurare la board per farla lavorare sicuramente ad 1MHz, così penso stia lavorando a 8MHz, ma non riesco proprio a inviare i fuses.
Ce la faremo! ![]()
i lock bit non servono per i fuse che vuoi programmare, quindi puoi eliminare entrambe le righe.
comunque ho il dubbio che dall'ide di arduino dal file boards.txt si possano passare i parametri dei fuse solo se si stà facendo l'upload del bootloader , perchè li vede relativi a quella sezione e quindi in caso di caricamento di normale sketch vengono ignorati.
però potresti usare direttamente avrdude (fuori dall'ide) per scrivere i fuse.
sei su windows o su linux?
P.S.
se stai usando un attiny85 "vergine" allora sta già lavorando a 1MHz, cioè 8mhz con divisore interno a : 8 attivato.
Scusate se non sono intervenuto ma oggi sono a mezzo servizio. Solo ora ho trovato 2 minuti per fermarmi un attimo.
Io ho letto che uno stato sleep power-down può essere annullato solo da un segnale LOW su un pin. A me usando il codice di Michele non mi è riuscito far risvegliare il micro con un CHANGE o un HIGH.
Michele, hai scritto che ci sei riuscito: che codice hai usato? Come hai impostato il circuito? Vorrei provare.
Inoltre non capisco l'ultimo intervento: vuoi scrivere un bootloader sull'Attiny? Perché? A che ti serve?
no Leo, volevo solo dire che i fuse vengono passati solo quando si scrive un bootloader e quindi caricando solo lo sketch vengono ignorati... tutto qui.
BrainBooster:
i lock bit non servono per i fuse che vuoi programmare, quindi puoi eliminare entrambe le righe.
comunque ho il dubbio che dall'ide di arduino dal file boards.txt si possano passare i parametri dei fuse solo se si stà facendo l'upload del bootloader , perchè li vede relativi a quella sezione e quindi in caso di caricamento di normale sketch vengono ignorati.
però potresti usare direttamente avrdude (fuori dall'ide) per scrivere i fuse.
sei su windows o su linux?
P.S.
se stai usando un attiny85 "vergine" allora sta già lavorando a 1MHz, cioè 8mhz con divisore interno a : 8 attivato.
Sto lavorando in Windows e sto lavorando SOLO con ATtiny85 vergini, se sono già a 1MHz il problema non mi si pone più, il resto lo metto in risposta a Leo.
Ah, ok.
Effettivamente è vero, i valori impostati per i fuse vengono ignorati durante l'upload di un normale sketch, quindi i fuse vanno programmati con avrdude esternamente.
@Michele:
(ri)confermo: tutti i micro Atmel escono di fabbrica preimpostati con l'oscillatore interno ad 8 Mhz ed il divisore x8 per cui vanno tutti ad 1 MHz.
leo72:
Scusate se non sono intervenuto ma oggi sono a mezzo servizio. Solo ora ho trovato 2 minuti per fermarmi un attimo.Io ho letto che uno stato sleep power-down può essere annullato solo da un segnale LOW su un pin. A me usando il codice di Michele non mi è riuscito far risvegliare il micro con un CHANGE o un HIGH.
Michele, hai scritto che ci sei riuscito: che codice hai usato? Come hai impostato il circuito? Vorrei provare.Inoltre non capisco l'ultimo intervento: vuoi scrivere un bootloader sull'Attiny? Perché? A che ti serve?
Ciao Leo, scusa tu, ovviamente l'avrei fatto, aspettavo di risolvere la questione del clock. Il "trucco" sta in ciò che pensavo e cioè, come suggerito da BB, dovevo usare un comando specifico per gestire l'interrupt con la nuova libreria. Nel codice vedrai che ho usato un pin che non è l'INT0, appunto.
La questione del bootloader si spiega per il fatto che ritenevo l'unico modo per poter impostare a 1MHz la frequenza del tiny, ma, da quanto dice BB sembra siano già a 1MHz (e forse me l'avevi detto anche tu!); inoltre dalle mille prove fatte con gli atmega, ho constatato con certezza che se carico gli sketch su chip con i quali ho giocherellato, i tempi si comportano in modo differente, invece mettendo prima il bl a 1MHz tutto funziona allo stesso modo su ogni chip, volevo fare la stessa cosa anche qui.
Il code che ti posto è il test, inutile che metto quello del sensore perché prevede una serie di uscite che non ti servono, ma se lo vuoi chiedi. Ho messo tutti i chiarimenti per comprendere il funzionamento.
#include <avr/sleep.h> // libreria standard (avrlib) per lo sleep
#include <PinChangeInterruptSimple.h> // questa libreria permette di usare un qualsiasi pin come interrupt
/* Sleep test */
#define Sveglia 2 // pin 7 dell'attiny corrispondente a INT0
#define LED 4 // pin 3 dell'attiny85
void sbadiglio() // risveglio dallo sleep
{
// inserire eventuali azioni legate all'interrupt
}
void setup()
{
pinMode(Sveglia, INPUT);
//digitalWrite(Sveglia, HIGH);
pinMode(LED, OUTPUT);
//digitalWrite(Sveglia, 1); // pull up attiva sul pin interrupt, ma conviene usare una 180K esterna
attachPcInterrupt(Sveglia, sbadiglio, LOW); // interrupt 0
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // setta registri per il modo sleep
sleep_enable(); // abilita la sleep all'uso
}
void A_nanna() // funzione attivazione sleep
{
attachPcInterrupt(Sveglia, sbadiglio, CHANGE); // riattiva l'interrupt
ADCSRA &= ~(1 << ADEN);
sleep_mode(); // mette in stato di sleep
sleep_disable(); // disattiva la modalità sleep e riporta il micro a piena operatività
detachPcInterrupt(Sveglia); // disattiva l'interrupt
}
void loop()
{
for(byte i=0;i<4;i++)
{
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
A_nanna(); // mette il micro in sleep
}
Al solito alimenta e metti una R da 1K ed un led sul pin 3 dell'attiny, vedrai che funziona a meraviglia; le misure te le fornisco io:
in fase operativa con led acceso circa 1,5-2,5mA; a riposto dovrebbero essere circa 150nA, cioè più del 328p
ecco perché pensavo di lavorare a 8MHz, ma forse la libreria sleep non spegne tutto; in ogni caso sono consumi irrisori, una batteria da 3,6V 1200mAH si scaricherà molto prima per vecchiaia che non per il consumo, quindi problema risolto!.
Naturalmente scrivo un paio di pagine sulla modalità sleep dei due chip, per chi vuole realizzare stand alone da alimentare a batteria, ove possibile.
leo72:
Ah, ok.
Effettivamente è vero, i valori impostati per i fuse vengono ignorati durante l'upload di un normale sketch, quindi i fuse vanno programmati con avrdude esternamente.@Michele:
(ri)confermo: tutti i micro Atmel escono di fabbrica preimpostati con l'oscillatore interno ad 8 Mhz ed il divisore x8 per cui vanno tutti ad 1 MHz.
perdonami ma dopo tanti post qualche info la perdo.... Insisto sull'argomento solo per conoscenza; ma noi finora con gli atmega e ArduinoISP non abbiamo programmato regolarmente i 3 fuses? Come hai visto anche tu le boards "originali" tiny prevedono espressamente ArduinoISP, perché non si riesce a mettere il bootloader con la stessa tecnica, ma solo lo sketch (col quale, naturalmente, non avevo alcuna intenzione di cambiare i fuses, qualcosa l'ho imparata ultimamente... XD)
Con la tecninca ArduinoUnoISP si riusce a modificare anche i fuse perché, giustamente, si programma anche il bootloader, quindi si fanno modificare all'IDE (tramite avrdude) anche loro.
Siccome su un Attiny45/85 il bootloader è un lusso inutile, non programmando il bootloader non si modificano i fuse. Come ha precisato Brain (e come avevo anche io in passato constatato) usando l'IDE non riuscivo a modificare i fuse tramite il semplice upload dello sketch. Io difatti lo avevo fatto sempre ricorrendo al mio USBtinyISP.
Proverò con calma il tuo codice (attualmente sto cambiando SO al computer fisso e sto scrivendo dal portatile)
... chissà se modificando il file boards.txt e mettendo righe tipo:
attiny85arduinoisp.upload.low=0x62
attiny85arduinoisp.upload.high=0xDF
attiny85arduinoisp.upload.extended=0xFF
si riescono a passare i fuse anche con gli sketch... 8)
Non lo so, perché io questo lo faccio regolarmente, visto che uso la board per inviare lo sketch, e contiene anche i fuses, non ho riscontro, o meglio, forse posso averlo, se cambio i fuses e attivo l'uscita su pin dell'oscillatore interno, provo, tu non ti muovere... ![]()
sai com'è... sapere che se serve si può fare anche unatantum modificando il file è tutta un'altra cosa..
niente da fare, sul PB4 non esce nulla, vengono proprio ignorati i valori dei fuses col solo sketch; mi resta incomprensibile il fatto che col sistema ArduinoISP si possa inviare il bl all'atmega e non a questo. boh ![]()
ma hai provato a uploadare tenendo premuto shift , così si vedono le opzioni passate nella finestra di debug?
azz! no bellissimo!, ma non ci capisco una (sei siciliano vero? sai di che parlo
)
Però a ben guardare ho trovato questa riga
SCK period : 0.1 us
è un periodo che tradotto in frequenza significa proprio 1MHz, quindi è confermato, credo ![]()
@leo
dimenticavo, attiva la riga del digitalWrite, altrimenti si comporta un po' diversamente lo sleep.
Fammi sapere.