You are on page 1of 138

Always leading the pack

SISTEMAS PROGRAMABLE
DL 3155M24

Laboratorio Time
Página blanca
DL 3155M24 : Sistemas programables
Questo Training Software affronta lo studio dei sistemi programmabili (microcontrollore):

GUIDA TEORICA
Lezioni:
Introducción a los microcontroladores
Arquitectura hardware de el microcontrolador PIC
Programación
Alrededores y tecnicas de entrevista, interrupt

GUIDA PRATICA
Unità:
Programación de el PIC
Puertas I/O, Routine de retraso, EEPROM
Teclado de matriz 4x4
Display
Mini PLC (2 input - 4 output)
Página blanca
Lección N.1: Introducción a los microcontroladores
Objectivos: Saber:
Que cosa son los microcontroladores

Saber hacer:
Realizar un simple esquema de bloques de un microcontrolador

Requisitos : Nociòn de electronica digital

Contenidos : Microcontroladores y microprocesadores


Los microcontroladores PIC
Página blanca
1.1 Microprocesadores y microcontroladores

El microprocesador es una pequeña y economica unidad central de elaboraciòn (CPU, Central Processing
Unit) para las computadoras con tamaño modesto, que puede ser utilizada tambièn como un circuito
independiente en una gran serie de aplicaciones.
Se encuentra realizado sobre una singular lastra de silicio, llamada chip, casi siempre no mide màs de 0,5 cm
por lado y no supera o,5 mm de ancho.
Aunque el tamaño no sea grande, un microprocesador puede ser programado para desarrollar un grande
nùmero de funciones para administrar las informaciones.
Puede funcionar como elaborador para usos generales en diferentes aplicaciones, desde la didàctica a la
elaboraciòn de textos, desde el control de màquinas utensilios o para procesos industriales, a el control de
personas enfermas en los hospitales, o ademàs en las calculadoras de bolsillo. La venida de el
microprocesador ha sido posible considerando como en el tiempo se hayan logrado producir circuitos cada
vez màs pequeños (miniaturas) y por los progresos alcanzados en la tecnologia de los semiconductores.

Un microprocesador puede desarrollar el solo un amplia serie o gama de funciones, ya que puede reunir
muchos componentes de un solo chip. Un microprocesador integrado contiene tipicamente una memoria con
una sola lèctura (ROM), es decir una memoria cuyo contenido puede ser leido màs veces, pero no puede ser
cambiado, y puede disponer de una extenciòn de memoria para acceso casual (RAM) para contener datos
provisorios. Estan presente tambièn algunos registros para contener las instrucciones que hay que seguir,
para los datos, y una unidad aritmètico - logica.
El conjunto dispone tambièn de una cara interna para conectarse, si es necesario, con memorias externas y
con otros sistemas.

Fig. 1.1

Los microprocesadores estàn clasificados segùn el nùmero de los bit de informaciones que pueden ser
transferidos "en paralelo" (es decir al mismo tiempo) y conservados en los registros internos.
Este nùmero ha crecido constantemente con el desarrollo de la tècnologia de los circuitos, y actualmente son
comunes microprocesadores con 8, 16 y 32 bit, y han sido tambièn desarrollados integradores con 64 bit.
Las memorias con alta densidad para las computadoras, aunque no sean microprocesadores, estan realizadas
con la misma tecnologia.
En la mitad de los años ochenta, la densidad de memoria normalmente alcanzada era de màs o menos 64.000
bit (64 K) para cada uno de los integradores, pero ya se habia logrado alcanzar memorias de 256 K y se
estudiaban unidad con un millòn de bit.
Otros progresos seran determinados por lo limites minimos, teoricos y pràcticos, de el tamaño de los
transistores.

Uno de los primeros microprocesadores disponibles para las computadoras fue el Intel 8080, que influencio
la arquitectura de el Z80, muy popular en su tiempo y, menos directamente, la siguiente linea de los
microprocesadores 80 x 86 (80286, 80386, 80486 y 80586 o Pentium) actualmente presente en muchas
computadoras).
La serie 68000, de la Motorola, encontro un grande uso en la gama de las computadoras Macintosh. En los
años noventa, han sido desarrollados nuevos microprocesadores para aprovechar el èxito de las arquiteturas
Reduced Instruction Set Computing (RISC), que han aumentado la velocidad de el procesador disminuyendo
la variedad y la complejidad de los comandos reconocidos.
La Advanced Risc Machine (ARM), desarrollada por la casa Ingles Acorn, fue el primer microprocesador
RISC utilizado en una computadora para uso personal o mejor dicho para uso domestico.

Los microcontroladores se parecen a los microsprocesadores, hasta el punto que algunos se ha originado
directamente de estos ultimos. La diferencia mayor es el hecho que los microcontroladores, ademàs de tener
un nucleo que opera para seguir las instrucciones de un cierto programa, integran en el mismo chip tambièn
una memoria EPROM o EEPROM, en la que el programa se pone en memoria, una memoria RAM para los
temporaneos, ademàs de todos los dispositivos en la cara interna necesarios para comunicar con el mundo
externo.

Ademàs de todo esto, la familia de los microcontroladores màs desarrollados, integran tambièn una serie de
funciones de accesorios, como el timer, los cambiadores analogicos/digitales, dispositivos para la
comunicaciòn serial etc. En otras palabras, mientras un microprocesador tiene siempre la necesidad de una
serie de circuitos integrados externos para poder funcionar y conectarse con otros dispositivos, los
microcontroladores son dispositivos que no necesitan nada. No hay entonces que sosprenderse si muchos
proyectos basados sobre los microcontroladores estàn constituidos o formados por el micro mismo.
1.2 Microcontroladores PIC

Los PiC son circuitos integrados producidos por la Microchip Technology Inc., que apartienen a la categoria
de los microcontroladores, es decir aquellos componentes que integran en un unico dispositivo todos los
circuitos necesarios para realizar un completo sistema digital programable.
Como se puede observar en la Figura 24.1.2:

Fig. 1.2

Los PIC (en este caso un PIC6F84) se presentan externamente como normales circuitos integrados TTL o
CMOS, pero en el interior disponen de todos los dispositivos tipicos de un sistema con microprocesador, es
decir:

Una CPU (Central Processor Unit es decir unidad central de elaboraciòn) cuyo objetivo o intenciòn es
aquella de interpretar la instrucciones de el programa.
Una memoria PROM (Programmable Read Only Memory o tambièn memoria programable con solo
lèctura) donde se encuentran en memoria de manera permanente las instrucciones de el programa que
hay que realizar.
Una memoria RAM (Random Access Memory es decir memoria para acceso casual) utilizada para
grabar las variables utilizadas por el programa.
Una serie de lineas de I/O para pilotar dispositivos externos o recibir impulsos desde sensores,
pulsadores, etc.
Una serie de dispositivos auxiliares a el funcionamiento cuales generador de clock, bus, contadores, etc.
Fig. 1.3

La presencia de todos estos dispositivos en un espacio muy pequeño, permite a quien proyecta de aprovechar
las ventajas dadas por utilizar un sistema con microprocesadores, tambièn en aquellos circuitos que hasta
hace poco tiempo estaban destinados a ser realizados con circuitos tradicionales.

Los PIC estan disponibles en una amplia gama o serie de modelos para adaptarse mejor a las exigencias de
los proyectos especificos, la diferencia està en los nùmeros de las lineas de I/O y en la dotaciòn de los
dispositivos. Se comienza con los modelos mas pequeños identificados con la sigla PIC12Cxx con solo 8
pin, hasta llegar a los modelos màs grandes con la sigla PIC17xx con 40 pin.

Para nuestro objetivo hemos elegido un modelo intermedio de PIC el PIC16F84.


El mismo contiene 18 Pin de los cuales 13 estàn disponibles para el I/O es decir para las conexiones con el
resto de nuestro circuito y de algunas caracteristicas que lo vuelven muy adapto para la exigencias de
nuestro curso.
En particular El PIC16F84 dispones de una memoria para contener el programa de el tipo EEPROM es decir
Electrical Erasable Programmable Read Only Memory, que se puede escribir todas las veces que se quiera y
por lo tanto es ideal para nuestras ejercitaciones y conexiones para la programaciòn on - board, es decir para
poner al dia el programa interno a el chip sin tener que quitar el chip mismo de el circuito de prueba. Esta
caràcteristica està aprovechada por el programador DL3155M24.

Veamos ahora la reproducciòn de el PIC16F84, representada en la siguiente figura:


Fig. 1.4

Como es posible observar el PIC16F84 contiene un total de 18 pin colocados en dos filas paralelas con 9 pin
cada una.
Los Pin 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 17 y 18 representan las lineas I/O disponibles para nuestras
aplicaciones, los pin 5 y 14 las alimentaciones y al final los pin 4, 15, 16 estan reservados para el
funcionamiento de el PIC (MCLR para el reset y OSC1, OSC2 para el clock).
En las pròximas clases se exàminaran màs detalladamente el funcionamiento de los mismos y los
utilizaremos de manera pràctica.
Página blanca
Lección N.2: Arquitectura hardware de el microcontrolador PIC
Objectivos: Saber:
Donde se memoriza el programa
Donde se memorizan los datos
Que cosa es:
Una ALU, un Acumulador, un Program Counter, un Stack, un Registre File.

Saber hacer:
Realizar un esquema en bloques de los dispositivos contenidos en el PIN y
describir como es la interacciòn entre ellos.

Requisitos : Nociones de electronica digital

Contenidos : Area de programa y el Register File


La ALU y el registro W
El Programa Counter y el Stack
Página blanca
2.1 Area de programa y register file

Comenzamos observando como està hecho un PIC, cuales dispositivos contiene y como es la interacciòn
entre ellos.
En la figura 24.2.1 està representado un esquema en bloques en forma simple de la arquitectura interna de el
PIC16F84.

Fig. 2.1

Comenzamos con la memoria EEPROM y con el REGISTER FILE.


La EEPROM es una memoria especial, que no se puede borrar electricamente, utilizada en el PIC para
grabar en la memoria el programa que hay que realizar.

Su capacidad de memoria es de 1024 arremdamientos cada una puede contener un opcode con 14 bit es decir
una instrucciòn base de el PIC. El programa màs complejo que se lograra realizar no podrà ser màs largo de
1024 instrucciones.
Las direcciones reservadas a la EEPROM van de 0000H a 03FFH. El PIC puede solamente seguir las
instrucciones en la memoria de estos arremdamientos. No puede de ninguna forma leer, escribir o borrar lo
que se encuentra contenido en los mismos.
Para escribir, leer y borrar estos arremdamientos es necesario un dispositivo externo llamado programador.
La primera zona de memoria, en la direcciòn 0000H, debe contener la primera instrucciòn que el PIC deberà
realizar en el reset y por lo tanto es llamada Reset Vector.

El REGISTER FILE es un conjunto de arremdamientos


o zonas de memoria RAM llamados REGISTROS
(Figura 2.2).

A diferencia de la memoria EEPROM destinada a


contener el programa, el area de memoria RAM es
directamente visible por el programa mismo.
Entonces se podra escribir, leer y cambiar
tranquilamente cada arremdamiento de el REGISTER
FILE en nuestro programa cada vèz que se presente la
necesidad de hacerlo.

La unica limitaciòn es el hecho que algunos de estos


registros cumplen una funciòn especial para el PIC y no
pueden ser utilizados para intenciones diferentes para las
cuales no han sido reservados. Estos registros especiales
se en cuentran en las zonas màs bajas de la area de
memoria RAM segùn como se explicara ahora.

Las zonas o los arremdamientos de memoria presente en


el REGISTER FILE se encuentran dirigidas
directamente en un espacio de memoria que va de 00H a
2FH para un total de 48 byte, llamado Bank 0 (Figura
2.2).
Un segundo espacio de direcciòn llamado BanK 1 va
desde 80 H a AFH. Para acceder a este segundo espacio
es necesario recurrir a los dos bit auxiliares RPO y RP1
que se examinaran màs adelante.
Los primeros 12 arrendamientos el banco 0 (de 00H a
0BH) y de el banco 1 (de 80 H a 8BH) son reservados a
las funciones especiales para el funcionamiento de el
PIC y, como ya se ha dicho, no pueden ser utilizados
para otros objetivos.
Los 36 arrendamientos en Bank 0 dirigidos de 0CH a
"FH pueden ser utilizados libremente por nuestros
programas para memorizar variables, contadores, etc.
Fig. 2.2
Los registros especializados, como por ejemplo TRISA y
TRISB, de el PIC se utilizan con mucha frecuencia en
los programas.

Por ejemplo, se utiliza la copia de estos registros, para definir cuales de estas lineas de I/O son entradas y
quales salidas.
El mismo estado logico de las lineas de I/O dipende de el valor de los dos registros PORTA y PORTB.
Algunos registros contienen el estado de funcionamiento de los dispositivos internos a el PIC o el resultado
de operaciones aritmèticas y lògicas.
Es necesario conocer entonces exactamente cuales funciones desarrollan cada uno de los registros epeciales
y cuales efectos se obtienen en la manipulaciòn de el contenido.
Para facilitar las operaciones sobre los registros especializados, en el fili PI16F84.INC la Microchips ha
incluido una lista de nombres que identifican cada uno de los registros especializados y a los cuales estan
asociados las direcciones correspondientes en la area de los REGISTER FILE.
Si, por ejemplo, quisieramos definir todas las lineas de la puerta B de el PIC como salidas actuando sobre el
registro TRISB, podemos elegir las referencias directa para cada registro es decir se podra elegir cada
registro con su respectiva direcciòn:

movlw B'00000000'
movwf 06H

o tambien, obtener el mismo registro con referencia su nombre simbolico:

movlw B'00000000'
movwf TRISB

Hay que pero tener cuidado de introducir el orden INCLUDE "P1684.INC" en el programa que surge.
2.2 La ALU y el registro W

Vamos ahora a ilustrar otras dos componentes fundamentales para la arquitectura de el PIC, la ALU y el
registro W o acumuladores.

La ALU (acronimo de Arithmetic and Logic Unit es decir unidad aritmètica y lògica) es la parte màs
complicada de el PIC ya que contiene todo el circuito que tiene la funciòn de calculo y manipulaciòn de los
datos mientras se realiza un programa.
La ALU es un componente que se encuentra presente en todos los microprocesadores y de ella depende
directamente la capacidad de calculo de el micro mismo.
La ALU de el PIC16F84 puede operar con valor de 8 bit, es decir valores nùmericos no mayores de 255.
Directamente conectado con la ALU se encuentra el registro W llamado tambièn acumulador.
Este registro està formado por una simple zona de memoria que logra contener un solo valor a 8 bit.
La diferencia màs importante entre el registro W y las demàs zonas de memoria es proprio el hecho que,
para dar una referencia a el registro W, la ALU no debe dar ninguna direcciòn de memoria , ma puede
acceder directamente.
El registro W se utiliza muchas veces durante la realizaciòn de el programa en el interior de el PIC.

Hagamos un ejemplo pràctico.


Supongamos de querer introducir en la zona de memoria 0CH de el REGISTER FILE el valor 01H.
Buscando entre las instrucciones de el PIC nos damos cuenta de una vèz que no existe una instrucciòn unica
que permita de efectuar esta operaciòn pero tenemos que necesariamente recurrir a el acumulador y utilizar
dos instrucciones en serie.
Veamos porque.
El opcode de una instrucciòn no puede ser màs grande de 14 bit mientras a nosotros nos sirven , 8 para
especificar el valor que queremos introducir en la zona de memoria, 7 para especificar en que zona de la
memoria queremos introducir nuestro valor y 6 para especificar cual de las instrucciones queremos utilizar.

En total: 8 + 7 + 6 = 21 bit.

Debemos entonces recurrir a dos instrucciones, es decir:

movlw 01H
movwf 0CH

che introducen en el registro W el valor 01H con la instrucciòn MOV y Literal to W y despues lo "mueven"
en la zona 0CH con la instrucciòn MOV y W to F.
2.3 El Program Counter y el Stack

En esta parte se analizara el funcionamiento de el Programa Counter y de el Stack que son dos partes
importantes para entender las instrucciones de salto y llamada a sobroutine.

El PIC16F84 comienza la realizaciòn de el programa empezando por el Reset Vector es decir por la zona de
memoria 0000H.
Despues de aver seguido esta instrucciòn se pasa a la instrucciòn siguiente grabada en la zona 0001H y asi
en adelante.
Si no existieran las instrucciones capazes de influenciar la realizaciòn progresiva de el programa, el PIC
llegariaen poco tiempo a realizar la instrucciòn grabada en la ùltima locazione y no sabria màs como ir
adelante.
Cualquier sistema con microprocesador o lenguaje de programaciòn contiene instrucciones de salto, es decir
instrucciones que puedan modificar el flujo para realizar los programas. Una de estas instrucciones es el
goto (de el ingles go to, ve para).
Cuando el PIC encuentra un goto no sigue la instruccione inmediatamente siguiente si no salta directamente
a la zona de memoria especificada en la instrucciòn.

Un ejemplo:
ORG 00H
Salto1
movlw 10
goto Salto1
En el reset el PIC seguira la instrucciòn movlw 10 em memoria en la zona 0000H que metera en el
acumulador el valor decimal 10.
Entonces pasara a la instrucciòn siguiente goto Salto 1.
Esta instrucciòn determinara un salto a la zona de memoria señalada por la label Salto 1 es decir de nuevo a
la zona 0000H.
El programa no harà otra cosa que un ciclo infinito realizando continuamente las dos instrucciones de la
lista.
Durante este ciclo, para determinar cual es la siguiente instrucciòn que hay que llevar a cabo, el PIC utiliza
un especial registro llamado Program Counter es decir contador de programa.
El mismo se attualiza siempre es decir se mantiene al dia a travèz de una direcciòn con la proxima
instrucciòn que se tendra que realizar. En el reset el mismo se pone en cero, provocando el comienzo de la
ejecuciòn desde la direcciòn 0000H, a cada instrucciòn se aumenta, en vèz, de uno para permitir el pasaje a
la instrucciòn siguiente.

La instrucciòn goto permite de introducir un nuevo valor en el Program Counter y el siguiente salto a una
zona cualqiera de la area programa de el PIC.

Otra instrucciòn muy interesante es la call es decir la llamada a subroutine.


Esta instrucciòn funciona de manera muy parecida a la goto con la unica diferencia que antes de realizar el
salto pone en memoria, en una zona de memoria particular llamada Stack, la direcciòn de la que deberia ser
la proxima instrucciòn que se tendra que realizar si no se hubiera aparecido la call.
Veamos mejor con un ejemplo:
ORG 00H
Salto1
movlw 10
call Llamada1
goto Salto1
Llamada1
movlw 11
return
En este caso el PIC, despues de realizar la movlw 10 pasa a realizar la call Llamada 1.
Antes de saltar pone en memoria en el Stack la direcciòn 0002H, es decir la direcciòn de la zona siguiente a
la call.
Pasa entoces a realizar la instrucciòn movlw 11, pone en memoria en relaciòn a la label Chiamata 1.
En este momento encuentra una nueva instrucciòn la return que, como se puede pensar observando el
nombre, permite "regresar", es decir regresar a realizar la instrucciòn siguiente a la call. La operaciòn apenas
efectuada se llama: "Llamada a subroutine".
Para poder comenzar de donde se habia interrumpido el programa, el PIC utiliza el ultimo valor introducido
en el Stack y lo introduce de nuevo en el Program Counter.
La palabra stack " pila o monton" sirve pa "amontonar" uno sobre la otra todas las direcciones para despues
recuperar las mismas cuando sea necesario.
Este tipo de grabaciòn o de poner en memoria se llama tambièn LIFO que proviene de el ingles Last In First
Put, donde el ultimo elemento introducido (last in) debe necesariamente salir de primero (last out). Gracias a
el stack es posible efectuar màs call, una adentro de la otra y mantener siempre la huella de el punto donde
se retoma el programa en el momento que se encuentra una instrucciòn return.
Veamos otro ejemplo:
ORG 00H
Salto1
Movlw 10
Call Llamada1
Goto Salto1
Llamada1
movlw 11
call Llamada2
return
Llamada2
movlw 12
return
En este caso en la subroutine Llamada 1 se efectua otra call màs a la subroutine Llamada 2.
En el regreso de esta ultima el programa tendra que regresar en la subroutine Llamada 1 realizar el return y
entonces regresar atras.
Las direcciones que hay que grabar en el stack son dos ya que se encuentra una segunda call antes de
encontrar el return correspondiente de la primera.
Se dice entonces que las call son "en nido" es decir una dentro de la otra. El PIC16F84 contiene un stack con
8 niveles, es decir un stack que permite hasta 8 llamadas en nido.
Es importante estar seguro, que durante la realizaciòn de un programa, exista siempre una instrucciòn return
para cada llamada o call para evitar errores en el stack que durante la ejecuciòn puedan dar problemas que
son dificiles de observar.
Lección N.3: Programación
Objectivos: Saber:
Las instrucciones de el PIC

Saber hacer:
Escribir y llenar un programa en assembler
Analizar un source assembler

Requisitos : Lecciòn 1 y lecciòn 2

Contenidos: Set de instrucciones de el PIC16F84


Escritura y llenado de un programa en assembler
Página blanca
3.1 Set de instrucciones de el PIC 16F84
Sintassi Descripciòn Microchip Operaciòn equivalente
ADDLW k Add Literal and W W=W+k
ADDWF f,d Add W and f d = W + f (donde d puede ser w o f)
ANDLW k AND Literal with W W = W AND k
ANDWF f,d AND W with f d = W AND f (donde d puede ser w o f)
BCF f,b Bit Clear f f(b) = 0
BSF f,b Bit Set f f(b) = 1
BTFSC f,b Bit Test f, Skip if Clear f(b) = 0 ? Si, salta una instrucciòn
BTFSS f,b Bit Test f, skip if Set f(b) = 1 ? Si, salta una instrucciòn
CALL k Subroutine Call llama la subroutine en la direcciòn k
CLRF f Clear f f=0
CLRW Clear W Register W = 0
CLRWDT Clear Watchdog Timer Watchdog timer = 0
COMF f,d Complement f d = not f (donde d puede ser W o f)
DECF f,d Decrement f d = f -1 (donde d puede ser W o f)
DECFSZ f,d Decrement f, Skip if 0 d = f -1 (donde d puede ser W o f) si d=0 salta
GOTO k Go to address Salta en la direcciòn k
INCF f,d Increment f d = f +1 (donde d puede ser W o f)
INCFSZ f,d Increment f, Skp if 0 d = f +1 (donde d puede ser W o f) se d = 0 salta
IORLW k Inclusive OR Literal with W W = W OR k
IORWF f,d Inclusive OR W with f d = f OR W (donde d puede ser W o f)
MOVLW k Move literal to W W=k
MOVF f,d Move f d = f (donde d puede ser W o f)
MOVWF f Move W to f f=W
NOP No Operation Ninguna operaciòn
OPTION Load Option Register OPTION = W
RETFIE Return from Interrupt Regresa de un interrupt handler
RETLW k Return Literal to W Regresa de una subroutine con W = k
RETURN Return from Subroutine Regresa de una subroutine
RLF f,d Rotate Left f through Carry d = f << 1 (donde d puede ser W o f)
RRF f,d Rotate Right f through Carry d = f >> 1 (donde d puede ser W o f)
SLEEP Go into Standby Mode Pone en standby el PIC
SUBLW k Subtract W from Literal W=k-W
SUBWF f,d Subtract W from f d = f - W (donde d puede ser W o f)
SWAPF fSwap f f = Swap dei bit 0123 con 4567 di
TRIS f Load TRIS Register TRIS di f = W
XORLW k Exclusive OR Literal with W W = W XOR k
XORWF f,d Exclusive OR W with f d = f XOR W (donde d puede ser W o f)
ADDLW ADD Literal and W Status Register

Suma la constante K a W
Sintassi: addlw k
Operaciones equivalentes: W = W + k
Descripciòn: Suma la constante K al valor grabado en el acumulador W y pone el resultado
en el acumulador.
Ejemplo: org 00H
start
movlw 10
addlw 12
Despues de haber realizado este programa el acumulador W valdra 22.
Nota esta instrucciòn influencia i bit Z, DC y C de el registro STATUS.
Z vale 1 si el resultado de la operaciòn vale o.
DC vale 1 si el resultado de la operaciòn es un nùmero superior de 15.
C vale 1 si el resultado es positivo es decir si el bit 7 de el registro que
contiene el resultado vale 0 y 1 si el resultado es negativo es decir si el bit de
el registro que contiene el resultado vale 1.
ADDWF ADD W and F Status Register

Suma el valor contenido en W con el valor contenido en el registro F


Sintassi: addwf f,d
Operaciones equivalentes: d = W + f (donde d puede ser W o f)
Descripciòn: Esta instrucciòn suma el valor contenido en el acumulador W con el valor
contenido en el registro dirigido por el parametro f. El parametro d es un flag
que indica en cual registro debe ser puesto en memoria el resultado.
Para d = W el resultado se graba en el registro W
Para d = F el resultado se graba en el registro f
Ejemplo: Veamos un ejemplo de suma entre dos registros:

add1 equ 0CH


add2 equ 0DH
org 00H
movlw 10 ;Primer addendo = 10
movwf add1
movlw 15 ;Segundo addendo = 15
movwf add2
movf add1,W ;W = add1
addwf add2,W ;W = W + add2

Nota Esta instrucciòn influencia i bit Z, DC y C de el registro STATUS.


Z vale 1 si el resultado de la operaciòn vale 0.
DC vale 1 si el resultado de la operaciòn es un nùmero superior a 15.
C vale 1 si el resultado es positivo es decir si el bit 7 de el registro que
contiene el resultado vale 0 y 1 si el resultado es negativo es decir si el bit 7
de el registro que contiene el resultado vale 0.
ANDLW AND Literal with W Status Register

Efectua el AND entre W y una constante K


Sintassi: andlw k
Operaciones equivalentes: W = W AND k
Descripciòn: Efectua el AND entre el valor contenido en el acumulador W y el valor
constante K. El resultado es memorizado en el acumulador.
Ejemplo: org 00H
start
movlw 10101010B
andlw 11110000B
...
Despues de haber realizador este programa el acumulador W valdra 10100000B.
Nota Esta instrucciòn influencia el bit Z de el registro STATUS.
Z vale 1 si el resultado de la operaciòn vale 0.
ANDWF AND W with F Status Register

Efectua el AND logico entre el valor contenido en W y el valor contenido en el registro F


Sintassi: andwf f,d
Operaciones equivalentes: d = W AND f (donde d puede ser W o f)
Descripciòn: Esta instrucciòn efectua el AND lògico entre el valor contenido en el
acumulador W y el valor contenido en el registro dirigido por el parametro f. El
parametro d es un flag que indica en cual registro se debe grabar el resultado.
Para d = W el resultado està grabado en el registro W
Para d = F el resultado està grabado en el registro f
Ejemplo: Muchas veces el AND logico se utiliza para cubrir el valor de algunos bit en el
interior de un registro. Si por ejemplo quisieramos extraer de el nùmero binario
01010101B los cuatros bit menos importantes para poder de esta manera
obtener el siguiente valor 00000101B, serà necesario solo preparar una mascara
de el tipo 00001111B y realizar el AND con nuestro valor inicial, veamos
como:.

movlw 01010101B ;Graba en el registro


movwf 0CH ;0CH el valor inicial que hay
que ocultar
movlw 00001111B ;Prepara la mascara de el bit
andwf 0CH,W ;Efectua el AND y graba el
;resultado en el acumulador W

El resultado en W sera 00000101B como solicitado.

W = 00001111 AND
f = 01010101 =
W = 0000010101

Nota La ANDWF influencia el bit Z de el registro STATUS que valdra 1 si el


resultado de la operaciòn es cero.
BCF Bit Clear F Status Register

Pone en cero un bit que se encuentra en el registro F


Sintassi: bcf f,b
Operaciones equivalentes: f(b) = 0
Descripciòn: Esta instrucciòn pone en cero el bit b de el registro en la direcciòn f.
Ejemplo: parm1 equ 0CH
org 00H
movlw 11111111B ;Valor inicial
movwf parm1
bcf parm1,0 ;D0=0
Al final de el programa el registro parm 1 vale 11111110B
Nota Esta instrucciòn no influencia ningun bit de estado.
BSF Bit Set F Status Register

Mette en uno un bit en el registro F


Sintassi: bsf f,b
Operaciones equivalentes: f(b) = 1
Descripciòn: Esta instrucciòn mete en uno el bit b de el registro en la direcciòn f.
Ejemplo: parm1 equ 0CH
org 00H
movlw 00000000B ;Valore inicial
movwf parm1
bsf parm1,0 ;D0=1
Al final de el programa el registro vale 00000001B.
Nota Esta instrucciòn no influencia ningun bit de estado
BTFSC Bit Test F, Skip if Clear Status Register

Salta la instrucciòn siguiente si un bit en el registro vale 0


Sintassi: Btfsc f,b
Operaciones equivalentes: f(b) = 0 ? Si, salta una instrucciòn
Descripciòn: Prueba el bit b que se encuentra en el registro en la direcciòn f y salta la
instrucciòn siguiente si el mismo vale cero.
Ejemplo: parm1 equ 0CH
org 00H
movlw 11111110B ;Valore inicial
movwf parm1
loop
btfsc parm1,0 ;D0 = 0 ? Si, sale
goto loop ;No, efectua el loop
Esta programa efectua un loop infinito el mismo programa no efectua el loop si
reemplazamos la instrucciòn :
movlw 11111110B ;Valor inicial
con la instrucciòn:
movlw 11111111B ;Valor inicial
Nota Esta instrucciòn no influencia ningun bit de estado
BTFSS Bit Test F, Skip if Set Status Register

Salta la instrucciòn siguiente si un bit en el registro F vale 1


Sintassi: btfss f,b
Operaciones equivalentes: f(b) = 1 ? Si, salta una instrucciòn
Descripciòn: prueba el bit b que se encuentra en el registro en la direcciòn f y salta la
instrucciòn siguiente si el mismo vale 1.
Ejemplo: parm1 equ 0CH
org 00H

movlw 11111111B ;Valor inicial


movwf parm1
loop
btfss parm1,0 ;D0 = 1 ? Si, sale
goto loop ;No, efectua el loop
Este programa efectua un loop infinito el mismo programa no efectua el loop si
reemplazamos la instrucciòn:

movlw 11111111B ;Valor inicial

con la instrucciòn:

movlw 11111110B ;Valor inicial


Nota Esta instrucciòn no influencia ningun bit de estado.
CALL Subroutine CALL Status Register

Llamada a subroutine
Sintassi: call k
Operaciones equivalentes:
Descripciòn: Llama durante la ejecuciòn una subroutine grabada en la direcciòn K.
El parametro K puede ser especificado utilizando directamente el valor
nùmerico de la direcciòn o tambièn la correspondiente label.
Ejemplo: org 00H

call ledOn
...

;Subroutine cuando un led se prende


ledOn
bsf PORTB,LED1
return
Cuando la CPU de el PIC encuentra una instrucciòn CALL, graba en el STACK
el valor de el registro PC + 1 de esta manera se logra volver a comenzar la
ejecuciòn de la instrucciòn siguiente a la CALL, entonces escribe en el PC la
direcciòn de la subroutine saltando a la ejecuciòn de esta ultima.
El valor original de el PC se restablece en la salida de la subroutine con la
ejecuciòn de la instrucciòn de regreso RETURN o RETLW.
En el PIC16F84 estan disponibles 8 niveles de stack, por lo tanto el nùmero
màximo de CALL que regresan, es decir de instrucciones CALL en el interior
de la subroutine que a su vèz contienen otras CALL, se limita a 8 niveles.
Nota Esta instrucciòn no influencia ningun bit de estado.
CLRF CLeaR F register Status Register

Pon en cero el registro F


Sintassi: clrf f
Operaciones equivalentes: f = 0
Descripciòn: Esta instrucciòn pone en cero el valor contenido en el registro dirigido por el
parametro f.
Ejemplo: Hagamos la hipòtesis de poner de nuevo en cero el registro TMRO cuya
direcciòn es 01H esadecimal, la instrucciòn que hay que realizar serà:

clrf 01H

O tambièn, se puede incluir al principio de nuestro source el file P16F84. INC,


se puede utilizar el nombre simbolico de el registro TMR0.

clrf TMR0

Despues de la ejecuciòn de esta instrucciòn el bit Z de el registro STATUS se


lleva a 1.

Nota
CLRW CLeaR W register Status Register

Pone en cero el registro W


Sintassi: clrw
Operaciones equivalentes: W = 0
Descripciòn: Pone en cero el valor contenido en el registro W.
Ejemplo:

Nota Despues de la ejecucuòn de esta instrucciòn el bit Z de el registro STATUS se


lleva a 1.
CLRWDT CLeaR WatchDog Timer Status Register

Reset de el timer de el watchdog


Sintassi: clrwdt
Operaciones equivalentes:
Descripciòn: Esta instrucciòn debe ser utilizada cuando se programa el PIC con la opciòn
Watchdog habilitada (fusible WDTE).
En esta modalidad el PIC habilita un timer que, una vez que pasa el tiempo
determinado, efectua el reset de el PIC.
Para evitar el reset el programa nuestro tendra que efectuar la instrucciòn
CLRWDT en forma ciclica para poder poner en cero el timer antes de el tiempo
mismo.
Si no ponemos en cero el timer en tiempo, el circuito de el watchdog (de el
ingles perro guardian) entendera esta situaciòn como un bloqueo de el programa
que se esta realizando o ejecutando y efectuara el reset para desbloquear.
Ejemplo: org 00H

loop
clrwdt
goto loop

Nota Esta instrucciòn no influencia ningun bit de estado.


COMF COMplement F Status Register

Efectua el complemento de el registro F el registro F


Sintassi: comf f,d
Operaciones equivalentes: d = NOT f (donde d puede ser W o f)
Descripciòn: Esta instrucciòn efectua el complemento de el valor que se encuentra en el
registro dirigido por el parametro f.
El parametro d determina la destinaciòn de el valor obtenido.
Ejemplo: parm1 equ 0CH

org 00H

movlw 01010101B
movwf parm1

comf parm1,F
...
Al final de la ejecuciòn de el programa el valor de el registro parm1 serà
10101010B.
Nota Esta instrucciòn influencia el bit Z de el registro STATUS.
Z vale 1 si el resultado de la operaciòn vale 0.
DECF DECrement F register Status Register

Disminuye el contenido de el registro F


Sintassi: decf f,d
Operaciones equivalentes: d = f - 1 (donde d puede ser W o f)
Descripciòn: Esta instrucciòn disminuye el contenido de el registro dirigido por el parametro
f.
El parametro d es un flag que indica en cual registro se debe grabar el resultado.

Para d = W el resultado se graba en el registro W


Para d = F el resultado se graba en el registro f
Ejemplo: Con el siguiente programa se escribe el valor 23 H en el registro a la direcciòn
OCH disminuyendo por lo tanto de 1.
Cuando termina la ejecuciòn el registro en la zona 0CH habra el valor 22H.

movlw 23H ;Escribe en W el valor 23 H


movwf 0CH ;Copia en el registro 0CH el valor
de W
decf OCH,F ;Reduce el valor contenido en el
registro 0CH

Nota Esta instrucciòn influencia el bit Z de el registro STATUS.


Z vale 1 si el resultado de la operaciòn vale 0.
DECFSZ DECrement F, Skip if Zero Status Register

Reduce el valor de el registro f y salta la instrucciòn siguiente si el resultado vale cero.


Sintassi: decfsz f,d
Operaciones equivalentes: d= f - 1 (donde d puede ser W o f) si d = 0 salta
Descripciòn: Reduce el valor de el registro en la direcciòn f y si el resultado vale cero salta la
instrucciòn siguiente.
El resultado de la reducciòn puede ser grabado en el mismo registro f o tambièn
en el acumulador W en base a el valor de el flag d.

Para d = W el resultado se graba en el registro W


Para d = F el resultado se graba en el registro f
Ejemplo: counter equ 0CH

org 00H

movlw 10 ;counter = 10
movwf counter
loop
decfsz counter,F ;counter = counter –1
;counter = 0 ? Si sale
goto loop ;No, continua
Este programa efectua por 10 veces las instrucciones decfsz hasta que sale para
counter = 0.
Nota Esta instrucciòn no influencia ningun bit de estado.
GOTO GO TO address Status Register

Ve en ejecuciòn a la direcciòn K
Sintassi: goto k
Operaciones equivalentes:
Descripciòn: Determina un salto de el programa en ejecuciòn en la direcciòn K.
El parametro K puede ser especificado utilizando directamente el valor
nùmerico de la direcciòn o tambièn la correspondiente label.
Ejemplo: org 00H

loop
goto loop
Este programa efectua un ciclo (loop) infinito.
Nota Esta instrucciòn no influye ningun bit de estado.
INCF INCrement F Status Register

Aumenta el valor de el registro en la direcciòn F


Sintassi: incf f,d
Operaciones equivalentes: d = f + 1 (donde d puede ser W o f)
Descripciòn: Aumenta el contenido de el registro en la direcciòn f y graba el resultado en el
mismo registro o en el acumulador W en base a el valor de el flag d:

Para d= W el resultado se graba en el registro W


Para d = F el resultado se graba en el mismo registro F
Ejemplo:

Nota Esta instrucciòn influencia el bit Z de el registro STATUS.


Z vale 1 si el resultado de la operaciòn vale 0.
INCFSZ INCrement F, Skip if Zero Status Register

Aumenta el valor de el registro f y salta la instrucciòn siguiente si el resultado vale cero.


Sintassi: incfsz f,d
Operaciones equivalentes: d= f + 1 (donde d puede ser W o f) si d = 0 salta
Descripciòn: Aumenta el valor de el registro en la direcciòn f y si el resultado vale cero salta
la instrucciòn siguiente.
El resultado de la reducciòn puede ser grabado en el mismo registro f o tambièn
en el acumulador W en base a el valor de el flag d.

Para d = W el resultado se graba en el registro W


Para d = F el resultado se graba en el registro f
Ejemplo:

Nota Esta instrucciòn influencia el bit Z de el registro STATUS.


Z vale 1 si el resultado de la operaciòn vale 0.
IORLW Inclusive OR Literal with W Status Register

Efectua el OR entre W y una constante K


Sintassi: iorlw k
Operaciones equivalentes: W = W OR k
Descripciòn: Efectua el OR incluido entre el valor contenido en el acumulador W y el valor
costante K.
Ejemplo: org 00H
start
movlw 00001111B
iorlw 11110000B
...
Despues de haber realizado este programa el acumulador W vale 11111111B .
Nota Esta instrucciòn influencia el bit Z de el registro STATUS.
Z vale 1 si el resultado de la operaciòn vale 0.
IORWF Inclusive OR W with F Status Register

Efectua el OR incluido entre el valor contenido en W y el valor contenido en el registro F


Sintassi: iorwf f,d
Operaciones equivalentes: d = f OR W (donde d puede ser W o f)
Descripciòn: Esta istrucciòn efectua el OR inclusivo entre el valor contenido en el
acumulador W y el valor contenido en el registro dirigido por el parametro f.
El parametro d determina donde se graba el resultado de la operaciòn:

Para d = W el resultado se graba en el acumulador W.


Para d = F el resultado se graba en el registro f.
Ejemplo: parm1 equ 0CH

org 00H

movlw 00001111B
movwf parm1

movlw 11111111B
iorwf parm1,F
Al final de la ejecuciòn el valor de el registro parm 1 serà: 11111111B.
Nota Esta instrucciòn influencia el bit Z de el registro STATUS.
Z vale 1 si el resultado de la operaciòn vale 0.
MOVLW MOVe Literal to W Status Register

Da a W un valor constante
Sintassi: movlw k
Operaciones equivalentes: W=k
Descripciòn: Da al acumulador W el valor constante K.
Ejemplo: org 00H
start
movlw 20
...
Despues de haber realizado este programa el acumulador W vale 20.
Nota Esta instrucciòn no influye ningun bit de estado.
MOVF MOVe F Status Register

Mueve el contenido de el registro F


Sintassi: movf f,d
Operaciones equivalentes: d = f (donde d puede ser W o f)
Descripciòn: Esta instrucciòn copia el contenido de el registro dirigido por el parametro f o en
el acumulador W o en el mismo registro F.
El parametro d determina la destinaciòn.

Per d = W el valor se graba en el registro W


Per d = F el valor se deja en el registro f. En este caso la utilidad de la
instrucciòn es que se altera el bit Z de el flag STATUS enbase a el valor
contenido en el registro f.
Ejemplo: El ejemplo siguiente copia el valor contenido en el registro en la direcciòn 0CH
en el accumulatore W:

movf 0CH,W

Nota La ejecuciòn de la MOVF no influencia ningun bit de estado.


MOVWF MOVe W to F Status Register

Mueve el contenido de el registro W en el registro F


Sintassi: movwf f
Operaciones equivalentes: f = W
Descripciòn: Esta instrucciòn copia el contenido de el registro W en el registro dirigido por el
parametro f.
Ejemplo: Hagamos la ipotesi de quere escribir el valor 10H (esadecimal) en el registro
TMRO.
Las instrucciones que habrà que realizar o seguir seran las siguientes.

movlw 10H ;Escribe en el registro W el valor


10H
movwf 01H ;Y lo graba en el registro TMR0

Para los registros utilizados por el PIC para funciones especificas, normalmente
no se introduce directamente la direcciòn ma el correspondiente nombre
simbolico definido en el file P16F84.INC.
El codigo serà, entonces el siguiente:

movlw 10H ;Escribe en el registro W el valor


10H
movwf TMR0 ;y lo graba en el registro TMR0

Nota La ejecuciòn de la MOVWF no influencia ningun bit de estado.


NOP No OPeration Status Register

Ninguna operaciòn
Sintassi: nop
Operaciones equivalentes:
Descripciòn: Esta instrucciòn no sigue ninguna operaciòn pero es util para introducir un
retraso de un ciclo de màquina.
Ejemplo: Utilizando un quarzo de 4 MHz se podra obtener un retraso de 1 ?s para cada
instrucciòn NOP introducida en nuestro source..

nop ;Sigue un retraso de 1µs

Nota La NOP no influencia ningun bit de estado.


OPTION load OPTION register Status Register

Asigna el valor en W a el registro OPTION


Sintassi: option
Operaciones equivalentes: OPTION = W
Descripciòn: Esta instrucciòn graba en el registro especial OPTION el valor contenido en el
acumulador W.
Ejemplo: org 00H
start
movlw 01000100B
option
...
Esta instrucciòn existe para mantener la compatibilidad con los PIC producidos
hasta ahora, la Microchip da el consejo de no utilizarla.
Es en vèz bueno utilizar las siguientes instrucciones.

org 00H

start
bsf STATUS,RP0 ;Activa el banco de
registros 1

movlw 01000100B
movwf OPTION_REG
...

En otras palabras se aconseja escribir directamente en el registro OPTION


presente en el banco 1 de los registros de el PIC utilizando la MOVWF en vèz
de la instrucciòn OPTION que en un futuro podra no ser màs utilizada.
Nota Esta instrucciòn no influencia ningun bit de estado.
RETFIE RET From Interrupt Status Register

Regresa a una subroutine


Sintassi: retfie
Operaciones equivalentes:
Descripciòn: Esta instrucciòn debe ser introducida al final de cada subroutine de gestion de
los interrupt para dar de nuevo el control a el programa principal.
Ejemplo: org 00H
loop
goto loop ;Loop infinito

org 04H ;Interrupt vector

intHandler

retfi ;Regresa de el interrupt


En esta source el programa principal realiza un loop infinito.
Si se habilita uno de los interrup de el 16F84 apenas el mismo se realizara el
control serà dado automaticamente a el programa que se encuentra en la
direcciòn 04H (en el ejemplo intHandler), la instrucciòn RETFI determinara
entonces el regreso a el lopp principal.
Nota Esta instrucciòn no influencia ningun bit de estado.
RETLW RETurn Literal to W Status Register

Regresa de una subroutine con una constante en W


Sintassi: retlw k
Operaciones equivalentes:
Descripciòn: Esta instrucciòn regresa el control de una subroutine a el programa principal.
Diferentemente de la instrucciòn RETURN la misma permite de pasar, a travèz
de el acumulador W, el valor constante K a el programa principal.
Ejemplo: rtc equ 0CH
org 00H

call mySub1
movwf rtc

...

mySub1
nop
retlw 10
Una vèz que se realiza este programa graba en el registro rtc el valor 10 pasando
por la subroutine mysub 1.
Nota Esta instrucciòn no influencia ningun bit de estado
Observar tambièn la instrucciòn RETURN.
RETURN RETURN from subroutine Status Register

Regresa de una subroutine


Sintassi: return
Operaciones equivalentes:
Descripciòn: Esta instrucciòn debe ser introducida al final de cada subroutine para comenzar
de nuevo la ejecuciòn de el programa principal.
Ejemplo: org 00H

call mySub1
....

mySub1
nop
return

Nota: En el PIC16F84 pueden ser colocadas en forma de nido hasta 8 llamadas


a subroutine de el tipo:

org 00H

call mySub1
....

mySub1
call mySub2
return

mySub2
call mySub3
return

mySub3
return

Nota Esta instrucciòn no influencia ningun bit de estado.


Observar tambien la instrucciòn RETLW.
RLF Rotate Left F through carry Status Register

Gira a la izquierda el contenido de el registro f pasando por el Carry


Sintassi: rlf f,b
Operaciones equivalentes: d = f << 1 (donde d puede ser W o f)
Descripciòn: Gira el bit contenido en el registro en la direcciòn f hacia la izquierda (es decir
de los bit meno significativos hacia aquellos màs significativos) pasando por el
bit CARRY de el registro STATUS.
El contenido de el bit CARRY de el registro status es llevado o cambiado en el
bit DO mientras el valor en la salida de el bit D7 es cambiado hacia el CARRY.
El valor de el parametro d determina la destinaciòn de el resultado obtenido al
final de la rotaciòn:

Para d = W el resultado se graba en el registro W dejando el registro f


invariable.
Para d = F el resultado se graba en el mismo registro f
Ejemplo: parm1 equ 0CH

org 00H

clrf C,STATUS ;Pone en cero el CARRY

movlw 01010101B ;Valore inicial


movwf parm1

rlf parm1,F
Al final de el programa el registro parm 1 valdra 10101010B mientras el
CARRY tendra un valor cero.
Nota Esta instrucciòn no influencia ningun otro bit de estado ademàs de el CARRY.
RRF Rotate Right F through carry Status Register

Gira a la derecha el contenido de el registro f pasando por el Carry


Sintassi: rrf f,b
Operaciones equivalentes: d = f >> 1 (dove d può essere W o f)
Descripciòn: Gira el bit contenido en el registro en la direcciòn f hacia la derecha ( es decir
desde los bit màs significativos hacia los bit menos significativos) pasando por
el bit CARRY de el registro STATUS como està representado en la Figura 3.2:

Fig. 3.2

El contenido de el bit CARRY de el registro status se pone en el bit D7 mientras


el valor en la salida de el bit D0 se introduce en el CARRY.
El valor de el parametro d determina la destinaciòn de el resultado obtenido al
final de la rotaciòn:

Per d = W El resultado se graba en el registro W dejando el registro f sin


cambiar.
Per d = F el resultado se graba en el mismo registro f
Ejemplo: parm1 equ 0CH
org 00H

clrf C,STATUS ;Pone en cero el CARRY


movlw 01010101B ;Valor inicial

movwf parm1
rrf parm1,F
Al final de el programa el registro parm 1 vale 00101010B mientras el CARRY
vale 1.
Nota Esta instrucciòn no influencia ningun otro bit de estado ademàs de el CARRY.
SLEEP go into standby mode Status Register

Mete il PIC en standby


Sintassi: sleep
Operaciones equivalentes:
Descripciòn: Esta instrucciòn bloquea la ejecuciòn de el programa que se està realizando y
pone el PIC en un estado de stanby (sleep de el Ingles to sleep, dormir).
Ejemplo: org 00H
start
sleep

Nota Esta instrucciòn no influencia ningun bit de estado.


SUBLW SUBtract W from Literal Status Register

Sustrae a K el valor en W
Sintassi: sublw k
Operaciones equivalentes: W = k - W
Descripciòn: Sustrae a la constante K el valor grabado en el acumulador W.
Ejemplo: org 00H
start
movlw 10
sublw 12
...
despues de haber realizado este programa el valor de el acumulador W vale 2.
Nota esta instrucciòn influencia i bit Z, DC y C de el registro STATUS.
Z vale 1 si el resultado de la operaciòn vale 0.
DC vale 1 si el resultado de la operaciòn es un nùmero superior a 15.
C vale 1 si el resultado es positivo es decir si el bit 7 de el registro que
contiene el resultado vale 0 y 1 si el resultado es negativo es decir si el bit 7
de el registro que contiene el resultado vale 1.
SUBWF SUBstract W from F Status Register

Sustrae el valor contenido en W con el valor contenido en el registro F


Sintassi: subwf f,d
Operaciones equivalentes: d = f - W (donde d puede ser W o f)
Descripciòn: Esta instrucciòn sustrae el valor contenido en el registro W con el valor
contenido en el registro dirigido por el parametro f.
El parametro d es un flag que indica en cual registro debe ser grabado el
resultado.
Para d = W el resultado es grabado en el registro W
Para d= F el resultado se encuentra grabado en el registro f
Ejemplo: Hagamos el analisis con un ejemplo tomado de la data sheet de la Microchip:
Si intruducimos la instrucciòn:

subwf REG1,F

Donde reg 1 es la direcciòn de un cualquier registro especificado a travèz de el


comando:

REG1 RES 1

Para los valores iniciales de REG1=3 y W=2, despues de la ejecuciòn tendremos


REG1=1 y C=1 visto que el resultado es positivo.
Para los valores iniciales de REG1=2 y W=2 despues de la ejecuciòn tendremos
REG1=0 y C=1 porque el resultado es siempre positivo.
Para los valores iniciales de REG1=1 y W=2, tendremos REG1=FFH es decir -1
entonces C=0 porque el resultado es negativo.

Nota Esta instrucciòn influencia i bit Z, DC y C de el registro STATUS.


Z vale 1 si el resultado de la operaciòn vale 0.
DC vale 1 si el resultado de la operaciòn es un nùmero superior a 15.
C vale 1 si el resultado es positivo es decir si el bit 7 de el registro que
contiene el resultado vale 0 y 1 si el resultado es negativo es decir si el bit 7
de el registro que contiene el resultado vale 1.
SWAPF SWAP F Status Register

Cambia el valor de los cuatros bit màs significativos de el registro en la direcciòn F con los quatros bit
menos significativos.
Sintassi: swap f,d
Operaciones equivalentes: f = Swap de los bit 0123 con 4567 de f
Descripciòn: Cambia el valor de los cuatros bit màs significativos (D7 - D4) contenidos en el
registro en la direcciòn f con los cuatros bit menos significativos (D3 - D0) de el
mismo.
El resultado se graba en el acumulador W o en el mismo registro f en base a el
valor de d:

Para d = W el resultado se graba en el registro W


Para d = F il risultato se graba en el registro F
Ejemplo:

Nota Esta instrucciòn no influencia ningun bit de estado


TRIS load TRIS register Status Register

Asigna el valor a el registro TRIS


Sintassi: tris f
Operaciones equivalentes: TRIS di f = W
Descripciòn: Esta instrucciòn graba en uno de los registros especiales TRIS el valor
contenido en el acumulador W.
Los registros TRIS determinan el funzionamiento en entrada y en salida de la
linea de I/O de el PIC.
Exiate un registro TRIS para cada puerta de I/O llamado TRISA, TRISB etc.
Ejemplo: org 00H

start

movlw 11111111B
tris PORTA
...

Nota: Esta instrucciòn existe para matener la compatibilidad con los PIC hasta
ahora producidos, la Microchip no aconseja su uso. Es en vès aconsejado
utilizar las siguientes instrucciones.

org 00H

start
bsf STATUS,RP0 ;Activa banco de registros 1

movlw 11111111B
movwf TRISA
...
En otras palabras se aconseja de escribir directamente en los registros TRIS
presentes en el banco 1 de losregistros de el PIC utilizando la MOVWF en vèz
de la instrucciòn TRIS que en un futuro podria no ser màs utilizada.
Nota Esta instrucciòn no influencia ningun bit de estado.
XORLW Exclusive OR Literal with W Status Register

Efectua el OR exclusivo entre W y una constante K


Sintassi: xorlw k
Operaciones equivalentes: W = W XOR k
Descripciòn: Efectua el OR exclusivo entre el valor contenido en el acumulador W y el valor
constante K.
Ejemplo: org 00H
start
movlw 00000000B
xorlw 11110000B
...
Despues de haber realizado este programa el acumulador W vale 11110000B.
Nota Esta instrucciòn influencia el bit Z de el registro STATUS.
Z vale 1 si el resultado de la operaciòn vale 0.
XORWF eXclusive OR W with F Status Register

Efectua el OR exclusivo entre el valor contenido en W y el valor contenido en el registro F.


Sintassi: xorwf f,d
Operaciones d = f XOR (donde d puede ser W o f)
equivalentes:
Descripciòn: Esta instrucciòn efectua el OR exclusivo (XOR) entre el valor contenido en el acumulador W
y el valor contenido en el registro dirigido por el parametro f.
El parametro d es un flag que indica en cual registro debe ser grabado el resultado.
Para d = W el resultado se graba en el registro W
Para d = F el resultado se graba en el registro f

Esta instrucciòn influencia los bit Z de el registro STATUS que vale 1 si el resultado de la
operaciòn es 0.
Ejemplo: Hagamos la hipotesis de tener que efectuar el XOR entre el registro W y el registro REG1
definido por nosotros en la direcciòn 0CH con el comando:

REG1 EQU 0CH

Podemos utilizar la instrucciòn IORWF en dos formas segun a donde queremos poner el
resultado, es decir:

xorwf COUNTER,F ;COUNTER = COUNTER XOR W

O tambièn:

xorwf COUNTER,W ;W = COUNTER XOR W

Nota El OR exclusivo (XOR) es una operaciòn entre dos bit donde el bit que resulta vale o si los
dos bit son iguales.
Muchas veces el XOR se utiliza en el assembler de el PIC para efectuar la comparaciòn entre
dos valores cuando falta una instrucciòn especifica.

Observemos como:
Hipotisamos de tener un valor en el registro REG1 y de querer verificar si es igual a 57H.
Las instrucciones que hay que seguir son las siguientes:

movlw 57H ;W = Valor que hay que comparar = 57H


;resultado W = 57H

xorwf REG1,W ;W = W XOR REG1 Efectua el XOR con


;el valor en REG 1

btfss STATUS,Z ;Salta la instrucciòn siguiente si el


;resultado de el XOR vale o, es decir
;si el valor de REG 1 es par a 57 H

goto diverso ;Salta si es diferente de 57 H


goto uguale ;Salta si es igual a 57 H
Status Register
3.2 ESCRITURA Y COMPILACION O REDACCION DE UN PROGRAMA EN ASSEMBLER

Como para cualquier sistema con microprodesador, tambièn para el PIC es necesario preparar un programa.
Un programa està formado por una lista de instrucciones una despues de la otra, cada una de las cuales
identifica la funciòn de base que el PIC es capaz de efectuar.
Cada instrucciòn està representada por un còdigo de operaciòn (en inglès operation code o abreviado
opcode) a 14 bit y està grabada en una zona de memoria EEPROM.
Esta memoria en el PIC16F84 dispone de 1024 zonas oarremdamientos cada una de las cuales es capaz de
contener una sola instrucciòn.
Un ejemplo de opcode escrito en forma binomia se puede observar a continuaciòn:

00 0001 0000 0000B

Es màs probable pero, que un opcode este representado en forma esadecimal es decir:

0100H

que representa exactamente el mismo valor pero en la forma màs breve. La letra H, que se coloca al final de
el valor 0100, indica el tipo de nota o escritura (Hexadecimal).
El mismo valor puede ser representado en assembler con la notaciòn 0x 100 que proviene de el lenguaje C o
H'0100'. Estos codigos, que parecen sin sentido, son los unicos que el PIC es capz de entender. Para facilitar
la tarea al programador, se recurre a algunos instrumentos y convenciones para volver la instrucciòn màs
comprensible.

La primera convenciòn es aquella que asocia a cada opcode (en total 35 para el PIC16F84) una sigla
mnemonica, es decir una sigla que ayude a acordarse de el significado de la instrucciòn.
Regresando al ejemplo nuestro el opcode 0100H corresponde a la instrucciòn mnemonica CLRW que es la
forma breve de la instrucciòn LEAR W REGISTER, es decir pone en cero el registro W. Otras convenciones
permiten definir variables, constantes, etiquetas (label) que sriven como referencias de las direcciones de
memoria, Etc.
El conjunto de estas convenciones que sirven para facilitar la redacciòn de un programa para PIC es llamado
lenguaje assenbler.
Un programa escrito en el lenguaje assembler puede ser escrito en un PC utilizando un cualquier word
processor o editor capaz de generar file ASCII. Un file ASCII o, mejor dicho, un file de texto que tenga un
programa en assembler es llamado source o fuente assembler.
Una vèz preparado nuestro source assembler, se necesita un programa capaz de traducir las instrucciones
mnemoniche y todas las demàs formas convencionales que se han utilisado para escribir nuestro source en
una serie de nùmeros (los opcode) reconocidos directamente por el PIC.

Este programa se llama redactor assembler o ensamblador. En la figura 3.3 se representa el esquema a
bloques de las operaciònes y de los file que se generan para pasar de un source assembler a u PIC
programado.
Fig. 3.3

Como ya se ha dicho antes la primera operaciòn que hay que efectuar es la escritura de el source assembler y
su grabaciòn en un file de texto con extensiòn ASM.
Para realizar esto debemos como hemos ya dicho utilizar un editor ASCii, es decir un programa de escritura
como por ejemplo el NOTEPAD.EXE de Windows o el EDIT.EXE de el DOS.
Es posible generar este file tambièn con programas de elaboraciòn de textos màs sofisticados como Word o
Wordperfect con cuidado de grabar siempre el file producido en el formato o tamaño de texto con extensiòn.
ASM.
Esto para evitar que se graben tambièn las letras de control de la formataciòn de el texto que el redactor
assembler no es capaz de tratar. En el primer ejemplo utilizaremos el file UD1PRG1.ASM.

El paso siguiente es la redacciòn de el source, es decir la transformaciòn en opcode de los codigos


mnemonici o instrucciones assembler en ellos contenidos.
El redactor assembler que usaremos es el MPASMWIN.EXE pruducido por la Microchip. Ademàs de el
source nuestro con extensiòn. ASM. Es necesario dar a redactor un file segundo producido por la Microchip
con extensiòn. INC diferente segùn el tipo de PIC que estamos utilizando.
En nuestro caso el file es el P16F84.INC. Este source contiene algunas definiciones que dependen de el chip
utilizado que veremos màs adelante.

Durante la redacciòn de el source, el redactor assembler genera una serie de file con nombre identico a el
source pero con extensiòn diferente.
.HEX es el file que contiene los còdigos de operaciòn que se enviaran a el PIC a travèz de el
programador.
.LST es un file de texto donde se lleva el entero source assembler y la correspondiente traducciòn en
opcode. No se utiliza para la programaciòn de el PIC pero es muy util para verificar los procesos
de redacciòn que ha hecho el redactor.
.ERR contiene una lista con los errores de redacciòn que se han encontrado y el nùmero de linea en el
interior de el source assembler donde se han encontrado.

Los file .LST, .ERR se utilizan para el control de lo que se ha hecho durante la redacciòn.
Solo el file. HEX se utiliza realmente para programar el PIC. Veamos ahora como los file .HEX no son file
en formato binomio y no reflejan directamente el contenido que tendra la EEPROM de el PIC.
Su formato pero refleja directamente cuanto se transferira a el PIC en forma legible y con algunas
instrucciones màs. Sin entrar en los detalles es util saber que este formato es directamente reconocible por el
programador que suministrara mientras se harà la programaciòn el cambio en binomio y contiene, ademàs de
los opcode otras informaciones como las direcciones donde seran llevados los opcode.
En el paso siguiente se llevara a cabo el analisis de el primer source assembler nuestro y veremos gran parte
de las convenciones utilizadas en el lenguaje assembler.

ANALISIS DE UN PROGRAMA

Analizaremos a continuaciòn una por una cada linea de el contenido de el siguiente programa :

TITLE ‘UD1prg1’
PROCESSOR 16F84 ; Programa scrito por micro 16F84
RADIX DEC ; Los nùmeros sin nota
; son decimales
INCLUDE “P16F84.INC” ; Incluye elfile P16F84.INC
;......................................................................
LED EQU 0 ; LED es equivalente a 0
ORG 0CH ; zona de los datos FILE REGISTER
; dedes la direcciòn 0CH
Count RES 2 ; Reserva 2 byte en la Label Count
ORG 00H ; Introduce las instrucciones en la
; EEPROM comenzando por 00H
;......................................................................
bsf STATUS,RP0 ; Mete en uno el quinto bit de el file
; register STATUS
movlw 00011111B ; Carga en el acumulador (W) el
; valor constante 00011111B
movwf TRISB ; Copia el contenido de W en el
; registro TRISB
movlw 11111110B ; Carga 11111110B en W
movwf TRISA ; Copia W en el registro TRISA
bcf STATUS,RP0 ; Pone en cero el quinto bit de el file
; register STATUS
bsf PUERTA,LED ; Mete en 1 (accensione LED) RA0
; de el registro PUERTA
;......................................................................
MainLoop ; Ciclo INTERMITENTE LED
call Delay ; Llamada a la sobroutine Delay
btfsc PORTA,LED ; Controla si el LED està prendido o
; apagado
goto SetToZero ; Si es si, salta en la label SetToZero
bsf PUERTA,LED ; Prendido LED
goto MainLoop ; Salta en la label MainLoop
;......................................................................
SetToZero ; Ciclo de apagado LED
bcf PUERTA,LED ; Pone en cero (spegnimento LED) RB0
; de el registro PUERTB
goto MainLoop ; Salta en la label MainLoop
;......................................................................
Delay ; Ciclo de retrazo
clrf Count ; Ponen en cero las dos zonas de el RAM
clrf Count+1 ; reservadas con la instrucciòn
; Count RES 2
;......................................................................
DelayLoop ; Ciclo de retrazo
decfsz Count,1 ; Disminuye el contenido de el Count,
; salta si el valor alcanzado es 0
goto DelayLoop ; Salta en la label DelayLoop
decfsz Count+1,1 ; Disminuye el contenido de el Count+1,
; salta si el valor alcanzado es 0
goto DelayLoop ; Salta en la label DelayLoop
return ; Salida de el retrazo
; y salto a la instrucciòn siguiente
; a la Call Delay
;......................................................................
END ; Final de el programa

Comemzemos con la primera linea de còdigo:

PROCESSOR 16F84
PROCESSOR es un mando de el redactor assembler que permite de definir para cual microprocesador
se escribio nuestro source.
Los mandos no son intrucciones mnemoniche que el redactor traduce en el correspondiente opcode,
sino simples indicaciones para el redactor para que pueda determinar el funcionamiento mientras se
realiza la redacciòn.
En este caso informamos a el redactor que las instrucciones que hemos introducido en nuestro source
estan relacionadas con un PIC16F84.
RADIX DEC
El mando RADIX sirve para informar el redactor que los nùmeros que se encuentran sin nota, son
nùmeros decimales.
Es decir si queremos especificar, por ejemplo el nùmero esadecimal 10 (16 decimal) no podemos
escribir solo 10 porque se interpreta o entiende como 10 decimal, pero 10 h o tambièn 0x10 o H'10'.
INCLUDE “P16F84.INC”
Este es otro mando. Esta vèz indicamos a el redactor la intenciòn nuestra de introducir en el source
otro file llamado P16F84.INC.
El redactor no hara otra cosa que cambiar el mando INCLUDE con el contenido de el file indicado y
efectuara la redacciòn como si el mismo formara parte de nuestro source (veer listado al final de el
paragrafo).
LED EQU 0
EL mando EQU es muy importante ya que nos permite de definir las constantes simbolicas en el
interior de nuestro source.
En particular la palabra LED en el source de ahora en adelante sera equivalente a el valor 0. La
intenciòn principal de la existencia de el mando EQU es en otras palabras covertir los source màs
faciles de leer y permitir de cambiar los valores constantes en un unico punto de el source.
Es importante notar que la palabra LED no identifica un variable si no sinplemente un nombre
simbolico valido durante la redacciòn.
No serà posible introducir instrucciones de el tipo LED = 3 en el interior de el source ya que la
asignaciòn dinamica de un valor a una variable es una operaciòn que necesita la mano de la CPU de el
PIC y que por lo tanto debe ser expresada con instrucciones y no con mandos.
Los mandos tienen sentido solo cuando se compila el source es decir un PIC no podra nunca
responder a un mando.

Veamos ahora la linea siguiente:


ORG 0CH
Tambièn ORG es un mando y nos permite de definir la direcciòn de donde queremos que el redactor
empieze a colocar los datos o las instrucciones siguientes.
En este caso estamos por definir una zona de datos en el interior de el PIC es decir una zona donde
grabar variables y contadores mientras ejecuta nuestro programa. Esta zona coincide con la zona
RAM de el PIC definida por la Microchip como zona de los FILE REGISTER. Los file register no son
màs que zonas RAM disponibles para el usuario a partir de la direcciòn 0CH.
Esta direcciòn de comienzo es fija y no puede ser cambiada ya que las zonas anteriores estan ocupadas
por otros registros especiales para uso interno.
Count RES 2
En esta linea encontramos una label y un mando.
El mando RES indica a el redactor que queremos reservar algunos nùmeros de byte o mejor dicho de
file registre en el interior de la zona de datos; en este caso 2 byte.
La label Count , donde Count es un nombre escogido por nosotros, es un marcador que el resto de el
source tendra el valor de la direcciòn donde ha sido introducido. Si como anteriormente como
direcciòn de comienzo se escogio la 0CH con la direcciòn ORG, Count tendra el valor 0CH.
Si por ejemplo se introduce una label tambien a la linea siguiente la misma tendra el valor 0CH + 2
(dos son los byte que hemos reservado) es decir 0EH. Los nombres de las label pueden ser cualquiera
excepto las palabras reservadas para el redactor (como las instrucciones mnemoniche y los mandos).
Una label se distingue de una constante simbolica porque su valor se calcula en la fase de la redacciòn
y no està asignado por nosotros.
ORG 00H
Este segundo mando ORG se refiere a una direcciòn en zona programa (en la EEPROM) en vèz que
en la zona datos.
De este momento en adelante se introduciran las instrucciones mnemoniche que el redactor debera
cambiar en los opcode convenientes para los PIC.
El primero opcode que realiza el PIC despues de el reset es aquel grabado en la zona 0, de donde se
obtiene el valor 00H introducido en la ORG.
bsf STATUS,RP0
Esta es la primera instrucciòn mnemonica completa de parametros.
Los PIC tienen una CPU interna de el tipo RISC para la cual cada una da las instrucciones ocupa una
sola zona de memoria, opcode y parametros incluidos.
En este caso la instrucciòn mnemonica bsf quiere decir BIT SET FILE REGISTER es decir pon en
uno (condiciòn lògica alta) uno de los bit que se encuentran en la zona de RAM especificada.
El parametro STATUS es definido en el file P16F84.INC a travèz de un mando EQU (observar la lista
al final de el paragrafo). El valor asignado en este file es 03H y corresponde a un file register (es decir
una zona RAM reservada en la zona de los datos) reservado. Tambièn el parametro RPO està definido
en el file P16F84. INC con valor 05H y corresponde a el nùmero de el bit que se quiere poner en uno.

Cada file register es largo 8 bit y la numeraciòn de cada uno comienza con 0 (bit con memor
significado) hasta llegar a 7 (bit con mayor significado) Esta instrucciòn pràcticamente pone en 1 el
quinto bit de el file register STATUS. Esta operaciòn es necesaria, como se prodra observar en las
lecciones siguientes, para acceder a los file register TRISA y TRISB.
movlw 00011111B
Esta instrucciòn significa : MOVE LITERAL TO W REGISTER es decir mueve un valor constante
en el acumulador.
El acumulador es un particular registro utilizado por la CPU en todas las situaciones donde se
efectuan operaciones entre dos valores o tambièn en operaciones de cambios entre zonas de memoria.
En otras palabras es un registro de apoyo utilizado por la CPU para grabar temporaneamente un byte
cada vèz que se presente la necesidad.
El valor constante que hay que grabar en el acumulador es 00011111B es decir un valor binomio a 8
bit donde el bit màs hacia la derecha representa el bit 0 o bit con menos significado.

En La instrucciòn siguiente:
movwf TRISB
El valor 00011111 se graba en el registro TRIBS (como para el registro STATUS tambièn TRISB està
definido a travèz de un mando EQU) cuya funciòn es aquella de definir el funcionamiento de cada
linea de I/O de la puerta B. En particular cada bit con uno de el registro TRIBS determina una entrada
en la correspondiente linea de la puerta B mientras cada 0 determina una salida.
En la tabla de la Figura 3.4 està representada la confuguraciòn que tomaran los pin de el PIC despues
de la ejecuciòn de esta instrucciòn:

Fig. 3.4

Las dos instrucciones siguientes desarrollan las mismas funciones para la puerta A de el PIC:

movlw B’11111110'
movwf TRISA

en este caso la definiciòn de las lineas serà la siguiente:

Fig. 3.5
Como es posible observar los bit 5, 6 y 7 no corresponden a ninguna linea de I/O y por lo tanto el
valor de los mismos no tienen ninguna influencia.
Hay que notar como el valor 0 en el bit 0 de el registro TRISA determine la configuraciòn en la salida
de la correspondiente linea de el PIC. En nuestra aplicaciòn en efecto esta linea se utiliza para pilotar
el LED que habra que poner en intermitencia. (Figura 3.6).

Fig. 3.6

Hemos observado que la instrucciòn movwf TRISA muda el valor contenido en el acumulador
(comenzado de manera oportuna con la instrucciòn movlw 11111110B) en el registro TRISA. El
significado de movwf es en efecto MOVE W TO FILE REGISTER.
bcf STATUS,RP0
Esta instrucciòn es parecida a la bsf que vimos antes, con la sola diferencia que pone en cero el bit en
vèz que ponerlo en uno.
La sugla en este caso es BIT CLEAR FILE REGISTER. De el punto de vista funcional esta
instrucciòn ha sido introducida para permitir el acceso a los registros internos de el banco 0 en vèz
que a los registros internos de el banco 1 donde se encuentran TRISA y TRISB.
bsf PORTA,LED
Con esta instrucciòn se efectua la primera operaciòn que tiene alguna influencia en el exterior de el
PIC.
En particular se prende el LED conectado con la linea RA0. PUERTA es una constante definida en
P16F84. INC y permite de marcar con una referencia el file register correspondiente a las lineas de I/O
de la puerta A mientras LED es el nùmero de la linea que hay que colocar en 1.
Al pricipio de el source la constante LED fue definida igual a 0, entonces la linea interesada serà RA0.
MainLoop
Esta linea contiene una label es decir una referencia simbolica a una direcciòn de memoria.
El valor de la label, como se dijo anteriormente, se calcula en la fase de la redacciòn en base a el
nùmero de las instrucciones, a los mandos ORG y a las otras instrucciones que de alguna manera
ocupan espacio en la memoria de el PIC.
En este caso, si contamos las instrucciones introducidas comenzando desde el ultimo mando ORG
podemos calcular el valor que se asignara a MainLOOP es decir 07H. En realidad el valor que asumen
las label no tienen mucha importancia ya que su intenciòn es aquella de evitar de tener que conocer la
posiciòn precisa de los opcode en la memoria de el PIC permitiendo de todas formas de poner
referencias a una determinada zona de memoria.
En este caso la label MainLoop se utiliza como punto de entrada de un ciclo (de el ingles Loop) de
encendido y de apague de el led, es decir una parte de codigo que se repetira en ciclo al infinito.
Encontraremos màs adelante una referencia a esta label.
call Delay
Esta intrucciòn determina una llamada (de el ingles call) a una subroutine que comienza desde la label
Delay.
En este caso la subroutine introduce un retraso igual al tiempo de encendido y apagado de el LED.
btfsc PORTA,LED
El significado de esta instrucciòn es BIT TEST FLAG, SKIP IF CLEAR es decir controla el estado de
un bit en el interno de un registro y salta la instrucciòn siguiente si el valor de este bit es cero.
El bit que hay que controlar corresponde a la linea de salida que se encuentra conectada con el diodo
LED, a travèz de este test se podra determinar o calcular si el LED esta prendido o apagado y por lo
tanto actuar segun el caso, es decir : si el LED està ya prendido lo apagaremos, si el LED està apagado
lo prenderemos.
Goto SetToZero
Esta instrucciòn es un salto sin condiciòn (de el ingles GO TO, ve para o ve hacia) en la label
SetToZero donde consegriremos las instrucciones para apagar el LED.
Esta instrucciòn sera saltada por la instrucciòn siguiente si el LED està ya apagado.
bsf PORTA,LED
goto MainLoop
Estas dos instrucciones simplemente prenden el LED y ponen el programa en la entrada de el ciclo de
intermitencia.
SetToZero
bcf PORTA,LED
goto MainLoop
Esta dos instrucciones simplemente apagan el LED y vuelven amandar el programa en la entrada de el
ciclo de intermitencia.
Subroutine Delay
La sobroutine Delay introduce un retraso de casi un segundo y puede ser llamada màs veces en el
souerce a travèz de la instrucciòn call Delay
Veamos como funcionan:

Delay
Clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return

Delay y Delay Loop son dos label. Delay identifica la direcciòn de inicio de la subroutine y se utiliza
para las llamadas de el cuerpo principa de el programa.
Delay Loop es llamado interiormente por la subroutine y sirve como punto de entrada para el ciclo (de
el ingles loop) de retraso.
En otras palabras el retraso se obtiene siguiendo miles de instrucciones que no hacen nada.
Este tipo de retraso se llama retraso software.
Es el tipo de retraso màs simple de introducir y puede ser utilizado cuando no se necesita que el PIC
realize otras tareas mientras se efectua el retrazo.
Las instrucciones:

clrf Count
clrf Count+1
CLEAR FILE REGISTER ponen encero las dos zonas de RAM reservadas anteriormente con la
instrucciòn: Count RES 2
Estas dos zonas son adyacente comenzando desde la direcciòn con la referencia desde la label count.

decfsz Count,1

La instrucciòn significa DECREMENT FILE REGISTER, SKIP IF ZERO es decir disminuye el


contenido de un registro (en este caso Count y salta la instrucciòn siguiente si el valor que se alcanza
es cero).
Si el valor que se alcanza no es cero se efectua la instrucciòn siguiente:

goto DelayLoop

Que vuelve a mandar la ejecuciòn al principio de el ciclo de retraso.


Una vèz que se haya alcanzado el cero con el contador Count se efectuan las instrucciones:

decfsz Count+1,1
goto DelayLoop

Que disminuyen el registro siguiente hasta que este no alcanza el valor cero. El registro Count + 1 en
particular serà aumentado de uno por cada 256 deducciones de Count.
Cuando tambièn Count + 1 alcanzara el zero la instrucciòn:

return

cuyo significado es RETURN FROM SUBROUTINE determinara la salida de la routine de retraso y


la continuaciòn de la ejecuciòn de la instrucciòn siguiente la cal 1 Delay.
END
Para terminar END es un mando que indica al el redactor el final de la source assembler.
Lección N.4: Alrededores y tecnicas de entrevista, interrupt
Objectivos: Saber:
El funcionamiento de las lineas de I/O, de el registro contador TMRO y de el
PRESCALER
La gestiòn de los interrupt
El funcionamiento de el Power Down Mode

Saber hacer:
Programar las lineas de I/O
Utilizar el registro contador TMRO
Programar el PRESCALER
Programar un interrupt
Utilizar el Power Down Mode

Requisitos : Nociones de electronica digital

Contenidos : Las puertas A y B


Estadios de saluda de los I/O
El registro contador TMRO
El prescaler
El interrupt
El power Down Mode (sleep)
Página blanca
4.1 Las puertas A y B

El PIC16F84 contiene un total de 13 lineas de input/Output organizadas en dos puertas llamadas puerta A y
puerta B. La puerta A contiene 5 lineas en configuraciòn sea como entradas que como salidas identificadas
con las siglas:
RA0, RA1, RA2, RA3, RA4,.
La puerta B dispone de 8 lineas esas tambièn en configuraciòn sea como entradas que como salidas
identificadas con las siglas:
RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB7.

Fig. 4.1a
Fig. 4.1b

La subdivisiòn de las lineas en dos puertas diferentes està dictada por los vìnculos de la arquitectura interior
de el PIC16F84 que preve la gestiòn de los datos con longitud màxima de 8 bit.
Para la gestiòn de las lineas de I/O de programa, el PIC contiene dos registros internos para cada puerta
llamados TRISA y PUERTA para la puerta A y TRISB y PORTB para la puerta B.
Los registros TRISA y TRISB, determinan el funcionamiento como entrada o salida de cada una de las
lineas, los registros pORTA y PORTB determinan el estado de las lineas en la salida o ponen de nuevo el
estado de las lineas en entrada.
Cada uno de los bit contenidos en los registros citados corresponden de manera univoca a una linea de I/O.

Por ejemplo el bit 0 de el registro PORTA y de el registro TRISA corresponde a la linea RA0, el bit 1 a la
linea RA1 y asi siempre.
Si el bit 0 de el registro TRISA se pone en cero, la linea RA0 serà configurada como linea de salida,
entonces el valor de el bit 0 de el registro PORTA determinara el estado lògico de esta linea (0 = 0V, 1 =
5V).
Si el bit 0 de el registro TRISA se coloca en uno, la linea RA0 serà configurada como una linea de entrada,
entonces el estado lògico determinado por el circuito externo relativo a la linea RA0 se reflejara sobre el
estado de el bit 0 de el registro PORTA.
Hagamos un ejemplo, supongamos de conectar un LED sobre la linea RB0 y un pulsador sobre la linea RB4,
las instrucciones que habra que escribir seran:

movlw 00010000B
movwf TRIS B

En este caso se pone en cero el bit 0 (linea RB0 como salida) y en 1 el bit 4 (linea RB4 como entrada). Se
recuerda que en la representaciòn en binomio de el assembler el bit hacia la derecha corresponde a el bit que
tiene un significado menor es decir a el bit 0.
Para prender el lED se tendra que escribir la siguiente instrucciòn:

bsf PORTB,0

Para apagarlo:

bcf PORTB,0

Para leer el estado de el pulsador o botòn conectado con la linea RB4:

btfss PORTB,4
goto PulsanteOn
goto PulsanteOff
4.2 Estadios de salida de las lineas de I/O

Para hacer que los PIC sean màs versàtiles cuando realizan las diferentes aplicaciones, la Microchip ha
desarrollado diferentes tipos de estados de salida para las lineas de I/O. Existen entonces grupos de pin cuya
conducta es se diferencia de poco respecto a otros grupos.
Conociendo mejor el funcionamiento de los diferentes estadios de salida se podran aprovechar sus
caracteristicas para poder optimizar el uso en las diferentes aplicaciones.

Stadio de salida de las lineas RA0, RA1, RA2 y RA3 (Figura 4.2)

Fig. 4.2

Como se dijo anteriormente, la configuraciòn de una linea como entrada o como salida depende de el
estado de los bit en el registro TRISA para la puerta A y TRISB para la puerta B.
Pongamos como ejemplo la linea RA0 y analizemos el funcionamiento de es estadio de salida sea
cuando la linea funciona como entrada, que como salida.
Funcionamiento como entrada
Para configurar la linea RA0 como entrada, debemos plantear el bit 0 de el registro TRISA 1 con la
instrucciòn:

bsf TRISA,0

Esto determina una conmutaciòn en 1 de el estado lògico de el flip - flop de el tipo D - latch
indicado en la Figura 4.2 con el nombre TRIS latch.
Para cada linea de I/O existe un flip - flop donde el estado dipende muy de cerca a el estado lògico
de el correspondiente bit en el registro TRIS.
La salida Q de el TRIS latch està conectada en la entrada de una puerta lògica OR. Esto significa
que, no importa que valor tenga la otra entrada, la salida de la puerta OR tendra siempre el valor 1
visto que una de las dos entradas vale 1. En esta condiciòn el transistor P no conduce y mantiene la
linea RA0 desconectada de la tensiòn positiva de alimentaciòn.
De la misma forma la salida negada de el TRIS latch se encuentra conectada en la entrada de una
puerta AND entonces la salida de esta valdra siempre 0. En esta condiciòn tambièn el transistor N
no conduce manteniendo la linea RA0 desconectada de la tierra. El estado lògico de la linea RA0
depende solo de el circuito externo con quien se encuentra conectado.
Aplicando una tensiòn de 0V o 5V a el pin RA0, serà posible leer el valor utilizando el bloqueo de
la entrada representado por el TTL input buffer y por el latch.
Funcionamiento como salida
Para realizar la configuraciòn la linea RA0 como salida, necesita metter en 0 el bit 0 de el registro
TRISA con la instrucciòn:

bcf TRISA,0

Este determina la conmutaciòn en 0 de la salida Q de el TRIS latch y en uno de la salida Q negada.

En este estado el valor presente en las salidas de las puertas OR y AND depende solo de el estado
de Q negado de el Data Latch.
Como para el TRIS latch, tambièn el Data Latch depende de el estado de un bit en un registro, en
particular de el registro PUERTA. Su salida negada es enviada a la entrada de las dos puertas
lògicas OR y AND es decir directamente en la base de los transistores P y N.
Si colocamos en 0 el bit 0 de el registro PORTA con la instrucciòn:
se habra la conducciòn de el transistor N logrando poner en cero la linea RA0.
Si en vèz colocamos en 1 el bit 0 con la instrucciòn:

bcf PORTA,0

se lograra la conducciòn de el transistor P colocando en 5V la linea RA0.


En esta condiciòn es siempre posible volver a leer el valor enviado sobre la linea a travèz de el
circuito de entrada.
Estadio de salida de la linea RA4
Hagamos en este momento el analisis de el funcionamiento de el estadio de la linea RA4 que se
distingue de todas las otras lineas de I/O ya que utilizan el mismo pin de el PIC16F84 con el TOCKI
que veremos màs adelante.
En la figura 4.3 se representa el esquema en bloques de el estadio de la salida extraìdo de la data
sheep Microchip:
Fig. 4.3

La lògica de conmutaciòn es identica a el grupo de lineas RA0 - RA3 con excepciòn de la flta de la
puerta OR y de el transistor P, es decir de toda la cadena que permite de conectar a el positivo de la
linea RA4.
Esto significa, en terminos pràcticos, que cuando la linea RA4 se programa en salida, en verdad no se
conecta con el positivo sino se queda desconectada.
Este tipo de configuraciòn es llamada con el conector abierto y es una aplicaciòn util donde es
necesario usar el mismo conector con màs pin de salida y es necesario colocar en alta impedenza una
linea de salida sin tener que volverla a programar como linea de entrada.
Si queremos estar seguros que la linea RA4 va en 1 tendremos que conectar externamente una
resistencia de pull - up, es decir una resistencia conectada con el positivo de la alimentaciòn. Veremos
a continuaciòn como se utiliza la linea indicada en el esquema con TMR0 clock input.
Estadio de salida de las lineas RB0, RB1, RB2, RB3
Tambièn para este grupo de lineas premanece sin cambiar la lògica de conmutaciòn.
Las mismas poseen ademàs un circuito de week pull - up que se puede activar cuando las lineas se
prpgraman como entradas.
Como entradas en efecto, como ya se ha explicado, las lineas se desconectan completamente de el PIC
ya que sea el transistor P que el transistor N son abiertos.
El estado de las lineas depende entonces solo de el circuito externo. Si este circuito es de el tipo con
recogedor abierto o de manera màs simple se encuentra formado por un simple pulsador que, cuando
se presiona, conecta a la tierra la linea de I/O, es necesario introducir una resistencia de pull - up hacia
el positivo para estar seguros que cuando se suelte el pulsador se logre una condiciòn lògica en 1
estable sobre la linea de entrada.
El circuito de weak pull - up permite de evitar la utilizaciòn de resistencias de pull - up y puede ser
activada o desactivada actuando sobre el bit RBPU de el registro OPTION.
En la Figura 24.4.4 se representa el esquema en bloques de el estadio de salida.

Fig. 4.4

La sola linea RB0 ademàs, presenta una caracteristica muy importante.


Ella, cuando se encuentra configurada como linea de entrada, puede generar, en correspondencia de
un cambio de estado lògico, un interrupt, es decir una interrupciòn inmediata de el programa que se
ejecuta y una llamada a una subroutine especial llamada interrupt handler que veremos màs adelante.
Estadio de salida de las lineas RB4, RB5, RB6, RB7
El circuito de comunicaciòn de este grupo de lineas es igual a el de RB0, RB3 (Figura 4.5).
Estas lineas disponen tambièn de el circuito de weak pull - up.
Ademàs respecto a las lineas RB0 - RB3 tienen un estadio que logra observar las variaciones de
estado en cualquier linea y de generar un interropt.
Fig. 4.5
4.3 El registro contador TMR0

El registro TMR0 es un contador, es decir un particular tipo de registro donde el contenido de el mismo es
aumentado con un ritmo regular y programado directamente por el hardware de el PIC.
En otras palabras, con la diferencia de los demàs registros, el TMR0 no mantiene igual el valor grabado,
pero lo aumenta contenuamente, si por ejemplo se escribe el valor 10 con las siguientes instrucciones:

movlw 10
movwf TMR0

Despues de un tiempo de màs o menos cuatro ciclos de la màquina, el contenido de el registro comienza a
aumentar a 11, 12, 13 y asi en adelante con un ritmo constante y independiente de la ejecuciòn de el resto de
el programa.
Si, por ejemplo, despues de haber introducido un valor en el registro TMR0, realizaremos un loop infinito:

movlw 10
movwf TMR0
loop
goto loop

El registro TMR0 es aumentado igualmente por el hardware interno en el PIC al mismo tiempo que el loop
realiza la ejecuciòn.
Una vez que se alcanza el valor 255 el registro TMR0 se pone en cero automàticamente comenzando de
nuevo a contar no desde el valor en origen colocado pero desde el cero.
La frecuencia para contar es directamente proporcional a la frecuencia de clock aplicada a el chip y puede
ser cambiada programando en la mejor manera algunos bit de configuraciòn.
En la Figura 4.6 se encuentran los bloques internos de el PIC que determinan el funcionamiento de el
registro TMR0.

Fig. 4.6
Los bloques Fosc/4 y T0Cki representan las dos fuentes disponibles de el señal para el contador TMR0.
Fosc/4 es un señal generado internamente en el PIC de el circuito de el clock y es igual a la frecuencia de
clock dividida por cuatro.
T0CKI es un señal generado de un eventual circuito externo y aplicado en el PIN T0CKI correspondiente de
el pin 3 en el PIC16F84.

Los bloques T0CS y PSA son dos conmutadores de señal en cuya salida se presenta uno de los dos señales
en entrada en base a el valor de los bit T0CS y PSA de el registro OPTION.
El bloque PRESCALER es un divisor programable cuyo funcionamiento serà explicado màs adelante.
Veamos en pràctica como es posible actuar sobre estos bloques para obtener diferentes modalidades para
contar en el registro TMR0.

Comenzamos programando el bit T0CS en 0 y PSA en 1.


Como hemos ya dicho antes, la fracuencia Fosc/4 es de un cuarto de la frecuencia de un clock.
Utilizando un cuarzo de 4MHz se obtiene una Fosc/4 de 1 MHz. Esta frecuencia es enviada directamente en
el registro TMR0 sin cambiar para nada. El ritmo de la cuenta que se obtiene es igual a 1 millon de
aumentos por cada segundo de el valor presente en TMR0.
Hagamos la hipotesis de cambiar el estado de el bit T0CS de 0 a 1. Esta vèz sera el señal aplicado a el pin
TOCKI de el PIC que sera mandado directamente en el contador TMR0 determinando la frecuencia de la
cuenta. Aplicando por ejemplo a este pin una frecuencia igual a 100 Hz se obtiene una frecuencia de cuenta
de 100 aumentos por cada segundo.

La presencia de la puerta lògica XOR en la entrada TOCKI de el PIC permite de determinar a travèz de el bit
T0SE de el registro OPTION si el contador TMR0 debe ser aumentado segun la bajada (T0SE = 1) o el
aumento de el señal aplicado desde el exterior.
4.4 El prescaler

El ultimo bloque que hay que analizar todavìa para poder utilizar completamente el registro TMR0 es el
PRESCALER.
Si se configura el bit PSA de el registro OPTION en 0 se envia a el registro TMR0 el señal en la salida de el
PRESCALER.
El PRESCALER està formado en pràctica por un divisor programable con 8 bit que se utilizara cuando la
frecuencia de la cuenta enviada a el contador TMR0 sea muy grande para nuestras intenciones.
En el ejemplo de el paragrafo anterior hemos visto que utilizando un quarzo de 4 MHz se puede obtener una
frecuencia de cuenta de 1 MHz que para muchas aplicaciones es muy grande.
Utilizando el PRESCALER podemos dividir todavìa màs la frecuencia Fosc/4 configurando en una mamera
justa los bit PS0. PS1 y PS2 de el registro segun la tabla.

Fig. 4.7

Probemos ahora a escribir la subroutine para introducir un retrazo de un segundo utilizando el registro
TMR0.
Debemos antes que nada programar el PRESCALER para obtener una frecuencia de cuenta conveniente
introduciendo las siguientes instrucciones al principio de el programa:

movlw 00000100B
movwf OPTION_REG
En otras palabras debemos programar los bit T0CS en 0 para elegir como fuente de la cuenta el clock de el
PIC, el bit PSA en 0 para asignar el PRESCALER a el registro TRM0 en vèz de el Watch Dog Timer ( que
veremos màs adelante) y los bit de configuraciòn de el PRESCALER en 100 para obtener una frecuencia de
divisiòn de:

1 : 32

La frecuencia de cuenta que se obtiene en el TRM0 serà:

Fosc = 1MHz/32 = 31.250 Hz

La subroutine Delay debera utilizar muy bien el registro TMR0 para obtener un retraso de un segundo.
Veamos como.
Las primeras instrucciones que se realizan en la Delay son:

Delay
movlw 6
movwf TMR0
movlw 125
movwf Count

Las primeras dos graban en TMR0 el valor 6 de manera que el registro TMR0 alcanze el cero despues de
250 cuentas (256 - 6 = 250) se obtiene de esta manera una frecuencia de pases por el cero de TMR0 igual a:

31.250/250 = 125 Hz

Las instrucciones siguientes graban en un registro a 8 bit (Count) el valor 125 de manera que, disminuyendo
este registro de uno por cada vèz que pasa por cero TMR0, se obtenga una fracuencia de pase por el cero de
el registro Count que vale:

125/125 = 1Hz

Las instrucciones introducidas en el loop Delay Loop se ocupan entonces de controlar si TMR0 ha
alcanzado el cero.
Cuando Count alcanzara el tambièn cero entonces habra pasado un segundo y la subroutine podra regresar
en el programa que hace la llamada.

DelayLoop
movf TMR0,W
btfss STATUS,Z
goto DelayLoop
movlw 6
movwf TMR0
decfsz Count,1
goto DelayLoop
return
4.5 El interrupt

El interrupt es una particular caràcteristica de los PIC que permiten de interceptar un acontecimiento
externo, interrumpir por algunos momentos el programa que se està realizando, efectuar una parte de el
programa especializado para la gestiòn de el acontecimiento que se presenta y volver a comenzar la
ejecuciòn de el programa principal.

Es claro que es mejor controlar un acontecimiento con un interrupt en vèz que controlar ciclicamente un
acontecimiento con el programa principal.
Gran parte de los aspectos que tienen que ver con la gestiòn de el interrupt son tratados ademàs directamente
por el hardware interno de el PIC donde el tiempo de la respuesta para el acontecimiento es pràcticamente
inmediato.

Fig. 4.8

Tipos de acontecimientos y bit de habilitaciòn


El PIC16F84 es capaz de gestir en interrupt cuatro acontecimientos diferentes:
1. El cambio de estado sobre la linea RB0 (External interrupt RB0/INT pin.)
2. El final de la cuenta de el registro TMR0 (TMR0 overflow interrupt).
3. El cambio de estado sobre una de las lineas de RB4 y RB7 (PORTB change interrupts).
4. El final de la escritura sobre una zona EEPROM (EEPROM write complete interrupt).

El interrupt sobre cada uno de estos acontecimientos puede ser habilitado o no habilitado,
independientemente de los otros, actuando sobre los siguientes bit de el registro INTCON:
Fig. 4.9

INTE (bit 4) si este bit es colocado en 1 se habilita el interrupt sobre el cambio de estado sobre la linea
RB0
T0IE (bit 5) si este bit es colocado en 1 se habilita el interrupt en el final de la cuenta de el registro
TMR0
RBIE (bit 3) si este bit es colocado en 1 se habilita el interrupt en el cambio de estado sobre una de las
lineas de RB4 a RB7
EEIE (bit 6) si este bit es colocado en 1 se habilita el interrupt al final de la escritura sobre una zona
EEPROM.

Existe ademàs un bit de habilitaciòn general de los interrupt que debe ser settato el tambièn en uno es decir
el bit GIE (Global Interrupt Enable bit) colocado sobre el bit 7 de el registro INTCON.
Interrupt vector ed Interrupt handler
Cualquiera sea el acontecimiento habilitado, cuando se presenta el PIC interrumpe la ejecuciòn de el
programa que se està efectuando, graba automàticamente en el STACK el valor de ese momento de el
PROGRAM COUNTER y salta a la intrucciòn presente en la zona de memoria 0004H llamada
Interrupt vector (vector de interrupt).
Es desde este momento que debemos introducir la subroutine nuestra que sirve para la gestiòn de el
interrupt llamada Interrupt Handler (controlador de interrupt).
Si se pueden habilitar màs interrupt, entre las primeras tareas de el interrupt handler està verificar
cual, entre los acontecimientos habilitados, ha generado el interrupt y la ejecuciòn de la parte de el
programa respectivo.
Interrupt flag
Dado que cualquiera de los interrupt genera una llamada en la zona 04H, en el registro INTCON estàn
presentes los flag que indica cual es el acontecimiento que ha generado el interrupt:
INTF (bit 1) Si vale 1 el interrupt ha sido generado por el cambio de estado sobre la linea RB0.
T0IF (bit 2) Si vale 1 el interrupt ha sido generado al final de la cuenta de el timer TMR0.
RBIF (bit 0) Si vale 1 el interrupt ha sido generado por el cambio de estado de una de las lineas
desde RB4 a RB7.

Como se puede observar para el interrupt en el final de la escritura en EEPROM no està previsto
ningun flag de señalaciòn que indique a el interrupt handler que tiene que considerar que el interrupt
haya sido generado por este acontecimiento cuando todos los tres flag antes mencionados valgan 0.
Importante : Una vèz que se observa cual flag es activo, el interrupt handler debe ponerlo en cero
sino no se generara màs nunca el interrupt correpondiente.
Regreso desde un interrupt handler
Cuando se genera un interrupt el PIC quita la habilitaciòn automàticamente de el bit GIE (Global
Interrupt Enable) de el registro INTCON de manera que se quite la habilitaciòn de todos los interrupt
mientras es ya en ejecuciòn un interrupt handler.
Para poder regresar a el programa principal y volver a colocar en 1 este bit se necesita utilizar la
instrucciòn RETFIE.
4.6 El power down mode

El Power Down Mode o Sleep Mode es un particular estado de funcionamiento de el PIC utilizando para
reducir el consumo de la corriente en los momentos donde el PIC no se utiliza porque espera un
acontecimiento externo.

L’istruzione SLEEP

La instrucciòn SLEEP se utiliza para colocar el PIC en Power Down Mode y reducir de consecuencia la
corriente absorbida que pasara desde màs o menos 2m A (5 volt y colck de 4 MHz) hasta màs o menos 2 ?A.

Para entrar en Power Down Mode basta introducir SLEEP en un punto cualquiera de nuestro programa.
Cualquiera de las instrucciones presente despues de la SLEEP no sera realizada por el PIC que terminara en
este punto su ejecuciòn, apagara todos los circuitos internos, ecepto los necesarios para mantener el estado
de las puertas de I/O (estado lògico alto, bajo o alta impedenza) y para observar las condiciones de
renovaciòn.

Para reducir el consumo de corriente es este estado, no deber estar presentes circuitos conectados con las
lineas de salida de el PIC que absorben corriente. O mejor estos circuitos deben ser proyectados de manera
que se puedan limitar que estos circuitos absorban en las condiciones de Power Down.
Otro cosa importante que recomienda la Microchip es conectar a el positivo (Vdd) o al negativo (Vss) de
alimentaciòn todas las lineas en alta impedenza no utilizadas incluyendo la linea RA4 / T0CKI (pin 3).

Para despertar de su sueño el PIC pueden ser utilizadas diferentes tècnicas:

Reset de el PIC poniendo en 0 el pin MCLR (pin 4)


Timeout de el timer de el Watchdog (si està habilitado)
Cuando existe una situaciòn de interruptt (interrupt desde el pin RB0 / INT, cambio de estado sobre la
puerta B, termina la operaciòn de escritura sobre EEPROM).

En los casos 1 y 2 el PIC se pone en reset y la ejecuciòn retomada desde la zona 0.


En el caso 3 el PIC se porta como en la gestiòn normal de un interrupt efectuando de primero la interrupt
handler y entonces comenzando de nuevo la ejecuciòn despues de la instrucciòn SLEEP. Porque el PIC sea
despertado por un interrupt deben ser habilitados los flag de el registro INTCON.

Los bit TO y PD de el registro STATUS pueden ser utilizados cuando se despierta para determinar si la
causa de el despierte es la simple operaciòn de prender el PIC, el reset o tabièn se debe a que llega un
interrupt.
Unidad N.1: Programación de el PIC
Objectivos: Realizar un simple cicuito de prueba
Escribir y redactar un programa en Assembler
Transferir el programa desde PC a el Pic a travèz de el software
DL3155M24SW

Requisitos: Adquisiciòn de la guìa teorica

Instrumentos: PC con sistema de operaciòn WINDOWS 95 o superior


Redactor Assembler MPASWIN.EXE Microchip
Software DL 3155M24SW
Cable de comunicaciòn (puerta paralela)
Set o conjunto de cables pequeños
Página blanca
Programación de el PIC
Lista de componentes
• R1, R2, R4 = 10kΩ - 1/4W - 5%
• R3 = 220Ω - 1/4W - 5%
• R5, R10 = 4.7kΩ - 1/4W - 5%
• R6, R8 = 1kΩ - 1/4W - 5%
• R7, R15, R14, R11 = 10kΩ - 1/4W - 5%
• R9, R12, R16 = 1.5kΩ - 1/4W - 5%
• R17, R13 = 100Ω - 1/4W - 5%
• R18 = 470Ω - 1/4W - 5%
• C1 = 47mF - Tantalio
• C2 = 100nF - Estratos multiplo
• C3, C4 = 22pF - Ceramico
• C5, C6, C7 = 100nF - Estratos multiplo
• N1 = PIC16F84
• V1, V3 = Diodos LED rojos
• R/W CHECK = Diodo LED verde
• V2 = 7812
• V4, V6 = BC557
• V5, V7, V8 = BC337
• X1 = Conector 25 polos
• G1 = Cuarzo 4MHz
• RESET, TEXT = Pulsadores NA
Esquema topográfico

Fig. 1.1
Fig. 1.2
Programa UD1prg1
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
; LED
;======================================================================
TITLE 'UD1prg1'
PROCESSOR 16F84 ; Programa que ha sido escrito para micro 16F84
RADIX DEC ; Los numeros sin nota
; son decimales
INCLUDE "P16F84.INC" ; Incluir el file P16F84.INC
;......................................................................
LED EQU 0 ; LED es equivalente a 0
ORG 0CH ; Zona datos en el FILE REGISTER
; desde la direcciòn 0CH
Count RES 2 ; Reserva 2 byte ala Label Count
ORG 00H ; Introduce las instrucciones
; EEPROM comenzando por 00H
;......................................................................
bsf STATUS,RP0 ; Pone en 1 el quinto bit de el file
; register STATUS
movlw 00011111B ; Carga en el acumulador (W) el
; valor constante 00011111B
movwf TRISB ; Copia el contenido de W en el
; registro TRISB
movlw 11111110B ; Carga 11111110B en W
movwf TRISA ; Copia W en el registro TRISA
bcf STATUS,RP0 ; Pone en cero el quinto bit de el file
; register STATUS
bsf PORTA,LED ; Pone en 1 (accensione LED) RA0
; de el registro PORTA
;......................................................................
MainLoop ; Ciclo intermitente LED
call Delay ; Llamada a la sobroutine Delay
btfsc PORTA,LED ; Controla si el LED se encuentra prendido o
; apagado
goto SetToZero ; Si es si, salta en la label SetToZero
bsf PORTA,LED ; Prendido LED
goto MainLoop ; Salta en la label MainLoop
;......................................................................
SetToZero ; Ciclo de apagado LED
bcf PORTA,LED ; Pone en cero (apagado LED) RB0
; de el registro PORTB
goto MainLoop ;Salta en la label MainLoop
;......................................................................
Delay ; Ciclo de retraso
clrf Count ; Pone en cero las dos zonas de RAM
clrf Count+1 ; rreservadas con la instrucciòn
; Count RES 2
;......................................................................
DelayLoop ; Ciclo de retraso
decfsz Count,1 ; Disminuye el contenido de Count,
; salta si il valor alcanzado es 0
goto DelayLoop ; Salta en la label DelayLoop
decfsz Count+1,1 ; Disminuye el contenido de Count+1,
; salta si el valor alcanzado es 0
goto DelayLoop ; Salta en la label DelayLoop
return ; salida de la routine de retraso
; y salto a la instrucciòn siguiente
; de la Call Delay
;......................................................................
END ; Final de el programa
EXPERIMENTACIÓN
introducir el Modulo 24 en la consolle y colocar en ON el interruptor general.
Conectar, a travèz de un cable para la conexiòn, la puerta que se encuentra de manera paralela a el
Modulo 24 de el PC;
Prender el PC y crear una directory de trabajo: C : \ DL3155M24;
Preparar un Editor ASCII (Note Pad, Word, Word Perfect en un ambiente WINDOWS o Edit en MS -
DOS);
9) Escribir el siguiente programa:
UD1prg1. ASM
salvar el programa en un formato txt en la directory para el trabajo con el nombre UD1prg1. ASM;
Copiar el software MPASNWIN. EXE (Microchips), para redactar el programa source UD1 prg 1. ASM,
en la DIR: C\ DL3155M24;
Copiar el file P16F84. INC y la guìa de el redactor en la DIR : C \ DL3155M24;
NOTA:
La Microchip es disponible en la direcciòn http://www.microchip.com para dar el proprio assembler
MPASM en doble versiòn para el sistema de operaciòn Microchips Windows 3.x/ 95 / 98 y para el
ambiente MS - DOS.
Redactar el programa UD1 prg1. ASM de la siguiente manera: dejar el programa MPASNWIN. EXE,
elegir el procesador 16F84, RADIX (Default), WARNING LEVEL (Default), HEX OUTPUT (Default),
GENERATED FILES (Error File, List File, Cross Reference File), SAVE SETTINGS ON EXIT
(Habilitado), cargar el file fuente UD1 prg1. ASM y ensamblar el programa;
NOTA: para otras informaciones consultar las instrucciones suministradas por la Microchip.
El ensamblador crea en la DRR : C\ DL3155M24 los siguientes file: UD1 prg1. HEX, UD1 prg1. LST,
UD1 prg1. ERR, UD1 prg1. COD y el documento de el texto UD1 prg1. XRF;
Conectar, a travèz de cables pequeños, el circuito como en la Figura. 1.1;
Instalar y lanzar el programa DL3155M24SW;
Cargar (LOAD) el programa UD1 prg 1. HEX contenido en la DIR : C\ DL3155M24
Elegir en la ventana en la parte alta en la izquierda con la correspondiente flecha el procesador 16F84, la
puerta paralela utilizada (LPT1 o LPT2), Oscillator (XT), Protection (OFF), Programme (CODE; FUSES;
EEPROM);
Programar el procesador presionando la tecla PROGRAM: mientras se efectua el transferimento de los
datos el LED R / W CHECK indicarà el correcto funcionamiento con algunas intermitencias,
Mientras se efectua la programaciòn aparecerà la ventana FUSES STATE que indicarà el estado de los
fusibles: dejar inalterables los paltiamientos y cerrar la ventana;
Una vèz que se ha terminado la programaciòn presionar sobre VERIFY para comparar el file contenido en
el microprocesador con aquel elegido con el comando LOAD: si se encuentran algunos problemas el
programador genera un mensaje de error. En este ultimo caso hay que borrar a travèz de la tecla o el botòn
ERASE el PIC y volver a programar el mismo;
Remover las conexiones;
Conectar el circuito como en la Fig. 1. 2 y observar que el LED V1 efectua intermitencias que indican que
el programa se està efectuando de manera correcta;
Remover todas las conexiones.
Unidad N.2: Puertas I/O, Routine de retraso, EEPROM
Objectivos: Comienzo y gestiòn de las puertas I/O y utlilizaciòn de los registros
Gestiòn de las rutinas de retraso
Pulsador o boton antirebote
Gestiòn EEPROM

Requisitos: Adquisiciòn de la guìa teòrica

Adquisiciòn de la U. D. 1 (Guìa para las Operaciones)

Instrumentos: PC con sistema de operaciòn WINDOWS 95 o superior


Redactor Assembler MPASWIN. EXE (Microchip)
Software DL 3155M24SW
Cable de comunicaciòn (puerta paralela)
Set o conjutos de cables pequeños (cablecitos).
Página blanca
Puertas I/O - Routine de retraso, EEPROM
Esquema eléctrico

Fig. 2.1a

Fig. 2.1.b
Lista de componentes
RS1 = Red resistiva SIL 330Ω - 1/4W - 2% - 9 pin
H0, H1, H2, H3, H4, H5, H6, H7 = diodos LED rojos
S0, S1, S2, S3 = Pulsadores NA
S4, S5, S6, S7 = desviadores con deslize
Esquema topográfico

Fig. 2.2a (puertas I/O - Routine de retraso)


Fig. 2.2b (Gestiòn EEPROM)
Programa UD2prg1
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
; Puertas I/O
;======================================================================
TITLE ‘UD2prg1’
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
LIST F=INHX8M
;................................................................
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
;................................................................
#define LED0 PORTB,0
;................................................................
ORG 0
goto Start
nop
nop
nop
goto Interp
;................................................................
Start
bsf STAT,5
movlw b’0010'
movwf TR_A
movlw b’00000000'
movwf TR_B
clrf INTCON
bcf STAT,5
clrf PORTA
clrf PORTB
bsf LED0
;................................................................
Main
clrwdt
goto Main
;................................................................
Interp
retfie
;................................................................
END
Programa UD2prg2
;;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; ROUTINE DE RETRASO EJEMPLO 1
;======================================================================
TITLE ‘UD2prg2’
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
;................................................................
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
FR01 EQU 0CH
FR02 EQU 0DH
FR03 EQU 0EH
FR04 EQU 0FH
;................................................................
#define LED0 PORTB,0
#define LED1 PORTB,1
;................................................................
ORG 0
goto Start
nop
nop
nop
goto Interp
;................................................................
Delay movlw .20
movwf FR01
movlw .177
Del0 movwf FR02
Del1 clrwdt
nop
decfsz FR02
goto Del1
decfsz FR01
goto Del0
return
;................................................................
Start bsf STAT,5
movlw b’0010'
movwf TR_A
movlw b’00000000'
movwf TR_B
clrf INTCON
bcf STAT,5
clrf PORTA
clrf PORTB
bsf LED0
;................................................................
movlw .5
movwf FR04
Rit1 movlw .50
movwf FR03
Rit2 call Delay
decfsz FR03
goto Rit2
decfsz FR04
goto Rit1
bsf LED1
Main
clrwdt
goto Main
;................................................................
Interp
retfie
;................................................................
END
Programa UD2prg3
;======================================================================

; DL3155M24 DE LORENZO ROZZANO (MI) ITALY


;
; ROUTINE DE RETRASO EJEMPLO 2
;================================================================
TITLE ‘UD2prg3’
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
;................................................................
RTCC EQU 01H
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
OPTIO EQU 81H
FR01 EQU 0CH
FR02 EQU 0DH
FR03 EQU 0EH
;................................................................
ORG 0
goto Start
nop
nop
nop
goto Interp
;................................................................
Delay clrwdt
movf RTCC,0
SKPZ
goto Delay
movlw .128
movwf RTCC
return
;................................................................
Start bsf STAT,5
movlw b’0010'
movwf TR_A
movlw b’00000000'
movwf TR_B
clrf INTCON
movlw b’11000110'
movwf OPTIO
bcf STAT,5
clrf PORTA
clrf PORTB
;................................................................
movlw .128
movwf RTCC
Rit1 movlw .50
movwf FR03
Rit2 call Delay
decfsz FR03
goto Rit2
movlw b’00000001'
xorwf PORTB,1
goto Rit1
;................................................................
Interp
retfie
;................................................................
END
Programa UD2prg4
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; PULSADOR ANTIREBOTE
;================================================================
TITLE ‘UD2prg4’
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
;................................................................
RTCC EQU 01H
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
OPTIO EQU 81H
FR01 EQU 0CH
FR02 EQU 0DH
FR03 EQU 0EH
;................................................................
#define LED0 PORTB,0
#define P2 PORTA,1
;................................................................
ORG 0
goto Start
nop
nop
nop
goto Interp
;................................................................
Dela2M bcf FR03,0
bsf FR03,1
Waims clrwdt
btfsc P2
bsf FR03,0
btfss P2
bcf FR03,1
movf RTCC,0
SKPZ
goto Waims
movlw .128
movwf RTCC
return
;................................................................
Start bsf STAT,5
movlw b’0010'
movwf TR_A
movlw b’00000000'
movwf TR_B
clrf INTCON
movlw b’11000110'
movwf OPTIO
bcf STAT,5
clrf PORTA
clrf PORTB
movlw .128
movwf RTCC
;................................................................
Main call Dela2M
btfss FR03,0
goto Accend
btfsc FR03,1
goto Spegni
goto Main
Accend bsf LED0
goto Main
Spegni bcf LED0
goto Main
;................................................................
Interp
retfie
;................................................................
END
Programa UD2prg5
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; GESTION EEPROM
;================================================================
TITLE ‘UD2prg5’
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
;................................................................
RTCC EQU 01H
PCL EQU 02H
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
EDATA EQU 08H
EADR EQU 09H
ECON1 EQU 88H
ECON2 EQU 89H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
OPTIO EQU 81H
;................................................................
FR01 EQU 0CH
FR02 EQU 0DH
FR03 EQU 0EH
;................................................................
#define P1 PORTB,7
#define P2 PORTB,6
#define P3 PORTB,5
#define P4 PORTB,4
;................................................................
ORG 0
goto Start
nop
nop
nop
goto Interp
;................................................................
Leggi clrf EADR
bsf STAT,5
bsf ECON1,0
bcf STAT,5
nop
movf EDATA,0
movwf PORTB
return
;................................................................
Delay bcf FR01,7
bcf FR01,6
bcf FR01,5
bcf FR01,4
Lpdel clrwdt
btfsc P1
bsf FR01,7
btfsc P2
bsf FR01,6
btfsc P3
bsf FR01,5
btfsc P4
bsf FR01,4
movf RTCC,0
SKPZ
goto Lpdel
movlw .128
movwf RTCC
return
;................................................................
Memo clrf EADR
movf PORTB,0
movwf EDATA
bsf STAT,5
bsf ECON1,2
movlw 55H
movwf ECON2
movlw 0AAH
movwf ECON2
bsf ECON1,1
Lpw1 clrwdt
btfss ECON1,4
goto Lpw1
bcf ECON1,4
bcf STAT,5
Ril call Delay
btfss P1
goto Ril
btfss P2
goto Ril
btfss P3
goto Ril
btfss P4
goto Ril
goto Main
;................................................................
Start bsf STAT,5
movlw b’0000'
movwf TR_A
movlw b’11110000'
movwf TR_B
clrf INTCON
movlw b’01000110'
movwf OPTIO
bcf STAT,5
movlw .128
movwf RTCC
movlw b’0000'
movwf PORTA
call Leggi
;................................................................
Main call Delay
btfss FR01,7
goto Puls1
btfss FR01,6
goto Puls2
btfss FR01,5
goto Puls3
btfss FR01,4
goto Puls4
goto Main
Puls1 movlw b’11110001'
movwf PORTB
goto Memo
Puls2 movlw b’11110010'
movwf PORTB
goto Memo
Puls3 movlw b’11110100'
movwf PORTB
goto Memo
Puls4 movlw b’11111000'
movwf PORTB
goto Memo
;................................................................
Interp
retfie
;................................................................
END
EXPERIMENTACIÓN
introducir el Modulo 24 en la consolle y colocar en ON el interruptor general;
conectar, a travèz de un cable de conexiones, la puerta paralela de el PC a el Modulo 24;
Utilizar el PC, escribir los siguientes programas con un editor ASCII e introducir el comentario para cada
una de las rayas o lineas;
UD2prg1.ASM
UD2prg2.ASM
UD2prg3.ASM
UD2prg4.ASM
UD2prg5.ASM
salvar los programas en formato txt en la directory de el trabajo con los nombres UD2 prg1. ASM, UD2
prg2. ASM, UD2 prg3. ASM, UD2 prg4. ASM, UD2 prg5. ASM
redactar los programas UD2 prg1. ASM, UD2 prg2. ASM, UD2 prg3. ASM, UD2 prg4. ASM, UD2 prg5.
ASM;
transferir un programa a la vèz en el PIC como se encuentra explicado en la U.D.1;
conectar el circuito como en la Fig. 2.2;
Observar lo que pasa o mejor dicho los acontecimientos para cada uno de los programas, hacer un
comentario de los resultados y dibujar el diagrama de flujo (flow - chart);
NOTA: utilizar la tecla o el botòn de Reset para comenzar de nuevo el programa.
Remover todas las conexiones.
Página blanca
Unidad N.3: Teclado de matriz 4x4
Objectivos: Gestiòn de un teclado de matriz formada por 4 rayas y 4 columnas

Requisitos: Adquisiciòn de la Guìa Teòrica

Adquisiciòn de las U.D.1 y U.D.2 (Guìa para las operaciones)

Instrumentos: Pc con sistema de operaciòn WINDOWS 95 o superior


Redactor Assembler MPASWIN. EXE (Microchip)
Software DL 3155M24SW
Cable de comunicaciòn (puerta paralela)
Set o conjunto de cables pequeños
Página blanca
Teclado de matriz 4x4

Esquema eléctrico

Fig. 3.1

Lista de componentes
RS1 = Rete resistiva SIL 330Ω - 1/4W - 2% - 9 pin
TECLADO CON MATRIZ CON 16 TECLAS (4X4)
Esquema topográfico

Fig. 3.2

Programa UD3prg1
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; Control de un teclado con matriz 4x4
;======================================================================
TITLE ‘UD3prg1’
PROCESSOR 16F84
INCLUDE “P16F84.INC”
LIST F=INHX8M
;................................................................
PORT_B EQU 06
PORT_A EQU 05
PIC84 EQU 03FF
;................................................................
Init ORG 0000H
MOVLW b’11110000'
TRIS PORT_B
MOVLW b’00000000'
TRIS PORT_A
BSF PORT_B,0
BSF PORT_B,1
BSF PORT_B,2
BSF PORT_B,3
;................................................................
Main
BCF PORT_B,0
BTFSS PORT_B,4
MOVLW d’1'
BTFSS PORT_B,5
MOVLW d’4'
BTFSS PORT_B,6
MOVLW d’7'
BTFSS PORT_B,7
MOVLW d’15'
;................................................................
BSF PORT_B,0
BCF PORT_B,1
BTFSS PORT_B,4
MOVLW d’2'
BTFSS PORT_B,5
MOVLW d’5'
BTFSS PORT_B,6
MOVLW d’8'
BTFSS PORT_B,7
MOVLW d’0'
;................................................................
BSF PORT_B,1
BCF PORT_B,2
BTFSS PORT_B,4
MOVLW d’3'
BTFSS PORT_B,5
MOVLW d’6'
BTFSS PORT_B,6
MOVLW d’9'
BTFSS PORT_B,7
MOVLW d’14'
;................................................................
BSF PORT_B,2
BCF PORT_B,3
BTFSS PORT_B,4
MOVLW d’10'
BTFSS PORT_B,5
MOVLW d’11'
BTFSS PORT_B,6
MOVLW d’12'
BTFSS PORT_B,7
MOVLW d’13'
BSF PORT_B,3
;................................................................
MOVWF PORT_A
GOTO Main
ORG PIC84
GOTO Init
;................................................................
END

EXPERIMENTACIÓN
introducir el Mòdulo 24 en la consolle y colocar en ON el interruptor general;
conectar, a travèz de un cable de conexiòn, la puerta paralela de el PC en el Modulo 24;
utilizar el PC y escribir el siguiente programa a travèz de un editor ASCII:
UD3prg1.ASM
salvar el programa en un formato txt en la directory de trabajo con el nombre UD3prg1.ASM;
redactar el programa UD3 prg1. ASM;
transferir el programa en el PIC como se encuentra explicado en la U.D.1;
conectar el circuito como està representado en la Fig.3.2 y colocar S1 sobre ON;
observar los acontecimientos, comentar los resultados y dibujar el diagrama de flujo (flow - chart);
Remover todas las conexiones.
Página blanca
Unidad N.4: Display
Objectivos: Gestiòn de un display con 7 segmentos

Gestiòn de dos display en multiplexer

Gestiòn display alfanùmerico LCD

Requisitos: Adquisiciòn de la Guìa Teòrica

Adquisiciòn de las U.D.1, U.D.2 y U.D.3 (Guìa para las operaciones)

Instrumentos: Pc con sistema WINDOWS 95 o superior


Redactor Assembler MPASWIN. EXE (Microchip)
Software DL 3155M24SW
Cable de comunicaciòn (puerta paralela)
Set o conjunto de cables pequeños
Página blanca
Display

Esquema eléctrico

Fig. 4.1a (Display con 7 segmentos)


Fig. 4.1b (2 display en multiplexer)

Fig. 4.1c (LCD 16x2)


Lista de componentes
R1 = 100Ω - 1/4W - 5%
R2, R3 = 1kΩ - 1/4W - 5%
R4 = 10kΩ - Trimmer con multiplos giros
R5 = 470Ω - 1/4W - 5%
C1 = 33pF estrato multiplo
RS1 = Red resistiva DIL 220Ω - 1/4W - 2%
V1 = TIL 311
V2, V3 = HD1105 Display LED con anodo comùn
V4, V5 = BC327
Display LCD alfanùmerico dos lineas - 16 letras
S1 = Desviador

Esquema topográfico

Fig. 4.2a (Display con 7 segmentos)


Fig. 4.2b (2 display en multiplexer)

Fig. 4.2c (LCD 16x2)


Programa UD4prg1
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; GESTION DE UN DISPLAY CON 7 SEGMENTOS
;================================================================
TITLE ‘UD4prg1’
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
;................................................................
RTCC EQU 01H
PCL EQU 02H
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
OPTIO EQU 81H
;................................................................
FR01 EQU 0CH
FR02 EQU 0DH
;................................................................
ZER_O EQU 003H
UNO EQU 09FH
DUE EQU 025H
TRE EQU 00DH
QUATT EQU 099H
CINQUE EQU 049H
SEI EQU 041H
SETTE EQU 01FH
OTTO EQU 001H
NOVE EQU 009H
;................................................................
ORG 0
goto Start
nop
nop
nop
goto Interp
;................................................................
Delay clrwdt
movf RTCC,0
SKPZ
goto Delay
movlw .128
movwf RTCC
return
;................................................................
Displa movf FR02,0
addwf PCL,1
retlw ZER_O
retlw UNO
retlw DUE
retlw TRE
retlw QUATT
retlw CINQUE
retlw SEI
retlw SETTE
retlw OTTO
retlw NOVE
;................................................................
Start bsf STAT,5
movlw b’0000'
movwf TR_A
movlw b’00000000'
movwf TR_B
clrf INTCON
movlw b’11000100'
movwf OPTIO
bcf STAT,5
movlw .128
movwf RTCC
movlw b’0000'
movwf PORTA
movlw b’11111111'
movwf PORTB
;................................................................
Main clrf FR02
Main1 call Displa
movwf PORTB
movlw .200
movwf FR01
Loop call Delay
decfsz FR01
goto Loop
incf FR02
movlw .10
xorwf FR02,0
btfss STAT,2
goto Main1
goto Main
;................................................................
Interp
retfie
;................................................................
END

Programa UD4prg2
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; GESTION DE 2 DISPLAY EN MULTIPLEXER
;================================================================
TITLE ‘UD4prg2’
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
LIST F=INHX8M
;................................................................
RTCC EQU 01H
PCL EQU 02H
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
OPTIO EQU 81H
;................................................................
FR01 EQU 0CH
FR02 EQU 0DH
FR03 EQU 0EH
;................................................................
#define DISP1 PORTA,0
#define DISP2 PORTA,1
;................................................................
ZER_O EQU 003H
UNO EQU 09FH
DUE EQU 025H
TRE EQU 00DH
QUATT EQU 099H
CINQUE EQU 049H
SEI EQU 041H
SETTE EQU 01FH
OTTO EQU 001H
NOVE EQU 009H
;................................................................
ORG 0
goto Start
nop
nop
nop
goto Interp
;................................................................
Delay clrwdt
movf RTCC,0
SKPZ
goto Delay
movlw .128
movwf RTCC
return
;................................................................
Displa addwf PCL,1
retlw ZER_O
retlw UNO
retlw DUE
retlw TRE
retlw QUATT
retlw CINQUE
retlw SEI
retlw SETTE
retlw OTTO
retlw NOVE
;................................................................
Visual movf FR02,0
call Displa
movwf PORTB
bcf DISP1
call Delay
bsf DISP1
movf FR03,0
call Displa
movwf PORTB
bcf DISP2
call Delay
bsf DISP2
movlw b’11111111'
movwf PORTB
return
;................................................................
Start bsf STAT,5
movlw b’0000'
movwf TR_A
movlw b’00000000'
movwf TR_B
clrf INTCON
movlw b’11000100'
movwf OPTIO
bcf STAT,5
movlw .128
movwf RTCC
movlw b’1111'
movwf PORTA
movlw b’11111111'
movwf PORTB
;................................................................
Main clrf FR02
movlw .9
movwf FR03
Main1 movlw .100
movwf FR01
Loop call Visual
decfsz FR01
goto Loop
incf FR02
decf FR03
movlw .10
xorwf FR02,0
btfss STAT,2
goto Main1
goto Main
;................................................................
Interp
retfie
;................................................................
END

Programa UD4prg3
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; GESTION DE DISPLAY ALFANUMERICO LCD 16x2
;================================================================
TITLE ‘UD4prg3’
PROCESSOR 16F84
RADIX DEC
LIST F=INHX8M
;................................................................
RTCC EQU 01H
PCL EQU 02H
STAT EQU 03H
PORTA EQU 05H
PORTB EQU 06H
EDATA EQU 08H
EADR EQU 09H
ECON1 EQU 88H
ECON2 EQU 89H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
OPTIO EQU 81H
;................................................................
FR01 EQU 0CH
FR02 EQU 0DH
;................................................................
#define RP0 STAT,5
#define CLK PORTA,3
#define RW PORTA,2
#define RS PORTA,1
;................................................................
ORG 0
goto Start
ORG 4
retfie
;................................................................
Delay movlw .20
movwf FR01
movlw .177
Del0 movwf FR02
Del1 clrwdt
nop
decfsz FR02
goto Del1
decfsz FR01
goto Del0
return
;................................................................
Clock2 bcf CLK
bsf CLK
bcf CLK
movlw .50
movwf FR01
Delc0 movwf FR02
Delc1 nop
clrwdt
nop
decfsz FR02
goto Delc1
decfsz FR01
goto Delc0
return
;................................................................
Reslcd bcf RW
bcf RS
movlw 038H
movwf PORTB
call Clock2
movlw 01H
movwf PORTB
call Clock2
movlw 0EH
movwf PORTB
call Clock2
return
;................................................................
Write movwf PORTB
bsf RS
call Clock2
bcf RS
movlw 06H
movwf PORTB
call Clock2
return
;................................................................
Start bsf STAT,5
movlw b’0000'
movwf TR_A
movlw b’00000000'
movwf TR_B
clrf INTCON
movlw b’01000110'
movwf OPTIO
bcf STAT,5
movlw .128
movwf RTCC
;................................................................
Main call Delay
call Reslcd
movlw ‘D’
call Write
movlw ‘L’
call Write
movlw ‘3’
call Write
movlw ‘1’
call Write
movlw ‘5’
call Write
movlw ‘5’
call Write
movlw ‘M’
call Write
movlw ‘2’
call Write
movlw ‘4’
call Write
movlw ‘ ‘
call Write
movlw ‘U’
call Write
movlw ‘.’
call Write
movlw ‘D’
call Write
movlw ‘.’
call Write
movlw ‘0’
call Write
movlw ‘4’
call Write
movlw 0C0H
movwf PORTB
call Clock2
movlw ‘D’
call Write
movlw ‘i’
call Write
movlw ‘s’
call Write
movlw ‘p’
call Write
movlw ‘l’
call Write
movlw ‘a’
call Write
movlw ‘y’
call Write
movlw ‘ ‘
call Write
movlw ‘L’
call Write
movlw ‘C’
call Write
movlw ‘D’
call Write
movlw ‘ ‘
call Write
movlw ‘1’
call Write
movlw ‘6’
call Write
movlw ‘x’
call Write
movlw ‘2’
call Write
Lpatt clrwdt
goto Lpatt
;................................................................
END

EXPERIMENTACIÓN
introducir el Mòdulo 24 en la consolle y colocar en ON el interruptor general;
conectar, a travèz de un cable de conexiòn, la puerta paralela de el PC en el Modulo 24;
utilizar el PC y escribir los siguientes programas a travèz de un editor ASCII:
UD4prg1.ASM
UD4prg2.ASM
UD4prg3.ASM
salvar el programa en un formato txt en la directory de trabajo con los nombres UD4prg1. ASM, UD4
prg2. ASM, UD4 prg3. ASM;
Redactar los programas UD4prg1. ASM, UD4 prg2. ASM, UD4 prg3. ASM;
Transferir un programa a la vèz en el PIC como se encuentra explicado en el U.D.1;
Conectar los correspondientes circuitos como se encuentra representado en la Fig.4.2;
Observar los acontecimientos en cada uno de los programas, comentar los resultados y dibujar el diagrama
de flujo (flow - chart) para cada programa;
Remover todas las conexiones.
Unidad N.5: Mini PLC (2 input - 4 output)
Objectivos: Gestiòn de un mini PLC con: 2 entradas ON/OFF, 2 salidas RELE, 1 salida
ESTATICA y 1 salida (BUZZER)
Activaciòn de 2 relè a travèz de 2 pulsadores externos
Generador de el señal B.F.
Generador de un señal PWM (Pulse Width Modulation)

Requisitos: Acquisiciòn de la Guìa Teòrica

Acquisiciòn de las unidades didàcticas anteriores

Instrumentos: PC con sistema de operaciòn WINDOWS 95 o superior


Redactor Asembler MPASWIN.EXE (Microchip)
Software DL 3155M24SW
Cable de comunicaciòn (puerta paralela)
Set de cables pequeños.
Página blanca
Mini PLC (2 input - 4 output)

Esquema eléctrico

Fig. 5.1a (Activaciòn de 2 relè a travèz de 2 pulsadores)

Fig. 5.1b (Generador de señal B.F.)


Fig. 5.1c (Generador de señal PWM)

Lista de componentes
R1, R3 = 3.9kΩ - 1/4W - 5%
R2, R4 = 1.5kΩ - 1/4W - 5%
R5, R6, R8, R11, R14 = 22kΩ - 1/4W - 5%
R7, R10, R13 = 10kΩ - 1/4W - 5%
R9 = 1.5kΩ - 1/4W - 5%
R12, R15 = 330Ω - 1/4W - 5%
CHECK IN 1, IN 2, OUT 1, OUT 2, OUT 3 = diodos LED rojos
V1, V2, V3, V4, V5, V6, V7, V8, V13, V15 = DIODI 1N4148
V11 = DIODO FAST 1N4935
V9, V12, V14 = BC337
V10 = TIP122
N1, N2 = Fotocopiadores 4N35
K1, K2 = Relé DIL en miniatura, tensiòn nominal 5V DC dos coctactos de cambio
B1= MINI BUZZER

Esquema topográfico
Fig. 5.2a (Activaciòn de 2 relè a travèz de 2 pulsadores)

Fig. 5.2b (Generador de señal B:F.)


Fig. 5.2c (Generador de señal PWM)

Programa UD5prg1
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; ACTIVACION DE 2 RELE' A TRAVEZ DE 2 PULSADORES EXTERNOS
;================================================================
TITLE ‘UD5prg1’
PROCESSOR 16F84
INCLUDE “P16F84.INC”
LIST F=INHX8M
;................................................................
PORT_A EQU 05
PORT_B EQU 06
COUNT_1 EQU 0C
COUNT_2 EQU 0D
PIC84 EQU 03FF
STATUS EQU 03
CARRY EQU 00
USCITA EQU 0E
P1 EQU 02
P2 EQU 03
RL1 EQU 00
RL2 EQU 01
RLSTATUS EQU 0F
;................................................................
Init ORG 0000H
MOVLW 00
MOVLW B’11111100'
TRIS PORT_A
MOVLW 0FF
MOVWF COUNT_1
MOVLW 0FF
MOVWF COUNT_2
MOVLW 00
MOVWF RLSTATUS
MOVF RLSTATUS,0
MOVWF PORT_A
CALL Delay
;................................................................
Main BTFSS PORT_A,P2
CALL Rele1
BTFSS PORT_A,P1
CALL Rele2
MOVF RLSTATUS,0
MOVWF PORT_A
CALL Delay
GOTO Main
;................................................................
Rele1 MOVF RLSTATUS,0
XORLW B’00000001'
MOVWF RLSTATUS
RETURN
;................................................................
Rele2 MOVF RLSTATUS,0
XORLW B’00000010'
MOVWF RLSTATUS
RETURN
;................................................................
Delay DECFSZ COUNT_1,1
GOTO Delay
MOVLW 0FF
MOVWF COUNT_1
DECFSZ COUNT_2,1
GOTO Delay
MOVLW 0FF
MOVWF COUNT_1
MOVLW 0FF
MOVWF COUNT_2
RETURN
;................................................................
ORG PIC84
GOTO Init
;................................................................
END
Programa UD5prg2
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; GENERADOR DE EL SEñAL B.F.
;================================================================
TITLE ‘UD5prg2’
PROCESSOR 16F84
INCLUDE “P16F84.INC”
LIST F=INHX8M
;................................................................
PORT_A EQU 05
PORT_B EQU 06
TMR0 EQU 01
COUNT_1 EQU 0C
COUNT_2 EQU 0D
PIC84 EQU 03FF
STATUS EQU 03
INTCON EQU 0BH
TMR0 EQU 01H
OPT EQU 01
;................................................................
#define SUONO 0B9
;................................................................
Int ORG 04
MOVF PORT_A,0
XORLW 01
MOVWF PORT_A
MOVLW SUONO
MOVWF TMR0
BCF INTCON,2
BSF INTCON,7
RETFIE
;................................................................
Init ORG 0050H
BSF STATUS,5
BCF OPT,5
BCF OPT,3
BSF OPT,0
BSF OPT,1
BCF OPT,2
BCF STATUS,5
BSF INTCON,5
MOVLW SUONO
MOVWF TMR0
MOVLW 00
TRIS PORT_B
MOVLW 018H
TRIS PORT_A
BSF INTCON,7
;................................................................
Main NOP
NOP
GOTO Main
ORG PIC84
GOTO Init
;................................................................
END
Programa UD5prg3
;======================================================================
; DL3155M24 DE LORENZO ROZZANO (MI) ITALY
;
; GENERADOR DE EL SEÑAL PWM
;================================================================
TITLE ‘UD5prg3’
PROCESSOR 16F84
RADIX DEC
LIST F=INHX8M
;................................................................
FZERO EQU 00H
RTCC EQU 01H
PCL EQU 02H
STAT EQU 03H
FSR EQU 04H
PORTA EQU 05H
PORTB EQU 06H
EDATA EQU 08H
EADR EQU 09H
ECON1 EQU 88H
ECON2 EQU 89H
INTCON EQU 0BH
TR_A EQU 85H
TR_B EQU 86H
OPTIO EQU 81H
;................................................................
REG1 EQU 0CH
REG2 EQU 0DH
FREQUE EQU 0EH
DUTYC EQU 0FH
;................................................................
#define RP0 STAT,5
#define CARRY STAT,0
#define ZER STAT,2
#define OUTPWM PORTB,0
;................................................................
ORG 0
goto Start
ORG 4
retfie
;................................................................
Start bsf STAT,5
movlw b’0000'
movwf TR_A
movlw b’11110000'
movwf TR_B
clrf INTCON
movlw b’01000110'
movwf OPTIO
bcf STAT,5
movlw .128
movwf RTCC
;................................................................
Main movlw .242
movwf FREQUE
movf PORTB,W
andlw b’11110000'
iorlw b’00000001'
movwf DUTYC
subwf FREQUE,1
bsf OUTPWM
Lpb1 decfsz DUTYC
goto Lpb1
bcf OUTPWM
clrwdt
Lpb2 decfsz FREQUE
goto Lpb2
clrwdt
goto Main
;................................................................
END
EXPERIMENTACIÓN
introducir el Mòdulo 24 en la consolle y colocar en ON el interruptor general;
conectar, a travèz de un cable de conexiòn, la puerta paralela de el PC en el Modulo 24;
utilizar el PC y escribir los siguientes programas a travèz de un editor ASCII:
UD5prg1.ASM
UD5prg2.ASM
UD5prg3.ASM
salvar el programa en un formato txt en la directory de trabajo con los nombres UD5prg1.ASM,
UD5prg2.ASM, UD5prg3.ASM;
Redactar los programas UD5prg1.ASM, UD5prg2.ASM, UD5prg3.ASM;
Transferir un programa a la vèz en el PIC como se encuentra explicado en el U.D.1;
Conectar los correspondientes circuitos como se encuentra representado en la Fig.5.2;
Observar los acontecimientos en cada uno de los programas, comentar los resultados y dibujar el diagrama
de flujo (flow - chart) para cada programa;
Remover todas las conexiones.
© 1996 - 2000 DE LORENZO SRL - Printed in Italy - All right reserved

DE LORENZO SRL
V.le Romagna, 20 - 20089 Rozzano (MI) Italy
Tel. ++39 02 8254551 - Telefax ++39 02 8255181
E-mail: delorenzo@delorenzo.it
Web site: www.delorenzogroup.com

You might also like