<?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 4 – Cosa sono gli interrupt, concetti di base per sistemi operativi MultiTasking su PICMicro</title>
	<atom:link href="http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/</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: Paolo2BB</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-13745</link>
		<dc:creator>Paolo2BB</dc:creator>
		<pubDate>Tue, 13 Dec 2011 16:33:30 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-13745</guid>
		<description>Ciao Giovanni,
Non è un discorso perfettamente attinente, ma non trovo dove postarlo! Adesso inizio qui, poi ridirigimi dove preferisci!
Ho scelto un PIC 16F873A ed ho scritto un semplice firmware per accendere un led con una certa frequenza utilizzando il TIMER0.
Una volta collegato l&#039;oscillatore esterno da 4MHz sui pin 9 e 10, e  configurato il timer 
setup_timer_0(RTCC_DIV_256&#124;RTCC_EXT_H_TO_L); 
SET_TIMER0(100); e fatto partire da 100 per ottenere un interrupt ogni 10ms. 

#int_TIMER0
TIMER0_isr()
{
      {
         SET_TIMER0(TIMER_RELOAD); // reset TIMERO
         output_bit(PIN_C3, 1);
         output_bit(PIN_C3, 0);
         ms10++;
         if(ms10=100){

              ms10=0;
              secondi++;
.
.
.

Collegato il led sul pin14, ossia RC3 (pilotato dall&#039;interno dell&#039;interrupt TIMER0), purtroppo non funziona! Ovviamente ho abilitato anche gli interrupt:

enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

cerco di misurare con un oscilloscopio la frequenza di oscillazione sui pin 9 e 10 ma non leggo niente!!
Suggerimenti?</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni,<br />
Non è un discorso perfettamente attinente, ma non trovo dove postarlo! Adesso inizio qui, poi ridirigimi dove preferisci!<br />
Ho scelto un PIC 16F873A ed ho scritto un semplice firmware per accendere un led con una certa frequenza utilizzando il TIMER0.<br />
Una volta collegato l&#8217;oscillatore esterno da 4MHz sui pin 9 e 10, e  configurato il timer<br />
setup_timer_0(RTCC_DIV_256|RTCC_EXT_H_TO_L);<br />
SET_TIMER0(100); e fatto partire da 100 per ottenere un interrupt ogni 10ms. </p>
<p>#int_TIMER0<br />
TIMER0_isr()<br />
{<br />
      {<br />
         SET_TIMER0(TIMER_RELOAD); // reset TIMERO<br />
         output_bit(PIN_C3, 1);<br />
         output_bit(PIN_C3, 0);<br />
         ms10++;<br />
         if(ms10=100){</p>
<p>              ms10=0;<br />
              secondi++;<br />
.<br />
.<br />
.</p>
<p>Collegato il led sul pin14, ossia RC3 (pilotato dall&#8217;interno dell&#8217;interrupt TIMER0), purtroppo non funziona! Ovviamente ho abilitato anche gli interrupt:</p>
<p>enable_interrupts(INT_TIMER0);<br />
enable_interrupts(GLOBAL);</p>
<p>cerco di misurare con un oscilloscopio la frequenza di oscillazione sui pin 9 e 10 ma non leggo niente!!<br />
Suggerimenti?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: maurytheking</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-11460</link>
		<dc:creator>maurytheking</dc:creator>
		<pubDate>Tue, 10 May 2011 07:52:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-11460</guid>
		<description>Ciao giovanni.
Ho dei problemi con l&#039;interrupt, vorrei realizzare un contagiri e quindi utilizzo 2 interrupt uno è il timer che mi resetta il contatore ogni 100 ms e l&#039;altro è RB0/INT che mi incrementa il contatore ogni volta che la porta sale a livello alto.
il problema è che nel simulatore non va ovvero la variabile contatore viene incrementata ma mai resettata perchè sembra che l&#039;interrupt del timer non venga eseguito.
Io utilizzo il compilatore della MikroC quindi il sorgente è leggermente diverso da quello che hai :




unsigned int Timer;
unsigned int Count;
unsigned int OldCount;
unsigned int FondSc;
bit Pr;

void interrupt(void)
 {
    if (T0IF) // L&#039;interrupt è stato causato da un overflow del timer0 ?
       {
       TMR0 = 225; // Reimposto Timer0
       Timer++; // Incremento il Timer per il lampeggio del led
       if (Timer &gt;= 100) // Se il tempo è passato
          {
          OldCount = Count;
          OldCount = OldCount*600;
          Pr = 0;
          Count = 0;
          Timer=0; // Ricarico il timer del led per ricominciare daccapo
          }
       INTCON.T0IF=0; // Resetto il flag interrupt su timer 0,
    } // fine che interrupt verificatosi su timer0
 if(INTF){
       Count++;
       PORTA.F7 = ~PORTA.F7;
       INTCON.INTF = 0;
    }
 } // fine interrupt ser
 
 
void main(){
TRISA = 0;
TRISB = 0x01;
PORTA = 0x00;
PORTB = 0x00;
OPTION_REG = 0b11000100;
INTCON=0b10110000;
TMR0=225; // Imposto Timer0 a 100
Count = 0;
Pr = 1;
FondSc = 19800;
while(1){
    if(Pr==0){//Accensione dei led
        if(OldCount&gt;=100){
                          PORTA = 0x00;
                          PORTB = 0x02;
        }
        if(OldCount&gt;=(FondSc/10)){
                          PORTA = 0x00;
                          PORTB = 0x06;
        }
        if(OldCount&gt;=((FondSc/10)*2)){
                          PORTA = 0x00;
                          PORTB = 0x0E;
        }
        if(OldCount&gt;=((FondSc/10)*3)){
                          PORTA = 0x00;
                          PORTB = 0x1E;
        }
        if(OldCount&gt;=((FondSc/10)*4)){
                          PORTA = 0x00;
                          PORTB = 0x3E;
        }
        if(OldCount&gt;=((FondSc/10)*5)){
                          PORTA = 0x00;
                          PORTB = 0x7E;
        }
        if(OldCount&gt;=((FondSc/10)*6)){
                          PORTA = 0x00;
                          PORTB = 0xFE;
        }
        if(OldCount&gt;=((FondSc/10)*7)){
                          PORTA = 0x01;
                          PORTB = 0xFE;
        }
        if(OldCount&gt;=((FondSc/10)*8)){
                          PORTA = 0x03;
                          PORTB = 0xFE;
        }
        if(OldCount&gt;=((FondSc/10)*9)){
                          PORTA = 0x07;
                          PORTB = 0xFE;
        }
        Pr = 1;
        }
    }
}</description>
		<content:encoded><![CDATA[<p>Ciao giovanni.<br />
Ho dei problemi con l&#8217;interrupt, vorrei realizzare un contagiri e quindi utilizzo 2 interrupt uno è il timer che mi resetta il contatore ogni 100 ms e l&#8217;altro è RB0/INT che mi incrementa il contatore ogni volta che la porta sale a livello alto.<br />
il problema è che nel simulatore non va ovvero la variabile contatore viene incrementata ma mai resettata perchè sembra che l&#8217;interrupt del timer non venga eseguito.<br />
Io utilizzo il compilatore della MikroC quindi il sorgente è leggermente diverso da quello che hai :</p>
<p>unsigned int Timer;<br />
unsigned int Count;<br />
unsigned int OldCount;<br />
unsigned int FondSc;<br />
bit Pr;</p>
<p>void interrupt(void)<br />
 {<br />
    if (T0IF) // L&#8217;interrupt è stato causato da un overflow del timer0 ?<br />
       {<br />
       TMR0 = 225; // Reimposto Timer0<br />
       Timer++; // Incremento il Timer per il lampeggio del led<br />
       if (Timer &gt;= 100) // Se il tempo è passato<br />
          {<br />
          OldCount = Count;<br />
          OldCount = OldCount*600;<br />
          Pr = 0;<br />
          Count = 0;<br />
          Timer=0; // Ricarico il timer del led per ricominciare daccapo<br />
          }<br />
       INTCON.T0IF=0; // Resetto il flag interrupt su timer 0,<br />
    } // fine che interrupt verificatosi su timer0<br />
 if(INTF){<br />
       Count++;<br />
       PORTA.F7 = ~PORTA.F7;<br />
       INTCON.INTF = 0;<br />
    }<br />
 } // fine interrupt ser</p>
<p>void main(){<br />
TRISA = 0;<br />
TRISB = 0&#215;01;<br />
PORTA = 0&#215;00;<br />
PORTB = 0&#215;00;<br />
OPTION_REG = 0b11000100;<br />
INTCON=0b10110000;<br />
TMR0=225; // Imposto Timer0 a 100<br />
Count = 0;<br />
Pr = 1;<br />
FondSc = 19800;<br />
while(1){<br />
    if(Pr==0){//Accensione dei led<br />
        if(OldCount&gt;=100){<br />
                          PORTA = 0&#215;00;<br />
                          PORTB = 0&#215;02;<br />
        }<br />
        if(OldCount&gt;=(FondSc/10)){<br />
                          PORTA = 0&#215;00;<br />
                          PORTB = 0&#215;06;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*2)){<br />
                          PORTA = 0&#215;00;<br />
                          PORTB = 0&#215;0E;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*3)){<br />
                          PORTA = 0&#215;00;<br />
                          PORTB = 0&#215;1E;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*4)){<br />
                          PORTA = 0&#215;00;<br />
                          PORTB = 0&#215;3E;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*5)){<br />
                          PORTA = 0&#215;00;<br />
                          PORTB = 0&#215;7E;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*6)){<br />
                          PORTA = 0&#215;00;<br />
                          PORTB = 0xFE;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*7)){<br />
                          PORTA = 0&#215;01;<br />
                          PORTB = 0xFE;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*8)){<br />
                          PORTA = 0&#215;03;<br />
                          PORTB = 0xFE;<br />
        }<br />
        if(OldCount&gt;=((FondSc/10)*9)){<br />
                          PORTA = 0&#215;07;<br />
                          PORTB = 0xFE;<br />
        }<br />
        Pr = 1;<br />
        }<br />
    }<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-9190</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 07 Jan 2011 14:44:24 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-9190</guid>
		<description>Si. L&#039;unica differenza è che non puoi fare l&#039;inizializzazione nel momento della dichiarazione. Cioè non puoi fare:

bit flag=1;

come per le normali variabili:

char variabile=20;</description>
		<content:encoded><![CDATA[<p>Si. L&#8217;unica differenza è che non puoi fare l&#8217;inizializzazione nel momento della dichiarazione. Cioè non puoi fare:</p>
<p>bit flag=1;</p>
<p>come per le normali variabili:</p>
<p>char variabile=20;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: damiano</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-9185</link>
		<dc:creator>damiano</dc:creator>
		<pubDate>Fri, 07 Jan 2011 10:14:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-9185</guid>
		<description>infatti è perfetto!
ti ringrazio........quindi usando l&#039;hitec-c posso dichiarare tranquillamente variabili bit??
QUANDO DICHIARO UN BIT.......BASTA SCRIVERE : bit flag;......non devo aggiungere altro???
come se fosse un altra variabile!</description>
		<content:encoded><![CDATA[<p>infatti è perfetto!<br />
ti ringrazio&#8230;&#8230;..quindi usando l&#8217;hitec-c posso dichiarare tranquillamente variabili bit??<br />
QUANDO DICHIARO UN BIT&#8230;&#8230;.BASTA SCRIVERE : bit flag;&#8230;&#8230;non devo aggiungere altro???<br />
come se fosse un altra variabile!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-9181</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Fri, 07 Jan 2011 04:29:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-9181</guid>
		<description>prima del main metti la variabile che vuoi usare come flag, così viene dichiarata globale, nel senso che puo essere vista anche dalla isr:

bit flag;
....
....
void main(void)
{
flag=0; // lo inizializzi a zero qui nel main, prima di entrare nel while(1)
... ecc ecc

il tipo bit non lo puoi inizializzare nella dichiarazione come le altre variabili, anzi ringraziamo che l&#039;hitec-c ha questo tipo di variabile perchè il c18 non ce l&#039;ha.

quindi nel while(1) del main ti intercetti il settaggio del flag avvenuto ad opera dell&#039;isr:

void main(void)
{
flag=0;
...
...
...
while(1)
{...
if (flag)
{
// eseguo le istruzioni che avrei eseguito nell&#039;isr
// alla fine devo rimettere il flag a zero
flag=0;
} // chiudo if
}// chiudo while(1)
}// chiudo main

quindi nell&#039;isr mi setto il flag in base all&#039;interrupt:
void isr(void)
{
if (t0if) // interrupt su timer0? Ovviamente qua intercetti l&#039;interrupt che serve a te
{
flag=1; // setto il flag, questo viene intercettato nel main dove ho messo if (flag=1)
...
...
t0if=0; // azzero il flag di avvenuto interrupt
} // chiudo if t0if
} // chiudo isr

più chiaro di così non riesco</description>
		<content:encoded><![CDATA[<p>prima del main metti la variabile che vuoi usare come flag, così viene dichiarata globale, nel senso che puo essere vista anche dalla isr:</p>
<p>bit flag;<br />
&#8230;.<br />
&#8230;.<br />
void main(void)<br />
{<br />
flag=0; // lo inizializzi a zero qui nel main, prima di entrare nel while(1)<br />
&#8230; ecc ecc</p>
<p>il tipo bit non lo puoi inizializzare nella dichiarazione come le altre variabili, anzi ringraziamo che l&#8217;hitec-c ha questo tipo di variabile perchè il c18 non ce l&#8217;ha.</p>
<p>quindi nel while(1) del main ti intercetti il settaggio del flag avvenuto ad opera dell&#8217;isr:</p>
<p>void main(void)<br />
{<br />
flag=0;<br />
&#8230;<br />
&#8230;<br />
&#8230;<br />
while(1)<br />
{&#8230;<br />
if (flag)<br />
{<br />
// eseguo le istruzioni che avrei eseguito nell&#8217;isr<br />
// alla fine devo rimettere il flag a zero<br />
flag=0;<br />
} // chiudo if<br />
}// chiudo while(1)<br />
}// chiudo main</p>
<p>quindi nell&#8217;isr mi setto il flag in base all&#8217;interrupt:<br />
void isr(void)<br />
{<br />
if (t0if) // interrupt su timer0? Ovviamente qua intercetti l&#8217;interrupt che serve a te<br />
{<br />
flag=1; // setto il flag, questo viene intercettato nel main dove ho messo if (flag=1)<br />
&#8230;<br />
&#8230;<br />
t0if=0; // azzero il flag di avvenuto interrupt<br />
} // chiudo if t0if<br />
} // chiudo isr</p>
<p>più chiaro di così non riesco</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: damiano</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-9177</link>
		<dc:creator>damiano</dc:creator>
		<pubDate>Thu, 06 Jan 2011 21:05:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-9177</guid>
		<description>ancora non ho capito.
mi puoi spiegare meglio come devo dichiarare il flag al di fuori del main
e come poi lo intercetto???</description>
		<content:encoded><![CDATA[<p>ancora non ho capito.<br />
mi puoi spiegare meglio come devo dichiarare il flag al di fuori del main<br />
e come poi lo intercetto???</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-9176</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Thu, 06 Jan 2011 20:59:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-9176</guid>
		<description>Nell&#039;interrupt i flag li setti all&#039;interno della funzione, ad esempio:
void interrupt isr(void)
{if (t0if) flag=1;}
dove flag l&#039;hai dichiarato al di fuori del main.
I puntatori vengono ovviamente gestiti.</description>
		<content:encoded><![CDATA[<p>Nell&#8217;interrupt i flag li setti all&#8217;interno della funzione, ad esempio:<br />
void interrupt isr(void)<br />
{if (t0if) flag=1;}<br />
dove flag l&#8217;hai dichiarato al di fuori del main.<br />
I puntatori vengono ovviamente gestiti.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: damiano</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-9175</link>
		<dc:creator>damiano</dc:creator>
		<pubDate>Thu, 06 Jan 2011 20:34:34 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-9175</guid>
		<description>ciao giovanni
ho dei problemi con l&#039;interupt, dato che esso mi deve richiamare delle funzioni esterne a seconda della causa.
tu suggerisci si settare dei flag per poi controllare questi sul main.........ma come faccio a fare dei flag se l&#039;interrupt è una funzione void interrupt (void), la quale non mi da ne risultati, ne posso inserire dati???

seconda cosa......se faccio uso di puntatori, nel main e nelle funzioni..hitec-c, li riconosce.......da problemi???</description>
		<content:encoded><![CDATA[<p>ciao giovanni<br />
ho dei problemi con l&#8217;interupt, dato che esso mi deve richiamare delle funzioni esterne a seconda della causa.<br />
tu suggerisci si settare dei flag per poi controllare questi sul main&#8230;&#8230;&#8230;ma come faccio a fare dei flag se l&#8217;interrupt è una funzione void interrupt (void), la quale non mi da ne risultati, ne posso inserire dati???</p>
<p>seconda cosa&#8230;&#8230;se faccio uso di puntatori, nel main e nelle funzioni..hitec-c, li riconosce&#8230;&#8230;.da problemi???</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Claudio</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-8387</link>
		<dc:creator>Claudio</dc:creator>
		<pubDate>Mon, 06 Dec 2010 20:12:27 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-8387</guid>
		<description>Ciao Giovanni, ho provato a modificare come dici tu, ma non sò perchè non funziona. Il datasheet indica INTE e non INTIE quindi l&#039;ho modificato...un&#039;altra cosa non ho resettato il flag per vedere come si &quot;comportava&quot;...grazie

#include    
#include    &quot;delay.c&quot;
__CONFIG(WDTDIS &amp; XT &amp; UNPROTECT &amp; LVPDIS);
#define XTAL    4000000         // crystal frequency - 4MHz

void main()
{   
    TRISB=0b00000001;
	INTE=1;
    PORTB=0b00111000;
}

void interrupt ISR (void)
{
 if (INTF=1)
 {
  PORTB=0b00000011;
 }
}</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni, ho provato a modificare come dici tu, ma non sò perchè non funziona. Il datasheet indica INTE e non INTIE quindi l&#8217;ho modificato&#8230;un&#8217;altra cosa non ho resettato il flag per vedere come si &#8220;comportava&#8221;&#8230;grazie</p>
<p>#include<br />
#include    &#8220;delay.c&#8221;<br />
__CONFIG(WDTDIS &amp; XT &amp; UNPROTECT &amp; LVPDIS);<br />
#define XTAL    4000000         // crystal frequency &#8211; 4MHz</p>
<p>void main()<br />
{<br />
    TRISB=0b00000001;<br />
	INTE=1;<br />
    PORTB=0b00111000;<br />
}</p>
<p>void interrupt ISR (void)<br />
{<br />
 if (INTF=1)<br />
 {<br />
  PORTB=0b00000011;<br />
 }<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-8382</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 06 Dec 2010 17:29:36 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-8382</guid>
		<description>L&#039;interrupt su RB0/INT va attivato (INTIE=1) e va intercettato nell&#039;ISR (if INTF=1), dopo che hai eseguito tutte le operazioni va resettato. L&#039;interrupt si verifica al cambio di stato (da 0 a 1 e viceversa). Per la donazione, se non sei iscritto a paypal penso sia normale</description>
		<content:encoded><![CDATA[<p>L&#8217;interrupt su RB0/INT va attivato (INTIE=1) e va intercettato nell&#8217;ISR (if INTF=1), dopo che hai eseguito tutte le operazioni va resettato. L&#8217;interrupt si verifica al cambio di stato (da 0 a 1 e viceversa). Per la donazione, se non sei iscritto a paypal penso sia normale</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Claudio</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-8380</link>
		<dc:creator>Claudio</dc:creator>
		<pubDate>Mon, 06 Dec 2010 17:14:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-8380</guid>
		<description>Ciao Giovanni. Ho voluto provare l&#039;interrupt non sul timer0 ma sull ingresso RB0/INT...però non funziona..eppure non sembra di aver sbagliato...ho dato un&#039;occhiata al datasheet ed ho settato sia l OPTION e che INTCON...cosa sbaglio? Vorrei fare una donazione con la postapay...però mi chiede l indirizzo, il cap, numero di telefono...ma è normale? Grazie.

#include    
#include    &quot;delay.c&quot;
__CONFIG(WDTDIS &amp; XT &amp; UNPROTECT &amp; LVPDIS);
#define XTAL    4000000         // crystal frequency - 4MHz

void main()
{   
    TRISB  = 0b11000001;
    //CMCON  = 0b00000111; 
    INTCON = 0b10001000;
	OPTION = 0b11000000;
	PORTB  = 0b00001100;
}

void interrupt ISR (void)
{
 if (INTF)
 {
  PORTB=0b00111110;
 }
}</description>
		<content:encoded><![CDATA[<p>Ciao Giovanni. Ho voluto provare l&#8217;interrupt non sul timer0 ma sull ingresso RB0/INT&#8230;però non funziona..eppure non sembra di aver sbagliato&#8230;ho dato un&#8217;occhiata al datasheet ed ho settato sia l OPTION e che INTCON&#8230;cosa sbaglio? Vorrei fare una donazione con la postapay&#8230;però mi chiede l indirizzo, il cap, numero di telefono&#8230;ma è normale? Grazie.</p>
<p>#include<br />
#include    &#8220;delay.c&#8221;<br />
__CONFIG(WDTDIS &amp; XT &amp; UNPROTECT &amp; LVPDIS);<br />
#define XTAL    4000000         // crystal frequency &#8211; 4MHz</p>
<p>void main()<br />
{<br />
    TRISB  = 0b11000001;<br />
    //CMCON  = 0b00000111;<br />
    INTCON = 0b10001000;<br />
	OPTION = 0b11000000;<br />
	PORTB  = 0b00001100;<br />
}</p>
<p>void interrupt ISR (void)<br />
{<br />
 if (INTF)<br />
 {<br />
  PORTB=0b00111110;<br />
 }<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Gela</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-8004</link>
		<dc:creator>Gela</dc:creator>
		<pubDate>Thu, 18 Nov 2010 12:01:45 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-8004</guid>
		<description>Scusa ma sono stato un po&#039; impegnato in questi giorni. Comunque SI, sei stato molto chiaro come in tutte le tue spiegazioni :)
Avevo interpretato male il datasheet, pensavo che con &quot;clock esterno&quot; intendesse l&#039;oscillatore al quarzo, visto fisicamente sta fuori dal pic.
Ora il programma funziona.
Grazie per avermi aiutato</description>
		<content:encoded><![CDATA[<p>Scusa ma sono stato un po&#8217; impegnato in questi giorni. Comunque SI, sei stato molto chiaro come in tutte le tue spiegazioni :)<br />
Avevo interpretato male il datasheet, pensavo che con &#8220;clock esterno&#8221; intendesse l&#8217;oscillatore al quarzo, visto fisicamente sta fuori dal pic.<br />
Ora il programma funziona.<br />
Grazie per avermi aiutato</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7956</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 15 Nov 2010 12:44:11 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7956</guid>
		<description>Voglio solo farti capire il senso di quel bit:

Timer1 Clock Source Select bit
1 = External clock from T1CKI pin (on the rising edge)
0 = Internal clock (FOSC/4)

Cosa deve dire di più il datasheet? Tradotto in italiano quello significa:

Bit di selezione per sorgente di Clock del timer1
1 = Clock esterno sul pin T1CKI (sul fronte di salita)
0 = clock interno (FOSC/4)

Quindi come puoi vedere il timer1, il quale ha ovviamente bisogno di una sorgente di clock per incrementare il suo conteggio, ha la possibilità di sfruttare o il clock interno (mettendo quel bit a zero) ovvero il quarzo che normalmente usi per far funzionare il pic, oppure un clock esterno (un&#039;onda quadra fornita dall&#039;esterno) da applicare sul pin del pic che ha il contrassegno T1CKI.

Tu hai messo l&#039;impostazione per usare il clock esterno (hai messo quel bit a 1), per cui non avendo tu messo una sorgente di clock esterna sul pin T1CKI ecco che il timer1 non incrementa mai e quindi non ti funziona nulla.

Se invece metti quel bit a zero allora il timer1 incrementerà sfruttando il ciclo di clock interno.

Spero di essere stato abbastanza chiaro.</description>
		<content:encoded><![CDATA[<p>Voglio solo farti capire il senso di quel bit:</p>
<p>Timer1 Clock Source Select bit<br />
1 = External clock from T1CKI pin (on the rising edge)<br />
0 = Internal clock (FOSC/4)</p>
<p>Cosa deve dire di più il datasheet? Tradotto in italiano quello significa:</p>
<p>Bit di selezione per sorgente di Clock del timer1<br />
1 = Clock esterno sul pin T1CKI (sul fronte di salita)<br />
0 = clock interno (FOSC/4)</p>
<p>Quindi come puoi vedere il timer1, il quale ha ovviamente bisogno di una sorgente di clock per incrementare il suo conteggio, ha la possibilità di sfruttare o il clock interno (mettendo quel bit a zero) ovvero il quarzo che normalmente usi per far funzionare il pic, oppure un clock esterno (un&#8217;onda quadra fornita dall&#8217;esterno) da applicare sul pin del pic che ha il contrassegno T1CKI.</p>
<p>Tu hai messo l&#8217;impostazione per usare il clock esterno (hai messo quel bit a 1), per cui non avendo tu messo una sorgente di clock esterna sul pin T1CKI ecco che il timer1 non incrementa mai e quindi non ti funziona nulla.</p>
<p>Se invece metti quel bit a zero allora il timer1 incrementerà sfruttando il ciclo di clock interno.</p>
<p>Spero di essere stato abbastanza chiaro.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7954</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Mon, 15 Nov 2010 12:28:32 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7954</guid>
		<description>Allora devi mettere quel bit a zero e non a uno come hai fatto, in maniera tale che il timer1 utilizzi come sorgente di clock il clock primario.</description>
		<content:encoded><![CDATA[<p>Allora devi mettere quel bit a zero e non a uno come hai fatto, in maniera tale che il timer1 utilizzi come sorgente di clock il clock primario.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Gela</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7952</link>
		<dc:creator>Gela</dc:creator>
		<pubDate>Mon, 15 Nov 2010 12:06:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7952</guid>
		<description>Ho solo il quarzo che da il clock al pic, nel datasheet non ho trovato alcuna specifica su quale sorgente usare, pensavo bastasse quella che usa normalmente il pic e che si arrangiasse lui a farla funzionare.</description>
		<content:encoded><![CDATA[<p>Ho solo il quarzo che da il clock al pic, nel datasheet non ho trovato alcuna specifica su quale sorgente usare, pensavo bastasse quella che usa normalmente il pic e che si arrangiasse lui a farla funzionare.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7935</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Sun, 14 Nov 2010 14:06:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7935</guid>
		<description>Il clock del pic è una cosa e il clock da usare come sorgente per il timer ne è un&#039;altra. Arriva a capire il senso di: 

Timer1 Clock Source Select bit
1 = External clock from T1CKI pin (on the rising edge)
0 = Internal clock (FOSC/4)

Tu lo hai messo a 1, quindi il timer1 si aspetta un clock sul pin T1CKI, hai un clock esterno che alimenta il timer1 o hai solo il quarzo che fornisce il clock al pic?</description>
		<content:encoded><![CDATA[<p>Il clock del pic è una cosa e il clock da usare come sorgente per il timer ne è un&#8217;altra. Arriva a capire il senso di: </p>
<p>Timer1 Clock Source Select bit<br />
1 = External clock from T1CKI pin (on the rising edge)<br />
0 = Internal clock (FOSC/4)</p>
<p>Tu lo hai messo a 1, quindi il timer1 si aspetta un clock sul pin T1CKI, hai un clock esterno che alimenta il timer1 o hai solo il quarzo che fornisce il clock al pic?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Gela</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7933</link>
		<dc:creator>Gela</dc:creator>
		<pubDate>Sun, 14 Nov 2010 13:36:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7933</guid>
		<description>si, uso un quarzo da 8MHz come clock, è attaccato ai pin 2 e 3, rispettivamente
pin2 -&gt; RA5/OSC1/T1CKI/CLKIN
pin3 -&gt; RA4/OSC2/T1G&#039;/CLKOUT
è qui che sbaglio?</description>
		<content:encoded><![CDATA[<p>si, uso un quarzo da 8MHz come clock, è attaccato ai pin 2 e 3, rispettivamente<br />
pin2 -&gt; RA5/OSC1/T1CKI/CLKIN<br />
pin3 -&gt; RA4/OSC2/T1G&#8217;/CLKOUT<br />
è qui che sbaglio?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7931</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Sun, 14 Nov 2010 11:00:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7931</guid>
		<description>Come hai impostato T1CON, Timer1 vuole il clock dall&#039;esterno (bit1 -&gt; TMR1CS, l&#039;hai messo a 1). Stai usando una sorgente di clock esterna?</description>
		<content:encoded><![CDATA[<p>Come hai impostato T1CON, Timer1 vuole il clock dall&#8217;esterno (bit1 -&gt; TMR1CS, l&#8217;hai messo a 1). Stai usando una sorgente di clock esterna?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Gela</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7930</link>
		<dc:creator>Gela</dc:creator>
		<pubDate>Sun, 14 Nov 2010 10:49:11 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7930</guid>
		<description>Ciao, ho un problema col timer1, non riesco a farlo partire. Uso il pic16F690 con quarzo 8MHz e il controller per il TMR1 è così settato (prescaler e preload servono per un interrupt ogni 50ms, li ho trovati con pictimer calculator):
//T1CON
	// bit 0 -&gt; TMR1ON: Timer1 On bit
	//			1 = Enables Timer1
	//			0 = Stops Timer1
	// bit 1 -&gt; TMR1CS: Timer1 Clock Source Select bit
	//			1 = External clock from T1CKI pin (on the rising edge)
	//			0 = Internal clock (FOSC/4)
	// bit 2 -&gt; T1SYNC: Timer1 External Clock Input Synchronization Control bit
	//			TMR1CS = 1:
	//			1 = Do not synchronize external clock input
	//			0 = Synchronize external clock input
	//			TMR1CS = 0:
	//			This bit is ignored. Timer1 uses the internal clock
	// bit 3 -&gt; T1OSCEN: LP Oscillator Enable Control bit
	//			If INTOSC without CLKOUT oscillator is active:
	//			1 = LP oscillator is enabled for Timer1 clock
	//			0 = LP oscillator is off
	// bit5-4-&gt; T1CKPS: Timer1 Input Clock Prescale Select bits
	//			11 = 1:8 Prescale Value
	//			10 = 1:4 Prescale Value
	//			01 = 1:2 Prescale Value
	//			00 = 1:1 Prescale Value
	// bit 6 -&gt; TMR1GE Timer 1 Gate Enable bit
	//			If TMR1ON = 0:
	//			This bit is ignored
	//			If TMR1ON = 1:
	//			1 = Timer1 counting is controlled by the Timer1 Gate function
	//			0 = Timer1 is always counting
	// bit 7 -&gt; T1GINV: Timer1 Gate Invert bit
	//			1 = Timer1 gate is active high (Timer1 counts when Timer1 gate signal is high)
	//			0 = Timer1 gate is active low (Timer1 counts when gate is low)
	
	T1CON=0b00110010; //TMR1 off
//preload del timer 1 -&gt; 15536 serve per un interrupt ogni 50ms
	TMR1H=0b00111100;
	TMR1L=0b10110000;
		
	// INTCON
	// bit 0 -&gt; RBIF   PortB Interrupt Flag
	// bit 1 -&gt; INTF   RB0/INT Interrupt Flag
	// bit 2 -&gt; T0IF   Timer0 Interrupt Flag
	// bit 3 -&gt; RABIE  PortAB Interrupt Enable (off)
	// bit 4 -&gt; INTE   RA2/INT External Interrupt Enable bit (off)
	// bit 5 -&gt; TMR0IE Timer0 Interrupt Enable (off)
	// bit 6 -&gt; PEIE   PEripheral Interrupt Enable (on)
	// bit 7 -&gt; GIE    Global Interrupt Enable (on)
	INTCON=0b11000000;
	
	//PIE1
	// bit 0 -&gt; TMR1IE Timer 1 Interrupt Enable (on)
	// bit 1 -&gt; TMR2IE Timer 2 Interrupt Enable (off)
	// bit 2 -&gt; CCP1E CCP1E  Interrupt Enable (off)
	// bit 3 -&gt; SSPIE Sinconous Serial Port Interrupt Enable (off)
	// bit 4 -&gt; TXIE EUSART Transmit Interrupt Enable (off)
	// bit 5 -&gt; RCIE EUSART Receive Interrupt Enable (off)
	// bit 6 -&gt; ADIE A/D converter Interrupt Enable(on)
	// bit 7 -&gt; Unimplemented
	PIE1=0b00000001;
	
	//avvio Timer1
	TMR1ON=1;

Poi nella ISR ho scritto: if (TMR1IF) { GIE=0; ...; GIE=1}

Quando invece uso il Timer0 con il suo settaggio tutto va, ma mi serve il Timer1 per poterlo mandare il sleep.
Sai dirmi dove sbaglio?</description>
		<content:encoded><![CDATA[<p>Ciao, ho un problema col timer1, non riesco a farlo partire. Uso il pic16F690 con quarzo 8MHz e il controller per il TMR1 è così settato (prescaler e preload servono per un interrupt ogni 50ms, li ho trovati con pictimer calculator):<br />
//T1CON<br />
	// bit 0 -&gt; TMR1ON: Timer1 On bit<br />
	//			1 = Enables Timer1<br />
	//			0 = Stops Timer1<br />
	// bit 1 -&gt; TMR1CS: Timer1 Clock Source Select bit<br />
	//			1 = External clock from T1CKI pin (on the rising edge)<br />
	//			0 = Internal clock (FOSC/4)<br />
	// bit 2 -&gt; T1SYNC: Timer1 External Clock Input Synchronization Control bit<br />
	//			TMR1CS = 1:<br />
	//			1 = Do not synchronize external clock input<br />
	//			0 = Synchronize external clock input<br />
	//			TMR1CS = 0:<br />
	//			This bit is ignored. Timer1 uses the internal clock<br />
	// bit 3 -&gt; T1OSCEN: LP Oscillator Enable Control bit<br />
	//			If INTOSC without CLKOUT oscillator is active:<br />
	//			1 = LP oscillator is enabled for Timer1 clock<br />
	//			0 = LP oscillator is off<br />
	// bit5-4-&gt; T1CKPS: Timer1 Input Clock Prescale Select bits<br />
	//			11 = 1:8 Prescale Value<br />
	//			10 = 1:4 Prescale Value<br />
	//			01 = 1:2 Prescale Value<br />
	//			00 = 1:1 Prescale Value<br />
	// bit 6 -&gt; TMR1GE Timer 1 Gate Enable bit<br />
	//			If TMR1ON = 0:<br />
	//			This bit is ignored<br />
	//			If TMR1ON = 1:<br />
	//			1 = Timer1 counting is controlled by the Timer1 Gate function<br />
	//			0 = Timer1 is always counting<br />
	// bit 7 -&gt; T1GINV: Timer1 Gate Invert bit<br />
	//			1 = Timer1 gate is active high (Timer1 counts when Timer1 gate signal is high)<br />
	//			0 = Timer1 gate is active low (Timer1 counts when gate is low)</p>
<p>	T1CON=0b00110010; //TMR1 off<br />
//preload del timer 1 -&gt; 15536 serve per un interrupt ogni 50ms<br />
	TMR1H=0b00111100;<br />
	TMR1L=0b10110000;</p>
<p>	// INTCON<br />
	// bit 0 -&gt; RBIF   PortB Interrupt Flag<br />
	// bit 1 -&gt; INTF   RB0/INT Interrupt Flag<br />
	// bit 2 -&gt; T0IF   Timer0 Interrupt Flag<br />
	// bit 3 -&gt; RABIE  PortAB Interrupt Enable (off)<br />
	// bit 4 -&gt; INTE   RA2/INT External Interrupt Enable bit (off)<br />
	// bit 5 -&gt; TMR0IE Timer0 Interrupt Enable (off)<br />
	// bit 6 -&gt; PEIE   PEripheral Interrupt Enable (on)<br />
	// bit 7 -&gt; GIE    Global Interrupt Enable (on)<br />
	INTCON=0b11000000;</p>
<p>	//PIE1<br />
	// bit 0 -&gt; TMR1IE Timer 1 Interrupt Enable (on)<br />
	// bit 1 -&gt; TMR2IE Timer 2 Interrupt Enable (off)<br />
	// bit 2 -&gt; CCP1E CCP1E  Interrupt Enable (off)<br />
	// bit 3 -&gt; SSPIE Sinconous Serial Port Interrupt Enable (off)<br />
	// bit 4 -&gt; TXIE EUSART Transmit Interrupt Enable (off)<br />
	// bit 5 -&gt; RCIE EUSART Receive Interrupt Enable (off)<br />
	// bit 6 -&gt; ADIE A/D converter Interrupt Enable(on)<br />
	// bit 7 -&gt; Unimplemented<br />
	PIE1=0b00000001;</p>
<p>	//avvio Timer1<br />
	TMR1ON=1;</p>
<p>Poi nella ISR ho scritto: if (TMR1IF) { GIE=0; &#8230;; GIE=1}</p>
<p>Quando invece uso il Timer0 con il suo settaggio tutto va, ma mi serve il Timer1 per poterlo mandare il sleep.<br />
Sai dirmi dove sbaglio?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7209</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 22 Sep 2010 22:24:49 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7209</guid>
		<description>I pic18 invece hanno due livelli di interrupt e si puo scegliere quale interrupt deve avere livello basso o livello alto e quindi avrai due routine di interrupt: interrupt di alto livello e di basso livello, oppure puoi averne una sola se scegli la modalità di interrupt compatibile coi pic16. I pic a 16 bit invece hanno 8 livelli di interrupt e una funzione di interrupt distinta per ogni evento e i pin che scatenano l&#039;interrupt non si contano.</description>
		<content:encoded><![CDATA[<p>I pic18 invece hanno due livelli di interrupt e si puo scegliere quale interrupt deve avere livello basso o livello alto e quindi avrai due routine di interrupt: interrupt di alto livello e di basso livello, oppure puoi averne una sola se scegli la modalità di interrupt compatibile coi pic16. I pic a 16 bit invece hanno 8 livelli di interrupt e una funzione di interrupt distinta per ogni evento e i pin che scatenano l&#8217;interrupt non si contano.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7208</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 22 Sep 2010 22:22:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7208</guid>
		<description>Sui pic16 viene scritta una sola funzione di interrupt: qualsiasi interrupt richiama tale funzione. Nella funzione poi ti fai una serie di if per controllare quale interrupt è scattato... Ma scusa non l&#039;ho scritto nell&#039;articolo?! RB0 ha la funzione di interrupt, ma anche le porte RB4-RB7 se parliamo del 16F877A, il cui interrupt si abilita con RBIF e si controlla con RBIE, però un cambio di stato su qualsiasi delle porte RB4-RB7 ti fa sempre scattare l&#039;interrupt per cui ti devi inventare tu un sistema, mediante flag globali, per capire su quale delle 4 porte è scattato.</description>
		<content:encoded><![CDATA[<p>Sui pic16 viene scritta una sola funzione di interrupt: qualsiasi interrupt richiama tale funzione. Nella funzione poi ti fai una serie di if per controllare quale interrupt è scattato&#8230; Ma scusa non l&#8217;ho scritto nell&#8217;articolo?! RB0 ha la funzione di interrupt, ma anche le porte RB4-RB7 se parliamo del 16F877A, il cui interrupt si abilita con RBIF e si controlla con RBIE, però un cambio di stato su qualsiasi delle porte RB4-RB7 ti fa sempre scattare l&#8217;interrupt per cui ti devi inventare tu un sistema, mediante flag globali, per capire su quale delle 4 porte è scattato.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: odessos</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-7206</link>
		<dc:creator>odessos</dc:creator>
		<pubDate>Wed, 22 Sep 2010 22:11:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-7206</guid>
		<description>Domandone...
Se abilito contemporaneamente l&#039;interrupt sul TIME0 e l&#039;interrupt sull&#039;ingresso B0 con INTCON=........
devo scrivere due funzioni void interrupt(void) o con solo una posso gestire più interrupt.
E se volessi chiamare l&#039;attenzione dell&#039;interrupt con qualsiasi altro ingresso, invece che degli ingressi RB?</description>
		<content:encoded><![CDATA[<p>Domandone&#8230;<br />
Se abilito contemporaneamente l&#8217;interrupt sul TIME0 e l&#8217;interrupt sull&#8217;ingresso B0 con INTCON=&#8230;&#8230;..<br />
devo scrivere due funzioni void interrupt(void) o con solo una posso gestire più interrupt.<br />
E se volessi chiamare l&#8217;attenzione dell&#8217;interrupt con qualsiasi altro ingresso, invece che degli ingressi RB?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-6995</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Sun, 12 Sep 2010 20:14:23 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-6995</guid>
		<description>Basta usare un RTCC, ovvero un circuito integrato che funziona da orologio/calendario. Come il DS1307 che va pilotato in I2C. Questa è sicuramente la soluzione migliore in quanto gestisce da solo pure gli anni bisestili, i giorni della settimana ecc.</description>
		<content:encoded><![CDATA[<p>Basta usare un RTCC, ovvero un circuito integrato che funziona da orologio/calendario. Come il DS1307 che va pilotato in I2C. Questa è sicuramente la soluzione migliore in quanto gestisce da solo pure gli anni bisestili, i giorni della settimana ecc.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Fidus</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-6985</link>
		<dc:creator>Fidus</dc:creator>
		<pubDate>Sat, 11 Sep 2010 16:50:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-6985</guid>
		<description>Ciao è possibile creare un orologio con un pic?  Ho un 16F876A con quarzo da 20 Mhz.
Qual&#039;e il modo più veloce di fare un orologio?
Ho letto tutto l&#039;articolo ma non mi si accendono lampadine..</description>
		<content:encoded><![CDATA[<p>Ciao è possibile creare un orologio con un pic?  Ho un 16F876A con quarzo da 20 Mhz.<br />
Qual&#8217;e il modo più veloce di fare un orologio?<br />
Ho letto tutto l&#8217;articolo ma non mi si accendono lampadine..</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Giovanni Bernardo</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-5885</link>
		<dc:creator>Giovanni Bernardo</dc:creator>
		<pubDate>Wed, 23 Jun 2010 15:28:37 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-5885</guid>
		<description>Si, ma è un tipo vecchio. Puoi usare massimo un quarzo da 4MHz e ora non ricordo se hai a disposizione tutte le periferiche. Controllati il datasheet sul sito della microchip, devi cercare PIC16F877 (senza la A).</description>
		<content:encoded><![CDATA[<p>Si, ma è un tipo vecchio. Puoi usare massimo un quarzo da 4MHz e ora non ricordo se hai a disposizione tutte le periferiche. Controllati il datasheet sul sito della microchip, devi cercare PIC16F877 (senza la A).</p>
]]></content:encoded>
	</item>
	<item>
		<title>Di: Cristianoscr</title>
		<link>http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-4-cosa-sono-gli-interrupt-concetti-di-base-per-sistemi-operativi-multitasking-su-picmicro/comment-page-1/#comment-5881</link>
		<dc:creator>Cristianoscr</dc:creator>
		<pubDate>Wed, 23 Jun 2010 11:20:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.settorezero.com/wordpress/?p=1330#comment-5881</guid>
		<description>Il mio pic ha scritto PIC16F877-04/P è riprogrammabile? cioè va bene?</description>
		<content:encoded><![CDATA[<p>Il mio pic ha scritto PIC16F877-04/P è riprogrammabile? cioè va bene?</p>
]]></content:encoded>
	</item>
</channel>
</rss>

