<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Commenti a: Corso programmazione PICMicro in C – Lezione 5 – Timer0 e Prescaler: come si impostano per generare l&#8217;interrupt nei tempi che vogliamo, applicazione pratica</title>
	<atom:link href="http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/</link>
	<description></description>
	<lastBuildDate>Wed, 08 Feb 2012 18:15:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>Di: Fabio</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-13333</link>
		<dc:creator>Fabio</dc:creator>
		<pubDate>Tue, 15 Nov 2011 01:41:36 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-13333</guid>
		<description>Grazie per l&#039;articolo
L&#039;avevo già letto e studiato (anche + di una volta) ma ogni volta riesco ad apprendere qualcosa di nuovo che dalla lettura precedente mi era sfuggito.
Vorrei chiederti una cosa in merito all&#039;inizializzazione di timer0 per ottenere un tempo preciso dell&#039;interrupt.
Quando viene spiegata la correzione di due valori per i cicli macchina che perdiamo durante la scrittura dobbiamo fare l&#039;ipotesi che l&#039;istruzione che assegna il valore a timer0 sia la prima della routine ISR?
O comunque questa ipotesi di assegnare come prima cosa subito il valore di timer0 deve sempre essere valida altrimenti si &quot;sporca&quot; con il tempo trascorso dall&#039;inizio dell&#039;esecuzione della ISR fino a quando faccio l&#039;assegnazione?
Ti ringrazio
Scusa se non mi dilungo con i dovuti complimenti ma adesso che ti scrivo sono le 2:38 di notte
un saluto
fabio milano</description>
		<content:encoded><![CDATA[<p>Grazie per l&#8217;articolo<br />
L&#8217;avevo già letto e studiato (anche + di una volta) ma ogni volta riesco ad apprendere qualcosa di nuovo che dalla lettura precedente mi era sfuggito.<br />
Vorrei chiederti una cosa in merito all&#8217;inizializzazione di timer0 per ottenere un tempo preciso dell&#8217;interrupt.<br />
Quando viene spiegata la correzione di due valori per i cicli macchina che perdiamo durante la scrittura dobbiamo fare l&#8217;ipotesi che l&#8217;istruzione che assegna il valore a timer0 sia la prima della routine ISR?<br />
O comunque questa ipotesi di assegnare come prima cosa subito il valore di timer0 deve sempre essere valida altrimenti si &#8220;sporca&#8221; con il tempo trascorso dall&#8217;inizio dell&#8217;esecuzione della ISR fino a quando faccio l&#8217;assegnazione?<br />
Ti ringrazio<br />
Scusa se non mi dilungo con i dovuti complimenti ma adesso che ti scrivo sono le 2:38 di notte<br />
un saluto<br />
fabio milano</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Esposito Francesco</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-13044</link>
		<dc:creator>Esposito Francesco</dc:creator>
		<pubDate>Thu, 03 Nov 2011 14:10:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-13044</guid>
		<description>Ciao Gianni,

relativamente al programma di esempio,  mi è sorto un dubbio. La variabile TimerLed non dovrebbe essere qualificata volatile, essendo usata dalla routine di gestione degli interrupt? Anche se con la versione Lite del compilatore Hi-Tech non dovrebbe esserci molta differenza, essendo adoperato un basso livello di ottimizzazione del codice sorgente. 

Ciao.</description>
		<content:encoded><![CDATA[<p>Ciao Gianni,</p>
<p>relativamente al programma di esempio,  mi è sorto un dubbio. La variabile TimerLed non dovrebbe essere qualificata volatile, essendo usata dalla routine di gestione degli interrupt? Anche se con la versione Lite del compilatore Hi-Tech non dovrebbe esserci molta differenza, essendo adoperato un basso livello di ottimizzazione del codice sorgente. </p>
<p>Ciao.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-12998</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 01 Nov 2011 19:28:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-12998</guid>
		<description>Se da quell&#039;errore allora il codice ti assicuro che non è il mio, di sicuro hai fatto qualche modifica. Controlla che quel nome sia scritto correttamente (maiuscole/minuscole)</description>
		<content:encoded><![CDATA[<p>Se da quell&#8217;errore allora il codice ti assicuro che non è il mio, di sicuro hai fatto qualche modifica. Controlla che quel nome sia scritto correttamente (maiuscole/minuscole)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: giorivals</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-12995</link>
		<dc:creator>giorivals</dc:creator>
		<pubDate>Tue, 01 Nov 2011 19:23:08 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-12995</guid>
		<description>Ciao Giovanni, ho un piccolo problema, di quelle cose stupide che ci perdi ore, poi ti dicono &quot;ma no dai devi fare così!&quot; tu lo fai e va tutto, e ti senti scemo.

hai idea del perchè quando faccio il build del main il compilatore mi dice 

 Error   [499] ; 0. undefined symbol:
	_settaggi1(ledcicalino.obj) 

eppure il main è identico al tuo!

già ti sono grato per quello che hai fatto e continui a fare, se chiarissi il dubbio ti osanno.

ciao.</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni, ho un piccolo problema, di quelle cose stupide che ci perdi ore, poi ti dicono &#8220;ma no dai devi fare così!&#8221; tu lo fai e va tutto, e ti senti scemo.</p>
<p>hai idea del perchè quando faccio il build del main il compilatore mi dice </p>
<p> Error   [499] ; 0. undefined symbol:<br />
	_settaggi1(ledcicalino.obj) </p>
<p>eppure il main è identico al tuo!</p>
<p>già ti sono grato per quello che hai fatto e continui a fare, se chiarissi il dubbio ti osanno.</p>
<p>ciao.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-12865</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 26 Oct 2011 20:33:14 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-12865</guid>
		<description>Perchè, scritta così non è una funzione a se stante? Mi pare che il main ha una graffa di apertura e una di chiusura. Quindi dopo la graffa di chiusura posso scrivere altre funzioni. Dove sta scritto che le funzioni vanno dichiarate prima del main?</description>
		<content:encoded><![CDATA[<p>Perchè, scritta così non è una funzione a se stante? Mi pare che il main ha una graffa di apertura e una di chiusura. Quindi dopo la graffa di chiusura posso scrivere altre funzioni. Dove sta scritto che le funzioni vanno dichiarate prima del main?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Angelo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-12864</link>
		<dc:creator>Angelo</dc:creator>
		<pubDate>Wed, 26 Oct 2011 20:31:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-12864</guid>
		<description>ciao Gianni, mi unisco al coro di complimenti....ottimo lavoro!

Una domanda: ho notato che hai messo &quot;void interrupt ISR (void)&quot; dopo la funzione main, ma l&#039;interrupt non è da considerare una funzione a sè stante? Se si, non doveva essere dichiarata prima del main???</description>
		<content:encoded><![CDATA[<p>ciao Gianni, mi unisco al coro di complimenti&#8230;.ottimo lavoro!</p>
<p>Una domanda: ho notato che hai messo &#8220;void interrupt ISR (void)&#8221; dopo la funzione main, ma l&#8217;interrupt non è da considerare una funzione a sè stante? Se si, non doveva essere dichiarata prima del main???</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: marcobrucchietti</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-12441</link>
		<dc:creator>marcobrucchietti</dc:creator>
		<pubDate>Fri, 23 Sep 2011 23:04:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-12441</guid>
		<description>Grazie mille per avermi risposto,ho risolto mettendo ANSEL=0.</description>
		<content:encoded><![CDATA[<p>Grazie mille per avermi risposto,ho risolto mettendo ANSEL=0.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-12440</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 23 Sep 2011 19:03:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-12440</guid>
		<description>Prova con questi consigli: http://www.settorezero.com/wordpress/perche-il-led-che-ho-collegato-sulla-porta-rxy-non-si-accende-disattivare-comparatore-e-convertitore-ad/</description>
		<content:encoded><![CDATA[<p>Prova con questi consigli: <a href="http://www.settorezero.com/wordpress/perche-il-led-che-ho-collegato-sulla-porta-rxy-non-si-accende-disattivare-comparatore-e-convertitore-ad/" rel="nofollow">http://www.settorezero.com/wordpress/perche-il-led-che-ho-collegato-sulla-porta-rxy-non-si-accende-disattivare-comparatore-e-convertitore-ad/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: marcobrucchietti</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-12439</link>
		<dc:creator>marcobrucchietti</dc:creator>
		<pubDate>Fri, 23 Sep 2011 18:26:04 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-12439</guid>
		<description>Salve, ho uno starterkit2 con relativa scheda demoboard con sopra montato un PIC16F690. Ho modificato il codice della lezione, per adattarlo al pic e alla scheda.
Come si vede dal codice lavoro con la frequenza interna del PIC, a 8 MHz. Facendo i conti per avere un interrupt ogni 1ms del timer0, ho utilizzato il prescaler a (1:32). Icicalino funziona come voluto, ne ho usato uno che emette un suono ogni volta che ha tensione. Il problema è sul led che rimanesempre acceso, non riasco a capire il perchè. Mi potete aiutare. Riporto il codice:
#define _LEGACY_HEADERS
#include 
#define    TEMPOLED    250
#define    LED         RC0
#define    CICALINO    RA0
#define _XTAL_FREQ 8000000 // Used from delay macro
unsigned char TimerLed=0;
__CONFIG(INTIO &amp;       // Use internal clock
         WDTDIS &amp;      // Disable watchdog
         PWRTEN &amp;      // Delay after power on enabled
         MCLRDIS &amp;     // Internal External Switch Over Mode Disable
         UNPROTECT &amp;   // Disable memory protection
         BORDIS &amp;      // Disable reset on low volage
         IESODIS &amp;     // Internal External Switch Over Mode Disable
         FCMDIS);      // Disable Fail clock monitoring

 
 
void main(void)
{ 
   //Char è un tipo di dato a 8 bit, quindi può arrivare a contenere valori fino a 255, a noi serve massimo 250, quindi va bene
  
 OSCCON=0x70;         // x111 0000 - 8 Mhz internal clock 

 



 // Tutte le porte come output
 TRISA=0xfe;
 TRISB=0;
 TRISC=0xfe;
// TRISD=0;
 //TRISE=0;
 
 // Impostazione del registro OPTION (pag.55 del datasheet)
 OPTION=0b11000100;
 // bit 0 -&gt; Prescaler Rate Select bit 0
 // bit 1 -&gt; Prescaler Rate Select bit 0
 // bit 2 -&gt; Prescaler Rate Select bit 0 (1:32)
 // bit 3 -&gt; Prescaler assegnato al Timer0
 // bit 4 -&gt; Non importa
 // bit 5 -&gt; Clock per Timer0 derivato da ciclo di clock interno
 // bit 6 -&gt; Non importa
 // bit 7 -&gt; Resistenze di pull-up su porta B disattivate
 
 // Impostazione Interrupt
 INTCON=0b10100000;
 // bit 0 -&gt; RBIF - Flag interrupt su porte B
 // bit 1 -&gt; INTF - Flag interrupt su RB0/INT
 // bit 2 -&gt; T0IF - Flag interrupt su Timer0
 // bit 3 -&gt; RBIE, Interrupt su porte B disattivato
 // bit 4 -&gt; INTE, Interrupt su porta RB0/INT disattivato
 // bit 5 -&gt; TMR0IE, Interrupt su Timer0 attivato
 // bit 6 -&gt; PEIE, Interrupt di periferica disattivato
 // bit 7 -&gt; GIE, Gestione Interrupt attiva
 
 TMR0=240; // Imposto Timer0 a 240

  while(1) // eseguo un ciclo finito
    {
       /*
       L&#039;unica cosa che eseguo durante questo ciclo infinito, è l&#039;inversione
       dello stato del cicalino ogni 200microsecondi, in maniera tale da generare
       un&#039;onda quadra di 2,5KHz che, applicata al cicalino, appunto,
       mi permette di farlo suonare facendogli emettere una nota a tale frequenza
       */
         __delay_ms(1000);
           CICALINO=0;
		 __delay_ms(1000);
		  CICALINO=1;
        
      
    }// Fine ciclo continuo
 
 } // Fine main
 
/*
Questa routine, avendo l&#039;attributo &quot;interrupt&quot; prima del nome della routine stessa, viene chiamata in automatico
ogni qualvolta si verifica un interrupt. Essendo le sorgenti di interrupt di vari tipi, in questa routine dobbiamo
capire quale elemento ha generato l&#039;interrupt. Con le impostazioni utilizzate, Timer0 genererà un interrupt ogni
millisecondo.
*/
void interrupt ISR (void)
 {
    if (T0IF) // L&#039;interrupt è stato causato da un overflow del timer0 ?
       {
       TMR0 = 240; // Reimposto Timer0
       TimerLed++; // Incremento il Timer per il lampeggio del led
       if (TimerLed &gt;= TEMPOLED) // Se il tempo è passato
          {
			LED=LED^1;
           // Inverto lo stato del led per farlo lampeggiare
          TimerLed=0; // Ricarico il timer del led per ricominciare daccapo
          }
       T0IF=0; // Resetto il flag interrupt su timer 0,
       } // fine che interrupt verificatosi su timer0
 } // fine interrupt service ro</description>
		<content:encoded><![CDATA[<p>Salve, ho uno starterkit2 con relativa scheda demoboard con sopra montato un PIC16F690. Ho modificato il codice della lezione, per adattarlo al pic e alla scheda.<br />
Come si vede dal codice lavoro con la frequenza interna del PIC, a 8 MHz. Facendo i conti per avere un interrupt ogni 1ms del timer0, ho utilizzato il prescaler a (1:32). Icicalino funziona come voluto, ne ho usato uno che emette un suono ogni volta che ha tensione. Il problema è sul led che rimanesempre acceso, non riasco a capire il perchè. Mi potete aiutare. Riporto il codice:<br />
#define _LEGACY_HEADERS<br />
#include<br />
#define    TEMPOLED    250<br />
#define    LED         RC0<br />
#define    CICALINO    RA0<br />
#define _XTAL_FREQ 8000000 // Used from delay macro<br />
unsigned char TimerLed=0;<br />
__CONFIG(INTIO &amp;       // Use internal clock<br />
         WDTDIS &amp;      // Disable watchdog<br />
         PWRTEN &amp;      // Delay after power on enabled<br />
         MCLRDIS &amp;     // Internal External Switch Over Mode Disable<br />
         UNPROTECT &amp;   // Disable memory protection<br />
         BORDIS &amp;      // Disable reset on low volage<br />
         IESODIS &amp;     // Internal External Switch Over Mode Disable<br />
         FCMDIS);      // Disable Fail clock monitoring</p>
<p>void main(void)<br />
{<br />
   //Char è un tipo di dato a 8 bit, quindi può arrivare a contenere valori fino a 255, a noi serve massimo 250, quindi va bene</p>
<p> OSCCON=0&#215;70;         // x111 0000 &#8211; 8 Mhz internal clock </p>
<p> // Tutte le porte come output<br />
 TRISA=0xfe;<br />
 TRISB=0;<br />
 TRISC=0xfe;<br />
// TRISD=0;<br />
 //TRISE=0;</p>
<p> // Impostazione del registro OPTION (pag.55 del datasheet)<br />
 OPTION=0b11000100;<br />
 // bit 0 -&gt; Prescaler Rate Select bit 0<br />
 // bit 1 -&gt; Prescaler Rate Select bit 0<br />
 // bit 2 -&gt; Prescaler Rate Select bit 0 (1:32)<br />
 // bit 3 -&gt; Prescaler assegnato al Timer0<br />
 // bit 4 -&gt; Non importa<br />
 // bit 5 -&gt; Clock per Timer0 derivato da ciclo di clock interno<br />
 // bit 6 -&gt; Non importa<br />
 // bit 7 -&gt; Resistenze di pull-up su porta B disattivate</p>
<p> // Impostazione Interrupt<br />
 INTCON=0b10100000;<br />
 // bit 0 -&gt; RBIF &#8211; Flag interrupt su porte B<br />
 // bit 1 -&gt; INTF &#8211; Flag interrupt su RB0/INT<br />
 // bit 2 -&gt; T0IF &#8211; Flag interrupt su Timer0<br />
 // bit 3 -&gt; RBIE, Interrupt su porte B disattivato<br />
 // bit 4 -&gt; INTE, Interrupt su porta RB0/INT disattivato<br />
 // bit 5 -&gt; TMR0IE, Interrupt su Timer0 attivato<br />
 // bit 6 -&gt; PEIE, Interrupt di periferica disattivato<br />
 // bit 7 -&gt; GIE, Gestione Interrupt attiva</p>
<p> TMR0=240; // Imposto Timer0 a 240</p>
<p>  while(1) // eseguo un ciclo finito<br />
    {<br />
       /*<br />
       L&#8217;unica cosa che eseguo durante questo ciclo infinito, è l&#8217;inversione<br />
       dello stato del cicalino ogni 200microsecondi, in maniera tale da generare<br />
       un&#8217;onda quadra di 2,5KHz che, applicata al cicalino, appunto,<br />
       mi permette di farlo suonare facendogli emettere una nota a tale frequenza<br />
       */<br />
         __delay_ms(1000);<br />
           CICALINO=0;<br />
		 __delay_ms(1000);<br />
		  CICALINO=1;</p>
<p>    }// Fine ciclo continuo</p>
<p> } // Fine main</p>
<p>/*<br />
Questa routine, avendo l&#8217;attributo &#8220;interrupt&#8221; prima del nome della routine stessa, viene chiamata in automatico<br />
ogni qualvolta si verifica un interrupt. Essendo le sorgenti di interrupt di vari tipi, in questa routine dobbiamo<br />
capire quale elemento ha generato l&#8217;interrupt. Con le impostazioni utilizzate, Timer0 genererà un interrupt ogni<br />
millisecondo.<br />
*/<br />
void interrupt ISR (void)<br />
 {<br />
    if (T0IF) // L&#8217;interrupt è stato causato da un overflow del timer0 ?<br />
       {<br />
       TMR0 = 240; // Reimposto Timer0<br />
       TimerLed++; // Incremento il Timer per il lampeggio del led<br />
       if (TimerLed &gt;= TEMPOLED) // Se il tempo è passato<br />
          {<br />
			LED=LED^1;<br />
           // Inverto lo stato del led per farlo lampeggiare<br />
          TimerLed=0; // Ricarico il timer del led per ricominciare daccapo<br />
          }<br />
       T0IF=0; // Resetto il flag interrupt su timer 0,<br />
       } // fine che interrupt verificatosi su timer0<br />
 } // fine interrupt service ro</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-11754</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 10 Jun 2011 21:36:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-11754</guid>
		<description>Quando sento dire certe cose rimango di stucco. 

Primo: la versione free dell&#039;Hitec-C manca di alcune ottimizzazioni ma di certo non fa durare un ritardo piu del tempo dovuto, può avere qualche problema di certo, ma se il problema sta sulla versione free, sta anche su quella a pagamento, come si è dimostrato di recente con la versione 9.81.

Secondo: Dai a me l&#039;ICD3 e io ti do il pickit. Non capisco cosa puo voler dire &quot;inviare schifezze&quot;. Mettiamo che l&#039;ICD3, un prodotto molto costoso e professionale, invii delle schifezze (che ora qui posso intendere come bit non desiderati). Allora la verifica del programma deve fallire per forza perchè compara l&#039;hex sul pc con quello appena caricato/letto dal picmicro. La verifica ti fallisce? Non credo proprio.

La microchip dovrebbe chiudere i battenti in entrambi i casi: uno perchè avrebbe fatto un programmatore inutile, che costa una cifra, due perchè ha acquistato l&#039;hitech che farebbe un compilatore idiota. 

Quei delay come hai già letto sono sballati, ho fatto delle verifiche a suo tempo con l&#039;oscilloscopio ma non ho avuto tutta questa discrepanza: nel peggiore dei casi il ritardo introdotto era del doppio, ma ho provato fino ad 8MHz, posso immaginare che salendo di frequenza l&#039;errore aumenti sempre più. Quella routine difatti è molto vecchia ed oltre al fatto di non essere ottimizzata, era creata per girare a 2MHz come disse l&#039;autore. Ma comunque pure a 2MHz sballa.

Le soluzioni alternative sono varie: usa gli interrupt sui timer. Se ti servono semplici ritardi fissi, non variabili, puoi usare le routine di delay già presenti nell&#039;hitech-C __delay_ms(costante) e __delay_us(costante) però devi definire la macro _XTAL_FREQ. Fai attenzione agli underscore. Ripeto: queste funzioni le puoi usare solo con una costante nell&#039;argomento, non puoi usare una variabile. Altrimenti usi le routine enhanced precision che ho messo tra le librerie.</description>
		<content:encoded><![CDATA[<p>Quando sento dire certe cose rimango di stucco. </p>
<p>Primo: la versione free dell&#8217;Hitec-C manca di alcune ottimizzazioni ma di certo non fa durare un ritardo piu del tempo dovuto, può avere qualche problema di certo, ma se il problema sta sulla versione free, sta anche su quella a pagamento, come si è dimostrato di recente con la versione 9.81.</p>
<p>Secondo: Dai a me l&#8217;ICD3 e io ti do il pickit. Non capisco cosa puo voler dire &#8220;inviare schifezze&#8221;. Mettiamo che l&#8217;ICD3, un prodotto molto costoso e professionale, invii delle schifezze (che ora qui posso intendere come bit non desiderati). Allora la verifica del programma deve fallire per forza perchè compara l&#8217;hex sul pc con quello appena caricato/letto dal picmicro. La verifica ti fallisce? Non credo proprio.</p>
<p>La microchip dovrebbe chiudere i battenti in entrambi i casi: uno perchè avrebbe fatto un programmatore inutile, che costa una cifra, due perchè ha acquistato l&#8217;hitech che farebbe un compilatore idiota. </p>
<p>Quei delay come hai già letto sono sballati, ho fatto delle verifiche a suo tempo con l&#8217;oscilloscopio ma non ho avuto tutta questa discrepanza: nel peggiore dei casi il ritardo introdotto era del doppio, ma ho provato fino ad 8MHz, posso immaginare che salendo di frequenza l&#8217;errore aumenti sempre più. Quella routine difatti è molto vecchia ed oltre al fatto di non essere ottimizzata, era creata per girare a 2MHz come disse l&#8217;autore. Ma comunque pure a 2MHz sballa.</p>
<p>Le soluzioni alternative sono varie: usa gli interrupt sui timer. Se ti servono semplici ritardi fissi, non variabili, puoi usare le routine di delay già presenti nell&#8217;hitech-C __delay_ms(costante) e __delay_us(costante) però devi definire la macro _XTAL_FREQ. Fai attenzione agli underscore. Ripeto: queste funzioni le puoi usare solo con una costante nell&#8217;argomento, non puoi usare una variabile. Altrimenti usi le routine enhanced precision che ho messo tra le librerie.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Faustino</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-11750</link>
		<dc:creator>Faustino</dc:creator>
		<pubDate>Fri, 10 Jun 2011 13:46:02 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-11750</guid>
		<description>Ciao Giovanni, complimenti come sempre. 
noto che come hai già spiegato, e viene ripetuto varie volte, che anche se metto DelayMs(100) non sara&#039; 100 ms spaccato ma c&#039;è un errore. nel mio caso faccio lampeggiare a 200 ms un led ma alla faccia dell&#039;errore sarà almeno 700 ms, insomma un errore assurdo, cosi&#039; quando faccio lampeggiare gli altri e il cicalino mi fa&#039; un suono debole, insomma tutto porporzionato. 
Parlando con un mio collega che mi ha visto &quot;giocare&quot; mi ha detto che è tutta colpa del ICD3 che oltre il codice macchina invia anche molta schifezza, e anche della versione free-light dell&#039;h-tech fa&#039; la sua parte non essendo una versione ad alto livello essendo free.

Vorrei sapere cosa ne pensi 
Grazie di TUTTO (che è veramente tanto)
Fausto</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni, complimenti come sempre.<br />
noto che come hai già spiegato, e viene ripetuto varie volte, che anche se metto DelayMs(100) non sara&#8217; 100 ms spaccato ma c&#8217;è un errore. nel mio caso faccio lampeggiare a 200 ms un led ma alla faccia dell&#8217;errore sarà almeno 700 ms, insomma un errore assurdo, cosi&#8217; quando faccio lampeggiare gli altri e il cicalino mi fa&#8217; un suono debole, insomma tutto porporzionato.<br />
Parlando con un mio collega che mi ha visto &#8220;giocare&#8221; mi ha detto che è tutta colpa del ICD3 che oltre il codice macchina invia anche molta schifezza, e anche della versione free-light dell&#8217;h-tech fa&#8217; la sua parte non essendo una versione ad alto livello essendo free.</p>
<p>Vorrei sapere cosa ne pensi<br />
Grazie di TUTTO (che è veramente tanto)<br />
Fausto</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Interrupt e delay &#171; ShinigamiRobots</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-11510</link>
		<dc:creator>Interrupt e delay &#171; ShinigamiRobots</dc:creator>
		<pubDate>Mon, 16 May 2011 20:34:58 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-11510</guid>
		<description>[...] SettoreZero PicExperience [...]</description>
		<content:encoded><![CDATA[<p>[...] SettoreZero PicExperience [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-11058</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 30 Mar 2011 03:04:06 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-11058</guid>
		<description>Quelle routine si includono qualora hai bisogno di generare ritardi nel programma che andrai a scrivere. Se non hai bisogno di ritardi non le includi. Essendo poi scritte per funzionare con l&#039;hitech-c, le puoi usare solo con programmi scritti in hitech-C. Ovvio che sul tricky-c, ne su alcun manuale del c al mondo, potrai trovare scritto che devi includere le routine di delay... non ha senso... alcune routine si usa raggrupparle in files a parte in maniera da essere riutilizzabili anche su altri programmi.</description>
		<content:encoded><![CDATA[<p>Quelle routine si includono qualora hai bisogno di generare ritardi nel programma che andrai a scrivere. Se non hai bisogno di ritardi non le includi. Essendo poi scritte per funzionare con l&#8217;hitech-c, le puoi usare solo con programmi scritti in hitech-C. Ovvio che sul tricky-c, ne su alcun manuale del c al mondo, potrai trovare scritto che devi includere le routine di delay&#8230; non ha senso&#8230; alcune routine si usa raggrupparle in files a parte in maniera da essere riutilizzabili anche su altri programmi.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: slavin89</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-11051</link>
		<dc:creator>slavin89</dc:creator>
		<pubDate>Tue, 29 Mar 2011 21:17:20 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-11051</guid>
		<description>quelle che includo con i file delay.c
magari è errato il termine routine scusa</description>
		<content:encoded><![CDATA[<p>quelle che includo con i file delay.c<br />
magari è errato il termine routine scusa</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-11048</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 29 Mar 2011 20:57:40 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-11048</guid>
		<description>le routine... quali routine?</description>
		<content:encoded><![CDATA[<p>le routine&#8230; quali routine?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: slavin89</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-11046</link>
		<dc:creator>slavin89</dc:creator>
		<pubDate>Tue, 29 Mar 2011 20:52:51 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-11046</guid>
		<description>rieccomi qua..ciao a tutti;
sono finalment eriuscito a creare da solo i primi due programmini descrittti fin qui però ancora una cosa non mi è chiara..le routine..in particolare non riesco a capire bene se quelle scaricabili qui dal sito sono delle routine create per questi programmi che descrivete nella guida oppure sono dei file che vanno bene inseriti in qualsiasi altro programma necessiti di routine.
ho pro vato a vedere se ci capivo nel file di tricky ma la cosa purtroppo non mi è ancora chiara spero possiate aiutarmi

saluti a tutti</description>
		<content:encoded><![CDATA[<p>rieccomi qua..ciao a tutti;<br />
sono finalment eriuscito a creare da solo i primi due programmini descrittti fin qui però ancora una cosa non mi è chiara..le routine..in particolare non riesco a capire bene se quelle scaricabili qui dal sito sono delle routine create per questi programmi che descrivete nella guida oppure sono dei file che vanno bene inseriti in qualsiasi altro programma necessiti di routine.<br />
ho pro vato a vedere se ci capivo nel file di tricky ma la cosa purtroppo non mi è ancora chiara spero possiate aiutarmi</p>
<p>saluti a tutti</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10823</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 16 Mar 2011 05:42:47 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10823</guid>
		<description>La riga 5 di settings.h è un commento, la prossima volta cerca di essere preciso. Intendi la riga 17 dove c&#039;è scritto:

unsigned char TimerLed=0;

? Sto dichiarando una variabile di tipo unsigned char (valori da 0 a 255) che ho chiamato TimerLed e l&#039;ho inizializzata con 0 come valore. Cos&#039;è una variabile? Una porzione di memoria ram che uso per fare dei calcoli o per ricordami dei numeri. A cosa serve in questo programma? A mantenere il conteggio per far lampeggiare il led.
All&#039;inizio del corso io però l&#039;ho detto di andarsi a leggere il Tricky C.</description>
		<content:encoded><![CDATA[<p>La riga 5 di settings.h è un commento, la prossima volta cerca di essere preciso. Intendi la riga 17 dove c&#8217;è scritto:</p>
<p>unsigned char TimerLed=0;</p>
<p>? Sto dichiarando una variabile di tipo unsigned char (valori da 0 a 255) che ho chiamato TimerLed e l&#8217;ho inizializzata con 0 come valore. Cos&#8217;è una variabile? Una porzione di memoria ram che uso per fare dei calcoli o per ricordami dei numeri. A cosa serve in questo programma? A mantenere il conteggio per far lampeggiare il led.<br />
All&#8217;inizio del corso io però l&#8217;ho detto di andarsi a leggere il Tricky C.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: slavin89</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10821</link>
		<dc:creator>slavin89</dc:creator>
		<pubDate>Tue, 15 Mar 2011 21:40:20 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10821</guid>
		<description>buonasera a tutti..continuando nella titanica impresa di capirci qualcosa mi sono imbattuto in un nuovo ostacolo in questa lezione..e cioè la riga 5 del setting..ovvero ho capito cosa significa quella riga ma non ne capisco il motivo all&#039;interno del programma; cioè da quello che ho capito e un valore che assegno al timer  per l&#039;accensione del led che poi andrò ad incrementare tramite la funzione timerled ++ ma non mi è chiaro perchè necessito di questi due passaggi.
prego nella vostra bontà d&#039;animo per spiegarmi e aiutarmi.

complimenti di nuovo per questo capolavoro</description>
		<content:encoded><![CDATA[<p>buonasera a tutti..continuando nella titanica impresa di capirci qualcosa mi sono imbattuto in un nuovo ostacolo in questa lezione..e cioè la riga 5 del setting..ovvero ho capito cosa significa quella riga ma non ne capisco il motivo all&#8217;interno del programma; cioè da quello che ho capito e un valore che assegno al timer  per l&#8217;accensione del led che poi andrò ad incrementare tramite la funzione timerled ++ ma non mi è chiaro perchè necessito di questi due passaggi.<br />
prego nella vostra bontà d&#8217;animo per spiegarmi e aiutarmi.</p>
<p>complimenti di nuovo per questo capolavoro</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10342</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 21 Feb 2011 08:56:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10342</guid>
		<description>Si... Ammesso che hai capito come si genera un&#039;onda quadra, cos&#039;è la frequenza, e quali sono le frequenze udibili dall&#039;orecchio umano. Poi dato che gli altoparlanti hanno un&#039;impedenza molto bassa, non puoi mettere l&#039;uscita del pic direttamente sull&#039;altoparlante.</description>
		<content:encoded><![CDATA[<p>Si&#8230; Ammesso che hai capito come si genera un&#8217;onda quadra, cos&#8217;è la frequenza, e quali sono le frequenze udibili dall&#8217;orecchio umano. Poi dato che gli altoparlanti hanno un&#8217;impedenza molto bassa, non puoi mettere l&#8217;uscita del pic direttamente sull&#8217;altoparlante.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Guido</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10286</link>
		<dc:creator>Guido</dc:creator>
		<pubDate>Sat, 19 Feb 2011 20:17:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10286</guid>
		<description>Scusami, un informazzione, solo impostando Delay si può impostare una frequenza, quindi collegando al Pic un altoparlante farlo suonare (sentire quella freq.)?
Grazie</description>
		<content:encoded><![CDATA[<p>Scusami, un informazzione, solo impostando Delay si può impostare una frequenza, quindi collegando al Pic un altoparlante farlo suonare (sentire quella freq.)?<br />
Grazie</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10214</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Thu, 17 Feb 2011 13:49:49 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10214</guid>
		<description>è tanto difficile fare UNO DIVISO FREQUENZA ? Hai 500Hz ? Il periodo è 1/500 = 0,002 secondi. Ho linkato la pagina di wikipedia dove c&#039;è scritto chiaramente.</description>
		<content:encoded><![CDATA[<p>è tanto difficile fare UNO DIVISO FREQUENZA ? Hai 500Hz ? Il periodo è 1/500 = 0,002 secondi. Ho linkato la pagina di wikipedia dove c&#8217;è scritto chiaramente.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Guido</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10195</link>
		<dc:creator>Guido</dc:creator>
		<pubDate>Wed, 16 Feb 2011 21:36:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10195</guid>
		<description>Per cortesia portami un esempio di come si calcola il periodo.
Grazie</description>
		<content:encoded><![CDATA[<p>Per cortesia portami un esempio di come si calcola il periodo.<br />
Grazie</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10173</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 16 Feb 2011 05:40:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10173</guid>
		<description>Ti calcoli 523Hz a che periodo corrispondono, dividi il periodo per due e cosi sai quanto deve durare il fronte alto e quanto quello basso. Per generare un&#039;onda quadra si manda un piedino a livello alto, ritardo, livello basso, ritardo e così via.</description>
		<content:encoded><![CDATA[<p>Ti calcoli 523Hz a che periodo corrispondono, dividi il periodo per due e cosi sai quanto deve durare il fronte alto e quanto quello basso. Per generare un&#8217;onda quadra si manda un piedino a livello alto, ritardo, livello basso, ritardo e così via.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Guido</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10159</link>
		<dc:creator>Guido</dc:creator>
		<pubDate>Tue, 15 Feb 2011 21:39:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10159</guid>
		<description>Grazie per avermi risposto. Come faccio a far uscire dal pic queste frequenze: 523Hz, 1397Hz, 2093Hz, ecc. ? Voglio dire come imposto il TIMER0 e tutto il resto?
Premetto sono super ignnorante in materia.
Grazie</description>
		<content:encoded><![CDATA[<p>Grazie per avermi risposto. Come faccio a far uscire dal pic queste frequenze: 523Hz, 1397Hz, 2093Hz, ecc. ? Voglio dire come imposto il TIMER0 e tutto il resto?<br />
Premetto sono super ignnorante in materia.<br />
Grazie</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10136</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 15 Feb 2011 04:02:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10136</guid>
		<description>...cominciamo proprio male...
http://it.wikipedia.org/wiki/Frequenza</description>
		<content:encoded><![CDATA[<p>&#8230;cominciamo proprio male&#8230;<br />
<a href="http://it.wikipedia.org/wiki/Frequenza" rel="nofollow">http://it.wikipedia.org/wiki/Frequenza</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Guido</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-10133</link>
		<dc:creator>Guido</dc:creator>
		<pubDate>Mon, 14 Feb 2011 22:57:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-10133</guid>
		<description>Salve, come faccio a convertire (formula) la frequenza tipo: 523Hz, 1397Hz, 2093Hz, ecc. nel tempo? Trovato il tempo lo imposto nel PIC TIMER e inbase al quarzo che scielgo faccio i settaggi.
Grazie .</description>
		<content:encoded><![CDATA[<p>Salve, come faccio a convertire (formula) la frequenza tipo: 523Hz, 1397Hz, 2093Hz, ecc. nel tempo? Trovato il tempo lo imposto nel PIC TIMER e inbase al quarzo che scielgo faccio i settaggi.<br />
Grazie .</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Davide</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-8803</link>
		<dc:creator>Davide</dc:creator>
		<pubDate>Mon, 27 Dec 2010 12:33:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-8803</guid>
		<description>OTTIMO ALLORA! Gentilissimo, grazie del chiarimento! Perchè ho scritto un programmino per controllare un servocomando da un potenziometro ricavato da una radio per aereomodelli, e ho avuto diversi problemi di controllo fino a quando non ho tirato fuori una parte di codice dal ISR inserendolo nel main. Ti posto qualcosina almeno vedi.. 

PIC 16F876A - 20000000 Hz Clock- Prescaler su 1. 0.2 uS ad incremento, ogni 50 Us ho un Overflow su TIMER0 facendo partire il TIMER0 da 8.
Ogni 400 Overflow ho un tempo esatto di 20 mS. Tra 1 e 31 Nover (numero di overflow) attivo la semionda positiva. 1500 uS, 1,5 Ms

void interrupt ISR (void)
 {
    if (T0IF) //             L&#039;interrupt è stato causato da un overflow del timer0 ?
       {
	   Nover++;           //incremento di uno il contatore del Numero degli Overflow
	   if(Nover==1)     //Inizio dell&#039;onda positiva
             RB4=1;    
	  if(Nover==Dir)    //Dir determina quando deve terminare l&#039;onda positiva. E&#039; una variabile che modifico per controllare il movimento 
	         {
			 RB4=0;   
             }			 
	  if(Nover==399)
	  {
	     RB4=0; 
		 Nover=0; }
       TMR0=8; // RICARICO Timer0
       T0IF=0;	   // FLAG INTERRUPT SU 0, che si setta automaticamente su 1 ad ogni overflow
	   }   // fine che interrupt verificatosi su timer0
	
           
 } // fine interrupt


QUESTA VERSIONE DEL CODICE MI FUNZIONAVA MALE:...
Però portando questa porzione di codice al main.
   
if(Nover==1)    
             RB4=1;    
	  if(Nover==Dir)    
	         {
			 RB4=0;   
             }			 
	  if(Nover==399)
	  {
	     RB4=0; 
		 Nover=0; }

FUNZIONAVA COME UN OROLOGIO SVIZZERO, SE VUOI MANDO PER MAIL TUTTO IL CODICE, NEL CASO VOLESSI METTERLO A DISPOSIZIONE SUL SITO.
Saluti. Davide.</description>
		<content:encoded><![CDATA[<p>OTTIMO ALLORA! Gentilissimo, grazie del chiarimento! Perchè ho scritto un programmino per controllare un servocomando da un potenziometro ricavato da una radio per aereomodelli, e ho avuto diversi problemi di controllo fino a quando non ho tirato fuori una parte di codice dal ISR inserendolo nel main. Ti posto qualcosina almeno vedi.. </p>
<p>PIC 16F876A &#8211; 20000000 Hz Clock- Prescaler su 1. 0.2 uS ad incremento, ogni 50 Us ho un Overflow su TIMER0 facendo partire il TIMER0 da 8.<br />
Ogni 400 Overflow ho un tempo esatto di 20 mS. Tra 1 e 31 Nover (numero di overflow) attivo la semionda positiva. 1500 uS, 1,5 Ms</p>
<p>void interrupt ISR (void)<br />
 {<br />
    if (T0IF) //             L&#8217;interrupt è stato causato da un overflow del timer0 ?<br />
       {<br />
	   Nover++;           //incremento di uno il contatore del Numero degli Overflow<br />
	   if(Nover==1)     //Inizio dell&#8217;onda positiva<br />
             RB4=1;<br />
	  if(Nover==Dir)    //Dir determina quando deve terminare l&#8217;onda positiva. E&#8217; una variabile che modifico per controllare il movimento<br />
	         {<br />
			 RB4=0;<br />
             }<br />
	  if(Nover==399)<br />
	  {<br />
	     RB4=0;<br />
		 Nover=0; }<br />
       TMR0=8; // RICARICO Timer0<br />
       T0IF=0;	   // FLAG INTERRUPT SU 0, che si setta automaticamente su 1 ad ogni overflow<br />
	   }   // fine che interrupt verificatosi su timer0</p>
<p> } // fine interrupt</p>
<p>QUESTA VERSIONE DEL CODICE MI FUNZIONAVA MALE:&#8230;<br />
Però portando questa porzione di codice al main.</p>
<p>if(Nover==1)<br />
             RB4=1;<br />
	  if(Nover==Dir)<br />
	         {<br />
			 RB4=0;<br />
             }<br />
	  if(Nover==399)<br />
	  {<br />
	     RB4=0;<br />
		 Nover=0; }</p>
<p>FUNZIONAVA COME UN OROLOGIO SVIZZERO, SE VUOI MANDO PER MAIL TUTTO IL CODICE, NEL CASO VOLESSI METTERLO A DISPOSIZIONE SUL SITO.<br />
Saluti. Davide.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-8800</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 27 Dec 2010 12:14:25 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-8800</guid>
		<description>Si può fare pure nel main ma se ti fai le prove o lo metti nell&#039;ISR o nel main non ti cambia niente: sono solo un paio di istruzioni e col quarzo da 20MHz tra un ms e l&#039;altro puoi fare tanta roba. Se l&#039;effetto lo vuoi ottenere all&#039;istante, metti le istruzioni nell&#039;ISR per avere la minore latenza possibile tra l&#039;evento di interrupt e le operazioni da eseguire, mettendo nel main passerà piu tempo prima che le funzioni da eseguire sull&#039;interrupt vengano eseguite. Trattandosi di un led da far lampeggiare ovviamente non andiamo di fretta e le istruzioni le ho messe li giusto per far capire... e poi sono solo una manciata di istruzioni e non ti cambia assolutamente niente. Tieni conto che questi sono esempi per far capire come/cosa fare. Io (ma non solo io, ma tutti i programmatori seri) insisto sul tenere l&#039;ISR piu corta possibile perchè ci sono persone che ancora non hanno capito che cos&#039;è un &#039;ISR e addirittura ci mettono dentro i delay... roba da essere banditi dal mondo dell&#039;elettronica digitale. Per non parlare di quelli che &quot;è meglio il polling dell&#039;interrupt&quot; solo perchè gli interrupt non li sanno usare.</description>
		<content:encoded><![CDATA[<p>Si può fare pure nel main ma se ti fai le prove o lo metti nell&#8217;ISR o nel main non ti cambia niente: sono solo un paio di istruzioni e col quarzo da 20MHz tra un ms e l&#8217;altro puoi fare tanta roba. Se l&#8217;effetto lo vuoi ottenere all&#8217;istante, metti le istruzioni nell&#8217;ISR per avere la minore latenza possibile tra l&#8217;evento di interrupt e le operazioni da eseguire, mettendo nel main passerà piu tempo prima che le funzioni da eseguire sull&#8217;interrupt vengano eseguite. Trattandosi di un led da far lampeggiare ovviamente non andiamo di fretta e le istruzioni le ho messe li giusto per far capire&#8230; e poi sono solo una manciata di istruzioni e non ti cambia assolutamente niente. Tieni conto che questi sono esempi per far capire come/cosa fare. Io (ma non solo io, ma tutti i programmatori seri) insisto sul tenere l&#8217;ISR piu corta possibile perchè ci sono persone che ancora non hanno capito che cos&#8217;è un &#8216;ISR e addirittura ci mettono dentro i delay&#8230; roba da essere banditi dal mondo dell&#8217;elettronica digitale. Per non parlare di quelli che &#8220;è meglio il polling dell&#8217;interrupt&#8221; solo perchè gli interrupt non li sanno usare.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Davide</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-8796</link>
		<dc:creator>Davide</dc:creator>
		<pubDate>Mon, 27 Dec 2010 10:38:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-8796</guid>
		<description>void interrupt ISR (void)
 {
    if (T0IF) // L&#039;interrupt è stato causato da un overflow del timer0 ?
       {
       TMR0 = 100; // Reimposto Timer0
       TimerLed++; // Incremento il Timer per il lampeggio del led
       if (TimerLed &gt;= TEMPOLED) // Se il tempo è passato
          {
          LED=LED^1; // Inverto lo stato del led per farlo lampeggiare
          TimerLed=0; // Ricarico il timer del led per ricominciare daccapo
          }
       T0IF=0; // Resetto il flag interrupt su timer 0,
       } // fine che interrupt verificatosi su timer0
 } // fine interrupt service routine

Volevo chiedere una precisazione, dato che l&#039;ISR deve essere più corta possibile, non potresti eseguire una buona parte di questa funzione nel main?? 
Io l&#039;ISR lo utilizzo solo per far aumentare i contatori, che poi nel main vengono &quot;analizzati in base al loro valore&quot; Ad Es.[ if (contavalori==350) RB1=1; ] e così via... per poi azzerarli quando arrivano al valore limite che ho impostato.. Però sono tutte cose che faccio fare nel main.. non nell&#039;ISR. Sbaglio a fare così?

Non ne trarrebbe giovamento il programma se questa parte di codice venisse portata nel main??

if (TimerLed &gt;= TEMPOLED) // Se il tempo è passato
          {
          LED=LED^1; // Inverto lo stato del led per farlo lampeggiare
          TimerLed=0; // Ricarico il timer del led per ricominciare daccapo</description>
		<content:encoded><![CDATA[<p>void interrupt ISR (void)<br />
 {<br />
    if (T0IF) // L&#8217;interrupt è stato causato da un overflow del timer0 ?<br />
       {<br />
       TMR0 = 100; // Reimposto Timer0<br />
       TimerLed++; // Incremento il Timer per il lampeggio del led<br />
       if (TimerLed &gt;= TEMPOLED) // Se il tempo è passato<br />
          {<br />
          LED=LED^1; // Inverto lo stato del led per farlo lampeggiare<br />
          TimerLed=0; // Ricarico il timer del led per ricominciare daccapo<br />
          }<br />
       T0IF=0; // Resetto il flag interrupt su timer 0,<br />
       } // fine che interrupt verificatosi su timer0<br />
 } // fine interrupt service routine</p>
<p>Volevo chiedere una precisazione, dato che l&#8217;ISR deve essere più corta possibile, non potresti eseguire una buona parte di questa funzione nel main??<br />
Io l&#8217;ISR lo utilizzo solo per far aumentare i contatori, che poi nel main vengono &#8220;analizzati in base al loro valore&#8221; Ad Es.[ if (contavalori==350) RB1=1; ] e così via&#8230; per poi azzerarli quando arrivano al valore limite che ho impostato.. Però sono tutte cose che faccio fare nel main.. non nell&#8217;ISR. Sbaglio a fare così?</p>
<p>Non ne trarrebbe giovamento il programma se questa parte di codice venisse portata nel main??</p>
<p>if (TimerLed &gt;= TEMPOLED) // Se il tempo è passato<br />
          {<br />
          LED=LED^1; // Inverto lo stato del led per farlo lampeggiare<br />
          TimerLed=0; // Ricarico il timer del led per ricominciare daccapo</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7278</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 29 Sep 2010 14:20:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7278</guid>
		<description>Devi pure impostare la compilazione per la modalità debug</description>
		<content:encoded><![CDATA[<p>Devi pure impostare la compilazione per la modalità debug</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Babbo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7277</link>
		<dc:creator>Babbo</dc:creator>
		<pubDate>Wed, 29 Sep 2010 13:37:01 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7277</guid>
		<description>Ciao Giovanni, comunque non sono ancora riuscito ad effettuare il debug con l&#039;interrupt e il pickit3. Ho provato ad usare l&#039;mplasim e il tutto funziona, anche programmando il pic funziona, quindi deduco che o dipende dal pickit o da quanche impostazione che manca? Sai dirmi qualcosa? grazie ciao</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni, comunque non sono ancora riuscito ad effettuare il debug con l&#8217;interrupt e il pickit3. Ho provato ad usare l&#8217;mplasim e il tutto funziona, anche programmando il pic funziona, quindi deduco che o dipende dal pickit o da quanche impostazione che manca? Sai dirmi qualcosa? grazie ciao</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Babbo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7194</link>
		<dc:creator>Babbo</dc:creator>
		<pubDate>Wed, 22 Sep 2010 08:37:37 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7194</guid>
		<description>Giovanni, ho provato a simulare il circuito con mplasim e tutto funziona, riesco ad entrare nella routine isr, mentre con il pickit3 no! Secondo te puo dipendere da qualche errore del circuito o prorpio dal pickit3?
Grazie ciao</description>
		<content:encoded><![CDATA[<p>Giovanni, ho provato a simulare il circuito con mplasim e tutto funziona, riesco ad entrare nella routine isr, mentre con il pickit3 no! Secondo te puo dipendere da qualche errore del circuito o prorpio dal pickit3?<br />
Grazie ciao</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Babbo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7184</link>
		<dc:creator>Babbo</dc:creator>
		<pubDate>Tue, 21 Sep 2010 12:10:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7184</guid>
		<description>Certo...il mio valore iniziale è TMR0 = 0</description>
		<content:encoded><![CDATA[<p>Certo&#8230;il mio valore iniziale è TMR0 = 0</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7178</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 20 Sep 2010 19:29:31 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7178</guid>
		<description>Non lo devi azzerare, lo devi ricaricare al valore iniziale, calcolato per avere il ritardo che vuoi</description>
		<content:encoded><![CDATA[<p>Non lo devi azzerare, lo devi ricaricare al valore iniziale, calcolato per avere il ritardo che vuoi</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Babbo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7176</link>
		<dc:creator>Babbo</dc:creator>
		<pubDate>Mon, 20 Sep 2010 17:54:34 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7176</guid>
		<description>Ho azzerato il timer, ma non è cambiato niente!!</description>
		<content:encoded><![CDATA[<p>Ho azzerato il timer, ma non è cambiato niente!!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7174</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 20 Sep 2010 15:07:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7174</guid>
		<description>Nella routine di interrupt, appena dopo il if(T0IF) devi subito ricaricare il timer altrimenti ti resta in overflow e si blocca tutto.</description>
		<content:encoded><![CDATA[<p>Nella routine di interrupt, appena dopo il if(T0IF) devi subito ricaricare il timer altrimenti ti resta in overflow e si blocca tutto.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Babbo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7171</link>
		<dc:creator>Babbo</dc:creator>
		<pubDate>Mon, 20 Sep 2010 12:27:25 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7171</guid>
		<description>L&#039;= è stato un errore, se non ho commesso errori l&#039;inteerupt scatta ogni 8ms (4/4 * 32 * 256) * 60 =&gt; controllo il LED ogni mezzo secondo. Ma quello che non mi spiego è che l&#039;eseguzione del programma mettendo un break sulle NOP() del main non si ferma..</description>
		<content:encoded><![CDATA[<p>L&#8217;= è stato un errore, se non ho commesso errori l&#8217;inteerupt scatta ogni 8ms (4/4 * 32 * 256) * 60 =&gt; controllo il LED ogni mezzo secondo. Ma quello che non mi spiego è che l&#8217;eseguzione del programma mettendo un break sulle NOP() del main non si ferma..</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7161</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Sun, 19 Sep 2010 12:07:14 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7161</guid>
		<description>L&#039;operatore = (un solo uguale) è un operatore di assegnazione, se vuoi fare il confronto si usa l&#039;operatore == (doppio uguale). Poi l&#039;incremento del  conteggio_timer, fallo sempre, all&#039;inizio dell&#039;isr e non con l&#039;else. Poi se l&#039;interrupt scatta ogni millisecondo, invertire il led ogni 60 millisecondi te lo farà vedere sempre acceso, con intensità bassa ma sempre acceso.</description>
		<content:encoded><![CDATA[<p>L&#8217;operatore = (un solo uguale) è un operatore di assegnazione, se vuoi fare il confronto si usa l&#8217;operatore == (doppio uguale). Poi l&#8217;incremento del  conteggio_timer, fallo sempre, all&#8217;inizio dell&#8217;isr e non con l&#8217;else. Poi se l&#8217;interrupt scatta ogni millisecondo, invertire il led ogni 60 millisecondi te lo farà vedere sempre acceso, con intensità bassa ma sempre acceso.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Babbo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7160</link>
		<dc:creator>Babbo</dc:creator>
		<pubDate>Sun, 19 Sep 2010 11:58:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7160</guid>
		<description>Ok.. :)
ho cambiato la routine ISR

void interrupt isr(void){

	if (T0IF){

		if(conteggio_timer_led = 60){
			LED = LED^1; 
			conteggio_timer_led = 0;
		}
		else
			conteggio_timer_led++;
   // qui vanno le istruzioni da eseguire se l&#039;interrupt è stato causato dal Timer0
	T0IF = 0; // devo resettare il flag altrimenti non mi sarà più possibile reintercettare tale interrupt
	}
}

ma purtroppo ancora non funziona. Ho provato a mettere un breakpoit nel main, nel quale ci sono solo due NOP(), ma l&#039;eseguzione del programma non si ferma, è come se non eseguisse nemmeno il main.</description>
		<content:encoded><![CDATA[<p>Ok.. :)<br />
ho cambiato la routine ISR</p>
<p>void interrupt isr(void){</p>
<p>	if (T0IF){</p>
<p>		if(conteggio_timer_led = 60){<br />
			LED = LED^1;<br />
			conteggio_timer_led = 0;<br />
		}<br />
		else<br />
			conteggio_timer_led++;<br />
   // qui vanno le istruzioni da eseguire se l&#8217;interrupt è stato causato dal Timer0<br />
	T0IF = 0; // devo resettare il flag altrimenti non mi sarà più possibile reintercettare tale interrupt<br />
	}<br />
}</p>
<p>ma purtroppo ancora non funziona. Ho provato a mettere un breakpoit nel main, nel quale ci sono solo due NOP(), ma l&#8217;eseguzione del programma non si ferma, è come se non eseguisse nemmeno il main.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/comment-page-1/#comment-7159</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Sun, 19 Sep 2010 09:04:39 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-7159</guid>
		<description>Non si preoccupi, è che avendo scritto due volte la stessa cosa, cambiando solo la parte finale del messaggio... uno non sa cosa pensare. Per il problema che hai la questione è semplice:

Metti che l&#039;interrupt sul timer0 ti scatta ogni millisecondo, se tu nella funzione dell&#039;interrupt ci metti un ritardo di 100millisecondi, cosa accade: quando il Delay sta conteggiando i millisecondi, dopo il primo millisecondo conteggiato (anche prima), ecco che la routine di interrupt viene richiamata di nuovo, con la conseguenza che il delay si interrompe al primo millisecondo e tutto quello che viene dopo non verrà mai eseguito. Per tale motivo è altamente consigliato non richiamare routine esterne dall&#039;interrupt: l&#039;interrupt deve essere il piu snello possibile: ci devono stare poche istruzioni, il minimo indispensabile da riuscire ad essere eseguito tra un interrupt e il successivo altrimenti la routine non verrà mai eseguita completamente. E poi mettere addirittura una routine di ritardo nell&#039;interrupt è una cosa assurda anche per il motivo che un interrupt serve proprio ad evitare di utilizzare i ritardi!</description>
		<content:encoded><![CDATA[<p>Non si preoccupi, è che avendo scritto due volte la stessa cosa, cambiando solo la parte finale del messaggio&#8230; uno non sa cosa pensare. Per il problema che hai la questione è semplice:</p>
<p>Metti che l&#8217;interrupt sul timer0 ti scatta ogni millisecondo, se tu nella funzione dell&#8217;interrupt ci metti un ritardo di 100millisecondi, cosa accade: quando il Delay sta conteggiando i millisecondi, dopo il primo millisecondo conteggiato (anche prima), ecco che la routine di interrupt viene richiamata di nuovo, con la conseguenza che il delay si interrompe al primo millisecondo e tutto quello che viene dopo non verrà mai eseguito. Per tale motivo è altamente consigliato non richiamare routine esterne dall&#8217;interrupt: l&#8217;interrupt deve essere il piu snello possibile: ci devono stare poche istruzioni, il minimo indispensabile da riuscire ad essere eseguito tra un interrupt e il successivo altrimenti la routine non verrà mai eseguita completamente. E poi mettere addirittura una routine di ritardo nell&#8217;interrupt è una cosa assurda anche per il motivo che un interrupt serve proprio ad evitare di utilizzare i ritardi!</p>
]]></content:encoded>
	</item>
</channel>
</rss>

