Questo sito utilizza cookie, anche di terze parti, per migliorare la tua esperienza e offrire servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie vai alla sezioneCookie Policy

Interrupt con RB0/Int

Ultimo aggiornamento: 31/07/2015

L'uso del pin RB0/Int per l'esecuzione di una routine interna al programma causata da un impulso esterno al microcontrollore è una interessantissima funzione disponibile in quasi tutti i microcontrollori in circolazione. E', peraltro, di semplicissima gestione utilizzando linguaggi di alto livello quali, ad esempio, il Mikrobasic od il Mikroc. 

L'uso del piedino RB0/Int per gestire interrupts generati esternamente richiede, infatti, la predisposizione di  un paio di registri del microcontrollore: INTCON e OPTION_REG   

Interrupt intcon

Uno sguardo alla funzione svolta da ogni singolo bit dovrebbe chiarire immediatamente come predisporre il registro per l'utilizzo della funzione RB0/Int del picmicro. Richiede infatti il settaggio di

GIE: set to 1 to enable global interrupts

INTE: a 1 per abilitare interrupts sulpin RB0

PEIE: per disabilitare altri interrups

e settare and il pin INTEDG del registro OPTION_REG semplicemente per scegliere il fronte di attivazione dell'interrupt (passaggio da 0 a 1 oppure passagio da 1 a 0)   

due righe di programma in MIKROC quale esempio


void interrupt(void)         // high portD
{               
  PORTD = 0xFF;     
  delay_ms(500);     
  INTCON.INTF = 0;         // ripristina il flag dell' interrupt
}

void main(void)
{     
  TRISB = 0x01;     
  TRISD = 0x00;     
  INTCON.GIE = 1;                        //abilita Global Interrupt     
  INTCON.INTE = 1;                      //abilita RB0/INT come interrupt esterno      
  INTCON.PEIE = 0;                      //disabilita tutti gli altri interrupts       
  OPTION_REG.INTEDG = 1;     //Interrupt in base a fronte di salita (0>1)     
do        
  {          
   PORTD = 0;        
   } while(1);
}

16f877 interrupt16f628 interrupt


Di seguito un rapido programma per un 16F877 o similare per il pilotaggio di un motore passo passo in seguito ad un impulso sul piedino di interrupt:

 

........                                                   // PORTC.F7 = Direzione
int stepH [] = {1,3,2,6,4,12,8,9};             // mezzo passo  0001  0011  0010  0110 0100 1100 1000 1001
int number,direction;
void interrupt(void){                               // genera la fase
     if (direction)
        { number++;}
        else {number--;}
     if (number>7) number=0;
     if (number<0) number=7;
     PORTD = stepH[number];
     delay_us(5);                                // piccolo ritardo per l'acquisizione corretta del dato
     INTCON.INTF = 0;                      // pulisci interrupt
}

void main(void){
    number = 0;
    direction =1;
    TRISB = 0x01;
    TRISD = 0x00;
     PORTD = 0x00;
     INTCON.GIE = 1;                       //abilita Global Interrupt
     INTCON.INTE = 1;                     //abilita RB0/INT external Interrupt
     INTCON.PEIE = 0;                     //Disabilita unmasked peripheral interrupt
     OPTION_REG.INTEDG = 1;       //Interrupt sul fronte di salita
      do {
         direction=0;
         if (PORTC.F7) direction = 1 ;
         PORTD = 0;                         // disabilita il motore stepper in mancanza di impulsi - per risparmio corrente
         } while(1);
}

Diritti riservati Cuteminds.com 2008-2015. Tutti i marchi riportati sono detenuti dai legittimi proprietari. Tutto il materiale e` liberamente utilizzabile ma non per scopi commerciali. Non si assume alcuna responsabilita` sul materiale pubblicato per eventuali danni diretti o indiretti che possano derivare dall`utilizzo di schemi, progetti o altro materiale presente nel sito. Inviare una mail a: remove-admin@cuteminds.com (contenuti) remove-webmaster@cuteminds.com (webserver) per domande e/o suggerimenti.