Sommario:

Configurazione dei fusibili del microcontrollore AVR. Creazione e caricamento nella memoria flash del microcontrollore del programma di lampeggio dei LED.: 5 passaggi
Configurazione dei fusibili del microcontrollore AVR. Creazione e caricamento nella memoria flash del microcontrollore del programma di lampeggio dei LED.: 5 passaggi

Video: Configurazione dei fusibili del microcontrollore AVR. Creazione e caricamento nella memoria flash del microcontrollore del programma di lampeggio dei LED.: 5 passaggi

Video: Configurazione dei fusibili del microcontrollore AVR. Creazione e caricamento nella memoria flash del microcontrollore del programma di lampeggio dei LED.: 5 passaggi
Video: AVR Microcontroller. Chip fuse bits configuration. Creating and uploading the LED blinking program. 2024, Giugno
Anonim
Image
Image

In questo caso creeremo un semplice programma in codice C e lo masterizzeremo nella memoria del microcontrollore. Scriveremo il nostro programma e compileremo il file esadecimale, utilizzando Atmel Studio come piattaforma di sviluppo integrata. Configurare i bit dei fusibili e caricare il file esadecimale nella memoria del microcontrollore AVR ATMega328P, utilizzando il nostro programmatore e il software AVRDUDE.

AVRDUDE - è un programma per scaricare e caricare le memorie su chip dei microcontrollori AVR di Atmel. Può programmare Flash ed EEPROM e, ove supportato dal protocollo di programmazione seriale, può programmare fusibili e bit di blocco.

Passaggio 1: scrittura del programma e compilazione del file esadecimale, utilizzando Atmel Studio

Programma di scrittura e compilazione del file esadecimale, utilizzando Atmel Studio
Programma di scrittura e compilazione del file esadecimale, utilizzando Atmel Studio
Programma di scrittura e compilazione del file esadecimale, utilizzando Atmel Studio
Programma di scrittura e compilazione del file esadecimale, utilizzando Atmel Studio

Se non hai Atmel Studio, dovresti scaricarlo e installarlo:

Questo progetto utilizzerà C, quindi seleziona l'opzione Progetto eseguibile GCC C dall'elenco dei modelli per generare un progetto eseguibile essenziale.

Successivamente, è necessario specificare per quale dispositivo verrà sviluppato il progetto. Questo progetto sarà sviluppato per il microcontrollore AVR ATMega328P.

Digitare il codice del programma nell'area Main Source Editor di Atmel Studio. L'editor di origine principale: questa finestra è l'editor principale per i file di origine nel progetto corrente. L'editor ha funzioni di controllo ortografico e di completamento automatico.

1. Dobbiamo dire al compilatore a quale velocità sta funzionando il nostro chip che può calcolare correttamente i ritardi.

#ifndef F_CPU

#define F_CPU 16000000UL // indica la frequenza del cristallo del controller (16 MHz AVR ATMega328P) #endif

2. Includiamo il preambolo, che è dove mettiamo le nostre informazioni di inclusione da altri file, che definisce le variabili e le funzioni globali.

#include //header per abilitare il controllo del flusso di dati sui pin. Definisce pin, porte, ecc.

#include //header per abilitare la funzione di ritardo nel programma

3. Dopo il preambolo viene la funzione main().

int main(void) {

La funzione main() è unica e si distingue da tutte le altre funzioni. Ogni programma C deve avere esattamente una funzione main(). Main() è il punto in cui l'AVR inizia a eseguire il codice quando si accende per la prima volta, quindi è il punto di ingresso del programma.

4. Impostare il pin 0 della PORTB come output.

DDRB=0b0000001; //Imposta PORTB1 come output

Lo facciamo scrivendo un numero binario nel registro di direzione dei dati B. Il registro di direzione dei dati B ci consente di rendere i bit del registro B in ingresso o in uscita. Scrivere un 1 li fa uscire, mentre uno 0 li fa entrare. Essendo che stiamo collegando un LED che funga da output, scriviamo un numero binario, rendendo come output il pin 0 di PORT B.

5. Ciclo.

mentre (1) {

Questa istruzione è un ciclo, spesso indicato come ciclo principale o ciclo di eventi. Questo codice è sempre vero; pertanto, viene eseguito più e più volte in un ciclo infinito. Non cessa mai. Pertanto, il LED lampeggerà all'infinito, a meno che l'alimentazione non venga interrotta dal microcontrollore o il codice venga cancellato dalla memoria del programma.

6. Accendere il LED collegato alla porta PB0

PORTAB= 0b0000001; // accende il LED collegato alla porta PB0

Questa linea, dà un 1 al PB0 di PortB. PORTB è un registro hardware sul chip AVR che contiene 8 pin, PB7-PB0, che vanno da sinistra a destra. Mettere un 1 alla fine dà un 1 a PB0; questo imposta PB0 alto che lo accende. Pertanto, il LED collegato al pin PB0 si accenderà e si accenderà.

7. Ritardo

_delay_ms(1000); //crea un ritardo di 1 secondo

Questa affermazione crea un ritardo di 1 secondo, in modo che il LED si accenda e rimanga acceso per esattamente 1 secondo.

8. Spegni tutti i pin B, incluso PB0

PORTAB= 0b00000000; // Spegne tutti i pin B, incluso PB0

Questa linea disattiva tutti gli 8 pin della porta B, in modo che anche PB0 sia spento, quindi il LED si spegne.

9. Un altro ritardo

_delay_ms(1000); //crea un altro ritardo di 1 secondo

Si spegne esattamente per 1 secondo, prima di ricominciare il ciclo da capo e incontrare la linea, che lo riaccende, ripetendo il processo tutto. Questo accade all'infinito in modo che il LED lampeggi costantemente acceso e spento.

10. Dichiarazione di restituzione

}

ritorno (0); //questa riga non viene mai effettivamente raggiunta }

L'ultima riga del nostro codice è un'istruzione return (0). Anche se questo codice non viene mai eseguito, perché c'è un ciclo infinito che non finisce mai, per i nostri programmi che girano su computer desktop, è importante che il sistema operativo sappia se sono stati eseguiti correttamente o meno. Per questo motivo, GCC, il nostro compilatore, vuole che ogni main() termini con un codice di ritorno. I codici di ritorno sono inutili per il codice AVR, che funziona indipendentemente da qualsiasi sistema operativo di supporto; tuttavia, il compilatore genererà un avviso se non termini main con return().

Il passo finale è la costruzione del progetto. Significa compilare e infine collegare tutti i file oggetto per generare il file eseguibile (.hex). Questo file esadecimale viene generato all'interno della cartella Debug che si trova all'interno della cartella Project. Questo file esadecimale è pronto per essere caricato nel chip del microcontrollore.

Passaggio 2: modifica della configurazione predefinita dei fusibili del microcontrollore

Modifica della configurazione predefinita dei fusibili del microcontrollore
Modifica della configurazione predefinita dei fusibili del microcontrollore
Modifica della configurazione predefinita dei fusibili del microcontrollore
Modifica della configurazione predefinita dei fusibili del microcontrollore
Modifica della configurazione predefinita dei fusibili del microcontrollore
Modifica della configurazione predefinita dei fusibili del microcontrollore

È importante ricordare che alcuni dei bit dei fusibili possono essere utilizzati per bloccare determinati aspetti del chip e possono potenzialmente farli murare (renderli inutilizzabili)

Ci sono un totale di 19 bit di fusibile utilizzati nell'ATmega328P e sono separati in tre diversi byte di fusibile. Tre dei bit del fusibile sono contenuti nel "Extended Fuse Byte", otto nel "Fuse High Byte" e altri otto nel "Fuse Low Byte". C'è anche un quarto byte che viene utilizzato per programmare i bit di blocco.

Ogni byte è di 8 bit e ogni bit è un'impostazione o un flag separato. Quando si parla di settaggio, non settaggio, fusibili programmati, non programmati in realtà stiamo usando binari. 1 significa non impostato, non programmato e uno zero significa impostato, programmato. Quando si programmano i fusibili è possibile utilizzare la notazione binaria o più comunemente la notazione esadecimale.

I chip ATmega 328P hanno un oscillatore RC integrato che ha una frequenza di 8 MHz. I nuovi chip vengono forniti con questo set come sorgente di clock e il fusibile CKDIV8 attivo, risultando in un clock di sistema di 1 MHz. Il tempo di avvio è impostato al massimo e il periodo di timeout è abilitato.

I nuovi chip ATMega 328P hanno generalmente le seguenti impostazioni dei fusibili:

Fusibile basso = 0x62 (0b01100010)

Fusibile alto = 0xD9 (0b11011001)

Fusibile esteso = 0xFF (0b11111111)

Useremo il chip ATmega 328 con un cristallo esterno da 16 MHz. Pertanto, dobbiamo programmare i bit di "Fuse Low Byte" di conseguenza.

1. I bit 3-0 controllano la scelta dell'oscillatore e l'impostazione predefinita di 0010 è utilizzare l'oscillatore RC interno calibrato, cosa che non vogliamo. Vogliamo il funzionamento dell'oscillatore al quarzo a bassa potenza da 8,0 a 16,0 MHz, quindi i bit 3-1 (CKSEL[3:1]) dovrebbero essere impostati su 111.

2. I bit 5 e 4 controllano il tempo di avvio e l'impostazione predefinita di 10 è per un ritardo di avvio di sei cicli di clock dallo spegnimento e dal risparmio energetico, più un ritardo di avvio aggiuntivo di 14 cicli di clock più 65 millisecondi dal ripristino.

Per essere sicuri per un oscillatore al quarzo a bassa potenza, vogliamo il massimo ritardo possibile di 16.000 cicli di clock dallo spegnimento e dal risparmio energetico, quindi SUT[1] dovrebbe essere impostato su 1, più un ritardo di avvio aggiuntivo di 14 cicli di clock più 65 millisecondi dal ripristino, quindi SUT[0] dovrebbe essere impostato su 1. Inoltre, CKSEL[0] dovrebbe essere impostato su 1.

3. Il bit 6 controlla l'uscita del clock su PORTB0, di cui non ci interessa. Quindi, il bit 6 può essere lasciato impostato a 1.

4. Il bit 7 controlla l'operazione di divisione per 8 e l'impostazione predefinita di 0 ha la funzione abilitata, che non vogliamo. Quindi, il bit 7 deve essere cambiato da 0 a 1.

Pertanto, il nuovo Fuse Low Byte dovrebbe essere 11111111 che, in notazione esadecimale, è 0xFF

Per programmare i bit del "Fuse Low Byte" possiamo utilizzare il nostro programmatore (https://www.instructables.com/id/ISP-Programmer-fo…) e il software AVRDUDE. AVRDUDE è un'utilità della riga di comando utilizzata per scaricare e caricare i microcontrollori Atmel.

Scarica AVRDUDE:

Per prima cosa, dobbiamo aggiungere la descrizione del nostro programmatore al file di configurazione di AVRDUDE. Su Windows il file di configurazione si trova solitamente nella stessa posizione del file eseguibile di AVRDUDE.

Incolla il testo nel file di configurazione avrdude.conf:

#ISPProgv1

id programmatore = "ISPProgv1"; desc = "porta seriale sbattuta, reset=dtr sck=rts mosi=txd miso=cts"; tipo = "serb"; connection_type = seriale; reset = 4; sck = 7; mosi = 3; miso = 8;;

Prima di avviare l'AVRDUDE, dobbiamo collegare il microcontrollore al programmatore, secondo lo schema

Apri la finestra del prompt di DOS.

1. Per visualizzare l'elenco dei programmatori supportati da avrdude, digitare il comando avrdude -c c. Se tutto va bene, l'elenco dovrebbe avere l'ID programmatore "ISPProgv1"

2. Per visualizzare l'elenco dei dispositivi Atmel supportati da avrdude, digitare il comando avrdude -c ISPProgv1. L'elenco dovrebbe contenere il dispositivo m328p per Atmel ATMega 328P.

Quindi, digita avrdude -c ISPProgv1 –p m328p, il comando indica ad avrdude quale programmatore viene utilizzato e quale microcontrollore Atmel è collegato. Presenta la firma ATmega328P in notazione esadecimale: 0x1e950f. Presenta la programmazione del bit fusibile attualmente presente nell'ATmega328P anche in notazione esadecimale; in questo caso, i byte dei fusibili sono programmati per impostazione di fabbrica.

Quindi, digita avrdude -c ISPProgv1 –p m328p –U lfuse:w:0xFF:m, è un comando per dire ad avrdude quale programmatore viene utilizzato e quale microcontrollore Atmel è collegato e per modificare il Fuse Low Byte in 0xFF.

Ora il segnale di clock dovrebbe provenire da un oscillatore al cristallo a bassa potenza.

Passaggio 3: masterizzare il programma nella memoria del microcontrollore ATMega328P

Masterizzare il programma nella memoria del microcontrollore ATMega328P
Masterizzare il programma nella memoria del microcontrollore ATMega328P
Masterizzare il programma nella memoria del microcontrollore ATMega328P
Masterizzare il programma nella memoria del microcontrollore ATMega328P

Per prima cosa, copia il file esadecimale del programma che abbiamo creato all'inizio dell'istruzione nella directory AVRDUDE.

Quindi, digita nella finestra del prompt di DOS il comando avrdude –c ISPProgv1 –p m328p –u –U flash:w:[nome del tuo file esadecimale]

Il comando scrive il file esadecimale nella memoria del microcontrollore. Ora, il microcontrollore funziona secondo le istruzioni del nostro programma. Controlliamolo!

Passaggio 4: verificare che il microcontrollore funzioni in conformità con le istruzioni del nostro programma

Controllare che il microcontrollore funzioni in conformità con le istruzioni del nostro programma
Controllare che il microcontrollore funzioni in conformità con le istruzioni del nostro programma
Controllare che il microcontrollore funzioni in conformità con le istruzioni del nostro programma
Controllare che il microcontrollore funzioni in conformità con le istruzioni del nostro programma
Controllare che il microcontrollore funzioni in conformità con le istruzioni del nostro programma
Controllare che il microcontrollore funzioni in conformità con le istruzioni del nostro programma

Collegare i componenti secondo il diagramma schematico del circuito LED lampeggiante dell'AVR

Innanzitutto, abbiamo bisogno di energia, come fanno tutti i circuiti AVR. Circa 5 volt di alimentazione sono sufficienti per il funzionamento del chip AVR. Puoi ottenerlo dalle batterie o da un alimentatore CC. Colleghiamo +5V di alimentazione al pin 7 e colleghiamo il pin 8 a massa sulla breadboard. Tra entrambi i pin, posizioniamo un condensatore ceramico da 0,1 μF per attenuare la potenza dell'alimentatore in modo che il chip AVR ottenga una linea di alimentazione regolare.

Il resistore da 10KΩ viene utilizzato per fornire Power On Reset (POR) al dispositivo. Quando l'alimentazione viene attivata, la tensione ai capi del condensatore sarà zero, quindi il dispositivo si ripristina (poiché il ripristino è attivo basso), quindi il condensatore si carica a VCC e il ripristino verrà disabilitato.

Colleghiamo l'anodo del nostro LED al pin PB0 dell'AVR. Questo è il pin 14 di ATMega328P. Poiché è un LED, vogliamo limitare la corrente che scorre al LED in modo che non si bruci. Questo è il motivo per cui mettiamo in serie al LED una resistenza da 330Ω. Il catodo del LED va collegato a massa.

Il cristallo da 16 MHz viene utilizzato per fornire il clock per il microcontrollore Atmega328 e i condensatori da 22 pF sono utilizzati per stabilizzare il funzionamento del cristallo.

Questi sono tutti i collegamenti necessari per accendere il LED. Alimentazione elettrica.

Ok. Il LED lampeggia con un secondo di ritardo. Il lavoro del microcontrollore corrisponde ai nostri compiti

Passaggio 5: conclusione

Certo, è stato un processo lungo per il semplice lampeggio di un LED, ma la verità è che hai superato con successo i principali ostacoli: creazione di una piattaforma hardware per la programmazione di un microcontrollore AVR, utilizzo di Atmel Studio come piattaforma di sviluppo integrata, utilizzo di AVRDUDE come software per configurazione e programmazione di un microcontrollore AVR

Se vuoi tenerti aggiornato sui miei progetti di microcontrollori di base, iscriviti al mio YouTube! Guardare e condividere i miei video è un modo per supportare quello che faccio

Iscriviti al canale YouTube FOG

Consigliato: