<?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 8 – Pilotare i display a led a 7 segmenti in modalità multiplex su interrupt del Timer0. Realizziamo un contatore up/down</title>
	<atom:link href="http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/</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: michele r.</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-2/#comment-13941</link>
		<dc:creator>michele r.</dc:creator>
		<pubDate>Sat, 21 Jan 2012 06:38:05 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-13941</guid>
		<description>Complimenti Giovanni,
Veramente chiaro e ben fatto.
&quot;smanetto&quot; software da tanti anni, dai tempi del vic20 e da qualche mese in C.
Allora era tutto più complicato. . . . . . . . non c&#039;erano i vari giovanni. . . . . e mauro a. . . . .
caffe pagato!</description>
		<content:encoded><![CDATA[<p>Complimenti Giovanni,<br />
Veramente chiaro e ben fatto.<br />
&#8220;smanetto&#8221; software da tanti anni, dai tempi del vic20 e da qualche mese in C.<br />
Allora era tutto più complicato. . . . . . . . non c&#8217;erano i vari giovanni. . . . . e mauro a. . . . .<br />
caffe pagato!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Christin</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-13290</link>
		<dc:creator>Christin</dc:creator>
		<pubDate>Sun, 13 Nov 2011 11:03:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-13290</guid>
		<description>Ciao Marco io ho un problema con la copilazione del tuo programma ho caricacato il tuo esempio nel mio compilatore Htlpic imposto con f3 i vari settaggi parte la compilazzione per ottenere HEX ma mi da un errore &quot;arguments redeclared&quot; alla parentasi graffa in questa riga .
void main(void)
	{ // mi da errore qui
	settings(); // imposto le porte come da settings.h

non so come procedere sono nuova nella programazione dei pic  e volevo provare a pilotare un display oltre che ad un led scusami ancora se ti pongo una domanda così stupida , grazie ancora Christin</description>
		<content:encoded><![CDATA[<p>Ciao Marco io ho un problema con la copilazione del tuo programma ho caricacato il tuo esempio nel mio compilatore Htlpic imposto con f3 i vari settaggi parte la compilazzione per ottenere HEX ma mi da un errore &#8220;arguments redeclared&#8221; alla parentasi graffa in questa riga .<br />
void main(void)<br />
	{ // mi da errore qui<br />
	settings(); // imposto le porte come da settings.h</p>
<p>non so come procedere sono nuova nella programazione dei pic  e volevo provare a pilotare un display oltre che ad un led scusami ancora se ti pongo una domanda così stupida , grazie ancora Christin</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10815</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 15 Mar 2011 10:40:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10815</guid>
		<description>Prego :D e in bocca al lupo per gli esami</description>
		<content:encoded><![CDATA[<p>Prego :D e in bocca al lupo per gli esami</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10814</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Tue, 15 Mar 2011 10:24:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10814</guid>
		<description>Si&#039; mi sono iscritto poco dopo... Terro&#039; a mente comunque!
Grazie infinite e complimenti!</description>
		<content:encoded><![CDATA[<p>Si&#8217; mi sono iscritto poco dopo&#8230; Terro&#8217; a mente comunque!<br />
Grazie infinite e complimenti!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10813</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 15 Mar 2011 10:20:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10813</guid>
		<description>Si c&#039;è una lezione che parla appunto di questo problema, che purtroppo è un problema molto comune. Forse non la conoscevi perchè ti sei iscritto dopo che è stata pubblicata e quindi l&#039;email non ti è arrivata. In ogni caso quando hai qualche problema dai sempre uno sguardo nel menù picmicro perchè di soluzioni ai problemi comuni ce ne sono parecchie. Hai fatto bene a consigliarla ai tuoi amici, ci sono molti universitari iscritti.</description>
		<content:encoded><![CDATA[<p>Si c&#8217;è una lezione che parla appunto di questo problema, che purtroppo è un problema molto comune. Forse non la conoscevi perchè ti sei iscritto dopo che è stata pubblicata e quindi l&#8217;email non ti è arrivata. In ogni caso quando hai qualche problema dai sempre uno sguardo nel menù picmicro perchè di soluzioni ai problemi comuni ce ne sono parecchie. Hai fatto bene a consigliarla ai tuoi amici, ci sono molti universitari iscritti.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10812</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Tue, 15 Mar 2011 10:10:06 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10812</guid>
		<description>Che niubbo, sto leggendo la tua lezione sull&#039;argomento!
Spero di risolvere!
Comunque sei un grande, grazie per la pazienza! Questa guida la sto cosnigliando a un sacco di amici, qui a ingegneria elettronica!
Praticamente tutti i problemi li risolvo qui!</description>
		<content:encoded><![CDATA[<p>Che niubbo, sto leggendo la tua lezione sull&#8217;argomento!<br />
Spero di risolvere!<br />
Comunque sei un grande, grazie per la pazienza! Questa guida la sto cosnigliando a un sacco di amici, qui a ingegneria elettronica!<br />
Praticamente tutti i problemi li risolvo qui!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10811</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Tue, 15 Mar 2011 10:05:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10811</guid>
		<description>si&#039; sono sempre in conduzione:\
Le porte hanno funzione di comparatori analogici! potrebbe essere questo? Come le disattivo??
La routine di multiplex dovrebbe funzionare se non bene, decentemente! I due pallini centrali lampeggiano benone!</description>
		<content:encoded><![CDATA[<p>si&#8217; sono sempre in conduzione:\<br />
Le porte hanno funzione di comparatori analogici! potrebbe essere questo? Come le disattivo??<br />
La routine di multiplex dovrebbe funzionare se non bene, decentemente! I due pallini centrali lampeggiano benone!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10810</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 15 Mar 2011 10:02:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10810</guid>
		<description>I transistor in pratica sono sempre in conduzione e questo può dipendere da vari fattori: sono collegati su porte non configurate come digitali (se si trovano su porte che hanno anche funzione analogica o di comparatore, hai disattivato tale funzione?). Oppure la routine di multiplex non funziona correttamente. Cerca di capire come mai tutti e 4 i pin dei transistor si trovano sempre a livello logico basso</description>
		<content:encoded><![CDATA[<p>I transistor in pratica sono sempre in conduzione e questo può dipendere da vari fattori: sono collegati su porte non configurate come digitali (se si trovano su porte che hanno anche funzione analogica o di comparatore, hai disattivato tale funzione?). Oppure la routine di multiplex non funziona correttamente. Cerca di capire come mai tutti e 4 i pin dei transistor si trovano sempre a livello logico basso</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10809</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Tue, 15 Mar 2011 09:53:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10809</guid>
		<description>Sisi&#039;, lo sto facendo! Ho usato i BC327, e li sto attivando mettendo a 0 il pin dedicato, e mi ono pure dovuto ricalcolare tutte le cifre (sono le negazioni delle cifre del catodo comune), ma il fatto e&#039; che il display non obbedisce, sembra che i quattro pin dedicati ai transistor vengano ignorati alla grande! A qualunque stato io limetta, loro continuano a rimanere accesi!</description>
		<content:encoded><![CDATA[<p>Sisi&#8217;, lo sto facendo! Ho usato i BC327, e li sto attivando mettendo a 0 il pin dedicato, e mi ono pure dovuto ricalcolare tutte le cifre (sono le negazioni delle cifre del catodo comune), ma il fatto e&#8217; che il display non obbedisce, sembra che i quattro pin dedicati ai transistor vengano ignorati alla grande! A qualunque stato io limetta, loro continuano a rimanere accesi!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10808</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 15 Mar 2011 09:50:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10808</guid>
		<description>Non ho tempo di applicarmi a leggere tutti i codici che mi stai mandando. Però voglio farti notare una cosa. Tu mi stai parlando di display ad anodo comune. Io l&#039;esempio l&#039;ho fatto con il catodo comune. Hai avuto cura di utilizzare dei transistor PNP invece degli NPN presenti nell&#039;esempio? Li stai attivando col livello logico basso e spegnendo col livello logico alto? Se usi i display ad anodo comune devi invertire tutte le logiche dell&#039;esempio.</description>
		<content:encoded><![CDATA[<p>Non ho tempo di applicarmi a leggere tutti i codici che mi stai mandando. Però voglio farti notare una cosa. Tu mi stai parlando di display ad anodo comune. Io l&#8217;esempio l&#8217;ho fatto con il catodo comune. Hai avuto cura di utilizzare dei transistor PNP invece degli NPN presenti nell&#8217;esempio? Li stai attivando col livello logico basso e spegnendo col livello logico alto? Se usi i display ad anodo comune devi invertire tutte le logiche dell&#8217;esempio.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10807</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Tue, 15 Mar 2011 09:32:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10807</guid>
		<description>Scusami se ti rompo ancora...
Per non creare casini ho riscritto il codice per fargli stampare semplicemente i numeri 0, 1, 2, 3 rispettivamente sullo schermo 0 (actdisplay=0), 1 (actdisplay=1) etc etc...
Pero&#039; succede una cosa strana, cioe&#039; gli anodi non si spengono affatto, restano tutti accesi, e invece di avere uno schermino alla volta acceso per un quarto di secondo, li ho accesi tutti e 4, e ogni quarto di secondo cambiano tutti quanti la cifra che visualizzano (che e&#039; la stessa per tutti)...
Come mai il PIC non spegne l&#039;anodo assegnatogli??
La cosa bella e&#039; che la variabile actdisplay funge, visto che comunque i numeri visualizzati cambiano .-.
Gli anodi K1,2,3,4 sono collegati, rispettivamente a RA0,1,2,3!
Nota: gli anodi sono governati con transistor bjt PNP BC327, collegati col rispettivo PIN tramite la Base


void interrupt ISR(void)

    {

             //avviene ogni 1ms, come da prescaler

             if(T0IF)

               {

                      TMR0=133;              //resetto timer0 su valore desiderato

                      muxcount++;            //il muxcount si aggiorna ogni 1ms, lo aggiorno subito per non lasciarlo per strada

                      if(actdisplay==0)      //selezionato display delle decine delle ore

                       {

                                K1=0;								//K1, anodo relativo allo schermo interessato, acceso

								K2=1;

								K3=1;

								K4=1;

                                if(counterh3)

                                  { 

                                       actdisplay=0;

                                  }

                                dispReg=0b01111111;

                                
                              
                        }//muxcount==255</description>
		<content:encoded><![CDATA[<p>Scusami se ti rompo ancora&#8230;<br />
Per non creare casini ho riscritto il codice per fargli stampare semplicemente i numeri 0, 1, 2, 3 rispettivamente sullo schermo 0 (actdisplay=0), 1 (actdisplay=1) etc etc&#8230;<br />
Pero&#8217; succede una cosa strana, cioe&#8217; gli anodi non si spengono affatto, restano tutti accesi, e invece di avere uno schermino alla volta acceso per un quarto di secondo, li ho accesi tutti e 4, e ogni quarto di secondo cambiano tutti quanti la cifra che visualizzano (che e&#8217; la stessa per tutti)&#8230;<br />
Come mai il PIC non spegne l&#8217;anodo assegnatogli??<br />
La cosa bella e&#8217; che la variabile actdisplay funge, visto che comunque i numeri visualizzati cambiano .-.<br />
Gli anodi K1,2,3,4 sono collegati, rispettivamente a RA0,1,2,3!<br />
Nota: gli anodi sono governati con transistor bjt PNP BC327, collegati col rispettivo PIN tramite la Base</p>
<p>void interrupt ISR(void)</p>
<p>    {</p>
<p>             //avviene ogni 1ms, come da prescaler</p>
<p>             if(T0IF)</p>
<p>               {</p>
<p>                      TMR0=133;              //resetto timer0 su valore desiderato</p>
<p>                      muxcount++;            //il muxcount si aggiorna ogni 1ms, lo aggiorno subito per non lasciarlo per strada</p>
<p>                      if(actdisplay==0)      //selezionato display delle decine delle ore</p>
<p>                       {</p>
<p>                                K1=0;								//K1, anodo relativo allo schermo interessato, acceso</p>
<p>								K2=1;</p>
<p>								K3=1;</p>
<p>								K4=1;</p>
<p>                                if(counterh3)</p>
<p>                                  { </p>
<p>                                       actdisplay=0;</p>
<p>                                  }</p>
<p>                                dispReg=0b01111111;</p>
<p>                        }//muxcount==255</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10806</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Tue, 15 Mar 2011 07:45:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10806</guid>
		<description>Ah ottimo! Allora aspetto paziente! :D</description>
		<content:encoded><![CDATA[<p>Ah ottimo! Allora aspetto paziente! :D</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10805</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 15 Mar 2011 07:29:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10805</guid>
		<description>Adesso indipendentemente dal problema che hai non si fa un orologio utilizzando il quarzo di sistema. Esiste il Timer1 che è progettato appositamente per questo scopo. Se attendi un po è in preparazione un articolo che parla appunto di questa cosa.</description>
		<content:encoded><![CDATA[<p>Adesso indipendentemente dal problema che hai non si fa un orologio utilizzando il quarzo di sistema. Esiste il Timer1 che è progettato appositamente per questo scopo. Se attendi un po è in preparazione un articolo che parla appunto di questa cosa.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10801</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Mon, 14 Mar 2011 23:17:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10801</guid>
		<description>Mh, credo che non l&#039;abbia copiato bene... Se vuoi posso mandartelo per mail...</description>
		<content:encoded><![CDATA[<p>Mh, credo che non l&#8217;abbia copiato bene&#8230; Se vuoi posso mandartelo per mail&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Antares</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10800</link>
		<dc:creator>Antares</dc:creator>
		<pubDate>Mon, 14 Mar 2011 23:14:24 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10800</guid>
		<description>Ciao Giovanni!
Dopo aver fatto lampeggiare il LEDdino (anche grazie al tuo aiuto XD) ho cominciato a costruirmi un orologio, tutto bene, pero&#039; il display fa &quot;cose strane&quot;.
Le cifre le ho costruite bene (ho fatto dei programmi ad hoc per verificare che fossero &quot;giuste&quot;), e l&#039;interrupt pure dovrebbe essere fatto bene, perche&#039; il DOT (i due puntini che separano minuti dalle ora) lampeggiano con un periodo di un secondo, come da programmazione!
Le cose strane sono che praticamente le cifre non si leggono... E&#039; come se il PIC (16F628A, con clock interno di 4Mhz)  non riuscisse a controllare gli anodi comuni, tenendone solo uno acceso! 
Poi la quarta cifra(relativa a K4) resta sempre spenta, ma credo che sia il transistor mio ad essere rotto, col tester non c&#039;era continuita&#039;, in funzione...
Qui c&#039;e&#039; l&#039;header:

/*
*    SETTINGS.H
*    per orologio digitale autocostruito su 
*    PIC16F628, oscillatore interno a 4MHz
*    26/01/2011
*    Copirait di Armando Bond (bobbisixkiller@libero.it)
*/

#define   BTNH1 RB7
#define   BTNH2 RA5   //cosi&#039; il MCLR e&#039; input
#define   BTNM1 RA6
#define   BTNM2 RA7
/*
* a---&gt;RB6
* b---&gt;RB5
* c---&gt;RB4
* d---&gt;RB3
* e---&gt;RB2
* f---&gt;RB1
* g---&gt;RB0
*/
#define     DOT RA4
#define      K1 RA0    //Catodi comuni (Anodi, nel caso usi un display ad anodo comune : D  )
#define      K2 RA1
#define      K3 RA2
#define      K4 RA3
#define dispReg PORTB  //Registro delle PORTE tristato B: ho collegato tutti i segmenti dei display a pin del banco porte B
#define       a 64     //Ogni segmento lo associo al numero del bit associato nel registro PORTB
#define       b 32
#define       c 16
#define       d 8
#define       e 4
#define       f 2
#define       g 1
#define      N0 1      //128-(a+b+c+d+e+f)   //Da qui in poi specifico ogni numero da quale segmento deve essere
#define      N1 79       //127-(b+c)           //acceso, semplicemente sommando i segmenti (sono in realta&#039; numeri,
#define      N2 18       //123-(a+b+g+e+d)     // come dichiarato prima).
#define      N3  6      //126-(a+b+g+c+d)     
#define      N4 76       //127-(g+f+b+c)
#define      N5 36       //127-(a+f+g+c+d)     // l&#039;anodo comune deve fare lo &quot;opposto&quot; (in realta&#039; posso farlo perche&#039; ho il culo che il banco PORTA e&#039; a 8 bit, senno&#039; mi appendevo al tram!) del numero che rappresenta il banco porte PORTA, quindi 255-numero
#define      N6 32       //127-(a+f+e+g+c)
#define      N7 15       //127-(a+b+c)
#define      N8  0      //127-(a+b+c+d+e+f+g)
#define      N9  4      //127-(a+b+c+d+f+g)

const unsigned char dispnum[]={N0,N1,N2,N3,N4,N5,N6,N7,N8,N9};
int actdisplay=0;            //va da 0 a 3, decide quale display deve essere acceso dei 4.
int muxcount=0;    //contatore multiplex, a 5 si cambia actdisplay, ogni aggiornamento dura 1ms
int counterh=0;    //contatore che tiene memoria dell&#039;ora corrente
int counterm=0;    //contatore che tiene memoria del minuto corrente
int result=0;      //variabile che tiene memoria del numero da stampare a video
int count=0;                 //contatore che tiene memoria di quante vole muxcount cambi, per poter calcolare i secondi
int seconds=0;               //variabile che contiene il valore dei secondi trascorsi, serve ad aggiornare i minuti

//prototypes:

void main(void);
void interrupt ISR(void);
void settings(void);

//end prototypes

//Function:

void settings(void)
    {
             TRISA=0b11100000;    //imposto le porte tristato del banco porte A con input ai bit 5,6,7
             TRISB=0b10000000;    //imposto le porte tristato del banco porte B con input al bit 7
             OPTION=0b11000010;   //option_reg, imposto prescaler e assegno a timer0 prescaler 1/8
             INTCON=0b10100000;   //interrupt config, imposto timer0 attivo, gestione interrupt GIE attivo
             TMR0=133;            //valore iniziale timer0, per ottenere interrupt ogni 1ms (ho messo anche i 2 cicli di impostazione del prescaler, nel conto. Sarebbe stato 131, il risultato!)
    }
    


E qui il Main (una cosa: i fuses sono commentati perche&#039; li setto da MPLAB, pero&#039; sono gli stessi identici delle tue lezioni, tranne l&#039;ocillatore interno!)

#include 



//__CONFIG ( FOSC &amp; WDTDIS &amp; PWRTEN &amp; BORDIS &amp; LVPDIS &amp; UNPROTECT );

//CONFIG=0b10000100010000;



/*bit13: Flash program memory code protection OFF 

&#124; bit12-9: Unimplemented: read as &quot;0&quot;

&#124; bit8:  Data Code protection OFF

&#124; bit7:  Low Voltage programming OFF

&#124; bit6:  Brown Out OFF

&#124; bit5:  RA5/MCLR/Vpp pin set digital input

&#124; bit3:  Power Up Timer ON

&#124; bit2:  Watch Dog Timer OFF

&#124; bit4-1-0:  tre bit per settare l&#039;oscillatore: settato interno, pin di CLOCKIN e CLKOUT settati come I/O ports

*/

#define XTAL_FREQ 4MHZ

#include &quot;delay.c&quot;

#include &quot;settings.h&quot;



void main(void)

 {

         settings();                //carico le impostazioni dell&#039;header

         while(1)

              {

                         if(BTNH1==0)   //if BTNH1 pressed

                           {

                                 DelayMs(100);     //anti-bounce delay

                                 if(BTNH1==0)

                                   {

                                          if(counterh==23)

                                            {

                                                 counterh=0;

                                            }

                                          else

                                            {

                                                 counterh++;

                                            }

                                   }

                           }

                         if(BTNH2==0)

                         {

                                 DelayMs(100);

                                 if(BTNH2==0)

                                   {

                                          if(counterh==0)

                                            {

                                                 counterh=23;

                                            }

                                          else

                                            {

                                                 counterh--;

                                            }

                                   }

                         }

                         if(BTNM1==0)   //if BTNM1 pressed

                           {

                                 DelayMs(100);     //anti-bounce delay

                                 if(BTNM1==0)

                                   {

                                          if(counterm==59)

                                            {

                                                 counterm=0;

                                                 seconds=0;                                                

                                            }

                                          else

                                            {

                                                 counterm++;

                                                 seconds=0;

                                            }

                                   }

                           }

                          if(BTNM2==0)

                         {

                                 DelayMs(100);

                                 if(BTNM2==0)

                                   {

                                          if(counterm==0)

                                            {

                                                 counterm=59;

                                                 seconds=0;

                                            }

                                          else

                                            {

                                                 counterm--;

                                                 seconds=0;

                                            }

                                   }

                         }

              }//fine while

 }//fine main

 

//inizio Interrupt Routine Services:



void interrupt ISR(void)

    {

             //avviene ogni 1ms, come da prescaler

             if(T0IF)

               {

                      TMR0=133;              //resetto timer0 su valore desiderato

                      muxcount++;            //il muxcount si aggiorna ogni 1ms, lo aggiorno subito per non lasciarlo per strada

                      if(actdisplay==0)      //selezionato display delle decine delle ore

                       {

                                K1=0;								//K1, anodo relativo allo schermo interessato, acceso

								K2=1;

								K3=1;

								K4=1;

                                if(counterh3)

                                  { 

                                       actdisplay=0;

                                  }

                                dispReg=0b01111111;

                                K1=1;    //l&#039;anodo comune 
                                K2=1;    //Spengo gli schermi, ad ogni modo, per eliminare il ghosting

                                K3=1;

                                K4=1;

                                count++;

                        }//muxcount==5

					if(count==199)                //significa che e&#039; passato un secondo

                                 {

                                          count=0;

                                          seconds++;

										  if(seconds&gt;59)

                                            {

							                      counterm++;

												  if(counterm&gt;59)

												    {

													        counterh++;

															if(counterh&gt;23)

                                                             {

                                                                      counterh=0;

                                                             }

															counterm=0;

													}

											    seconds=0;

                                            }//minutes!!

									DOT=DOT^1;

                                 }//count==199

                      if(count==99)

                        {

                                DOT=DOT^1;

                        }

                  T0IF=0;    //resetto il flag altrimenti non intercetto piu&#039; l&#039;interrupt

               }//end T0IF

    }//fine ISR






Ti sarei infinitamente grato se mi dessi anche solo una strada per uscirne! C&#039;e&#039; un qualche inghippo fessissimo e non riesco a trovarlo!</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni!<br />
Dopo aver fatto lampeggiare il LEDdino (anche grazie al tuo aiuto XD) ho cominciato a costruirmi un orologio, tutto bene, pero&#8217; il display fa &#8220;cose strane&#8221;.<br />
Le cifre le ho costruite bene (ho fatto dei programmi ad hoc per verificare che fossero &#8220;giuste&#8221;), e l&#8217;interrupt pure dovrebbe essere fatto bene, perche&#8217; il DOT (i due puntini che separano minuti dalle ora) lampeggiano con un periodo di un secondo, come da programmazione!<br />
Le cose strane sono che praticamente le cifre non si leggono&#8230; E&#8217; come se il PIC (16F628A, con clock interno di 4Mhz)  non riuscisse a controllare gli anodi comuni, tenendone solo uno acceso!<br />
Poi la quarta cifra(relativa a K4) resta sempre spenta, ma credo che sia il transistor mio ad essere rotto, col tester non c&#8217;era continuita&#8217;, in funzione&#8230;<br />
Qui c&#8217;e&#8217; l&#8217;header:</p>
<p>/*<br />
*    SETTINGS.H<br />
*    per orologio digitale autocostruito su<br />
*    PIC16F628, oscillatore interno a 4MHz<br />
*    26/01/2011<br />
*    Copirait di Armando Bond (bobbisixkiller@libero.it)<br />
*/</p>
<p>#define   BTNH1 RB7<br />
#define   BTNH2 RA5   //cosi&#8217; il MCLR e&#8217; input<br />
#define   BTNM1 RA6<br />
#define   BTNM2 RA7<br />
/*<br />
* a&#8212;&gt;RB6<br />
* b&#8212;&gt;RB5<br />
* c&#8212;&gt;RB4<br />
* d&#8212;&gt;RB3<br />
* e&#8212;&gt;RB2<br />
* f&#8212;&gt;RB1<br />
* g&#8212;&gt;RB0<br />
*/<br />
#define     DOT RA4<br />
#define      K1 RA0    //Catodi comuni (Anodi, nel caso usi un display ad anodo comune : D  )<br />
#define      K2 RA1<br />
#define      K3 RA2<br />
#define      K4 RA3<br />
#define dispReg PORTB  //Registro delle PORTE tristato B: ho collegato tutti i segmenti dei display a pin del banco porte B<br />
#define       a 64     //Ogni segmento lo associo al numero del bit associato nel registro PORTB<br />
#define       b 32<br />
#define       c 16<br />
#define       d 8<br />
#define       e 4<br />
#define       f 2<br />
#define       g 1<br />
#define      N0 1      //128-(a+b+c+d+e+f)   //Da qui in poi specifico ogni numero da quale segmento deve essere<br />
#define      N1 79       //127-(b+c)           //acceso, semplicemente sommando i segmenti (sono in realta&#8217; numeri,<br />
#define      N2 18       //123-(a+b+g+e+d)     // come dichiarato prima).<br />
#define      N3  6      //126-(a+b+g+c+d)<br />
#define      N4 76       //127-(g+f+b+c)<br />
#define      N5 36       //127-(a+f+g+c+d)     // l&#8217;anodo comune deve fare lo &#8220;opposto&#8221; (in realta&#8217; posso farlo perche&#8217; ho il culo che il banco PORTA e&#8217; a 8 bit, senno&#8217; mi appendevo al tram!) del numero che rappresenta il banco porte PORTA, quindi 255-numero<br />
#define      N6 32       //127-(a+f+e+g+c)<br />
#define      N7 15       //127-(a+b+c)<br />
#define      N8  0      //127-(a+b+c+d+e+f+g)<br />
#define      N9  4      //127-(a+b+c+d+f+g)</p>
<p>const unsigned char dispnum[]={N0,N1,N2,N3,N4,N5,N6,N7,N8,N9};<br />
int actdisplay=0;            //va da 0 a 3, decide quale display deve essere acceso dei 4.<br />
int muxcount=0;    //contatore multiplex, a 5 si cambia actdisplay, ogni aggiornamento dura 1ms<br />
int counterh=0;    //contatore che tiene memoria dell&#8217;ora corrente<br />
int counterm=0;    //contatore che tiene memoria del minuto corrente<br />
int result=0;      //variabile che tiene memoria del numero da stampare a video<br />
int count=0;                 //contatore che tiene memoria di quante vole muxcount cambi, per poter calcolare i secondi<br />
int seconds=0;               //variabile che contiene il valore dei secondi trascorsi, serve ad aggiornare i minuti</p>
<p>//prototypes:</p>
<p>void main(void);<br />
void interrupt ISR(void);<br />
void settings(void);</p>
<p>//end prototypes</p>
<p>//Function:</p>
<p>void settings(void)<br />
    {<br />
             TRISA=0b11100000;    //imposto le porte tristato del banco porte A con input ai bit 5,6,7<br />
             TRISB=0b10000000;    //imposto le porte tristato del banco porte B con input al bit 7<br />
             OPTION=0b11000010;   //option_reg, imposto prescaler e assegno a timer0 prescaler 1/8<br />
             INTCON=0b10100000;   //interrupt config, imposto timer0 attivo, gestione interrupt GIE attivo<br />
             TMR0=133;            //valore iniziale timer0, per ottenere interrupt ogni 1ms (ho messo anche i 2 cicli di impostazione del prescaler, nel conto. Sarebbe stato 131, il risultato!)<br />
    }</p>
<p>E qui il Main (una cosa: i fuses sono commentati perche&#8217; li setto da MPLAB, pero&#8217; sono gli stessi identici delle tue lezioni, tranne l&#8217;ocillatore interno!)</p>
<p>#include </p>
<p>//__CONFIG ( FOSC &amp; WDTDIS &amp; PWRTEN &amp; BORDIS &amp; LVPDIS &amp; UNPROTECT );</p>
<p>//CONFIG=0b10000100010000;</p>
<p>/*bit13: Flash program memory code protection OFF </p>
<p>| bit12-9: Unimplemented: read as &#8220;0&#8243;</p>
<p>| bit8:  Data Code protection OFF</p>
<p>| bit7:  Low Voltage programming OFF</p>
<p>| bit6:  Brown Out OFF</p>
<p>| bit5:  RA5/MCLR/Vpp pin set digital input</p>
<p>| bit3:  Power Up Timer ON</p>
<p>| bit2:  Watch Dog Timer OFF</p>
<p>| bit4-1-0:  tre bit per settare l&#8217;oscillatore: settato interno, pin di CLOCKIN e CLKOUT settati come I/O ports</p>
<p>*/</p>
<p>#define XTAL_FREQ 4MHZ</p>
<p>#include &#8220;delay.c&#8221;</p>
<p>#include &#8220;settings.h&#8221;</p>
<p>void main(void)</p>
<p> {</p>
<p>         settings();                //carico le impostazioni dell&#8217;header</p>
<p>         while(1)</p>
<p>              {</p>
<p>                         if(BTNH1==0)   //if BTNH1 pressed</p>
<p>                           {</p>
<p>                                 DelayMs(100);     //anti-bounce delay</p>
<p>                                 if(BTNH1==0)</p>
<p>                                   {</p>
<p>                                          if(counterh==23)</p>
<p>                                            {</p>
<p>                                                 counterh=0;</p>
<p>                                            }</p>
<p>                                          else</p>
<p>                                            {</p>
<p>                                                 counterh++;</p>
<p>                                            }</p>
<p>                                   }</p>
<p>                           }</p>
<p>                         if(BTNH2==0)</p>
<p>                         {</p>
<p>                                 DelayMs(100);</p>
<p>                                 if(BTNH2==0)</p>
<p>                                   {</p>
<p>                                          if(counterh==0)</p>
<p>                                            {</p>
<p>                                                 counterh=23;</p>
<p>                                            }</p>
<p>                                          else</p>
<p>                                            {</p>
<p>                                                 counterh&#8211;;</p>
<p>                                            }</p>
<p>                                   }</p>
<p>                         }</p>
<p>                         if(BTNM1==0)   //if BTNM1 pressed</p>
<p>                           {</p>
<p>                                 DelayMs(100);     //anti-bounce delay</p>
<p>                                 if(BTNM1==0)</p>
<p>                                   {</p>
<p>                                          if(counterm==59)</p>
<p>                                            {</p>
<p>                                                 counterm=0;</p>
<p>                                                 seconds=0;                                                </p>
<p>                                            }</p>
<p>                                          else</p>
<p>                                            {</p>
<p>                                                 counterm++;</p>
<p>                                                 seconds=0;</p>
<p>                                            }</p>
<p>                                   }</p>
<p>                           }</p>
<p>                          if(BTNM2==0)</p>
<p>                         {</p>
<p>                                 DelayMs(100);</p>
<p>                                 if(BTNM2==0)</p>
<p>                                   {</p>
<p>                                          if(counterm==0)</p>
<p>                                            {</p>
<p>                                                 counterm=59;</p>
<p>                                                 seconds=0;</p>
<p>                                            }</p>
<p>                                          else</p>
<p>                                            {</p>
<p>                                                 counterm&#8211;;</p>
<p>                                                 seconds=0;</p>
<p>                                            }</p>
<p>                                   }</p>
<p>                         }</p>
<p>              }//fine while</p>
<p> }//fine main</p>
<p>//inizio Interrupt Routine Services:</p>
<p>void interrupt ISR(void)</p>
<p>    {</p>
<p>             //avviene ogni 1ms, come da prescaler</p>
<p>             if(T0IF)</p>
<p>               {</p>
<p>                      TMR0=133;              //resetto timer0 su valore desiderato</p>
<p>                      muxcount++;            //il muxcount si aggiorna ogni 1ms, lo aggiorno subito per non lasciarlo per strada</p>
<p>                      if(actdisplay==0)      //selezionato display delle decine delle ore</p>
<p>                       {</p>
<p>                                K1=0;								//K1, anodo relativo allo schermo interessato, acceso</p>
<p>								K2=1;</p>
<p>								K3=1;</p>
<p>								K4=1;</p>
<p>                                if(counterh3)</p>
<p>                                  { </p>
<p>                                       actdisplay=0;</p>
<p>                                  }</p>
<p>                                dispReg=0b01111111;</p>
<p>                                K1=1;    //l&#8217;anodo comune<br />
                                K2=1;    //Spengo gli schermi, ad ogni modo, per eliminare il ghosting</p>
<p>                                K3=1;</p>
<p>                                K4=1;</p>
<p>                                count++;</p>
<p>                        }//muxcount==5</p>
<p>					if(count==199)                //significa che e&#8217; passato un secondo</p>
<p>                                 {</p>
<p>                                          count=0;</p>
<p>                                          seconds++;</p>
<p>										  if(seconds&gt;59)</p>
<p>                                            {</p>
<p>							                      counterm++;</p>
<p>												  if(counterm&gt;59)</p>
<p>												    {</p>
<p>													        counterh++;</p>
<p>															if(counterh&gt;23)</p>
<p>                                                             {</p>
<p>                                                                      counterh=0;</p>
<p>                                                             }</p>
<p>															counterm=0;</p>
<p>													}</p>
<p>											    seconds=0;</p>
<p>                                            }//minutes!!</p>
<p>									DOT=DOT^1;</p>
<p>                                 }//count==199</p>
<p>                      if(count==99)</p>
<p>                        {</p>
<p>                                DOT=DOT^1;</p>
<p>                        }</p>
<p>                  T0IF=0;    //resetto il flag altrimenti non intercetto piu&#8217; l&#8217;interrupt</p>
<p>               }//end T0IF</p>
<p>    }//fine ISR</p>
<p>Ti sarei infinitamente grato se mi dessi anche solo una strada per uscirne! C&#8217;e&#8217; un qualche inghippo fessissimo e non riesco a trovarlo!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10492</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 01 Mar 2011 13:42:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10492</guid>
		<description>Beh per me è sicuramente più difficile riparare un lcd! Quindi se mi capita, so a chi rivolgermi!</description>
		<content:encoded><![CDATA[<p>Beh per me è sicuramente più difficile riparare un lcd! Quindi se mi capita, so a chi rivolgermi!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Video Lab</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10489</link>
		<dc:creator>Video Lab</dc:creator>
		<pubDate>Tue, 01 Mar 2011 11:50:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10489</guid>
		<description>Ok ora mi è tutto un pochino più chiaro...
L&#039;errore che mi da non fa nessun riferimento al codice, dice solo build failed...
Riprovo eliminando la funzione di ritardo dalla funzione interupt, scopiazzando il tuo...
E&#039; più facile riparare un tv Lcd ;-) 
Grazie per i consigli</description>
		<content:encoded><![CDATA[<p>Ok ora mi è tutto un pochino più chiaro&#8230;<br />
L&#8217;errore che mi da non fa nessun riferimento al codice, dice solo build failed&#8230;<br />
Riprovo eliminando la funzione di ritardo dalla funzione interupt, scopiazzando il tuo&#8230;<br />
E&#8217; più facile riparare un tv Lcd ;-)<br />
Grazie per i consigli</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10488</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 01 Mar 2011 11:37:31 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10488</guid>
		<description>Altro (o)rrore sta nel decremento di mux. Il decremento unario non si fa mettendo l&#039;uguaglianza.
O scrivi:
mux=mux-1;
o scrivi:
mux--;</description>
		<content:encoded><![CDATA[<p>Altro (o)rrore sta nel decremento di mux. Il decremento unario non si fa mettendo l&#8217;uguaglianza.<br />
O scrivi:<br />
mux=mux-1;<br />
o scrivi:<br />
mux&#8211;;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10487</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 01 Mar 2011 11:31:20 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10487</guid>
		<description>Se scrivevi l&#039;errore era tutto più facile. Comunque da un primo sguardo... ti do solo un indizio: non confondere il bit di abilitazione con il flag di interrupt.
Poi: guarda che l&#039;interrupt su RB0/INT avviene per cambio di stato, non per pulsante premuto. Quindi sia che passi da 1 a 0 che passi da 0 a 1 l&#039;interrupt scatta. Tieni conto pure dei rimbalzi del pulsante e vedi che bel casino che ti succede se non gestisci correttamente il tutto. In aggiunta ti ricordo che, se vuoi gestire l&#039;antirimbalzo nell&#039;interrupt, è meglio non usare i delay. Perchè l&#039;interrupt non deve richiamare altre funzioni e perchè mettere una routine di ritardo in una routine di interrupt è una cosa che i veri programmatori non fanno.</description>
		<content:encoded><![CDATA[<p>Se scrivevi l&#8217;errore era tutto più facile. Comunque da un primo sguardo&#8230; ti do solo un indizio: non confondere il bit di abilitazione con il flag di interrupt.<br />
Poi: guarda che l&#8217;interrupt su RB0/INT avviene per cambio di stato, non per pulsante premuto. Quindi sia che passi da 1 a 0 che passi da 0 a 1 l&#8217;interrupt scatta. Tieni conto pure dei rimbalzi del pulsante e vedi che bel casino che ti succede se non gestisci correttamente il tutto. In aggiunta ti ricordo che, se vuoi gestire l&#8217;antirimbalzo nell&#8217;interrupt, è meglio non usare i delay. Perchè l&#8217;interrupt non deve richiamare altre funzioni e perchè mettere una routine di ritardo in una routine di interrupt è una cosa che i veri programmatori non fanno.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Video Lab</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10486</link>
		<dc:creator>Video Lab</dc:creator>
		<pubDate>Tue, 01 Mar 2011 11:31:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10486</guid>
		<description>Nella funzione sopra postata ho inserito erroneamente INTE, nel codice ho inserito INTF</description>
		<content:encoded><![CDATA[<p>Nella funzione sopra postata ho inserito erroneamente INTE, nel codice ho inserito INTF</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Video Lab</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10485</link>
		<dc:creator>Video Lab</dc:creator>
		<pubDate>Tue, 01 Mar 2011 10:46:58 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10485</guid>
		<description>Eccomi qui di nuovo... ho un problema con una parte di codice.
Mi spiego meglio, ho realizzato un contatore a 2 cifre, con qualche variante del tuo, visto che mi interessa imparare, e non fare copia ed incolla ;-)
Ho modificato il codice inserendo 2 led che si accendono ad ogni pressione dei tasti di incremento e di decremento. Ho inserito 3 pulsanti uno per incrementare, uno per decrementare e uno per far accendere  i display solo per un tempo di 2 sec. Ho deciso di usare l&#039;interupt sul pin RB0 per far accendere i display (questa scelta l&#039;ho fatta per imparare ad usare questa funzione) 
Però MpLab mi da un errore di compilazione, e non lo compila.. se elimino la funzione che gestisce interupt allora lo compila correttamente... però non capisco in cosa sbaglio..
Di seguito come ho impostato i registri nel file settings.h
unsigned int  mux=200; // contatore multiplex
unsigned char dec=0;
unsigned char unit=0;
unsigned char counter=22;

// prototipi funzioni
void main(void);
void settings(void);
void interrupt isr(void);

void settings(void)
	{
     // imposto i registri tristato 
    TRISA=0b00000000;
	TRISB=0b00000001; //setto RB0 ad 1 per poter ricevere l&#039;interupt dal bottone display
	TRISC=0b00000000;
	TRISD=0b00001100;// RD0 ed RD1 li uso per i due led mentre RD2 e RD3 per i bottoni di incremento e decremento
	TRISE=0b00000000;
	// Impostazione del registro OPTION (Pag.16)
	// per ottenere un interrupt ogni millisecondo con un quarzo da 20MHz
	// bisogna impostare il prescaler a 31 e inizializzare timer0 a 100
    OPTION=0b11000000;
	// 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 (pag.17), attivo soltanto l&#039;interrupt su RB0, la GIE la attivo dal main dopo
    INTCON=0b10010000;
    // bit 0 -&gt; RBIF		Flag Interrupt su porte B (variabile RBIF)
    // bit 1 -&gt; INTF		Flag Interrupt su porta RB0/INT (variabile INTF)
    // bit 2 -&gt; TMR0IF		Flag Interrupt su Timer0 (variabile T0IF oppure TMR0IF)
    // bit 3 -&gt; RBIE		Interrupt su porte B 0=disattivato
    // bit 4 -&gt; INTE		Interrupt su porta RB0/INT 0=disattivato
    // bit 5 -&gt; TMR0IE		Interrupt su Timer0 1=attivato
    // bit 6 -&gt; PEIE		Interrupt di periferica 0=disattivatoo
    // bit 7 -&gt; GIE			Gestione Globale Interrupts 1=attivata
	
	}
La funzione interupt che ho scritto io è la seguente
void interrupt isr(void)
{
		if(INTE)
			{
			mux=200; //inizializzo il contatore
			dec=counter/10; //micalcolo le decine
			unit=counter-(dec*10); //mi calcolo le unità
			while(mux&gt;0) // qui comincio il ciclo regolato da contatore mux
				{
				KATU=OFF; //spengo il catodo delle unità
				KATD=ON; //accendo il catodo delle decine
				dispReg=dispnum[dec]; visualizzo la decina
				DelayMs(5); // ritardo di 5ms
				KATD=OFF; //spengo il catodo delle decine
				KATU=ON; // accendo il catodo delle unità
				dispReg=dispnum[unit]; // visualizzo le unità
				DelayMs(5); // ritardo 5ms
				mux=mux--; //decremento il contatore
				}
			dispReg=0; //spengo il display a fine ciclo
			}
		INTE=0;	//resetto il flag dell&#039;interupt su RB0
}
Non capisco in cosa sbaglio...
Saluti e grazie 
Nino</description>
		<content:encoded><![CDATA[<p>Eccomi qui di nuovo&#8230; ho un problema con una parte di codice.<br />
Mi spiego meglio, ho realizzato un contatore a 2 cifre, con qualche variante del tuo, visto che mi interessa imparare, e non fare copia ed incolla ;-)<br />
Ho modificato il codice inserendo 2 led che si accendono ad ogni pressione dei tasti di incremento e di decremento. Ho inserito 3 pulsanti uno per incrementare, uno per decrementare e uno per far accendere  i display solo per un tempo di 2 sec. Ho deciso di usare l&#8217;interupt sul pin RB0 per far accendere i display (questa scelta l&#8217;ho fatta per imparare ad usare questa funzione)<br />
Però MpLab mi da un errore di compilazione, e non lo compila.. se elimino la funzione che gestisce interupt allora lo compila correttamente&#8230; però non capisco in cosa sbaglio..<br />
Di seguito come ho impostato i registri nel file settings.h<br />
unsigned int  mux=200; // contatore multiplex<br />
unsigned char dec=0;<br />
unsigned char unit=0;<br />
unsigned char counter=22;</p>
<p>// prototipi funzioni<br />
void main(void);<br />
void settings(void);<br />
void interrupt isr(void);</p>
<p>void settings(void)<br />
	{<br />
     // imposto i registri tristato<br />
    TRISA=0b00000000;<br />
	TRISB=0b00000001; //setto RB0 ad 1 per poter ricevere l&#8217;interupt dal bottone display<br />
	TRISC=0b00000000;<br />
	TRISD=0b00001100;// RD0 ed RD1 li uso per i due led mentre RD2 e RD3 per i bottoni di incremento e decremento<br />
	TRISE=0b00000000;<br />
	// Impostazione del registro OPTION (Pag.16)<br />
	// per ottenere un interrupt ogni millisecondo con un quarzo da 20MHz<br />
	// bisogna impostare il prescaler a 31 e inizializzare timer0 a 100<br />
    OPTION=0b11000000;<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 (pag.17), attivo soltanto l&#8217;interrupt su RB0, la GIE la attivo dal main dopo<br />
    INTCON=0b10010000;<br />
    // bit 0 -&gt; RBIF		Flag Interrupt su porte B (variabile RBIF)<br />
    // bit 1 -&gt; INTF		Flag Interrupt su porta RB0/INT (variabile INTF)<br />
    // bit 2 -&gt; TMR0IF		Flag Interrupt su Timer0 (variabile T0IF oppure TMR0IF)<br />
    // bit 3 -&gt; RBIE		Interrupt su porte B 0=disattivato<br />
    // bit 4 -&gt; INTE		Interrupt su porta RB0/INT 0=disattivato<br />
    // bit 5 -&gt; TMR0IE		Interrupt su Timer0 1=attivato<br />
    // bit 6 -&gt; PEIE		Interrupt di periferica 0=disattivatoo<br />
    // bit 7 -&gt; GIE			Gestione Globale Interrupts 1=attivata</p>
<p>	}<br />
La funzione interupt che ho scritto io è la seguente<br />
void interrupt isr(void)<br />
{<br />
		if(INTE)<br />
			{<br />
			mux=200; //inizializzo il contatore<br />
			dec=counter/10; //micalcolo le decine<br />
			unit=counter-(dec*10); //mi calcolo le unità<br />
			while(mux&gt;0) // qui comincio il ciclo regolato da contatore mux<br />
				{<br />
				KATU=OFF; //spengo il catodo delle unità<br />
				KATD=ON; //accendo il catodo delle decine<br />
				dispReg=dispnum[dec]; visualizzo la decina<br />
				DelayMs(5); // ritardo di 5ms<br />
				KATD=OFF; //spengo il catodo delle decine<br />
				KATU=ON; // accendo il catodo delle unità<br />
				dispReg=dispnum[unit]; // visualizzo le unità<br />
				DelayMs(5); // ritardo 5ms<br />
				mux=mux&#8211;; //decremento il contatore<br />
				}<br />
			dispReg=0; //spengo il display a fine ciclo<br />
			}<br />
		INTE=0;	//resetto il flag dell&#8217;interupt su RB0<br />
}<br />
Non capisco in cosa sbaglio&#8230;<br />
Saluti e grazie<br />
Nino</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10481</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 01 Mar 2011 04:35:05 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10481</guid>
		<description>C&#039;è un articolo che ho scritto sull&#039;1-wire. Quello è un esempio. Altra valida alternativa è sfruttare il modulo CCP nella configurazione Capture, cosa di cui non ho parlato.</description>
		<content:encoded><![CDATA[<p>C&#8217;è un articolo che ho scritto sull&#8217;1-wire. Quello è un esempio. Altra valida alternativa è sfruttare il modulo CCP nella configurazione Capture, cosa di cui non ho parlato.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Video Lab</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10479</link>
		<dc:creator>Video Lab</dc:creator>
		<pubDate>Mon, 28 Feb 2011 23:13:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10479</guid>
		<description>Chiedo scusa....... 
Nella fretta di fare le varie prove... non mi sono accorto dell&#039;ultima parte dell&#039;articolo.... 
Ancora grazie per lo splendido lavoro che stai facendo.

Una domanda che non c&#039;entra nulla con i display a segmenti... come si fa a far acquisire al pic un treno di impulsi proveniente da un ricevitore infrarossi tipo quello dei televisori, in modo da poterlo poi replicare.
Eventualmente sarebbe una bella lezione ;-)
Comunque grazie ancora per tutto, in poco tempo grazie alle tue lezioni sono riuscito a sfruttare meglio gli studi da autodidatta che avevo fatto sul C, applicarlo sui Pic è più divertente e gratificante .
Nino</description>
		<content:encoded><![CDATA[<p>Chiedo scusa&#8230;&#8230;.<br />
Nella fretta di fare le varie prove&#8230; non mi sono accorto dell&#8217;ultima parte dell&#8217;articolo&#8230;.<br />
Ancora grazie per lo splendido lavoro che stai facendo.</p>
<p>Una domanda che non c&#8217;entra nulla con i display a segmenti&#8230; come si fa a far acquisire al pic un treno di impulsi proveniente da un ricevitore infrarossi tipo quello dei televisori, in modo da poterlo poi replicare.<br />
Eventualmente sarebbe una bella lezione ;-)<br />
Comunque grazie ancora per tutto, in poco tempo grazie alle tue lezioni sono riuscito a sfruttare meglio gli studi da autodidatta che avevo fatto sul C, applicarlo sui Pic è più divertente e gratificante .<br />
Nino</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10472</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 28 Feb 2011 19:42:35 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10472</guid>
		<description>Finisci di leggere l&#039;articolo, vedi che c&#039;è scritto</description>
		<content:encoded><![CDATA[<p>Finisci di leggere l&#8217;articolo, vedi che c&#8217;è scritto</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Video Lab</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10471</link>
		<dc:creator>Video Lab</dc:creator>
		<pubDate>Mon, 28 Feb 2011 19:16:23 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10471</guid>
		<description>Saluti a tutti !!!
Grazie ancora infinitamente per queste lezioni... sono stupende e abbastanza semplici da capire.
Una curiosità, come adrebbe settata la PORTB per pilotare un display ad ANODO comune ?
Oppure si setta in egual modo e si utilizzano dei transistor per il pilotaggio?
Grazie ancora buon lavoro.
Nino</description>
		<content:encoded><![CDATA[<p>Saluti a tutti !!!<br />
Grazie ancora infinitamente per queste lezioni&#8230; sono stupende e abbastanza semplici da capire.<br />
Una curiosità, come adrebbe settata la PORTB per pilotare un display ad ANODO comune ?<br />
Oppure si setta in egual modo e si utilizzano dei transistor per il pilotaggio?<br />
Grazie ancora buon lavoro.<br />
Nino</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10171</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 16 Feb 2011 05:35:17 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10171</guid>
		<description>Ah! ora ho capito cosa voleva dire... Di quell&#039;integrato ne parlai già tempo fa sul gruppo facebook. Ne comprai pure un paio proprio per fare un progetto del genere e poi non ho piu avuto tempo. Oltre al modello SPI c&#039;è anche un modello che si pilota con un segnale &quot;custom&quot; nel senso che non si deve ricorrere ad un protocollo ben preciso. Comunque su ebay si trovano a pochi spiccioli.</description>
		<content:encoded><![CDATA[<p>Ah! ora ho capito cosa voleva dire&#8230; Di quell&#8217;integrato ne parlai già tempo fa sul gruppo facebook. Ne comprai pure un paio proprio per fare un progetto del genere e poi non ho piu avuto tempo. Oltre al modello SPI c&#8217;è anche un modello che si pilota con un segnale &#8220;custom&#8221; nel senso che non si deve ricorrere ad un protocollo ben preciso. Comunque su ebay si trovano a pochi spiccioli.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: marcolino7</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10163</link>
		<dc:creator>marcolino7</dc:creator>
		<pubDate>Tue, 15 Feb 2011 23:25:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10163</guid>
		<description>Salve Giovanni,
credo diaver trovato quello che cercavo e volevo condividerlo con Lei e i lettori.
http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf
Si tratta di un driver integrato della Maxim. Pilota fino a 8 display in multiplex ed è controllabile via Interfaccia SPI. Anche la luminosità è controllabile via Software. Non necessita di componenti esterni se non di una resistenza che determina la corrente massima dei led. Ora ne vado a caccia e faccio delle prove.

Saluto e ringrazio per l&#039;attenzione.</description>
		<content:encoded><![CDATA[<p>Salve Giovanni,<br />
credo diaver trovato quello che cercavo e volevo condividerlo con Lei e i lettori.<br />
<a href="http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf" rel="nofollow">http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf</a><br />
Si tratta di un driver integrato della Maxim. Pilota fino a 8 display in multiplex ed è controllabile via Interfaccia SPI. Anche la luminosità è controllabile via Software. Non necessita di componenti esterni se non di una resistenza che determina la corrente massima dei led. Ora ne vado a caccia e faccio delle prove.</p>
<p>Saluto e ringrazio per l&#8217;attenzione.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: marcolino7</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10156</link>
		<dc:creator>marcolino7</dc:creator>
		<pubDate>Tue, 15 Feb 2011 20:57:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10156</guid>
		<description>Salve,
Mi scusi per le scarse informazioni ma ieri sera era tardi. L&#039;oggetto acquistato monta un processore ATMega, e si pilota via UART senza tanti problemi. http://www.sparkfun.com/products/9766, ma come le dicevo i display sono troppo piccoli, e volevo ricrearmene uno.

Pensandoci mi era già balenata l&#039;idea di pilotare i transistor in PWM. Sui 4 piedini di controllo dei transistor, dovrei generare dei treni di impulsi PWM per la durata del multiplex. Dicendo che il multiplex dura 5ms, in quel tempo dovrei mandare una decina di impulsi PWM con il DutyCycle desiderato. Pensavo di usare un PIC con 4 uscite PWM native come il 16F1827 per le 4 basi dei transistor, 7 uscite per i segmenti, una per il punto e una per l&#039;ingresso UART.

Mi e Le chiedevo invece, se non esistesse un driver BCD-&gt;7 Segmenti che potesse anche variare la corrente in uscita verso il display a seconda di un ingresso analogico o digitale, oppure un integrato che contenesse 7 generatori di corrente costante variabile sempre in analogico o digitale.

Ringrazio in anticipo e La saluto.</description>
		<content:encoded><![CDATA[<p>Salve,<br />
Mi scusi per le scarse informazioni ma ieri sera era tardi. L&#8217;oggetto acquistato monta un processore ATMega, e si pilota via UART senza tanti problemi. <a href="http://www.sparkfun.com/products/9766" rel="nofollow">http://www.sparkfun.com/products/9766</a>, ma come le dicevo i display sono troppo piccoli, e volevo ricrearmene uno.</p>
<p>Pensandoci mi era già balenata l&#8217;idea di pilotare i transistor in PWM. Sui 4 piedini di controllo dei transistor, dovrei generare dei treni di impulsi PWM per la durata del multiplex. Dicendo che il multiplex dura 5ms, in quel tempo dovrei mandare una decina di impulsi PWM con il DutyCycle desiderato. Pensavo di usare un PIC con 4 uscite PWM native come il 16F1827 per le 4 basi dei transistor, 7 uscite per i segmenti, una per il punto e una per l&#8217;ingresso UART.</p>
<p>Mi e Le chiedevo invece, se non esistesse un driver BCD-&gt;7 Segmenti che potesse anche variare la corrente in uscita verso il display a seconda di un ingresso analogico o digitale, oppure un integrato che contenesse 7 generatori di corrente costante variabile sempre in analogico o digitale.</p>
<p>Ringrazio in anticipo e La saluto.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10137</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 15 Feb 2011 04:05:25 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10137</guid>
		<description>Non ho la minima idea di cosa ha comprato e sinceramente non riesco nemmeno a immaginare come sono fatte queste schede e come si pilotano. Direi che le informazioni al riguardo sono nulle... lei che dice? In genere quando vi sono sulle schede integrati che fanno tutto da sè, questi integrati (che pilotano i led a corrente costante e vengono pilotati in I2C o in SPI o con l&#039;UART) hanno una sola resistenza di &quot;programmazione&quot; che imposta la corrente che deve scorrere nei led. Se non c&#039;è un integrato &quot;intelligente&quot; a comandare i display, la luminosità si potrebbe variare pilotando in PWM le basi dei transistor che controllano i display, ma dovendoli pilotare pure in multiplex non ho idea se ne venga fuori qualcosa di buono o meno. Bisogna provare.</description>
		<content:encoded><![CDATA[<p>Non ho la minima idea di cosa ha comprato e sinceramente non riesco nemmeno a immaginare come sono fatte queste schede e come si pilotano. Direi che le informazioni al riguardo sono nulle&#8230; lei che dice? In genere quando vi sono sulle schede integrati che fanno tutto da sè, questi integrati (che pilotano i led a corrente costante e vengono pilotati in I2C o in SPI o con l&#8217;UART) hanno una sola resistenza di &#8220;programmazione&#8221; che imposta la corrente che deve scorrere nei led. Se non c&#8217;è un integrato &#8220;intelligente&#8221; a comandare i display, la luminosità si potrebbe variare pilotando in PWM le basi dei transistor che controllano i display, ma dovendoli pilotare pure in multiplex non ho idea se ne venga fuori qualcosa di buono o meno. Bisogna provare.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: marcolino7</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-10130</link>
		<dc:creator>marcolino7</dc:creator>
		<pubDate>Mon, 14 Feb 2011 20:45:20 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-10130</guid>
		<description>Salve Giovanni e complimenti per l&#039;ottimo lavoro.
Premetto che non programmi in C ma il Mikrobasic, ma prendo sempre spunto dai Suoi esempi per poi portare il codice.
Dunque ho comprato in cina delle schede con sopra dei display già saldati e collegari a una logica di controllo che accetta in ingresso dei segnali seriali per comandare i display. Tra queste possibilità si può anche variare la luminosità dei display. Visto che le dimensioni dei display di questa basetta non mi soddisfa, volevo usare dei display commerciali e ricrearmi la logica di controllo. Mi è abbastanza chiaro il codice BDC e il Multiplex, ma non ho idea di come variare la luminosità dei display.
Se potesse darmi qualche consiglio Le sarei molto grato.

Saluti</description>
		<content:encoded><![CDATA[<p>Salve Giovanni e complimenti per l&#8217;ottimo lavoro.<br />
Premetto che non programmi in C ma il Mikrobasic, ma prendo sempre spunto dai Suoi esempi per poi portare il codice.<br />
Dunque ho comprato in cina delle schede con sopra dei display già saldati e collegari a una logica di controllo che accetta in ingresso dei segnali seriali per comandare i display. Tra queste possibilità si può anche variare la luminosità dei display. Visto che le dimensioni dei display di questa basetta non mi soddisfa, volevo usare dei display commerciali e ricrearmi la logica di controllo. Mi è abbastanza chiaro il codice BDC e il Multiplex, ma non ho idea di come variare la luminosità dei display.<br />
Se potesse darmi qualche consiglio Le sarei molto grato.</p>
<p>Saluti</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-6957</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 07 Sep 2010 15:10:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-6957</guid>
		<description>Si. Col pic mandi un segnale logico alla base di un transistor, in configurazione interruttore. Puoi utilizzare pure un mosfet che ha  una caduta di tensione quasi nulla, è più veloce ecc. Il modello di transistor non posso dirtelo: bisogna vedere quanta corrente assorbe la tua ventola e quindi scegliere un transistor adatto. Essendo inoltre la ventola un carico induttivo, c&#039;è bisogno che metti un diodo in antiparallelo al motore della ventola.

Ti consiglio di leggerti l&#039;esaustivo tutorial di mauro sul controllo dei motori DC :

http://www.laurtec.it/brief-notes/101-bn0006-it-automazione-stadi-di-potenza-per-il-controllo-di-motori-dc-e-passo-passo

Il transistor poi te lo devi scegliere tu googlando un po&#039; e magari vedendo se qualcosa che hai nel cassetto può già andare bene o meno.</description>
		<content:encoded><![CDATA[<p>Si. Col pic mandi un segnale logico alla base di un transistor, in configurazione interruttore. Puoi utilizzare pure un mosfet che ha  una caduta di tensione quasi nulla, è più veloce ecc. Il modello di transistor non posso dirtelo: bisogna vedere quanta corrente assorbe la tua ventola e quindi scegliere un transistor adatto. Essendo inoltre la ventola un carico induttivo, c&#8217;è bisogno che metti un diodo in antiparallelo al motore della ventola.</p>
<p>Ti consiglio di leggerti l&#8217;esaustivo tutorial di mauro sul controllo dei motori DC :</p>
<p><a href="http://www.laurtec.it/brief-notes/101-bn0006-it-automazione-stadi-di-potenza-per-il-controllo-di-motori-dc-e-passo-passo" rel="nofollow">http://www.laurtec.it/brief-notes/101-bn0006-it-automazione-stadi-di-potenza-per-il-controllo-di-motori-dc-e-passo-passo</a></p>
<p>Il transistor poi te lo devi scegliere tu googlando un po&#8217; e magari vedendo se qualcosa che hai nel cassetto può già andare bene o meno.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Fidus</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-6956</link>
		<dc:creator>Fidus</dc:creator>
		<pubDate>Tue, 07 Sep 2010 14:48:36 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-6956</guid>
		<description>E&#039; possibile utilizzare un transistor per avviare una ventola del computer da PIC? Se si sapresti dirmi il modello di transistor?</description>
		<content:encoded><![CDATA[<p>E&#8217; possibile utilizzare un transistor per avviare una ventola del computer da PIC? Se si sapresti dirmi il modello di transistor?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: s.yari</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-5412</link>
		<dc:creator>s.yari</dc:creator>
		<pubDate>Tue, 18 May 2010 19:18:40 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-5412</guid>
		<description>allora metto 82....
ok grazie</description>
		<content:encoded><![CDATA[<p>allora metto 82&#8230;.<br />
ok grazie</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-5411</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Tue, 18 May 2010 19:10:30 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-5411</guid>
		<description>:) perchè è il mio anno di nascita. Ovviamente lo puoi pure inizializzare a zero... è un counter</description>
		<content:encoded><![CDATA[<p>:) perchè è il mio anno di nascita. Ovviamente lo puoi pure inizializzare a zero&#8230; è un counter</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: s.yari</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-5410</link>
		<dc:creator>s.yari</dc:creator>
		<pubDate>Tue, 18 May 2010 19:08:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-5410</guid>
		<description>Ciao, non mi è chiaro perchè nel main.c inizializzi la variabile &quot;counter&quot; a 77.
Grazie</description>
		<content:encoded><![CDATA[<p>Ciao, non mi è chiaro perchè nel main.c inizializzi la variabile &#8220;counter&#8221; a 77.<br />
Grazie</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Luca</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-4110</link>
		<dc:creator>Luca</dc:creator>
		<pubDate>Sat, 13 Mar 2010 11:16:23 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-4110</guid>
		<description>Perfetto, appena posso proverò ad impostare quel registro! A presto, grazie.</description>
		<content:encoded><![CDATA[<p>Perfetto, appena posso proverò ad impostare quel registro! A presto, grazie.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-4108</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 12 Mar 2010 23:26:08 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-4108</guid>
		<description>Il fatto che il problema si verifica su tutte le porte A tranne la 4 ti dovrebbe indurre in un sospetto. Prendi il datasheet del 16F628A e guarda bene qual&#039;è la differenza tra RA4 e tutte le altre porte del banco A. Osserva attentamente. Esatto! La porta RA4 è l&#039;unica a non avere una &quot;funzione speciale&quot; rispetto alle altre, è solo una porta a collettore aperto che può funzionare come I/O (ed essendo a collettore aperto necessita di una resistenza di pullup che penso hai già messo). 

Penso però che il problema te lo danno solo le porte da RA0 a RA3 (non penso ti diano problemi pure le RA5/6/7). Questo perchè su quelle porte ci sono gli ingressi dei comparatori e al POR (Power On Reset) vengono abilitate con funzione analogica. Basta che disattivi la funzione analogica agendo sull&#039;apposito registro del comparatore:

CMCON=0b00000111; // pagine 63 e 64 del datasheet

Poi ancora: se utilizzi RA6 e RA7 come I/O (invece di metterci il quarzo) non puoi contemporaneamente usare pure RA5 (MCLR) come I/O, o setti RA5 come I/O e usi RA6 e RA7 per il quarzo, O usi RA5 come normale MCLR e puoi mettere RA6 e RA7 come I/O (questo è specificato a pag. 98 - configuration word register). Se provi a violare questa regola vedi come il pic si comporta in maniera assura.</description>
		<content:encoded><![CDATA[<p>Il fatto che il problema si verifica su tutte le porte A tranne la 4 ti dovrebbe indurre in un sospetto. Prendi il datasheet del 16F628A e guarda bene qual&#8217;è la differenza tra RA4 e tutte le altre porte del banco A. Osserva attentamente. Esatto! La porta RA4 è l&#8217;unica a non avere una &#8220;funzione speciale&#8221; rispetto alle altre, è solo una porta a collettore aperto che può funzionare come I/O (ed essendo a collettore aperto necessita di una resistenza di pullup che penso hai già messo). </p>
<p>Penso però che il problema te lo danno solo le porte da RA0 a RA3 (non penso ti diano problemi pure le RA5/6/7). Questo perchè su quelle porte ci sono gli ingressi dei comparatori e al POR (Power On Reset) vengono abilitate con funzione analogica. Basta che disattivi la funzione analogica agendo sull&#8217;apposito registro del comparatore:</p>
<p>CMCON=0b00000111; // pagine 63 e 64 del datasheet</p>
<p>Poi ancora: se utilizzi RA6 e RA7 come I/O (invece di metterci il quarzo) non puoi contemporaneamente usare pure RA5 (MCLR) come I/O, o setti RA5 come I/O e usi RA6 e RA7 per il quarzo, O usi RA5 come normale MCLR e puoi mettere RA6 e RA7 come I/O (questo è specificato a pag. 98 &#8211; configuration word register). Se provi a violare questa regola vedi come il pic si comporta in maniera assura.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Luca</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-4107</link>
		<dc:creator>Luca</dc:creator>
		<pubDate>Fri, 12 Mar 2010 22:58:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-4107</guid>
		<description>Buonasera,
il tutto estremamente chiaro, ma come sempre la conversione 877a-&gt;628a non gioca a mio favore. Il programma adattato funziona alla perfezione, l&#039;unico problema, che persiste ormai dall&#039;inizio del corso, è l&#039;utilizzo del PORTA(TRISA), a quanto pare, l&#039;abbondanza di periferiche sotto PORTA(TRISA) mi sta creando parecchi problemi. Infatti tutto fila liscio se decido di tralasciare il btnDn poichè volendo usare solo le porte B ho solo a disposizione 7segmenti+1tasto. Appena modifico il programma per il decremento, nell&#039;utilizzare una qualunque delle porte a, si verifica una cosa stranissima, il contatore aggiunge e decrementa di una unità da solo (77...76...77...76...rip) , letteralmente &quot;fregandosene&quot; della pressione di qualsiasi dei due tasti.

Per caso hai, come sempre, qualche dritta? Magari nel cercare di far capire al pic16f628a (che uso) di settare le porte A tutte come I\O (tranne mclr ovviamente) e disattivare qualsiasi accessorio (ANx Vref OSC..etc)?


AGGIORNAMENTO:
il problema si verifica su tutte le porte tranne RA4, ovvero RA4\T0CKI\CMP2 per la quale il programma scorre senza problemi. Allego impostazione registri.

Ps.
    TRISA=0b00040000;  //RA4 btndn
    TRISB=0b10000000;  //RB7 btnup, RB6-RB0 display
    OPTION=0b00000001;  //INTIO=&gt; quarzo interno @4MHz =&gt;1ms (Presc 4, TMRO=4+2)
    INTCON=0b10100000;
 	TMR0=6; // il timer0 deve partire da 100

Buona Serata</description>
		<content:encoded><![CDATA[<p>Buonasera,<br />
il tutto estremamente chiaro, ma come sempre la conversione 877a-&gt;628a non gioca a mio favore. Il programma adattato funziona alla perfezione, l&#8217;unico problema, che persiste ormai dall&#8217;inizio del corso, è l&#8217;utilizzo del PORTA(TRISA), a quanto pare, l&#8217;abbondanza di periferiche sotto PORTA(TRISA) mi sta creando parecchi problemi. Infatti tutto fila liscio se decido di tralasciare il btnDn poichè volendo usare solo le porte B ho solo a disposizione 7segmenti+1tasto. Appena modifico il programma per il decremento, nell&#8217;utilizzare una qualunque delle porte a, si verifica una cosa stranissima, il contatore aggiunge e decrementa di una unità da solo (77&#8230;76&#8230;77&#8230;76&#8230;rip) , letteralmente &#8220;fregandosene&#8221; della pressione di qualsiasi dei due tasti.</p>
<p>Per caso hai, come sempre, qualche dritta? Magari nel cercare di far capire al pic16f628a (che uso) di settare le porte A tutte come I\O (tranne mclr ovviamente) e disattivare qualsiasi accessorio (ANx Vref OSC..etc)?</p>
<p>AGGIORNAMENTO:<br />
il problema si verifica su tutte le porte tranne RA4, ovvero RA4\T0CKI\CMP2 per la quale il programma scorre senza problemi. Allego impostazione registri.</p>
<p>Ps.<br />
    TRISA=0b00040000;  //RA4 btndn<br />
    TRISB=0b10000000;  //RB7 btnup, RB6-RB0 display<br />
    OPTION=0b00000001;  //INTIO=&gt; quarzo interno @4MHz =&gt;1ms (Presc 4, TMRO=4+2)<br />
    INTCON=0b10100000;<br />
 	TMR0=6; // il timer0 deve partire da 100</p>
<p>Buona Serata</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-3570</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Sat, 23 Jan 2010 16:16:32 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-3570</guid>
		<description>Il 16F818 sulle porte A ha anche il convertitore AD. L&#039;hai disattivato? ADCON1=0x06. All&#039;avvio su quel pic le porte A sono configurate tutte come analogiche</description>
		<content:encoded><![CDATA[<p>Il 16F818 sulle porte A ha anche il convertitore AD. L&#8217;hai disattivato? ADCON1=0&#215;06. All&#8217;avvio su quel pic le porte A sono configurate tutte come analogiche</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Andrea</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-8-pilotare-i-display-a-led-a-7-segmenti-in-modalita-multiplex-su-interrupt-del-timer0-realizziamo-un-contatore-up-down/comment-page-1/#comment-3569</link>
		<dc:creator>Andrea</dc:creator>
		<pubDate>Sat, 23 Jan 2010 16:11:29 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1868#comment-3569</guid>
		<description>Ciao Giovanni
ho un altro problema ma con l&#039;orologio, ho fatto una millefori e ho cambiato il pic ho messo un 16f818 tutto funziona bene ma non mi viene rilevata la pressione del tasto per settare i minuti, cioè anche se il piedino dove è collegato il tasto è a 1 il pic lo vede come se fosse a 0 e fa avanzare i minuti, il tasto è collegato su l&#039;uscita RA4:

while(1)
	{
		//Un pulsantino che fa avanzare i minuti quando premuto
		
			if(button == 0)
			{
				DelayMs(75);
				if(button == 0)
				{
					minuti++;
					if(minuti == 60)
					{
						minuti = 0;
						secondi = 0;
						ore++;
						if(ore == 24)
						{
							ore = 0;
							minuti = 0;
							secondi = 0;
						}	
					}
				}
			}

			if(secondi == 60)
			{
				secondi = 0;
				minuti++;
				
				if(minuti == 60)
				{
					minuti = 0;				
					secondi = 0;
					ore++;
					if(ore == 24)
					{
						ore = 0;
						minuti = 0;
						secondi = 0;
					}
				}
				
			}				
	}</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni<br />
ho un altro problema ma con l&#8217;orologio, ho fatto una millefori e ho cambiato il pic ho messo un 16f818 tutto funziona bene ma non mi viene rilevata la pressione del tasto per settare i minuti, cioè anche se il piedino dove è collegato il tasto è a 1 il pic lo vede come se fosse a 0 e fa avanzare i minuti, il tasto è collegato su l&#8217;uscita RA4:</p>
<p>while(1)<br />
	{<br />
		//Un pulsantino che fa avanzare i minuti quando premuto</p>
<p>			if(button == 0)<br />
			{<br />
				DelayMs(75);<br />
				if(button == 0)<br />
				{<br />
					minuti++;<br />
					if(minuti == 60)<br />
					{<br />
						minuti = 0;<br />
						secondi = 0;<br />
						ore++;<br />
						if(ore == 24)<br />
						{<br />
							ore = 0;<br />
							minuti = 0;<br />
							secondi = 0;<br />
						}<br />
					}<br />
				}<br />
			}</p>
<p>			if(secondi == 60)<br />
			{<br />
				secondi = 0;<br />
				minuti++;</p>
<p>				if(minuti == 60)<br />
				{<br />
					minuti = 0;<br />
					secondi = 0;<br />
					ore++;<br />
					if(ore == 24)<br />
					{<br />
						ore = 0;<br />
						minuti = 0;<br />
						secondi = 0;<br />
					}<br />
				}</p>
<p>			}<br />
	}</p>
]]></content:encoded>
	</item>
</channel>
</rss>

