- Cosa sono i fusibili in AVR - Una spiegazione dettagliata
- Fuse Bits in Arduino
- Componenti necessari per testare i fusibili nell'AVR
- Schema per testare i bit dei fusibili in AVR
- Testare i fusibili in AVR
In questo tutorial parleremo dei fusibili. Quando ero al college e imparavo tutte le cose interessanti dell'elettronica, ho sentito per la prima volta il termine fondere in AVR, il mio pensiero iniziale sull'argomento era, oh! c'è qualcosa all'interno dell'AVR che salterà se ho fatto qualcosa di sbagliato. A quel tempo, non c'erano molte risorse disponibili su Internet da utilizzare. Ho cercato un bel po 'per scoprire che questi fusibili si riferivano ad alcuni pezzi speciali all'interno del microcontrollore AVR. Questi bit sono come minuscoli interruttori all'interno dell'AVR e, attivandoli / disattivandoli, possiamo attivare / disattivare alcune funzioni speciali dell'AVR. Accenderlo e spegnerlo significa impostare e resettare.
Coglieremo l'occasione per discutere di tutto ciò che è presente sui bit Fuse in AVR. Per semplicità, prenderemo l'esempio di una scheda Arduino che ospita il popolare microcontrollore ATmega328P. Qui imparerai come impostare questi fusibili per attivare e disattivare alcune di queste funzionalità, il che è molto utile nelle applicazioni della vita reale. Quindi, entriamo subito.
Nei nostri post precedenti, abbiamo realizzato molti progetti di microcontrollori AVR come il modulo GSM di interfacciamento con microcontrollore AVR e l'interfaccia HC-05 con microcontrollore AVR. Puoi controllarli se vuoi saperne di più su quei progetti.
Cosa sono i fusibili in AVR - Una spiegazione dettagliata
Come abbiamo discusso in precedenza, i fusibili nel microcontrollore sono come piccoli interruttori che possono essere accesi e spenti per abilitare e disabilitare varie funzionalità nel microcontrollore AVR. Questa è la parte in cui sorge la nostra prossima domanda, quindi come impostiamo o ripristiniamo questi fusibili? La risposta a questa domanda è semplice: lo facciamo con l'aiuto dei registri dei fusibili.
Nell'IC ATmega328P, ci sono un totale di 19 bit di fusibile e sono divisi in tre byte di fusibile. Questi sono definiti come "Byte fusibile estesi", "Byte fusibile alto" e "Byte fusibile basso".
Se si guarda alla Tabella-27 della scheda tecnica dell'ATmega328 / P Rev: 7810D – AVR – 01/15, è possibile trovare tutti i piccoli dettagli sui bit dei fusibili. Ma l'immagine qui sotto ti darà un'idea migliore della sezione dei bit di fusibile del foglio dati.
Ora che hai imparato un po 'sui bit dei fusibili, esaminiamo la scheda tecnica e scopriamo tutti i dettagli necessari su questo IC.
I bit di fusibili estesi:
Una volta che si fa clic sulla scheda Fuse Bits e si scorre un po 'verso il basso, si trova la Tabella 27-5: che mostra la tabella per "Extended Fuse Byte" comunemente noto come " EFUSE". L'immagine sotto mostra esattamente questo.
In questa tabella ci sono solo tre bit utilizzabili e gli altri tre sono riservati. Questi tre bit riguardano il livello di rilevamento del calo di tensione. Come puoi vedere nella Nota, se guardiamo alla Tabella 28-5, possiamo trovare maggiori dettagli a riguardo.
Come puoi vedere nella tabella sopra, abbiamo la tabella per il rilevamento di brownout. Il rilevamento del brownout è una funzione che ripristina il microcontrollore quando la tensione di alimentazione scende al di sotto di un determinato livello di tensione. Nell'IC ATmega328P, possiamo disabilitare completamente il rilevamento del brownout o possiamo impostarlo sui livelli mostrati nella tabella sopra.
I byte di fusibile alto:
Come puoi vedere nell'immagine sotto, la tabella 27-6: del datasheet mostra i bit Higher Fuse dell'IC ATmega328P.
Il fusibile alto si occupa di varie attività all'interno del microcontrollore ATmega328. In questa sezione parleremo dei bit dei fusibili superiori e del loro funzionamento. Cominciamo con i bit BOOTRST, BOOTSZ0 e BOOTSZ1. Questi tre bit sono responsabili dell'impostazione della dimensione di avvio; dimensione di avvio si riferisce alla quantità di memoria riservata per l'installazione del bootloader.
Un bootloader è un software speciale che viene eseguito sul microcontrollore e gestisce diverse attività. Ma nel caso di Arduino, il bootloader viene utilizzato per caricare lo sketch di Arduino all'interno del microcontrollore. In uno dei nostri articoli precedenti, ti abbiamo mostrato come masterizzare il bootloader in ATmega328P usando Arduino. Puoi verificarlo se sei interessato all'argomento. Tornando al nostro argomento, gli scopi degli altri bit nel byte alto sono abbastanza chiari, il bit EESAVE è quello di preservare la memoria EEPROM mentre viene eseguito un ciclo di cancellazione del chip. Il bit WDTON serve per abilitare o disabilitare il Watchdog Timer.
Il timer watchdog è un timer speciale nell'IC ATmega328P che ha il suo orologio separato e funziona in modo indipendente. Se il timer del watchdog è abilitato, è necessario cancellarlo con un certo periodo, altrimenti il timer del watchdog ripristinerà il microcontrollore. Questa è una caratteristica utile che rientra in molti microcontrollori se il processore si blocca; il watchdog lo resetterà per evitare danni all'applicazione finale.
Il bit DWEN è lì per abilitare il cavo di debug; questo è un protocollo preparatorio che è integrato internamente nel loro hardware, che viene utilizzato per programmare ed eseguire il debug dei processori. Con questa funzione abilitata, è possibile eseguire il flashing ed eseguire il debug del processore con un singolo cavo collegato. Ma per usarlo, avrai bisogno di un hardware speciale che è preparatorio per Atmel.
I restanti due bit sono quei bit che devi evitare a meno che tu non sappia esattamente cosa stai facendo. Questi sono RSTDISBL bit-7 e SPIEN bit-5. RSTDISBL (External Reset Disable) come suggerisce il nome disabilita il pin di reset hardware esterno e il bit SPIEN viene utilizzato per disabilitare l'interfaccia di programmazione SPI. Disabilitare uno qualsiasi di questi due bit può bloccare completamente il tuo AVR; quindi, lasciarli soli è una buona idea.
I byte di fusibile basso:
Come puoi vedere nell'immagine sotto, la tabella 27-7: del datasheet mostra i bit del fusibile inferiore dell'IC ATmega328P.
Questo byte di fusibile è responsabile della configurazione della sorgente del clock e di alcuni altri parametri dell'orologio all'interno dell'AVR. In questa sezione impareremo tutto ciò.
Il settimo bit o il flag CKDIV8 possono essere impostati per dividere la sorgente del clock per 8, questo è molto utile che potresti già sapere se hai provato a programmare l'AVR da solo. Il bit successivo è il bit CKOUT ed è il sesto bit nel byte di fusibile basso. La programmazione emetterebbe il segnale di clock interno sulla PORTB0 del microcontrollore.
I bit-5 e bit-4 SUT1 e SUT0 controllano il tempo di avvio del microcontrollore. Ciò impedisce qualsiasi azione di avvio che può o non può avvenire prima che la tensione di alimentazione possa raggiungere un livello di tensione di soglia minimo accettabile. E gli ultimi quattro bit CKSEL0 - 4 vengono utilizzati per selezionare la sorgente di clock del microcontrollore. La tabella mostrata di seguito ti dà una migliore comprensione di questi quattro bit che sono responsabili della configurazione della sorgente di clock, puoi trovare questa tabella nella sezione Clock Source del foglio dati.
Ora, prima di andare oltre, c'è un'altra cosa che dovrei esaminare è la tabella per il ritardo di avvio dell'oscillatore. Per ritardo di avvio, ci riferiamo ai bit 4 e 5 del byte del fusibile inferiore. I ritardi devono essere impostati in base alla condizione in cui funzionerà il circuito e al tipo di oscillatore che si sta utilizzando. I valori predefiniti sono impostati per aumentare lentamente la potenza con 6 cicli di clock quando viene eseguita una sequenza di accensione o spegnimento. Successivamente, c'è un altro ritardo di 14 cicli di clock con 65 Ms di ritardo dopo l'avvio.
Phew! C'erano molte informazioni da digerire. Ma prima di procedere oltre, terminiamo questa sezione con una breve nota.
Nota:
Se avete guardato attentamente il datasheet, avrete notato che programmare un bit di fusibile significa impostarlo basso, cioè 0 (zero), che è l'opposto di quello che generalmente facciamo per rendere alta o bassa una porta. Devi tenerlo a mente durante la configurazione dei fusibili.
Fuse Bits in Arduino
Abbiamo parlato molto dei fusibili nella sezione precedente, ma in questa sezione parliamo di come configurarli e di come scriverli in un microcontrollore. Per questo, avremo bisogno di uno strumento chiamato Avrdude. È uno strumento che può essere utilizzato per leggere, scrivere e modificare la memoria nei microcontrollori AVR. Funziona con SPI e ha una lunga lista di supporto per diversi tipi di programmatori. è possibile scaricare lo strumento dal collegamento riportato di seguito. Inoltre, useremo il nostro microcontrollore preferito Arduino.
- Scarica Avrdude versione 6.3 Windows-ming32
Ora che hai Avrdude, devi estrarlo e aprire una finestra di comando in quella cartella. Inoltre, se prevedi di utilizzarlo in un secondo momento, puoi aggiungere il percorso della cartella alla sezione delle variabili di ambiente di Windows. Ma lo metterò sul mio desktop e aprirò una finestra di comando lì. Una volta fatto ciò, collegheremo il programmatore USBasp al nostro PC e ci assicureremo di avere il driver corretto per il nostro programmatore USBasp. Una volta fatto ciò, possiamo iniziare e leggeremo prima il valore del fusibile predefinito. Per farlo, devi eseguire il seguente comando.
avrdude.exe -c usbasp -p m328p -U lfuse: r: low_fuse_val.txt: h -U hfuse: r: high_fuse_val.txt: h -U efuse: r: ext_fuse_val.txt: h
Se tutto è corretto, questo comando leggerà i byte di fusibile e li inserirà in tre file di testo separati. L'immagine qui sotto ti darà un'idea migliore del processo.
Come puoi vedere, l'Avrdude ha letto i bit dei fusibili su Arduino nano e li ha salvati in tre file di testo separati. Ora, li abbiamo aperti e abbiamo ottenuto tre valori; per EFUSE: 0xFD, per HFUSE: 0XDA, per LFUSE: 0xFF. Questo era il valore di fusibile predefinito che abbiamo ottenuto per un Arduino nano. Ora, convertiamo questi bit in binari e confrontiamoli con il loro valore predefinito dal foglio dati. La tabella seguente mostra esattamente questo.
Per comodità, i bit dei fusibili sono scritti in valori esadecimali, ma se li convertiamo in valori binari e li confrontiamo con il foglio dati, sapremo cosa sta succedendo. Cominciamo con il Lower Fuse Byte. Come puoi vedere dalla stringa sopra, è impostato su 0XFF e il valore binario sarebbe 0B11111111.
Confronto dei byte di fusibili inferiori di stock con Arduino:
Byte basso fusibile |
Bit No. |
Valore predefinito in AVR |
Valore predefinito di Arduino |
CKDIV8 |
7 |
0 (programmato) |
1 (non programmato) |
CKOUT |
6 |
1 (non programmato) |
1 (non programmato) |
SUT1 |
5 |
1 (non programmato) |
1 (non programmato) |
SUT0 |
4 |
0 (programmato) |
1 (non programmato) |
CKSEL3 |
3 |
0 (programmato) |
1 (non programmato) |
CKSEL2 |
2 |
0 (programmato) |
1 (non programmato) |
CKSEL1 |
1 |
1 (non programmato) |
1 (non programmato) |
CKSEL0 |
0 |
0 (programmato) |
1 (non programmato) |
L'Higher Fuse Byte è impostato su 0XDA nel binario 0B11011010.
Byte fusibile più alto in binario:
Byte alto fusibile |
Bit No. |
Valore predefinito in AVR |
Valore predefinito di Arduino |
RSTDISBL |
7 |
1 (non programmato) |
1 (non programmato) |
DWEN |
6 |
1 (non programmato) |
1 (non programmato) |
SPIEN |
5 |
0 (programmato) |
0 (programmato) |
WDTON |
4 |
1 (non programmato) |
1 (non programmato) |
EESAVE |
3 |
1 (non programmato) |
1 (non programmato) |
BOOTSZ1 |
2 |
0 (programmato) |
0 (programmato) |
STIVALIZ0 |
1 |
0 (programmato) |
1 (non programmato) |
BOOTRST |
0 |
1 (non programmato) |
0 (programmato)) |
L'impostazione per il byte del fusibile esteso è impostata su 0XFD, in binario è 0B11111101.
Byte fusibile esteso in binario:
Byte fusibile esteso |
Bit No. |
Valore predefinito in AVR |
Valore predefinito di Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (non programmato) |
1 (non programmato) |
BODLEVEL1 |
1 |
1 (non programmato) |
0 (programmato) |
BODLEVEL0 |
0 |
1 (non programmato) |
1 (non programmato) |
Ora, questo segna la fine di questa sezione. A partire da ora, abbiamo imparato molto sul microcontrollore AVR e sui suoi bit di fusibile. Quindi, concludiamo questo articolo mettendo alla prova la nostra teoria alterando e sperimentando alcuni dei bit di fusibile in Arduino Nano.
Componenti necessari per testare i fusibili nell'AVR
Abbiamo parlato molto dei fusibili nella parte precedente. Ma per procedere ulteriormente nell'articolo, abbiamo bisogno di alcuni componenti hardware e alcuni strumenti software. In questa sezione parleremo di quelli. Di seguito è riportato un elenco dei componenti richiesti con le immagini.
- Breadboard - 1
- Arduino Nano - 1
- Programmatore AVR USBasp - 1
- Cavo USB - 1
- Convertitore AVR da 10 pin a 6 pin - 1
- Avrdude (strumento software per la programmazione di AVR)
- LED - 1
- Resistore 330R - 1
- Cavi jumper
Schema per testare i bit dei fusibili in AVR
La configurazione del test hardware è mostrata di seguito in questa configurazione. Abbiamo collegato Arduino Nano al PC con un cavo USB e abbiamo anche collegato il programmatore USBasp al PC. L'obiettivo di questo articolo è programmare i bit dei fusibili in AVR. Per questo motivo, abbiamo collegato il programmatore USBasp con Arduino. L'immagine qui sotto ti darà un'idea migliore della configurazione.
Testare i fusibili in AVR
La configurazione del test è mostrata di seguito. Come puoi vedere, abbiamo collegato sia il programmatore Arduino che USBasp all'USB del mio laptop.
Ora apriamo l'IDE di Arduino e carichiamo uno schizzo di blink di base. Il contenuto del blink sketch di base è autoesplicativo, quindi non ho inserito alcun dettaglio al riguardo.
Vedrai nel video che il led sul pin n. 13 lampeggia come dovrebbe. Ora modifichiamo le impostazioni del fusibile e impostiamo i valori predefiniti. E come abbiamo visto in precedenza nella scheda tecnica; l' EFUSE è 0XFF; l'HFUSE è D9; Il LFUSE è: 62. Ora configuriamolo con Avrdude, installiamolo e vediamo cosa succede. Il codice che useremo è-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Una volta fatto questo, vedrai che il LED lampeggerà molto lentamente perché abbiamo calcolato e programmato il valore per un clock a 16 Mhz e ora dopo aver bruciato i fusibili, è solo un oscillatore RC interno da 1 Mhz. Questo è il motivo per cui il LED lampeggia così lentamente. Ora proviamo a caricare di nuovo uno schizzo. Vedremo che Arduino restituisce un errore e il codice non viene caricato. Perché alterando i fusibili, abbiamo anche incasinato le impostazioni del bootloader. Puoi vederlo nell'immagine qui sotto.
Per risolvere questo problema e riportare Arduino come era prima, dobbiamo semplicemente masterizzare di nuovo il bootloader per Arduino. Per farlo, vai su Strumenti -> Programmatore- USBasp , e una volta fatto ciò, possiamo di nuovo andare su Strumenti e possiamo fare clic sull'opzione Masterizza bootloader. Questo brucerà di nuovo il bootloader di serie sul tuo Arduino e tutto tornerà come prima.
Dopo che il bootloader è stato riportato su Arduino, è tornato al suo stato originale e l'ultima immagine mostra un LED lampeggiante dopo che il bootloader è stato nuovamente masterizzato.
E questo segna la fine di questo articolo. Spero che l'articolo ti sia piaciuto e che abbia imparato qualcosa di nuovo. Se hai domande sull'articolo, non esitare a inserire un commento qui sotto.