La programmazione ISP dei microcontrollori ATtiny e ATmega

AVR programmatore ISP

In generale, siamo abituati a vedere i microcontrollori "incastonati" in una miriade di board diverse, ognuna con le proprie funzionalità e con lo scopo di semplificare l'accesso, soprattutto alla programmazione. Se pensiamo ad Arduino, probabilmente ci viene subito in mente la famosa scheda Arduino UNO R3 e tutte le sue varianti, compresi i vari cloni, ma una volta sviluppato il nostro progetto spesso ci si rende conto che tutto quell'hardware di supporto non è necessario, anzi oltre a generare ingombro e ad occupare spazio prezioso, incrementa i consumi energetici. Con questo articolo, vedremo come realizzare un semplice programmatore ISP che ci permetterà di utilizzare i microcontrollori in modalità "stand-alone" riducendo al minimo l'eventuale circuiteria aggiuntiva.  

I microcontrollori AVR

Senza addentrarci in un'analisi dettagliata del funzionamento di questi dispositivi, detti anche MCU (MicroController Unit), dedichiamo qualche riga per descriverne l'architettura di riferimento. Come noto, un microcontrollore è a tutti gli effetti una versione semplificata di un piccolo computer realizzato su un singolo chip, con l'aggiunta che sullo stesso supporto sono implementate anche tutta una serie di periferiche e di interfacce I/O estremamente versatili e potenti. Naturalmente, la potenza elaborativa e le performance nell'esecuzione delle applicazioni non sono paragonabili a quelle di una CPU, anzi a ben vedere non avrebbe neppure senso fare un paragone del genere essendo gli ambiti di utilizzo ben diversi. I microcontrollori sono nati per essere autosufficienti e per essere impiegati in applicazioni che richiedono un ridotto consumo energetico, oltre ad una gestione ed elaborazione dati comunque limitata.

schema a blocchi microcontrollore AVR

Figura 1: Schema a blocchi microcontrollore AVR (Fonte: datasheet ATMEGA328)

Come ben visibile in Figura 1, un microcontrollore della serie AVR è comunque un chip estremante complesso; attorno ad un bus dati di 8-bit troviamo tutti gli elementi che, come anticipato, lo caratterizzano a tutti gli effetti come un micro-computer (ALU, SRAM, EEPROM, flash program memory, interrupt unit, ecc..)

In linea di principio, il funzionamento è molto semplice, il programma caricato nella memoria flash (poi vedremo in che modo) va immediatamente in esecuzione ogni volta che il microcontrollore viene in qualche modo "resettato", ad esempio quando viene alimentato o quando è presente un livello basso sul pin di reset (esistono comunque molteplici altre modalità di reset della MCU).

L'esecuzione avviene in un ciclo perpetuo e durante questa fase, in base a quanto previsto dal programma (sketch), vengono acquisiti ed elaborati tutti gli input provenienti dalle varie periferiche come pure vengono generati tutti i segnali di output necessari al controllo delle apparecchiature collegate.

I microcontrollori AVR utilizzano una architettura Harvard, che agisce in maniera separata sulle due tipologie di memoria, quella dedicata ai dati e quella destinata a contenere i programmi (Figura 1). In pratica, mentre viene eseguita un'istruzione, quella successiva viene prelevata dalla memoria del programma.  La maggior parte delle istruzioni viene eseguita in un ciclo di clock, grazie a questa esecuzione a ciclo singolo delle operazioni aritmetiche e logiche, le MCU basate su AVR sono in grado di fornire circa 1 MIPS (milioni di istruzioni al secondo) per megahertz di frequenza di clock.

La programmazione tramite USB/seriale

Il grande successo di Arduino, in parte, sta sicuramente nella facilità con cui è possibile programmare le sue board. Basta collegare la scheda tramite un cavo USB al computer, avviare l'ambiente di sviluppo con il programma da caricare (sketch),  selezionare la porta a cui è collegato il dispositivo e cliccare sul pulsante upload. Tutto molto semplice, la complessità di questo processo è completamente mascherata all'utilizzatore finale, ma in realtà per effettuare questo tipo di programmazione occorre attrezzare la board di Arduino con un hardware specifico, un adattatore seriale da USB a TTL (ad esempio FT232 o CH340) e a livello software occorre predisporre un apposito programma di interfacciamento, il bootloader, residente nella memoria flash del microcontrollore e che, in caso di upload di un nuovo sketch, esegua prima questa operazione per poi passare il controllo della MCU al programma utente presente in memoria. Il bootloader è una piccola porzione di codice, circa 512 byte, che non può essere sovrascritta dal normale sketch utente e che deve essere memorizzata tramite una procedura ad hoc (Figura 2).

schema memoria flash Atmega328

Figura 2: Schema memoria flash MCU AVR

Quanto descritto sopra, semplifica notevolmente l'attività di sviluppo e di collaudo dei progetti ma poi quando siamo arrivati ad una versione definitiva, occorre poter disporre della sola MCU con lo sketch precaricato e dell'hardware necessario al funzionamento della nostra applicazione. Quindi, una board con tutte le porte del microcontrollore esposte su diversi pin-header, l'adattatore USB/seriale, l'alimentatore che riduce a 5V la tensione di alimentazione, ecc., sono tutti elementi spesso superflui.

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2488 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend