Ciao a tutti, vi scrivo per un aiuto sul setting dei fuse del solito ATmega 328P.
Premessa: mi avevate già aiutato per un modulo display (Volt, Amp, Temp) acquistato su ebay e su cui volevo modificare il programma (messaggio di avvio e caratteri speciali).
Tutto bene se non fosse che le misurazioni di corrente, basata su shunt, non mi soddisfacevano. Imprecise, erano scarse sotto 1Amp e abbondanti sopra 1 Amp. Anche la volontà di correggerla con il programma richiedeva un'equazione non lineare, non alla mia portata.
Da cui la prova volante con un sensore di corrente ad effetto Hall (ACS714-5A). Molto più precise le misure su correnti basse.
Scopiazzando un progetto in rete di un progetto simile che usava lo stesso sensore di corrente, ho pensato bene di disegnarmi il pcb nuovo con l'aggiunta del sensore Dallas.
Questo progetto però ha l'oscillatore esterno da 16MHZ. Ora mi trovo nella situazione in cui devo settare i fuse (clock ext) con il configuratore AVR, ma cosa succede che settato il primo, mi da un errore non appena inserisco il successivo:
Error: expected signature for ATmega328P is 1E 95 0F
double check connections and try again, or use -F to carry on regardless
e non riesco a compilare gli altri due.
Da quello che ho intuito è che istruendolo a servirsi di un clock esterno con la prima (lfuse 0x62) poi non trova questo clock ext per proseguire nella programmazione. Ma forse non ho capito niente. Vi allego le immagini del modulo , del solito accrocchio Arduino UNO +shield, dei settaggi TOOL e lo schema elettrico.
Grazie Datman, porta pazienza ma mi serve un passo-passo. Con l'oscillatore esterno non ho esperienza.
Io vedo che a bordo del programmer shield c'è già un oscillatore esterno. Come posso istruire IDE a farglielo vedere. Ho postato una schermata dei settaggi in TOOL di IDE. Forse lì c'è qualche spunta che non va?
"External" significa oscillatore esterno, non quarzo! Leggi il datasheet dell'ATmega328p.
Ti serve un oscillatore a 16MHz. Puoi spillarlo da un economico clone di Arduino Uno con 328 DIL, oppure puoi usare un oscillatore DIL. Io usai il generatore DDS che feci con una schedina cinese con AD9850 e ATmega328p.
Questo errore solitamente indica che arduino come ISP riesce a dialogare con l'ATmega328p, occhio che la p finale è determinante. Ora sembra che la MCU non ha la p. La singature è un codice identificativo di queste MCU, ognuna ha il suo.
Quindi l'errore è da interpretare così:
Mi aspetto una signature per ATmega328p ma sto dialogando con una MCU diversa.
Seconda cosa, se il low fuse vale 0x62 hai selezionato l'oscillatore interno RC che lavora ad 8MHz, c'è anche il bit CKDIV8 marcato, il che divide per 8 gli 8MHz, per cui la MCU viaggia a 1MHz.
Questo è il low fuse di default quando acquisti la MCU vergine arriva con low fuse = 0x62.
Fino a qui ci siamo?
Ora mi parli di oscillatore esterno, però io vedo un quarzo che è cosa ben diversa dall'oscillatore esterno. Il quarzo deve essere da 16MHz con i due condensatori da 22pf.
Il quarzo che c'è sulla shield cosè?
Stessa domanda per quello che c'è sulla scheda voltmetro.
Ripeto, quell'errore indica che c'è dialogo tra la MCU e arduino ISP. Se fossi riuscito a cambiare il low fuse sbagliandolo avresti bloccato la MCU e quell'errore non potrebbe comparire.
Importante: abilita il verbose nell'ide per avere maggiori informazioni su ciò che fa l'ide, così ti mostra i programmi che avvia e gli argomenti. Fatto ciò, dovresti vedere una riga che inizia con: avrdude.
copiala e incolla sul post.
avrdude è un programma a riga di comando, io questo preferisco usare.
Per configurare la MCU per quarzo a 16MHz vedi immagine sotto:
Nella scelta che ho a disposizione dei microcontroller non ho il 328P , nelle preference ho caricato questa aditional boards
Forse ne esiste un'altra che dovrei caricare?
Qua devo aver fatto casino io. Mi è chiaro il concetto che devo impostare fuse bit per oscillatore ext da 16MHZ, con i codici giusti. Ho 4 Atmega328P , 2 dei quali li ho bloccati con sta storia dell' error signature, poi vedremo come resettarli.
Sia sulla shield che sul voltmetro sono presenti due quarzi da 16Mhz. Sulla shield vedo due condensatori SMD dal valore indefinibile. Sul Voltmetro ho due condensatori da 18pf come da datasheet quarzo ATS16B
Fatto! Sotto una parte delle info:
System wide configuration file is C:\Users\Pat\AppData\Local\Arduino15\packages\MiniCore\tools\avrdude\8.0-arduino.1\etc\avrdude.conf
Using port : COM3
Using programmer : stk500v1
Setting baud rate : 19200
AVR part : ATmega328P
Programming modes : SPM, ISP, HVPP, debugWIRE
Programmer type : STK500
Description : Atmel STK500 v1
HW Version : 2
FW Version : 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.0 us
XTAL frequency : 7.372800 MHz
AVR device initialized and ready to accept instructions
Device signature = 1E 95 0F (ATmega328P, ATA6614Q, LGT8F328P)
Auto-erasing chip as flash memory needs programming (-U flash:w:...)
specify the -D option to disable this feature
Sotto vedi la situazione fuse bit partendo da ATmega328P vergine dove come prima cosa ho fatto un BURN BOOTLOADER (letto in giro per il web).
Mi ha messo f7 su lfuse che corrisponde ad un CKSEL=0111
Per aggiornarlo ai tuoi suggeriti vorrei prima approfondire se riconosce il 328P o serve altra additional boards. Era per evitare di bloccare un altro microc.
LF: 0xDE è oscillatore 8MHz esterno è con quarzo fra 8 e 16MHz, simile a 0xFF ma con Start-up time differente: https://www.engbedded.com/fusecalc/
Se vuoi fare spesso queste cose, fatti il Fuse Rescue! Etemenanki ha anche disegnato il circuito stampato:
Per come l'ho pensato, non serve solo per recuperare microcontrollori bloccati, ma permette anche di impostare in un attimo i fuse desiderati, scegliendoli fra le configurazioni preimpostate (e modificabili prima della programmazione del Fuse Rescue) o impostando manualmente i valori esadecimali.
Dove:
-p m328p è la MCU target, cioè quella che vuoi interrogare. Questo ti da la possibilità di selezionare qualunque MCU, e non ci dovrebbero essere più i messaggi di signature errata.
-c stk500 è il protocollo di comunicazione, potrebbe anche essere stk500v1 ma non ho controllato
-P nel tuo caso su windows dovrebbe essere -P COM3
-b 115200 è la velocità di trasmissione in baud rate, potrebbe essere 57600 o 19200.
Questo comando ovviamente devi darlo nella shell del DOS.
PS: disconosco windows dal 2004.
Grande Mauro, non mollare. Anche i ciuchi come me possono dare qualche piccola soddisfazione
Per i fuse ho imparato a leggerli e cambiarli dal "prompt" di Windows.
Io utilizzo questa riga :
Ho provato la tua, ma mi dava timeout. Forse è da perfezionare la sintassi.
Poi ho cambiato i fuse come da tue indicazioni. Efuse era già FF, poi Hfuse D9 e per ultimo Lfuse DE.
Mi chiedevo come mai Lfuse DE corrisponde a EXT.Crystal Osc. da 8MHZ e non 16.
Il microc non si è imbizzarrito e ora sono messo così:
Ho caricato il programma per la fretta di vedere qualcosa, ma c'è ancora da lavorare ahimè.
Anzichè il mess di avvio, sono comparsi gli space invaders.
Perché ho sbagliato . Il low fuse 0xff è quello usato da arduino uno/2009, corrisponde a CKSEL=111 e SUT=11
Comunque, se leggi i fuse non hai bloccato la MCU, quando la blocchi non c'è più comunicazione a causa della mancanza di clock, allora non resta che fornire il clock come impostato dal low fuse, se ciò non è possibile per mancanza di componenti o strumentazione, non resta che la programmazione parallela come suggerito da @Datman.
I geroglifici probabilmente dipendono dal fatto che il quarzo è da 16 ma il fuse lo configura ad 8, oppure dipende da altro.
Arduino usa questi fuse:
atmega328_isp: HFUSE = DA
atmega328_isp: LFUSE = FF
atmega328_isp: EFUSE = 05
Occhio all'ordine H, L, E.
EFUSE 0x05 imposta il brown-out a 2.7v.
HFUSE=0xda funziona sia se installerai il bootloader, sia scrivi con arduino isp.
EFuse dovrebbe essere impostato a 0xFD. Nell'ATMega328p, infatti, sono usati solo i primi 3 bit (quelli più a destra) e solo il secondo deve essere programmato a 0. Lasciando a 1 (cioè non programmati) quelli inutilizzati, si ha 0xFD; con 0x05, invece, quelli inutilizzati vengono programmati a 0:
Se prendete il file "boards.txt", per ogni board (quindi per ogni tipo di Arduino) ci sono chiaramente indicati i FUSE impostati di fabbrica su tali Arduino ...
Qualcosa sta andando a posto finalmente, grazie al vostro aiuto!
Ora devo lavorare sul programma per avere letture precise V, A; poi c'è da configurare il sens Temp.
Alla fine ho usato i fuse di Arduino UNO R3. (quelli di Gugliemo). Poi vi romperò le scatole più avanti per vedere di recuperare i due Atmega328P bloccati dall'errore di signature.
Per ora grazie infinite Mauro , Datman e Guglielmo.