El PIC16F690 pot tenir interrupcions per canvis d'estat en les entrades dels ports A i B. En aquest exemple farem servir l'entrada RA5.
Els polsadors no són bons per treballar amb interrupcions perquè quan es prem un polsador el seu contacte rebota i el microcontrolador detecta diverses activacions de l'entrada. Per evitar aquest problema, en aquest exemple hem fet servir dues plaques de microcontrolador. En la primera placa mirarem el polsador i quan es detecti que s'ha activat activarem la sortida RA5 durant un temps i després la desactivarem. Connectant la sortida RA5 d'una placa amb l'entrada RA5 de l'altra tindrem una activació única. Això no caldria si la interrupció la volguéssim fer, per exemple, amb un sensor, sempre que no tingui sortida per relé.
Aquest primer programa correspon a la primera placa:
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8
void main (void) {
// Configuració d'entrades i sortides
TRISA = 0b11011111; // Posa RA5 com a sortida, la resta entrades
TRISC = 0; // Posa el port C com a sortides
ANSEL = 0; // Desactiva totes les entrades analògiques
PORTC = 0; // Desactiva totes les soortides del port C
while (1){ // Inici del bucle de programa
if (RA3 == 0){ // S'ha activat el polsador
RC0 = 1; // Activa un LED
RA5 = 1; // Activa RA5
_delay(300000); // Retard
RA5 = 0; // Desactiva RA5
_delay(300000); // Retard
RC0 = 0; // Desactiva el LED
}
}
}
Un cop enviat aquest programa al microcontrolador ja podem desconnectar-lo i connectar l'altra placa. Per a les proves caldrà connectar les dues plaques de manera que totes dues estigui alimentades. Així unirem els borns VDD, VSS i RA5 d'un microcontrolador amb els del mateix nom de l'altre.
El programa del segon microcontrolador és el següent:
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8
unsigned char Visualit; // Variable de 8 bits sense signe (0 a 255)
void main (void) {
// Inicialització de variables
Visualit = 0; // Posa Visualit a 0
// Configuració d'entrades i sortides
TRISA = 0b11111111; // Posa el port A com a entrada
TRISC = 0b00000000; // Posa el port C com a sortida
INTCON = 0b00001000; // Activem RABIE
IOCA = 0b00100000; // Activa interrupció a RA5
IOCB = 0; // Desactiva interrupcions del port B
ANSEL = 0; // Desactiva totes les entrades analògiques
ANSELH = 0;
INTCONbits.GIE = 1; // Habilitem les interrupcions a nivell general
while (1){ // Inici del bucle de programa
PORTC = Visualit; // Copiem el valor al port (als LED)
}
}
void __interrupt() ports(void){ // funció d'interrupcions
// void interrupt ports(void){ // Línia alternativa
if (INTCONbits.RABIF){ // Comprovem que hi ha interrupció externa
if (RA5 == 1){ // Mira si la interrupció ha estat per activació
// Ja hem llegit el port A,
// ja es podrà desactivar RABIF
Visualit++; // Incrementa Compta
if (Visualit >= 16) { // Si ha acabat setze vegades
Visualit = 0; // Posa Visualit a 0
}
} // Sinó, no fem res
INTCONbits.RABIF = 0; // Tornem a posar el bit a zero
// (després d'haver llegit el port A)
}
}
Quan provem el programa veurem que inicialment els LED estan apagats i van comptant cada cop que s'activa el polsador. Si no tinguéssim en compte si l'entrada està activada o desactivada tindríem que es comptaria tant en prémer el polsador com en deixar-lo anar. En aquest cas, però, hauríem de consultar igualment l'estat del port A abans de desactivar RABIF ja que en cas contrari no es desactivaria.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.