Vous êtes sur la page 1sur 14

7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo

pic, todo sobre pics, conversores ad, …

EXPERIENCIAS Y PRÁCTICAS
I
con los microcontroladores PIC16F84
Lunes, 07 de Mayo del 2018__________________ Incluir en favoritos si quiere volver a visitarnos.

Introducción.

Este es un acercamiento muy lineal a la escritura de un programa. Muchos escriben y producen
unas subrutinas muy pequeñas con saltos (GOTO's) de una subrutina a otra, de modo que los
productos saltan por todas partes como 'palomitas de maíz'. El micro es capaz, perfectamente
capaz de saltar por un programa, sin embargo este tipo de disposición es muy difícil de seguir por
un lector.

EXPERIMENTO 1.
Los comienzos siempre son muy simples, luego gradualmente se hacen más y más complejos.
Para seguir los experimentos que se describen en estas páginas se recomienda montar el
proyecto "Tarjeta de Pruebas " siguiendo las indicaciones que se dan en dicho artículo, aunque
naturalmente el lector puede realizar su propio desarrollo o bien usar un protoboard, a su
elección. 

Una vez dispongamos de dicho soporte, las 4 pilas de 1'5V y el chip 'F84A, debemos copiar
y pegar el código que hay debajo, para poder completar nuestro primer experimento, al que
daremos el nombre ejem01.asm y usando el ensamblador gratuito de Microchip MPLAB, pasarlo a
hexadecimal (.hex) con el cual tratamos de encender un LED. No hace nada más. El objetivo de
este programa es mostrar las pocas líneas de código, necesarias para que el PIC haga esta tarea.
Ver el listado:

;******************************************************************^
; Título: ejem01.asm ^
; Autor: V. Garcia ^
; Date: 12012006 ^
; Deben documentarse todas las rutinas y el motivo de ser ^
; (Las tildes estan omitidas de manera intencionada) ^
;_________________________________________________________________ ^
; Recordar que con: 0 se designa al registro W y con ^
; 1 se designa al archivo f ^
; ^
; Que hace => Encender LED 1 ^
; ^
; PIC16F84A ^
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;
;--------------- Encabezado -------------

Start: ORG 0x00


BSF STATUS,5 ;Ir a pagina1 a fijar los puertos
MOVLW h'00' ;pon 00 en W
MOVWF h'05' ;haz todas las líneas RA salida
MOVWF h'06' ;haz todas las líneas RB salida
BCF STATUS,5 ; Ir a pagina0 para seguir el programa

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 1/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

LED_EN: MOVLW h'254' ;pon 1111 1110 en W


MOVWF h'06' ;conecta el primer LED
GOTO LED_EN ; lazo a LED_EN

END

El siguiente es el listado en hexadecimal, si no dispone de un ensamblador, puede copiar y
pegar en su editor de texto y guárdelo como ejem01.hex para usar con el 'quemador' de chips y
comprobar que hace lo que se espera.

:1000000083160030850086008312FF308600FE30A4
:040010008600072837
:00000001FF

Qué hace el programa.
Las líneas que empiezan con un punto y coma, como ya se ha comentado, son comentarios y no
los usa el ensamblador, así que, la primera línea donde realmente comienza el listado, empieza en
mnemónicos con una etiqueta Start (Principio), no siempre es necesario usar etiquetas. La
instrucción ORG 0x00 indica al micro en ensamblador, donde colocar el programa, al principio de la
memoria de programa (Flash). Es un área de datos en el propio micro, en la que se memorizan
diversos datos durante la ejecución del programa, este área es la RAM del PIC, definida por el
fabricante como área de FILE REGISTER, que se encuentra a partir de la dirección 0x0C. En el
PIC, siempre le siguen unas líneas que como se verá, nos permiten el acceso a un juego de
registros para la configuración del micro.

La instrucción que sigue BSF STATUS,5 BSF (BIT SET FILE REGISTER) pone a 1 el bit 5 del
registro STATUS (0x03), en la posición de memoria RAM especificada, lo que nos permite el
acceso a la página1 (o Banco1) donde se deciden las condicionantes que se ocupan de los
registros 05 (puerto A) y 06 (puerto B) y ambos registros determinan el estado lógico de cada uno
de los pines de dichos puertos A y B.

Con la instrucción MOVLW 00h (MOVE Literal to W register) ponemos el literal 00 en el registro
de trabajo W, con la siguiente instrucción MOVWF 05h (MOVE W to File) ponemos el valor del
registro W en el registro 0x05 (RP0) que es el Puerto A, que viene definido en el archivo
P16F84A.INC, con esto hemos configurado el Puerto A como salida 0000 0000b. Si queremos que
sea todo entradas usaremos la instrucción MOVLW FFh seguido de MOVWF 05h, esto pone 1111
1111b, todos los bits del Puerto A (0x05) a 1 como entradas .

En el registro STATUS, encontramos los parámetros RP0 que corresponde al valor 0x05 o lo que
es lo mismo el bit5 del registro. Se pone a 1 este bit para cambiar el banco de trabajo y manejar los
registros TRISA y TRISB como se verá más tarde.

Por ejemplo, cuando un bit del registro RP0 es 1, la patilla correspondiente del chip (del Puerto A)
será entrada y cuando dicho bit lo ponemos a 0, esa patilla será salida. Tengamos en cuenta que,
no podemos cargar ninguno de estos registros directamente, en primer lugar se debe poner un
valor o número (llamado literal) en W y luego cargar W en el registro deseado. Si cargamos 00 en
W y luego W en 05 y 06, todas las líneas del Puerto A y del Puerto B serán puestas como salida.

La siguiente instrucción BCF STATUS,RP0 (Bit Clear File register) cierra esta página1 (banco1) y
devuelve el control a las instrucciones del programa de la página 0 (banco 0). Observar el símil
BSF (Bit Set, banco1 ) y BCF (Bit Clear, banco 0). Como el F84A sólo tiene dos bancos (0 y 1) usa

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 2/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

el estado de un sólo bit para cambiar de banco, otros PICs con más memoria requieren de más bits
de control en el mismo registro STATUS.

Esto, en esencia significa que, el programa para encender un LED realmente consiste en tres
líneas, la primera línea en la etiqueta LED_EN MOVLW h'254', pone el valor FEh en el registro de
trabajo W, la segunda línea MOVWF h'06' copia el valor en W al Puerto B (06). Este puerto es de
salida (en realidad es un puerto de Entrada/Salida) cuando el primer bit del Puerto B pase a ALTO,
el LED se iluminará, como el programa es muy rápido, se apagará de inmediato y no podremos
saber si funciona el programa, entonces, entra en acción la tercera línea del programa.

La tercera línea GOTO LED_EN (del inglés GO TO, ir a), es la instrucción que envía el puntero
del programa a la dirección de la etiqueta LED_EN, es el lazo que mantiene el LED encendido por
el programa al repetir la secuencia, ya que como se ha dicho, el micro debe estar (corriendo) todo
el tiempo, incrementando el programa. Ahora, puede que sea algo confuso lo descrito, sin embargo
a medida que avance en estos artículos podrá comprobar que es sencillo y fácil.

El circuito.

Como se aprecia en el esquema, el circuito anterior (Tarjeta de Pruebas) se compone de un
microcontrolador PIC16F84, ocho diodos LED y unos pocos componentes adicionales. El Puerto B
del PIC  tiene un LED conectado a cada una de sus ocho líneas. El circuito más simple y sencillo
se puede ver a continuación.

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 3/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

Todo lo descrito hasta aquí, es cierto, si bien hay otras formas de lograr el mismo resultado, una
de las formas es cambiando el sentido del LED, en cuyo caso se debe modificar el valor de la salida
del puerto B, donde había un 0 ahora debe presentar un 1, lo que obliga a conectar el ánodo a la
salida y la resistencia a la línea de masa (GND), con esto se ha modificado el programa y sigue
mostrando el mismo resultado que el anterior. Entonces, porque se ha usado el primer método.

No ha sido al azar, tengamos en cuenta que el consumo del conjunto LED más resistencia
normalmente no supera los 20mA y como la patilla del puerto, admite una corriente mayor, no
causará ningún contratiempo, ya que el drenador de salida del puerto soporta dicha carga mejor
que tener que aportar dicha corriente que supone un mayor consumo y el consiguiente aporte de
calor, este ha sido el principal motivo de usar este método. Este método debe ser considerado por
el técnico para reducir consumos innecesarios en los proyectos. Este criterio es el que seguiremos
aquí.

La operación del circuito se basa en un programa y este programa está contenido en el chip.
Cuando se aplica la energía, el micro empieza en la primera posición de memoria y ejecuta el
programa. El programa será guardado en la memoria del micro, durante el "quemado" y en ese
único momento están disponibles un número de opciones de oscilador, osc RC (oscilador Res. /
Cond.) que debe ser seleccionado y el chip estará listo para ese tipo de oscilador elegido, téngase
en cuenta que el montaje sólo responderá al sistema de oscilador en la palabra de configuración
que haya elegido al 'quemar', si es RC, LP, TX, etc. Otras opciones disponibles del F84A a
configurar son: PWRTE, CP, WDT, las cuales dependen del dispositivo en uso (se recomienda leer
el DataSheet correspondiente).

Debido a que el chip puede ser programado y reprogramado de nuevo, lo cierto es que está
garantizado por más de 1.000 veces, esto lo hace ideal para la experimentación.

EXPERIMENTO 2.
  Este experimento es similar al anterior, mediante unas pocas líneas añadidas al
contenido del programa anterior, hacemos que el LED ahora se encienda y se apague en
una secuencia sin fin. El circuito que se usa, es el mismo del ejercicio anterior. Esto se consigue de
esta forma: añadimos en la tercera línea, una instrucción CALL (Llamada) que envía al programa a
la subrutina con etiqueta 'Delay' y luego se hace un nuevo lazo, veamos.

Se trata de conseguir un retardo 'Delay' con el que poner el estado del LED en un bucle de
espera, esta subrutina la llama el programa principal con la instrucción CALL Delay, esto mantiene
encendido el LED, cuando termina el bucle, el micro retorna a la línea siguiente donde esta el
CALL, en el programa principal MOVLW h'FF' que, carga el literal FF en el registro W y lo pone con
la instrucción MOVWF 06, en el Puerto B (salida) y salta de nuevo a la etiqueta Delay (retardo) para
esta vez mantener apagado un tiempo el LED.
http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 4/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

Al volver del retardo se establece un nuevo lazo, sería conveniente volver a empezar esta parte
del programa para repetir los mismos pasos y esto se logra con un lazo que une este punto con el
principio mediante el GOTO LED_EN. Véase el listado.

En cuanto a la rutina 'Delay' en sí, lo que ocurre es que, empieza por DECFSZ 1Bh (DECrement
File Register Skip If Zero) decrementa una unidad el archivo 1Bh, si no es cero, sigue en la
instrucción GOTO Delay para volver a decrementar que devuelve el programa a la instrucción
anterior, para decrementarlo una nueva unidad, esto lo hace cada vez que pasa por la instrucción
DECFSZ 1Bh.

Cuando el archivo 1Bh llega a 0, entonces salta la instrucción GOTO Delay a la instrucción que
sigue que, es otro DECFSZ pero esta vez el archivo es 1Ch y empieza a decrementarlo de uno en
uno avanzando la rutina, luego se reinicia la instrucción DECFSZ 1Bh, a la que le sigue el
decremento DECFSZ 1Ch, decremento de la instrucción a instrucción hasta llegar a la instrucción
(RETURN) de retorno al programa principal. Esto se le llama instrucciones anidadas, ya se tratarán
en más detalle.

. . .
. . .
LED_EN MOVLW h'FE' ;pon 1111 1110 en W
MOVWF h'06' ;conecta el primer LED
CALL Delay ;Salta al retardo
MOVLW h'FF' ;carga W con FF y
MOVWF 06 ;apaga el LED
CALL Delay ;Salta al retardo
GOTO LED_EN ; lazo a LED_EN

Delay DECFSZ h'1B',1 ; Retardo


GOTO Delay
DECFSZ h'1C',1
GOTO Delay
RETURN

END

Se muestran sólo los cambios que nos permiten producir lo previsto en el enunciado. Observar
que no se usan los pulsadores, para estos experimentos. A continuación se presenta el listado en
hex para que si no puede ensamblarlo lo copie y pegue en su editor de texto y guárdelo como
ejem02.hex para el posterior 'quemado' del chip.

:1000000083160030850086008312FF308600FE30A4
:1000100086000E20FF3086000E2007289B0B0E283E
:060020009C0B0E280800F5
:00000001FF

EXPERIMENTO 3.
   En este experimento, proponemos encender el LED 1 de una
fila de 8 LEDs, lo apagaremos y encenderemos el siguiente LED
2 esto lo repetiremos en una secuencia hasta llegar al LED 8
con una cadencia de 2Hz, para volver a empezar por el LED 1, esto es todo lo que hace este
experimento. El circuito que usaremos es similar al usado en el experimento 1, al que añadimos 7
series LED+R. Lo que más cambiará es el listado del programa que, en este caso, tendrá que sufrir

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 5/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

algunas modificaciones como veremos. Este puede ser una modificación del esquema en el caso
de no usar la tarjeta descrita.

En el esquema del principio, los cinco pines RA0 a RA4 (puerto A) se usan como pines de
entrada, estos son forzados a alto con resistencias a positivo de 10kohms, de modo que cuando los
pulsadores no están pulsados la entrada se hace alta (+5V) y cuando uno se pulsa pasa a nivel
bajo (0V). El fenómeno de rebote producido, no se contempla esta vez ya que, cuando el programa
detecta que el pulsador está cerrado, el tratamiento de parpadeo de los LED's se ejecuta una vez
en el tiempo y es más largo que el rebote. No se usan pulsadores en este ejercicio, de modo que no
se contemplarán.

Los ocho pines RB0 a RB7 (puerto B) se usan como salida, los ánodos de los LED's se conectan
al +5V y cada cátodo es controlado por la resistencia vía PIC, de modo que cuando la salida del
PIC es nivel alto (+5V), el LED implicado no luce y cuando el PIC entrega un nivel bajo (0V), lucirá
el LED, esto reduce la corriente en el chip. Se usarán LED's de alto brillo con poca corriente de
flujo. Este es el listado completo para este experimento.

;******************************************************************^
; Título: ejem03-1.asm ^
; Autor: V. Garcia ^
; Date: 12012006 ^
; Deben documentarse todas las rutinas y el motivo de ser ^
; (Las tildes estan omitidas de manera intencionada) ^
;_________________________________________________________________ ^
; Recordar que con: 0 se designa al registro W y con ^
; 1 se designa al archivo f ^
; ^
; Que hace => Encender LED 1, lo apaga y enciende el siguiente ^
; hasta el LED 8, luego vuelve a emepzar. ^
; PIC16F84A ^
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;
;--------------- Encabezado -------------
list p=pic16f84a
#include <p16f84a.inc>
errorlevel -302 ;Eliminar banco mensajes

;**************** Definicion de Etiquetas ********************


STATUS equ h'0003'
porta equ h'0005' ; define puerto A
portb equ h'0006' ; define puerto B
TRISA equ h'0085'
http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 6/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …
TRISB equ h'0086'

; Estos estan definidos en #include


;w equ h'0000'
;f equ h'0001'

ra0 equ 00 ;RA0 bit


ra1 equ 01 ;RA1 bit
ra2 equ 02 ;RA2 bit
ra3 equ 03 ;RA3 bit
ra4 equ 04 ;RA4 bit
rp0 equ 06

cnt500u equ 0c ;500usec direccion contador


cnt1m equ 0d ;1msec direccion contador
cnt100m equ 0e ;100msec direccion contador
cnt500m equ 0f ;500msec direccion contador
cnt1s equ 10 ;1sec direccion contador

;************* Definicion Modelo Datos ****************


; '1':OFF '0':ON

;****** Tabla Modelo ******


p00 equ b'01111111'
p01 equ b'10111111'
p02 equ b'11011111'
p03 equ b'11101111'
p04 equ b'11110111'
p05 equ b'11111011'
p06 equ b'11111101'
p07 equ b'11111110'
;
;**************** Inicio Programa ***********************
org 0 ;Vector Reset
goto init
org 4 ;Vector Interrupcion
BCF INTCON,GIE ;Por si se dispararan las interrupciones
goto init

;**************** Proceso Inicial *********************


org 5
init: bsf STATUS,RP0 ;Cambiar a Banco1
movlw h'ff' ;Define modo datos entrada
movwf TRISA ;Define PORTA en modo Entrada
clrf TRISB ;Define PORTB a modo Salida
bcf STATUS,RP0 ;Cambia a Banco0
;
movlw h'ff' ;Pon datos '11111111' en salida
movwf portb ;para apagar LEDs

;*********** Modelo 0 Subrutina Salida ***************


ptn0 movlw p00 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec
movlw p01 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 7/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …
movlw p02 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec
movlw p03 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec
movlw p04 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec
movlw p05 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec
movlw p06 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec
movlw p07 ;Pon datos modelo en
movwf portb ;datos salida
call t100m ;Espera 100msec
movlw h'ff' ;Pon datos FF en salida
movwf portb ;datos para apagar LED
call t100m ;Espera 100msec
return

;********************************************************
; Subrutina retardo (Timer) para reloj 10MHz
;********************************************************

;************* Subrutina 1msec Timer *****************


t1m movlw d'2' ;(1) Pon lazo cnt1
movwf cnt1m ;(1) Guarda lazo cnt1
tm1lp1 movlw d'249' ;(1)*2 Pon lazo cnt2
movwf cnt500u ;(1)*2 Guarda lazo cnt2
tm1lp2 nop ;(1)*249*2 ajust retardo
nop ;(1)*249*2 ajust retardo
decfsz cnt500u,f ;(1)*249*2 cnt500u-1=0 ?
goto tm1lp2 ;(2)*248*2 No, continua
decfsz cnt1m,f ;(1)*2 cnt1m-1=0 ?
goto tm1lp1 ;(2) No. Continua
return ;(2) Si. final de Cnt
;Total 2501*0.4usec=1msec

;************* 100msec Subrutina Retardo (Timer) ***************


t100m movlw d'100' ;Pon lazo contador
movwf cnt100m ;Guarda lazo contador
tm2lp call t1m ;subrutina 1msec
decfsz cnt100m,f ;cnt100m - 1 = 0 ?
goto tm2lp ;No. Continua
return ;Si. Final de Contador

;************* 500msec Subrutina Retardo (Timer) ***************


t500m movlw d'5' ;pon lazo contador
movwf cnt500m ;Guarda lazo contador
tm3lp call t100m ;subrutina 100msec
decfsz cnt500m,f ;cnt500m - 1 = 0 ?
goto tm3lp ;No. Continua
return ;Si. final de Contador

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 8/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

;************** 1sec Subrutina Retardo (Timer) *****************


t1s movlw d'2' ;Pon lazo contador
movwf cnt1s ;Guarda lazo contador
tm4lp call t500m ;subrutina 500msec
decfsz cnt1s,f ;cnt1s - 1 = 0 ?
goto tm4lp ;No. Continua
return ;Si. Final de Contador

;********************************************************
; Final del proceso parpadeo LED
;********************************************************

end

Este que sigue, es el archivo en hex que se obtiene al ensamblar el listado anterior, si no
dispone de un ensamblador, puede copiar y pegar este archivo en su editor de texto y guárdelo
como ejem03­1.hex para el 'quemado' en un chip '84A, con su sistema de programación.

:020000000528D1
:0800080005280317FF308500F5
:1000100086010313FF308600051C0E200310FE30FE
:1000200086001420860D112803309A009B0B162899
:0A0030009C0B16289A0B16280800F6
:00000001FF

Qué hace el programa.
Las primeras líneas del programa, definen las igualdades (equ) y los parámetros que se van a
usar. Aquí, se han definido las variables ra0­ra4 no usadas y  RP0, seguidamente se define una
tabla modelo binario de ocho líneas de datos, cada vez que se llame con:
   
   movlw p00        ; carga literal en el registro W (el literal va desde p00 a p07)
   movfw portb    ; presenta valor en puerto b  
   call t100m         ; llama subrutina retardo   
 
su valor se enviará a la salida (puerto B), alternando con los retardos necesarios para encender el
LED que corresponda en cada caso, esto se repite. Posteriormente se define la subrutina de
retardo desde donde se vuelve a la rutina principal. 

La rutina de tiempos aquí usada, como se aprecia, es bastante completa ya que presenta hasta
cuatro alternativas permitiendo un retardo de: 1 milisegundo, 100 milisegundos, 500 milisegundos y
1 segundo, lo cual, la hace interesante a la hora de aplicar en distintas ocasiones. Le aconsejo que
la estudie con atención, le puede servir en sus proyectos.

  Sin embargo, nos parece muy extenso este listado, podemos
hacer lo mismo de forma más simple. Esto mismo se hace
poniendo un 0, en el puerto b de salida (registro 06h), esto pone
a 0 el bit más alto y así el primer LED se iluminará. Entonces el bit se rota (cambia) un lugar a la
derecha con una instrucción RLF (Rotation Left File, rotación a la izquierda de un bit) del contenido
de F, pasando por el bit de acarreo C, esto conecta el siguiente LED en la fila. Es importante
'aclarar' (poner a 0) la bandera C (acarreo) antes de usar una instrucción de rotar, ya que
cuando se conecta el micro, la bandera C puede estar en 1, con esto nos aseguramos que los

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 9/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

LED's se desplazaran, que es lo que deseábamos. Este es el listado en ensamblador que se puede
copiar, pegar y guardar con el nombre ejem03.asm.

;******************************************************************^
; Título: ejem04.asm ^
; Autor: V. Garcia ^
; Fecha: 20-01-2006 ^
; Version: 0.0 ^
; Codigo para: PIC16C84 y PIC16F84 ^
; Clock: 4MHz , XT. -> Ciclo = 1 uS. ^
; Reset: Power On Reset. ^
; Watch Dog: Inhabilitado. ^
; Proteccion de codigo: Inhabilitado. ^
; Ficheros requeridos: H16f84a.inc ^
; Placa uControladora: Circuito de cátodos de LEDs a +Vcc. ^
; ^
; (Las tildes estan omitidas de manera intencionada) ^
;_________________________________________________________________ ^
; Recordar que con: 0 se designa al registro W y con ^
; 1 se designa al archivo f ^
; Pulsador sin rebotes enciende un LED ^
; Que hace => A de encender el LED 1 apagarlo, encender LED 2 y ^
; apagarlo, sigue hasta LED 8. La secuencia se invierte y sigue ^
; desde LED 8 hasta LED 1 ^
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;--------------- Encabezado -------------
;********************************************************************
;
LIST p=PIC16F84A ; Directiva para definir micro.
#include <p16f84a.inc> ; Fichero estandard de cabezera.
;
;******************** DEFINICIONES **********************************
; Todas las definiciones estan en 'include ', por tanto
; solo se definen las locales
porta equ h'0005' ; define puerto A
portb equ h'0006' ; define puerto B

con1 equ 0x0C ; Variable de temporizacion.


con2 equ 0x0D ; Variable de temporizacion.

;******************** COMIENZO DEL PROGRAMA ********************


; SE DEFINEN BANCOS
#define banco1 bsf STATUS,RP0 ;Macro para abreviar el BANCO 1
;pone a 1 el bit5 del registro status
#define banco0 bcf STATUS,RP0 ;Macro para abreviar el BANCO 0
;pone a 0 el bit5 del registro status

ORG 0x00 ; Vector de Reset.


GOTO inicio ; Programa Principal.

;************************************************************
delay: CLRF con1 ;lazo exterior
MOVLW 0xF0
MOVWF con2
; RETURN ;esta linea es de prueba
loop: DECFSZ con1,F ;lazo interior
GOTO loop
http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 10/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …
DECFSZ con2,F
GOTO loop
RETURN
;
;******************** PROGRAMA PRINCIPAL ********************

inicio: banco1 ; Banco 1.


CLRF TRISB ; aclara puerto B, pone a 0 , todo salidas
banco0 ; Banco 0.

MOVLW 0xff ; PORTB 11111111.


MOVWF portb ;
BCF STATUS,C ;Preparado para rotar, pone a 0 el bit C

; Desplazar portB a la izquierda, usamos la instruccion ROTAR

gira_i:
BTFSS portb,7 ;si el bit 7 = 1 salta y rota a derecha
ANDLW 01 ;si no, AND entre literal y W

sigue_i: BTFSC portb,7 ; portb = 00?


goto $+3 ; no, salta 2 lineas
movlw 0xff ; si, pon 255 en
movwf portb ; portb
BCF STATUS,C ;Asegura que en primera
; rotacion ingrese 0 en PORTB
RLF portb,F ;rota archivo F a izq. (F = '1111 1110')
CALL delay ;salta a retardo
GOTO gira_i ;vuele a girar.
;
END ; Fin de programa.

Qué hace el programa.
Se definen los parámetros en las primeras líneas, registros, puertos y variables. Además en este
caso he querido plasmar otra forma posible de definir las variables para manejar los bancos
(banco0 y banco1). Para ello he definido las macros banco1 y banco0, mediante las cuales se
realiza la configuración de los mismos. El tema de macros no se describirá aquí.

Seguidamente en Inicio, se ve como se aplican. En este punto recalco el modo de poner a cero
todos los bits de un puerto, en este caso el puerto B (TRISB) mediante la instrucción CLRF (aclarar
registro f). En las líneas siguientes, se carga el puerto B con el literal FF y con BCF (Bit Clear File)
se pone a 0 el bit C, con lo que estamos listos para empezar a desplazar el LED encendido, por la
barra de LEDs.

Sigue la subrutina de retardo y ahora empieza la rutina principal gira_i el primer paso comprueba
el estado del bit7 =1 del puerto b, luego comprueba si es 0 y mediante la instrucción RLF (Rota Left
File) nos desplaza a la izquierda una posición (rotación del bit), en cada iteración del lazo de la
subrutina, encendiendo, apagando y desplazando el LED en cada momento. Si en BTFSC portb,7
es 0, se carga el puerto b con 255 para podar seguir desplazando el LED.

Se puede observar un RETURN inhabilitado en la rutina de retardo, esto lo uso para comprobar el
buen funcionamiento de las subrutinas, una vez comprobada, pongo el consabido punto y coma
delante y a seguir. El listado en hex que sigue, por si no lo quiere ensamblar, lo puede copiar, pegar

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 11/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

y guardar como ejem03.hex en un archivo con el que puede quemar el '84A para probar su
funcionamiento.

:020000000528D1
:06000A008316860183123B
:10001000FF3086000310861F0139860D10200B2843
:100020008C01F0308D008C0B13288D0B13280800E9
:00000001FF

Como siempre el circuito y esquema electrónico es el mismo mostrado en la figura anterior.

EXPERIMENTO 4. 
  En este caso, propongo producir un programa que encienda
un LED y lo desplace en un sentido por la barra, cuando llegue
al final regrese y repita esta secuencia en el otro sentido.
Digamos que, con este programa obtendremos la clásica barra de LEDs del famoso coche
'Fantástico'. A tenor de lo visto en los ejemplos anteriores parece sencillo y así lo voy a demostrar.
El listado sería el siguiente: 

;******************************************************************^
; Título: ejem04.asm ^
;  Autor: V. Garcia ^
;  Fecha: 20-01-2006 ^
; Version: 0.2 ^
; Codigo para: PIC16C84 y PIC16F84 ^
; Clock: 4MHz , XT. -> Ciclo = 1 uS. ^
; Reset: Power On Reset. ^
; Watch Dog: Inhabilitado. ^
; Inhabilitado. ^
; Ficheros requeridos: H16f84a.inc ^
; Placa uControladora: Circuito de cátodos de LEDs a +Vcc. ^
; ^
; (Las tildes estan omitidas de manera intencionada) ^
;_________________________________________________________________ ^
; Recordar que con: 0 se designa al registro W y con ^
; 1 se designa al archivo f ^
; Pulsador sin rebotes enciende un LED ^
; Que hace => A de encender el LED 1 apagarlo, encender LED 2 y ^
; apagarlo, sigue hasta LED 8. La secuencia se invierte y sigue ^
; desde LED 8 hasta LED 1 ^
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;--------------- Encabezado -------------
;*******************************************************************
;
LIST p=PIC16F84A ; Directiva para definir micro.
include "p16f84a.inc" ; Fichero estandard de cabezera.

;******************** DEFINICIONES *********************************

con1 equ 0x0C ; Variable de temporizacion.


con2 equ 0x0D ; Variable de temporizacion.

;******************** COMIENZO DEL PROGRAMA ********************


; SE DEFINEN BANCOS
#define banco1 BSF STATUS,RP0 ;Macro para abreviar el BANCO 1
http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 12/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …
;pone a 1 el bit5 del registro status
#define banco0 BCF STATUS,RP0 ;Macro para abreviar el BANCO 0
;pone a 0 el bit5 del registro status
ORG 0x00 ; Vector de Reset.
GOTO inicio ; Programa Principal.

;****************** SUBRUTINA DE TIEMPO *************


delay: CLRF con1
MOVLW 0xF0
MOVWF con2
; return ;es de prb
loop: DECFSZ con1,F
GOTO loop
DECFSZ con2,F
GOTO loop
RETURN
;************************************************************
;******************** PROGRAMA PRINCIPAL ********************

inicio: banco1 ; Banco 1.


CLRF TRISB ; aclara  
banco0 ; Banco 0.

MOVLW 0xff ; PORTB 11111111.


MOVWF PORTB ;
BCF STATUS,C ;Preparado para rotar

; PORTB Rota hacia la izquierda, usamos la instrupcion ROTAR

gira_i: BTFSC PORTB,7 ;si el bit7 = 0 salta y rota a derecha


GOTO sigue_i ;no, sigue izquierda.
GOTO gira_d ;
sigue_i:
RLF PORTB,F ;rota archivo F a izq. (F = '1110')
CALL delay ;
BTFSC PORTB,0 ;salta y rota si bit0 = 0
GOTO gira_i
BSF PORTB,7
; PORTB Rota hacia la derecha
gira_d: BTFSC PORTB,0 ;salta y rota si bit0 = 0
GOTO sigue_d
GOTO gira_i
sigue_d:
RRF PORTB,F
CALL delay
GOTO gira_d
;
END ; Fin de programa.

Qué hace el programa.
Si el lector sigue el flujo del programa puede comprender que, he recurrido a dos rutinas
encadenadas idénticas en la forma: gira_i y gira_d ambas están entrelazadas, trataré de describir
como funcionan.

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 13/14
7/5/2018 practicas y experiencias con pic, adquisición de datos con pic, curso de microcontroladores pic, microcontroladores pic, todo sobre pics, conversores ad, …

Al llegar el programa a gira_i, encuentra la instrucción BTFSC portb,7 que comprueba si el bit7
del puerto B está a 0, como dicho bit7 es 0, el programa sigue y salta a la etiqueta sigue_i, en ese
momento rota izquierda con RLF seguido de un salto al retardo para que el LED se vea encendido,
al regresar comprueba si está a 0 el bit0, si no lo está vuelve a gira_i, repitiendo estos pasos hasta
que el bit0 es 0, en cuyo caso salta hasta BSF PORTB,7 para poner a 1 el bit7, luego sigue con
gira_d donde comprueba el estado del bit0 que, estará a 1 y saltará a sigue_d para rotar a derecha
seguido de un CALL a pausa, al volver hará un GOTO gira_d, repitiendo estos pasos.

Al llegar el programa a la instrucción CALL delay saltará a la posición de la etiqueta (subrutina de
retardo) delay, limpia el registro cont1 y carga el registro cont2 con el valor F0h, decrementa el
registro cont1 que esta a 00 y por tanto ahora esta a FFh (GOTO loop) hasta que es 0 y en ese
momento decrementa el registro cont2 (GOTO loop) hasta que es 0 cerrando el lazo por segunda
vez. Cuando termine esta subrutina (pausa), volverá a la instrucción siguiente a la que le hizo saltar.
Espero haber aclarado el flujo del programa.

Sigue está el listado en hex del archivo un vez ensamblado, como siempre, puede copiar y pegar
en un editor de texto y guardarlo como ejem04.hex para posteriormente quemar un PIC17F84A y
comprobar su eficacia.

:020000040000FA
:1000000009288C01F0308D008C0B04288D0B0428FE
:100010000800831686018312FF3086000310861BBA
:1000200012281728860D012006180F288617061893
:0A0030001A280F28860C012017285B
:00000001FF

Con este ejercicio ponemos el punto y aparte por esta vez, seguiremos con estos ejemplos en la
segunda parte. 

Volver al índice de artículos PIC.
Creado el: 03­06­2005
 
Actualizado el: 03­06­2005       

    

http://hispavila.com/total/3ds/chipspic/practicas_pic_1.html 14/14

Vous aimerez peut-être aussi