Buonasera a tutto il forum
Perdonatemi se l'argomento è già stato discusso.
Sto sbattendo la testa da un paio di giorni senza venirne fuori.
Devo (vorrei) emulare un DS2413 su Attiny85 e ho usato uno Sketch trovato in rete di JAN FLEET del 2018.
Lo Sketch si compila perfettamente senza errori e funziona su Arduino UNO Duemilanove e Nano, però non riesco afarlo funzionare su Attiny85. ho provato con diverse board però non funziona.
Probabilmente sbaglio qualcosa ma, dall'alto della mia ignoranza non riesco a capire cosa.
Qualcuno ha già avuto lo stesso problema?
Appena riesco a capire come allegare lo sketch lo inserisco
DS2413_on_Tiny85.ino (5.0 KB)`
Il repositor del progetto dovrebbe essere questo, giusto?
Notato il commento nel file LowLevel.h
#if defined (__AVR_ATtiny85__)
``
/* Note : The attiny85 clock speed = 16mhz (fuses L 0xF1, H 0xDF. E oxFF
OSCCAL VALUE must also be calibrated to 16mhz
``
*/
Cioè deve avere il clock a 16MHz e specifica anche i valori dei Fuse byte.
Le tempistiche di OneWire sono critiche.
Ciao.
NON è solo questione dei FUSE ... occorre mettere mani al OSCCAL, normalmente usato per calibrare perfettamente l'oscillatore interno, per "scalibrarlo" e portarlo al 200% della frequenza standard. Datasheet, pagina 31, sezione "6.5.1 OSCCAL – Oscillator Calibration Register".
Se occorre precisione, forse sarebbe meglio usare il classico quarzo a 16 MHz collegato ai pin di PB3 e PB4 e cambiare i fuse per l'oscillatore quarzato (sezione "6.2.6 Crystal Oscillator / Ceramic Resonator").
Guglielmo
Ragazzi grazie per le sollecite risposte.
Ora sono in ferie in un "postaccio" chiamato IS ARENAS
, lunedi appena rientro provo immediatamente
Niente da fare.
Ho impostato i fuse L= 0xF1, H= 0xDF, E= 0xFF,
LB non sapevo come impostarlo e l'ho lasciato a 0xFF
ho ricompilato e esportato il .HEX con l'IDE di Arduino e caricato con Avrdudess e Arduino as ISP
AIUTOO!!
Scusa ma lo hai letto e capito il mio post #3? Perché ti ho detto che NON basta programmare i FUSE.
Guglielmo
Si l'ho letto. Il problema grave e' che non so dove intervenire ![]()
Dato per scontato che i FUSE sono correttamente programmati, all'inizio del programma dovresti fare un qualcosa simile a:
cli (); // disabilita gli interrupts
// qui va un ciclo che incrementa OSCCAL fino al valore di 0x7F in piccoli step massimo di 0x20
sei (); // riabilita gli interrupts
... occorre usare un ciclo perchè NON si può fare direttamente OSCCAL = 0x7F; portandolo subito al massimo, infatti il datasheet specifica:
To ensure stable operation of the MCU the calibration value should be changed in small. A variation in frequency of more than 2% from one cycle to the next can lead to unpredicatble behavior. Changes in OSCCAL should not exceed 0x20 for each calibration.
Inoltre attenzione, la EEPROM viene così resa inutilizzabile, infatti, come si legge nel datasheet:
Note that this oscillator is used to time EEPROM and Flash write accesses, and these write times will be affected accordingly. If the EEPROM or Flash are written, do not calibrate to more than 8.8 MHz. Otherwise, the EEPROM or Flash write may fail.
Guglielmo
P.S.: è importante anche notare la seguente precisazione nel datasheet:
The CAL7 bit determines the range of operation for the oscillator. Setting this bit to 0 gives the lowest frequency range, setting this bit to 1 gives the highest frequency range. The two frequency ranges are overlapping, in other words a setting of OSCCAL = 0x7F gives a higher frequency than OSCCAL = 0x80.
![]()
Ah ... importante, TUTTO QUANTO DA ME DETTO è valido se si usa l'oscillatore calibrato RC interno (LOW=0xE2, HIGH=0xDF, EXT=0xFF) e NON il PLL come, purtroppo vedo solo ora (mea culpa)
, stai facendo tu ...
... se si usa il PLL è bene, come spiega il datasheet, NON andare a giocare con il registro OSCCAL per evitare problemi:
Therefore, it is recommended not to take the OSCCAL adjustments to a higher frequency than 8 MHz in order to keep the PLL in the correct operating range.
Quindi, se il tuo progetto prevede i FUSE per l'uso del PLL (LOW=F1), con frequenza fissata a 16 MHz, è bene NON andare a toccare OSCCAL.
Guglielmo
Graficamente, usando i FUSE che hai indicato TU, il percorso del clock è il seguente (PLL):
... mentre io stavo seguendo la strada del RC corretto dal OSCCAL (RC):
Però, SE il progetto originale prevede l'uso del PLL si vede che deve funzionare con il PLL e quindi ... il problema è probabilmente altrove ![]()
Guglielmo
Effettivamente non c'è garanzia che l'oscillatore RC interno produca esattamente 8 MHz e che quindi il PLL, che usa come ingresso detto oscillatore, generi esattamente 16 MHz ... ![]()
Se la cosa è veramente così critica come sembra, bisogna allora passare prima per una fase di calibrazione in cui si scopre il valore di OSCCAL non per aumentare la frequenza dell'oscillatore RC, ma per calibrarla esattamente a 8 MHz. Trovato il valore di OSCCAL che fa si che l'oscillatore interno generi esattamente gli 8 MHz, si dovrebbe avere di conseguneza che il PLL genererà esattamente i 16 MHz.
Sempre facendo riferimento al datasheet, il punto 6.2.3 "Calibrated Internal Oscillator" spiega la cosa.
Guglielmo
Senza andare su cose troppo complesse (come un'application note di Atmel che fa riferimento ad un programma assembler ed Atmel Studio per la calibrazione), forse QUESTO può aiutare ![]()
Guglielmo
Avendo un frequenzimetro piuttoso preciso, la calibrazione, su ATTiny85, potrebbe essere fatta ancora più semplicemente ... programmando difatti l'apposito FUSE "CKOUT" (LOW FUSE bit 6) si può richiedere che il clock della MCU venga inviato all'esterno tramite il pin "CLKO" (PB4) dove, collegato un frequenzimetro, si può leggere esattamente la frequenza ![]()
Variando OSCCAL in piccolo passi dovrebbe essere possibile ottenere esattamente gli 8 MHz voluti!
Guglielmo
Dopo infinite prove e aggiustamenti (grazie ancora) qualcosa comincia a muoversi. Funziona ... a volte.
Mi spiego meglio, ho calibrato l'oscillatore a 8 MHz e il DS2413 emulato ha iniziato a funzionare. Dopo un paio d'ore ha smesso, e dopo un po' ha ripreso. Ho provato con 3 attiny85 diversi ma il risultato non cambia. Boh!
Bene ... purtroppo credo che il problema stia nell'oscillatore interno RC che ... è piuttosto sensibile alla temperatura e che, se calibrato la mattina quando fa fresco, è scalibrato a mezzogiorno con il caldo. ![]()
Per fare una cosa fatta bene dovresti abbandonare l'oscillatore RC interno, usare un buon quarzo e modificare di conseguenza i FUSE (OSCCAL non ha alcun effetto sul quarzo esterno) ... ![]()
Guglielmo
A questo punto credo che aspetterò i 2413 dalla Cina. Aggiungendo il quarzo non rientro nello spazio a disposizione.
Ancora grazie a tutti per l'aiuto.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.

