L’ATmega328P è un microcontrollore AVR a 8 bit. Integra nello stesso componente il processore, le memorie, gli ingressi e le uscite digitali, il convertitore analogico-digitale, i temporizzatori e le interfacce di comunicazione necessarie a realizzare un sistema embedded autonomo.

Non è una scheda e non possiede nativamente USB, Wi-Fi, Ethernet o un sistema operativo. La classica UNO R3 è una scheda costruita attorno a questo componente e aggiunge alimentazione, connettori, circuito di reset, generatore di clock e interfaccia USB-seriale.

Un microcontrollore, non un computer in miniatura

Un microcontrollore è progettato per eseguire in modo ripetibile una funzione definita: leggere sensori, controllare uscite, misurare tempi, comunicare con periferiche e reagire a eventi. Non è ottimizzato per eseguire molte applicazioni contemporaneamente, gestire grandi quantità di memoria o offrire un’interfaccia grafica complessa.

L’ATmega328P è adatto quando il programma può essere contenuto in poche decine di kilobyte, i dati temporanei occupano pochi kilobyte e la logica richiede tempi prevedibili. Il limite principale non è soltanto la frequenza di clock: sono soprattutto i 2 kB di SRAM a imporre attenzione a buffer, stringhe, array e librerie.

Architettura AVR a 8 bit

Il nucleo appartiene alla famiglia AVR e usa un’architettura RISC. I dati elementari vengono elaborati principalmente su 8 bit; operazioni su valori a 16 o 32 bit vengono scomposte in più istruzioni. Il processore dispone di 32 registri di lavoro direttamente collegati all’unità aritmetico-logica, caratteristica che permette a molte istruzioni di essere eseguite in un solo ciclo di clock.

L’architettura separa lo spazio del programma dallo spazio dei dati. Questa organizzazione, riconducibile al modello Harvard, consente di accedere al codice e ai dati attraverso percorsi differenti. Per il programmatore la distinzione diventa evidente quando costanti, tabelle o stringhe devono essere mantenute nella memoria flash invece che copiate nella SRAM.

La dicitura «8 bit» descrive la larghezza naturale del processore, non la dimensione massima dei numeri utilizzabili. Numeri più grandi sono possibili, ma richiedono più istruzioni, più memoria e più tempo.

Le tre memorie principali

L’ATmega328P integra tre memorie con funzioni differenti.

  • Flash: 32 kB. Contiene il programma. Può essere programmata tramite ISP oppure attraverso un bootloader. Una parte può essere riservata al bootloader e quindi non resta disponibile all’applicazione.
  • SRAM: 2 kB. Contiene variabili, stack, buffer e dati temporanei durante l’esecuzione. Si azzera quando manca alimentazione.
  • EEPROM: 1 kB. Conserva dati non volatili anche senza alimentazione. È adatta a configurazioni e valori modificati occasionalmente, non a scritture continue ad alta frequenza.

Stack, variabili globali, variabili locali e memoria dinamica condividono la stessa SRAM. Un programma può quindi compilare correttamente e poi diventare instabile durante l’esecuzione se stack e area dinamica finiscono per sovrapporsi.

Clock: la frequenza dipende dal circuito e dalla configurazione

Il microcontrollore non è obbligato a funzionare a 16 MHz. Può utilizzare un oscillatore interno oppure una sorgente esterna, come un quarzo, un risonatore ceramico o un segnale di clock. La sorgente e i tempi di avvio vengono selezionati mediante fuse bit.

Il dispositivo può raggiungere 20 MHz nelle condizioni previste dal costruttore. La frequenza massima ammissibile dipende dalla tensione di alimentazione e dalla temperatura. La UNO R3 usa invece una configurazione a 16 MHz: questo valore appartiene alla scheda e alla relativa definizione software, non al nome ATmega328P.

Modificare clock o prescaler cambia la durata reale dei cicli, dei timer, della comunicazione seriale e di tutte le funzioni che assumono una frequenza nota. Il valore dichiarato al compilatore deve corrispondere al clock effettivo del circuito.

Pin, porte e contenitori

Il numero massimo di linee di ingresso e uscita generiche è 23, ma il numero realmente disponibile dipende dal contenitore e dal circuito in cui il componente è montato. Le linee sono organizzate principalmente nelle porte B, C e D e ogni pin può avere più funzioni alternative.

Nel contenitore DIP a 28 pin, tipico della UNO R3 con componente sostituibile, sono disponibili sei ingressi analogici. Nei contenitori TQFP e QFN/MLF a 32 pin il convertitore può usare otto canali analogici. La scheda UNO espone 14 pin indicati come digitali e 6 ingressi analogici; questi ultimi possono essere impiegati anche come linee digitali.

Oltre alle linee I/O sono presenti pin dedicati ad alimentazione, massa, riferimento analogico, reset e clock. AVCC alimenta la parte analogica e deve essere collegato correttamente anche quando il convertitore ADC non viene usato, perché alcune linee della porta C dipendono da questa alimentazione.

Ingressi e uscite digitali

Il controllo diretto delle porte avviene attraverso tre gruppi di registri: DDRx imposta la direzione, PORTx definisce il livello di uscita o abilita la resistenza di pull-up interna e PINx permette di leggere lo stato logico presente sul pin.

Le resistenze di pull-up interne consentono di collegare pulsanti e contatti verso massa senza aggiungere necessariamente una resistenza esterna. Non sostituiscono però il debounce, la protezione contro disturbi o la corretta gestione di cavi lunghi.

Un’uscita digitale deve pilotare soltanto carichi compatibili con le caratteristiche elettriche del componente. Relè, motori, elettrovalvole, lampade e carichi induttivi richiedono uno stadio esterno con transistor o MOSFET e, quando necessario, diodo di ricircolo. Il valore massimo assoluto indicato nel datasheet non deve essere usato come corrente normale di progetto.

Convertitore analogico-digitale

L’ADC integrato ha risoluzione nominale di 10 bit. Una conversione produce quindi un valore compreso tra 0 e 1023, riferito alla tensione di riferimento selezionata. Sono disponibili il riferimento esterno sul pin AREF, l’alimentazione analogica e un riferimento interno nominale di 1,1 V.

I canali analogici condividono un unico convertitore attraverso un multiplexer. Le misure non sono quindi simultanee. Dopo un cambio di canale o di riferimento può essere opportuno attendere l’assestamento e scartare la prima conversione, soprattutto quando la sorgente presenta impedenza elevata.

La risoluzione di 10 bit non equivale automaticamente a dieci bit di accuratezza. Rumore, qualità del riferimento, cablaggio, impedenza della sorgente, alimentazione e disposizione delle masse determinano la qualità reale della misura.

Comparatore analogico

Il comparatore analogico confronta due tensioni e genera un risultato logico quando una supera l’altra. Può produrre un’interruzione e può essere collegato al sistema di cattura del Timer1. È utile quando serve rilevare rapidamente il superamento di una soglia senza eseguire conversioni ADC continue.

Timer e generazione PWM

Sono presenti tre timer/counter: Timer0 e Timer2 a 8 bit, Timer1 a 16 bit. Possono contare impulsi di clock, generare interruzioni periodiche, confrontare il conteggio con valori programmati e produrre forme d’onda PWM.

Il Timer1 offre una risoluzione maggiore e una funzione di input capture, utile per misurare con precisione periodi e durate di impulsi. Timer2 può funzionare in modo asincrono con una sorgente dedicata, caratteristica utile per alcune funzioni temporali a basso consumo.

Nel core Arduino per UNO, Timer0 viene usato per costruire la base temporale di millis(), micros() e delay(). Riconfigurarlo è possibile, ma altera queste funzioni. Anche frequenze e modalità PWM dipendono dal timer associato al singolo pin.

Comunicazioni seriali integrate

Il componente integra tre interfacce principali.

  • USART. Comunicazione seriale sincrona o asincrona; sulla UNO viene normalmente usata anche per il caricamento attraverso il bootloader.
  • SPI. Collegamento sincrono ad alta velocità con memorie, convertitori, display e altri microcontrollori; è anche la base della programmazione ISP.
  • TWI. Interfaccia seriale a due fili compatibile con il funzionamento tipico del bus I²C.

Queste periferiche non rendono il componente direttamente collegabile a USB, Ethernet o Wi-Fi. Per tali reti servono circuiti aggiuntivi o moduli esterni. Sulla UNO la connessione USB è gestita da un secondo componente che converte USB e seriale; non è una periferica dell’ATmega328P.

Interruzioni

Le interruzioni permettono al programma di reagire a un evento senza controllarlo continuamente nel ciclo principale. Sono disponibili sorgenti esterne dedicate, interruzioni per variazione di stato dei pin e sorgenti generate dalle periferiche: timer, ADC, USART, SPI, TWI, watchdog, comparatore ed EEPROM.

Una routine di servizio deve essere breve e prevedibile. Attese, stampe seriali lunghe o elaborazioni complesse all’interno dell’interruzione possono bloccare altre sorgenti e alterare la temporizzazione dell’intero sistema.

Reset, watchdog e brown-out

Il reset può essere provocato dal pin esterno, dall’accensione, dal watchdog o dal rilevatore di tensione insufficiente. Il registro che conserva la causa del reset permette al programma di distinguere, entro certi limiti, perché il riavvio è avvenuto.

Il watchdog usa un oscillatore indipendente e può generare un’interruzione o un reset quando il programma non lo aggiorna entro il tempo previsto. Non corregge automaticamente un software errato: deve essere integrato in una logica che eviti riavvii continui e permetta di riconoscere la causa del guasto.

Il brown-out detector mantiene il microcontrollore in reset quando la tensione scende sotto una soglia configurata. La soglia è selezionata tramite fuse bit e deve essere coerente con frequenza di clock, alimentazione e comportamento richiesto dal circuito.

Riduzione dei consumi

L’ATmega328P appartiene alla linea picoPower e offre più modalità di sospensione. A seconda della modalità vengono fermati il processore, i timer, l’ADC o altri domini di clock, mentre rimangono attive soltanto le sorgenti necessarie al risveglio.

Il consumo reale dipende da tensione, frequenza, periferiche abilitate, stato dei pin e componenti presenti sulla scheda. Mettere in sleep il solo microcontrollore su una scheda completa non elimina il consumo del regolatore, dei LED, del convertitore USB-seriale e degli altri circuiti.

Programmazione, bootloader e fuse bit

Il programma può essere trasferito direttamente tramite ISP usando le linee SPI oppure attraverso un bootloader già presente nella flash. Il bootloader riceve il nuovo firmware, normalmente dalla USART, e lo scrive nella memoria di programma.

I fuse bit configurano aspetti hardware permanenti fino alla successiva riprogrammazione: sorgente di clock, tempi di avvio, brown-out, divisione del clock, dimensione dell’area boot e comportamento del pin di reset. Non sono normali variabili del programma. Una configurazione errata può rendere il componente apparentemente non raggiungibile con il metodo di programmazione usato fino a quel momento.

I lock bit possono proteggere determinate aree della memoria da letture o scritture non autorizzate. La protezione non sostituisce una progettazione sicura del sistema e deve essere configurata soltanto dopo aver verificato bootloader, fuse e procedura di aggiornamento.

ATmega328P e UNO R3 non sono sinonimi

La UNO R3 usa l’ATmega328P, ma la scheda determina molti aspetti pratici: clock a 16 MHz, alimentazione nominale a 5 V, numerazione dei connettori, bootloader, collegamento USB-seriale e associazione tra pin fisici e nomi usati dal framework.

Lo stesso microcontrollore può essere montato su una scheda differente, funzionare a un’altra tensione, usare l’oscillatore interno, essere programmato senza bootloader e avere una diversa disposizione dei pin. Il codice che accede direttamente ai registri resta legato alla periferica del componente; il codice che usa numeri di pin e librerie può invece dipendere dalla definizione della scheda.

Limiti tecnici

I limiti principali sono noti e misurabili: nucleo a 8 bit, frequenza massima nell’ordine di alcune decine di megahertz, 2 kB di SRAM, nessuna unità in virgola mobile, un solo ADC multiplexato e assenza di periferiche di rete o USB native. Applicazioni con grandi buffer, protocolli complessi, crittografia pesante, elaborazione di immagini o interfacce grafiche avanzate richiedono normalmente un dispositivo diverso.

Questi limiti sono anche un vantaggio quando servono comportamento deterministico, avvio rapido, toolchain semplice, controllo diretto delle periferiche e un circuito facilmente analizzabile. La scelta corretta dipende dal requisito, non dalla novità del componente.

Stato commerciale del componente

La pagina Microchip indica attualmente l’ATmega328P come «Not Recommended for New Designs». Questa classificazione riguarda la scelta per nuovi prodotti e non significa che il componente smetta di funzionare o che i sistemi esistenti diventino inutilizzabili.

Per manutenzione, studio dell’architettura AVR, prototipi e sistemi già validati rimane una piattaforma documentata e ampiamente supportata. Per un nuovo prodotto destinato a lunga vita commerciale è invece necessario verificare disponibilità, stato del ciclo di vita e possibili dispositivi alternativi prima di fissare il progetto.

Conclusioni

L’ATmega328P riunisce in un singolo componente un processore AVR a 8 bit, 32 kB di flash, 2 kB di SRAM, 1 kB di EEPROM, I/O digitali, ADC, timer, PWM, interruzioni e interfacce seriali. La sua apparente semplicità non elimina la necessità di comprendere clock, fuse, memorie, registri, caratteristiche elettriche e uso condiviso delle periferiche.

Conoscere il microcontrollore separatamente dalla scheda consente di capire quali funzioni appartengono realmente al silicio e quali vengono aggiunte dal circuito, dal bootloader, dal framework e dall’ambiente di sviluppo. Questa distinzione è la base per analizzare correttamente gli articoli successivi dedicati a ingressi, uscite, ADC, timer, I²C, macchine a stati e PWM.

Fonti principali

Microchip Technology — pagina prodotto ATmega328P

Microchip Technology — ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B

Microchip Technology — ATmega48A/PA/88A/PA/168A/PA/328/P Silicon Errata and Data Sheet Clarification, DS80000855

Arduino — documentazione hardware UNO R3

Arduino — specifica della piattaforma Arduino AVR Boards e configurazione della scheda UNO