¿No encuentro las librerías en XC8?

Un saludo a tod@s, hace ya mucho tiempo que no actualizo este blog, en parte porque estoy ocupado en otras cosas y, porque desde hace algún tiempo Microchip ha ido relegando la utilización de las librerías periféricas hasta el punto que generan problemas de compilación con las últimas versiones de XC8. Es lógico que Microchip quiera “descontinuar” estas viejas librerías y enfocarse en crear nuevas herramientas que faciliten la tarea del diseñador.

Hay una nueva herramienta MCC que se ve interesante, lamentablemente el soporte de microcontroladores es muy reducido y está enfocado a los nuevos modelos. Como no lo he utilizado, no puedo opinar sobre si es bueno o malo, pero definitivamente es algo que haré y publicaré en este mismo blog.

En todo caso, para aquellos que tienen problemas con las nuevas versiones de XC8, les sugiero utilizar la XC8 versión 1.34 que fue la última en incorporar soporte completo  a las librerías periféricas. De igual manera continuaré publicando ejemplos de aplicación de los módulos periféricos del procesador utilizando estas “viejas” librerías, en cuanto me quede un poco de tiempo.

¡Hasta pronto!

Instalación de librerías periféricas XC8

En las versiones mas recientes del compilador XC8, ya no se incluyen las librerías periféricas XC8 ya que el directorio plib no existe. Por lo que es necesario descargarlas e instalarlas por separado para poder seguir utilizándolas. Afortunadamente, Microchip incorpora el enlace de descarga de las librerías (peripheral libraries) en la misma página desde donde descargamos XC8. El siguiente es el proceso general de instalación del entorno de desarrollo (omitir los dos primeros pasos si ya se tienen instalados MPLAB X y XC8):

  1. Descargar e instalar el compilador XC8.
  2. Descargar e instalar MPLAB X.
  3. Descargar las librerías periféricas XC8.
  4. Instalar las librerías periféricas en el directorio donde instalamos XC8 (generalmente el instalador detecta el directorio de instalación de XC8). Esperamos a que finalice el proceso de instalación.
  5. Finalmente, ingresamos al directorio de instalación de XC8, en mi caso la ruta es: C:\Program Files (x86)\Microchip\xc8\v1.37\sources\
  6. Verificamos que aparece el directorio plib, ingresamos en él y podremos observar todas las librerías.

plibAbrimos MPLAB X y creamos un proyecto. Damos click derecho al nombre del proyecto, seleccionamos Properties y en la ventana de propiedades damos click en XC8 linker y  finalmente marcamos la opción Link in Peripheral Library.

linker

Ahora ya podremos utilizar las librerías desde MPLAB X en nuestro proyecto. Espero que esta pequeña guía les sea de utilidad.

Saludos,

06 – Interrupción de Cambio en Puerto B del PIC18F4550

Las interrupciones son muy importantes en los sistemas electrónicos microcontrolados ya que proveen un canal a través del cual los dispositivos periféricos solicitan la atención del microprocesador (que se encuentra dentro del encapsulado) ante eventos tales como: finalización de conversión A/D, desbordamiento de un Timer, click o movimiento de un puntero (ej. ratón), presión de teclas de un teclado, etc.

Todos los dispositivos de hardware de una computadora tienen asignada una interrupción (IRQ) para comunicar al microprocesador que deben ser atendidos. De esta manera el CPU puede pausar momentáneamente la ejecución de un proceso para atender otros y así sucesivamente.

El PIC18F4550 cuenta con las siguientes interrupciones:

  • Externas: en este tipo de interrupciones, el microcontrolador utiliza uno de sus pines I/O para recibir la interrupción desde un dispositivo externo. Estas a su vez pueden ser: INT: denominadas “Edge-Triggered” debido a que se pueden programar para activarse en su flanco de subida o flanco de bajada. Son las interrupciones idóneas para controlar dispositivos externos. De cambio en PORTB: “Interrupt-On-Change”, es un tipo de interrupción que utiliza los bits RB4:RB7 del PIC, la interrupción se activará cuando en alguno de estos pines se produzca un cambio de estado de 1 a 0 o viceversa.
  • Periféricas: son interrupciones que se originan en los módulos periféricos internos (dentro del encapsulado) del microcontrolador, tales como: TIMER, ADC, EUSART, CCPx, etc.

 

Interrupciones de Cambio de PORTB.

La interrupciones más simples son las de “Cambio en PORTB”, cuando están habilitadas el microcontrolador monitorea constantemente los pines KBI0, KBI1, KBI2 y KBI3 que corresponden a RB4, RB5, RB6 y RB7 respectivamente. Cualquier cambio de estado en estos pines activará una interrupción.

El registro INTCON, se utiliza para configurar y habilitar la interrupción de cambio en PORTB, su estructura es la siguiente:

INTCON

  • El bit RBIE: habilita la interrupción de cambio en PORTB al asignarle un valor de 1.
  • RBIF: es la bandera de interrupción de PORTB, se pondrá en 1 cada vez que se produzca un cambio en PORTB. Después de atender la interrupción debe ser inicializada en 0.
  • GIE: Es el bit de habilitación de interrupciones globales, debe activarse asignándole un valor de 1.

Cada vez que se produzca una interrupción, el microcontrolador ejecutará un método, cuya firma típica es: void interrupt isr(void) {}. Inicialmente, dentro de este método se debe verificar que bandera de interrupción está activada para así poder atenderla por medio del código correspondiente. El siguiente segmento de código muestra la estructura básica del método.


void interrupt isr(void)
{
 if(RBIF) //Si hay cambio de estado en PORTB
 {
 //Código de atención de la interrupción
 RBIF = 0; //Desactivar bandera...
 }
}

Siempre se debe verificar si la bandera de interrupción deseada está activada ya que en una aplicación real se tienen varias interrupciones habilitadas.

Ejemplo de implementación

Para demostrar cómo utilizar la interrupción de cambio en puerto B, utilizaremos el siguiente circuito:

10_INT_PORTB

El funcionamiento es simple, el microcontrolador mostrará constantemente un conteo de 0 a 255 en el puerto B. Si se produce un cambio en el puerto B, se detendrá el conteo y se mostrará en los leds en que bit se ha producido el cambio. Ej. Si se cambió el estado de KBI0, se mostrará 00000011, si el cambio sucedió en KBI1 se mostrará 00001100 y así sucesivamente. Pasado un segundo, se continuará con el conteo. El código es el siguiente:


#include <xc.h>;

//BITS DE CONFIGURACION.....
#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
#pragma config WDT = OFF, WDTPS = 32768
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF
#pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF

#define _XTAL_FREQ 48000000

void retardo(int t);
int KBIx;
int old_PORTB = 0B11110000;

void main()
{
 ADCON1 = 0x0F;
 TRISB = 0xFF;
 TRISD = 0;
 PORTD = 0;


 INTCONbits.RBIE = 1; //Habilitar interrupciones de puerto B.
 INTCONbits.RBIF = 0; //Bandera desactivada.
 INTCONbits.GIE = 1; //Interrupciones globales habilitadas.

 while(1)
 {
 for(int i = 0; i <= 255;i++)
 {
 PORTD = i;
 retardo(10);
 }
 }
}

void interrupt isr(void)
{
 if(RBIF) //Si hay cambio de estado en PORTB
 {
 //==============================================
 //Según datasheet debe incorporarse esto...
 if(PORTB)
 {
 asm("nop");
 }
 //==============================================
 KBIx = PORTB ^ old_PORTB; //Hacemos una operación XOR
 old_PORTB = PORTB;
 KBIx = KBIx >> 4;
 switch(KBIx)
 {
 case 1:
 PORTD = 0B00000011;
 break;
 case 2:
 PORTD = 0B00001100;
 break;
 case 4:
 PORTD = 0B00110000;
 break;
 case 8:
 PORTD = 0B11000000;
 break;
 }
 retardo(100);
 RBIF = 0; //Desactivar bandera...
 }
}

void retardo(int t)
{
 for(int i = 0; i <= t; i++)
 {
 __delay_ms(10);
 }
}

El microcontrolador detectará cambios en el puerto B cuando se hace una transición de 0 a 1 y viceversa, esto último podemos comprobarlo manteniendo presionado el botón por más de un segundo y posteriormente soltarlo.

En conclusión, este tipo de interrupción es muy simple y nos ha servido como base para que en futuros artículos podamos abordar las interrupciones de los módulos internos del microcontrolador (nuestro principal objetivo). Volveré posteriormente abordando el tema de las interrupciones externas. Saludos a tod@s desde El Salvador.