Sei sulla pagina 1di 12

El microcontrolador PIC16F84/A

Introduccin.
Los microcontroladores son ordenadores digitales integrados en un chip que
cuentan con un microprocesador o unidad de procesamiento central (CPU), una
memoria para almacenar el programa, una memoria para almacenar datos y
puertos de entrada/salida. A diferencia de los microprocesadores de propsito
general, como los que se usan en los ordenadores PC, los microcontroladores
son unidades autosuficientes y ms econmicas. El funcionamiento de los
microcontroladores est determinado por el programa almacenado en su
memoria. Este puede escribirse en distintos leguajes de programacin. Adems,
la mayora de los microcontroladores actuales pueden reprogramarse repetidas
veces. Por las caractersticas mencionadas y su alta flexibilidad, los
microcontroladores son ampliamente utilizados como el cerebro de una gran
variedad de sistemas embebidos que controlan mquinas, componentes de
sistemas complejos, como aplicaciones industriales de automatizacin y
robtica, domtica, equipos mdicos, sistemas aeroespaciales, e incluso
dispositivos de la vida diaria como automviles, hornos de microondas,
telfonos y televisores

Esquema

de

pines

Programador

El circuito programador
JDM PIC Programmer 2 (JDM2) es una interfaz de hardware muy simple que
permite programar al microcontrolador PIC16F84 con muy pocos componentes,
ya que se alimenta directamente del puerto serie RS-232 del PC sin requerir
una fuente de alimentacin externa.
Las resistencias requeridas, tanto R1 (1k5 Ohmios) como R2 (10kOhmios),
pueden ser de baja potencia (0.25W). Los diodos D1, D2, D5, D6 son diodos
rectifcadores cualquiera (Zener), aunque se recomienda el 1N4148. El diodo D3
debe ser un diodo Zener de 6.2v como el BZV55C6V2 y debe colocarse en
serie con el led como se muestra en el esquemtico. El diodo Zener D3 y el led
pueden reemplazarse por un unico diodo Zener de 8.2 V. El diodo D4 tambin
es un diodo Zener, pero de 5.1v como el BZV55C5V1. Tanto el condensador C1
(100 microfaradios, 16v) como el condensador C2 (22 microfaradios, 16v)
deben ser electrolticos. El condensador C2 tambin puede reemplazarse por un
condensador de 100 microfaradios, 16v como C1.

Dada la simpleza del circuito JDM2, se sugiere construirlo directamente en una


placa PCB, de modo que sea ms duradero y su operacin ms confable. Para
que el PIC16F84 entre en modo de programacin debe forzarse un estado lgico
0 en RB6 (pin 12) y RB7 (pin 13), mientras que MCLR (pin 4) debe llevarse a 0
por un periodo corto para resetear el microcontrolador, e inmediatamente
despus deber elevarse y mantenerse en un voltaje entre 12v y 14v durante
toda la programacin. Una vez que el microcontrolador ha entrado en modo de
programacin, se utiliza RB7 (PGD o Program Data) para ingresar serialmente
la informacin, mientras que RB6 (PGC o Program Clock) se utiliza como seal
de reloj para aceptar cada bit en RB7. Esto se logra mediante el software
programador. Los detalles del protocolo de programacin pueden encontrarse
en la documentacin del fabricante. Es importante destacar que este diseo
minimalista requiere que el puerto serial del PC entregue al circuito los niveles
de voltaje y potencia adecuados. Por esta razn el programador puede
presentar problemas de funcionamiento en ciertos ordenadores, como aquellos
que utilizan circuitos seriales de baja potencia para ahorro de consumo muy

comunes en algunos ordenadores porttiles. En todo caso, el circuito JDM2


puede ser modificado segn la especificacin de programacin ya descrita para
utilizar una fuente de alimentacin externa.

Ejemplo

de

programacin

Un ejemplo muy simple y demostrativo para iniciarse con un microcontrolador


es hacer parpadear un LED. Para esto se implementar un programa que
continuamente cambie el estado de un pin y espere cierto tiempo antes de
repetir la accin. En este ejemplo se utilizar el lenguaje JAL para desarrollar el
programa. En las siguientes secciones se indican los pasos necesarios para
implementar el parpadeo de un LED.
Escriba el cdigo del ejemplo que se muestra a continuacin en un procesador
de textos simple y grbelo en un archivo con extensin .jal
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

-- Ejemplo 1
-- Inclusiones
include 16f84_4
include jlib
-- Configuracion
pin_b7_direction = output
-- Variables
var bit led is pin_b7
led = high
-- Loop Principal
forever loop
-- Cambio de estado del pin
led = ! led
-- Retardo
delay_1ms(250)
end loop

El alto nivel de JAL permite que el cdigo sea bastante autoexplicativo.


Los comentarios se incluyen con el prefijo '--'.
Es fundamental dejar un espacio en blanco entre el prefijo de comentario y la
frase de lo contrario se producirn errores de compilacin.
Los archivos en las lneas 4 y 5 son incluidos ya que estos contienen
definiciones especficas del PIC16F84, como las correspondientes a las
direcciones de memoria para pin_b7 y pin_b7_direction, y las funciones que
generan el retardo.
En la lnea 8 se define la direccin de RB7 (pin 13) como pin de salida.
En las lneas 11 y 12 se define la variable led y se la asigna a RB7 con un
estado inicial activo.
Finalmente, entre las lneas 15 y 20 se encuentra el loop del programa, el cual
se ejecuta indefinidamente.

En este se cambia el estado del pin/led (lnea 17) y se genera un retardo de


250ms mediante la funcin delay_1ms (lnea 19) para producir una pausa en el
encendido o apagado del led. La funcin delay_1ms() causa un retardo de 1 ms
multiplicado por su argumento. Su funcionamiento se basa en el hecho de que
una instruccin (en Assembler) tarda 4 ciclos de reloj, por lo que se ejecuta un
loop auxiliar el nmero de veces requerido segn la velocidad del reloj, tal que
el tiempo transcurrido antes de continuar con la ejecucin del resto del
programa sea igual al especificado. La velocidad del reloj se encuentra
especificada en el programa dado que se incluy la versin de 4 MHz (lnea 4)
de las funciones especficas de PIC16F84.

Compilacin
JAL

del

programa

En el directorio donde guard el archivo del ejemplo compile el cdigo mediante


la siguiente lnea de comando:
[directorio]\jal -s[directorio]\lib archivo.jal

Donde [directorio] se refiere al directorio donde instal JAL, archivo.jal es el


archivo donde guard el cdigo del ejemplo. El parmetro -s..\lib indica al
compilador que debe buscar las libreras utilizadas en la carpeta lib. JAL
generar los archivos archivo.asm y archivo.hex, que corresponden al cdigo
en Ensamblador y al cdigo de mquina ya ensamblado, respectivamente.
Alternativamente, se puede crear una carpeta llamada, por ejemplo, 'trabajo', en
el directorio donde instal JAL y colocar el cdigo del ejemplo en dicha carpeta.
Luego bastara con ejecutar el siguiente comando de compilacin desde la
carpeta 'trabajo': ..\jal -s..\lib archivo.jal

Programacin bsica en JAL

COM ENTARIOS
Para comentar una lnea se escriben dos guiones y un espacio delante de cada
lnea. Ya que el comentario no tiene sintaxis de fin no es posible comentar
muchas lneas de golpe como con otros lenguajes de programacIN.
-- ESTO ES UN COMENTARIO
if ( variable == true ) then
pin_a3 = false
bajo nivel
pin_a2 = variable2 and true
valor de la (variable2 x 1)
end if

-- El pin nmero 3 se establece a


-- El pin nmero 3 se establece al

VARIABLES
De tipo BIT: Son las que pueden tomar un valor 'Verdadero' o 'Falso' o bien,
nivel alto o nivel bajo. Con un ejemplo se ver ms claro:
-- DECLARACIN E INICIALIZACIN DE LA VARIABLE
var bit a = high
pin_a0 = x

De tipo BYTE: Son las que pueden tomar un valor entre 0 y 254
-- DECLARACIN E INICIALIZACIN DE LA VARIABLE
var byte n = 99, m = 20
if n > m then
pin_a4 = high
end if
-- BUCLE FOR DE 'm' REPETICIONES
for m loop
n = n -1
if n == 92 then
pin_a4 = low
delay_10ms(50) -- RETRASO DE 500milisegundos
-OBTENDRAMOS
EL
MISMO
ESCRIBIENDO: delay_500ms
end if

RESULTADO

if n < 89 then
pin_a0 = low
pin_a1 = high
delay_20ms
end if
end loop

De tipo UNIVERSAL: Solo estn disponibles en tiempo de diseo lo cual impide


que podamos trabajar con ellas en tiempo de ejecucIN.
const xtal = 10_000_000
const mips = xtal / 4

OPERADORES
== igualdad
> Mayor que
< Menor que
=< Menor o igual que
>= Mayor o igual que
! o != Distinto de / Negado

LA

CONDICIN

No tiene ningn misterio, es como en otros lenguajes de programacin. No es


obligatorio escribir la evaluacin entre parntesis y se pueden concatenar varias
evaluaciones utilizando AND y OR. Tambin es posible escribir la condicin en
varias lneas o en una sola.
-- CONDICIN EN VARIAS LNEAS
if a > b then
a = b + 1
else
a = b - 1
end if
-- CONDICIN EN UNA SOLA LNEA
if a > b then a = b + 1 else a = b - 1 end if

INCLUDE
Es muy habitual en casi todos los programas incluir ficheros en los que ya
vienen definidas muchas variables, configuraciones, alias y subprogramas
especialmente adaptados al microcontrolador que vamos a programar. Por
ejemplo, si queremos programar un PIC12f675 deberemos incluir lo siguiente:
include f675_4i -- CONFIGURACIN DE PUERTOS Y DISPOSITIVO, VARIABLES
Y SUBPROGRAMAS ESPECIALES
include jlib
-- CONSTANTES Y VARIABLES ESTANDAR

A su vez, estos ficheros incluidos pueden incluir otros distintos.

SUBPROGRAM AS
Desde cualquier parte del cdigo podremos llamar a un subprograma o funcin
que hayamos creado:
procedure SubPrograma is
var byte a
a = 5

var byte b
b = a
end procedure

De esta forma, para llamar al subprograma solo escribiremos 'SubPrograma' y


automticamente se ejecutara el contenido
Tambin podemos crear subprogramas a los que podamos enviar variables
procedure SubPrograma ( byte in a ) is
var byte b
b = a
end procedure

En este caso, para llamar al subprograma escribiremos 'SubPrograma ( 5 )' y


automticamente se ejecutara el contenido

FUNCIONES
Es muy parecido a un subprograma, solo se diferencia en que puede devolver
valores despus de haberlos procesado
function Calcular ( byte in x ) return bit is
if x == 5 then
return true
else
return false
end if
end function

Y para llamar a la funcin declararamos una variable de tipo bit y la


llamaramos del siguiente modo: 'b = Calcular ( 5 )' y volcara en este caso un
valor 'Verdadero'

CONFIGURACIONES
ESQUEM A

DEL

PIC

Este es el
esquema del PIC que vamos a programar. Os lo pongo para que veis qu
nombre tiene cada patilla y tambin para que veis de qu formas se pueden
configurar cada una de ellas. En el siguiente ejemplo de configuracin voy a
utilizar las patillas 2, 3, 5, 6 y 7 como salidas y la 4 como entrada

CONFIGURACIN

DEL

PI C

Antes que nada incluimos los ficheros de configuracin ya que si no lo hacemos


el compilador no va a entender qu significa por ejemplo gp3_direction = input
include f675_4i
include jlib

Ahora ya podemos configurar las patillas del PIC. Podemos hacerlo de dos
formas, as:
gpio_direction = all_output
gp3_direction = input

O as:
gp0_direction
gp1_direction
gp2_direction
gp3_direction
gp4_direction
gp5_direction

=
=
=
=
=
=

output
output
output
input
output
output

-- NO ES OBLIGATORIO CONFIGURAR LAS PATILLAS CORRELATIVAMENTE

Una vez que hemos configurado las patillas podemos incluso asignarlas a
variables
var bit Boton is gp3
VARIABLE 'BOTON'

-- AQUI ASIGNAMOS LA PATILLA 4 (GP3) A LA

NOCIONES
EJEM PLO

DE

PROGRAM ACIN

Este es un ejemplo que enciende y/o apaga LEDs a varias velocidades. La


velocidad es controlada por un botn instalado en la patilla GP3
-- ---------------------------------------------------------------------- INCLUDES
-- --------------------------------------------------------------------include f675_4i
include jlib

-- ---------------------------------------------------------------------- CONFIGURACIONES
-- --------------------------------------------------------------------gpio_direction = all_output
gp3_direction = input
-----

gp0_direction
gp1_direction
gp2_direction
gp3_direction

=
=
=
=

output
output
output
input

-- gp4_direction = output
-- gp5_direction = output
-- ---------------------------------------------------------------------- VARIABLES
-- --------------------------------------------------------------------var bit boton is gp3
var byte tiempo = 5
-- ---------------------------------------------------------------------- PROCEDIMIENTOS
-- --------------------------------------------------------------------procedure comprobar_boton is
if boton == low then
tiempo = tiempo + 1
if ( tiempo == 14 ) then
-- REINICIAR VARIABLE A 1
tiempo = 1
-- APAGAR TODOS LOS LEDs COMO SEAL PARA EL USUARIO
gp0 = low
gp1 = low
gp2 = low
gp4 = low
gp5 = low
end if
-- ESPERAR A QUE LA PATILLA GP3 CAMBIE DE ESTADO
while ! boton loop
end loop
end if
-- ESPERAR 'TIEMPO' x 5milisegundos
delay_5ms( tiempo )
end procedure
-- ---------------------------------------------------------------------- PROGRAMA DE INICIO
-- ---------------------------------------------------------------------- ENCENDER TODOS LOS LEDS
gp0 = high
gp1 = high
gp2 = high
gp4 = high

gp5 = high
-- ESPERAR 400milisegundos
delay_200ms (2)
-- APAGAR TODOS LOS LEDS
gp0 = low
gp1 = low
gp2 = low
gp4 = low
gp5 = low
-- ---------------------------------------------------------------------- MAIN PROGRAM
-- --------------------------------------------------------------------forever loop
-- 1 0 0 0 0 = LED 1
gp0 = high
gp1 = low
gp2 = low
gp4 = low
gp5 = low
comprobar_boton
-- 0 1 0 0 0 = LED 2
gp0 = low
gp1 = high
gp2 = low
gp4 = low
gp5 = low
comprobar_boton
-- 0 0 1 0 0 = LED 3
gp0 = low
gp1 = low
gp2 = high
gp4 = low
gp5 = low
comprobar_boton
-- 0 0 0 1 0 = LED 4
gp0 = low
gp1 = low
gp2 = low
gp4 = high
gp5 = low
comprobar_boton
-- 0 0 0 0 1 = LED 5
gp0 = low
gp1 = low
gp2 = low
gp4 = low
gp5 = high

comprobar_boton
end loop

Potrebbero piacerti anche