<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[KBpedia] MCU ATmega - Arduino Uno come ISP programmer]]></title><description><![CDATA[<p dir="auto">Questo topic prosegue il discorso iniziato <a href="https://keeb.it/topic/329/mcu-atmega-isp-programmer-dfu-bootloader">qui</a>.</p>
<p dir="auto">Abbiamo la nostra amata PCB "morta" oppure abbiamo a che fare con una MCU in cui il bootloader non è (ancora) installato.<br />
Sappiamo che ci sono diversi ISP programmer che possiamo usare: ma quale scegliere?</p>
<p dir="auto">A volte abbiamo sotto agli occhi tutto quello che ci può servire... e spesso non ce ne accorgiamo.</p>
<p dir="auto">Qui di seguito vedremo come utilizzare un <a href="https://store.arduino.cc/products/arduino-uno-rev3" target="_blank" rel="noopener noreferrer nofollow ugc">Arduino Uno</a> al nostro scopo.<br />
Questa piccola board infatti è un po' come un piccolo coltellino multiuso e può essere utilizzata per eseguire diversi compiti compreso quello di comportarsi come un ISP programmer.</p>
<p dir="auto">Avremo quindi bisogno di:</p>
<ul>
<li>un Arduino Uno</li>
<li>una breadboard</li>
<li>pin di collegamento di varia lunghezza</li>
<li>3 LED di colori diversi (opzionali)</li>
<li>3 resistenze da 220 Ohm (opzionali)</li>
</ul>
<p dir="auto"><img src="/assets/uploads/files/1677435098175-kbpedia_arduino_uno.jpg" alt="Arduino Uno" class=" img-fluid img-markdown" /></p>
<p dir="auto">Il processo che seguiremo è molto semplice: Arduino verrà programmato per comportarsi come un ISP programmer, nello specifico un <strong>AVRISP</strong> - ovvero una sorta di <em>clone</em> di un programmer, ora fuori commercio, distribuito direttamente da Atmel fino a qualche anno fa.<br />
Collegheremo Arduino con una breadboard dove sarà posizionata la nostra MCU - nel mio caso un <a href="https://www.microchip.com/en-us/product/ATMEGA32A" target="_blank" rel="noopener noreferrer nofollow ugc">ATmega32A</a>.</p>
<p dir="auto"><img src="/assets/uploads/files/1677435566272-kbpedia_arduino_uno_isp.jpg" alt="Arduino Uno - ISP prgrammer" class=" img-fluid img-markdown" /></p>
<p dir="auto">La programmazione di Arduino è banale, basta richiamare uno sketch già pronto negli esempi:</p>
<ul>
<li>File » Examples » 11.ArduinoISP » ArduinoISP</li>
</ul>
<p dir="auto">Lo sketch è ben commentato e per chi volesse ne consiglio un'attenta lettura.<br />
Arduino ha già un'interfaccia ISP - proprio vicino al suo ATmega328P - ma nel nostro caso utilizzeremo dei PIN specifici:</p>
<ul>
<li>10 - RST (giallo)</li>
<li>11 - MOSI (verde)</li>
<li>12 - MISO (arancione)</li>
<li>13 - SCK (blu)</li>
</ul>
<p dir="auto"><img src="/assets/uploads/files/1677436140514-kbpedia_arduino_uno_isp_pin.jpg" alt="Arduino ISP PINs" class=" img-fluid img-markdown" /></p>
<p dir="auto">Per avere dei feedback durante l'utilizzo di Arduino come ISP è possibile utilizzare anche dei LED, così collegati:</p>
<ul>
<li>7 - programmazione (verde): lampeggia quando vengono trasferiti dati</li>
<li>8 - errore (rosso): si accende quando ci sono errori</li>
<li>9 - heartbeat (blu): segnala il funzionamento del programmer</li>
</ul>
<p dir="auto">Nel mio esempio ho utilizzato dei banali LED da 5 mm con delle resistenze di sicurezza pari a 220 Ohm.<br />
I LED sono assolutamente opzionali: il sistema funziona anche senza.</p>
<p dir="auto"><img src="/assets/uploads/files/1677438703902-kbpedia_arduino_uno_isp_pin2.jpg" alt="Arduino ISP PINs" class=" img-fluid img-markdown" /></p>
<p dir="auto">Tornando alla programmazione dello sketch: con un Arduino Uno non c'é bisogno di fare alcuna modifica ma per sicurezza è meglio togliere il commento alla riga 81 che diventa quindi:</p>
<pre><code>  #define USE_OLD_STYLE_WIRING
</code></pre>
<p dir="auto">La define USE_OLD_STYLE_WIRING serve infatti per dichiarare i PIN 11, 12 e 13 e il loro utilizzo.<br />
Nel codice volendo possono essere modificate altre define e customizzare così i PIN utilizzati:</p>
<pre><code>  #define PIN_MOSI	11
  #define PIN_MISO	12
  #define PIN_SCK	13
  #define RESET     	4
  #define LED_HB    	7
  #define LED_ERR   	6
  #define LED_PMODE 	5
</code></pre>
<p dir="auto">Prendiamo infine nota del clock della seriale che viene impostato a <strong>19200</strong> alla riga 142:</p>
<pre><code>  #define BAUDRATE	19200
</code></pre>
<p dir="auto">A questo punto siamo pronti per verificare il codice - lo sketch è già rilasciato perfettamente funzionante quindi non dobbiamo aspettarci delle sorprese - e caricarlo su Arduino: se abbiamo utilizzato i LED quello di hearbeat (nel mio caso quello blu) dovrebbe iniziare a lampeggiare lentamente, segnalando che la board è pronta per ricevere comandi.</p>
<p dir="auto">È quindi arrivato il momento di fare i collegamenti verso la MCU.<br />
È sufficiente recuperare il <a href="https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/ATmega32A-DataSheet-Complete-DS40002072A.pdf" target="_blank" rel="noopener noreferrer nofollow ugc">datasheet</a> relativo per controllare la posizione dei PIN:</p>
<p dir="auto"><img src="/assets/uploads/files/1677437354439-kbpedia_atmega32a_pin.jpg" alt="ATmega32A - PIN" class=" img-fluid img-markdown" /></p>
<p dir="auto">I PIN che ci interessano sono:</p>
<ul>
<li>6 - MOSI - da collegare al PIN 11 di Arduino con il cavo verde</li>
<li>7 - MISO - da collegare al PIN 12 di Arduino con il cavo arancione</li>
<li>8 - SCK - da collegare al PIN 13 di Arduino con il cavo blu</li>
<li>9 - RST - da collegare al PIN 10 di Arduino con il cavo giallo</li>
<li>10 - VCC - da collegare alla +5V di Arduino con il cavo rosso</li>
<li>11 - GND - da collegare al GND di Arduino con il cavo nero</li>
</ul>
<p dir="auto"><img src="/assets/uploads/files/1677437689292-kbpedia_atmega32a_spi.jpg" alt="ATmega32A SPI" class=" img-fluid img-markdown" /></p>
<p dir="auto">Fatti i collegamenti è tutto pronto: è possibile utilizzare il programma <a href="https://github.com/avrdudes/avrdude/" target="_blank" rel="noopener noreferrer nofollow ugc">avrdude</a> per testare la corretta comunicazione con la nostra MCU.</p>
<p dir="auto">Possiamo quindi lanciare il comando:</p>
<pre><code>avrdude -c avrisp -p m32a -P /dev/ttyACM0 -b 19200
</code></pre>
<p dir="auto">Facciamo però attenzione ai parametri che utilizziamo:</p>
<ul>
<li><strong><span style="color:#e01b24">-c</span></strong> indica il tipo di programmer che stiamo utilizzando, nel nostro caso un Arduino programmato per comportarsi come un AVRISP</li>
<li><strong><span style="color:#e01b24">-p</span></strong> indica la MCU che vogliamo programmare, nel mio esempio una ATmega32A</li>
<li><strong><span style="color:#e01b24">-P</span></strong> indica la porta seriale a cui è collegato il nostro Arduino</li>
<li><strong><span style="color:#e01b24">-b</span></strong> indica la velocità di trasmissione seriale e deve essere allineata con quanto indicato nello sketch caricato su Arduino</li>
</ul>
<p dir="auto">In caso di corretta comunicazione dovremmo avere un output simile a  questo:</p>
<pre><code>~$ avrdude -c avrisp -p m32a -P /dev/ttyACM0 -b 19200

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9502 (probably m32a)

avrdude done.  Thank you.
</code></pre>
<p dir="auto">Arrivati a questo punto siamo pronti per programmare la nostra MCU, caricando ad esempio un bootloader.</p>
<p dir="auto">In un prossimo post vedremo come ottenere lo stesso risultato con un programmer dedicato, nel caso specifico <a href="https://www.fischl.de/usbasp/" target="_blank" rel="noopener noreferrer nofollow ugc">USBasp</a>.</p>
]]></description><link>https://keeb.it/topic/338/kbpedia-mcu-atmega-arduino-uno-come-isp-programmer</link><generator>RSS for Node</generator><lastBuildDate>Thu, 18 Jun 2026 10:49:13 GMT</lastBuildDate><atom:link href="https://keeb.it/topic/338.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Feb 2023 19:17:44 GMT</pubDate><ttl>60</ttl></channel></rss>