ATmega328P Essentials: Come iniziare senza Arduino

Ari Mahpour
|  Creato: maggio 29, 2024
ATmega328P Essentials: Come iniziare senza Arduino

Utilizzo la scheda Arduino Uno da parecchio tempo, inclusi come esempi per molti dei miei articoli. Mi sono sempre chiesto cosa sarebbe necessario per far funzionare completamente da solo l'ATmega328P (il chip originale utilizzato sulle vecchie schede Uno). Con Arduino che lo rende così accessibile tramite il suo bootloader, il bel software GUI e l'astrazione in C++, ti chiederesti perché mai vorrei anche solo tentare questo. A volte, per apprezzare ciò che altri hanno fatto, è importante provare a farlo da soli. Questo progetto ha davvero dimostrato quanto lavoro gli sviluppatori di Arduino abbiano messo in questo e come abbiano cambiato il mondo con quel simpatico piccolo prodotto.

In questo articolo, passeremo attraverso l'avvio del chip completamente da solo utilizzando solo una fonte di alimentazione esterna e un programmatore Atmel-ICE. Dimostreremo come comunicare con il chip tramite l'interfaccia seriale integrata e anche come far lampeggiare uno o due LED.

Configurazione dell'ambiente

Ci sono alcuni modi per configurare un ATmega328P. Uno di questi modi, intenzionalmente non coperto come si può intuire dal titolo, è inserire il tuo chip ATmega328P in un Arduino Uno, programmarlo e poi spostarlo su una breadboard. Basandosi sui feedback nei forum, alcune persone vogliono saltare il processo Arduino e usare un approccio più tradizionale con programmatori come l'Atmel-ICE di Microchip. Il modo più diretto per iniziare con un microprocessore Microchip (precedentemente Atmel) è installare Microchip Studio. Al momento della scrittura di questo articolo, la suite completa di Microchip Studio è supportata solo su Windows. Poiché mi piace avere tutti i miei ambienti di sviluppo eseguiti in CI (Continuous Integration), ho optato per un approccio alternativo.

La GNU Compiler Collection (GCC) è uno dei compilatori più popolari in circolazione per il linguaggio C. Compila per certe piattaforme e architetture ma non per la famiglia di chip AVR (ATmega). Esiste, tuttavia, un insieme di compilatori per l'AVR e altre famiglie Microchip ospitati sul loro sito web. Fortunatamente, alcune persone gentili hanno anche impacchettato questi compilatori in comodi pacchetti Debian che possono essere facilmente installati su Debian o Ubuntu in questo modo:

$ apt-get install gcc-avr binutils-avr avr-libc avrdude

Con questi strumenti installati ora siamo in grado di compilare e programmare l'ATmega328P solo con un programmatore Atmel-ICE e un'alimentazione esterna (impostata a 5V). Utilizzeremo la versione AVR di GCC per compilare il codice e AVRDUDE per flashare il chip ATmega328P.

Il Progetto

Per questo progetto, il mio obiettivo era dimostrare alcune capacità di base, ma funzionali, dell'ATmega328P. Un semplice LED esterno lampeggiante e alcuni comandi seriali avanti e indietro erano tutto ciò di cui avevo bisogno per dimostrare che questo chip potesse stare in piedi da solo. Nel repository del progetto ho creato alcune cartelle in aggiunta al codice sorgente (denominato "src") che assistono nello sviluppo di questo progetto.

Un componente importante dello sviluppo software (anche del software che viene eseguito su hardware) è il test unitario. Il test unitario valida che le funzioni o i pezzi del sistema più grande stiano funzionando come previsto. Se qualcuno modifica una parte di quella funzionalità, il test unitario impedirà che si verifichino regressioni (cioè, hai involontariamente rotto qualcos'altro introducendo una nuova funzionalità). In questo esempio ho scritto un test unitario di base che simula l'hardware e esegue lo schema di inizializzazione della libreria di comunicazione seriale (USART).

In aggiunta al test unitario (situato nella cartella “tests”), c'è anche una cartella chiamata “hil” che sta per Hardware in the Loop. Questa cartella contiene gli script necessari per eseguire test con hardware reale nel ciclo (come discusso in molti dei miei articoli precedenti). Questo assicura che il mio codice sia funzionale non solo nel mondo virtuale (usando simulazioni) ma anche nel mondo reale eseguendo test su hardware reale.

Consultando il README.md vi fornirà uno schema dei pin per connettersi al programmatore Atmel-ICE al chip ATmega328P:

Schema dei pin Atmel ICE

Figura 1: Schema dei pin Atmel ICE

Aggiungendo alcuni LED, collegando la porta di comunicazione seriale a un Raspberry Pi, e prelevando la linea +5V del Raspberry Pi, ora avete un'assemblaggio completo pronto all'uso:

Scheda di espansione Raspberry Pi

Figura 2: ATmega328P usando una scheda di espansione con il Raspberry Pi e il programmatore Atmel-ICE

Test, Compilazione e Ancora Test

Mentre sviluppi nuove funzionalità, usa il Makefile per eseguire test unitari e compilare il codice. Dopo aver validato che il tuo codice desiderato faccia ciò che è inteso fare (tramite la validazione del test unitario), costruisci il binario, flashalo sul dispositivo (anche tramite il Makefile) e esegui test Hardware in the Loop (HIL) utilizzando la porta di comunicazione seriale del Raspberry Pi.

Uno dei pezzi più importanti è flashare correttamente i bit dei fusibili per abilitare l'orologio interno a 8 MHz. Questo è documentato nel README ma anche aggiunto al comando di flashing nel Makefile:

avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m

Dopo ciò dovresti essere in grado di usare l'interfaccia seriale del chip con l'assunzione che l'orologio di bordo funzioni a 8 MHz (come definito all'inizio di main.c). Da qui dovresti essere in grado di aggiungere più funzionalità come il supporto per comandi seriali aggiuntivi, interfacce per componenti esterni e sensori, e qualsiasi cosa tu possa pensare con questo divertente piccolo microcontrollore.

Conclusione

In questo articolo, hai imparato come iniziare a utilizzare il chip ATmega328P senza alcun circuito esterno, come comunemente visto con gli originali Arduino Unos e le schede di valutazione Microchip. Ora conosci il concetto di unit testing, build binarie, programmazione del chip e esecuzione di test hardware in the loop. Inoltre, è stato trattato un dettaglio importante, spesso trascurato, sulla programmazione dei fuse bits per impostare l'orologio interno a 8 MHz. A questo punto dovresti essere in grado di aggiungere ulteriori funzionalità con test unitari e HIL aggiuntivi e eseguire tutto con solo un programmatore Atmel-ICE e un'alimentazione esterna da 5V. Per semplicità, utilizzare un Raspberry Pi per la sua fonte di alimentazione e le capacità di comunicazione seriale sarebbe il modo più facile per controllare il processo da inizio a fine.

Il codice sorgente del progetto può essere trovato qui:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.

Sull'Autore

Sull'Autore

Ari è un ingegnere con una solida esperienza nei campi di progettazione, produzione, collaudo e integrazione di sistemi elettrici, meccanici e software. Ama riunire gli ingegneri addetti alla progettazione, alla verifica e al collaudo e farli lavorare insieme come un'unità affiatata.

Risorse correlate

Documentazione Tecnica Correlata

Tornare alla Pagina Iniziale
Thank you, you are now subscribed to updates.