<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SPI Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/spi/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/spi/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Sun, 15 Jan 2017 17:12:59 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>SPI Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/spi/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Usare il potenziometro digitale MCP4131-103</title>
		<link>https://logicaprogrammabile.it/usare-potenziometro-digitale-mcp4131/</link>
					<comments>https://logicaprogrammabile.it/usare-potenziometro-digitale-mcp4131/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 18 Feb 2013 14:04:27 +0000</pubDate>
				<category><![CDATA[Elettronica]]></category>
		<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[SPI]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3346</guid>

					<description><![CDATA[<p>Come usare Arduino per pilotare un potenziometro digitale Molte applicazioni richiedono la variazione continua di alcuni parametri, come ad esempio un alimentatore, un amplificatore audio, un termostato o un varilight che solitamente impiegano un potenziometro analogico e l&#8217;intervento manuale di una persona per effettuare queste...</p>
<p>The post <a href="https://logicaprogrammabile.it/usare-potenziometro-digitale-mcp4131/">Usare il potenziometro digitale MCP4131-103</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come usare Arduino per pilotare un potenziometro digitale</h3>
<p>Molte applicazioni richiedono la variazione continua di alcuni parametri, come ad esempio un alimentatore, un amplificatore audio, un termostato o un varilight che solitamente impiegano un potenziometro analogico e l&#8217;intervento manuale di una persona per effettuare queste variazioni.<br />
Possiamo digitalizzare questi sistemi impiegando lo stesso principio di regolazione basato su potenziometro ma invece di agire fisicamente sulla manopola di regolazione possiamo utilizzare dei comandi software per incrementare decrementare il valore resistivo del potenziometro.</p>
<p>Il componente che andremmo ad usare è l&#8217;integrato <a href="http://ww1.microchip.com/downloads/en/DeviceDoc/22060b.pdf" target="_blank">MCP4131-103 prodotto dalla Microchip</a>. E&#8217; un integrato a 8 pin che possiamo comandare tramite il protocollo seriale SPI.<br />
Al suo interno troviamo un potenziometro da 10Kohm.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_BlockDiagram.png"><img decoding="async" class="aligncenter size-full wp-image-3349" alt="Diagramma interno MCP4131 103" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_BlockDiagram.png" width="229" height="177" /></a></p>
<p><span id="more-3346"></span></p>
<p>Il potenziometro è composto da una rete resistiva composta da 128 elementi  il cui valore totale è, nel nostro modello, di 10Kohm. Tramite software possiamo spostare la posizione dello <strong>Wiper</strong>, che corrisponde al contatto strisciante di un potenziometro meccanico. Gli spostamenti dello <strong>Wiper</strong> vengono definiti <strong>steps</strong> e vanno dalla posizione <strong>00H (Wiper collegato al pin P0A)</strong> alla posizione <strong>80H(Wiper collegato al pin P0B)</strong>.<br />
Il potenziometro digitale <strong>MCP4131</strong> permette un massimo di <strong>129 steps</strong>.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_InternalPot.png"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-3372" alt="MCP4131 Internal potentiometer diagram" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_InternalPot.png" width="286" height="456" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_InternalPot.png 286w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_InternalPot-188x300.png 188w" sizes="(max-width: 286px) 100vw, 286px" /></a></p>
<p>Il datasheet è comune a diversi potenziometri digitali quindi per poter capire quale siano i comandi corretti per pilotare il nostro modello dobbiamo esaminare le parti che ci interessano. La prima sezione riguarda le <strong>Caratteristiche del dispositivo</strong> (Device Features)</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_DeviceFeatures.png"><img decoding="async" class="aligncenter size-full wp-image-3351" alt="Caratteristiche del dispositivo MCP4131-103" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_DeviceFeatures.png" width="732" height="259" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_DeviceFeatures.png 732w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_DeviceFeatures-300x106.png 300w" sizes="(max-width: 732px) 100vw, 732px" /></a></p>
<p>Da questa tabella deduciamo che il dispositivo ha un <span style="text-decoration: underline;">singolo potenziometro</span>, che i valori della posizione dello Wiper sono <strong>memorizzati in RAM</strong> (piuttosto che sulla EEPROM). L&#8217;interfaccia di comunicazione è <strong>SPI</strong>, i numeri di<strong> Steps sono 129</strong> e il range con cui possiamo alimentare l&#8217;integrato va da 1.8Vdc a 5.5Vdc.</p>
<p>L&#8217;<strong>MCP4131</strong> supporta comandi a<strong> 8 bit e a 16 bit</strong>. Il comando a 8 bit permette di incrementare o decrementare il valore dello Wiper di uno steps per volta mentre il comando a 16 bit permette di scrivere direttamente sulla RAM il valore della posizione dello Wiper.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_CommandType.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3353" alt="MCP4131command format" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_CommandType.png" width="569" height="236" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_CommandType.png 569w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_CommandType-300x124.png 300w" sizes="auto, (max-width: 569px) 100vw, 569px" /></a></p>
<p>Nella figura il comando a 8 bit è composto da 2 bit di dati (che non vengono utilizzati), 2 bit di comando (incremento &#8211; decremento)  e 4 bit che definiscono l&#8217;indirizzo di memoria che vogliamo usare (indirizzo dello Wiper 00h).<br />
Nella figura del comando a 16 bit la prima parte è identica a quella a 8 bit con la differenza che nei 2 bit di comando possiamo specificare se scrivere o leggere dall&#8217;area di memoria del dispositivo, i restanti 8 bit compongono il Data Byte che ci permette di indicare direttamente il valore dello <strong>Wiper</strong>.</p>
<p>Gli indirizzi di memoria disponibili sono i seguenti:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_MemoryMAP.gif"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3359" alt="MCP4131 Memory Map" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_MemoryMAP.gif" width="364" height="204" /></a>nel nostro caso <strong>utilizzeremmo l&#8217;indirizzo 00h</strong>, che corrisponde all&#8217;unico Wiper disponibile all&#8217;interno del nostro chip.</p>
<p>I bit di commando invece sono i seguenti:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Command_Bit.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3360" alt="MCP4131 Command Bits" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Command_Bit.png" width="364" height="187" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Command_Bit.png 364w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Command_Bit-300x154.png 300w" sizes="auto, (max-width: 364px) 100vw, 364px" /></a></p>
<p>Passando alla pratica, se volessi inviare un comando di incremento al Wiper dell&#8217;MCP4131, usando la modalità a 8bit, invierei tramite SPI il valore decimale 4</p>
<p style="text-align: center;"><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_4dec.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3367" alt="Arduino Leonardo MCP4131" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_4dec.png" width="461" height="234" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_4dec.png 461w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_4dec-300x152.png 300w" sizes="auto, (max-width: 461px) 100vw, 461px" /></a></p>
<p style="text-align: left;">Per decrementare il valore corrente dello Wiper bisogna spedire via SPI il valore decimale 8:</p>
<p style="text-align: center;"><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_8dec.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3368" alt="Arduino Leonardo MCP4131" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_8dec.png" width="461" height="234" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_8dec.png 461w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_8dec-300x152.png 300w" sizes="auto, (max-width: 461px) 100vw, 461px" /></a></p>
<p style="text-align: left;">Se volessi spostare il Wiper al centro della sua corsa, utilizzerei la modalità a 16 bit, inviando per primo il dato contenente l&#8217;indirizzo di memoria che vogliamo usare e il comando di scrittura</p>
<p style="text-align: center;"><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_0dec.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3369" alt="Leonardo mcp4131-103" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_0dec.png" width="461" height="234" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_0dec.png 461w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/Comando_0dec-300x152.png 300w" sizes="auto, (max-width: 461px) 100vw, 461px" /></a></p>
<p style="text-align: left;">Seguito dal valore della posizione dove vogliamo spostare lo Wiper, in questo esempio il valore 64 decimale (128/2) corrisponde a metà corsa.</p>
<p style="text-align: center;"><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Dati.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3370" alt="Leonardo" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Dati.png" width="461" height="178" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Dati.png 461w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/Dati-300x115.png 300w" sizes="auto, (max-width: 461px) 100vw, 461px" /></a></p>
<p>Ora che conosciamo come utilizzare il chip possiamo passare alla pratica collegando la porta SPI dell&#8217;Arduino all&#8217;MCP4131. Nel mio caso ho utilizzato un <strong>Arduino Leonardo</strong> (<span style="text-decoration: underline;">la porta SPI è disponibile sui pin dell&#8217;header ICSP</span>). Lo schema è il seguente:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Arduino_Leonardo_MCP4131.gif"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3374" alt="Arduino Leonardo collegamento MCP4131-103" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/Arduino_Leonardo_MCP4131.gif" width="299" height="260" /></a></p>
<p>L&#8217;uscita <strong>W</strong> è collegata all&#8217;ingresso analogico<strong> A0</strong> della Leonardo, in questo modo posso misurare il valore di tensione disponibile su tale piedino.<br />
Il <strong>Pin B</strong> dell&#8217;MCP4131, corrispondente alla posizione 00H <strong>è collegato a massa</strong> mentre il<strong> pin A</strong> corrispondente alla posizione 80H è <strong>collegato alla 5Vdc</strong>.<br />
Il codice seguente posiziona lo Wiper nella posizione 00H, ottenendo cosi una tensione pressochè nulla sul <strong>pin W</strong> (poiche internamente il pin W è collegato con il pin B).</p>
<p>[c]<br />
#include &lt;SPI.h&gt;</p>
<p>void setup()<br />
{<br />
  //Definisco il pin come uscita<br />
  //il pin 2 viene usato per selezionare il<br />
  //chip all&#8217;interno di un collegamento SPI<br />
  pinMode (2, OUTPUT);</p>
<p>  //Inizializzo la libreria SPI<br />
  SPI.begin();</p>
<p>  //Inizializzo la porta seriale<br />
  Serial.begin(9600);</p>
<p>  //metto alta la linea CS per<br />
  //deselezionare il chip MCP4131<br />
  digitalWrite(2, HIGH);</p>
<p>}</p>
<p>void loop()<br />
{<br />
  //Inizializzo la posizione dello Wiper<br />
  byte Posizione = 0;</p>
<p>  //Per selezionare l&#8217;MCP4131<br />
  //metto basso la linea CS del<br />
  //potenziometro digitale<br />
  digitalWrite(2, LOW);</p>
<p>  //Invio il primo byte per eseguire una scrittura<br />
  //sul registro Wiper<br />
  SPI.transfer(0);<br />
  //Invio il valore della posizione dello Wiper<br />
  //valori da 00H a 80H (0-128 in decimale)<br />
  SPI.transfer(Posizione);</p>
<p>  //metto alta la linea CS per<br />
  //deselezionare il chip MCP4131<br />
  digitalWrite(2, HIGH);</p>
<p>  //eseguo la lettura sul pin analogico A0<br />
  //in questo pin è collegato il pin Wiper<br />
  //del potenziometro digitale<br />
  int Data = analogRead(0);</p>
<p>  //spedisco il dato letto al serial Monitor<br />
  //Valori da 0 a 1023<br />
  Serial.println(Data);</p>
<p>  //ritardo di mezzo secondo<br />
  delay(500);<br />
}<br />
[/c]</p>
<p>Aprendo il serial monitor otterremmo dei valori prossimi allo zero poichè la tensione in ingresso del pin A0 sarà nulla. Questo è ciò che avviene all&#8217;interno dell&#8217;MCP4131:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Gnd.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3381" alt="Wiper to GND" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Gnd.png" width="286" height="456" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Gnd.png 286w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Gnd-188x300.png 188w" sizes="auto, (max-width: 286px) 100vw, 286px" /></a></p>
<p>Per posizionare lo Wiper verso il<strong> pin A</strong>, collegato alla 5Vdc, dobbiamo scrivere sull&#8217;indirizzo 00H il valore 80H, come descritto nel codice seguente:</p>
<p>[c]<br />
#include &lt;SPI.h&gt;</p>
<p>void setup()<br />
{<br />
  //Definisco il pin come uscita<br />
  //il pin 2 viene usato per selezionare il<br />
  //chip all&#8217;interno di un collegamento SPI<br />
  pinMode (2, OUTPUT);</p>
<p>  //Inizializzo la libreria SPI<br />
  SPI.begin();</p>
<p>  //Inizializzo la porta seriale<br />
  Serial.begin(9600);</p>
<p>  //metto alta la linea CS per<br />
  //deselezionare il chip MCP4131<br />
  digitalWrite(2, HIGH);</p>
<p>}</p>
<p>void loop()<br />
{<br />
  //Inizializzo la posizione dello Wiper<br />
  byte Posizione = 128;</p>
<p>  //Per selezionare l&#8217;MCP4131<br />
  //metto basso la linea CS del<br />
  //potenziometro digitale<br />
  digitalWrite(2, LOW);</p>
<p>  //Invio il primo byte per eseguire una scrittura<br />
  //sul registro Wiper<br />
  SPI.transfer(0);<br />
  //Invio il valore della posizione dello Wiper<br />
  //valori da 00H a 80H (0-128 in decimale)<br />
  SPI.transfer(Posizione);</p>
<p>  //metto alta la linea CS per<br />
  //deselezionare il chip MCP4131<br />
  digitalWrite(2, HIGH);</p>
<p>  //eseguo la lettura sul pin analogico A0<br />
  //in questo pin è collegato il pin Wiper<br />
  //del potenziometro digitale<br />
  int Data = analogRead(0);</p>
<p>  //spedisco il dato letto al serial Monitor<br />
  //Valori da 0 a 1023<br />
  Serial.println(Data);</p>
<p>  //ritardo di mezzo secondo<br />
  delay(500);<br />
}<br />
[/c]</p>
<p>In questo caso aprendo il <strong>serial monitor</strong> leggeremmo dei valori prossimi a 1023 in quanto sul pin analogico A0 sarà presente la tensione di 5Vdc.<br />
Internamente otterremo questo risultato:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Vcc.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3383" alt="wiper to vcc" src="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Vcc.png" width="286" height="456" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Vcc.png 286w, https://logicaprogrammabile.it/wp-content/uploads/2013/02/MCP4131_Wip_Vcc-188x300.png 188w" sizes="auto, (max-width: 286px) 100vw, 286px" /></a></p>
<p>Di conseguenza per avere tutti gli altri valori intermedi potremmo cambiare il valore della variabile Posizione assegnandole <strong>valori tra 0 e 128</strong>.</p>
<p>The post <a href="https://logicaprogrammabile.it/usare-potenziometro-digitale-mcp4131/">Usare il potenziometro digitale MCP4131-103</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/usare-potenziometro-digitale-mcp4131/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Arduino UNO bootloader su un nuovo chip ATMEGA328</title>
		<link>https://logicaprogrammabile.it/arduino-bootloader-atmega328/</link>
					<comments>https://logicaprogrammabile.it/arduino-bootloader-atmega328/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Fri, 29 Jul 2011 09:50:52 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[ArduinoISP]]></category>
		<category><![CDATA[ATMEGA328]]></category>
		<category><![CDATA[Bootloader]]></category>
		<category><![CDATA[Programmatore AVR]]></category>
		<category><![CDATA[SPI]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=1767</guid>

					<description><![CDATA[<p>Procedura per caricare il bootloader su un chip vergine. La cosa che apprezzo maggiormente di Arduino è la possibilità di realizzare una propria compatible-board. Questo permette di creare soluzioni integrate che si adattano meglio alle proprie esigenze di sviluppo e di implementazione. Una volta realizzato...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-bootloader-atmega328/">Arduino UNO bootloader su un nuovo chip ATMEGA328</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Procedura per caricare il bootloader su un chip vergine.</h1>
<p>La cosa che apprezzo maggiormente di <strong>Arduino</strong> è la possibilità di realizzare una propria compatible-board. Questo permette di creare soluzioni integrate che si adattano meglio alle proprie esigenze di sviluppo e di implementazione.<br />
Una volta realizzato un prototipo funzionante con la board ufficiale possiamo rimuovere il chip Atmel per adattarlo su una nostra scheda.</p>
<p>Per realizzare questo lavoro è sufficiente acquistare degli <strong>Atmega328P-PU</strong> vergini, caricare il <strong>bootloader</strong>, lo sketch e montare tutto sulla scheda dedicata.</p>
<p>Per poter programmare i nuovi chip con gli sketch è necessario prima di tutto caricare il bootloader al loro interno, questa procedura solitamente viene eseguita tramite un programmatore dedicato che costa qualche decina di euro.</p>
<p>Fortunatamente esiste una tecnica che permette di utilizzare la nostra board Arduino UNO per programmare il nuovo chip. Sul web sono presenti molti esempi che illustrano i collegamenti e spiegano come caricare il bootloader, quasi tutti in lingua inglese; ho deciso, quindi, di scrivere questo articolo per dare la possibilità, soprattutto per i neofiti, di imparare questa utile tecnica.</p>
<p><span id="more-1767"></span>Prima di iniziare dobbiamo realizzare il circuito seguente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2600" title="Uno_BootLoad1" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uno_BootLoad1.gif" alt="" width="414" height="296" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uno_BootLoad1.gif 414w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uno_BootLoad1-300x214.gif 300w" sizes="auto, (max-width: 414px) 100vw, 414px" /></p>
<p>La tabella seguente riassume i collegamenti tra l&#8217;Arduino UNO e il chip ATMEGA328</p>
<table>
<tbody>
<tr>
<td>Arduino UNO</td>
<td>Chip vergine ATMEGA328</td>
</tr>
<tr>
<td>Pin 5V</td>
<td>da collegare ai pin 7 e pin 20</td>
</tr>
<tr>
<td>Pin GND</td>
<td>da collegare ai pin 8 e pin 22</td>
</tr>
<tr>
<td>Pin 10</td>
<td>da collegare al pin 1</td>
</tr>
<tr>
<td>Pin 11</td>
<td>da collegare al pin 17</td>
</tr>
<tr>
<td>Pin 12</td>
<td>da collegare al pin 18</td>
</tr>
<tr>
<td>Pin 13</td>
<td>da collegare al pin 19</td>
</tr>
</tbody>
</table>
<p>Inoltre il pin1 del nuovo chip deve essere collegato alla +5Vdc tramite una resistenza da 10Kohm. I pin 9 e 10 devono essere collegati al quarzo da 16Mhz e ai due condensatori ceramici.</p>
<p>Lo schema proposto utilizza il canale SPI per caricare il bootloader nel chip vergine. Via software è necessario predisporre l&#8217;Arduino UNO in modo che funga da programmatore.<br />
Non dobbiamo inventare niente, è sufficiente caricare lo sketch <strong>ArduinoISP</strong> presente nel menu <span style="text-decoration: underline;">File-&gt;Examples</span> dell&#8217;ambiente di sviluppo.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1783 size-full" title="Sketch Arduino ISP" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/ArduinoISP.jpg" alt="Caricare programma Arduino ISP" width="499" height="598" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/ArduinoISP.jpg 499w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/ArduinoISP-250x300.jpg 250w" sizes="auto, (max-width: 499px) 100vw, 499px" /></p>
<p>Ora carichiamo lo sketch sul nostro Arduino UNO utilizzando il pulsante upload e attendiamo il messaggio di conferma</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1785 size-full" title="Upload ArduinoISP" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Upload.jpg" alt="Procedura per caricare il bootloader Arduino" width="499" height="252" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Upload.jpg 499w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/Upload-300x151.jpg 300w" sizes="auto, (max-width: 499px) 100vw, 499px" /></p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uploading1.jpg"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1788" title="Uploading bootloader" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uploading1.jpg" alt="Fase di caricamento dello sketch" width="498" height="75" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uploading1.jpg 498w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uploading1-300x45.jpg 300w" sizes="auto, (max-width: 498px) 100vw, 498px" /></a></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1789 size-full" title="Caricamento sketch ultimato" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/UploadDone1.jpg" alt="caricamento ArduinoISP ultimato" width="498" height="156" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/UploadDone1.jpg 498w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/UploadDone1-300x93.jpg 300w" sizes="auto, (max-width: 498px) 100vw, 498px" /></p>
<p>A questo punto si potrebbero caricare sul nuovo chip diversi bootloader, a seconda del tipo di board che intendiamo realizzare (l&#8217;unica raccomandazione è comunque utilizzare una board compatibile col chip ATMEGA328).<br />
A noi, per ora, ci interessa caricare il bootloader dell&#8217;Arduino UNO, quindi dal menu <span style="text-decoration: underline;">Tools-&gt;Board</span> selezioniamo <strong>Arduino UNO</strong></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1792 size-full" title="Seleziona tipo scheda" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/SelectBoard.jpg" alt="Seleziona la scheda Arduino UNO" width="618" height="482" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/SelectBoard.jpg 618w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/SelectBoard-300x233.jpg 300w" sizes="auto, (max-width: 618px) 100vw, 618px" /></p>
<p>Non ci resta che avviare l&#8217;operazione tramite il menu <span style="text-decoration: underline;">Tools-&gt;Burn Bootloader-&gt; w/ Arduino as ISP</span></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1794 size-full" title="Burn Bootloader" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurnBootloader.jpg" alt="Caricamento bootloader tramite ISP" width="500" height="371" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurnBootloader.jpg 500w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurnBootloader-300x222.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></p>
<p>La scrittura del bootloader richiede qualche minuto. Durante l&#8217;operazione i led <strong>L</strong>, <strong>TX</strong> e <strong>RX</strong> sulla board <strong>Arduino Uno</strong> lampeggiano costantemente e si spengono solo quando la scrittura è completata.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1795 size-full" title="Burning Bootloader" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurningBootloader.jpg" alt="Fase di scrittura del bootloader" width="499" height="119" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurningBootloader.jpg 499w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurningBootloader-300x71.jpg 300w" sizes="auto, (max-width: 499px) 100vw, 499px" /></p>
<p>dopo qualche minuto l&#8217;editor mostrerà un messaggio dell&#8217;avvenuta scrittura del bootloader</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1797 size-full" title="Burn Bootloader Done" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurnBootloaderDone.jpg" alt="scritura bootloader eseguita con successo" width="502" height="88" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurnBootloaderDone.jpg 502w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/BurnBootloaderDone-300x52.jpg 300w" sizes="auto, (max-width: 502px) 100vw, 502px" /></p>
<p>Su diversi blog ho letto che questa operazione potrebbe concludersi con l&#8217;errore <strong>avrdude: stk500_getsync(): not in sync: resp=0x00 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51.<br />
</strong>Ciò può dipendere da errori di connessione risolvibili controllando la corretta porta dove è collegato l&#8217;Arduino (Tools-&gt;Serial Port) o scollegando e ricollegando il cavo usb.</p>
<p>Se il problema persiste questo può allora dipendere all&#8217;autoreset dell&#8217;Arduino UNO. Per risolverlo è sufficiente modificare lo schema elettrico aggiungendo una resistenza da 120 Ohm e un condensatore da 10microF che hanno il compito di disabilitare l&#8217;autoreset. Ecco lo schema:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1801 size-full" title="Disable Autoreset Arduino Uno" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uno_BootLoadMOD.gif" alt="Disabilitare autoreset Arduino UNO" width="414" height="296" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uno_BootLoadMOD.gif 414w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/Uno_BootLoadMOD-300x214.gif 300w" sizes="auto, (max-width: 414px) 100vw, 414px" /></p>
<p>Ultimati i collegamenti eseguiamo nuovamente la procedura per il caricamento del bootloader.</p>
<p>Ora che il nuovo chip è dotato di bootloader possiamo montarlo sulla board Arduino Uno per programmarlo con gli sketch di esempio e verificare che tutto funziona regolarmente.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1809 size-full" title="Esperimento Arduino ISP" src="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Scheda.jpg" alt="Arduino ISP" width="450" height="337" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/07/Scheda.jpg 450w, https://logicaprogrammabile.it/wp-content/uploads/2011/07/Scheda-300x224.jpg 300w" sizes="auto, (max-width: 450px) 100vw, 450px" /></p>
<p>&nbsp;</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-bootloader-atmega328/">Arduino UNO bootloader su un nuovo chip ATMEGA328</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-bootloader-atmega328/feed/</wfw:commentRss>
			<slash:comments>26</slash:comments>
		
		
			</item>
	</channel>
</rss>
