Sunteți pe pagina 1din 7

E LECTRONICA Y C OMPUTACION

A PRENDIENDO A
P ROGRAMAR PICS
M ANEJO D E I NSTRUCCIONES

En Saber Electrnica N 145, diseamos nuestro primer programa para


un PIC. No se trat de un programa
muy complicado que pueda ganar algn premio como mejor diseo,
pero nos permiti aprender las bases de la programacin. En este artculo agregaremos dificultad a nuestro programa para controlar el encendido de los Leds.

Por Alberto H. Picerno

4.1 INTRODUCCION
Como introduccin quiero
ofrecerles a ustedes un mail de
un lector que sintetiza tan bien
mi criterio de cmo llevar esta
serie de notas, que yo mismo no
lo habra escrito con tanta claridad.
Zrate 19/6/99
Mi nombre es Jorge Borau, vivo en
Zrate, soy lector de todas sus notas
escritas en la revista Saber Electrnica, las que a mi parecer, son muy
buenas y, por sobre todo, explicadas
con un idioma que puede entender
cualquiera.
Le escribo porque he comenzado a
leer sus notas sobre los micros PIC, y
yo soy uno de los que compr un curso pensando que podra aprender algo. Realmente es poco lo que aprend.
Por eso quisiera hacerle un pedido, a
mi entender lo ms difcil es interpretar el cdigo de programacin, cmo
se programa para poder poner en funcionamiento una idea, qu hace cada
instruccin.
Muchos de los cursos fracasan porque hablan de una manera muy tcnica, creen que el alumno conoce los
Saber Electrnica N 147

distintos trminos tcnicos. O sea, que


hablan mitad espaol, mitad chino.
Mi humilde pedido es que durante
el curso se explique lo que coment
anteriormente, y aunque va dirigido
hacia personas adultas, piense que se
lo est explicando a un chico.
Sin ms que decir, pido disculpas
por si critiqu demasiado, espero su
respuesta.
Chau, Gracias.

Gracias amigo Jorge, no tenga


dudas que mi intencin es traer
algo de claridad didctica a este
srdido mundo de los microprocesadores. Supongo que lo voy a
conseguir porque no soy un super-experto en microprocesadores. A m me cuesta programar y,
por lo tanto, tengo que ser didctico para entenderme yo mismo.
4.2 CIRCUITO DE ENCENDIDO INTERMITENTE DE UN LED
En Saber Electrnica N 143 a
145 dimos tres artculos que sirven como introduccin al manejo de miscrocontroladores PICs.

52

Ya sabemos hacer un programa


para encender un conjunto de
leds al encender nuestra plaqueta ejercitadora o entrenador SABER PIC 01 y a apagarlos al pulsar reset. El siguiente paso es hacer que los leds, encendindose
y apagndose a un ritmo que fijaremos a voluntad, modifiquen
el programa.
Si Ud. no quiere armar el entrenador completo le proponemos que arme slo lo imprescindible para encender los leds segn el circuito de la figura 4.2.1;
un circuito tan simple 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 puer-

FE DE ERRATAS: En la phina 28 de Saber Electrnica N


145, bajo el ttulo ALGUNOS CAMBIOS DEL PROGRAMA sugerimos
cambiar movwf por 1, en realidad
lo que debe cambiarse es movlw
por 1 para encender el led D10.

Electrnica y Computacin

to B predispuesto como de salida por el programa. En efecto, el


puerto de salida admite perfectamente los 3mA que toma cada
led al conectarlos con resistores
en serie de 1k5. Como nica
precaucin para el armado debe
utilizar un zcalo de 18 patas para el PIC. Las conexiones de X1,
C1 y C2 deben ser lo ms cortas
posibles. Si usted repara TV y videograbadores seguramente tendr cristales de 3,58MHz (de
PALN o NTSC o inclusive de
PALM). Puede utilizarlos sin mayor inconveniente pero recuerde
que los tiempos calculados estarn afectados de un coeficiente
igual a 3,58/4.

4.3 NUEVAS
INSTRUCCIONES
Nuestro programa va a hacer
uso de lo que se llama una su-

brutina. Una subrutina es como


un segundo programa anexo al
principal. El programa principal
va a la subrutina a travs de una
instruccin "CALL" que no habamos empleado hasta ahora.
Esta instruccin salta del paso
del programa donde se encuentra, a la subrutina y cuando se
ejecuta por completo vuelve al
mismo punto del programa en
donde se haba producido el salto.
Una subrutina debe estar
siempre dirigida a una etiqueta
para que el salto se realice con
un destino bien determinado.
Por lo general, las subrutinas se
escriben a continuacin del programa principal, pero esto es
simplemente una costumbre,
bien podran ubicarse en otro lugar como el principio. Recuerde
que todo comienza cuando se
pulsa reset o cuando se enciende el equipo y, en ese momento,

se ejecuta lo
indicado con
la etiqueta reset y se salta
al rengln siguiente. Cuando termina
una subrutina,
se debe colocar una referencia "RETURN", que
significa retornar al siguiente rengln del
programa
principal donde est la invocacin a la
subrutina.
Otra instruccin nueva
que no habamos utilizado
es "decfsz" que siempre va
acompaada de un nmero hexadecimal. Esta instruccin se
utiliza para programar retardos.
Por ejemplo, si su paso del programa fuera:
........... decfsz 06
Cuando se llega a esa instruccin se carga el registro z con l
nmero hexadecimal 06 y se retorna a la misma sentencia (mismo paso de programa), pero decrementando el registro z en una
unidad, y as sucesivamente hasta que z sea igual a cero, momento en que se corta el lazo
sobre s mismo y se pasa a la siguiente instruccin.
Otra variante en la forma de
escribir esta sentencia es con
una variable previamente definida en el encabezamiento del
programa. Por ejemplo, en nuestro caso, podra escribirse del si-

Saber Electrnica N 147

53

Aprendiendo a Programar PICs


Ahora, si usted no domina el
idioma ingls esta ayuda no le
va a servir de mucho. En ese caso, lo invitamos a adquirir el curso de ingls y francs en CD: de
Editorial Quark, "Muzzy at the
Seaside".

4.4 EL PROGRAMA
PRINCIPAL

guiente modo:
;=============
CONST EQU 06
--------------------------;= = = = = = = = = = = = = =
--------------------------..... decfsz CONST
En el encabezado se declara
que CONST = 06 luego, al hacer
el decremento, se reemplaza
CONST por su verdadero valor
numrico.
Esto parece ms una complicacin sin sentido, pero no es
as; en un programa bien estructurado los cambios se realizan
en el encabezado y, adems,
muchas veces es necesario cambiar solidariamente varios operandos y el mtodo propuesto lo
logra fcilmente.
Tambin vamos a utilizar una
instruccin de doble uso y que
forma parte de una subrutina
(generalmente la cierra). Se trata
de "retlw" que debe ir acompa-

54

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 en un ciclo
que pueda modificarse fcilmenado de un literal (nmero hexa- te para alterar el programa. Al
decimal). Esta operacin carga el apretar el pulsador de reset se
registro w con el literal que lo
debe apagar el led y al soltarlo
acompaa y retorna al programa se encender luego de un retarprincipal todo en un solo rendo y continuar alternando pegln. Su funcionamiento se apre- rodos de encendido y apagado.
ciar mejor cuando veamos el
El programa completo lo vaprograma de aplicacin pero es
mos a dividir en dos partes: un
equivalente a:
programa principal y una subrutina que llamamos retardar. Los
movlw HEX
hacemos as porque casi todos
(HEX = nmero hexadecimal) los programas incluyen retardo y
return
el diseo de esa subrutina lo podemos emplear posteriormente y
Cuando se analiza la demora
nos ahorraremos trabajo.
en ejecutar retlw se la debe conUn programa debe estar essiderar doble, es decir, que si
tructurado en forma clara, se deusamos un cristal de 4MHz esta
ben diferenciar claramente los
rutina dura 2S.
diferentes sectores y esto se hace
A esta altura el lector debe
no slo para que sea agradable a
recordar unas cuantas sentencias la vista, sino para facilitar los fuy todava faltan unas cuantas
turos cambios. El autor acostumms. Como ayuda para que no
bra a diferenciar claramente 4
deba estudiar todas las sentensecciones del programa separncias de memoria le decimos que dolas son signos ===. La primera
lo mejor es relacionarlas con pa- seccin es el ttulo y la declaralabras comunes del idioma incin de qu PIC se va a utilizar.
gls. Por ejemplo "equ" proviene La segunda es el encabezado en
de "equal" que significa igual. En donde se le da nombre a los litela figura 4.3.1 le damos una tabla rales (nmeros hexadecimales)
con ms ayudas.
ms importantes. La tercera es el

Saber Electrnica N 147

Electrnica y Computacin
programa principal y la cuarta
las subrutinas (tabla 1).
Analicemos el encabezado,
las primeras lneas hasta la etiqueta ptob ya las conocemos
del programa anterior. Luego tenemos tres sentencias que le dan
nombre reg1, reg2 y reg3 a tres
registros de uso general, ubicados en las posiciones de memoria RAM destinadas a los registros. Recuerde que las primeras
12 posiciones hasta 0B estn
ocupadas por registros fijos. A

partir de 0C se ubican los registros de propsitos generales de


los cuales usaremos 3, a saber:
0C, 0D y 0E.
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 sen-

tencias 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.
4.4 EL PROGRAMA
PRINCIPAL

La seccin principal del programa es muy similar a la utilizada en el primer programa para
encender permanentemente un
Tabla 1
led (tabla 2).
; Secuenciador de encendido de un led
list
p=16C84
;micro PIC16C84
Siempre se comienza a anali;===========================================================
zar el programa observando qu
portb
equ
06
;el puerto b se ubica en la direcocurre al realizar un reset. En escin de
te caso, vemos que todo comien;memoria RAM06
za en la posicin 00 de la mereg1
equ
0c
;asignacin de los resgistros
moria de programa. En la sidonde se cargan los
guiente posicin se enva el conreg2
equ
0d
;diferentes literales
reg3
equ
0e
;
trol del programa a la posicin
grueso
equ
40
;al literal 40 lo llamamos grueso
comenzar, en donde se predismedio
equ
40
;al literal 40 lo llamamos medio
pone el puerto b para operar cofino
equ
50
;al literal 50 lo llamamos fino
mo salida. Luego, comienza el
;===========================================================
programa principal en el etiqueta
reset
org
0
;un reset enva a la posicin 00
ppal, en donde se carga el regisde la memoria
tro w con el nmero hexadeci;de programa.
Goto
comienzo ;reenvo al comienzo del programa
mal 01. Cuando este nmero se
------;---------------------------------------------descarga en el puerto b se en------;---------------------------------------------ciende el led conectado en RB0.
Ahora se enva el
control a la subrutina
Tabla 2
reset
org
0
;un reset enva el programa a la posicin 0
demora porque pretengoto
comenzar ;se enva el control al comienzo
demos que el led quede
comenzar
movlw 00
;se carga w con 00
encendido algo menos
tris
ptob
;se programa el puerto b como salida
de un segundo. Cuando
ppal
movlw 01
;se carga w con 01
se cumpla ese tiempo
movwf ptob
;se descarga w en el puerto b para
volver el control desde
;encender el led conectado RB0
demora continuando
call
demora
;se mantiene el led encendido por
;un intervalo de tiempo
por la carga de w con el
movlw 00
;se carga w con 00
hexadecimal 00. Al desmovwf ptob
;se descarga w en el puerto b para
cargar w en el punto b
;apagar el led de RB0
se produce el apagado
call
demora
;se mantiene el led apagado por
de led conectado en
;un intervalo de tiempo
RB0.
goto
ppal
;continua el programa en el principio
;hasta realizar un reset
Nuevamente el conSaber Electrnica N 147

55

Aprendiendo a Programar PICs


trol pasa a la subrutina demora
en donde se queda por algo menos de 1 segundo 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.
Usted puede pensar: para
qu tanta complejidad si con dos
transistores armo un multivibrador y realizo el mismo efecto? Seguro, pero no va a tener precisin de cristal en la frecuencia y
el perodo de actividad no va a
ser exactamente el 50% del total,
y si quiere cambiar algo tiene
que desoldar, buscar resistores,
capacitores, etc. adems tiene
que realizar un clculo de los resistores de base del flip flop y
luego elegir los capacitores adecuados y verificar la frecuencia
de oscilacin y el perodo de actividad con el osciloscopio.
Aqu slo se sienta frente la
PC y escribe el programa, y si
desea cambiarlo lo hace en la
Tabla3
Demora

movlw
movwf

dem3

movlw
movwf

dem2

movlw

dem1

movwf
decfsz

goto
decfsz
goto
decfsz
goto
retlw
end.

56

registro 3 de a una unidad;


mientras el registro tenga un nmero mayor o igual a 1 se contina este proceso, pero al llegar
4.5 LA SUBRUTINA
a cero se salta a la siguiente senDEMORA
tencia que justamente es un "goEsta subrutina es ms compli- to". Es como si el control retornara y fuera a dem1 tantas veces
cada que el programa principal.
como lo indica el nmero hexaLo que ocurre es que la diseamos para uso general, ya que la decimal cargado en el registro 1.
vamos a aplicar en una infinidad Luego la subrutina pasa a la siguiente sentencia que comienza
de programas. En principio, la
a decrementar el nmero cargademora la vamos a poder variar
con tres nmeros hexadecimales do en reg2, slo que el "goto" es
que fueron definidos en el enca- a la etiqueta dem2 que es antebezamiento como grueso, me- rior a la dem1, es decir, que se
vuelve a pasar por "dem1" a hadio y fino porque operan de
ese modo sobre el retardo final
cer todo el primer decremento
del nmero guardado en "reg3" y
(tabla 3).
Lo ms importante es no ma- recin despus se hace el siguiente decremento en el regisrearse con tantos ruidos y retortro "reg2". Cuando "reg2" llega a
nos. La subrutina comienza cargando los registros de uso gene- cero se produce el primer decremento de "reg3" y para que se
ral con los nmeros hexadeciproduzca el segundo tienen que
males declarados en el encabedecrementarse a cero "reg2". En
zado. Luego que los tres regisuna palabra, que la subrutina da
tros especiales estn cargados
muchsimas vueltas sobre "dem
con los hexadecimales 30, 40 y
50 se comienza a decrementar el 1", muchas sobre "dem2" y pocas
sobre "dem3". Finalmente cuando "reg3"
grueso
;recarga w con el nmero hexadecimal
llega a cero, se pasa
;grueso es decir, con 30
retlw0 que reenva el
reg1
;se vuelca grueso en el registro
control al programa
;reg 1
principal justo en la
medio
;se carga w con el nmero hexadecimal
;medio es decir con 40
sentencia que invoc
reg2
;se vuelca "medio" en el registro
a la subrutina pero
;reg2.
antes de retornar llefino
;se carga w con el nmero hexadecimal "fino"
va el registro w a ce;es decir con 50.
ro. El programa terreg3
;se vuelca "fino" en el registro reg3.
mina en "end" que no
reg3
;se decrementa el registro reg3 en una unidad
puede considerarse
;y si el resultado es cero se salta a la siguiente
;instruccin, si no se sigue decrementando. como una sentencia,
dem1
;retorno a la frecuencia etiqueta dem1.
ya que no realiza ninreg2
;idem con reg2.
guna tarea; sin emdem2
;retorno a la etiqueta dem2.
bargo, su existencia
reg3
;idem con reg1.
es imprescindible padem1
;retorno a la etiqueta dem3.
ra que el programa0
;se carga w con 0 y se retorna al programa
dor de PICs de por
;principal.
terminada su tarea.
misma PC, una y mil veces sin
peligro de quemar componentes.

Saber Electrnica N 147

Electrnica y Computacin
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 1 y tendramos una demora de 1,015 seg. El led estara
encendido casi un segundo y
apagado otro tanto.

4.6 DIAGRAMAS DE FLUJO

Cuando no se coloca el programa ensamblador emite un mensaje de error.


Sabemos que la subrutina
"demora" tiene una cierta duracin. Con un mnimo conocimiento de matemticas podemos
calcular ese retardo en funcin
de los nmeros hexadecimales
que hallamos elegido.
Tomemos primero el "loop"
(rulo) ms interno de la subrutina; mientras no se cumpla que
"reg 3" = 0 se 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.4.5.1.

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.
Nos quedaran 1 + 1 ciclos al

Prcticamente todas las palabras de este artculo describiendo como funciona el programa
principal y la subrutina de demora pueden representarse en
un diagrama de flujo como el
mostrado en la figura.4.6.1 para
el programa principal o el mostrado en la figura.4.6.2 para la
rutina de demora.
4.7 CONCLUSIONES
Y EJERCICIOS
Si usted era un "analgico"
puro y vio encender y apagar un
led comandado por un microprocesador, seguramente se habr emocionado con su obra.
Deje que los "digitales" se burlen
menospreciando su obra; ellos
nunca podrn aprender las tcnicas analgicas en el poco tiempo
que usted le llevar aprender las
digitales. Un dispositivo actual
tiene un microprocesador pero
tambin tiene un entorno analgico al que se debe controlar y
ese entorno es nuestra ruina.
Los microprocesadores son fciles de reprogramar, aproveche
esta cualidad intrnseca de los
mismos y haga cambios en el
programa; desde l ms elemen-

Saber Electrnica N 147

57

Aprendiendo a Programar PICs

tal que es cambiar el ritmo de


encendido hasta algunos ms
complejos como hacer que los
periodos de actividad e inactividad sean diferentes (debern
realizar dos subrutinas de demora por ejemplo "demoact" y "demono"). Pruebe todo lo que
quiera que un microprocesador
no se quema por un error de
programacin.
Si quiere darle una aplicacin
prctica a nuestro dispositivo utilcelo como generador de ondas
cuadradas de audio de frecuencia fija. En el prximo artculo
vamos a encender leds en secuencia y vamos a aprender a
utilizar un puerto como entrada
y otro como salida ampliando
nuestras posibilidades de control
sobre el microprocesador.

58

Hasta hoy
sabemos poco
de microprocesadores pero
si usted realiz
los dispositivos seguramente ya estar viendo un programa ms claro
y adems ya est seguro de que
esta vez podr terminar su

Saber Electrnica N 147

aprendizaje y casi sin realizar


gasto alguno, gracias a nuestra
querida revista "Saber".

Videos de Electrnica
En castellano, con temas completos.
Unicos pensados para el mercado local, preparados por expertos del Centro Japons de Informacin Electrnica
Pdalos en Editorail Quark SRL
Herrera 761 (1295) Capital Federal

S-ar putea să vă placă și