Académique Documents
Professionnel Documents
Culture Documents
Aprendiendo a
Programar
Hace unos cuantos aos, comenzamos a mostrar cmo se deben
escribir programas en nuestra querida revista Saber Electrnica;
fue as que tanto Federico Prado, el Ing. Alberto Picerno y este
autor hemos escrito artculos con la explicacin de programas
sencillos que le permitirn aprender a utilizar las instrucciones del
PIC 16X84.
En este captulo utilizaremos la misma tcnica comenzando desde
el principio, basndonos en prototipos reales.
57
Microcontroladores PIC
CIrCUITO dE Un EnTrEnAdOr
En Saber Electrnica hemos desarrollado un entrenador para aprender a programar y cargar PICs,
este entrenador se muestra en la figura 1.
Sea el programa: (Programa 1).
; Primer programa de prctica
ptob
Reset
Inicio
ciclo
Figura 1
58
Programa 1
List
equ
p = 16C84
0x06
org
movlw
tris
movlw
nop
goto
h0
h0
ptob
h0f
ciclo
Fig. 2
List p = 16C84
Es el encabezado del programa que le indica al
ensamblador qu tipo de PIC se est utilizando para
que ste pueda reconocer qu set de instruccin debe utilizar.
ptob
equ
06
Nombr a la variable ptob y la coloqu en la direccin 06 de la RAM, esta direccin est reservada para el PUERTO B, es decir, ratifico que ptob es el registro del PORT B.
Cuando, ms adelante, deba enviar informacin
al puerto b, slo debo mencionar ptob.
Reset
org
0
Significa que al realizarse el reset, el programa
comienza por la posicin 0 de la memoria del programa. Pero de inmediato pasa a la posicin 1 que tiene
escrita la siguiente sentencia:
Inicio
movlw
0
Con esto se carga el registro w con el hexadecimal 0 (es decir el binario 00000000)
Ciclo
nop
Realiza una rutina nula, es decir, que no efecta
operacin alguna.
tris
ptob
Esta instruccin enva la informacin del registro
W al puerto B para indicarle que todos sus pines son
de salida (si se hubiera cargado el binario 11111111
todos los pines seran de entrada y si se hubiera cargado 11001010 algunos seran entradas y otros salidas).
goto
ciclo
Enva el programa hacia la etiqueta "ciclo". Las
dos ltimas operaciones hacen que al ejecutarse un
programa, ste se quede en un lazo que se llama
loop cerrado.
La nica manera de salir de este loop es pulsando RESET. Entonces se observa que los leds se apagan hasta que se suelta el pulsador y el programa comienza nuevamente por la etiqueta RESET.
Obviamente, este programa debe ser editado en
un utilitario adecuado (MPLAB, por ejemplo) y luego
debe ser compilado (utilizando el MPASM o el mismo
MPLAB) para obtener el archivo .hex que me permitir cargar el PIC que deber colocar en el circuito de
la figura 1 para verificar que realmente hace lo que
estamos diciendo.
Para cargar el PIC con el programa .hex se utiliza
un prototipo adecuado (cargador de PICs) que consiste en un circuito que es manejado por un programa
movlw
0f
Carga el registro W con el hexadecimal 15 que
equivale al binario 00001111 y
movlw
ptob
Enva el valor cargado al puerto "B" que producir
un estado alto en RB0, RB1, RB2 y RB3 y un estado
bajo en RB4, RB5, RB6 y RB7. La informacin del puerto pasa al buffer que lleva las patas 15, 16, 17 y 18 de
un PIC16C84 a masa encendiendo los leds D7, D8, D9
Y D10.
59
Microcontroladores PIC
ENCENDIDO INTERMITENTE
DE UN LED
Si Ud. no quiere armar el entrenador completo
(que sirve para un sinfn de aplicaciones que se ensean en el Curso: PICs para Estudiantes &
Aficionados, que est en venta en varios pases de
Amrica a travs de la red de distribuidores de Editorial Quark y Saber Internacional - vea en Internet la direccin: www.webelectronica.com.ar) le proponemos
que arme slo lo imprescindible para encender los
leds segn el circuito de la figura 3; un circuito tan
simple que no requiere plaqueta, puede armarse tipo
araa sobre la mesa de trabajo, porque no es algo para mostrar sino para aprender. Observe que los leds
estn conectados directamente al puerto B predispuesto como de salida por el programa. En efecto, el
Fig. 3
equ
decfsz
06
CONST
60
Fig. 4
te la cierra). Se trata de "retlw" que debe ir acompaado de un literal (nmero hexadecimal). Esta operacin carga el registro w con el literal que lo acompaa y retorna al programa principal todo en un solo
rengln. Su funcionamiento se apreciar mejor cuando veamos el programa de aplicacin pero es equivalente a:
movlw
return
A esta altura Ud. debe recordar unas cuantas sentencias y todava faltan unas cuantas ms (recuerde
todo lo visto en el captulo 2). Como ayuda para que
no deba estudiar todas las sentencias de memoria le
decimos que lo mejor es relacionarlas con palabras
comunes del idioma ingls. Por ejemplo "equ" proviene de "equal" que significa igual. En la figura 4 le damos una tabla con ms ayudas.
Para disear un programa usted debe tener en claro la funcin del proyecto. En nuestro caso queremos
que al encender la fuente el led conectado a RB0 se
encienda y apague con un tiempo que pueda modificarse fcilmente para alterar el programa. Al apretar
el pulsador de reset se debe apagar el led y al soltarlo
se encender luego de un retardo y continuar alternando perodos de encendido y apagado.
61
Microcontroladores PIC
;===========================================================
Programa
; Secuenciador de encendido de un led
list
p=16C84
;micro PIC16C84
;===========================================================
portb
equ
06
;el puerto b se ubica en la direccin de
;memoria RAM06
reg1
equ
0c
;asignacin de los registros donde se cargan los
reg2
equ
0d
;diferentes literales
reg3
equ
0e
;
grueso
equ
40
;al literal 40 lo llamamos grueso
medio
equ
40
;al literal 40 lo llamamos medio
fino
equ
50
;al literal 50 lo llamamos fino
;===========================================================
reset
org
0
;un reset enva a la posicin 00 de la memoria
;de programa.
Goto
comienzo
;reenvo al comienzo del programa
;===========================================================
mos 3, a saber: 0C, 0D y 0E (que son los registros que
hemos denominado reg1, reg2 y reg3).
En esos registros volcamos inicialmente los literales 30, 40 y 50 que nombramos como grueso,
medio y fino. Esto se realiza en las tres ltimas
sentencias del encabezado que son aquellas que Ud.
debe variar si desea que el ritmo de encendido se haga ms lento o ms rpido. Desde luego que estas
tres sentencias no son imprescindibles pero si no se
usan, luego habra que buscar dentro de la subrutina
para cambiar los literales. Trabajando de esta manera es ms fcil introducir cambios porque los hacemos desde el encabezado.
La seccin principal del programa es muy similar
a la utilizada en el primer programa para encender
permanentemente un led, vea programa 3.
Siempre se comienza a analizar el programa observando qu ocurre al realizar un reset. En este careset
comenzar
ppal
org
goto
movlw
tris
movlw
movwf
0
comenzar
00
ptob
01
ptob
call
demora
movlw 00
movwf ptob
62
call
demora
goto
ppal
Programa 3
demora
movlw grueso
movwf
dem3
movlw
movwf
dem2
movlw
dem1
movwf
decfsz
goto
decfsz
goto
decfsz
goto
retlw
end
antes de volver al programa principal. Cuando vuelve
es enviado de inmediato al comienzo de ppal con un
nuevo encendido de RB0 y as permanentemente hasta que se opere el reset.
Es el turno de platicar sobre la subrutina demora.
Esta subrutina es ms complicada que el programa
principal. Lo que ocurre es que la diseamos para uso
general, ya que la vamos a aplicar en una infinidad de
programas. En principio, la demora la vamos a poder
variar con tres nmeros hexadecimales que fueron
definidos en el encabezamiento como grueso, medio y fino porque operan de ese modo sobre el retardo final, vea programa 4.
La subrutina comienza cargando los registros de
uso general con los nmeros hexadecimales declarados en el encabezado. Luego que los tres registros
especiales estn cargados con los hexadecimales
30, 40 y 50 se comienza a decrementar el registro 3
de a una unidad; mientras el registro tenga un nmero mayor o igual a 1 se contina este proceso, pero al
llegar a cero se salta a la siguiente sentencia que justamente es un "goto".
Es como si el control retornara y fuera a dem1
tantas veces como lo indica el nmero hexadecimal
cargado en el registro 1. Luego la subrutina pasa a la
siguiente sentencia que comienza a decrementar el
nmero cargado en reg2, slo que el "goto" es a la etiqueta dem2 que es anterior a la dem1, es decir, que
se vuelve a pasar por "dem1" a hacer todo el primer
decremento del nmero guardado en "reg3" y recin
despus se hace el siguiente decremento en el regis-
63
Microcontroladores PIC
Fig. 5
consume un ciclo de instruccin por vuelta (genricamente podemos decir que todas las sentencias consumen un ciclo salvo las de salto como la "goto" que
consume dos).
Nmero de ciclos "reg 3" = 3 x "grueso"
= 3 x 80 (ya que 50 Hex = 80 decimal)
= 240 ciclos de instruccin
Para calcular la demora de los dos loops siguientes es conveniente realizar un diagrama de los mismos tal como el mostrado en la figura 5.
Ahora vemos que el loop intermedio dura 2 + 1 +
1 + 1 = 5 ciclos de instruccin a los cuales se les suman los 240 ciclos del loop ms interno. En total seran 5 + 240 = 245. Pero este loop es recorrido hasta
que el hexadecimal 40 (equivalente al decimal 64) se
anule:
nmero de ciclos "reg 2" = 245 x medio
= 245 x 64
= 15.860 ciclos de instruccin.
El loop ms externo dura 2 + 1 + 1 + 1 = 5 ciclos de
instruccin a los cuales se les suman los 15.860.
Pero este loop es recorrido hasta que el hexadecimal 40 (equivalente al decimal 64) se anule:
nmero de ciclos "reg 1" = 15.860 x fino
= 15.860 x 64
= 1.015.040 ciclos de instruccin.
64
Fig. 6
Nos quedaran 1 + 1 ciclos al comienzo de la subrutina y 2 ciclos al final para llegar a un valor de
1.015.044 ciclos de instruccin.
La duracin de un ciclo de instruccin depende
del cristal utilizado. Si usamos un cristal de 4MHz cada ciclo de instruccin dura 1s y tendramos una demora de 1,015 seg.
El led estara encendido casi un segundo y apagado otro tanto.
El funcionamiento del programa principal y la subrutina de demora pueden representarse en un diagrama de flujo como el mostrado en la figura 6 para
el programa principal.
SECUENCIADOR DE 4 CANALES
Elegimos trabajar con cuatro leds para que usted
Fig. 7
Fig. 8
65
Microcontroladores PIC
rot,4
Fig. 9
66
; SECUENCIADOR
Programa 5
list
P=16C84
;el dispositivo usa el 16C84
;------------------------------------------------------------------------------------------ptob equ
06
;el puerto f se ubica en 06 de la RAM.
Rot
equ
0d
;al registro ubicado 0d se lo llama est.
Reg1 equ
0e
;al registro ubicado en 0e se lo llama reg1
reg2
equ
0f
;al registro ubicado en 0f se lo llama reg1
reg3
equ
10
;al registro ubicado en 10 se lo llama reg3
grueso equ
00
;se asignan nombres a los literales.
medio equ
40
;se asignan nombres a los literales.
fino
equ
50
;se asignan nombres a los literales.
;------------------------------------------------------------------------------------------reset org
0
;reset en direccin 00h
goto
comenzar ;se lleva el control a comienzo
comenzar
movlw
00
;se carga w con 00h
tris
ptob
;se programa el puerto "b" como salida.
ppal
movlw
01
se carga w con 01h
movwf
rot
;se descarga w en el registro rot
;preparndolo para la rotacin.
sec
movf
rot,0
;el contenido de rot pasa a w
movwf
ptob
;enciende el led conectado donde indica w
call
demora
;se mantiene encendido el led.
rlf
rot
;se mueven los bits de "rot".
btfss
rot,4
;se comprueba el 5 bit.
goto
sec
;si el 5 bit es cero se reenva a sec.
goto
ppal
;si el 5 bit es uno se reenva a ppal para
;comenzar una nueva secuencia.
demoramovlw
grueso
;recarga w con el nmero hexadecimal
;grueso es decir, con 30
movwf
reg1
;se vuelca grueso en el registro
;reg 1
dem3 movlw
medio
;se carga w con el nmero hexadecimal
;medio es decir con 40
movwf
reg2
;se vuelca "medio" en el registro
;reg2.
dem2 movlw
fino
;se carga w con el nmero hexadecimal
;"fino" es decir con 50.
movwf
reg3
;se vuelca "fino" en el registro reg3.
dem1 decfsz
reg3
;se decrementa el registro reg3 en una
;unidad y si el resultado es cero se salta a
;la siguiente instruccin, si no se sigue
;decrementando.
goto
dem1
;retorno a la frecuencia etiqueta dem1.
decfsz
reg2
;idem con reg2.
goto
dem2
;retorno a la etiqueta dem2.
decfsz
reg3
;idem con reg1.
goto
dem1
;retorno a la etiqueta dem3.
retlw
0
;se carga w con 0 y se retorna al
;programa principal.
end
67
Microcontroladores PIC
Fig. 10
68
Fig. 11
Fig. 12
69
Microcontroladores PIC
Fig. 13
Piense que el circuito propuesto puede tener muchas posibilidades de modificarse a voluntad y adaptarse a otros usos. Por ejemplo, si en lugar de conectar las entradas de las llaves a tensiones continuas,
las aplican a seales alternas provenientes de 8 osciladores sinusoidales, se puede hacer un barredor
de audio. Si reduce la frecuencia de repeticin puede
construir un generador musical de acordes de 8 notas, similares a los utilizados como bocina musical
en automviles y etc., etc., etc. Piense en otras posibilidades ms.
LosFormatosdelosArchivos
Mencionamos el programa MPASM, que es un ensamblador que transforma el programa diseado por
nosotros en un idioma hexadecimal correspondiente
al PIC. El programa generado a mano (el que escribe
el programador, en base a las pautas dadas en este
captulo) tienen una extensin ASM (de ASEMBLER"
o ensamblador) y cuando lo aplicbamos al MPASM
se generaban tres archivos con terminaciones diferentes .err donde se encuentran los mensajes de
error, si se cometi un error de sintaxis al escribir el
70
archivo .asm;
.asm un archivo .lst con los renglones numerados para ubicar en cual se produce el error y el ms
importante, el archivo .hex que contiene los datos
que supuestamente entiende el microprocesador.
En realidad del microprocesador no entiende el
archivo con terminacin .hex.
.hex El necesita otro programa que transforma el .hex en un lenguaje binario
de datos en serie que es lo nico que entiende el microprocesador PIC, sto es lo que hace un PROGRAMADOR o cargador de PICs.
SECUENCIADOR DE 8 CANALES
Veamos un programa diferente al propuesto para
rotar el encendido de 4 leds. Este programa sirve para encender 8 leds en sucesin de la figura 3 y con algunos cambios para excitar las llaves analgicas del
generador de escalera que acabamos de analizar, vea
el programa 6.
En la primera sentencia se observa la declaracin
del microprocesador utilizado. Como puede observar
Programa 6
71
Microcontroladores PIC
COMPILACION
DE UN PROGRAMA
Fig. 14
72
Cuando uno tiene escrito el programa con el edit del DOS, debe verificarlo
exhaustivamente, controlar el encolumnado y los errores de sintaxis antes del
punto y coma separador. De cualquier
modo siempre se puede deslizar un
error que provocar una falla en el programa. Si usted trabaja correctamente,
el programa ensamblador MPASM le
avisar de los errores y le dar algunas
advertencias tiles sobre el uso de algunas sentencias.
Para ver cmo funciona sto, volvamos a escribir el programa del secuencial de 8 canales modificndolo de modo que presente algunos errores, vea el
programa 7.
Programa 7
tipo de error o advertencia. Los mensajes de advertencia no impiden el desarrollo de la posterior programacin, pero los mensajes de error s. Vamos a
atender primero los mensajes de error y luego los de
advertencia.
No es necesario numerar las lneas de programa
a mano, y a veces no es conveniente, porque la falta
de un separador (punto y coma) puede generar lneas
fantasmas y confundirnos. Es preferible editar el archivo .lst (en nuestro caso SECU8NO.LST) que tiene al
mismo tiempo los mensajes de error y el nmero de lnea.
Fig. 15
73
Microcontroladores PIC
Fig. 16
74
va que el nico
problema es que
falta el separador de comentarios y el ensamblador confundi
el
comentario
con una sentencia.
El siguiente
error est en la
lnea 12 y nos indica que el error
se produce despus de la primera columna, entre parntesis se
encuentra el argumento u orden equivalente (molw
por movlw). En la lnea 22 est el siguiente error y
consiste en la orden GOTO escrita como GORO. Veamos ahora los mensajes de advertencia. El primero
est en la primer lnea y se produce porque esta lnea
est dirigida al programador y no puede ser entendida por el ensamblador.
Se puede dejar sin inconvenientes. La siguiente
est en la lnea 12 y seguramente va a desaparecer
cuando se corrija la orden movlw. Luego pasamos a la
lnea 13 en donde est la orden TRIS; ocurre que en
los microprocesadores ms modernos esta orden se
modifica por otra ms compleja; por ahora se puede
seguir usando TRIS para programar los puertos si se
usa el 16C84 o el 16F84. La siguiente precaucin est en la lnea 18 y se debe a que el decimal 50000 est fuera del rango admitido por el microprocesador.
Esta precaucin debe ser considerada modificando el
valor por uno menor. La siguiente precaucin est en
la lnea 22 y se corregir al reemplazar GORO por GOTO. Al corregir los errores y agregar el separador, el
MPASM va a reportar slo dos advertencias. Una en la
lnea 1 por la declaracin del microprocesador dirigida al programador de PICs y la otra es la referida a la
orden TRIS que puede ser ignorado por el momento.
Fig. 17
75
Microcontroladores PIC
Fig. 18
I)Desconectarlafuentede13V.
J)Desconectarlafuentede5V.
K)Retirarelmicrograbado.
Por sobre todas la cosas, debe respetarse el criterio de no sacar un PIC de su zcalo con las fuentes
conectadas porque puede desprogramarse o, peor
an, daarse definitivamente. Tambin es muy importante respetar las tensiones de fuente y no demorar
la llegada de datos, luego conectar VPP (porque podran cargarse datos falsos por interferencias electromagnticas).
Como usted puede observar de la descripcin anterior la entrada RB6 es utilizada como clock y la RB7
como entrada de datos en una clsica operacin de
transferencia de datos en serie. Hay un tiempo entre
el momento en que MCLR (MCLR NEGADO) sale de la
condicin de reset hasta que aparece el primer dato
o el primer pulso de clock. Tambin hay un tiempo mnimo para la permanencia de un dato en la entrada (la
representacin usada para un dato significa que el
mismo puede ser alto o bajo, depende del bit que se
76
conduce y el micro est alimentado con 5V por la pata 14. La accin de la llave se controla por el encendido del led verde. Por lo tanto, usted debe colocar el
PIC en el zcalo o retirarlo slo cuando el led verde
est apagado.
Con referencia a la fuente agregamos un regulador LM317 en lugar del 78L5 que tiene la posibilidad
de poder programar su tensin de salida. En efecto el
preset RV1 en un extremo debe ajustar la salida en
4V y en el otro lo debe ajustar en 6V.
Tanto la seccin de fuente como el voltmetro necesitan ajustes a realizar con un tster digital. La
fuente requiere el ajuste de R21. Comience colocando resistores de 1k; luego debe variar ambos valores hasta que la salida cambie entre los lmites especificados de 4 y 6V. En el voltmetro se deben ajustar
los resistores de 27 y 22k para que el led se encienda en el rango de 4,8 a 5,2V.
Con referencia a los cambios en el puerto paralelo preferimos modificar el cable de conexin dejando
el conector de la plaqueta sin modificaciones.
Observe que si la plaqueta est desconectada o
la fuente est apagada el software NOPP reconoce
este estado a travs de la pata 5 de la ficha DB9 que
est a potencial alto por medio de R9 y aborta la operacin de carga.
El transistor Q2 que controla la fuente VPP se maneja a travs de CI1 desde la pata 1 de la ficha DB9.
Pero la fuente de 5V deber manejarse a mano por intermedio de la llave LL1. ***********
77