<?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>Autoreset Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/autoreset/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/autoreset/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Sun, 12 Feb 2023 14:34:55 +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>Autoreset Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/autoreset/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Circuito supervisore watchdog timer ADM1232</title>
		<link>https://logicaprogrammabile.it/watchdog-adm1232-arduino-stand-alone/</link>
					<comments>https://logicaprogrammabile.it/watchdog-adm1232-arduino-stand-alone/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Fri, 23 Jun 2017 13:47:22 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Autoreset]]></category>
		<category><![CDATA[Reset Automatico]]></category>
		<category><![CDATA[Watchdog timer]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3552</guid>

					<description><![CDATA[<p>Come utilizzare un circuito di supervisione hardware usando l&#8217;ADM1232 L&#8217;architettura dei microcontrollori ha raggiunto ottimi livelli di affidabilità con elevati livelli prestazionali. Solitamente, quando si parla di affidabilità, si intende la capacità del micro di funzionare in ambienti critici, dove gli intervalli di temperature sono...</p>
<p>The post <a href="https://logicaprogrammabile.it/watchdog-adm1232-arduino-stand-alone/">Circuito supervisore watchdog timer ADM1232</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come utilizzare un circuito di supervisione hardware usando l&#8217;ADM1232</h1>
<p>L&#8217;architettura dei <strong>microcontrollori</strong> ha raggiunto ottimi livelli di <strong>affidabilità</strong> con elevati livelli prestazionali. Solitamente, quando si parla di affidabilità, si intende la capacità del micro di funzionare in <strong>ambienti critici</strong>, dove gli intervalli di <strong>temperature</strong> sono estesi (-40°C +85°C) o dove la presenza di <strong>rumori elettromagnetici</strong> o altri elementi fisici non deve certamente bloccare il funzionamento del microcontrollore.</p>
<p>Nella maggior parte dei casi i blocchi software sono ancora causati da errori di scrittura del firmware che gira sul micro. Questi blocchi sono tipicamente dovuti a <strong>loop infiniti</strong> o <strong>deadlock;</strong> errori che aumentano all&#8217;aumentare della complessità del codice.</p>
<p>Quando non possiamo permetterci nessun tipo di blocco vengono impiegati sistemi di supervisione hardware che, tramite sistemi integrati all&#8217;interno del micro stesso (<a href="http://it.wikipedia.org/wiki/Watchdog" target="_blank" rel="noopener">Watchdog Timer</a>) o con specifici moduli esterni, possono eseguire un reset del micro appena &#8216;si accorgono&#8217; che l&#8217;esecuzione del codice del micro è bloccata.</p>
<p>Alcuni moduli permettono anche di controllare la qualità della tensione di alimentazione, e di eseguire un reset non appena si verificano abbassamenti di tensione.</p>
<p>Il dispositivo che ho utilizzato per questo tutorial è l&#8217;integrato <a href="http://www.analog.com/static/imported-files/data_sheets/ADM1232.pdf" target="_blank" rel="noopener"><strong>ADM1232</strong> prodotto da <strong>Analog Device</strong></a>, molto semplice da utilizzare e dal costo contenuto (circa 2 €).</p>
<p><span id="more-3552"></span></p>
<p>L&#8217;idea di base è quella di controllare la presenza di uno strobe, un segnale impulsivo, generato dal microcontrollore, che deve presentarsi costantemente entro certi valori di tempo.</p>
<p>Se questo segnale dovesse mancare (indice di un blocco di funzionamento del microcontrollore), il circuito di supervisione <strong>ADM1232</strong> eseguirà un reset del microcontrollore.</p>
<p>La figura seguente mostra il tipico collegamento tra il circuito di supervisione ed il microcontrollore:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaFunzionamento1.png"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-3564" src="https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaFunzionamento1.png" alt="ADM1232 Supervisor Circuit" width="330" height="201" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaFunzionamento1.png 330w, https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaFunzionamento1-300x182.png 300w" sizes="(max-width: 330px) 100vw, 330px" /></a>Il diagramma a blocchi è rappresentato nella figura seguente:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaBlocchi.png"><img decoding="async" class="aligncenter size-full wp-image-3565" src="https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaBlocchi.png" alt="Diagrammi a blocchi ADM1232" width="385" height="187" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaBlocchi.png 385w, https://logicaprogrammabile.it/wp-content/uploads/2013/04/DiagrammaBlocchi-300x145.png 300w" sizes="(max-width: 385px) 100vw, 385px" /></a></p>
<p>Il dispositivo genera un impulso di reset ad intervalli che possono variare tra <strong>150ms</strong>, <strong>600ms</strong> e <strong>1200ms</strong>. Questi tre valori sono impostabili tramite il<strong> pin TD (Time Delay)</strong>, per selezionare <strong>150ms il TD va collegato a massa</strong>, per selezionare <strong>600ms il pin TD va lasciato appeso</strong> (senza collegarlo ne a Gnd ne a Vcc), per selezionare <strong>1200ms va collegato alla Vcc</strong>.</p>
<p>Per evitare la generazione dell&#8217;evento reset, dobbiamo inviare un impulso negativo al pin <strong>STROBE</strong>.</p>
<p>Questo impulso deve essere inferiore del tempo di reset impostato, quindi se ad esempio abbiamo selezionato il tempo di 1200ms, al pin <strong>STROBE</strong> dovrà arrivare un segnale impulsivo con un periodo inferiore ai 1200ms.</p>
<p>I grafici seguenti mostrano l&#8217;andamento dei segnali:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Strobe_Signal.png"><img decoding="async" class="size-full wp-image-5522 aligncenter" src="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Strobe_Signal.png" alt="Segnale Strobe" width="554" height="304" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Strobe_Signal.png 554w, https://logicaprogrammabile.it/wp-content/uploads/2017/06/Strobe_Signal-300x165.png 300w" sizes="(max-width: 554px) 100vw, 554px" /></a></p>
<p>Mentre il seguente grafico mostra la generazione dell&#8217;impulso di reset quando il segnale di strobe supera i 1200ms:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Rset_Signal.png"><img loading="lazy" decoding="async" class="size-full wp-image-5523 aligncenter" src="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Rset_Signal.png" alt="Segnale di reset watchdog" width="544" height="346" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Rset_Signal.png 544w, https://logicaprogrammabile.it/wp-content/uploads/2017/06/Rset_Signal-300x191.png 300w" sizes="auto, (max-width: 544px) 100vw, 544px" /></a></p>
<p>Affrontiamo la parte pratica realizzando il circuito seguente utilizzando un<strong> ATMEGA328P Stand Alone</strong>:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Adm1232_WatchDog.png"><img loading="lazy" decoding="async" class="wp-image-5525 size-full aligncenter" src="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Adm1232_WatchDog.png" alt="Adm1232 watchdog circuito supervisore" width="447" height="332" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/06/Adm1232_WatchDog.png 447w, https://logicaprogrammabile.it/wp-content/uploads/2017/06/Adm1232_WatchDog-300x223.png 300w" sizes="auto, (max-width: 447px) 100vw, 447px" /></a></p>
<p>Ho impostato il <strong>TD</strong> a 1200ms, portando a +5V il pin <strong>TD</strong> dell&#8217;integrato supervisore <strong>ADM1232</strong>.</p>
<p>Lo sketch di test esegue una commutazione del pin 9, per generare il segnale di <strong>STROBE</strong> che permette di interdire la generazione del segnale <strong>RESET</strong>. Ho inserito un ritardo software di 500ms per simulare l&#8217;esecuzione di altro codice.</p>
<p>In questa condizione il segnale di <strong>STROBE</strong> è generato ogni 100ms circa e quindi essendo inferiore al tempo di 1200ms, il segnale di <strong>RESET</strong> non viene generato.</p>
<pre class="lang:arduino decode:true ">void setup()
{
  //pin 9 in uscita
  pinMode(9, OUTPUT);
}

void loop()
{
  //condizione per la quale non viene
  //generato il reset poichè il tempo di
  //esecuzione è inferiore ai 1200ms

  //segnale STROBE
  digitalWrite(9,HIGH);
  digitalWrite(9,LOW);

  //simulazione ritardo esecuzione
  delay(500);
}</pre>
<p>Invece nello sketch seguente viene simulato un ritardo maggiore di 1200ms, in questo caso il chip <strong>ADM1232</strong> non ricevendo il segnale di <strong>STROBE</strong> entro i 1200ms produrrà il segnale di <strong>RESET</strong> per riavviare l&#8217;esecuzione del codice sulla <strong>ATMEGA328P</strong>.</p>
<pre class="lang:arduino decode:true">void setup()
{
  //pin 9 in uscita
  pinMode(9, OUTPUT);
}

void loop()
{
  //condizione per la quale non viene
  //generato il reset poichè il tempo di
  //esecuzione è inferiore ai 1200ms

  //segnale STROBE
  digitalWrite(9,HIGH);
  digitalWrite(9,LOW);

  //simulazione ritardo esecuzione
  delay(2000);
}</pre>
<blockquote><p>Attenzione il circuito supervisore <strong>ADM1232</strong> può essere usato solo su dispositivi privi di <strong>bootloader</strong>. Infatti la presenza del <strong>bootloader</strong> renderà l&#8217;esecuzione del codice, al primo avvio molto lenta, circa 1,5 secondi. Dato questo tempo il circuito supervisore non potra mai ricevere, entro la soglia di 1,2 secondi, l&#8217;impulso di <strong>strobe</strong>, di conseguenza resetterà perennemente il <strong>microcontrollore</strong>.</p></blockquote>
<p>Quando il vostro progetto è particolarmente complesso o richiede sicurezze aggiuntive, avere un circuito di supervisione permetterà di utilizzarlo in situazioni dove è richiesta una maggiore affidabilità ad esempio di definendo nel blocco <strong>setup()</strong> delle impostazioni di default di sicurezza, come il posizionamento iniziale di motori o la diseccitazione dei relè.</p>
<p>The post <a href="https://logicaprogrammabile.it/watchdog-adm1232-arduino-stand-alone/">Circuito supervisore watchdog timer ADM1232</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/watchdog-adm1232-arduino-stand-alone/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Riavviare Arduino via software</title>
		<link>https://logicaprogrammabile.it/riavviare-arduino-software/</link>
					<comments>https://logicaprogrammabile.it/riavviare-arduino-software/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Tue, 15 Nov 2011 08:55:05 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Autoreset]]></category>
		<category><![CDATA[Reset Automatico]]></category>
		<category><![CDATA[Watchdog timer]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2241</guid>

					<description><![CDATA[<p>Come eseguire un riavvio dello sketch via software Avere la possibilità di riavviare l&#8217;esecuzione del programma può risultare utile nei casi in cui ci sia l&#8217;esigenza di ripristinare la board a una condizione iniziale certa, soprattutto quando si trova in una posizione non accessibile o...</p>
<p>The post <a href="https://logicaprogrammabile.it/riavviare-arduino-software/">Riavviare Arduino via software</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come eseguire un riavvio dello sketch via software</h1>
<p>Avere la possibilità di riavviare l&#8217;esecuzione del programma può risultare utile nei casi in cui ci sia l&#8217;esigenza di ripristinare la board a una condizione iniziale certa, soprattutto quando si trova in una posizione non accessibile o remota.<br />
Supponiamo il caso di una <a href="https://www.arduino.cc/en/Reference/Ethernet">Arduino Ethernet</a>, o comunque con capacità di avere un collegamento ethernet o wifi, che si trova a lavorare in un posizione remota e che per qualsiasi motivo vogliamo seguire un riavvio della scheda per poter inizializzare nuovamente il programma che gira sulla scheda.<br />
In questo caso possiamo usare una funzione, che se richiamata, permette di riavviare il programma come quando alimentiamo la scheda.</p>
<figure id="attachment_2247" aria-describedby="caption-attachment-2247" style="width: 199px" class="wp-caption aligncenter"><a href="https://logicaprogrammabile.it/wp-content/uploads/2011/11/RebootArduino.jpg"><img loading="lazy" decoding="async" class="wp-image-2247 size-full" title="Reboot_Arduino" src="https://logicaprogrammabile.it/wp-content/uploads/2011/11/RebootArduino.jpg" alt="Riavviare Arduino Ethernet via software" width="199" height="148" /></a><figcaption id="caption-attachment-2247" class="wp-caption-text">Riavviare Arduino Ethernet via software</figcaption></figure>
<p>Sul sito <a href="https://www.arduino.cc">Arduino.cc</a> hè disponibile nella sezione guide, una utile funzione che permette appunto di riavviare la scheda. Il codice seguente permette di testare questa funzione affinché possiamo capirne il funzionamento e poterla applicare secondo le nostre esigenze:</p>
<pre class="lang:arduino decode:true">int var = 0;

//Dichiarazione di funzione che punta all'indirizzo zero
void(* Riavvia)(void) = 0;

void setup()
{
  //inizializzo la seriale
  Serial.begin(9600);
  //avvio
  Serial.println("AVVIO");
  //attendo 1s
  delay(1000);

}

void loop()
{
  //incremento la variabile
  var++;
  //visualizzo sul serial monitor
  //il valore della variabile
  Serial.println(var);
  //attendo 5s
  Serial.println("Attesa");
  delay(5000);
  //reset via software
  Serial.println("Reset!!");
  Riavvia();

}</pre>
<p><span id="more-2241"></span></p>
<p>Il codice dichiara, prima del blocco setup, una funzione che in pratica è un <strong>puntatore a funzione</strong> che viene fatto puntare alla posizione zero (scusate il gioco di parole!!). Richiamare questa funzione permette ad <strong>Arduino</strong> di eseguire il codice se fosse stato appena stato resettato (anche se non vi è un vero e proprio reset hardware).<br />
Ho inserito una variabile per verificare che il suo valore fosse, ad ogni riavvio, inizializzato a zero. I vari messaggi inviati al serial monitor permettono di dimostare e capire il funzionamento del codice.</p>
<h3>Riavviare Arduino su richiesta</h3>
<p>In questo codice di esempio viene eseguito il riavvio della scheda quando inviamo, tramite comunicazione seriale, usando il Serial Monitor, un particolare carattere:</p>
<pre class="lang:arduino decode:true ">String var = "";
 
//Dichiarazione di funzione che punta all'indirizzo zero
void(* Riavvia)(void) = 0;
 
void setup()
{
  Serial.begin(9600);
  Serial.println("AVVIO");
  delay(100);
}
 
void loop()
{
  //verifico la presenza di un dato sulla seriale
  if (Serial.available() &gt; 0)
  {
    var = Serial.readString();
    //Invio la lettera R tramite Serial Monitor
    if (var == "R") //R
    {
    //reset software
    Serial.println("Riavvio...");
    delay(100);
    Riavvia();
    }
  }
 
 //Altro codice da eseguire...
 delay(10);
 
}</pre>
<p>Quando progettiamo un circuito basato su microcontrollore che deve avere delle funzionalità per cui è possibile resettarlo in caso di mal funzionamenti, possiamo utilizzare le funzionalità del <a href="https://logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/">Watchdog timer</a> o di un circuito di <a href="https://logicaprogrammabile.it/watchdog-adm1232-arduino-stand-alone/">supervisione esterna</a>.</p>
<p>The post <a href="https://logicaprogrammabile.it/riavviare-arduino-software/">Riavviare Arduino via software</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/riavviare-arduino-software/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arduino resettare automaticamente la scheda utilizzando il WatchDog Timer</title>
		<link>https://logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/</link>
					<comments>https://logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 05 Oct 2011 09:29:00 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Autoreset]]></category>
		<category><![CDATA[Reset Automatico]]></category>
		<category><![CDATA[Watchdog timer]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2055</guid>

					<description><![CDATA[<p>Watchdog, come evitare i dead loop Il watchdog è un sistema molto interessante impiegato per supervisionare il normale ciclo di istruzioni  eseguite dalla cpu. L&#8217;idea è quella di monitorare l&#8217;esecuzione del programma per evitare blocchi o cicli infiniti (dead loop), dovuti a bug logici o...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/">Arduino resettare automaticamente la scheda utilizzando il WatchDog Timer</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Watchdog, come evitare i dead loop</h1>
<p>Il <strong>watchdog</strong> è un sistema molto interessante impiegato per supervisionare il normale ciclo di istruzioni  eseguite dalla cpu.<br />
L&#8217;idea è quella di monitorare l&#8217;esecuzione del programma per evitare <a href="http://it.wikipedia.org/wiki/Deadlock" target="_blank" rel="noopener">blocchi</a> o <a href="http://it.wikipedia.org/wiki/Loop_infinito" target="_blank" rel="noopener">cicli infiniti</a> (dead loop), dovuti a bug logici o situazioni esterne che portano il microcontrollore ad attender, per esempio, a input che non arriveranno mai.</p>
<p>In questo caso il <strong>watchdog</strong> interviene resettando il microcontrollore e riavviando automaticamente l&#8217;esecuzione del codice.</p>
<p>Questo meccanismo è solitamente implementato in hardware e, anche <strong>Arduino</strong>, basato sul microcontrollore ATMega328, supporta questa funzione</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-medium wp-image-2059" title="DiagrammaWD" src="https://logicaprogrammabile.it/wp-content/uploads/2011/10/DiagrammaWD-218x300.gif" alt="Arduino atmega328 watchdog timer" width="218" height="300" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/10/DiagrammaWD-218x300.gif 218w, https://logicaprogrammabile.it/wp-content/uploads/2011/10/DiagrammaWD.gif 508w" sizes="auto, (max-width: 218px) 100vw, 218px" /></p>
<p><span id="more-2055"></span>Se il programma che andiamo a scrivere per la board Arduino è progettato considerando tutti gli aspetti e le variabili che possono bloccare la cpu, non è necessario gestire il Watchdog, che di default è disabilitato.<br />
Capita comunque che si verificano delle particolari condizioni che portano il programma a rimanere in attesa, ad esempio, di un particolare input che per cause esterne, non gestibili, potrebbe non arrivare mai.</p>
<p>Il watchdog quindi attende per un certo periodo e se, allo scadere di questo tempo l&#8217;input non è arrivato il Watchdog resetta la cpu facendola riavviare. In caso contrario, quando l&#8217;input arriva entro questo tempo, è fondamentale che il codice resetti il <strong>watchdog</strong> per evitare che questo resetti continuamente la cpu.</p>
<p>Il diagramma a blocchi seguente illustra in modo banale il meccanismo del <strong>watchdog</strong></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2063" title="SchemaWD" src="https://logicaprogrammabile.it/wp-content/uploads/2011/10/SchemaWD.gif" alt="Schema esecuzione watchdog" width="482" height="481" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/10/SchemaWD.gif 482w, https://logicaprogrammabile.it/wp-content/uploads/2011/10/SchemaWD-150x150.gif 150w, https://logicaprogrammabile.it/wp-content/uploads/2011/10/SchemaWD-300x300.gif 300w" sizes="auto, (max-width: 482px) 100vw, 482px" /></p>
<h2>Codice da utilizzare</h2>
<p>Per utilizzare il Watchdog inseriamo nello sketch il riferimento alla libreria <strong>wdt.h<br />
</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">#include &lt;avr/wdt.h&gt;</pre>
<p>I tempi di reset del Watchdog sono prestabiliti e possono essere scelti utilizzando i valori specificati nella tabella seguente</p>
<table align="center">
<tbody>
<tr>
<td>Tempo reset</td>
<td>Parola Chiave</td>
</tr>
<tr>
<td>15mS</td>
<td><strong>WDTO_15MS</strong></td>
</tr>
<tr>
<td>30mS</td>
<td><strong>WDTO_30MS</strong></td>
</tr>
<tr>
<td>60mS</td>
<td><strong>WDTO_60MS</strong></td>
</tr>
<tr>
<td>120mS</td>
<td><strong>WDTO_120MS</strong></td>
</tr>
<tr>
<td>250mS</td>
<td><strong>WDTO_250MS</strong></td>
</tr>
<tr>
<td>500mS</td>
<td><strong>WDTO_500MS</strong></td>
</tr>
<tr>
<td>1S</td>
<td><strong>WDTO_1S</strong></td>
</tr>
<tr>
<td>2S</td>
<td><strong>WDTO_2S</strong></td>
</tr>
<tr>
<td>4S</td>
<td><strong>WDTO_4S</strong></td>
</tr>
<tr>
<td>8S</td>
<td><strong>WDTO_8S</strong></td>
</tr>
</tbody>
</table>
<p>Nel blocco <strong>setup()</strong> decidiamo di abilitare il watchdog specificando il tempo di reset utilizzando la seguente funzione:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">//abilito il watchdog e imposto come tempo di reser 2 secondi 
wdt_enable(WDTO_2S);</pre>
<p>questo significa che se entro 2 secondi non resettiamo il conteggio del watchdog, esso eseguirà automaticamente il reset della cpu.<br />
Per resettarlo impieghiamo la seguente funzione:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">//resetto il watchdog 
wdt_reset();</pre>
<p>Il codice seguente mostra meglio il funzionamento del sistema</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">#include &lt;avr/wdt.h&gt; 
void setup() {
  //attivo il watchdog e lo imposto 
  //per una soglia di tempo di 2 Secondi 
  wdt_enable(WDTO_2S);
} 

void loop() { 
  //eseguo qualcosa... 
  delay(500); 
  //resetto il watchdog 
  wdt_reset(); 
}</pre>
<p>All&#8217;interno del blocco <strong>loop()</strong> eseguo un delay di 500 ms e poi resetto il watchdog, in questo caso il watchdog non resetterà mai la cpu poiché non arriverà mai a contare i due secondi preimpostati, dato che il reset avviene ogni 500 ms.<br />
Vediamo invece questa situazione:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">#include &lt;avr/wdt.h&gt;

void setup()
{
  //attivo il watchdog e lo imposto
  //per una soglia di tempo di 2 Secondi
  wdt_enable(WDTO_2S);

}

void loop()
{
  //eseguo qualcosa...
  delay(3000); //3 secondi

  //resetto il watchdog
  wdt_reset();
}</pre>
<p>Il codice precedente mette in funzione il sistema di auto reset in quanto, il delay di 3 secondi, fa in modo che il watchdog arrivi a contare i 2 secondi preimpostati facendo resettare la cpu.</p>
<p>Di fatto l&#8217;istruzione <strong>wdt_reset()</strong> non verrà mai eseguita.</p>
<p>Consiglio di utilizzare questo meccanismo in tutte le situazioni critiche che richiedono una certezza che la cpu esegua costantemente il suo compito evitando blocchi che porterebbero all&#8217;interruzione del servizio.</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/">Arduino resettare automaticamente la scheda utilizzando il WatchDog Timer</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
	</channel>
</rss>
