Você está na página 1de 23

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Bienvenidos al mundo PIC.


Una de las cosas que ms fascinan en la electrnica, es programar un
microcontrolador, independiente de las marcas comerciales, tanto AVR como
Microchip (entre los ms conocidos).
En este tutorial, haremos una introduccin bsica a la programacin de un
microcontrolador de la Microchip, dentro de los cuales se usar uno de los ms comunes
(PIC16F877a). La programacin de estos ejemplos, se realizara con el programa PIC C
COMPILER o tambin conocido como CCS, el cual trabaja con las bases del lenguaje C.
Adems usaremos el Programador PICkit 2, el cual ser utilizado en todos los ejemplos
vistos, acompaado del simulador PROTEUS.
Para un buen desarrollo de este tutorial, se recomienda tener conocimientos bsicos
en lenguaje de programacin C, dado que habr funciones que no correspondern al
tutorial en si.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Programador PICkit 2.
El programador PICkit 2 esta compuesto por las siguientes partes.

PICkit 2
1. Leds: Indican el estado del programador.
2. Botn de programacin: Utilizado como atajo al momento de programar un
dispositivo. Funciona si la opcin Write on PICkit Button esta habilitado.
3. Conexin para cordn.
4. Puerto USB para conexin con el computador.
5. Marcador del primer Pin (MCLR).
6. Conector de programacin.
La conexin con el microcontrolador se realiza segn el siguiente esquema.

Conector PICkit 2
1.
2.
3.
4.
5.
6.

Master Clear Reset (MCLR).


Vdd. (Voltaje +)
Vss. (Tierra)
PGD. (Data)
PGC. (Clock)
Pin Auxiliar.

Una caracterstica importante de este programador es que permite alimentar nuestros


proyectos con un consumo mximo limitado por la capacidad del puerto USB, es decir,
100mA por puerto.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Caractersticas del Software PICkit 2 Programmer


El software utilizado es el PICkit 2 Programmer. La captura de pantalla es mostrada a
continuacin.

Pasos para programar un microcontrolador


1. Comprobar que en la Ventana de Estado aparezca el dispositivo encontrado.
Adems en la seccin Dispositivo debe aparecer el microcontrolador utilizado. En
caso de existir un error, se debe verificar la conexin e ir a Tools>Check
Communications.
2. Ir a File>Import Hex y cargar el programa correspondiente, previamente
compilado.
3. Click en Write y listo!
Para alimentar el circuito desde el programador se debe marcar la casilla On.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Estructura bsica de un programa en CCS.


En este tutorial se muestra el modo bsico de utilizacin del compilador CCS. Adems se
analizar la estructura bsica de los programas en C.

Utilizacin del PIC Wizard


La herramienta PIC Wizard es utilizada para realizar de forma automatica el cdigo base
de nuestros proyectos. Los pasos siguientes describen la generacin bsica del cdigo.
1. Ir a Project>PIC Wizard.
2. Guardar el proyecto en una carpeta.
3. A continuacin aparecera la pantalla que se muestra en la siguiente fotografia.

4. Elegir las opciones correspondientes al proyecto a realizar. Luego dar click en Ok.
5. Aparecer el cdigo realizado por PIC Wizard. Se muestra en la siguiente imagen.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

En la primera lnea del programa se puede apreciar que se hace referencia a un


archivo externo. De preferencia personal, copio el cdigo contenido en ese archivo para
poder tener a la vista todos los fuses mientras completo el resto del software. Para quedar
de la siguiente forma.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Finalmente para compilar se da un click en Compile>Compile.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Programando mi primer PIC.


Como bien sabemos, cada componente electrnico de 3 o ms pines, tiene un
pinout, por los cuales se conectan debidamente. Por ende los microcontroladores no son la
excepcin. Para trabajarlos debemos saber como conectarlos y para eso debemos buscar el
datasheet, dado que trabajaremos en este tutorial con 2 microcontroladores, anexare el
pinout de ambos a continuacin:

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Conexin bsica de un microcontrolador.


En esta seccin aprenderemos el manejo bsico de puertos de
microcontroladores PIC, utilizando el programador PICkit 2 y el compilador CCS.

los

Materiales a utilizar:

PIC16F877A.
Cristal 20Mhz.
Leds.
Capacitores 22pF.
Resistores 330.
Resistor 1ok.
Programador PicKit 2.
Compilador CCS.

Existen diversas formas de conectar un microcontrolador PIC16F877A para realizar un


proyecto bsico. Estas formas son mostradas en la figura que aparece a continuacin.

En ambas figuras se utiliza un resistor de 10k en el MCLR (Master Clear Reset). Este
Pin cumple la funcin de resetear el microcontrolador cuando es llevado a tierra, por ello,
para el normal funcionamiento del programa se debe mantener conectado mediante un
resistor a la alimentacin.
La principal diferencia entre las dos conexiones mostradas anteriormente ocurre en la
utilizacin del Cristal. La figura izquierda muestra el microcontrolador utilizando un cristal
externo de 20Mhz, mientras que el de la derecha utiliza un cristal interno de 4Mhz. En estos
tutoriales utilizaremos la conexin mostrada en la posicin derecha.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Ejemplo 1: Prendiendo Leds


A continuacin conoceremos las distintas formas que posee CCS para el manejo de
los puertos del microcontrolador. Lo primero que se debe realizar es seleccionar cada pin
del puerto como entrada o salida. Para esto se utiliza la funcin set_tris_x. A continuacin
algunos ejemplos.
//valor 0 representa pin de salida, valor 1 representa pin de entrada.
set_tris_a(0x00); //Puerto A como salida.
set_tris_b(0b10010000); //Puerto B, pines B4 y B7 como entrada, el resto
como salida

Si el pin es definido como salida, tenemos dos formas de manejar sus estados logicos.
La primera es manejando el puerto completo manejando cada pin por separado.
//Opcin 1: Manejando todos los pines del puerto
//Se define un byte (fuera del main) con la direccin del puerto (Ver
Datasheet)
#Byte puerto_b = 0x06 //Direccin del puerto B
//Luego se aplican valores
puerto_b = 0b10100100; //Los pines B2,B5 y B7 estn en un estado lgico
alto (+5V),
//--------------------------------------------//Opcin 2: Manejando todos los pines del puerto, sin definirlo
output_b(0b10010000); //Los pines B7 y B4 estn en un estado lgico alto
(+5V),
//--------------------------------------------//Opcin 3: Manejando los pines uno a uno.
//Utilizando output_high y output_low
output_high(PIN_A1); //Estado lgico alto (+5V) el pin 1 del puerto A.
output_low(PIN_C3); //Estado lgico bajo (0V) el pin 3 del puerto C.

Una de las formas de darle tiempo de funcin al pin, ya sea para mantenerlo en un
estado logico alto o bajo, se da con la sentencia delay_ms(); delay:us; depende si estas
trabajando en milisegundos o microsegundos respectivamente.
//Un tiempo puede servir para una o ms funciones
output_high(pin_b4);
//Estado lgico alto (+5V) el pin 4 del puerto B.
delay_ms(400);
//Tiempo de trabajo 400 milisegundos.
output_low(pin_b4);
//Estado lgico bajo (0V) el pin 4 del puerto B.
output_high(pin_b5):
//Estado lgico alto (+5V) el pin 5 del puerto B.
delay_us(2000);
//Tiempo de trabajo 2000 microsegundos.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Con todo lo anterior listo, estamos en condiciones de hacer parpadear distintos leds,
para ellos se utilizar el diagrama de conexin mostrado en la figura siguiente.

Ahora el programa a utilizar har que cada 500 milisegundos cambie el Led que
prende, pueden modificarlo y comprobar los ejemplos vistos anteriormente.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Ejemplo 2: Programando pantalla LCD


En el siguiente ejemplo, manejaremos una pantalla LCD de 16x2, la cual ser
conectada a el PIC16F877A, por el puerto D, si se desea usar un PIC16F628A, se
recomienda usar el puerto B y modificar la librera.
El pinout de la pantalla LCD, es el siguiente:

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

16.

VSS:
VDD:
VEE:
RS:
RW:
E:
D0:
D1:
D2:
D3:
D4:
D5:
D6:
D7:
VDD:
VSS:

Tierra
Voltaje (+3.3 a +5V)
Ajustador de contraste
Selector de Registro (Register Select). RS=0: Comando, RS=1: Data
Lector/Escritor (Read/Write). R/W=0: Escribe, R/W=1: Lee.
Habilitador [Clock (Enable)]. Cada de borde Accionado.
Bit 0 (No se usa en una operacin de 4-bit)
Bit 1 (No se usa en una operacin de 4-bit)
Bit 2 (No se usa en una operacin de 4-bit)
Bit 3 (No se usa en una operacin de 4-bit)
Bit 4
Bit 5
Bit 6
Bit 7
Voltaje Backlight (V+)
Voltaje Backlight (V-)

NOTA:
Se recomienda usar un potencimetro conectado al pin de contraste para variar este
a gusto.
El Backlight no viene incorporado en todas las pantallas LCD, por lo cual algunas
pueden variar entre 14 pines (sin backlight) o 16 pines (con backlight incorporado o espacio
para este).

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Para programar la pantalla LCD, usaremos la librera <lcd.c>, en las cuales


podremos usar nuevas funciones:
//Funcin OBLIGATORIA para iniciar la pantalla
lcd_init();
Sin esta, la pantalla no funciona
//----------------------------//Funciones para escribir la pantalla
lcd_putc( ); Entre comillas se escribe lo que quieren mostrar
printf(lcd_putc, );
ejemplo: lcd_putc(hola mundo!);
delay_ms(500);
//----------------------------//Funciones de posicin
//Funcin que asigna posicin
lcd_gotoxy(x,y); donde x: indica posicin del primer carcter
y: indica lnea de la palabra
ejemplo: lcd_gotoxy (5,1);
lcd_putc(hola);
lcd_gotoxy (9,2);
lcd_putc(mundo);
Se ver as:
1|
2|

1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
h o l a
|
m u n d o
|

//Funcin que devuelve la posicin


lcd_getc(x,y); Te da la posicin
//----------------------------//Caracteres especiales de control
\f Borra el display
\n Salta a la segunda lnea
\b Retrocede una posicin
Ejemplo: lcd_putc(\f);

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Ahora, con las funciones ya vistas, para lo cual utilizaremos el siguiente diagrama
de conexin micro-pantalla:

Ahora ya podemos hacer que nuestra pantalla haga lo que se requiere, para este
ejemplo haremos que la pantalla muestre MundoPIC en movimiento, para lo cual
usaremos el siguiente programa:

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Ejemplo 3: Leyendo entrada ADC (conversor anlogo a digital)


Ahora realizaremos un ejemplo para la lectura de un ADC, para esto usaremos
una resistencia variable (un potencimetro). Con este tipo de lectura, se pueden desarrollar
una cantidad enorme de lectura de sensores, dependiendo de las entradas ADC que posea el
microcontrolador. Estas estn denotadas por ANx donde x es un nmero que parte desde 0.
Ejemplo: El pic16f877a tiene 8 entradas ADC (desde AN0 a AN7).
Para usar este tipo de entradas, no se necesita definir una librera como tal, ya que
estas funciones vienen incluidas dentro de la librera del PIC correspondiente.
Las sentencias a usar en estos casos son:
//Funcin que determina el nmero de bits que retorna read_adc();
#device ADC=X, donde X es la cantidad de bits que retornar.
Ej: #include<pic16f877a.h>
#device ADC=8
// me retorna un nmero de 8 bits.
//Funcin que sirve para definir los puertos ADC a usar.
setup_adc_ports(); entre parntesis va el o los ADC.
Ej: 1)setup_adc_ports(AN0); para usar solo el puerto AN0 como anlogo
2)setup_adc_ports(AN7, AN6); usas AN7 y AN6 como anlogos
3)setup_adc_ports(ALL_ANALOG); usas todos los puertos anlogos
//Funcin para poner el canal de trabajo
set_adc_channel(X); X varia de 0 y varia segn ANx.
Ej: set_adc_channel(0); usa el canal 0 para trabajar
//Funcin para declarar el tiempo de trabajo
setup_adc(ADC_CLOCK_INTERNAL); usa el oscilador interno del ADC.
setup_adc(ADC_CLOCK_DIV_X); donde X=2,4,8,16,32,64,128,256.
Ej: setup_adc(ADC_CLOCK_DIV_8); el timer del micro se divide por 8.
//Funcin para guardar datos del ADC.
read_adc(); esta sentencia solo lee el dato, el cual debe ser guardado en
un float, int o el que deseen.
Ej: value=read_adc();
delay_ms(10);

Nota: por lo general los datos obtenidos varan entre 0 a 255.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Con lo antes visto, vamos a seguir con el ejemplo. A continuacin vamos a


mostrar la lectura del ADC en una pantalla LCD, para el cual usaremos la siguiente
configuracin del PIC.

En el circuito superior, se muestra una conexin del potencimetro a la entrada


AN0 del microcontrolador, por lo cual el canal a usar ser 0. Adems como el
potencimetro en algn momento puede llegar a ser cero (como toda resistencia variable),
le ponemos en serie una resistencia estable, para que as no se provoque un corto circuito.
Luego de esto en el software sera mucho ms fcil trabajar con un ADC=8 ya
que retornara un valor entre 0 a 255.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

El programa a utilizar es el siguiente:

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Ejemplo 4: Seal de PWM (Modulacin de ancho de pulso)


Uniendo un poco de los ejemplos anteriores, disearemos un programa el cual
pueda dar una modulacin a un pulso emitido por un pin especfico del
microcontrolador(ccp1 o ccp2), el cual har varias la intensidad lumnica de un LED. Esto
lo haremos tomando la variacin de ADC con un potencimetro.
Las funciones que se aaden a lo antes visto sern las siguientes:
//Funcin para definir frecuencia de trabajo
setup_timer_2(T2_DIV_BY_X, periodo, T2DIV set to );
Donde X puede ser un divisor exacto de 256.
El periodo es un valor entre 0 y 255.
T2DIV set to es para acomodar la frmula y tener frecuencias ms bajas
o altas.
Ej: setup_timer_2(T2_DIV_BY_1, 49, 1); en este caso se puede trabajar a
20KHz trabajando con un cristal de 4MHz.
//Funcin para la seleccin de PIN de PWM a usar
setup_ccpX(CCP_PWM); X es un valor dependiendo del PIN de PWM a usar
Ej: setup_ccp1(CCP_PWM); Habilitamos CCP1 como salida de PWM.
//Funcin que permite emitir un valor mediante el PIN.
set_pwmX_duty(valor); X debe ser el mismo que el del PIN seleccionado.
El valor es un numero que vara entre 0 y 255 (256 bits).

Nota:
La frmula para determinar la frecuencia de trabajo est dada de la siguiente
forma:
F = (4/frecuencia cristal)*T2_DIV*(periodo+1)
Ej: Para la frecuencia de 20KHz.
F = (4/4000000)*1*50 = 50/1000000 = 0.000050 = 50us
Si dividimos 1 en 50us (1/50us) obtenemos los 20KHz de trabajo. Ojo que la frecuencia de
trabajo la obtenemos en ciclos por eso nos da en funcin del tiempo, y como bien es sabido,
si tenemos un periodo, la inversa es la frecuencia.

Nota2:
La frecuencia de trabajo se determina segn lo que se quiere manejar, por
ejemplo, en el caso de un LED o SERVOMOTOR la frecuencia es de 50Hz.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Una vez entendido el cdigo, procedemos con la conexin del circuito, que sigue
teniendo como base lo antes visto.

El circuito recin presentado, sirve para realizar la variacin de intensidad


lumnica de un LED, como se explicaba anteriormente. Adems, mostrar la variacin de
los valores que a este se le entregan por la lectura del ADC a este.
Una de las grandes diferencias que se no se pueden ver en la conexin, pero si en
el programa, es que usaremos un cristal de 4MHz, ya que el LED trabaja a una frecuencia
de 50Hz, y al aplicar la frmula con un cristal de 20MHz no se alcanza a obtener la
frecuencia requerida.
Este ejemplo se recomienda no simularlo, y desarrollarlo en su totalidad, ya que
en la simulacin solo se ve el LED parpadeando a distintas velocidades.
Como se dijo en un ejemplo anteriormente, los valores del potencimetro y
resistor pueden variarlos para que traten de quedar en el rango de 0 a 255.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Veamos el cdigo.

Nota:
Cambiamos HS (high speed) por XT (external timer) en los fuses, ya que la
frecuencia de trabajo del cristal (4MHz) no alcanza a quedar en el rango de altas
velocidades. Cabe decir que HS y XT se usan para cristales externos dependiendo de su
velocidad.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Ejemplo 5: Comunicacin Serial


Ahora que ya sabemos un poco sobre el uso de los microcontroladores, Qu pasara si con
uno no puedo hacer todo lo que quiero? Hay varias veces que necesito dos circuitos
procesando en paralelo dentro de la misma placa y pasa esto est la comunicacin serial.
Para esto lo primero que debemos hacer, despus de agregar el clock microcontrolador, es:
//Ya agregadas las libreras
#use delay(clock=20000000)
#use rs232(baud=9600,parity=n,xmit=pin_C6,rcv=pin_C7,bits=8)
Donde BAUD: es la velocidad a la que se quiere transmitir
ser igual en el pic emisor y en el receptor)
Parity: es el bit de paridad (ultimo bit que define si es
Xmit: es donde se debe conectar el pin como emisor (C6 en
Rcv: es donde se debe conectar el pin como receptor (C7)
Bits: es el nmero de bits por transmisin, puede ser 8 o

los datos (debe


par o impar)
nuestro caso)
9

//Nuevos comandos
Ahora podremos usar las funciones GETC(), PUTCHAR(), PRINTF() Y PUTC()
//Interrupcin de lectura
Como podemos estar recibiendo datos en pleno funcionamiento del sistema,
debemos crear una interrupcin para que los datos no se pierdan.
Las interrupciones se manejan de la siguiente manera
char caracter;
//Variable a guardar dato de entrada
#INT_RDA
//Define la interrupcion (funcin que le sigue)
void int_rda_sr(){
//Define la funcion
if(kbhit()){
//Hay seal de entrada? Si, entro.
caracter = getc(); //Guardo mi caracter
if(caracter == 'A'){} //comparo y actuo
if(caracter == 'B'){}
...]]
//Mandar datos
Ya sabemos cmo recibirlos, pero cmo lo enviamos?
Ejemplo:
if(valor==1){
printf("A");}
Y ya se mand el dato.

Se ve poco ms complicado que lo anterior, pero sigue siendo un poco ms de lo mismo.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

El circuito a utilizar ser el siguiente:

En este ejemplo buscaremos leer la seal ADC y enviar datos de forma serial al otro
controlador el cual tomara la decisin de prender cierto led cada vez que est dentro de un
rango definido.

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

A continuacin veremos el cdigo para el emisor:

PROYECTO FINANCIADO POR FONDO CONFIA

Taller de Introduccin a la Programacin y Simulacin de Microcontroladores

Y ac para el receptor:

PROYECTO FINANCIADO POR FONDO CONFIA

Você também pode gostar