You are on page 1of 10

tutorial: manejo de leds, microswitches y relevador en ANSI C,

para PIC 16/







INTRODUCCION:
Existen 2 compaas especializadas en el desarrollo de compiladores C para PICS y que son actualmente las ms conocidas: la primera es
HITECH y la segunda CCS. Debido a que la mayora de los usuarios interesados en la programacin en C para PICS usan algn compilador de
alguna de ambas empresas, este tema y los siguientes habrn de enfocarse en los dos compiladores.
En este tema, se aprender a programar el manejo de 3 dispositivos: los leds, los microswitches y el relevador. El programa que utilizaremos
como ejemplo est especficamente orientado al PIC16F88 y concretamente al hardware del sistema EB88. Sin embargo, hacer modificaciones
en los programas para adaptarse a cualquier otro microcontrolador o a cualquier otra asignacin de puertos y seales es sumamente sencillo,
una vez que se ha comprendido el procedimiento.
El programa que usaremos como ejemplo realiza la siguiente funcin: si el microswitch RA1=0, se realiza una cuenta binaria en los leds del
puerto B. Si RA1=1, entonces enciende y apaga el relevador con un perodo de 1 segundo. Se utiliza un microcontrolador con la frecuencia del
cristal a 4 Mhz. Los diagramas electrnicos y asignacin de puertos y seales puede consultarlos aqu.


CREAR UN PROYECTO EN MPLAB v8.50, USANDO EL COMPILADOR HITECH PRO v9.70
Si usted instala la versin 8.50 de MPLAB, el compilador de HITECH se instala automticamente (por default) en su versin LITE en la
direccin: C:\Archivos de programa\HI-TECH Software\PICC\9.70
-Genere una carpeta con el nombre "LEDS" y almacene all los siguientes archivos: HITECHLEDSTINY.c, y key33.h
-Siga el procedimiento detallado en este archivo: CREAR UN PROYECTO DENTRO DE MPLAB.PDF
EXPLICACION DEL PROGRAMA: En las directivas del preprocesador, se incluye el archivo header <htc.h>. Este archivo contiene las
equivalencias entre los nombres de los puertos, registros y bits con su direccin fsica en el microcontrolador 16F88. A pesar de que no se
escribe el nmero del microcontrolador, el compilador reconoce que se trata del 16F88 porque se le indic cuando se cre el proyecto desde el
MPLAB y busca su driver en el path en donde se instal el compilador. El archivo "key33.h" se incluye porque permite utilizar la funcin de
retraso "DelayMs( )".
Los registros SPEN, ANSEN, CMCON, CVRCON, TRISA y TRISB deben inicializarse dentro del programa principal tal y como se muestra,
para que los leds, los microswitches y el relevador funcionen adecuadamente. Para activar desactivar el relevador, usamos RA0=0; y
RA0=1; como se muestra en el listado de abajo. Los nombres de variables de los 4 microswitches son: RA1, RA2, RA3, RA4.
#include <htc.h> //ARCHIVO HEADER DEL MICROCONTROLADOR 16F88
#include "key33.h" //CONTIENE LA FUNCION DelayMs( ).

main(void){ //AQUI EMPIEZA EL PROGRAMA PRINCIPAL
SPEN=0 //DESHABILITA UART
CMCON=7; //DESHABILITA COMPARADORES ANALOGICOS
CVRCON=0; //DESHABILITA VOLTAJE DE REFERENCIA
ANSEN=0 //DESHABILITA CONVERTIDORES A/D
TRISA=0X1E; //RA0 SE INICIALIZA COMO SALIDA, RA1...RA3 COMO ENTRADAS
TRISB=0x00; //TODOS LOS BITS DEL PUERTO B SE INICIALIZA COMO SALIDAS.
PORTB=0; //SE APAGAN TODOS LOS LEDS
RA0=0; //SE DESACTIVA EL RELEVADOR
while(1) //AQUI INICIA EL LOOP DEL PROGRAMA
{PORTB++; //INCREMENTA EN 1 EL VALOR DEL PUERTO B
dado: if (RA1==1) //SI RA1=1, EJECUTA LO DEFINIDO ENTRE LOS CORCHETES DE ABAJO
{RA0=1; //AQUI INICIA EL SUBPROGRAMA RA0=1 ENCIENDE EL RELEVADOR
DelayMs(200); //LLAMA A FUNCION RETRASO
RA0=0; //RA0=0, APAGA EL RELEVADOR
DelayMs(200); //FUNCION RETRASO 250 MS.
goto dado;} //AQUI SALTA A LA ETIQUETA "dado" HACIENDO UN LOOP
else //SI RA1=0 ENTONCES SALTA A ESTA LINEA
{DelayMs(20); //RETRASO DE 20 MILISEGUNDOS PARA CUENTA BINARIA DE LEDS
continue;}} //REGRESA A LOOP EN LA LINEA DESPUES DE LA DECLARACION "WHILE(1)"
} //ESTE CORCHETE DEFINE EL FINAL DEL PROGRAMA PRINCIPAL
Aqu puede encontrar ejemplos simples de programacin en C para los sistemas
EDUPIC 16F84 y EVOLUPIC 16F628.


CREAR UN PROYECTO EN MPLAB v8.50, USANDO EL COMPI LADOR CCS:
La empresa CCS ofrece la versin PRO que incluye las familias 10/12/16/18 por $150.00 dlares, en versin integrada con el MPLAB. La
direccin default en donde se instala el programa y sus carpetas auxiliares es: C:\Archivos de programa\PICC
-Genere una carpeta con el nombre "LEDS" y almacene all los siguientes archivos: CCSLEDSTINY.c y 16F88.h
- El archivo "16F88.h" contiene la informacin sobre los nombres de los puertos y registros especiales y de los bits. (Ej: PORTB, TRISB, RB0,
RA0, etc.) y sus direcciones en memoria de datos, de tal forma que es posible asignarles un valor en forma directa, como se muestra en el
ejemplo abajo. A este archivo se le hicieron adiciones para hacerlo compatible con el de HITECH. Es necesario incluirlo en la carpeta del
proyecto.
- Configure el proyecto en MPLAB de una manera similar a la indicada ms arriba para el caso del compilador de HITECH. En la opcin
"Active Toolsuite" elija el compilador de CCS.
EXPLICACION DEL PROGRAMA: A diferencia del compilador de HITECH, es necesario usar la directiva #include "16F88.h". Este archivo
debe almacenarse en la misma carpeta junto con el programa fuente CCSLEDSTINY.c La directiva "use delay" permite usar la funcion
delay_ms( ). El programa principal es casi idntico al usado para el compilador de HITECH. El nombre de la funcin de delay que en este caso
es delay_ms( ). No es necesario en CCS inicializar los registros SPEN, CVRCON, CMCON, ANSEN.
#if defined(__PCM__)
#include "16F88.h" //ARCHIVO HEADER DEL MICROCONTROLADOR
#use delay(clock=4000000) //DIRECTIVA PARA FUNCION delay_ms( )
#rom 0X0000={0X018A,0X2803} //DATOS REQUERIDOS POR FIRMWARE TINY PARA 16F88
#build(reset=0x0003)
main(void){ //AQUI EMPIEZA EL PROGRAMA PRINCIPAL
TRISA=0X1E; //ESTA PARTE ES IDENTICA A LA USADA PARA EL COMPILADOR
TRISB=0; //DE HITECH.
PORTB=0; //TODOS LOS LEDS SE APAGAN
RA0=0; //SE DESACTIVA EL RELEVADOR
while(1)
{PORTB++;
dado:if(RA1==1)
{RA0=1;
delay_ms(1000); //FUNCION DE RETRASO.
RA0=0;
delay_ms(1000);
goto dado;}
else
{delay_ms(20);
continue;}}
} //ESTE CORCHETE DEFINE EL FINAL DEL PROGRAMA PRINCIPAL









tutorial: manejo de rutinas de interrupcin
en C




Antecedentes:
en un tutorial de la seccin correspondiente a programacin en lenguaje
ensamblador, se explica el mecanismo de interrupciones realizado por el
16F84/F628/F88 para el manejo de varios de sus dispositivos internos. En
particular, en el proyecto Reloj de Tiempo Real, se desarroll un programa
escrito en lenguaje ensamblador, para mostrar la hora en un LCD,
empleando la interrupcin del TIMER0.
Descripcin: en este tutorial, se explican las capacidades que tiene el
lenguaje C (compilador CCS), para el manejo de interrupciones y el uso
de las mismas en el caso particular del microcontrolador 16F88.
Si se le compara con el desarrollo en lenguaje ensamblador, el uso de
interrupciones desde C representa un ahorro considerable en tiempo,
debido a la gran simplificacin en el manejo de bits, registros y variables.

LISTA DE INTERRUPCIONES DISPONIBLES EN EL 16F88, UTILIZANDO EL COMPILADOR CCS. EXISTEN 12 POSIBLES
FUENTES DE INTERRUPCION:
DIRECTIVA DE INTERRUPCION CONDICION QUE GENERA LA INTERRUPCION
#INT_AD Dato resultado de la Conversin Analgica- digital, listo
#INT_COMP Dato proveniente del comparador analgico, listo
#INT_CCP1 Dato de captura comparacin, listo
#INT_EEPROM Escritura de dato en EEPROM, completa
#INT_EXT Seal de interrupcin externa, activa
#INT_RB Cambio de nivel en entradas digitales RB4...RB7
#INT_RDA Dato en buffer de recepcin en UART, listo para leerse
#INT_ SSP Lneas de SPI I2C, activas
#INT_TBE Buffer de trasmisin de UART, listo para recibir dato
#INT_ TIMER0 Overflow en temporizador 0
#INT_TIMER1 Overflow en temporizador 1
#INT_TIMER2 Overflow en temporizador 2
El programa que se usar para ejemplificar el uso de interrupciones en C es el mostrado en la ventana de abajo. Usando el TIMER1, se genera
una base de tiempo de 1 segundo, a travs del mecanismo de interrupciones. En este ejemplo, el programa principal "main" enciende y apaga el
led RB0 cada segundo.
Los mismos bloques sealados con las llaves azules en el programa son indispensables incluirlos en caso de manejar rutinas de interrupcin
para cualquier otro dispositivo.
El TIMER1 es un registro que tiene 16 bits. Su carga inicial es de 0x0000 e incrementa cada vez que se genera 1 pulso en su clock. El TIMER
genera una interrupcin cada vez que existe un "overflow", es decir que la cuenta alcance 0xFFFF y pase a 0x0000. Si se usa el oscilador
interno de 4 Mhz, el clock del TIMER1 tiene una frecuencia de FOSC/4, y un perodo de 1 us. Esto significa que se genera una interrupcin
cada 65536 us.
Observe los 3 comandos de CCS que permiten fcilmente operar el TIMER1. Estos mismos comandos se utilizan tambin con el resto de los
dispositivos mostrados en la tabla de arriba:
"setup_timer_1(TI_INTERNAL|TI_DIV_BY_1)" permite configurar bits particulares en el registro de control de 8 bits del temporizador 1. En
este caso, se elije el funcionamiento del temporizador con el oscilador interno del 16F88 (T1_INTERNAL) y un preescalador de la frecuencia
del temporizador que divide entre 1 (T1_DIV_BY_1). El operador " | " realiza el "OR" de ambos datos de 8 bits, realizando una suma
booleana.
"enable_interrupts(INT_TIMER1)", habilita la interrupcin del temporizador 1.
"enable_interrupts(GLOBAL)", habilita las interrupciones en el 16F88 en forma global.
La directiva #int_TIMER1 debe escribirse antes de la funcin de interrupcin. La funcin de interrupcin puede llevar cualquier nombre. En
este caso se le nombr "TIMER1_isr( )" (isr significa: interrupt subrutine)
Cargue el archivo CCSINTSEGUNDOTINY.hex en el sistema EVOLUPIC Bootloader 16F88, usando el software TINY, y compruebe que el
programa funciona correctamente. Vea una aplicacin de esta rutina en el proyecto Reloj de Tiempo Real de alta precisin para 16F88
PROGRAMA DE PRUEBA INTERRUPCION TIMER 1
CCSINTSEGUNDOTINY.c Rutina de interrupcin. Proporciona una base de tiempo de 1 segundo.
CCSINTSEGUNDOTINY.hex

You might also like