Pagina 1 di 1

INTERRUPT con PIC 16f628

MessaggioInviato: 23 dic 2011, 16:02
da roberto93
Sto cercando di realizzare un semplice programma il cui obiettivo è l'accendere un led tramite l'utilizzo di un pulsante. Sono alle prime armi, e gli interrupt mi sono davvero ostili. Ho provato a buttar giù un codice ma ovviamente non funziona...cosa ho sbagliato??? Grazie. O_/
Codice: Seleziona tutto
void main()
{
  TRISB.B0=1;
  PORTB=0;
  INTCON.GIE=1;
  INTCON.INTE=1;
 
  while(1){
          }
}

void interrupt (){
                   if(INTCON.INTF==1){
                      PORTB.F5=1;
                      INTCON.INTF=0;
                      }
                   }

Re: INTERRUPT con PIC 16f628

MessaggioInviato: 23 dic 2011, 21:14
da AjKDAP
roberto93 ha scritto:ma ovviamente non funziona...


cosa significa non funziona? non da segni di vita una volta fornita l'alimentazione? non riesci a completare la compilazione del codice? si accende il led ma poi non si spegne più come previsto?

spiegaci un po' come e cosa non ti funziona ;-)

Se sei alle prime armi, meglio lasciar perdere le interrupt e concentrati sul far lampeggiare il led normalmente con delle istruzioni di delay software. Come faresti un ciclo per far lampeggiare un led con dei delays?

ciao

Re: INTERRUPT con PIC 16f628

MessaggioInviato: 23 dic 2011, 21:18
da Paolino
Ciao Foto Utenteroberto93.
A mio avviso il problema non sta nell'interrupt, in sè. Piuttosto dovresti rivedere la configurazione del PIC. MI spiego meglio: hai impostato come input il pin RB0 con l'istruzione:

Codice: Seleziona tutto
TRISB.B0=1;


Poi, dopo aver abilitato l'interrupt sulla variazione dell'ngresso RB0, quando si scatena l'interrupt vai ad alzare il pin RB5, con l'ìistruzione

Codice: Seleziona tutto
PORTB.F5=1;


Ora, se vai a guardare cosa dice il datasheet del dispositivo, ti accorgi che il valore di TRISB dopo un reset è 0xFF, cioè PORTB è tutta impostata come INPUT. Se vuoi che il tuo codice funzioni, dovrai fare così:

Codice: Seleziona tutto
void main()
{
  TRISB = 0x01; // Solo RB0 è INPUT, il resto è OUTPUT
  PORTB=0;
  INTCON.GIE=1;
  INTCON.INTE=1;

  while(1){
          }
}


Prova così e poi fammi sapere.

Ciao.

Paolo.

Re: INTERRUPT con PIC 16f628

MessaggioInviato: 23 dic 2011, 21:26
da AjKDAP
Ho dei seri problemi :mrgreen:

ho risposto pensando che volessi far lampeggiare un led tramite interrupt, ora ho riletto e ho capito che vuoi solo accenderlo #-o

scusa :) eheh

Re: INTERRUPT con PIC 16f628

MessaggioInviato: 24 dic 2011, 21:48
da roberto93
Ok grazie mille adesso mi funziona ;)