CAPITULO 3 - Aprendiendo A Programar PDF
CAPITULO 3 - Aprendiendo A Programar PDF
CAPITULO 3 - Aprendiendo A Programar PDF
Aprendiendo a
Programar
Hace unos cuantos años, comenzamos a mostrar cómo se deben
escribir programas en nuestra querida revista Saber Electrónica;
fue así que tanto Federico Prado, el Ing. Alberto Picerno y este
autor hemos escrito artículos con la explicación de programas
sencillos que le permitirán aprender a utilizar las instrucciones del
PIC 16X84.
57
Microcontroladores PIC
Figura 1
58
CAPITULO 3 - Aprendiendo a programar
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 instrucción de-
be utilizar.
ptob equ 06
Nombré a la variable ptob y la coloqué en la direc-
ción 06 de la RAM, “esta dirección está reservada pa-
ra el PUERTO B”, es decir, ratifico que ptob es el regis-
tro del PORT B.
Cuando, más adelante, deba enviar información
al puerto b, sólo debo mencionar ptob.
Reset org 0
Significa que al realizarse el reset, el programa
comienza por la posición 0 de la memoria del progra-
ma. Pero de inmediato pasa a la posición 1 que tiene
escrita la siguiente sentencia:
59
Microcontroladores PIC
para permitir la carga. Todo este proceso se explica puerto de salida admite perfectamente los 3mA que
con total claridad en el primer texto de esta serie, ti- toma cada led al conectarlos con resistores en serie
tulado: “Todo Sobre PICs”. de 1k5. Como única precaución para el armado debe
En la figura 2 se puede observar un diagrama de utilizar un zócalo de 18 patas para el PIC. Las cone-
flujo que refleja el funcionamiento del programa que xiones de X1, C1 y C2 deben ser lo más cortas posi-
acabamos de explicar. bles. Si usted repara TV y videograbadores segura-
mente tendrá cristales de 3,58MHz (de PALN o NTSC o
¿Cuánto tardan en encenderse los leds luego de inclusive de PALM).
soltarelbotóndereset? Puede utilizarlos sin mayor inconveniente pero re-
Si se observa el circuito, se verá un cristal de cuerde que los tiempos calculados estarán afectados
clock de 4MHz (0,25µS de período); como internamen- de un coeficiente igual a 3,58/4.
te existe un divisor x4 cada operación se realizará en Nuestro programa va a hacer uso de lo que se lla-
0,25 x 4 = 1µS. Si contamos las sentencias hasta lle- ma una subrutina. Una subrutina es como un segundo
gar a cargar el puerto B, veremos que hay 5 (cinco programa anexo al principal. El programa principal va
renglones de programa); por lo tanto, la demora es de a la subrutina a través de una instrucción "CALL" que
5µS. no habíamos empleado hasta ahora.
Esta instrucción salta del paso del programa don-
de se encuentra, a la subrutina y cuando se ejecuta
ENCENDIDO INTERMITENTE por completo vuelve al mismo punto del programa en
donde se había producido el salto.
DE UN LED Una subrutina debe estar siempre dirigida a una
etiqueta para que el salto se realice con un destino
Si Ud. no quiere armar el entrenador completo bien determinado.
(que sirve para un sinfín de aplicaciones que se ense- Por lo general, las subrutinas se escriben a conti-
ñan en el Curso: “PICs para Estudiantes & nuación del programa principal, pero esto es simple-
Aficionados”, que está en venta en varios países de mente una costumbre, bien podrían ubicarse en otro
América a través de la red de distribuidores de Edito- lugar como el principio. Recuerde que todo comienza
rial Quark y Saber Internacional - vea en Internet la di- cuando se pulsa reset o cuando se enciende el equi-
rección: www.webelectronica.com.ar) le proponemos po y, en ese momento, se ejecuta lo indicado con la
que arme sólo lo imprescindible para encender los etiqueta reset y se salta al renglón siguiente. Cuando
leds según el circuito de la figura 3; un circuito tan termina una subrutina, se debe colocar una referen-
simple que no requiere plaqueta, puede armarse tipo cia "RETURN", que significa retornar al siguiente ren-
araña sobre la mesa de trabajo, porque no es algo pa- glón del programa principal donde está la invocación
ra mostrar sino para aprender. Observe que los leds a la subrutina.
están conectados directamente al puerto B predis- Otra instrucción nueva que no habíamos utilizado
puesto como de salida por el programa. En efecto, el es "decfsz" que siempre va acompañada de un núme-
ro hexadecimal. Esta instrucción se utiliza para pro-
gramar retardos. Por ejemplo, si su paso del progra-
Fig. 3 ma fuera:
CONST equ 06
decfsz CONST
60
CAPITULO 3 - Aprendiendo a programar
Fig. 4
te la cierra). Se trata de "retlw" que debe ir acompa- El programa completo lo vamos a dividir en dos
ñado de un literal (número hexadecimal). Esta opera- partes: un programa principal y una subrutina que lla-
ción carga el registro w con el literal que lo acompa- mamos “retardar”.
ña y retorna al programa principal todo en un solo Los hacemos así porque casi todos los programas
renglón. Su funcionamiento se apreciará mejor cuan- incluyen retardo y el diseño de esa subrutina lo pode-
do veamos el programa de aplicación pero es equiva- mos emplear posteriormente y nos ahorraremos tra-
lente a: bajo.
Un programa debe estar estructurado en forma
movlw 0x12 ; cargo a W con el número 12h clara, se deben diferenciar claramente los distintos
return sectores y esto se hace no sólo para que sea agrada-
ble a la vista, sino para facilitar los futuros cambios.
A esta altura Ud. debe recordar unas cuantas sen- La primera sección es el título y la declaración de
tencias y todavía faltan unas cuantas más (recuerde qué PIC se va a utilizar. La segunda es el encabezado
todo lo visto en el capítulo 2). Como ayuda para que en donde se le da nombre a los literales (números he-
no deba estudiar todas las sentencias de memoria le xadecimales) más importantes. La tercera es el pro-
decimos que lo mejor es relacionarlas con palabras grama principal y la cuarta las subrutinas, vea pro-
comunes del idioma inglés. Por ejemplo "equ" provie- grama 2.
ne de "equal" que significa igual. En la figura 4 le da- Analicemos el encabezado, las primeras líneas
mos una tabla con más ayudas. hasta la etiqueta “portb” ya las conocemos del pro-
Para diseñar un programa usted debe tener en cla- grama anterior (aquí empleamos portb en lugar de
ro la función del proyecto. En nuestro caso queremos ptob). Luego tenemos tres sentencias que le dan
que al encender la fuente el led conectado a RB0 se nombre reg1, reg2 y reg3 a tres registros de uso ge-
encienda y apague con un tiempo que pueda modifi- neral, ubicados en las posiciones de memoria RAM
carse fácilmente para alterar el programa. Al apretar destinadas a los registros. Recuerde que las prime-
el pulsador de reset se debe apagar el led y al soltarlo ras 12 posiciones de memoria hasta 0B están ocupa-
se encenderá luego de un retardo y continuará alter- das por registros fijos. A partir de 0C se ubican los re-
nando períodos de encendido y apagado. gistros de propósitos generales de los cuales usare-
61
Microcontroladores PIC
;=========================================================== Programa 2
; Secuenciador de encendido de un led
list p=16C84 ;micro PIC16C84
;===========================================================
portb equ 06 ;el puerto b se ubica en la dirección de
;memoria RAM06
reg1 equ 0c ;asignación 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 envía a la posición 00 de la memoria
;de programa.
Goto comienzo ;reenvío al comienzo del programa
;===========================================================
mos 3, a saber: 0C, 0D y 0E (que son los registros que so, vemos que todo comienza en la posición 00 de la
hemos denominado reg1, reg2 y reg3). memoria de programa. En la siguiente posición se en-
En esos registros volcamos inicialmente los lite- vía el control del programa a la posición “comenzar”,
rales 30, 40 y 50 que nombramos como “grueso”, en donde se predispone el puerto b para operar como
“medio” y “fino”. Esto se realiza en las tres últimas salida. Luego, comienza el programa principal en el
sentencias del encabezado que son aquellas que Ud. etiqueta ppal, en donde se carga el registro w con el
debe variar si desea que el ritmo de encendido se ha- número hexadecimal 01. Cuando este número se des-
ga más lento o más rápido. Desde luego que estas carga en el puerto “b” se enciende el led conectado
tres sentencias no son imprescindibles pero si no se en RB0.
usan, luego habría que buscar dentro de la subrutina Ahora se envía el control a la subrutina “demora”
para cambiar los literales. Trabajando de esta mane- porque pretendemos que el led quede encendido al-
ra es más fácil introducir cambios porque los hace- go menos de un segundo. Cuando se cumpla ese
mos desde el encabezado. tiempo volverá el control desde “demora” continuan-
La sección principal del programa es muy similar do por la carga de w con el hexadecimal 00. Al descar-
a la utilizada en el primer programa para encender gar w en el punto “b” se produce el apagado de led
permanentemente un led, vea programa 3. conectado en RB0.
Siempre se comienza a analizar el programa ob- Nuevamente el control pasa a la subrutina demo-
servando qué ocurre al realizar un reset. En este ca- ra, en donde se queda por algo menos de 1 segundo
62
CAPITULO 3 - Aprendiendo a programar
antes de volver al programa principal. Cuando vuelve tro "reg2". Cuando "reg2" llega a cero se produce el
es enviado de inmediato al comienzo de ppal con un primer decremento de "reg3" y para que se produzca
nuevo encendido de RB0 y así permanentemente has- el segundo tienen que decrementarse a cero "reg2".
ta que se opere el reset. En una palabra, que la subrutina da muchísimas vuel-
Es el turno de platicar sobre la subrutina demora. tas sobre "dem 1", muchas sobre "dem2" y pocas so-
Esta subrutina es más complicada que el programa bre "dem3". Finalmente cuando "reg3" llega a cero, se
principal. Lo que ocurre es que la diseñamos para uso pasa retlw que reenvía el control al programa princi-
general, ya que la vamos a aplicar en una infinidad de pal justo en la sentencia que invocó a la subrutina pe-
programas. En principio, la demora la vamos a poder ro antes de retornar lleva el registro w a cero. El pro-
variar con tres números hexadecimales que fueron grama termina en "end" que no puede considerarse
definidos en el encabezamiento como “grueso”, “me- como una sentencia, ya que no realiza ninguna tarea;
dio” y “fino” porque operan de ese modo sobre el re- sin embargo, su existencia es imprescindible para
tardo final, vea programa 4. que el programador de PICs dé por terminada su ta-
La subrutina comienza cargando los registros de rea. Cuando no se coloca el programa ensamblador
uso general con los números hexadecimales declara- emite un mensaje de error.
dos en el encabezado. Luego que los tres registros Tenga en cuenta “que le estamos enseñando a pro-
especiales están cargados con los hexadecimales gramar”, es decir, a utilizar las instrucciones del set
30, 40 y 50 se comienza a decrementar el registro 3 del PIC. Si Ud. es programador, estos ejemplos le van
de a una unidad; mientras el registro tenga un núme- a parecer muy torpes, dado que el experto sabe cómo
ro mayor o igual a 1 se continúa este proceso, pero al utilizar rutinas que permitan hacer lo mismo con me-
llegar a cero se salta a la siguiente sentencia que jus- nos esfuerzo de programación. Ud. está aprendiendo
tamente es un "goto". como cuando comenzó a sumar y en aquella oportuni-
Es como si el control retornara y fuera a dem1 dad seguramente le costaba entender que 1 + 1 es
tantas veces como lo indica el número hexadecimal igual a dos, aunque hoy le parezca un ejemplo muy
cargado en el registro 1. Luego la subrutina pasa a la burdo. Volviendo a nuestro programa, sabemos que la
siguiente sentencia que comienza a decrementar el subrutina "demora" tiene una cierta duración. Con un
número cargado en reg2, sólo que el "goto" es a la eti- mínimo conocimiento de matemáticas podemos calcu-
queta dem2 que es anterior a la dem1, es decir, que lar ese retardo en función de los números hexadeci-
se vuelve a pasar por "dem1" a hacer todo el primer males que hallamos elegido.
decremento del número guardado en "reg3" y recién Tomemos primero el "loop" (rulo) más interno de
después se hace el siguiente decremento en el regis- la subrutina; mientras no se cumpla que "reg 3" = 0 se
63
Microcontroladores PIC
Fig. 5
64
CAPITULO 3 - Aprendiendo a programar
Nos quedarían 1 + 1 ciclos al comienzo de la su- pueda entender el tema con más facilidad. Pero todo
brutina y 2 ciclos al final para llegar a un valor de lo que veremos puede aplicarse a un secuenciador de
1.015.044 ciclos de instrucción. 8 leds. Nuestro dispositivo enciende cuatro leds en
La duración de un ciclo de instrucción depende secuencia de manera que nunca estén encendidos to-
del cristal utilizado. Si usamos un cristal de 4MHz ca- dos al mismo tiempo.
da ciclo de instrucción dura 1µs y tendríamos una de- En el ejemplo anterior vimos primero el programa
mora de 1,015 seg. y luego el diagrama de flujo. En realidad el método es
El led estaría encendido casi un segundo y apaga- el inverso. Un diagrama de flujo permite visualizar el
do otro tanto. funcionamiento de un programa y por lo tanto debe
El funcionamiento del programa principal y la su- efectuarse previamente.
brutina de demora pueden representarse en un dia- Por ejemplo, en la figura 7 puede ver el diagrama
grama de flujo como el mostrado en la figura 6 para de flujo correspondiente a la rutina “demora” del pro-
el programa principal. grama que permite el encendido intermitente de un
led.
El programa es la interpretación del diagrama de
SECUENCIADOR DE 4 CANALES flujo; en el programa se plasman los detalles que no
tiene el diagrama de flujo. Para construir el programa
de nuestro secuencial, nos basamos en el diagrama
de flujo de la figura 8.
Elegimos trabajar con cuatro leds para que usted Observe que luego de iniciado, el proceso no se
detiene jamás, ya que terminada la secuencia, vuelve
Fig. 7 a comenzar. Obviamente, la aplicación de un reset
apagará todos los leds mientras se mantenga el reset
pulsado.
En este programa se van a utilizar nuevas instruc-
ciones que debemos detallar. Entre otras utilizamos
la instrucción movf que se acompaña con un doble
operando. Es una sentencia que sirve para realizar
Fig. 8
65
Microcontroladores PIC
transferencias en el contenido de cualquier registro Aquí se analiza el estado de 5 bit (bit 4, dado que
nombrado como primer operando al registro W. el primer bit o bit menos significativo es el bit 0), si
Otra instrucción nueva es rlf, cuya función es des- éste es cero se continua con la sentencia siguiente ,
plazar el contenido de un registro nombrado como si es 1 se saltea en la siguiente secuencia. En la figu-
operando. ra 9 se realiza un dibujo que explica estas últimas
El contenido se desplaza hacia la izquierda y el instrucciones.
primer bit vuelve a ingresar como último. Imagínese a movf como si volcara el contenido de
Finalmente se utiliza también la instrucción btfss un balde en otro, se lo asimila a un transvasamiento.
que incluye dos operandos; el primer operando indi- La sentencia rlf la puede imaginar como si apretara
ca en qué registro se realiza la operación y el segun- un registro con el dedo puesto por la derecha del mis-
do que posición del registro se analiza (en que bit, del mo; el bit que se cae por la izquierda lo toma con la
bit 0 al bit 7). La operación consiste en analizar la po- mano y lo pone por la derecha donde quedó un espa-
sición siguiente a la nombrada como segundo ope- cio vacío.
rando. Por ejemplo: Vea a btfss como si estuviera con la mano sobre
el quinto bit. Si esa posición esta fría, mande el con-
btfss rot,4 trol de programa al renglón siguiente. Si está calien-
Fig. 9
66
CAPITULO 3 - Aprendiendo a programar
; 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 dirección 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
;preparándolo para la rotación.
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 reenvía a sec.
goto ppal ;si el 5º bit es uno se reenvía a ppal para
;comenzar una nueva secuencia.
demoramovlw grueso ;recarga w con el número hexadecimal
;“grueso” es decir, con 30
movwf reg1 ;se vuelca “grueso” en el registro
;reg 1
dem3 movlw medio ;se carga w con el número hexadecimal
;“medio” es decir con 40
movwf reg2 ;se vuelca "medio" en el registro
;reg2.
dem2 movlw fino ;se carga w con el número 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 instrucción, 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
te, saltee el que sigue y mande el control al posterior "w" con el contenido de "rot" se transvasa "rot" a "w"
a éste. Bien, el programa del secuenciador es en rea- y luego se envía "w" al "ptob", entonces el segundo
lidad una modificación del programa de encendido y led se enciende y así sucesivamente, hasta que se
apagado de un led. Como vemos, los programas difí- enciende el cuarto led. En ese momento, al hacer la
cilmente se inicien desde cero siempre se utilizan rotación se lleva el quinto bit a 1, momento en que se
otros programas que se modifican y además se utili- saltea el goto "sec", se hace un goto a ppal y comien-
zan subrutinas completas como la "demora". Vea pro- za una nueva secuencia. Si lo analizamos globalmen-
grama 5. te, lo único que hace el programa es cargar el puerto
Todo comienza cargando el registro w con el hexa- w con los binarios 00000001; 00000010; 00000100;
decimal 01, es decir que el registro se llenará con el 00001000 y realizar un cambio cada segundo aproxi-
binario correspondiente 00000001. Este contenido se madamente.
transvasa a "rot" y luego de vuelta a "w", desde don- Sugerimos que cambie inicialmente la subrutina
de se lo envía al puerto "b" para encender el último demora para que la secuencia sea más rápida. Luego
led. Ahora el control del programa se envía a demora lo invitamos a realizar un cambio mayor, que impli-
para que el led permanezca encendido cerca de 1 se- que secuenciar 8 leds en lugar de 4, y por último lo in-
gundo. vitamos a construir una guirnalda para un arbolito de
A continuación se produce la rotación de los bits navidad. Lo único que se modifica en este caso es
de "rot" con lo cual queda cargado con el binario que con el sistema simplificado, se requiere manejar
00000010. Ahora se comprueba el estado del quinto un solo led. Para manejar una cantidad mayor, le su-
bit; como es 0 se reenvía el control a "sec”, se carga gerimos el circuito de la figura 10.
68
CAPITULO 3 - Aprendiendo a programar
69
Microcontroladores PIC
Fig. 13
Piense que el circuito propuesto puede tener mu- .asm un archivo .lst con los renglones nume-
archivo .asm;
chas posibilidades de modificarse a voluntad y adap- rados para ubicar en cual se produce el error y el más
tarse a otros usos. Por ejemplo, si en lugar de conec- importante, el archivo .hex que contiene los datos
tar las entradas de las llaves a tensiones continuas, que supuestamente entiende el microprocesador.
las aplican a señales alternas provenientes de 8 os- En realidad del microprocesador no entiende el
ciladores sinusoidales, se puede hacer un barredor archivo con terminación .hex.
.hex El necesita otro pro-
de audio. Si reduce la frecuencia de repetición puede grama que transforma el .hex en un lenguaje binario
construir un generador musical de acordes de 8 no- de datos en serie que es lo único que entiende el mi-
tas, similares a los utilizados como bocina musical croprocesador PIC, ésto es lo que hace un “PROGRA-
en automóviles y etc., etc., etc. Piense en otras posi- MADOR” o cargador de PICs.
bilidades más.
70
CAPITULO 3 - Aprendiendo a programar
Programa 6
en lugar de utilizar el 16C84, como lo hicimos hasta interpreta un número "por defecto" como si fuera he-
ahora, utilizamos el 16F84. La diferencia entre ambos xadecimal.
radica en el tipo de memoria utilizada. En el segundo y tercer renglón se utiliza un crite-
El 16F84 contiene una memoria más rápida del ti- rio diferente. La letra H significa que el número entre
po EEPROM FLASH que se puede reescribir un millón acentos será hexadecimal; en este caso particular se
de veces. El almacenamiento de esta información es- utilizarán las posiciones de memoria 1F y 1E para
tá garantizado por el fabricante por un lapso mayor a guardar a las variables j y k.
40 años con el dispositivo sin alimentación. En la carpeta reset se ubica la parte del programa
El 16C84 es totalmente similar, pero contiene una que se ejecuta sólo cuando se presiona el pulsador
memoria EEPROM común, de acceso más lento y con de reset. Se trata de 5 renglones o sentencias de las
menores garantías de mantenimiento de la informa- cuales la primera ubica el control en la posición de
ción grabada. También se puede utilizar el 16F83 si- memoria de programa cero. En la segunda se carga el
milar al 16F84 pero con la mitad de capacidad de me- registro de trabajo w con el número cero. Observe
moria y por lo tanto más barato. Cualquiera de los que en este caso utilizamos otra notación diferente;
tres integrados puede alimentarse con tensiones de la letra B indica que a continuación se colocará un nú-
4 a 6V. mero binario de 8 dígitos (el PIC empleado sólo pue-
En el sector entre líneas punteadas, se declara de manejar hasta 8 bits). En la siguiente sentencia se
donde se van a ubicar 3 variables que utiliza el pro- vuelca el contenido del registro de trabajo en ptob,
grama, llamadas ptob, j y k. Aquí se puede observar que en el copete se declaró ubicado en la posición de
que la posición de memoria puede declararse de dife- memoria 06. Esta posición de memoria controla la
rentes modos. En el primer renglón sólo escribimos disposición del puerto "B" como de salida (aclaramos
06. Cuando no se coloca el número entre acentos, ni que el uso del comando TRISgenerará un mensaje de
se coloca una letra adelante, se interpreta que se tra- precaución pero que por ahora no debemos tener en
ta de un número hexadecimal. cuenta).
Es decir que el programa ensamblador (el MPASM) En la sentencia 4 de la carpeta "reset", se vuelve
71
Microcontroladores PIC
a cargar el registro de trabajo con el binario en 1E de modo de establecer una demora necesaria
"00000001"; esto no implica que se realice ninguna para que los escalones o el encendido de los leds du-
modificación en la disposición de puertos, ya que una re el valor que nosotros impongamos.
vez cargada la posición de memoria, ésta no se modi- La primer sentencia de la carpeta "kciclo", decre-
ficará hasta que se produzca un reset. El registro w menta ken una unidad. El comando "decfsz" es del ti-
se utiliza para cargar información nueva y ubicarla po condicional; si el valor de k es superior a cero (1 a
luego donde se desea. 50 en nuestro caso), el control del programa va a la
Por ejemplo, en la sentencia 5 se descarga w en sentencia siguiente que es incondicional y reenvía el
el puerto de salida B, que con TRIS se declaró como control de programa a la carpeta "kciclo". Cuando k
de salida. Esto significa que se va a encender el led llega al valor cero, envía el control a la sentencia pos-
ubicado en la pata 6 del mismo (B0). Aquí termina la terior a "goto", obviando el bucle "kciclo". En una pa-
carpeta reset y no se volverá a ella hasta que se opri- labra que los dos primeros renglones de la carpeta
ma reset o se desconecte y reconecte al microproce- "kciclo" decrementan el número 50 hasta cero y como
sador. cada sentencia dura 1µseg, ya que estamos usando
La siguiente carpeta se llama "mciclo" y comienza un cristal de 4MHz, podemos calcular que este bucle
con el comando "rlf" utilizado para mover posterior- del programa dura 100µseg.
mente el bit puesto en uno del puerto B, una posición En la tercera sentencia se decrementa la variable
hacia la izquierda. De cualquier modo al ejecutar rlf "j", del mismo modo que se hiciera con "k" pero se re-
no se producirá todavía el cambio de estado en las torna a la carpeta "jciclo" para generar un nuevo bu-
salidas. En la segunda sentencia de la carpeta "mci- cle de 100µseg. Esto implica que los dos bucles tie-
clo" se carga el registro de trabajo, pero ahora utiliza- nen una duración de 100 x 100µseg, es decir:
mos otra notación diferente. La letra D indica que va- 10.000µseg o 10mseg (con 500, cada bucle dura
mos a cargar un número decimal y luego entre acen- 1000µseg y el producto es 1.000.000 de µseg o 1seg).
tos decimos que ese número será el 50 (esto es ade- Transcurrido este tiempo el control pasa a la quinta
cuado para usar el microprocesador como generador sentencia de la carpeta "kciclo" que es una sentencia
de onda en escalera, pero debe cambiarse por 500 si incondicional goto que envía el control a la carpeta
se va a utilizar como secuenciador; como vemos este "mciclo". Recién en este momento se produce la rota-
número determina la duración de los escalones o el ción de ptob, se apaga el primer led y se enciende el
tiempo de encendido de cada led). En la tercera sen- siguiente por otro lapso de tiempo de 1seg.
tencia se descarga el número 50 en la variable "j" El programa irá cambiando el binario acumulado
que antes se declaró ubicada en la posición de me- en el puerto B, correrá el 1 a la izquierda hasta que
moria 1F. salga del registro y vuelva a ingresar por la derecha.
Aquí empieza la carpeta "jciclo" de una sola sen-
tencia, en donde el mismo número 50 se vuelca en la
variable "k" que antes se declaró ubicada en la posi- COMPILACION
ción de memoria 1E.
La siguiente carpeta llamada "kciclo" se utilizará DE UN PROGRAMA
para decrementar estos números 50 ubicados en 1F y
Cuando uno tiene escrito el progra-
ma con el edit del DOS, debe verificarlo
exhaustivamente, controlar el encolum-
nado 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 pro-
grama. Si usted trabaja correctamente,
el programa ensamblador MPASM le
avisará de los errores y le dará algunas
advertencias útiles sobre el uso de al-
gunas sentencias.
Fig. 14 Para ver cómo funciona ésto, volva-
mos a escribir el programa del secuen-
cial de 8 canales modificándolo de mo-
do que presente algunos errores, vea el
programa 7.
72
CAPITULO 3 - Aprendiendo a programar
Programa 7
A continuación se abrió el MPASM y se ejecutó el tipo de error o advertencia. Los mensajes de adver-
archivo modificado con intención de obtener el archi- tencia no impiden el desarrollo de la posterior pro-
vo HEX que requiere el programador de pics. Pero si gramación, pero los mensajes de error sí. Vamos a
lo solicitamos se pueden generar los archivos .err y atender primero los mensajes de error y luego los de
.lst que serán de gran utilidad para encontrar errores advertencia.
de tipeo (si no sabe cómo se realiza este proceso, lea No es necesario numerar las líneas de programa
el texto: “Todo Sobre PICs”, de Editorial Quark). a mano, y a veces no es conveniente, porque la falta
Veamos cómo se produce la limpieza de un pro- de un separador (punto y coma) puede generar líneas
grama con errores. Al ejecutar el archivo con F10 del fantasmas y confundirnos. Es preferible editar el ar-
MPASM, el ensamblador ofrece un resultado como el chivo .lst (en nuestro caso SECU8NO.LST) que tiene al
indicado en la figura 14. mismo tiempo los mensajes de error y el número de lí-
Luego se muestra la pantalla graficada en la figu- nea.
ra 15 donde se indican 5 errores y 6
precauciones, además de la indica-
ción de la cantidad de líneas totales
ensambladas (30 en este caso). Aho-
ra se deben encontrar las líneas con
errores y para eso se debe editar el
archivo .ERR con el mismo editor de
DOS que estamos utilizando.
Por cada error o advertencia hay
una línea de respuesta que comien-
za con "WARNING" (advertencia) o
ERROR (error) y un número de código
por el que se pueden obtener más
detalles sobre el error o la adverten-
cia, luego el nombre de archivo ana-
lizado con el árbol de directorios co- Fig. 15
rrespondiente y el número de línea
que contiene el error o advertencia.
Luego un separador dos puntos y el
73
Microcontroladores PIC
Fig. 16
Observe la figura 16, en la primera columna se error lo tenemos indicado antes de la línea 00005: y
marcan los errores o precauciones y la localización y nos indica que las variables o símbolos LA y VARIA-
valor de las variables. En la segunda, el número de lí- BLE no están definidos previamente y que se produz-
nea y a continuación la línea de programa. El primer co un cambio de operador. Mirando la línea se obser-
74
CAPITULO 3 - Aprendiendo a programar
va que el único
problema es que Fig. 17
falta el separa-
dor de comenta-
rios y el ensam-
blador confundió
el comentario
con una senten-
cia.
El siguiente
error está en la
línea 12 y nos in-
dica que el error
se produce des-
pués de la prime-
ra columna, en-
tre paréntesis se
encuentra el argumento u orden equivalente (molw conexión, cuyo estado puede modificarse por medio
por movlw). En la línea 22 está el siguiente error y de un programa adecuado.
consiste en la orden GOTO escrita como GORO. Vea- Con un programa adecuado como el NOPP Ud.
mos ahora los mensajes de advertencia. El primero podría variar el estado de la pata 14 del puerto pa-
está en la primer línea y se produce porque esta línea ralelo de la PC en una rápida sucesión que se co-
está dirigida al programador y no puede ser entendi- rresponda con la información serie necesaria para
da por el ensamblador. cargar el PIC.
Se puede dejar sin inconvenientes. La siguiente En una palabra que cada hilo de un puerto pa-
está en la línea 12 y seguramente va a desaparecer ralelo puede transformarse en un puerto serie. Ca-
cuando se corrija la orden movlw. Luego pasamos a la be aclarar que este programa, de la empresa
línea 13 en donde está la orden TRIS; ocurre que en Gernsback, puede bajarlo de Internet de la dire-
los microprocesadores más modernos esta orden se cción:
modifica por otra más compleja; por ahora se puede
seguir usando TRIS para programar los puertos si se ftp://ftp.gernsback.com/pub/EN/noppp.zip
usa el 16C84 o el 16F84. La siguiente precaución es-
En el momento de grabar un PIC se lo debe dispo-
tá en la línea 18 y se debe a que el decimal 50000 es-
ner según lo indicado en la figura 17. Las conexiones
tá fuera del rango admitido por el microprocesador.
de fuente y las señales deben ser aplicadas según
Esta precaución debe ser considerada modificando el
una secuencia predeterminada que debe respetarse
valor por uno menor. La siguiente precaución está en
invariablemente:
la línea 22 y se corregirá al reemplazar GORO por GO-
TO. Al corregir los errores y agregar el separador, el
A)ElprimerpasoescolocarelPICenelzócalodel
MPASM va a reportar sólo dos advertencias. Una en la
programador con señales y fuentes a potencial de
línea 1 por la declaración del microprocesador dirigi-
masa.
da al programador de PICs y la otra es la referida a la
B)LevantarlatensióndefuenteVDDaunpoten-
orden TRIS que puede ser ignorado por el momento.
cialde5V±0,2Vporlapata14(VDD).
C)LevantarlatensióndefuenteVPPaunpoten-
cialde13V±0,3Vporlapata4(MCLRNEGADO).
D) Esperar en esas condiciones un tiempo supe-
CARGA DEL PROGRAMA riora1mS.
E) Posicionar el primer dato en la pata 13 (RB7)
DE UN PIC conunpotencialalto(mayora4V)obajo(menora1V).
F)Cuandolapata12(RB6)paseaunestadoalto,
Para programar un PIC se deben conectar varias
superiora4V,eldatosecargaenlamemoria.
de sus patas en una disposición determinada que ha-
G)Continuarcargandolosdatosconelmismocri-
ce accesible su memoria para recibir datos serie des-
terio a un ritmo tal que el dato esté presente por lo
de el puerto paralelo de su PC.
menosdurante100nS.
El puerto paralelo de la PC, en donde usted conec-
H)Cuandotodoslosdatosfueroncargadossede-
ta habitualmente la impresora, tiene varias vías de
beesperar1segundo.
75
Microcontroladores PIC
Fig. 18
76
CAPITULO 3 - Aprendiendo a programar
meros bit emitidos para saber si debe grabar o leer y conduce y el micro está alimentado con 5V por la pa-
luego transforma RB7 en puerto de salida para poder ta 14. La acción de la llave se controla por el encendi-
leer los datos grabados. Así continúa todo hasta el fi- do del led verde. Por lo tanto, usted debe colocar el
nal de la lectura de datos. PIC en el zócalo o retirarlo sólo cuando el led verde
La mejor prueba para saber si la grabación es exi- está apagado.
tosa consiste en modificar la tensión de la fuente Con referencia a la fuente agregamos un regula-
VDD desde 4 a 6V. Primero se debe realizar una veri- dor LM317 en lugar del 78L5 que tiene la posibilidad
ficación a 5V exactos, luego se debe pasar a 6V y rea- de poder programar su tensión de salida. En efecto el
lizar una nueva verificación; por último ubicar la fuen- preset RV1 en un extremo debe ajustar la salida en
te en 4V y realizar la última prueba. 4V y en el otro lo debe ajustar en 6V.
Esta verificación es sumamente importante por- Tanto la sección de fuente como el voltímetro ne-
que un PIC mal grabado puede presentar fallas en su cesitan ajustes a realizar con un téster digital. La
funcionamiento o peor aún puede funcionar correcta- fuente requiere el ajuste de R21. Comience colocan-
mente al principio pero borrarse en pocos días. do resistores de 1kΩ; luego debe variar ambos valo-
Vamos ahora a adaptar nuestro programador pa- res hasta que la salida cambie entre los límites espe-
ra que funcione con el software NOPP. cificados de 4 y 6V. En el voltímetro se deben ajustar
Las diferencias entre un programador y otro mu- los resistores de 27 y 22kΩ para que el led se encien-
chas veces se deben a la utilización de diferentes pa- da en el rango de 4,8 a 5,2V.
tas del puerto paralelo de la PC. En efecto el softwa- Con referencia a los cambios en el puerto parale-
re del programador puede elegir diferentes patas pa- lo preferimos modificar el cable de conexión dejando
ra utilizarlas como entradas y salidas de datos serie. el conector de la plaqueta sin modificaciones.
También es posible que se utilicen otras patas para Observe que si la plaqueta está desconectada o
generar las tensiones de control de fuentes y, por úl- la fuente está apagada el software NOPP reconoce
timo, algunos software sólo controlan la fuente VPP; este estado a través de la pata 5 de la ficha DB9 que
que es justamente el caso que nos ocupa. Por último está a potencial alto por medio de R9 y aborta la ope-
los programadores más completos utilizan una fuen- ración de carga.
te regulada que puede ajustarse entre 4 y 6V para El transistor Q2 que controla la fuente VPP se ma-
comprobar la efectiva grabación de los datos. neja a través de CI1 desde la pata 1 de la ficha DB9.
En la figura 18 realizamos dos modificaciones. Pero la fuente de 5V deberá manejarse a mano por in-
Por un lado agregamos la llave LL1 para operar la termedio de la llave LL1. ***********
fuente de 5V a mano. Cuando la llave está cerrada Q1
77