Ciao a tutti, sto per costruire un bromografo ed ho pensato di progettare anche un timer per gestire i tempi di esposizione, visto che un atmega328 è sprecato ho pensato di usare un attiny85, lo programmo con arduinoISP , è la prima volta che uso attiny85 e l'unico problema che ho riscontrato è il malfunzionamento delle funzioni delay e millis.
Da premettere che ho seguito la guida di nuova elettronica del mese scorso per programmare gli attiny con arduino, ho scaricato i file necessari da google code e modificato il file board.txt.
Vorrei usare l'attiny85 a 8Mhz con oscillatore interno e in effetti quando vado a flashare seleziono proprio la configurazione tra le varie board "ATtiny85 @ 8Mhz (internal oscillator; BOD disabled)" e va tutto liscio, infatti collegando tutto il circuito non ci sono problemi, l'unica cosa come dicevo prima le funzioni delay e millis funzionano con molto ritardo, ad esempio se scrivo delay(1000) il tempo di delay non è di un secondo ma circa 7-10 secondi.
Io credo che dipende dalla frequenza di 8Mhz forse queste funzioni sono state create per funzionare a 16Mhz, voi come vi regolate, bisogna modificare qualcosa per ottenere il giusto funzionamento ?
Devi prima programmare i fuse del Tiny impostando il clock interno ad 8 MHz.
Hai seguito la mia guida per i Tiny? Lì c'è scritto come usare l'Arduino per impostare i fuse per fare andare i micro ad 8 MHz.
avevo anch'io lo stesso problema è perchè devi programmare i fuse per farlo andare a 8MHz, così lui sta andando a 1MHz e quei delay di un secondo in realtà durano 8 per questo motivo
Grazie per le info ragazzi, come sospettavo allora, infatti programmandolo per farlo andare ad 1Mhz delay e millis funzionano.
Quindi la soluzione e seguire questa guida per programmare i fuse:
Se invece volete utilizzare l'Arduino UNO, dovete utilizzare avrdude distribuito insieme all'IDE di Arduino, che è una versione patchata di avrdude per riconoscere l'Arduino come programmatore ISP. Aprite quindi un terminale in /arduino-0022/hardware/tools e digitate il seguente comando:
./avrdude -P /dev/ttyACM0 -C ./avrdude.conf -U lfuse:w:0xe2:m -p t85 -c stk500v1 -b 19200
Che va interpreta nel seguente modo:
parametro “-P”: specifica l'indirizzo del programmatore. Nel mio caso ho messo /dev/ttyACM0 ma dipende da sistema a sistema, potrebbe anche essere ad esempio /dev/ttyS0.
Parametro “-U”: indica su quale memoria del microcontrollore operare e che operazione deve essere eseguita. Nel nostro esempio “lfuse” indica il fuse basso (“low fuse”), “w” sta per scrittura (“write”), 0xe2 è il valore esadecimale da programmare, che disabilita il divisore x8 senza toccare le altre impostazioni di default del microcontrollore e “m” indica ad avrdude di usare direttamente il parametro (“m” per “immediate”). Se volete giocare con gli altri parametri dei fuse, potete usare l'utile Calcolatore online di fuse.
Parametro “-p”: indica il tipo di microcontrollore, nel nostro esempio “t85” sta per ATtiny 85.
Parametro “-c”: indica il programmatore da usare, in questo caso “usbtiny” sta per USBtinyISP.
Parametro "-C": indica un file di configurazione dei micro da usare per la programmazione
Parametro: "-b": indica la velocità di comunicazione in baud
Usando l'Arduino UNO, ricordatevi di inserire il condensatore prima di lanciare avrdude altrimenti l'Optiboot dell'Arduino resetterà la scheda impedendo la programmazione dell'Attiny.
e successivamente caricare lo sketch che si desidera ?
I comandi da terminale valgono anche per windows o solo per linux ?
Ho notato che il mio sketch timer va bene lo stesso anche ad 1Mhz, forse i tempi non sono molto precisi per via dell'oscillatore interno ma credo che secondo più secondo meno per l'esposizione non faccia differenza.
Un altra cosa, oltre all'attiny quali altri microcontrollori si possono programmare facilmente con arduino, stavo pensando di fare un ordine per provare qualche altro micro in modo da avere alternative all'atmega328 che oltre ad essere quasi irreperibile a volte è troppo per applicazioni base.
leo72:
La riga cambia leggermente, devi solo adattare la parte relativa ai path, poi i parametri sono identici.
Se invece uso ubuntu la riga è identica ?
Ce l'ho installato sul portatile devo solo installare l'ide di arduino, preferisco andare sul sicuro, non mi va di fare prove che potrebbero rivelarsi catastrofiche...
Provo a scrivere quì per non aprire un nuovo topic.
Non riesco a risolvere un problema al quanto strano riscontrato con ATtiny85
Lo sketch utilizza le funzioni mills() e delay() per attivare un pin ogni X secondi.
Prima di caricare lo sketch, ho impostato "Attiny85 8Mhk internal" e fatto "burn bootloader". Utilizzo Arduino come ISP
Se a X è impostato un valore fino a 32000 milisecondi tutto bene, il pin si attiva ogni 30s.
Se imposto un valore maggiore di 32000, il pin si attiva solo la prima volta, poi non più.
Secondo voi è un problema di sketch? O dell'Attiny?
@ciaccios: essendo il tuo primo post, ti chiedo cortesemente di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto ) e di leggere con attenzione il REGOLAMENTO ...
... poi, non vedo allegato alcuno sketch, ma dal sintomo direi che hai dichiarato X come int invece che come unsigned long (millis() ritorna un unsigned long).
gpb01: @ciaccios: essendo il tuo primo post, ti chiedo cortesemente di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto ) e di leggere con attenzione il REGOLAMENTO ...
Ciao Guglielmo, grazie per il reminder. Purtroppo ho dovuto creare un nuovo account al volo e ho dimenticato di ripostare la presentazione. Lo farò al più presto.
gpb01:
... poi, non vedo allegato alcuno sketch, ma dal sintomo direi che hai dichiarato X come int invece che
'aspita... senza neanche vederlo direi che hai fatto centro! Ora dovrebbe esserci anche l'allegato, appena arrivo in laboratorio provo a fare il test dichiarando i valori ora int come unsigned.
Perché l'oscillatore interno è estremamente impreciso (oltre che fortemente dipendente dalla temperatura), con un margine di errore che va addirittura fino al 10%. O usi un quarzo esterno, oppure puoi fare una procedura di calibrazione che dovrebbe migliorare un po' le cose, calcolandoti un valore di OSCCAL che fa al caso tuo. Prova a googlare "tinytuner".
SukkoPera:
O usi un quarzo esterno, oppure puoi fare una procedura di calibrazione che dovrebbe migliorare un po' le cose, calcolandoti un valore di OSCCAL che fa al caso tuo. Prova a googlare "tinytuner".
Grazie per la risposta, pienamente esaustiva! Non avevo mai fato caso al fatto che pur avendo usato attiny svariate volte, la precisione del clock non era mai cruciale per l'applicazione..
Purtroppo ho già 100pcb sulla strada da shenzen quindi non mi resta che fare un tuning del pessimo RC interno sperando di poter arrivare accettabilmente a tempi di qualche minuto. (@1Mhz impostando per esempio 180000ms, con errore 1%, dovrei avere un'errore di circa 2sec su 3minuti)
con un quarzo esterno a che precisione arriverei?
Proverò con il Poor Man's Tiny Tuner 1 che mi sembra il più immediato, poi mi preoccuperò su come velocizzare il processo di tuning x100 attiny
Qualcuno ha avuto esperienze con molti attiny? mi chiedevo se, fissata la tensione di alimentazione ad esempio, fosse ricorrente un certo valore di OSCCAL ....