<?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>Thu, 09 Sep 2010 07:06:03 +0200</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<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-6788</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Sat, 21 Aug 2010 20:18:30 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6788</guid>
		<description>Facci sapere se così ti funziona. Magari, appena abbiamo tempo, si fa un articolo con delle linee guida per spiegare come adattare i codici all&#039;uno o all&#039;altro pic. Purtroppo io non è che ho a disposizione tutti i pic sul mercato e una cosa è la teoria e un&#039;altra è la pratica :)</description>
		<content:encoded><![CDATA[<p>Facci sapere se così ti funziona. Magari, appena abbiamo tempo, si fa un articolo con delle linee guida per spiegare come adattare i codici all&#8217;uno o all&#8217;altro pic. Purtroppo io non è che ho a disposizione tutti i pic sul mercato e una cosa è la teoria e un&#8217;altra è la pratica :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: erossinelli</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-6785</link>
		<dc:creator>erossinelli</dc:creator>
		<pubDate>Sat, 21 Aug 2010 14:53:14 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6785</guid>
		<description>Grazie davvero, non avevo fatto caso a queste impostazioni...</description>
		<content:encoded><![CDATA[<p>Grazie davvero, non avevo fatto caso a queste impostazioni&#8230;</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-6761</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 20 Aug 2010 20:40:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6761</guid>
		<description>Scusa un attimo... Tu prima mi dici che utilizzi il clock a 20MHz dopodichè viene fuori che utilizzi (o meglio &lt;em&gt;vorresti utilizzare&lt;/em&gt;) il clock interno. Mi sono quindi andato a leggere il datasheet del 16F690, che è la cosa che avresti dovuto fare tu, e non mi risulta che il 16F690 abbia il clock interno a 20MHz ma ce l&#039;ha selezionabile tra 8MHz a 31KHz (8 valori selezionabili).

Nel datasheet, nella parte dove hai letto 20MHz, viene indicata la frequenza massima supportata dal dispositivo, non quella a cui funziona il dispositivo. Sei tu che devi dire al dispositivo come deve funzionare: lui non è in grado di leggerti nel pensiero.

Quindi: usi il quarzo esterno a 20MHz o &lt;em&gt;vorresti usare&lt;/em&gt; l&#039;oscillatore interno ad 8MHz?

Dal tuo codice non mi risulta che hai fatto la selezione del tipo di oscillatore da utilizzare. Per cui suppongo che il pic ti sia lavorando con l&#039;oscillatore interno settato a 4MHz che è il valore di default. 

Per usare l&#039;oscillatore interno devi specificare INTIO nella config word (elenco delle parole chiave nel file 16F685.h), dopodichè devi scegliere la frequenza di funzionamento dell&#039;oscillatore interno settando opportunamente i 3 bit IRCF del registro OSCCON. Per usare 8MHz puoi aggiungere queste 3 righe prima del main:

IRCF0=1;
IRCF1=1;
IRCF2=1;

e magari, prima di eseguire il main, metterti in loop nell&#039;attesa che l&#039;oscillatore interno si stabilizzi controllando il bit HTS (HTS=1 =&gt; oscillatore stabile, HTS=0 =&gt; oscillatore non stabile)</description>
		<content:encoded><![CDATA[<p>Scusa un attimo&#8230; Tu prima mi dici che utilizzi il clock a 20MHz dopodichè viene fuori che utilizzi (o meglio <em>vorresti utilizzare</em>) il clock interno. Mi sono quindi andato a leggere il datasheet del 16F690, che è la cosa che avresti dovuto fare tu, e non mi risulta che il 16F690 abbia il clock interno a 20MHz ma ce l&#8217;ha selezionabile tra 8MHz a 31KHz (8 valori selezionabili).</p>
<p>Nel datasheet, nella parte dove hai letto 20MHz, viene indicata la frequenza massima supportata dal dispositivo, non quella a cui funziona il dispositivo. Sei tu che devi dire al dispositivo come deve funzionare: lui non è in grado di leggerti nel pensiero.</p>
<p>Quindi: usi il quarzo esterno a 20MHz o <em>vorresti usare</em> l&#8217;oscillatore interno ad 8MHz?</p>
<p>Dal tuo codice non mi risulta che hai fatto la selezione del tipo di oscillatore da utilizzare. Per cui suppongo che il pic ti sia lavorando con l&#8217;oscillatore interno settato a 4MHz che è il valore di default. </p>
<p>Per usare l&#8217;oscillatore interno devi specificare INTIO nella config word (elenco delle parole chiave nel file 16F685.h), dopodichè devi scegliere la frequenza di funzionamento dell&#8217;oscillatore interno settando opportunamente i 3 bit IRCF del registro OSCCON. Per usare 8MHz puoi aggiungere queste 3 righe prima del main:</p>
<p>IRCF0=1;<br />
IRCF1=1;<br />
IRCF2=1;</p>
<p>e magari, prima di eseguire il main, metterti in loop nell&#8217;attesa che l&#8217;oscillatore interno si stabilizzi controllando il bit HTS (HTS=1 =&gt; oscillatore stabile, HTS=0 =&gt; oscillatore non stabile)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: erossinelli</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-6759</link>
		<dc:creator>erossinelli</dc:creator>
		<pubDate>Fri, 20 Aug 2010 19:30:53 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6759</guid>
		<description>ecco il setting: 

 __CONFIG (HS &amp; WDTDIS &amp; PWRTEN &amp; BORDIS &amp; UNPROTECT);
//Ho tolto quelli che mi davano errore..
 
#define    CICALINO    RA0 
int c, stato;

void main(void)
 {c=0; stato = 0;

 // imposto i registri tristato in maniera tale che tutte le porte siano configurate come pin di uscita
 TRISA=0b00000000;
 TRISB=0b00000000;
 TRISC=0b00000000;

 CICALINO = 0;
 
INTCON = 0b10100000;
OPTION = 0b00000111; //Prescaler a 256
TMR0 = 0;
 while(1){}

ed ecco la routine di interrupt: 

  if (T0IF) {
		c++; 

		if(c&gt;20){
			if(stato == 0){
				//accendilo
				stato = 1;
				CICALINO = 1;
			}
			else{ CICALINO = 0; stato = 0; }
			c = 0;
		}
       T0IF=0; // Resetto il flag interrupt su timer 0,
     } // fine che interrupt verificatosi su timer0</description>
		<content:encoded><![CDATA[<p>ecco il setting: </p>
<p> __CONFIG (HS &amp; WDTDIS &amp; PWRTEN &amp; BORDIS &amp; UNPROTECT);<br />
//Ho tolto quelli che mi davano errore..</p>
<p>#define    CICALINO    RA0<br />
int c, stato;</p>
<p>void main(void)<br />
 {c=0; stato = 0;</p>
<p> // imposto i registri tristato in maniera tale che tutte le porte siano configurate come pin di uscita<br />
 TRISA=0b00000000;<br />
 TRISB=0b00000000;<br />
 TRISC=0b00000000;</p>
<p> CICALINO = 0;</p>
<p>INTCON = 0b10100000;<br />
OPTION = 0b00000111; //Prescaler a 256<br />
TMR0 = 0;<br />
 while(1){}</p>
<p>ed ecco la routine di interrupt: </p>
<p>  if (T0IF) {<br />
		c++; </p>
<p>		if(c&gt;20){<br />
			if(stato == 0){<br />
				//accendilo<br />
				stato = 1;<br />
				CICALINO = 1;<br />
			}<br />
			else{ CICALINO = 0; stato = 0; }<br />
			c = 0;<br />
		}<br />
       T0IF=0; // Resetto il flag interrupt su timer 0,<br />
     } // fine che interrupt verificatosi su timer0</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-6749</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 20 Aug 2010 15:47:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6749</guid>
		<description>Come l&#039;hai settato? Puoi postare qualche parte di codice, altrimenti non ne veniamo fuori più ?</description>
		<content:encoded><![CDATA[<p>Come l&#8217;hai settato? Puoi postare qualche parte di codice, altrimenti non ne veniamo fuori più ?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: erossinelli</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-6747</link>
		<dc:creator>erossinelli</dc:creator>
		<pubDate>Fri, 20 Aug 2010 14:59:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6747</guid>
		<description>non ho quarzi, utilizzo l&#039;oscillatore interno!</description>
		<content:encoded><![CDATA[<p>non ho quarzi, utilizzo l&#8217;oscillatore interno!</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-6725</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 20 Aug 2010 09:54:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6725</guid>
		<description>Si, l&#039;interrupt con questi parametri deve scattare ogni 13mSec... Controlla che il quarzo sia collegato bene o prova a sostituirlo, se stai usando una breadboard è facile che ci sia qualche falso contatto, controlla anche che i condensatori (ceramici) dell&#039;oscillatore siano del valore corretto (15 - 30pF). Assumo che il codice sia scritto bene.</description>
		<content:encoded><![CDATA[<p>Si, l&#8217;interrupt con questi parametri deve scattare ogni 13mSec&#8230; Controlla che il quarzo sia collegato bene o prova a sostituirlo, se stai usando una breadboard è facile che ci sia qualche falso contatto, controlla anche che i condensatori (ceramici) dell&#8217;oscillatore siano del valore corretto (15 &#8211; 30pF). Assumo che il codice sia scritto bene.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: erossinelli</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-6724</link>
		<dc:creator>erossinelli</dc:creator>
		<pubDate>Fri, 20 Aug 2010 09:44:30 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6724</guid>
		<description>precaricato a 0...</description>
		<content:encoded><![CDATA[<p>precaricato a 0&#8230;</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-6685</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 20 Aug 2010 00:40:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6685</guid>
		<description>Scusa ma non sto capendo. Timer0 lo precarichi con qualche valore o lo imposti a zero? Metti il prescaler a 1:256.. ok... ma in timer0 cosa ci metti?</description>
		<content:encoded><![CDATA[<p>Scusa ma non sto capendo. Timer0 lo precarichi con qualche valore o lo imposti a zero? Metti il prescaler a 1:256.. ok&#8230; ma in timer0 cosa ci metti?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: erossinelli</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-6670</link>
		<dc:creator>erossinelli</dc:creator>
		<pubDate>Thu, 19 Aug 2010 15:42:05 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-6670</guid>
		<description>Ciao, ho seguito la tua guida ma mi rimane un dubbio. Sto lavorando con PICKit 2 e PIC16F690. Dal datasheet: 
20 MHz, 200ns instruction cycle, come previsto. 
Ho allora impostato il prescaler del tmr0 a 111 (256). 
Quindi, teoricamente, l&#039;overflow si dovrebbe verificare ogni: 
0.2u * 256 = 51.2 us
E l&#039;interrupt dovrebbe essere sollevato ogni: 
51.2 u * 256 = 13ms circa
Nella procedura dell&#039;interrupt, utilizzo un variabile intera come contatore (che viene incrementata ogni volta), e cambio lo stato della porta RA0 se il valore del contatore supera 20. Quindi, ancora teoricamente, dovrei avere un cambio di stato ogni
13m * 21 = 273 ms
Ho un led collegato alla porta A0, ma il risultato non è quello aspettato: così a occhio (non ho strumenti di precisione) il led resta acceso per 1 secondo, e spento per 1 secondo, circa 4 volte il tempo atteso. 
Sapresti darmi indicazioni?</description>
		<content:encoded><![CDATA[<p>Ciao, ho seguito la tua guida ma mi rimane un dubbio. Sto lavorando con PICKit 2 e PIC16F690. Dal datasheet:<br />
20 MHz, 200ns instruction cycle, come previsto.<br />
Ho allora impostato il prescaler del tmr0 a 111 (256).<br />
Quindi, teoricamente, l&#8217;overflow si dovrebbe verificare ogni:<br />
0.2u * 256 = 51.2 us<br />
E l&#8217;interrupt dovrebbe essere sollevato ogni:<br />
51.2 u * 256 = 13ms circa<br />
Nella procedura dell&#8217;interrupt, utilizzo un variabile intera come contatore (che viene incrementata ogni volta), e cambio lo stato della porta RA0 se il valore del contatore supera 20. Quindi, ancora teoricamente, dovrei avere un cambio di stato ogni<br />
13m * 21 = 273 ms<br />
Ho un led collegato alla porta A0, ma il risultato non è quello aspettato: così a occhio (non ho strumenti di precisione) il led resta acceso per 1 secondo, e spento per 1 secondo, circa 4 volte il tempo atteso.<br />
Sapresti darmi indicazioni?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Cristianoscr</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-5940</link>
		<dc:creator>Cristianoscr</dc:creator>
		<pubDate>Sat, 26 Jun 2010 13:28:23 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-5940</guid>
		<description>Ah ma figurati per tre euro, grazie a te che tieni in vita questo sito...</description>
		<content:encoded><![CDATA[<p>Ah ma figurati per tre euro, grazie a te che tieni in vita questo sito&#8230;</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-5925</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 25 Jun 2010 20:31:09 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-5925</guid>
		<description>Ti ringrazio</description>
		<content:encoded><![CDATA[<p>Ti ringrazio</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Cristianoscr</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-5917</link>
		<dc:creator>Cristianoscr</dc:creator>
		<pubDate>Fri, 25 Jun 2010 09:20:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-5917</guid>
		<description>Si mi sa che è meglio perchè ho detto un po di castronerie... PS ti ho lasciato una moretti da 33 qualche giorno fa, buona bevuta ;)</description>
		<content:encoded><![CDATA[<p>Si mi sa che è meglio perchè ho detto un po di castronerie&#8230; PS ti ho lasciato una moretti da 33 qualche giorno fa, buona bevuta ;)</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-5913</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 25 Jun 2010 06:46:25 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-5913</guid>
		<description>ho spiegato nelle lezioni precedenti che un define serve a definire un &quot;simbolo&quot;, mentre unsigned char definisce una variabile (una scatola in cui mettere dei numeri, il contenuto della scatola lo puoi cambiare a piacere nel corso del programma).

Poi TimerLed (a parte il fatto che è una variabile) e LED sono due cose distinte e separate... Non è che il compilatore è talmente fesso da sostituire tutte le parole &quot;led&quot; che trova... sostituisce solo &quot;LED&quot; (LED senza scritto altri caratteri vicino)... eh si.... sai quante pistolate avrebbero avuto gli sviluppatori se faceva una cosa del genere!

Unsigned definisce una variabile senza segno. Unsigned char definisce quindi una variabile senza segno di tipo char, ovvero con valori che vanno da 0 a 255, se la definivo signed voleva dire che in quella variabile ci volevo mettere valori che andavano da -127 a 128. Però a questo punto è meglio che ti leggi il Tricky C che puoi scaricare nell&#039;area risorse.</description>
		<content:encoded><![CDATA[<p>ho spiegato nelle lezioni precedenti che un define serve a definire un &#8220;simbolo&#8221;, mentre unsigned char definisce una variabile (una scatola in cui mettere dei numeri, il contenuto della scatola lo puoi cambiare a piacere nel corso del programma).</p>
<p>Poi TimerLed (a parte il fatto che è una variabile) e LED sono due cose distinte e separate&#8230; Non è che il compilatore è talmente fesso da sostituire tutte le parole &#8220;led&#8221; che trova&#8230; sostituisce solo &#8220;LED&#8221; (LED senza scritto altri caratteri vicino)&#8230; eh si&#8230;. sai quante pistolate avrebbero avuto gli sviluppatori se faceva una cosa del genere!</p>
<p>Unsigned definisce una variabile senza segno. Unsigned char definisce quindi una variabile senza segno di tipo char, ovvero con valori che vanno da 0 a 255, se la definivo signed voleva dire che in quella variabile ci volevo mettere valori che andavano da -127 a 128. Però a questo punto è meglio che ti leggi il Tricky C che puoi scaricare nell&#8217;area risorse.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Cristianoscr</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-5908</link>
		<dc:creator>Cristianoscr</dc:creator>
		<pubDate>Thu, 24 Jun 2010 23:08:37 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-5908</guid>
		<description>2#define    LED         RD0
3#define    CICALINO    RE1
 
4unsigned char TimerLed=0; 

Praticamente se ho capito bene qui hai definito Led il pin RDO,  poi hai definito la variabile TimerLed. Ma se non avessi messo il define al led avresti dovuto scrivere TimerRdo? Se così fosse la lettera maiuscola si mette per indicare al programmatore di che timer stiamo parlando? E perchè hai impostato proprio unsigned? Se avessi messo signed cosa sarebbe cambiato? Grazie mille mi stai aiutando molto!</description>
		<content:encoded><![CDATA[<p>2#define    LED         RD0<br />
3#define    CICALINO    RE1</p>
<p>4unsigned char TimerLed=0; </p>
<p>Praticamente se ho capito bene qui hai definito Led il pin RDO,  poi hai definito la variabile TimerLed. Ma se non avessi messo il define al led avresti dovuto scrivere TimerRdo? Se così fosse la lettera maiuscola si mette per indicare al programmatore di che timer stiamo parlando? E perchè hai impostato proprio unsigned? Se avessi messo signed cosa sarebbe cambiato? Grazie mille mi stai aiutando molto!</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-4605</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 19 Apr 2010 18:07:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-4605</guid>
		<description>Ah poi altra cosa... Invece di fare &gt;=60 fai soltanto &gt;59 e così per le altre verifiche</description>
		<content:encoded><![CDATA[<p>Ah poi altra cosa&#8230; Invece di fare >=60 fai soltanto >59 e così per le altre verifiche</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-4604</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 19 Apr 2010 17:00:10 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-4604</guid>
		<description>Ma è assolutamente normale che troverai sempre uno scostamento, il problema è capire se è l&#039;orologio che hai fatto tu che sgarra, o l&#039;altro. In genere, però, per realizzare un&#039;orologio non si utilizza mai il quarzo di sistema con gli interrupt ma si ricorre invece al Timer1 collegandoci come sorgente di clock un quarzo da 32768KHz. Quindi sul sistema avrai due quarzi: uno di sistema e l&#039;altro come sorgente di clock per il timer1. Ci sono due pin apposta per collegare il quarzo del timer1, sono indicati sul datasheet come T1OSI e T1OSO (Timer1 Oscillator Input e Timer1 Oscillator Output). 

Anche se questo consente una precisione maggiore, c&#039;è sempre il problema della deriva termica dei quarzi, ma in questo caso confrontando con l&#039;altro orologio (che pure dovrebbe funzionare con lo stesso tipo di quarzo), lo scostamento sarà molto molto minore. 

Per fare le cose precise si ricorre generalmente ad un oscillatore esterno al posto del quarzo (sempre come base dei tempi per il timer1). La Maxim se non erro ha in catalogo appunto un circuito integrato che produce un&#039;onda quadra a 32768KHz, ma ce l&#039;hanno un po tutte le ditte che producono circuiti integrati.

Perchè 32768KHz? 32768 = 2^15. Il timer1 è un timer a 16 bit che genera anch&#039;esso un interrupt sull&#039;overflow, precaricandolo opportunamente puoi ottenere appunto un interrupt ogni secondo, quindi a ogni interrupt incrementi il contatore dei secondi e ti fai tutti i calcoli. L&#039;utilizzo del timer1 è semplicissimo ed è quasi uguale a quello del timer0 se non per il fatto che è a 16 bit per cui ha un registro alto e uno basso, sul datasheet ci sono tutte le informazioni del caso. Se hai capito bene questa lezione qui, per utilizzare il Timer1 non dovresti avere difficoltà.

Per fare delle prove, se non trovi il quarzetto, lo puoi anche smontare da un vecchio orologio a parete o anche da altri dispositivi. Questo quarzetto viene prodotto in un formato particolare tutto suo: è un cilindretto metallico molto molto piccolo coi pin sottilissimi. In questo formato fanno soltanto i quarzi da 32768KHz e un&#039; altra frequenza poco utilizzata che ora non ricordo, ma in vita mia non l&#039;ho mai incontrata quindi sarà solo una leggenda. Tale quarzo mi è capitato spesso di trovarlo anche nei termometri digitali, sul corpo non c&#039;è scritto nulla o al limite qualche sigla inutile.

Il timer1 viene abilitato portando a 1 il bit TMR1ON e l&#039;oscillatore parte con TMR1OSCEN=1:  in automatico i due pin destinati al quarzo del timer1 diventano ingressi indipendentemente da come stanno settati nel registro tristato relativo. 

L&#039;interrupt viene abilitato col bit TMR1IE ma essendo una periferica esterna devi attivare anche (oltre al GIE) il PEIE. 

L&#039;interrupt del timer1 avviene quando va in overflow (quindi da 0xFFFF a 0x0000 ... come il timer0 ma qui sono 16 bit). Per precaricare il timer1 devi utilizzare due registri ad 8 bit TMR1L che contiene la parte bassa e TMR1H che contiene la parte alta (quindi devi scomporre il numero da caricare in due parti). 

Il timer1 deve operare come contatore anzichè come timer, quindi TMR1CS=1 e il timer1 conterà gli impulsi che giungono dal quarzetto esterno sul fronte di salita. Il timer1 ha un suo prescaler che in questo caso va settato a 1.

La paginetta del datasheet che parla del timer1 è abbastanza chiara. Buon lavoro ;)</description>
		<content:encoded><![CDATA[<p>Ma è assolutamente normale che troverai sempre uno scostamento, il problema è capire se è l&#8217;orologio che hai fatto tu che sgarra, o l&#8217;altro. In genere, però, per realizzare un&#8217;orologio non si utilizza mai il quarzo di sistema con gli interrupt ma si ricorre invece al Timer1 collegandoci come sorgente di clock un quarzo da 32768KHz. Quindi sul sistema avrai due quarzi: uno di sistema e l&#8217;altro come sorgente di clock per il timer1. Ci sono due pin apposta per collegare il quarzo del timer1, sono indicati sul datasheet come T1OSI e T1OSO (Timer1 Oscillator Input e Timer1 Oscillator Output). </p>
<p>Anche se questo consente una precisione maggiore, c&#8217;è sempre il problema della deriva termica dei quarzi, ma in questo caso confrontando con l&#8217;altro orologio (che pure dovrebbe funzionare con lo stesso tipo di quarzo), lo scostamento sarà molto molto minore. </p>
<p>Per fare le cose precise si ricorre generalmente ad un oscillatore esterno al posto del quarzo (sempre come base dei tempi per il timer1). La Maxim se non erro ha in catalogo appunto un circuito integrato che produce un&#8217;onda quadra a 32768KHz, ma ce l&#8217;hanno un po tutte le ditte che producono circuiti integrati.</p>
<p>Perchè 32768KHz? 32768 = 2^15. Il timer1 è un timer a 16 bit che genera anch&#8217;esso un interrupt sull&#8217;overflow, precaricandolo opportunamente puoi ottenere appunto un interrupt ogni secondo, quindi a ogni interrupt incrementi il contatore dei secondi e ti fai tutti i calcoli. L&#8217;utilizzo del timer1 è semplicissimo ed è quasi uguale a quello del timer0 se non per il fatto che è a 16 bit per cui ha un registro alto e uno basso, sul datasheet ci sono tutte le informazioni del caso. Se hai capito bene questa lezione qui, per utilizzare il Timer1 non dovresti avere difficoltà.</p>
<p>Per fare delle prove, se non trovi il quarzetto, lo puoi anche smontare da un vecchio orologio a parete o anche da altri dispositivi. Questo quarzetto viene prodotto in un formato particolare tutto suo: è un cilindretto metallico molto molto piccolo coi pin sottilissimi. In questo formato fanno soltanto i quarzi da 32768KHz e un&#8217; altra frequenza poco utilizzata che ora non ricordo, ma in vita mia non l&#8217;ho mai incontrata quindi sarà solo una leggenda. Tale quarzo mi è capitato spesso di trovarlo anche nei termometri digitali, sul corpo non c&#8217;è scritto nulla o al limite qualche sigla inutile.</p>
<p>Il timer1 viene abilitato portando a 1 il bit TMR1ON e l&#8217;oscillatore parte con TMR1OSCEN=1:  in automatico i due pin destinati al quarzo del timer1 diventano ingressi indipendentemente da come stanno settati nel registro tristato relativo. </p>
<p>L&#8217;interrupt viene abilitato col bit TMR1IE ma essendo una periferica esterna devi attivare anche (oltre al GIE) il PEIE. </p>
<p>L&#8217;interrupt del timer1 avviene quando va in overflow (quindi da 0xFFFF a 0&#215;0000 &#8230; come il timer0 ma qui sono 16 bit). Per precaricare il timer1 devi utilizzare due registri ad 8 bit TMR1L che contiene la parte bassa e TMR1H che contiene la parte alta (quindi devi scomporre il numero da caricare in due parti). </p>
<p>Il timer1 deve operare come contatore anzichè come timer, quindi TMR1CS=1 e il timer1 conterà gli impulsi che giungono dal quarzetto esterno sul fronte di salita. Il timer1 ha un suo prescaler che in questo caso va settato a 1.</p>
<p>La paginetta del datasheet che parla del timer1 è abbastanza chiara. Buon lavoro ;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: MayTs</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-4602</link>
		<dc:creator>MayTs</dc:creator>
		<pubDate>Mon, 19 Apr 2010 16:27:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-4602</guid>
		<description>Ciao, ulteriore domanda(ormai sarai stufo di me... eheheh).
utilizzo un quarzo da 8 mhz, impostato il prescaler 1:8 e il preload del timer0 a 8.
Così facendo dovrei ottenere un interrupt esattamente ogni mS.
Ho quindi realizzato un semplice orologio e andandolo a testare mi sono trovato sorpreso nel vedere che dopo circa 7 ore di funzionamento l&#039;orologio è rimasto indietro di 3 minuti rispetto ad un altro orologio(che ho utilizzato appunto per controllare l&#039;affidabilità del timer da me creato)...
Sapresti dirmi il perché?

ti allego il codice:
if (T0IF)
    {
		TMR0 = 8; // Reimposto Timer0
		CicliSecondi++;
                if (CicliSecondi &gt;= 1000)//quando passa un secondo
		{
			Secondi++;
			if (Secondi &gt;= 60)
			{
				Minuti++;
				Secondi = 0;
				if (Minuti &gt;= 60)
				{
					Ore++;
					Minuti = 0;
					if (Ore &gt;= 24)
					{
						Ore = 0;
					}
				}
			}
			CicliSecondi = 0;
		}
                T0IF=0;
   }</description>
		<content:encoded><![CDATA[<p>Ciao, ulteriore domanda(ormai sarai stufo di me&#8230; eheheh).<br />
utilizzo un quarzo da 8 mhz, impostato il prescaler 1:8 e il preload del timer0 a 8.<br />
Così facendo dovrei ottenere un interrupt esattamente ogni mS.<br />
Ho quindi realizzato un semplice orologio e andandolo a testare mi sono trovato sorpreso nel vedere che dopo circa 7 ore di funzionamento l&#8217;orologio è rimasto indietro di 3 minuti rispetto ad un altro orologio(che ho utilizzato appunto per controllare l&#8217;affidabilità del timer da me creato)&#8230;<br />
Sapresti dirmi il perché?</p>
<p>ti allego il codice:<br />
if (T0IF)<br />
    {<br />
		TMR0 = 8; // Reimposto Timer0<br />
		CicliSecondi++;<br />
                if (CicliSecondi &gt;= 1000)//quando passa un secondo<br />
		{<br />
			Secondi++;<br />
			if (Secondi &gt;= 60)<br />
			{<br />
				Minuti++;<br />
				Secondi = 0;<br />
				if (Minuti &gt;= 60)<br />
				{<br />
					Ore++;<br />
					Minuti = 0;<br />
					if (Ore &gt;= 24)<br />
					{<br />
						Ore = 0;<br />
					}<br />
				}<br />
			}<br />
			CicliSecondi = 0;<br />
		}<br />
                T0IF=0;<br />
   }</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: gigio13</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-4447</link>
		<dc:creator>gigio13</dc:creator>
		<pubDate>Sat, 10 Apr 2010 18:05:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-4447</guid>
		<description>Ciao Gianni,
complimenti per le lezioni sui pic. Sono veramente utilissime per chi si addentra nell&#039;argomento. Volevo approfittarne per chiederti un aiutino. Ho provato il file della lezione 5 su mplab e volevo simularlo con mplab sim. Ma andando a tracciare le forme d&#039;onda del cicalino e del led riesco a vedere solo l&#039;onda quadra del led. Il cicalino rimane invece sempre a zero. Ho provato anche a cambiare un pò i tempi ma non riesco mai a vedere l&#039;onda quadra del cicalino. Sai forse come mai? Devo forse impostare qualcosa di particolare? Grazie mille in anticipo!</description>
		<content:encoded><![CDATA[<p>Ciao Gianni,<br />
complimenti per le lezioni sui pic. Sono veramente utilissime per chi si addentra nell&#8217;argomento. Volevo approfittarne per chiederti un aiutino. Ho provato il file della lezione 5 su mplab e volevo simularlo con mplab sim. Ma andando a tracciare le forme d&#8217;onda del cicalino e del led riesco a vedere solo l&#8217;onda quadra del led. Il cicalino rimane invece sempre a zero. Ho provato anche a cambiare un pò i tempi ma non riesco mai a vedere l&#8217;onda quadra del cicalino. Sai forse come mai? Devo forse impostare qualcosa di particolare? Grazie mille in anticipo!</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-4085</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 10 Mar 2010 19:45:41 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1377#comment-4085</guid>
		<description>Grazie tante :) Spero di riuscire a continuare così</description>
		<content:encoded><![CDATA[<p>Grazie tante :) Spero di riuscire a continuare così</p>
]]></content:encoded>
	</item>
</channel>
</rss>
