Sie sind auf Seite 1von 166

CURSO INTEGRAL SOBRE MICROCONTROLADORES

CURSO INTEGRAL
PIC

Las mejores cosas de la vida son


gratis!!!
Este curso es un obsequio de WELGOS
electrnica para todas las personas
interesadas en esta tecnologa.

En uno de los captulos se describe la


construccin de una tarjeta programadora in
circuit. Si le interesa sonstruirla, el software
del PIC y de la computadora puede solicitarlos
por medio de correo electrnico.

Disfrtenlo!!!!!

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

CURSO INTEGRAL
PIC
Captulo 1
Introduccin a los microcontroladores PIC

Los microcontroladores PIC son circuitos integrados producidos por la empresa


Microchip Technology Inc., que pertenecen a la categora de microcontroladores,
debido a que en este componente se han integrado todos los circuitos necesarios
para realizar un completo sistema digital programable.
Como se puede ver en la figura,

el PIC (en este caso un PIC16F84A) posee una apariencia externa que no lo
diferencia de otro integrado TTL o CMOS, pero internamente dispone de todo lo
correspondiente a un sistema de microprocesadores:
* Una CPU (Central Processor Unit) la cual es la unidad central que esta en
capacidad de interpretar las instrucciones del programa.
* Una memoria FLASH en donde se memoriza de manera permanente las
instrucciones del programa a seguir.
* Una memoria RAM (Random Access Memory) utilizada para memorizar las
variables utilizadas en el programa.
* Una serie de lneas de I/O (Input/Output) que permite el ingreso y la lectura de
dispositivos externos o para recibir seales de sensores, pulsadores, etc.
* Una serie de dispositivos auxiliaries al funcionamiento como la generacin de reloj,
buses, contadores, etc.
La presencia de todos estos dispositivos en un espacio tan supremamente reducido,
nos proporciona una gran ventaja frente a sistemas basados en microprocesadores.
Los microcontroladores PIC se encuentran disponibles en una amplia gama de
modelos, que se diferencian por el nmero de lneas I/O y los perifricos internos del
dispositivo.
Cada modelo posee su referencia, los ms bsicos se identifican por las siglas
PIC12C5xx y solo poseen 8 pines, y los ms avanzados se identifican por la sigla
PIC18Cxx y est dotados de hasta 40 pines.

En la pgina web de la Microchip se encuentra una descripcin completa de todos los


tipos de microcontroladores PIC, adems de notas de aplicacin y soporte.

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Parta este curso vamos a trabajar con los PIC16F84A, los cuales estn dotados de 18
pines.

Estos microcontroladores disponen de una memoria interna para almacenar el


programa que es de tipo FLASH, la cual puede reescribirse muchsimas veces, lo cual
los hace ideales para experimentos.

En la siguiente figura se muestra el diagrama de pines del PIC16F84A.

Los pines mostrados en azul corresponden a pines I/O diponibles para nuestra
aplicacin, los pines en rojo y negro corresponden a los de alimentacin y los verdes
son reservados para el funcionamiento del microcontrolador (MCLR para el reset, y
los OSC1-2 son para el reloj).

1.1 Realizando una sencilla activacin de un


led
Pasemos de una vez a desarrollar una sencilla aplicacin prctica con
microcontroladores PIC. Se trata de un circuito muy simple para activar un diodo
LED.

Veremos paso a paso, como se escribe un programa en assembler, como se compila


y como se transfiere a la memoria FLASH interna del microcontrolador PIC para
ponerlo a trabajar.

Monte en el entrenador el circuito que se muestra en la siguiente figura:

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Para alimentar el circuito es necesario disponer de un voltaje DC constante de 5


voltios, la cual se aplica a el pin Vdd (pin 14) y la tierra se aplica al pin Vss (pin 5).

El pin MCLR (pin 4) sirve para efectuar el reset al PIC microcontrolador.


Normalmente viene mantenido a 5 voltios a travs de una resistencia de pull up (R1)
y se lleva a cero voltios cuando se require aplicar un reset.

ATENCION
Gracias a la circuitera interna del reset interna del microcontrolador, no es necesario
colocar un pulsador para el reset o un circuito RC, pero nunca est dems.

El pin OSC1/CLKIN (pin 16) y el pin OSC2/CLKOUT (pin 15) se conectan con un
circuito interno que genera la frecuencia de reloj utilizada para temporizar todo el
ciclo de funcionamiento interno en el chip. De esta frecuencia depende casi todas las
operaciones internas del microcontrolador, especialmente la velocidad con que el PIC
ejecuta las instrucciones del programa.

En lo personal, cuando doy mis clases de microcontroladores, les digo a mis


estudiantes que hagan la analoga con una escalera elctrica en la cual viajamos,
donde en cada peldao que viajamos ejecutamos una instruccin. Cada
microcontrolador posee una capacidad maxima del cristal, si la escalera se mueve
demasiado rpido podramos caernos. Pero tambin es possible que puede llegar otro
tipo con mayor fortaleza que puede permanecer all.
Es decir, cada microcontrolador posee una cierta capacidad para manejar
determinada frecuencia.
4

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En el caso del PIC16F84A-04/P tericamente puede llegar a un mximo de 4Mhz,


aunque en realidad en la prctica es comn superar apliamente esta frecuencia, lo
que recibe el nombre de overclocking, en lo personal le he aplicado un cristal de 10
MHz (ver convertidor RS-232/ RS-485 half-duplex, en www.wellgos.com) sin tener
ningn problema.

Como en el circuito se tiene un cristal de 4 Mhz y dos condensadores de 22 pF, se


obtiene una velocidad de ejecucin de las instrucciones de 1 milln de instrucciones
por segundo.

El pin RB0 (pin 6) es la lnea I/O que vamos a utilizar para este primer ejercicio. All
se encuentra conectada una resistencia para limitar la corriente y un LED.

1.2 Escritura y compilacin de un programa


en ensamblador
Todo sistema microcontrolador necesita de un programa para hacerlo funcionar. Un
programa se constituye de una secuencia de instrucciones, cada una de las cuales
identifica unvocamente una function que el microcontrolador debe ejecutar.

Cada instruccin se representa por un cdigo operative (en ingles operation code o
abreviadamente opcode) compuesto de 14 bits y que se memoriza en una posicin
de la memoria donde se almacena el programa. En el PIC16F84A posee 1024
posiciones de memoria y el PIC16f877 posee 8K, cada una de las cuales puede
contener una sola instruccin o un dato.

Un ejemplo de un opcode en notaci binaria, puede ser la siguiente:

00 0001 0000 0000

sin embargo es muy probable que el opcode lo vea en su representacin


hexadecimal, as:

0x100

que es exactamente el mismo valor pero en una forma ms breve. El 0x delante de


cualquier valor indica que se trata de una notacin hexadecimal, aunque tambin se
puede representar con la notacin: H'0100'. Este opcode, es completamente privado
para el entendimiento del ser humano, solo el PIC lo puede entender.
Afortunadamente existen algunas herramientas que facilitan trabajar con las
instruciones para su comprensibilidad. Por convencin, se asocia a cada opcode, una
breve sigla. Denominada mnemonica, con la cual se puede recordar la funcin de
cada instruccin.

El opcode 0x100 del ejemplo anterior, efecta el borrado del registro W (enseguida
veremos que significa esto) que en ingles viene indicado con la frase CLEAR W
REGISTER, o sea, borrar el registro W, o en su forma abreviada CLRW. Una
secuencia de estas siglas de acuerdo a ciertas reglas, forman un programa completo
en LENGUAJE ENSAMBLADOR.
5

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Para escribir un programa en lenguaje ensamblador se debe conocer el conjunto de


instrucciones disponibles por el microcontrolador que va a usar (en este caso los
PIC), las reglas sintcticas para definer variables, parmetros, etc., y disponer de un
editor de texto en donde se digita el programa. El archivo de texto con el programa
se denomina fuente.

El paso siguiente consiste en traducer nuestro archive fuente en la secuencia de


instrucciones en formato binario que el PIC puede captar. Este programa se
denomina ensamblador compilado.

En la figura siguiente viene esquematizado el flujo de operaciones y los archivos


generados necesarios para obtener un PIC programado.

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Como se dijo, la primera operacin es la de efectuar la escritura de el programa


fuente en ensamblador y su grabado en un archivo de texto. La extension de este
archivo es .ASM.
Se puede usar un sencillo editor ASCII, como el NOTEPAD de Windows o el
Ultraedit32.

Es posible generar este archivo desde un programa sofisticado como WORD o Star
Office, pero no lo recomiendo mucho, debido a que el formato nativo de estos
programas es .DOC, lo cual puede traer algunos problemas en el formato de los
programas que el compilador puede entender.

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En nuestro primer experimento prctico, utilizaremos el archivo LED.ASM.

El paso siguiente es la compilacin del programa fuente, esto es, la trnasformacin


en opcode del cdigo mnemnico o instrucciones en ensamblador.
El compilador de ensamblador que utilizaremos el programa MPASM.EXE de la
Microchip.

Como se muestra en la figura anterior, adems del archive .ASM, es necesario otro
archivo .INC, el cual es proporcionado por la Microchip. En el caso del PIC84 se
denomina P16F84.INC. Este archivo contiene las definiciones del chip utilizado.

Durante la compilacin, el ensamblador genera una serie de archivos con el mismo


nombre al del archivo fuente pero con distitnas extensiones. Veamos cuales son y
que contiene cada uno de ellos:

.HEX es el archivo que contiene el opcode que se debe grabar en la memoria de


programa del microcontrolador PIC.
.LST es un archive de texto en donde viene reportado el archivo fuente complete y
la correspondiente traduccin en opcode. Este no se utilize para programar el
microcontrolador, pero es extremadamente til para verificar el proceso de
compilacin que ha llevado a cabo el ensamblador.
.ERR contiene la lista errores de compilacin encontrados y el nmero de lnea del
archivo fuente donde se encontr.

Los archivos .LST y .ERR sirven para controlar lo hecho en la compilacin. Solo el
.HEX se utilize para programar el microcontrolador.

El archivo .HEX no viene en formato binario, es un archivo codificado en un formato


inventado por la empresa norteamericana Intel para la descripcin del archivo en
formato ASCII, con el cual se facilita la transferencia a la memoria del
microcontrolador PIC.

1.3 Analizando un archivo fuente


Analicemos lnea por lnea el contenido de nuestro archivo fuente LED.ASM.
Procedamos ahora a analizar el programa lnea por lnea.

Partamod de la primera lnea del cdigo:


PROCESSOR 16F84
PROCESSOR es una directiva del compilador que permite definir para que tipo de
microprocesador vamos a escribir nuestro programa.
Las directives no forman parte del conjunto de instrucciones del microcontrolador
que el compilador convierte en un OPCODE, simplemente son indicaciones de las
cuales se sirve el compilador para determiner el funcionamiento que va a seguir
durante la compilacin.
En este caso le estamos diciendo al compilador que estamos escribiendo un
programa para el PIC16f84.

RADIX DEC

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

La directiva RADIX sirve para informar al compilador cual es la notacin por defecto
que van a tener los diferentes nmeros que se escriban dentro del programa. En este
caso, debido a la palabra DEC, establecemos que los valores numricos se deben
entender como decimales.

Si vamos a especificar, por ejemplo, el nmero hexadecimal 10 (16 en decimal) no


podemos escribir simplemente 10 porque el compilador lo entendera como 10 en
decimal; debemos escribir 0x10 o H10.

ERRORLEVEL -302
Esta directiva sirve para excluir algunos mensajes de error resultantes de la
compilacin. En este caso sirve para evitar que el compilador arroje estos dos tipos
de errores:

Message[302] C:\EPIC\LED.ASM 37 :
Register in operand not in bank 0.
Ensure that bank bits are correct.
Message[302] C:\EPIC\LED.ASM 40 :
Register in operand not in bank 0.
Ensure that bank bits are correct.

Los cuales se detectaron en las lneas 37 y 40 de nuestro cdigo fuente, en donde no


estamos trabajando en el banco de memoria correcto. Ms adelante veremos el
significado real de este error, por ahora sigamos adelante.

INCLUDE "P16F84.INC"
Esta es una directiva muy importante y que vamos a utilizar mucho en nuestros
programas.
Con esta directiva le manifestamos al compilador nuestra intencin de incluir un
segundo archivo a nuestro cdigo fuente denomiando P16F84.INC. El compilaador se
limitar a sustituir la lnea que contiene la directiva INCLUDe con el contenido del
archivo especificado.

LED EQU 0
Otra directiva ! Cuando entraremos a las instrucciones ? Paciencia mi amigo,
paciencia....
La directiva EQU es muy importante, pues nos permite constantes simblicas dentro
de nuestro programa. En este caso la palabra LED en cualquier punto del programa
ser equivalente al valor 0.
El objetivo principal de la directiva EQU es facilitar la lectura y entendimiento de los
programas a un lector desprevenido. Es muy utilizada cuando manejemos banderas,
ms adelante explicaremos este concepto.

Es importante resaltar que la palabra LED no es una variable ms, simplemente es


un nombre simblico vlido durante la compilacin. No es posible escribir una
instruccin donde se asigna a LED el nmero 3.

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Cuando el PIC trabaja dentro de su aplicacin final, solo puede manipular la


informacin suministrada por las instrucciones, no por las directivas.

Veamos ahora la siguiente lnea:


ORG 0x0C
La directiva ORG permite definir una direccin donde el compilador va a ubicar los
datos o las instrucciones siguientes. En este caso vamos a definir un rea de datos
dentro del PIC sobre la cual memorizar diversos datos dirante la ejecucin de
nuestro programa. Esta rea coincide con la RAM del PIC, definida por la Microchip
como el rea de FILE REGISTER.

Esta rea no es otra cosa que la localizacin de la RAM disponible para el usuario y
se encuentra a partir de la direccin 0x0C. Las direcciones de memoria anterioras a
esta no pueden ser utilizadas como casillas de memoria de propsito generalm pues
all se han asignado previamente otros registros especializados para uso interno del
microcontrolador.

Count RES 2
En esta lnea encontramos una etiqueta: Count y una directiva: RES.
La directiva RES le indica al compilador que queremos reservar un cierto nmero de
bytes en el interior del rea de datos; en este caso 2 bytes.

La etiqueta Count, donde Count es un nombre, es una marcacin que en el resto del
cdigo fuente asumir el valor de la direccin donde se ha insertado. Dado que
previamente habamos definido como direccin de inicio la 0x0C (con la directiva
ORG), Count partir desde 0x0C. Si por ejemplo, insertamos una etiqueta en la lnea
inmediatamente sucesiva, esa variable se ubicar en 0x0C + 2, es decir 0x0E.

Una etiqueta se distingue de una constante simblica porque su valor viene calculado
en la fase de compilacin.

ORG 0x00
Esta segunda directiva nos permite sealar una direccin en el rea de la memoria
de programa (FLASH). Desde all se alamacenarn las instrucciones mnemonicas que
el compilador deber convertir em opcodes para el PIC. El primer opcode que el
microcontrolador va a seguir despus de un RESET se memoriza en la posicin 0, por
eso es el valor 0x00 escrito en la ORG.

bsf STATUS,RP0
Al fin la primera instruccin mnemnica completa. El microcontrolador PIC posee una
CPU interna de tipo RISC, donde cada una de sus instrucciones ocupa una sola
posicin de memoria, opcode e incluso parmetros.
En este caso la instruccin bsf (BIT SET FILE REGISTER) pone un uno (estado lgico
alto) el bit contenido en la posicin de RAM especificada. El parmetro STATUS viene
definido en el archivo P16F84.INC a travs de una directiva EQU.

En este archivo se a asignado la direccin 0x03, la cual corresponde a una casilla


reservada en la memoria ram del rea de datos. El parmetro RP0 viene definido en
el archivo P16F84.INC con el valor 0x05h y corresponde al quinto bit del registro

10

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

STATUS. Si se pone un 1 en este bit para cambiar el banco de trabajo y poder


trbajar con los registros TRISA y TRISB, esto lo veremos ms adelante.

movlw B'00011111'
Esta instruccin significa: MOVE LITERAL TO W REGISTER, es decir, mueva un valor
constante hacia el acumulador.

El acumulador es un registro particular utilizado por la CPU en todas las situaciones


donde se efectuen operaciones donde se necesite movimiento de valores de alguna
posicin de memoria.

En la prctica es un registro de apoyo utilizado por la CPU para memorizar


temporalmente un byte.

El valor constante que vamos a memorizar en el acumulador es el 00011111 en


binario. El bit ubicado ms a la derecha es el bit 0 o menos significativo.

En la instruccin siguiente:

movwf TRISA
el valor 00011111 se memoriza en el registro TRISA (al igual que el registro
STATUS, TRISA esta definido en el mismo archivo inc mediante otra directiva EQU)
el cual define el funcionamiento de cada una de las lneas I/O del puerto A.
En particular, cada bit en uno del registro TRISA configura como entrada la
respectiva lnea del puerto A, mientras un 0 lo configura como salida.
En la siguiente tabla se muestra la configuracin realizada en el PIC despus de
ejecutada esta instruccin:

Como podemos ver, los bits 5, 6 y 7 no corresponde a ninguna lnea I/O por lo tanto
el valor con que se configuren no importa.

11

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Las dos instrucciones que siguen determinan el funcionamiento del puerto B del
microcontrolador:

movlw B'11111110'
movwf TRISB
En este caso la definicin de las lneas ser la siguiente:

Note como el valor 0 en el bit 0 del registro TRISB determina la configuracin como
salida de la respectiva lnea del PIC.
En nuestra aplicacin esta lnea se utiliza para manejar el LED.

Ya dijimos que la instruccin movwf TRISB trnasfiere el valor contenido en el


acumulador (inicializado previamente con la instruccin movlw B11111110) al
registro TRISB. El significado de movwf es (en ingls) MOVE W TO FILE REGISTER.

bcf STATUS,RP0
Esta instruccin es muy similar a la bsf vista en uno de los prrafos anteriores. La
diferencia es que en este caso el bit respectivo se pone en uno. La sigla en este caso
quiere decir (en ingls) BIT CLEAR FILE REGISTER.

Desde el punto de vista funcional de este programa, esta instruccin nos permite el
acceso a los registros internos del banco 0. Una descripcin ms detallada de este
proceso lo veremos ms adelante.

bsf PORTB,LED
Con esta instruccin llevamos a cabo la primera operacin en el entorno externo del
PIC, especificamente en la lnea RB0 del integrado. PORTB es una constante definida
en el archivo P16F84.INC que nos permite referenciar el registros correspondiente a
las lneas I/O del puerto B. En cuanto a la palabra LED, recordemos que al inicio del
programa la definimos como 0, por lo que en esta lnea nos estamos refiriendo a la
lnea RB0.
12

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

MainLoop

Esta lnea contiene una etiqueta esto es, una referencia simblica hacia una posicin
de memoria. EL valor de la etiqueta se calcula en la fase de compilacin en base al
nmero de instruccin, a la directiva ORG y a la instruccin que hace reservar
espacio en la memoria del micro. En este caso, si contamos las instrucciones
insertadas a partir de la ltima directiva ORG podriamos calcular que el valor que se
asignar a MainLopp ser 0x07.
El valor que asume la etiqueta es importante pues su objetivo real es el de conocer
la posicin precisa su opcode en la memoria del PIC permitiendo referenciarla en una
determinada posicin de memoria.

En este caso la etiqueta MainLoop se utiliza como punto de ingreso a un ciclo ( del
ingls loop) de encendido y apagado de un LED, es decir, una porcin de cdigo que
se repetir cclica e idefinidamente.

call Delay
Esta instruccin determina una llamada (de ingles call) a una subrutina que inicia en
correspondencia con la etiqueta Delay.

La subrutina es una parte del programa especializada en una funcin muy especfica
que pueda necesitarse repetidamente dentro de un programa. Cada vez que
necesitemos ejecutar esta funcin basta invocar la funcin. En este caso la subrutina
inserta un retardo para darle tiempo al LED de prendido y apagado. Las instrucciones
que componen la subrutina Delay se encuentran ms adelante en el cdigo fuente.

btfsc PORTB,LED
El significado de esta instruccin es BIT TEST FLAG, SKIP IF CLEAR, es decir,
controla el estado de un bit interno de un registro y se salta la instruccin sucesiva si
el valor de dicho bit es cero. El bit que estamos controlando corresponde a la salida
en donde se encuentra conectado el LED. A travs de este test podemos determinar
el estado del led para poder invertirlo, es decir, si se encuentra apagado se prende y
si se encuentra prendido se apaga.

goto SetToZero
Esta instruccin es un salto incondicional (del ingls GO TO, ir a) a la etiqueta
SetToZero donde tenemos las instrucciones para prender el led. Esta instruccin se
saltar las instrucciones sucesivas que sirven para apagar el led.

bsf PORTB,LED
goto MainLoop
Esta dos instrucciones activan el led y retorna el programa al ciclo de parpadeo.
SetToZero
bcf PORTB,LED
goto MainLoop
Esta dos instrucciones apagan el led y retorna el programa al ciclo de parpadeo.

La subrutina Delay
Como se dijo anteriormente, esta subrutina inserta un retardo de casi un segundo y
puede ser llamada desde nuestro cdigo fuente mediante la instruccin call Delay.
Veamos como funciona:
13

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
retlw 0
Delay y DelayLoop son dos etiquetas. Delay identifica la direccin de inicio de la
subrutina y se utiliza para llamar el cuerpo principal del programa. DelayLoop se
invoca internamente dentro de la subrutina y sirve como punto de entrada al ciclo (
del ingls loop) de retardo. En la prctica el retardo se obtiene ejecutando una serie
de instrucciones que no hacen absolutamente nada!

Este tipo de retardo se denomina retardo por software o retardo por programa. Es el
tipo de retardo mas sencillo de implementar y puede ser utilizado cuando podemos
darnos el lujo de que el PIC no tenga que ejecutar otras tareas mientras se
encuentra desarrollando el retardo.
Las instrucciones:
clrf Count
clrf Count+1
CLEAR FILE REGISTER, borran las dos posiciones de RAM que se han reservado
previamente mediante la instruccin:
Count RES 2
Estas dos posiciones son consecutivas y se ubican paratir de la direccin referenciada
por la etiqueta Count.
decfsz Count,1
Esta instruccin significa DECREMENT FILE REGISTER, SKIP IF ZERO, es decir,
decrementa el contenido de un registro (en este caso Count) y se salta la siguiente
instruccin si el valor obtenido es cero. Si el valor obtenido no es cero, se ejecuta la
instruccin consecutiva:
goto DelayLoop
Nos dirige hacia la ejecucin de un ciclo de retardo. Una vez el contador Count ha
llegado a cero, se tienen las instrucciones:
decfsz Count+1,1
goto DelayLoop
que decremetan el registro siguiente hasta que este llegue a cero. El registro
Count+1 en particular se decrementer en una unidad por cada 256 decrementos de
Count. Cuando Count+1 llegue a cero se ejecuta la instruccin:
return
el significado de esta instruccin es RETURN FROM SUBROUTINE, es decir, nos dar
la salida de la rutina de retardo y la posibilidad de continuar con la ejecucin de la
instruccin consecutiva a la instruccin call Delay.

Para finalizar END es una directiva que indica al compilador el fin del cdigo en
asembler.

1.4 Compilando un cdigo en ensamblador


Veamos ahora como es posible efectuar en la prctica la compilacin de un cdigo en
lenguaje ensamblador. El primer paso es crear en el disco duro una carpeta donde
vamos a guardar todos los programas de este curso. Por ejemplo:
C:\WEL
14

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

(Auqnue cualquier otro nombre es vlido). Parsa trabajar adecuadamente es


necesario descargar de internet el compilador MPASM disponible gratuitamente en el
sitio de Microchip en la siguiente direccin:
http://www.microchip.com/1010/pline/tools/archive/other/61/index.htm

El archivo que se debe descargar se llama asm21500.zip (579K) y contiene el


ensamblador MPASM en su versin para Windows (MPASMWIN.EXE) o para
MS/DOS (MPASM.EXE) adems de una serie de utilidades como todos los archivos
.INC los cuales necesitaremos para trabajar con los microcontroladores de Microchip.
Una vez expandido el contenido del archivo asm21500.zip en nuestro directorio de
trabajo podemos abrir el archivo MPASMWIN.EXE cuya presentacin es la siguiente:

Oprimiendo el boton de Browse..." podemos seleccionar de nuestra carpeta de


trabajo el archivo LED.ASM. Luego podemos oprimir el boton "Assemble". El
ensamblador iniciar la compilacin. Al terminar la compilacin obtendremos el
siguiente esquema:

15

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Si vamos al directorio C:\WEL podremos observar un nuevo archivo llamado


LED.HEX, el cual contiene el cdigo objeto que utilizaremos para programar el PIC,
adems de una serie de archivos auxiliares como LED.ERR y LED.LST. Ahora
podemos programar el PIC16F84A con el programa compilado.
1.5 Que programador utilizar?
Para programar los ejemplos presentados en este curso, hay dos opciones ha seguir.
Existen dos modalides para programar los microcontroladores: la serial y la paralela.
La empresa microEngineering Labs Inc. ha desarrollado un programa denominado
EPIC para la programacin paralela y la segunda opcin es utilizando el puerto serial
mediante nuestro programador WELPROG.

Recomendamos el uso de un programador serial (ya sea el WELPROG o el PICStart


PLUs de Microchip). Los usuarios del programador por el puerto paralelo han
manifestado daos en la estructura del puerto, lo que puede implicar no poder
utilizar el puerto paralelo para la impresora.

Las banderas de configuracin del microcontrolador PIC


El microcontrolador PIC dispone de una serie de banderas de configuracin
contenidos en la denominada configuration word. Estas bandera determinan
algunos aspectos del funcionamiento del microcontrolador cuando este sigue un
programa. La configuracin de las banderas se puede establecer dentro del cdigo
fuente mediante la directiva _CONFIG o establecerce en el momento de la
programacin del microcontrolador.

Todos los ejercicios analizados en este curso a exepcin del manejo del tiempo real,
utilizan la siguiente configuracin:
16

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

* Oscilador en modalidad XT. En esta modalidad, el PIC funciona correctamente


con un cristal de cuarzo conectado a los pines OSC1 y OSC2 como se muestra en el
esquema del primer ejemplo.

* Watch Dog Timer Deshabilitado. La funcin del WATCH DOG se explica ms


adelante en este curso. Cuando en alguno de los ejemplos de este curso se vaya a
habilitar, se especificar claramente esta accin.

1.6 Programando el PIC con EPICWIN


Una vez instalado correctamente la tarjeta de programacin abrimos el programa
EPICWIN.EXE, seleccionamos el tipo de microcontrolador que vamos a programar
(PIC16F84A).

Insertamos el PIC en la base del programador teniendo cuidado en la orientacin


como se instale, para lo cual puede guiarse por el screen de la tarjeta. Se carga el
archivo LED.HEX del directorio de trabajo C:\WEL (En el EPICWin se selecciona
"Menu File" y luego "Open"). Por ltimo nos aseguramos que los fusibles de
programacin esten bien configurados.

17

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Es importante seleccionar bien el tipo de oscilador con que vamos a trbaajr. Si


vamos a hacerlo con cristal se debe elegir XT y deshabilitar el watch dog timer. Si
metemos mal estos parmetros, los programas no nos funcionarn. Ms adelante en
este curso veremos ejemplos de cual es la funcin de estos parmetros y cuando
modificarlos.
Finalmente podemos hacer la programacin (Menu "Run" --> "Program"). Si no se
sealan errores en el sistema de programacin tendremos el PIC listo para ser
insertado en el circuito de ejemplo.
Si alimentamos el circuito, podremos ver el LED parpadeando.

1.7 Programando el PIC con WELPROG


PROGRAMADOR In circuit DE MICROCONTROLADORES PIC

El software del programador est escrito en C para DOS, y puede ejecutarse desde
un prompt o lnea de comandos DOS en el ambiente Windows 3.1/95/98 y en
mquinas que poseen procesadores Intel de 286 en adelante.

Caractersticas del programador

Interfaz interactiva
Acepta la variedad de familias de microcontroladores PIC 16xxx
Lectura y escritura de archivos en formato IN8HEX
Chequeo de memoria vaca
18

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Lectura de la memoria de programa y de la palabra de configuracin


Programacin in circuit o dentro de la aplicacin.

TIPOS DE PIC SOPORTADOS POR LA TARJETA


12C508 12C509 16C554 16C556 16C558 16C61 16C62 16C62A 16C62B
16C620 16C620A 16C621 16C621A 16C622 16C622A 16C63 16C63A 16C64
16C64A 16C65 16C65A 16C65B 16C66 16C67 16C71 16C710 16C711
16C72 16C72A 16C73 16C73A 16C73B 16C74 16C74A 16C74B 16C76
16C77 16C84 16F83 16F84 16F84A 16C923 16C924 16CE623 16CE624

Instalacin de la tarjeta

Un programador in circuit se caracteriza por enviar el programa directamente a la


memoria del PIC en cualquier sitio que este se encuentre ubicado.

Esa es la principal diferencia con respecto a los programadores STAND ALONE o


independientes, ellos cuentan con una base tipo ZIF en la cual se inserta el PIC en el
momento de programarlo, luego deben retirarlo del programador e insertarlo dentro
de la aplicacin.

Para utilizar este programador se debe tener a disposicin el prototipo montado, en


el cual se conecta la tarjeta programadora, tal como se muestra en la figura:

PC
Programador prototipo

Para la conexin con el prototipo, la tarjeta cuenta con un conector de seis pines,
cada uno de los cuales deben ser conectados con el PIC objetivo as:

1. MCLR.
2. DATA. Por este pin van los datos de programacin y debe conectarse al pin RB7
del PIC objetivo.
3. CLOCK. Es la seal de reloj, debe conectarse al pin RB6 del PIC a programar.
4. GND. Es la tierra del programador, debe conectarse a la tierra del prototipo.
5. KEY.
6. VCC. En este pin van los voltajes de programacin. Debe conectarse a los pines
12,6 o 14,6 del PIC.

19

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Instalacin del software y gua rpida de programacin

Para instalar el programa debe crear una carpeta en el disco duro del computador
llamada WELGOS y copiar los archivos en esta carpeta, no altera ningn registro de
Windows y de la misma manera, para desinstalarlo solo basta borrar el archivo.

Para ejectar el programa debe ejecutar un prompt de DOS y abrir la carpeta


WELGOS:
Cd welgos
Luego ejecutar la siguiente sintaxis:
WELGOS> progra / com1 (o com2 segn donde lo tenga conectado).

Si la tarjeta no se encuentra conectada al puerto serial, el software no establecer


comunicacin y el programa no se ejecutar.

Si la conexin con la tarjeta y el cable serial est bien instalado, se podr entrar al
pantallazo inicial del programa:
En este pantallazo se indica el PIC actualmente seleccionado, el contenido del buffer
de memoria ( si este an no se ha cargado aparecer el aviso de no definido) , la
palabra de configuracin y un men de opciones. Para seleccionar cada una de las
posibilidades de este men, basta con teclear la letra que se encuentra a la izquierda
de cada opcin entre parntesis, a continuacin analicemos cada uno de los items de
este men.

Seleccionar tipo de PIC


Este programador puede trabajar con toda la familia de microcontroladores PIC
16XXX. Con esta opcin se selecciona el Pic en especfico que se va a trabajar. Al
presionar la tecla T, sale un listado de todos los PICs que se pueden trabajar, para
esa seleccin se debe buscar el dispositivo correcot con las teclas de flecha hacia
arriba y flecha hacia abajo o las teclas Repg. y Avpg. En este pantallazo aparece a
la izquierda el tipo de PIC y a la derecha el tamnao de la memoria de programa de
cada uno de ellos

Leer PIC
Al oprimir la tecla R, se puede leer el contenido de la memoria del micro. Este
proceso se demora unos cuantos segundos. Al cabo de ls cuales aparece un nuevo
men, en el cual aparecen nuevas opciones. La lectura del programa del chip a
quedado almacenado en un espacio de memoria llamado la imagen de entrada.
Entre las nuevas opciones que aparecen se encuentran la de abrir un archivo de
disco, la de escribir en el PIC, establecer palabra de configuracin.
40

20

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Mostrar Buffer
En el buffer se encuentra almacenado un programa en hexadecimal, el cual puede
provenir de la lectura del PIC o de un archivo grabado en disco. Este buffer se puede
visualizar con esta opcin, con la cual se muestran todas las direcciones de
memoria y su contenido.

Contenido del Buffer...........:IMAGEN DE LA MEMORIA DEL PIC

[1] MODO DEL OSCILADOR : XT


[2] WATCH DOG TIMER.: DESHABILITADO
[3] PROTECCION DEL CODIGO: DESHABILITADO
[4] POWER UP TIMER: DESHABILITADO

[D] Buffer dump


[R] LEER PIC
[W] ESCRIBIR EN EL PIC
[F] ESCRIBIR SOLO FUSIBLES
[L] CARGAR ARCHIVO IN8HEX
[V] VERIFICAR PIC
[T] SELECCIONAR TIPO DE PIC
[V] VERIFICAR PIC
[H] PANEL DE PRUEBAS DEL HARDWARE
[K] DESHABILITAR PROTECCION DEL CODIGO

Panel de pruebas del hardware

Con esta opcin se realizan una serie de pruebas para comprobar que la tarjeta est
funcionando correctamente. Aqu se entra a un nuevo men en el cual se permite
variar los voltajes del conector que va hasta el pic objetivo.

Se muestran cinco tipos de pruebas distintas las cuales modifican los voltajes en
cada uno de los pines del conector, de manera que si el aparato presenta alguna falla
en la programacin, el usuario puede llevar a cabo estas pruebas con un multmetro.

Programacin del microcontrolador

El primer paso para programar un microcontrolador es cargar el archivo hexadecimal


resultante de ensamblar el cdigo fuente. Este archivo hexadecimal debe estar en
una de las unidades de la computadora; si pulsa la tecla L, el programa lle permitir
cargar el archivo hexadecimal que desea programar, para lo cual le pide la ubicacin
y el nombre del archivo.

21

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

DIGITE EL NOMBRE DEL ARCHIVO: c:\wel\led.asm

Cuando el archivo ha sido ledo, queda almacenado en un buffer de memoria, por lo


tanto podemos visualizarlo pulsando la letra D.

Despus de que se ha cargado el archivo hexadecimal, se deben establecer los


fusibles de programacin; ellos corresponden a las condiciones bajo las cuales va a
funcionar el sistema. Esos parmetros son: el tipo de oscilador que se va a instalar,
el estado del temporizador watchdog, la habilitacin de la proteccin del cdigo y el
PWRT. En el men aparecen estas opciones para que las modifique de acuerdo a sus
necesidades; como se puede observar, a la izquierda de cada fusible aparece un
nmero ([1], [2], [3] y [4]), oprimiendo cada nmero se modificarn cada uno de
los fusibles. Por ejemplo, si el oscilador se encuentra en RC y oprime la tecla 1 este
fusible cambiar a XT, si lo oprime nuevamente cambiar a INTRC y as
sucesivamente para cada una de las opciones.

Una vez se ha seleccionado el microcontrolador, cargado el archivo hexadecimal y


configurado adecuadamente los fusibles, puede proceder a programar. Para llevar a
cabo este proceso hay que oprimir la tecla W, con la cual se inicia el almacenamiento
del programa en la memoria del PIC. En este momento podr apreciar en la pantalla
como van apareciendo poco a poco las distintas posiciones de memoria llenndose
con los distitnos datos del archivo hexadecimal.

0000: 2813 ....... ....... ..... 306E 0080 306E 008E


0008: 0000 0000 0000 0000 088E 2080 4321 0000
0010: 0B8D 2806 3400 2134 OE40 3456 5639 0050
0018: 304F 34E0 1200 00A0 0789 2234 00B1 0090
0020:

El programa realiza un procedimiento de verificacin para comprobar que en cada


posicin se ha almacenado el dato correcto, para ello compara el dato actual
programado con el dato ledo en el buffer. Al final de la programacin se brinda un
pequeo reporte donde se especifica si han ocurrido errores o si la programacin se
desarroll correctamente.

Si ha ocurrido un error en la programacin de alguna de las posiciones de memoria,


aparecer un asterisco (*) enseguida de la posicin donde se ha presentado la falla.
Finalmente es posible realizar una verificacin total del programa grabado en el
microcontrolador, comparndo este ltimo con el buffer de memoria que permanece
en el buffer de la PC.

22

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;**************************************************
; Programa
; LED.ASM
;
;
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 0x3FF1
LED EQU 0
ORG 0x0C
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 0x00
bsf STATUS,RP0
movlw B'00011111'
movwf TRISA
movlw B'11111110'
movwf TRISB
bcf STATUS,RP0
bsf PORTB,LED
MainLoop
call Delay
btfsc PORTB,LED
goto SetToZero
bsf PORTB,LED
goto MainLoop
SetToZero
bcf PORTB,LED
goto MainLoop
;Subroutines
;Software delay
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END

23

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

LIST
; P16F84.INC Standard Header File, Version 2.00 Microchip Technology,
Inc.
NOLIST
; This header file defines configurations, registers, and other useful
bits of
; information for the PIC16F84 microcontroller. These names are taken to
match
; the data sheets as closely as possible.
; Note that the processor must be selected before this file is
; included. The processor may be selected the following ways:
; 1. Command line switch:
; C:\ MPASM MYFILE.ASM /PIC16F84
; 2. LIST directive in the source file
; LIST P=PIC16F84
; 3. Processor Type entry in the MPASM full-screen interface
;=======================================================================
===
;
; Revision History
;
;=======================================================================
===
;Rev: Date: Reason:
;2.00 07/24/96 Renamed to reflect the name change to PIC16F84.
;1.01 05/17/96 Corrected BADRAM map
;1.00 10/31/95 Initial Release
;=======================================================================
===
;
; Verify Processor
;
;=======================================================================
===
IFNDEF __16F84
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF
;=======================================================================
===
;
; Register Definitions
;
;=======================================================================
===
W EQU H'0000'
F EQU H'0001'
;----- Register Files---------------------------------------------------
---
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'
OPTION_REG EQU H'0081'
24

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

TRISA EQU H'0085'


TRISB EQU H'0086'
EECON1 EQU H'0088'
EECON2 EQU H'0089'
;----- STATUS Bits -----------------------------------------------------
---
IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'
;----- INTCON Bits -----------------------------------------------------
---
GIE EQU H'0007'
EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'
;----- OPTION Bits -----------------------------------------------------
---
NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'
;----- EECON1 Bits -----------------------------------------------------
---
EEIF EQU H'0004'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'
;=======================================================================
===
;
; RAM Definition
;
;=======================================================================
===
__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'
;=======================================================================
===
;
; Configuration Bits
;
;=======================================================================
===
_CP_ON EQU H'000F'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_PWRTE_OFF EQU H'3FFF'
_WDT_ON EQU H'3FFF'
25

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

_WDT_OFF EQU H'3FFB'


_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
LIST

CURSO INTEGRAL
PIC
Captulo 2
Arquitectura interna del PIC16F84A

26

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En la leccin anterior vimos un poco de prctica, ahora pasemos a la teora.


Empezemos estudiando como se estructura internamente un microcontrolador PIC.
En la figura siguiente se muestra un diagrama en bloques simplificado de la
arquitectura interna del PIC16F84A en el cual nos basaremos para las explicaciones
que siguen a continuacin. Los bloques resaltados en amarillo son los que nos
referiremos en la explicacin.
Iniciamos con la memoria de programa (PROGRAM MEMORY) y con la memoria de
datos (REGISTER FILE).

2.1 La Memoria de Programa


La PROGRAM MEMORY es una memoria especial de tipo FLASH, borrable
elctricamente y se utiliza para almacenar el programa que el microcontrolador debe
seguir.

27

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

La capacidad de memoria en este caso es de 1024 posiciones, cada una de las cuales
puede contener un cdigo operativo (opcode) de 14 bits, es decir, una instruccin del
microcontrolador, por lo tanto el microcontrolador puede almacenar un programa de
1024 instrucciones.

Las direcciones reservadas para la memoria de programa van desde la 0x000 hasta
la 0x3FF (0x3FF en hexadecimal equivale a 1023 en decimal).

El microcontrolador PIC solo puede seguir instrucciones memorizadas en estas


posiciones. No puede leer, escribir o cancelar posiciones que sobrepasen este rango.

Para escribir, leer o cancelar estas posiciones es necesario un dispositivo externo


denominado programador. Un ejemplo de este tipo de dispositivos es el EPIC Plus, el
PICSTART de la Microchip o el WELPROG (incluido en este curso).

La primera posicin de memoria, debe contener la primera instruccin que el


microcontrolador debe seguir despus del reset (reinicIo) y por esto se denomina
vector de reset.

Como podemos recordar, en el archivo LED.ASM presentado en la leccin anterior, se


haba insertado la directiva:

ORG 0x00

Para sealizar el inicio del programa. Esta directiva establece el hecho de que la
ejecucin del programa despus de un reset parte desde la direccin 0x000 del rea
de memoria de programa. Despus de la directiva ORG 0x00 se tiene:

bsf STATUS,RP0
que ser la primera instruccin que se ejecuta enseguida.

2.2 Los registros (Register File)


El archivo de registros (REGISTER FILE) es un conjunto de posiciones de memoria
RAM sobre los cuales es posible modificar el contenido sin el auxilio de un
programador externo, simplemente se hace directamente desde el programa que se
est ejecutando en el microcontrolador.

Debido a que el archivo de registros se utiliza normalemente para almacenar las


variables del programa, su contenido es variables durante la ejecucin del programa.

Contrariamente a lo que ocurre con la memoria de programa, el archivo de registros


pierden su contenido cuando el microcontrolador es reiniciado, por lo que es
recomendable inicializar las variables en el inicio del programa. Alguna posiciones
determinadas del archivo de registros vienen con funciones predeterminadas para el
control del hardware del microcontrolador como se muestra en la siguiente figura.

28

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Las posiciones de memoria del


archivo de registros se pueden
direccionar directamente en un
espacio de memoria que va desde
0x00 hasta 0x2F para un total de 48
bytes, denominado pgina 0. Un
segundo espacio de direccionamiento
denominado pgina 1 va desde la
0x80 hasta la 0xAF. Para acceder a
este segundo espacio es necesario
recurrir a dos bits auxiliares
denominados RP0 y RP1
pertenecientes a un registro especial
denominado estado.
Las primera 12 posiciones de la
pgina 0 (0x00 hasta 0x0B) y de la
pgina 1 (desde la 0x80 hasta la
0x8B) son los reservados para
funciones especiales para el
funcionamiento del microcontrolador
y no se pueden utilizar para otras
funciones.

Las 36 posiciones en la pgina 0,


direccionadas desde la 0c0C hasta la
0x2F puede utilizarse libremente en
nuestro programa para memorizar
variables, contadores, etc. En
nuestro ejemplo LED.ASM, la
directiva:

ORG 0x0C
Indica la direccin de inicio del rea
de datos de nuestro programa. La
directiva siguiente:
Count RES 2
Reserva un espacio de dos
posiciones, que el programa utilizar oara memoriza el contador de retardo de la
subrutina Delay.

Los registros especializados del PIC se utilizan de un modo diferente dentro del
programa.

Por ejemplo, se recurre a la copia del registro especializado TRISA (0x85) y TRISB
(0x86) para definir cuales de las lneas I/O son entradas y cuales sern salidas. El
estado lgico de las lneas I/O dependen del valor de los registros PORTA (0x05) y
PORTB (0x06). Algunos registros sirven para reportar el estado del funcionamiento
de los dispositivos internos del microcontrolador o el resultado de operaciones
aritmticas y lgicas. Es necesario conocer exactamente cual es la funcin de cada
uno de los registros especializados y cual es el efecto que se obtiene de manipular
sus contenidos. Para facilitar la manipulacin de los registros especializados,
29

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Microchip proporciona un listado de nombres que identifican cada uno de los


registros mediante un nombre nico relacionados con la direccin correspondiente en
el archivo de registros, dicho listado se guarda en un archivo llamado P16F84.INC.
En nuestro programa LED.ASM el archivo de definiciones se ha insertado mediante la
directiva INCLUDE. Si por ejemplo, vamos a definir la configuracin de las lneas del
puerto B del PIC como salidas, debemos utilizar el registro TRISB. Para ello debemos
referenciar directamente el registro mediante su direccin:
movlw B'00000000'
movwf 0x86
o podemos referenciarlo son su nombre simblico:
movlw B'00000000'
movwf TRISB
lo que podemos hacer gracias a que insertamos la directiva INCLUDE "P16F84.INC"
en nuestro cdigo fuente.

2.3 La ALU

La ALU (acrnimo de Arithmetic and Logic Unit: unidad lgico artimtica) es el


componente ms complejo del microcontrolador em cuanto contiene toda la
30

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

circuitera necesaria para llevar a cabo las funciones de calculo y manipulacin de los
datos durante la ejecucin del programa.

La ALU es un componente presente en todos los microprocesadores y de ella


depende directamente la potencia de calculo del microcontrolador.

La ALU del PIC16F84A puede operar con valores de 8 bit, es decir valores
numricos hasta 255. Existen microprocesadores con una ALU de 16, 32, 64, y ms.
La familia Intel 80386, 486 y Pentium por ejemplo, disponen de una ALU de
32 bits. Naturalmente estos microprocesadores poseen una capacidad de clculo
muy superior a los PIC.

2.4 El Acumulador o registro W

Directamente conectado a la ALU se encuentra el registro W denominado


acumulador. Este registro consiste de una simple posicin de memoria que puede
contener un valor de 8 bits.

La diferencia sustancial que tiene el registro W con otras posiciones de memoria


consiste en que para referenciar al registro W, la ALU no debe hacer un
direccionamiento a la memoria, lo puede hacer directamente.

El registro W se utiliza muy frecuentemente en los programa de microcontroladores.


Observemos un ejemplo prctico. Supongamos que debemos poner en la posicin de
memoria 0xC del archivo de registros el valor de 0x01. No existe en el
microcontrolador una instruccin que nos permita efectuar esta operacin por s
sola; debemos recurrir necesariamente al acumulador y usar una pequea secuencia
de instrucciones.

Veamos por qu:


Como habamos mencionado anteriormente, el opcode de una instruccin no puede
ser mayor de 14 bits, mientras que para llevar a cabo la operacin que deseamos
necesitamos: 8 bits para especificar el valor qie queremos almacenar en la posicin
de memoria, 7 bits para especificar en cual posicin de memoria vamos a insertar
nuestro valor, 6 bits para especificar cual instruccin vamos a utilizar. Todo esto nos
da un total de 8 + 7 + 6 = 21 bits.

Debemos escribir las siguientes dos instrucciones:


movlw 0x01
movwf 0x0C
la primera instruccin carga el registro W con el valor 0x01H con la instruccin
MOVe Literal to W. Luego podemos mover el contenido de la posicin 0x0C con la
instruccin MOVe W to F.

31

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

2.5 El Contador de Programa (PC)

Como habamos mencionado anteriormente, el PIC16F84A inicia la ejecucin del


programa a partir del vector de reset empezando por la instruccin memorizada
en la primera posicin de memoria (direccin 0x000).

Despus de ejecutada esta primera instruccin, pasa a la instruccin siguiente,


memorizada en la posicin 0x001 y as sucesivamente. Si no existiera ninguna
instruccin que pueda influenciar o estar en capacidad este orden de ejecucin, el
PIC seguira ejecutando todas las instrucciones sucesivas hasta llegar a la ltima
posicin de memoria disponible.

Casi todo microprocesador o lenguaje de programacin brinda la posibilidad de


ejecutar instrucciones de salto, con lo que podemos modificar el flujo normal de la
ejecucin del programa en base a las exigencias del programador.

32

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Una de estas instrucciones es la GOTO (del ingls GO TO, ir a), la cual nos permite
cambiar la secuencia de la ejecucin y saltar directamente a otro punto de la
memoria de programa y continuar la ejecucin desde ese punto.

Miremos un ejemplo:
ORG 0x00
Point1
movlw 10
goto Point1

Una vez se reinicia el microcontrolador, se ejecutar la instruccin MOVLW 10,


memorizada en la posicin de memoria 0x000, la cual cargar en el acumulador el
valor decimal 10, luego se pasa a la instruccin GOTO Point1.

Esta instruccin determina un salto incondicional a la posicin de memoria apuntada


por la etiqueta Point1, la cual es de nuevo la 0x000. Este programa no har otra
cosa ms que ejecutar infinitamente estas dos intrucciones.

Durante este ciclo o lazo (loop) para determinar cual es la instruccin siguiente que
se debe ejcutar, el PIC utiliza un registro especial denominado el Contador de
Programa (PROGRAM COUNTER, PC) el cual posee la direccin de la prxima
instruccin que se debe ejecutar.

Este registro se incrementa automticamente con cada instruccin, de esta manera


actualiza la direccin de la siguiente instruccin que se debe ejecutar. En el
momento de un reset, el contador de programa se borra, poniendose de nuevo en
0x000.

La instruccin GOTO permite modificar el contenido del contador de programa para


de esa manera ejecutar el salto hacia un punto en cualquier parte de la memoria de
programa.

2.6 El puntero a la pila (Stack Pointer)


Otra instruccin muy utilizada y que tambin puede modificar el valor del contador
de programa es la instruccin CALL (del ingls llamar) con la cual podemos hacer el
llamado a subrutinas.

Esta instruccin funciona de manera muy similar al GOTO. La diferencia consiste en


el hecho de que despus del salto, el PIC memoriza en un registro especial
denominado la pila (stack) la direccin de la siguiente instruccin que se iba a
ejecutar antes de hacer el salto.

Veamos esto con un ejemplo:


ORG 0x00
Point1
movlw 10
call Point2
33

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

goto Point1
Point2
movlw 11
return

En este caso el PIC despus de ejecutar MOVLW 10, pasa a la instruccin CALL
Point2. Antes de saltar memoriza en la pila la direccin 0x002, que es la direccin
que le sigue a la direccin donde se encuentra CALL. Luego se ejecuta la instruccin
MOVLW 11 y la instruccin RETURN (del ingls retorno). Esta instruccin, como su
nombre lo indica, permite retornar a la instruccin siguiente desde donde se invoc
a CALL, es decir, al punto exacto donde se abond el flujo normal del programa,
acudiendo a la informacin almacenada en la pila.

Lo que acabamos de hace es lo que se denomina una llamada a subrutina. Es decir,


la interrupcin momentanea del flujo normal del programa para invocar la ejecucin
de otro conjunto de instrucciones agrupadas dentro de una unidad denominada
subrutina, y luego retornar al flujo normal de la ejecucin.

La pila recibe ese nombre debido a que en realidad lo podemos asemejar a una
canasta donde apilamos, una sobre otra, distintas direcciones de retorno que se
deben recuperar en un programa, debido al uso de una o varias instrucciones CALL.
Este tipo de memorizacin se denomina LIFO (Last In First Out), en donde el ltimo
elemento almacenado (last in) es necesariamente el primero en salir ( First Out).
Gracias a esta caracterstica, es posible efectuar una serie de instrucciones CALL
anidadas sin perder el flujo normal en el momento en que se encuentre una
instruccin RETURN.

Veamos otro ejemplo:


ORG 0x00
Point1
movlw 10
call Point2
goto Point1
Point2
movlw 11
call Point3
return
Point3
movlw 12
return
En este caso, al efectuar la subrutina Point2, se encuentra otro CALL a la subrutina
Point3. En esta ltima seccin del programa se encuentra un RETURN se entra a la
subrutina Point2 donde se ejecuta el segundo RETURN y de all se retoma el flujo
normal del programa principal.
En este caso se han memorizado dos posiciones en la pila, ya que se ejecutan dos
CALL antes de encontrar un RETURN. El PIC 16F84A dispone de una pila de 8 niveles,
lo que permite 8 llamados anidados.

34

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Es muy importante que en la escritura de un programa, que siempre haya una


instruccin RETURN por cada instruccin CALL. Esto evitar desalineamientos en la
pila que pueden traernos errores de compilacin que pueden ser difciles de detectar.

2.7 Realizando un secuenciador de luces

En este segundo ejercicio vamos a ampliar el primer ejercicio para hacer un


secuenciador de luces con cuatro diodos led. El nuevo programa se ha denominado
SEQ.ASM.

En la siguiente figura se muestra el diagrama esquemtico del nuevo circuito, el cual


como se puede ver, es muy parecido al montaje anterior, con la diferencia que hay
cuatro LED en lugar de uno.

Las lneas utilizadas son RB0 para el primer LED, RB1 para el segundo, RB2 para el
tercero y RB3 para el cuarto. Estos pines debe ser configurados como salidas en el
inicio del programa cambiando las siguientes instrucciones:
movlw B'11111110'
movwf TRISB
por
movlw B'11110000'
movwf TRISB

35

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

en donde los cuatro bits menos significativos, corresponden a las lneas RB0, RB1,
RB2 y RB3. las cuales se configuran como salidas.

En el rea de memoria del archivo de registros (en el cdigo fuente inicia con la
directiva ORG 0x0C) de nuevo se tienen dos bytes reservados para la variable Count
y se reservan otros dos para la etiqueta Shift, la cual utioizaremos para determinar
la secuencia del movimiento del LED. La directiva adicionada es:

Shift RES 1

Antes de emnpezar el ciclo principal (etiqueta MainLoop) inicilizamos el nuevo


registro (Shift) con el valor 00000001B as:
movlw B'00000001'
movwf Shift
En este punto, dentro del ciclo principal de nuestro programa, nos ocuparemos de
transferir el contenido memorizado en el registro Shift sobre el puerto B, obteniendo
la iluminacin del primer LED, as:

movf Shift,W
movwf PORTB
para efectuar el secuenciamiento de la iluminacin de los LED necesitamos rotar el
contenido del registro Shift, con las siguientes instrucciones :
bcf STATUS,C
rlf Shift,F
la primera instruccin borra el bit CARRY del registro de estado, esto se analizar en
la siguiente leccin. La instruccin RLF (Rotate Left F through Carry: rota el registro
a travs del carry) se encarga de rotar hacia la izquierda el contenido del registro. Es
decir, el bit de la posicin 7 pasa a la posicin 6, el de la posicin 6 pasa a la cinco y
as sucesivamente. El bit 0 pasa a ocupar el bit de carry (acarreo) que es un bit
pertenciente a un registro de la CPU denominado STATUS (estado) y el contenido del
carry pasa al bit 7. Es por esta razn que inicialmente borramos el contenido del
carry mediante la instruccin BCF STATUS,C.

En este punto el registro Shift tendr el valor 00000010 y en la siguiente


transferencia al puerto B se activarel LED 2 y se desactivar el LED 1.

Cuando el bit 4 de Shift valga 1, podemos deducir que ya se han activado los cuatro
LED, por lo tanto debemos repetir el ciclo para que se vuelva a ctivar el LED 1.
Miremos las siguientes instrucciones:

btfsc Shift,4
swapf Shift,F
La instruccin BTFSC Shift,4 detecta el momento en que el bit 4 del registro Shift
vale 1. Si detecta un cero se salta la instruccin siguiente que en este caso es
SWAPF Shift,F.

La instruccin SWAP (del ingls intercambiar) sirve para intercambiar el contenido de


los cuatro bits menos significativos con los cuatro bits ms siginificativos. Cuando el
registro Shift toma el valor 00010000 debido a las rotaciones, la instruccin SWAP
convierte este valor en 00000001, para reiniciar la secuencia de encencido de los
diodos LED.
36

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;**************************************************
; Curso integral de microcontroladores Pic
; SEQ.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 0x3FF1
ORG 0x0C
Count RES 2
Shift RES 1
;Reset Vector
;Program start point at CPU reset
ORG 0x00
bsf STATUS,RP0
movlw B'00011111'
movwf TRISA
movlw B'11110000'
movwf TRISB
bcf STATUS,RP0
movlw B'00000001'
movwf Shift
MainLoop
movf Shift,W
movwf PORTB
bcf STATUS,C
rlf Shift,F
btfsc Shift,4
swapf Shift,F
call Delay
goto MainLoop
; Subroutines
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END

CURSO INTEGRAL
PIC
Captulo 3
37

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Introduccin a los perifricos

3.1 Los puertos A y B


El PIC16F84A dispone de un total de 13 lneas I/O organizadas en dos puertos
denominados Puerto A y puerto B. El puerto A dispone de 5 lneas configurables
como entradas o como salidas, identificadas como RA0, RA1, RA2, RA3 y RA4.
El puerto B dispone de 8 lneas tambin configurables como entradas o como salidas,
ellas son RB0, RB1, RB2, RB3, RB4, RB5, RB6 y RB7.

Las lneas de cada uno de los puertos poseen una arquitectura interna determinada
dentro del microcontrolador. Para la gestin de la lneas I/O, el PIC dispone de dos
registros internos, uno para cada puerto. Ellos se denominan TRISA para determinar
el funcionamiento del puerto A y el registro TRISB para configurar el puerto B.

38

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Cada uno de los bits contenidos en los registros anteriores tienen una
correspondencia unvoca con una de las lneas I/O. Por ejemplo, el bit 0 del registro
PORTA y del regsitro TRISA corresponde a la lnea RA0, el bit 1 a la lnea RA1 y as
sucesivamente.

Si el bit 0 del regsitro TRISA se pone en cero, la lnea RA0 se configura como salida y
el valor que se ponga en el bit 0 de PORTA se ver reflejado en el estado lgico de
dicha lnea (0= 0 voltios, 1 = 5 voltios).

Si en el bit 0 del registro TRISA se pone un uno, la lnea RA0 se configurar como
entrada, en este caso, el estado lgico depender de la circuitera externa conectada
a la lnea RA0 y dicha entrada externa se ver reflejasa en el estado del bit 0 del
registro PORTA.

Miremos un ejemplo prctico, instalemos un LED sobre la lnea RB0 y un interruptor


en la lnea RB4. Miremos el cdigo siguiente:

movlw 00010000B
tris B
estamos poniendo un 0 en el bit 0 (RB0 como entrada) y un 1 en el bit 4 (lnea RB4)
para que sea una entrada. Si recordamos la notacin binaria del lenguaje
ensamblador, podremos recordar que el bit menos significativo corresponde al bit 0
(el que se encuentra en la primera posicin de derecha a izquierda).

Para encender el LED podemos escribir lo siguiente:


bsf PORTB,0
y para apagarlo:
bcf PORTB,0
Para leer el estado del interruptor conectado a la lnea RB4:

btfss PORTB,4
goto SwitchAMassa
goto SwitchAlPositivo

3.2 Estado de entrada de las lneas de I/O


Para entender la adaptabilidad del microcontrolador PIC para las diversas
configuraciones, la Microchip a implementado diversas topologas para las lneas I/O.
Cada grupo de pines posee un comportamiento distinto a los otros grupos.
Conociendo bien el funcionamieno de los diversos estados de las entradas podemos
disfrutar mejor de las caractersticas y optimizar su uso en nuestros proyectos.

Estado de las entradas de las lneas RA0, RA1, RA2 e RA3


Iniciemos con elgrupo de las lneas RA0, RA1, RA2 y RA3 el cual reproducimos en la
siguiente figura, el esquema del estado de las entradas se encuentra en las hojas de
datos de la Microchip:

39

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Como se habiamos mencionado anteriormente, la configuracin de una lnea como


entrada o salida depende del estado del bit correspondiente en el registro TRIS
(TRISA para el puerto A y TRISB para el puerto B).Pongamos como ejemplo la lnea
RA0 y analizemos su funcionamiento cuando acta como entrada.

Funcionamiento como entrada


Para configurar la lnea RA0 como entrada, debemos poner un 1 en el bit 0 del
registro TRISA, as:
bsf TRISA,0
Esto determina una conmutacin a 1 del estado lgico del flip-flop tipo D indicado
con el bloque TRIS latch. Por cada lnea de I/O existe un flip-flop de este tipo y su
estado lgico est ligado al estado lgico del bit correspondiente en el registro TRIS
(esto quiere decir que un bit en el registro TRIS se implementa fsicamente con un
TRIS latch).

La salida Q del TRIS latch se conecta a la entrada de una compuerta lgica OR. Esto
significa que, independientemente del valor presente en la otra entrada, la salida de
la compuerta OR siempre ser 1. En esta condicin el transistor P se activa y
mantiene la lnea RA0 conectada al positivo de la alimentacin.

40

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

La salida negada del TRIS latch se conecta a la entrada de una compuerta AND, cuya
salida siempre valdr cero debido a que una de sus entradas esta en cero. En esta
condicin el transistor N no se activar y mantendr la lnea RA0 desconectada de la
tierra. El estado lgico de la lnea RA0 depender exclusivamente de la circuitera
externa que se le conecte.

Ahora es posible leer el estado mediante la circuitera de entrada de los bloques


representados por el buffer de entrada TTL y el latch de entrada.

Funcionamento como salida


Para configurar la lnea RA0 como salida, debemos poner en 0 el bit 0 del registro
TRISA mediante la instruccin:
bcf TRISA,0
Esto determina la conmutacin a 0 de la salida Q del latch TRIS (y a 1 de la salida Q
negada). En este estado el valor en la salida de la compuerta OR y AND depende
exclusivamente del estado de la salida Q negada del latch de datos.

As como en el latch TRIS, el latch de datos depende del estado de un bit de un


regsitro, en particular del registro PORTA.

La salida negada viene enviada a la entrada de las dos compuertas lgicas OR y AND
y de estas a la base de los transistores P y N. Si ponemos un 0 en el bit 0 del
registro PORTA con la instruccin:
bcf PORTA,0
obtenemos la conduccin del transistor N con la consiguiente conexin a tierra de la
lnea RA0. Si por el contrario ponemos un 1 en el bit 0 con la instruccin:
bsf PORTA,0
obtenemos la conduccin del transistor P y la conexin de RA0 con los +5 voltios.

En esta condicin siempre es posible leer nuevamente el valor enviado sobre la lnea
a travs de la circuitera de entrada.

Estado de salida de la lnea RA4


Analicemos ahora el funcionamiento como salida de la lnea RA4, la cual se diferencia
de las dems lneas de I/O en que comparte su funcin con la del contador interno
del microcontrolador (este tema lo abordaremos ms adelante), por eso es comn
encontrar diagramas donde este pin se encuentra con el nombre RA4/TOCKI.
En la siguiente figura se muestra el esquema en bloques del estado de salida RA4:

41

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

La lgica de conmutacin es idntica a la del grupo de lneas RA0-3 a excepcin de


La carencia de la compuerta OR y del transistor P.

Esto significa, en trminos prcticos, que cuando la lnea RA4 viene programada
como salida y tiene un 1, no viene conectada al positivo.

Tal tipo de circuitera de salida se denomina en "colector abierto". Si necesitamos


sacar uu 1 por RA4 necesitamos poner externamente una resistencia de pull-up
conectada al positivo de la alimentacin.

En cuanto a la utilizacin de la lnea indicada en el esquema como entrada de TMR0,


ese tema lo veremos ms adelante.

Estado de salida de las lneas RB0, RB1, RB2 y RB3


En este grupo de lneas disponemos de una circuitera de weak up que se activan
cuando la lneas se han programado como entradas.

El estado de la lnea depende exclusivamente de la circuitera externa.

42

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Si tal circuitera es de colector abierto puede constituirse simplemente con un


sencillo pulsador con una resistencia de pull-up conectada a 5 voltios, el cual en el
momento de pulsarse conecte a tierra la lnea I/O.

La circuiteria de weak pull-up permite evitar el uso de resistencias de pull-up, para


activar o desactivar esta funcin se activa o desactiva el bit RBPU de un registro
interno del microcontrolador denominado OPTION.

En esta figura se muestra el esquema de bloques del estado de entrada de este


grupo de pines:

La lnea RB0 presenta una caracterstica muy particular. Cuando viene configurada
como entrada, puede generar, en correspondencia con un cambio de estado lgico,
una interrupcin, esto es, como su nombre lo indica, una interrupcin inmediata del
programa que se est ejecutando y una llamada a una subrutina especial
denominada servicio de interrupcin. Hablaremos de este importante tema ms
adelante.

Estado de salida de las lneas RB4, RB5, RB6 y RB7


La circuitera interna de conmutacin de este grupo de lneas es idntica a la del
grupo RB0-3. Estas lneas disponen de la circuitera de weak pull-up. En la siguiente

43

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

figura se reproduce el diagrama de bloques de las salidas tomada de las hojas de


datos de Microchip:

En la leccin anterior, mostramos una secuenciador de luces utilizando las lneas


RB0-3 como lneas de salida, veamos ahora como realizar en entrada a tierra
configurando las lneas de RB4 a RB7 como entradas. Ampliemos el circuito
presentado en la leccin 2 con cuatro pulsadores denominados SW1, SW2, SW3 y
SW4.

Esquema elctrico
Cada uno de los pulsadores conecta a tierra las lneas de entrada, las cuales
normalmente se mantienen a +5 voltios mediante una resistencia (de R6 a R9). Por
ejemplo, el pin 10 del PIC16F84A se mantendr en +5 voltios hasta que el pulsadro
SW1 no se active. Cuando esto ocurra el pin ver 0 voltios. Realizemos un programa

44

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

de ejemplo en donde se van iluminando los led D1, D2, D3 y D4 en correspondencia


a cuatro pulsadores SW1, SW2, SW3 y SW4.
El cdigo fuente del ejemplo se muestra en el archivo INPUT.ASM .

En la parte inicial del programa se pueden apreciar las siguientes instrucciones:


movlw 11110000B
movwf TRISB
con las cuales se configuran las lneas de RB0 a RB3 como salidas para conectar all
los LED y las lneas de RB4 a RB7 como entrada para conectar en ellas los cuatro
pulsadores. La instruccin:
bcf STATUS,RP0
Efecta una conmutacin del banco al registro 0 de manera que podemas acceder
directamente al estado de las lneas de I/O.
MainLoop
clrf PORT
Esta instruccin apaga todos los diodos led conectados al puerto B.
btfss PORTB,SW1
bsf PORTB,LED1
Este par de instrucciones se coloca por cada lnea de entrada que posee un pulsador,
y con ella se verificar la activacin de estos para activar el led correspondiente.
Si detecta un uno en SW1:
btfss PORTB,SW1
se salta la siguiente instruccin:
bsf PORTB,LED1
slo si el pusador SW1 est oprimido se ejecuta la enterior instruccin. El mismo
proceso se repite para todos los pulsadores y al final se ejecuta todo el ciclo
neuvamente gracias a la instruccin:
goto MainLoop

45

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;**************************************************
; Curso integral de microcontroladores Pic
; INPUT.ASM
;
; (c) 2003, WELGOS electrnica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
SW1 EQU 4
SW2 EQU 5
SW3 EQU 6
SW4 EQU 7
ORG 0CH
46

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;Reset Vector
;Punto di inizio del programma al reset della CPU
ORG 00H
;Commuta al segundo banco de registros para acceder al registro TRISA y
TRISB
bsf STATUS,RP0
;Definicion del las lineas de I/O (0=salida, 1=Entrada)
;Definicion del puerto A
movlw 00011111B
movwf TRISA & 7FH
;Definicion del puerto B
;Las lineas de RB0 a RB3 vienen programadas como salida para conectar
los cuatro led
;Las lineas de RB4 a RB7 viene programadas como entradas para conectar
los cuatro pulsadores
movlw 11110000B
movwf TRISB & 7FH
;Commuta el primer banco de registros
bcf STATUS,RP0
MainLoop
;apaga las led
clrf PORTB
;se se oprime SW1 se enciende el LED1
btfss PORTB,SW1
bsf PORTB,LED1

;se se oprime SW2 se enciende el LED2


btfss PORTB,SW2
bsf PORTB,LED2
;se se oprime SW3 se enciende el LED3
btfss PORTB,SW3
bsf PORTB,LED3
;se se oprime SW4 se enciende el LED4
btfss PORTB,SW4
bsf PORTB,LED4
goto MainLoop
END

CURSO INTEGRAL
PIC
Captulo 4
47

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

El contador TMR0 y el PRESCALER

4.1 El registro contador TMR0


Veamos ahora como funciona el registro TMR0.

El registro TMR0 es un contador. Se trata de un tipo especial de registro cuyo


contenido se incrementa mediante los ciclos internos del reloj o mediante pulsos
externos al PIC. A diferencia de otros registros, el TRM0 puede alterar por si solo el
valor con que se memoriza inicialmente. Por ejemplo, escribamos en el TMR0 el valor
10:
movlw 10
movwf TMR0

48

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

a medida que las instrucciones del programa se van ejecutando, el contenido del
registro comienza a incrementarse 11, 12, 13 en pasos de a uno en directa
correspondencia con los ciclos de mquina empleados. Si por ejemplo, despus de
haber cargado el TMR0 con algn valor, se plantea un ciclo infinito:
movlw 10
movwf TMR0
loop
goto loop
el registro TMR0 se incrementa de manera infinita a la para con el loop. Como el
TMR0 es un registro de 8 bits, solo puede incrementarse hasta 255. Cuando esto
ocurre y los ciclos de mquina siguen andando, el registro se reinicia y toma el valor
de 0.

La frecuencia con la cual se incrementa el TMR0 es directamente proporcional a la


frecuencia de reloj aplicada al circuito integrado, pero esta frecuencia puede
modificarse mediante unos bits de configuracin.

En la siguiente figura se muestra el diagrama de bloques del funcionamiento interno


del registro TMR0.

Los bloques Fosc/4 y TOCKI (en azul) representan las dos posibilidades que se
tienen para incrementar el valor del TMR0. Fosc/4 es una seal generada
internamente en el PIC a partir del circuito de reloj y equivale a la frecuencia del
reloj dividio por cuatro (esto recibe el nombre de ciclo de mquina).

TOCKI es una seal generada desde un eventual circuito externo que se aplica sobre
el pin TOCKI, que en el caso del PIC16F84A corresponde al pin 3.

Los bloques TOCS y PSA (resaltados en verde) son dos conmutadores que
determinan las caractersticas de la seal que entra el TMR0. Estos conmutadores se
configuran en base a los valores de los bits TOCS y PSA del registro OPTION.

El bloque PRESCALER es un divisor programable cuyo funcionamiento se explicar en


la siguiente seccin.

Veamos como funcionan estos bloques para obtener las distintas modalidades de
conteo por parte del TMR0.

49

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Iniciamos programando los bits TOCS en 0 y el PSA en 1. La configuracin de


funcionamineto que se obtiene se muestra en la siguiente figura:

En rojo se muestra la ruta que sigue la seal hasta llegar al TMR0. Como se habia
mencionado, la frecuencia Fosc/4 equivale a un cuarto de la frecuencia del reloj. Si
utilizamos un cristal de 4 Mhz obtendremos una frecuencia interna de 1 MHz. Tal
frecuencia se envia directamente al registro TMR0 sin ninguna modificacin. El
incremento que se obtiene equivale a 1 milln de incrementos por segundo a partir
del valor presente en el TRM0.

Ahora comabiemos el estado del bit TOCS de 0 a 1, la configuracin que obtenemos


es la siguiente:

En este caso la seal de entrada es la que se aplica externamente al pin TOCKI y esa
frecuencia es la que le entra al TMR0. Esta configuracin nos brinda la posibilidad de
efectuar el conteo automtcio de un evento externo. Si por ejemplo aplicamos al pin
TOCKI una frecuencia de 100 Hz, obtendremos una frecuencia de conteo de 100 por
segundo.
La presencia de la compuerta lgica XOR (OR exclusiva) en la entrada TOCKI del PIC
tiene como funcin permitir que el bit TOSE del registro OPTION regule el
funcionamiento del TMR0 para determinar cual de las dos posibles entradas es la que
queremos habilitar. Si queremos que funciones con el ciclo interno del reloj
(T0SE=1) o mediante la seal externa (T0SE=0).
50

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En la siguiente figura se representa la correspondencia de la seal externa y el valor


adjuntoi del contador TMR0:

4.2 El Prescaler
El ltimo bloque que falta por analizar es el PRESCALER. Si configuramos el bit PSA
del registro OPTION en 0 enviamos al registro TMR0 una seal que primero pasa por
el PRESCALER come se muestra en la siguiente figura:

El PRESCALER consiste de un divisor programable de 8 bit que se utiliza para ajustar


la frecuencia de entrada al TMR0. En el caso anterior utilizamos un cristal de cuarzo
de 4 Mhz con el que obtenemos una frecuencia de 1 Mhz, la cual para muchas
aplicaciones puede resultar muy elevada.

Utilizando el PRESCALER podemos dividir la frecuencia Fosc/4 configurando


oportunamente los bits PS0, PS1 y PS2 en el registro OPTION, de acuerdo a la
siguiente tabla:

PS2 PS1 PS0 Divisor Frecuencia a la salida del PRESCALER


0 0 0 2 500.000
0 0 1 4 250.000
0 1 0 8 125.000
0 1 1 16 62.500
51

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

1 0 0 32 31.250
1 0 1 64 15.625
1 1 0 128 7.813
1 1 1 256 3.906
Podemos hacer un experimento para comprobar el funcionamiento del PRESCALER.

En la leccin 2 habiamos realizado un ejercicio con el encendido de cuatro led en


donde la secuencia de encendido se dererminaba mediante un retardo por software,
basado en el tiempo de ejecucin de un ciclo continuo de instrucciones.

Ahora vamos a re escribir esta subrutina pero introduciendo un retardo mediante el


registro TMR0. Las modificaciones se muestran en el archivo SEQTMR0.ASM.

Debemos programar el PRESCALER para obtener una frecuencia de conteo


conveniente, para ello se utilizan las siguientes instrucciones al inicio del programa:
movlw 00000100B
movwf OPTION_REG
En la prctica debemos programar los bits TOCS en 0 para seleccionar cual va a ser
la fuente del conteo para el PIC, el bit PSA se pone en 0 para asignar el PRESCALER
al registro TMR0 en lugar del temporizador Watch Dog (este tema lo trataremos ms
adelante) y el bit de configuracin del PRESCALER a 100 para obtener una frecuencia
de divisin de 1:32. La frecuencia de conteo que obtenemos con el TMR0 ser:
Fosc = 1Mhz / 32 = 31.250 Hz
La subrutina Delay deber utilizar oportunamente el registro TMR0 para obtener un
retardo de un segundo. Veamos como se hace esto.
La primera instruccin que viene enseguida del Delay es:
movlw 6
movwf TMR0
y
movlw 125
movwf Count
Las primeras dos instrucciones memorizan en TMR0 el valor 6, de manera que el
registro TMR0 vuelve a cero despus de 250 conteo (256 6 = 250) obteniendo una
frecuencia de paso por cero del TMR0 de:
31.250 / 250 = 125 Hz
Las instrucciones siguientes memorizan en un registro de 8 bits (Count) el valor de
125 de modo tal que, decrementando este registro en una unidad por cada vez que
TMR0 para por cero, se obtiene una frecuencia de paso por cero del registro Count
de:
125/125 = 1Hz
Las instrucciones dentro del lazo DelayLoop se encargan de controlar si el TMR0 ha
llegado a cero, cada vez que se ha reiniciado seis vecesm se decrementa el valor
contenido en Count. Cuando Count llega a cero habr transcurrido un segundo y la
subrutina podr retornar al punto del programa desde donde se invoc.

;**************************************************
; Curso integral de microcontroladores Pic
; SEQTMR0.ASM
; Luces secuenciales con temporizacion via TIMER 0
;
; (c) 2003, WELGOS electronica
52

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
ORG 0CH
Count RES 1
Shift RES 1
;Reset Vector - Punto de inicio del programa al reset de la CPU
ORG 00H
;Conmuta al segundo banco de registros
bsf STATUS,RP0
;Definicion de la linea de I/O (0=salida, 1=entrada)
movlw 00011111B
movwf TRISA & 7FH
movlw 11110000B
movwf TRISB & 7FH
;Asigna el PRESCALER al TMR0 y lo configura a 1:32
;Ver la subroutina Delay
movlw 00000100B
movwf OPTION_REG & 0x7F
;Conmuta al primer banco de registros
bcf STATUS,RP0
;el registro Shift viene utilizado para representar internamente
;el estado de la linea de salida del puerto B donde se conectan los led
;el bit 0 del registro Shift viene inciado en 1 para iniciar el ciclo
;del primer led.
movlw 00000001B
movwf Shift
;Lazo de corrimiento
MainLoop
;envia sobre el puerto B el registro Shift de manera que cada bit en
;uno activar el led respectivo.
movf Shift,W

movwf PORTB
;Para rotar las luces se utiliza la instruccin rlf la cual hace
; rotar a la izquierda los bit contenidos en el registro e inserta en
;el bit 0 el estado del bit carry.Por este motivo primero se debe
;limpiar el carry con la instruccin: bcf STATUS,C.
bcf STATUS,C
rlf Shift,F
;Cuando con la rotacion el 1 llega al bit 4 se debe invertir los
;primeros cuatro bits con los segundos cuatro bits de modo que se pueda
;reiniciar el ciclo desde el bit 0.
;Esto sucede con los bits del registro Shift durante la ejecucion de
;este lazo:
;
; 00000001 <--- Valor inicial (primer led activado)
; 00000010 rlf
; 00000100 rlf
; 00001000 rlf
; 00010000 rlf en este punto se utiliza la instruccin swapf
;obteniendo:
; 00000001 ...
btfsc Shift,4
53

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

swapf Shift,F
;Insertar un retardo
call Delay
;Retorna a seguir nuevamente el lazo
goto MainLoop
;**************
; Subrutinas
;**************
; Retardo de un segundo
; utilizando el registro TMR0
;
; el ritardo viene obtenido de la frecuencia en la salida del PRESCALER
; por:
; 4Mhz / 4 / 32 = 31.250 Hz
; ... divide por 250 del TMR0 32.250 / 250 = 125 Hz
; ... y por 125 del contador Count 125 / 125 = 1Hz
Delay
; Inicializa el TMR0 para obtener 250 conteo antes de llegar a cero.
; El registro TMR0 es un registro de 8 bit que se incrementa
; nuevamentre cuando llega a 255 vuelve a cero.
; Si se inicializa en 6 debera llegar hasta 256 - 6 = 250
; incrementos antes de llegar a cero.
movlw 6
movwf TMR0
;el registro Count viene inicializado a 125
movlw 125
movwf Count
;Lazo de conteo
DelayLoop
;TMR0 vale 0 ?
movf TMR0,W
btfss STATUS,Z
goto DelayLoop ;No, espera...
movlw 6 ;Si, carga de nuevo TMR0 y controla si
movwf TMR0 ;ha pasado por 125
decfsz Count,1
goto DelayLoop
return
END

CURSO INTEGRAL
PIC
Captulo 5
Las interrupciones
Las interrupciones es una caracterstica muy especial en los microcontroladores PIC (
y de los microprocesadores en general) que permite la atencin inmediata de un
evento externo, interrumpiendo momentaneamente el programa en curso para

54

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ejecutar otra porcin especializada del programa para el manejo de dicho evento y
una vez ejecutada esta se retorna al programa principal.

Podemos hacer un parangn con el mundo real, podemos hacer una analoga y decir
que las interrupciones son para el PIC lo que el timbre del telfono para nosotros.
Para poder una llamada telefnica no necesitamos tomar el auricular
permanentemente, simplemente hacemos nuestras labores normales y solo las
interrumpimos si suena el timbre del telfono. Cuando terminamos de hablar
volvemos de nuevo a nuestras actividades normales.

Miremos los elementos en esta analoga:


Nuestras actividades normales corresponden al programa en ejecucin;
La llamada que alguien nos hace corresponde al evento a gestionar;
Cuando levanto el auricular corresponde a la respuesta a la interrupcin;
Y la respuesta que le doy mediante el telfono corresponde a la subrutina de gestin
de la interrupcin.

Es mucho ms eficiente manejar la atencin a un evento externo mediante una


interrupcin que mediante una verificacin cclica desde el programa principal.
Gracias al hardware interno del PIC la respuesta a un evento mediante una
interrupcin es prcticamente inmediata.

5.1 Tipos de eventos y bits de habilitacin


El PIC16F84A puede manejar interrupciones generadas por cuatro tipos de eventos:
1. El cambio de estado en la lnea RB0 (Interrupcin externa en el pin RB0/INT).
2. El fin del conteo del registro TMR0 (interrupcin por sobreflujo del TMR0).
3. El cambio de estado sobre una de las lneas de RB4 a RB7 (interrupcin por
cambio en el PORTB).
4. Fin de la escritura sobre una posicin de la EEPROM (Interrupcin por escritura
completa en la EEPROM).

La generacin de la interrupcin de cada uno de estos eventos puede habiliatrse o


deshabilitarse independientemente mediante un registro especial denominado
INTCON:
Si el bit INTE (bit 4) se pone en 1, se habilita la interrupcin por cambio de estado
en la lnea RB0. Si el bit T0IE (bit 5) se pone en 1 se habilita la interrupcin por
desborde del TMR0. Si el bit RBIE (bit 3) se pone en 1, se habilita la interrupcin por
cambio de estado en las lneas RB4-RB7. Si el bit EEIE (bit 6) se pone en 1, se
habilita ls interrupcin por fin de escritura en la EEPROM.

Existe un bit que acta como habilitador general de todas las interrupciones. Esto
quiere decir que para que cualquiera de las interrupciones se habilite debe estar este
bit activo. Se trata del bit GIE (Global Interrupt Enable bit) ubicado en el bit 7 del
registro INTCON.

5.2 Vector de interrupciones y el servicio de


interrupcin
Cualquiera que sea la fuente de la interrupcin, esta se manifiesta interrumpiendo la
ejecucin del programa en curso, memoriza automticamente en la pila, el valor
55

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

actual del contador de programa (POGRAM COUNTER) y salta a la instruccin


ubicada en la posicin 0004H, la que recibe el nombre de vector de interrupcin.
En este punto es donde debemos insertar la subrutina que maneja la interrupcin
denominada servicio de interrupcin.

Dentro de una aplicacin es posible habilitar varias de las posibles fuentes de


interrupcin, cuando se entra al servico de interrupcin el primer paso de la
subrutina es verificar cual de las fuentes fu la que en realidad origin la
interrupcin, para ellos se acude a la bandera de interrupcin.

5.3 Bandera de interrupcin


Dado que cualquier interrupcin genera una llamada a la posicin 04H, en el registro
INTCON se presentan una serie de banderas que nos indican cual evento ha
generado la interrupcin, veamos:

INTF (bit 1) Si vale 1 la interrupcin se ha generado por un cambio de estado sobre


la lnea RB0.
T0IF (bit 2) Si vale 1 la interrupcin se ha generado por el desborde del TRM0.
RBIF (bit 0) Si vale 1 la interrupcin se ha generado por un cambio de estado en una
de las lneas de RB4 a RB7.

Importante: Una vez se ha detectado cual de las banderas origin la interrupcin,


esta se debe borrar (y es responsabilidad del programador) de lo contrario la
interrupcin correspondiente no se detectar nuevamente.

5.4 Retorno desde un servicio de interrupcin


Cuando se ha generato una interrupcin el PIC deshabilita automticamente el bit
GIE (Global Interrupt Enable) del registro INTCON de modo que se deshabilitan
momentneamente todas las interrupciones mientras se ejecuta el servicio de
interrupcin. Para poder retornar al programa principal se debe reiniciar en 1 este bit
y utilizar la instruccin:
RETFIE

5.5 Ejemplo prctico del manejo de una


interrupcin
Veamos ahora un ejemplo prctico del manejo de una interrupcin y para ello
tomemos como base el programa LED.ASM de la leccin 1; recordemos que se
trataba del ecendido del LED1 mediante un ciclo continuo utilizando un retardo por
software introducido mediante la subrutina Delay. Ahora modificaremos este
programa para activar el LED2 de acuerdo a la ejecucin del programa principal.
El programa que estudiaremos ahora se denomina INTRB.ASM.
Si ejecutamos el programa dentro del circuito, podremos apreciar que el LED1 se
activa exactamente como lo haca en el programa LED.ASM. Ahora funcionemos con

56

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

los pulsadores SW1..SW4, veremos que el LED2 se activa inmediatamente y


permanece as durante un tiempo 3 veces mayor que el tiempo del LED1.

En la prctica, mientras el lazo principal en LED.ASM continua encendiendo el LED 1


utilizando un retardo por software introducido por la subrutina Delay,el PIC por estar
pendiente de la presin del pulsador y sealarlo en el LED 2, ver notablemente
afectada la frecuencia de encendido del LED 1.

Antes de analizar el programa INTRB.ASM veamos la diferencia del comportamiento


con respecto a otro programa que efecta estas mismas operaciones pero sin
recurrir al uso de interrupciones. Este programa se corresponde a NOINTRB.ASM.

Notemos que la activacin del LED 2 en correspondencia al pulsador, se retarda un


poco debido a que la lectura del estado de las lneas RB4-7 no se hace mediante una
interrupcin sino mediante el ciclo del lazo principal. Este ligero retardo se debe a la
presencia de la subrutina Delay en el interior de lazo principal.

5.6 Analizando el programa INTRB.ASM


Partamos de la directiva ORG 00H que como ya sabemos, ubica nuestro programa
despus del reset, en la posicin 0. Notemos que la primera instruccin que
encuentra el PIC es un salto incondicional a la etiqueta Start:

ORG 0x00
goto Start
seguido de otra directiva:
ORG 0x04
Que inidica la direccin de la subrutina que maneja la interrupcin:
bsf PORTB,LED2
movlw 3
movwf nTick
bcf INTCON,RBIF
retfie
Como se haba mencionado en la leccin anterior, el manejador de la interrupcin
debe necesariamente ubicarse a partir de la posicin 0x04; para evitar que se
encuentre enseguida del reset debemos saltarlo mediante una instruccin de salto
incondicional.

El servicio de interrupcin, en este caso, se limita a activar el LED 2, a cargar en el


registro nTick el nmero de veces que se activar el LED 2 y a borrar la bandera
RBIF para permitir que la circuitera interna de generacin de interrupciones siga
funcionando. La instruccin RETFIE permite que el PIC pueda continuar en el punto
del programa donde se encontraba antes de la interrupcin.

Como generar una interrupcin cuando se active un pulsador ?


Despus del reset ponemos los siguiente:
movlw 10001000B
movwf INTCON

57

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

donde ponemos un 1 en el bit GIE (bit 7) que corresponde al habilitador general de


los circuitos de generacin de interrupciones. Tambin ponemos en 1 el bit RBIE (bit
3) el cual habilita la interrupcin por cambio de estado en las lneas RB4-7.
Si colocamos los pulsadores PU1, PU2, PU3 y PU4 sobre las correspondientes lneas
de I/O RB4, RB5, RB6 y RB7, solo con presionar uno de estos pulsadores obtenemos
un cambio de estado y por lo tanto una interrupcin.

En el lazo principal, adems de la operacin de encendido de LED 1, se decrementa


el contatore nTick hasta que llega a cero. En correspondencia con esto se prende el
LED 2.

Ejemplo prctico de manejo de las interrupciones


Veamos como manejar las interrupciones. Sigamos utilizando el programa
INTRB.ASM pero ahora vamos a originar una interrupcin con el desborde del TMR0
y de acuerdo a este evento activamos el LED 3. El cdigo de este ejercicio lo vemos
en el archivo DBLNT.ASM.

Si compilamos el programa DBLINT.ASM y lo montamos sobre el circuito, veremos


como el LED 1 parpadea a una sola frecuencia y el LED 3 parpadea a una frecuencia
ms elevada. Accionando el pulsador obtenemos la subida por tres ciclos del LED 2.

Analizando el programa DBLINT.ASM


En el momento de que se presenta una interrupcin, en la subrutina del servicio de
la interrupcin se verifica cual de las fuentes de interrupcin gener la situacin,
para ello consultamos las banderas TOIF (desborde del TMR0) y RBIF (cambio de
estado en RB4-RB7):
btfsc INTCON,T0IF
goto IntT0IF
btfsc INTCON,RBIF
goto IntRBIF
De acuerdo a la bandera activada saltamos a la etiqueta respectiva: IntT0IF
IntRBIF. Antes de salir del servicio de interrupcin debemos recordar borrar las
banderas TOIF y RBIF, para poder funcionar nuevamente con dichas interrupciones.

;**************************************************
; Curso integral de microcontroladores Pic
; INTRB.ASM
;
; (c) 2003, WELGOs electrnica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
58

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

LED3 EQU 2
LED4 EQU 3
ORG 0CH
Count RES 2
nTick RES 1 ;Registro utilizado para contar el numero de
;encendidas del LED 1
;Reset Vector
;Punto de inicio del programa al reset de la CPU
ORG 00H
;Salta al cuerpo principal del programa. Este salto es necesario
;para evitar toda la parte de codigo para el manejo de la
;interrupcion.
goto Start
;Interrupt vector
;Punto de inicio para toda la subrutina de manejo de la interrupcion
ORG 04H
;**********************************************************************
; Servicio de Interrupcion
;**********************************************************************
;Activa el led 2 para sealar que se ha dado una interrupcion
bsf PORTB,LED2
;Inicializa el contador del parpadeo del LED1
movlw 3
movwf nTick
;Borra la bandera RBIF para permitir nuevas interrupciones
bcf INTCON,RBIF
;Retorna al programa principal
retfie
;**********************************************************************
; Programa principal
;**********************************************************************
Start:
;Conmuta al segundo banco de registros para acceder al registro TRISA y
;TRISB
bsf STATUS,RP0
;Definicion de las lineas de I/O (0=salida, 1=Entrada)
;Definicion del puerto A
movlw 00011111B
movwf TRISA & 7FH
;Definicion del puerto B
;Las lineas de RB0 a RB3 viene programadas como salida para
;conectar los cuatro led
;Las lineas de RB4 a RB7 vienen programadas como entradas para
;conectar los cuatro pulsadores
movlw 11110000B
movwf TRISB & 7FH
;Conmuta al primer banco de registros
bcf STATUS,RP0
;apaga los led del puerto B
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Habilita la interupcion del cambio de estado en las lineas RB4,5,6,7
movlw 10001000B
movwf INTCON
;**********************************************************************
; Lazo principal
;**********************************************************************
MainLoop
call Delay ;Retardo por software
59

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

btfss PORTB,LED1 ;Led apagado ?


goto TurnOnLed1 ;No, lo prende
goto TurnOffLed1 ;Si, lo apaga
;Prende led y decremento el contatore de parapadeo
TurnOnLed1
bsf PORTB,LED1
;Controla si LED 2 de sealacion de la interrupcion esta prendido.
;Si esta prendido decrementa el contador nTick ad ogni lampeggio di
;LED1. Quando nTick vale 0 spegne LED 2
btfss PORTB,LED2 ;LED2 prendido ?
goto MainLoop ;No, continua a lampeggiare
decf nTick,1 ;Si, decrementa nTick
btfss STATUS,Z ;nTick = 0 ?
goto MainLoop ;No, continua a lampeggiare
bcf PORTB,LED2 ;Si, spegne LED2
goto MainLoop ;Continua a lampeggiare

;Spegnimento led
TurnOffLed1
bcf PORTB,LED1 ;Spegne LED 1
goto MainLoop ;Continua a lampeggiare
;**********************************************************************
; Subrutina
;**********************************************************************
;Subrutina de retardo por software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END

;**************************************************
; Curso integral de microcontroladores Pic
; DBLINT.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
ERRORLEVEL -302
;Setup of PIC configuration flags
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
__CONFIG 3FF1H
LED1 EQU 0
LED2 EQU 1
LED3 EQU 2
LED4 EQU 3
ORG 0CH
Count RES 2
nTick RES 1
;Reset Vector
60

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;Starting point at CPU reset


ORG 00H
;Jump to the main body of program to avoid the interrupt handler
;code.
goto Start
;Interrupt vector
;Starting point at CPU interrupts
ORG 04H
;**********************************************************************
; Interrupt handler
;**********************************************************************
;Check the interrupt event
btfsc INTCON,T0IF
goto IntT0IF
btfsc INTCON,RBIF
goto IntRBIF
;Reset the T0IF and RBIF flags to re-enable the interrupts
End_ih
bcf INTCON,T0IF
bcf INTCON,RBIF
;Go back to the main program
retfie
;**********************************************************************
; TMR0 Interrupt handler
;**********************************************************************
IntT0IF
;Turn on LED3 if it's off
btfsc PORTB,LED3
goto LED3_off
bsf PORTB,LED3
goto End_ih
LED3_off
bcf PORTB,LED3
goto End_ih
;**********************************************************************
; RB4-RB7 interrupt handler
;**********************************************************************
IntRBIF
;Turn on LED 2
bsf PORTB,LED2
;Starts the LED1 blink counter
movlw 3
movwf nTick
goto End_ih
;**********************************************************************
; Main body
;**********************************************************************
Start:
;Commuta sul secondo banco dei registri per accedere ai registri TRISA e
TRISB
bsf STATUS,RP0
;Definizione delle linee di I/O (0=Uscita, 1=Ingresso)
;Definizione della porta A
movlw 00011111B
movwf TRISA & 7FH
;Definizione della porta B
;Le linee da RB0 a RB3 vengono programmate in uscita per essere
collegate ai quattro
led
;Le linee da RB4 a RB7 vengono programmate in ingresso per essere
collegate ai quattro
pulsanti
61

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

movlw 11110000B
movwf TRISB & 7FH
;Assegna il PRESCALER a TMR0 e lo configura a 1:256
movlw 00000111B
movwf OPTION_REG & 7FH
;Commuta sul primo banco dei registri
bcf STATUS,RP0
;Spegne tutti i led collegati sulla porta B
bcf PORTB,LED1
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Abilita l'interrupt sul TMR0 e sul cambiamento di stato delle linee
RB4,5,6,7
movlw 10101000B
movwf INTCON
;**********************************************************************
; Loop principale
;**********************************************************************
MainLoop
call Delay ;Ritardo software
btfss PORTB,LED1 ;Led acceso ?
goto TurnOnLed1 ;No, lo accende
goto TurnOffLed1 ;Si, lo spegne
;Accensione led e decremento del contatore di lampeggi
TurnOnLed1
bsf PORTB,LED1
;Controlla se LED 2 di segnalazione dell'interrupt e' gia acceso.
;Se e' acceso decrementa il contatore nTick ad ogni lampeggio di
;LED1. Quando nTick vale 0 spegne LED 2
btfss PORTB,LED2 ;LED2 acceso ?
goto MainLoop ;No, continua a lampeggiare
decf nTick,1 ;Si, decrementa nTick
btfss STATUS,Z ;nTick = 0 ?
goto MainLoop ;No, continua a lampeggiare
bcf PORTB,LED2 ;Si, spegne LED2
goto MainLoop ;Continua a lampeggiare
;Spegnimento led
TurnOffLed1
bcf PORTB,LED1 ;Prende LED 1
goto MainLoop ;Continua el parpadeo
;**********************************************************************
; Subrutina
;**********************************************************************
;Subrutina de retardo por software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END

62

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

CURSO INTEGRAL
PIC
Captulo 6
El modo Power Down
El modo Power Down o modo Sleep es un estado muy particular del funcionamiento
del microcontrolador PIC utilizado para reducir el consumo de corriente en el
momento en que el microcontrolador no se est utilizando o solo esta a la espera de
que ocurra un evento externo.

Tomemos por ejemplo, el caso del control remoto del televisor. La mayor parte del
tiempo el microcontrolador interno no se encuentra desarrollando ninguna tarea, solo

63

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

espera a que un usuario oprima una de las teclas. Para ahorrar la energa de la
batera, es conveniente ponerlo en Sleep. El tiempo efectivo en que trabaja la CPU se
limita a los milisegunos necesarios para efectuar la transmisin, el resto del tiempo
no se encuentra desarrollando ninguna funcin en particular.

Para evitar el consumo intil de la batera conviene desactivar buena parte de la


circuitera interna y activarla solo en el momento en que se presente un evento
externo. Veamos como.

6.1 La instruccin SLEEP


La instruccin SLEEP se utiliza para poner el PIC en el modo de Power Down y de esa
manera reducir el consumo de corriente de 2 mA (suponiendo una alimentacin de 5
voltios y un cristal de 4 Mhz) a casi 2A, es decir, un reduccin del consumo en
1000 veces!
Para entrar en modo Power Down solo se debe insertar la siguiente instruccin en un
punto cualquiera de nuestro programa:
SLEEP
Al momento de ejecutar esta instruccin se detendr el flujo de las dems
instrucciones, se desactivarn todos los circuitos internos a excepcin de aquellos
necesarios para mantener el estado en los puertos I/O (estado lgico alto, bnajo o
alta impedancia) y as poder despertar al microcontrolador en cualquier momento.

Microchip recomienda conectar al positivo (Vdd) o al negativo (Vss) de la


alimentacin todas las lneas en alta impedancia o no utilizadas, como la lnea
RA4/TOCKI (pin 3).

6.2 Despertando al PIC


Para despertar al PIC de su estado de reposo se puede utilizar diversas tcnicas:
1. Resetear el PIC mediante un 0 en el pin MCLR (pin 4)
2. Timeout del temporizador Watchdog (si se ha habilitado)
3. Verificar si hay una situacin de interrupcin (interrupcin en el pin RB0/INT,
cambio de estado sobre el puerto B, fin de escritura en la EEPROM).
En los casos 1 y 2 el PIC se resetea y la ejecucin reinicia en la posicin 0. En el caso
3 el PIC se comporta normalmente para el manejo de una interrupcin, ejecutando el
servicio a la interrupcin y luego regreasando a la ejecucin del programa despus
de la instruccin SLEEP.

6.3 Ejemplo del modo Power Down


Veamos ahora un sencillo ejemplo de utilizacin del modo Power Down y la
correspondiente despertada. La modalidad utilizada es la interrupcin por cambio de
nivel en RB0/INT utilizando un pulsador. El programa utilizado es PDM.ASM.

En la prctica, el LED D1 conectado a la lnea RB2 paradear inicando que el


programa est en curso. Oprimiendo SW2 el programa ejecutar la instruccin:
SLEEP
metiendo el PIC en el modo Power Down donde el LED D1 cesar su intermitencia.

Para causar la salida del modo Power Down del PICmicro, bastar oprimir SW1 para
generar una interrupcin y retomar la ejecucin del programa.
64

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;**************************************************
; Curso integral de microcontroladores Pic
;
; PDM.ASM
; Power Down Mode example
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Set chip configuration
;Disable watch dog timer
;Enable power up timer
;XT oscillator
;Disable code protect
__CONFIG 3FF1H
SWITCH1 EQU 0
SWITCH2 EQU 1
LED1 EQU 2
ORG 0CH
;contador de 16 bit utilizado en la subrutina delay
Count RES 2
;Reset Vector
;Start point at CPU reset
ORG 00H
;Jump to main body of program.
goto Start
;**********************************************************************
; Interrupt vector
; Start point for every interrupt handler
;**********************************************************************
ORG 04H
;**********************************************************************
; Interrupt handler
;**********************************************************************
bcf INTCON,INTF ;Reset INTF flag
retfie ;Return to the main body
;**********************************************************************
; Main body
;**********************************************************************
Start:
bsf STATUS,RP0 ;Swap to data bank 1
;I/O lines definition on port A (0=output, 1=input)
movlw 00011111B ;Definition of port a
movwf TRISA & 0x7F
;I/O lines definition on port B (0=output, 1=input)
bsf TRISB & 0x7F,SWITCH1 ;Switch 1
bsf TRISB & 0x7F,SWITCH2 ;Switch 2
bcf TRISB & 0x7F,LED1 ;Led 1
;Set to 0 the INTEDG bit on OPTION register
;to have an interrupt on the falling edge of RB0/INT
bcf OPTION_REG & 0x7F,INTEDG
bcf STATUS,RP0 ;Swap to data bank 0
bsf INTCON,GIE ;Enables interrupts
bsf INTCON,INTE ;Enables RB0/INT interrupt
bcf PORTB,LED1 ;Turn off LED1
;**********************************************************************

65

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

; Main loop
;**********************************************************************
MainLoop
btfss PORTB,SWITCH2 ;If switch2 is down enter in
sleep ;Power Down Mode
call Delay ;Software delay
;If LED1 in on then turn it off and viceversa
btfss PORTB,LED1 ;Led on ?
goto TurnOnLed1 ;No, turn it on
goto TurnOffLed1 ;Yes, turn it off
;Turn LED1 on
TurnOnLed1
bsf PORTB,LED1
goto MainLoop
;Turn LED1 off
TurnOffLed1
bcf PORTB,LED1
goto MainLoop
;**********************************************************************
; Software delay
;**********************************************************************
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END

CURSO INTEGRAL
PIC
Captulo 7
El temporizador watch dog (WDT)

En esta leccin analizaremos el funcionamiento del temporizador Watchdog (en


espaol es algo como temporizador perro guardin), el cual es un mecanismo que
tenemos a disposicin para mejorar la fiabilidad de nuestros circuitos basados en
PIC.

El Watch Dog es un oscilador interno al PIC pero con una circuitera completamente
independiente y su objetivo es el de evitar un posible bloqueo de la CPU del micro y
reiniciar el PIC para retornar a la ejecucin normal del programa.

Si desea desbloquear la CPU durante la ejecucin del programa principal, debe


insertar la instruccin especial:
CLRWDT (CLeaR Watch Dog Timer)
la cual borrar a intervalos regulares el temporizador Watch Dog Timer. Si la CPU no
efecta esta instruccin antes de terminar el conteo del WDT asumir que el

66

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

programa se ha bloqueado por cualquier motivo y por tanto efecta el Reset de la


CPU.
El periodo mnimo al cual se puede reiniciar la CPU est alrededor de los 18ms
(depende de la temperatura y del voltaje de alimentacin). Es posible asignar el
PRESCALER al temporizador Watch Dog para obtener un retardo hasta de 2.3
segundos.

Para habilitar el temporizador Watch Dog se habilita la opcin desde el software de


programacin, mediante la bandera WDTE de la palabra de configuracin.

7.1 Asignacin del PRESCALER al WDT


Activando el bit PSA del registro OPTION_REG es posible asignar el prescaler al
Watch Dog Timer para obtener un tiempo de reinicio mayor. El bit PSA se activa
mediante la instruccin:
BSF OPTION_REG,PSA
En caso contrario el prescaler se asignar al TIMER 0. Obviamente una vez que se ha
asignado el prescaler al WDT no ser posible asignarlo completamente al TIMER 0 y
viceversa.
Interviniendo en los valores de los bits PS0, PS1 y PS2 del registro OPTION_REG
podremos obtener diversos intervalos de retardo. La escogencia correcta deber
hacerse teniendo en cuenta el mximo retardo que requerimos obtener al interior de
nuestro programa tras la ejecucin de dos instrucciones CLRWDT sucesivas.
En la siguiente tabla se muestra la correspondencia entre los valores de estos bits y
los intervalos que obtenemos.

7.2 Ejemplo prctico de la utilizacin del Watch


Dog Timer
Veamos ahora, como siempre, un ejemplo prctico de la utilizacin del Watch Dog
Timer. Usaremos el mismo esquema circuital del ejemplo anterior (ejemplo4.pdf), y
el cdigo fuente del archivo WDT.ASM.
En la prctica este ejemplo no difiere mayor cosa del ejemplo utilizado para explicar
el modo Power Down.
Apenas entre en ejecucin, el programa har parpadear el LED 1. Durante este
parpadeo se ejecuta continuamente la instruccin CLRWDT para evitar que la CPU se
reinicie ( para este propsito recuerde habilitar la opcin WDTE en el momento de la
programacin).

Si oprimimos SW2, la CPU entra en un loop infinito (StopLoop) antes de seguir con la
instruccin CLRWDT.
Transcurridos alrededor de 2.3 segundos, el Watch Dog Timer efecta el reset de la
CPU y el led comienza nuevamente a parpadear.
Podriamos ahora reprogramar el PIC16F84A con el siguiente programa y habiliat el
WDTe desde nuestro programador. Note que oprimiento SW2 el parapadeo se
bloquea y luego se desbloquea.

;**************************************************
67

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

; Curso integral sobre microcontroladores Pic


; WDT.ASM
; Watch Dog Timer example
;
; (c) 2003, WELGOS electrnica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Configuracin de las banderas del chip
;Habilitar el watch dog timer
;habilitar el power up timer
;XT oscillator
;Disable code protect
__CONFIG 3FF5H
SWITCH1 EQU 0
SWITCH2 EQU 1
LED1 EQU 2
ORG 0CH
;se utiliza un contador de 16 bit para la subrutina de retardo
Count RES 2
;Reset Vector
;Punto de inicio al resetear la CPU
ORG 00H
;Salta al cuerpo principal del programa.
goto Start
;**********************************************************************
; Vector de interrupcin
; Punto de inicio para todos los sevicios de interrupcin
;**********************************************************************
ORG 04H
;**********************************************************************
; Servicio de interrupcin
bcf INTCON,INTF ;Reset bandera INTF
retfie ;Retorno al cuerpo principal
;**********************************************************************
; Cuerpo principal
;**********************************************************************
Start:
bsf STATUS,RP0 ;Conmuto al banco de datos 1
;definiciones I/O en el puerto A (0=output(salida), 1=input (entrada))
movlw 00011111B ;Definicin del puerto a
movwf TRISA & 0x7F
; definiciones I/O en el puerto B (0=output(salida), 1=input (entrada))
bsf TRISB & 0x7F,SWITCH1 ;Switch 1
bsf TRISB & 0x7F,SWITCH2 ;Switch 2
bcf TRISB & 0x7F,LED1 ;Led 1
;ponemos en 0 el bit INTEDG del registro OPTION
;para obtener una interrupcin en el flanco de bajada de RB0/INT
bcf OPTION_REG & 0x7F,INTEDG
;Asignacin del PRESCALER al Watch dog timer
bsf OPTION_REG & 0x7F,PSA
;Set the PRESCALER to 1:128
bsf OPTION_REG & 0x7F,PS0
bsf OPTION_REG & 0x7F,PS1
bsf OPTION_REG & 0x7F,PS2
bcf STATUS,RP0 ;saltar al banco de datos 0
bsf INTCON,GIE ;habilitar interrupciones
bsf INTCON,INTE ;habilito interrupcin RB0/INT
bcf PORTB,LED1 ;Apagar LED1
;**********************************************************************
68

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

; lazo principal
;**********************************************************************
MainLoop
btfss PORTB,SWITCH2 ;Si switch2 esta cerrado entre en
StopLoop
goto StopLoop ;Detiene la CPU
clrwdt ;Clear wtach dog timer
call Delay ;retardo por Software
;Si el LED1 esta prendido apaguelo y viceversa
btfss PORTB,LED1 ;Led on ?
goto TurnOnLed1 ;No, prendalo
goto TurnOffLed1 ;Si, apaguelo
;Turn LED1 on
TurnOnLed1
bsf PORTB,LED1
goto MainLoop
;Turn LED1 off
TurnOffLed1
bcf PORTB,LED1
goto MainLoop
;**********************************************************************
; Retardo por Software
Delay
clrf Count
clrf Count+1
DelayLoop
decfsz Count,1
goto DelayLoop
decfsz Count+1,1
goto DelayLoop
return
END

CURSO INTEGRAL
PIC
Captulo 8
Manejo de un display LCD

En las lecciones pasadas hicimos algunos experimentos sencillos con diodos led y
pulsadores. EN esta leccin vamos a desarrollar la interfaz entre nuestro PIC16F84A
y una serie de dispositivos ms complejos.
Inicaremos con un display de cristal lquido o LCD (del ingls Liquid Crystal Display)
dotado de dos lneas y 16 caracteres, que es muy fcil de conseguir en el comercio.
El esquema elctrico del circuito es el siguiente:

69

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En la tabla siguiente se describe la funcin de cada una de las lneas del LCD. Las
descripciones que se encuentran en negrilla nos indican que se utilizan efectivamente
en nuestra aplicacin de ejemplo.

Pin Nombre Funcin


1 GND Tierra
2 VDD Se conecta a +5 voltios
3 LCD A este pin se conecta un voltaje entre 0 y 5 voltios(mediante un
trimmer) para regular el contraste del LCD
4 RS Register Select. Sirve para indicarle al LCD si el dato que le llega es
un dato (RS=1) o un comando (RS=0)
5 R/W Es un bit de control que le indica al LCD si se quiere escribir un dato
en el (R/W=0) o leerlo de el (R/W=1)
6 E Enable. Otro bit de control que permite que el LCD reciba datos y
comandos.
7 DB0 Lnea 0 del bus de datos-Las siguientes son los datos que van al LCD
8 DB1 Lnea 1 del bus de datos
9 DB2 Lnea 2 del bus de datos
10 DB3 Lnea 3 del bus de datos
11 DB4 Lnea 4 del bus de datos
12 DB5 Lnea 5 del bus de datos
13 DB6 Lnea 6 del bus de datos
14 DB7 Lnea 7 del bus de datos

Para maximizar la utilizacin de los pines del PIC y el LCD, en esta leccin
utilizaremos la modalidad de intercambio de datos a 4 bits, para lo cual solo
utilizaremos las lneas DB4, DB5, DB6 y DB7. Las lneas DB0, DB1, DB2 y DB3 no las
utilizaremos por lo cual las podemos conectar a tierra. La lnea R/W del LCD tampoco
la utilizaremos por lo que tambin la conectaremos a tierra. De esta manera se
seleccionar el modo de trabajo solo en modo de escritura. Esto quiere decir que en
la prctica solo podremos enviar datos al LCD pero no recibirlos.

8.1 Hello World !

70

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Monte el circuito en el entrenador, compile el cdigo fuente del archivo LCD1.ASM y


programa el PIC con el archivo .HEX obtenido. Si desarrolla bien las conexiones, en
su display LCD aparecer la siguiente visualizacin.

Quisimos poner el famossimo mensaje de HOLA MUNDO intentando emular un poco


lo que hacen la mayora de los libros de aprendizaje de programacin. No quisimos
pasar por alto esta tradicin.
El resultado puede no ser muy emocionante, este es solo el comienzo no se
desespere!
Si no consigue visualizar nada en el display, asegrese que el montaje del circuito
sea correcto, que el PIC se haya programado correctamente ( colocar el oscilador en
XT y deshabiliat el watch dog), ser necesario que regule el contraste del LCD por
medio del trimmer R2 conectado al pin 3 del display.

8.2 La lnea Enable (E) y el Register Select (RS)


del LCD
Para poder visualizar una escritura sobre el display, el PIC debe enviar toda una sere
de comandos transmitidos a travs de las lneas del bus de datos (lneas de DB4 a
DB7). Para ello se utilizan dos lneas de control con las cuales se comunica al display
la operacin de transferencia de datos. Las dos lneas de control son el Enable (pin 6
del LCD) y el Register select (pin 4 del LCD). Con la lnea Register Select (RS) el PIC
le seala al display que el dato presente en el bus es un comando (RS=0) o un dato
que se debe visualizar (RS=1). Cuando el PIC transmite un comando. Le informa al
LCD el tipo de operacin que debe ejecutar, como por ejemplo activar el cursor.
Cuando se enva un dato, el PIC le enva directamente los caracteres ASCII que debe
visualizar. La lnea Enable habilita al display a leer el comando o el dato enviado a
travs del bus por el PIC. El PIC debe preocuparse de tener en el bus, el dato o el
comando necesario antes de enviar la seal de habilitacin.

8.3 Multiplexando el bus de datos


Si los comandos y los datos se representan en nmeros de 8 bits, como es posible
enviarlos al display si el bus de datos se compone solo de 4 lneas?
En la prctica podemos utilizar una operacin de multiplexacin, en la cual un byte
se descompone en dos grupos de 4 bits y se trasnmiten sobre el bus en scuencia.
Primero se envian los cuatros bits menos significativos y luego los cuatro ms
significativos. En el cdigo fuente de este ejemplo, todas las operaciones de
transmisin de datos y comandos sobre el display vienen seguidas de una serie de
subrutinas presentes en el archivo LCD1.ASM que simplifican al mximo la
complejidad de nuestro programa. Antes de analizar la subrutina veremos lo que
hace el programa principal.

71

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

8.4 Analizando el programa LCD1.ASM


En la primera parte del cdigo fuente vienen definidas algunas constantes:
;LCD Control lines
LCD_RS equ 2 ;Register Select
LCD_E equ 3 ;Enable
;LCD data line bus
LCD_DB4 equ 4 ;LCD data line DB4
LCD_DB5 equ 5 ;LCD data line DB5
LCD_DB6 equ 6 ;LCD data line DB6
LCD_DB7 equ 7 ;LCD data line DB7
Estas definiciones asocian las lneas del PIC (todas conectadas al puerto B) y las
lneas del LCD. Estas se utilizan en el interior de la subrutina de manejo del LCD para
identificar fcilmente las lneas del display.
tmpLcdRegister res 2
msDelayCounter res 2
Enseguida se reserva espacio para dos registros: tmpLcdRegister , usado en la rutina
de manejo del LCD y msDelayCounter usado en la subrutina msDelay la cual genera
el retardo por software de 1 ms trabajando con el contenido del registro W. Esta
subrutina la utilizaremos siempre dentro de la subrutina de manejo del LCD para
generar la temporizacin necesaria durante la transmisin de datos y comando al
LCD. Luego sigue una parte de definiciones de las lneas de conexin entre el PIC y el
display y luego llegamos a el llamado de una subrutina que es muy interesante.
call LcdInit
LcdInit es una subrutina que debe ser llamada solo una vez al inicio de nuestro
programa y es proritaria sobre cualquier otra subrutina del LCD. Esta se ocupa de
efectuar todas las operaciones necesarias para inicializar correctamente el LCD y
permitir que todas las funciones sucesivas que se le indiquen, se desarrollen
correctamente.
Con la siguiente instruccin:
movlw 00H
call LcdLocate
se posiciona el cursor del display en la primera fila y primera columna del display.
Los caracteres que se envien enseguida se ubicaran a partir de esta posicin. Los
cuatros bits ms significativos del valor colocado en el registro W con la instruccin:
movlw 00H
contendr el nmero de la fila donde se debe ubicar el cursor, y los cuatro bits
menos significativos contendrn el nmero de la columna. Pruebe cambiar los
valores del registro W para obtener diversos posicionamientos. Por ejemplo con el
valor 10H obtenemos la siguiente visualizacin:

con el valor 12H obtenemos:

En este punto, para visualizar cualquier caracter debemos utilizar la instruccin:


movlw 'H'
call LcdSendData
72

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

El incremento de la posicin del cursor se hace automticamente.

8.5 Subroutinas de gestin del display LCD


Veamos brevemente las funciones que efecta la subrutina de manejo del LCD en el
archivo LCD1.ASM.
Subrutina Funcin
LcdInit Se ocupa de inicializar el display LCD. Debe
llamarse solo una vez y prima sobre cualquier otra
subrutina de manejo del LCD.
No requiere paso de parametros.
LcdClear Borra el contenido visualizado y reposiciona el
cursor sobre la primera fila y primera columna del
LCD.
No requiere paso de parmetros.
LcdLocate Posiciona el cursor en el interior del rea visible del
LCD.
Requiere el valor de la fila y la columna en W para
posicionar el cursor. Los bits D0 a D3 contienen el
valor de la columna (eje Y) y de D4 a D7 el valor de
la fila (eje X). La numeracin de la columna parte
de 0 y aumenta de derecha a izquierda.
LcdSendData Permite enviar un caracter ASCII al LCD u
visualizarlo en la posicin actual del cursor.
Requiere en W el caracter ASCII a visualizar.
LcdSendCommand Permite enviar un comando al LCD.
Requiere en W el comando.
LcdSendByte Esta funcin es interna a las otras y se ocupa del
multiplexaje de 8 a cuatro bits.

;**************************************************
; Curso integral sobre microcontroladores Pic
; LCD1.ASM
;
; (c) 2003, WELGOS electrnica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Suppres MPASM warning message 302:
;"Register in operand not in bank 0. Ensure that bank bits are correct"
ERRORLEVEL -302
;Lineas de control del LCD
LCD_RS equ 2 ;Register Select
LCD_E equ 3 ;Enable
;bus de datos del LCD
LCD_DB4 equ 4 ;LCD linea de datos db4
LCD_DB5 equ 5 ; LCD linea de datos db5
LCD_DB6 equ 6 ; LCD linea de datos db6
LCD_DB7 equ 7 ; LCD linea de datos db7
ORG 0CH
tmpLcdRegister res 2
msDelayCounter res 2
;Reset Vector
ORG 00H
Start
bsf STATUS,RP0 ;salto al banco 1
movlw 00011111B ;configuro puerto A
73

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

movwf TRISA
movlw 11111111B ;configuro puerto B
movwf TRISB
bcf PORTB,LCD_DB4 ;como salidas las lineas del lcd
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bcf PORTB,LCD_E
bcf PORTB,LCD_RS
bcf STATUS,RP0 ;Salto al banco 0
;inicializacin del LCD
call LcdInit
;Localizar el cursro del LCD em la fila 0, columna 0
movlw 10H
call LcdLocate
;mostrar "HELLO WORLD"
movlw 'H'
call LcdSendData
movlw 'E'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'O'
call LcdSendData
movlw ' '
call LcdSendData
movlw 'W'
call LcdSendData
movlw 'O'
call LcdSendData
movlw 'R'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'D'
call LcdSendData
movlw ' '
call LcdSendData
movlw '!'
call LcdSendData
foreverLoop
goto foreverLoop
;**********************************************************************
; subrutina de retardo
;
; W = tiempo de retardo requerido en ms (clock = 4MHz)
;**********************************************************************
msDelay
movwf msDelayCounter+1
clrf msDelayCounter+0
; lazo interno de 1 ms (alrededor)
msDelayLoop
nop
decfsz msDelayCounter+0,F
goto msDelayLoop
nop
decfsz msDelayCounter+1,F
goto msDelayLoop
return
74

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;**********************************************************************
; Init LCD
; Esta subrutina debe invocarse antes de cualquier otra del lcd
;**********************************************************************
LcdInit
movlw 30 ;espera 30 ms
call msDelay
;****************
; secuencia de Reset
;****************
bcf PORTB,LCD_RS ;LCD en modo de comando
;envia una secuencia de reset al LCD
bsf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ;habilito lcd
movlw 5 ;espero 5 ms
call msDelay
bcf PORTB,LCD_E ;deshabilito LCD
movlw 1 ;Wait 1ms
call msDelay
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;Wait 1ms
call msDelay
bsf PORTB,LCD_E ;Enables E
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ;Disables E
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
; configuro el bus de datos en 4 bits
movlw 28H;
call LcdSendCommand
;entro en mos de incremento no de desplazamiento
movlw 06H;
call LcdSendCommand
;Display ON, Curson OFF, Blink OFF
movlw 0CH
call LcdSendCommand
;Clear display
call LcdClear
movlw 30 ;Wait 30 ms
call msDelay

75

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;****************
; Secuencia de Reset
;****************
bcf PORTB,LCD_RS ;LCD en modo de comando
;envio secuencia de reset al LCD
bsf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 5 ;espero 5 ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;eseperp 1ms
call msDelay
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
bsf PORTB,LCD_E ;Enables E
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ;Disables E
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
;bus a cuatro bits
movlw 28H;
call LcdSendCommand
;Entry mode set, incremento no desplazamiento
movlw 06H;
call LcdSendCommand
;Display ON, Curson OFF, Blink OFF
movlw 0CH
call LcdSendCommand
;Clear display
call LcdClear

;**********************************************************************
LcdSendByte
;guardo valor a enviar
movwf tmpLcdRegister
;envio cuatro bits altos
bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc tmpLcdRegister,4
bsf PORTB,LCD_DB4
76

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

btfsc tmpLcdRegister,5
bsf PORTB,LCD_DB5
btfsc tmpLcdRegister,6
bsf PORTB,LCD_DB6
btfsc tmpLcdRegister,7
bsf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
;envio cuatro bits bajos
bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc tmpLcdRegister,0
bsf PORTB,LCD_DB4
btfsc tmpLcdRegister,1
bsf PORTB,LCD_DB5
btfsc tmpLcdRegister,2
bsf PORTB,LCD_DB6
btfsc tmpLcdRegister,3
bsf PORTB,LCD_DB7
bsf PORTB,LCD_E ; habilito LCD
movlw 1 ;espero 1ms
call msDelay
bcf PORTB,LCD_E ; deshabilito LCD
movlw 1 ;espero 1ms
call msDelay
return
END

CURSO INTEGRAL
PIC
Captulo 9
Manejo de una conexin RS232

En esta seccin analizaremos como es posible dotar al PIC16F84A de una interface


232 para conectarlo al puerto serial de la computadora. El ejemplo que vamos a
realizar utiliza el circuito para el manejo del LCD de la leccin 8 al cual le aadiremos
la seccin RS232 y as realizar un pequeo terminal RS232. En la prctica, sobre
nuestro circuito podremos visualizar en el LCD los caracteres ASCII transmitidos
desde el puerto serial de nuestro PC utilizando un programa como el Hyperterminal
(Windows 95/98/ME/2000/XP), Telix (MS-DOS) o Minicom (Linux). Veamos el
diagrama esquemtico en la siguiente figura:

77

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Como podemos apreciar estamos y=trabjando sobre la base del circuito del ejercicio
anterior pero aadiendo el circuito integrado U3 y el conector DB9 donde se
pegamos el puerto serial de la computadora y algunos componentes adicionales.

El circuito integrado U3 es un MAX232 (o similar) producido por la empresa Maxim


(http://www.maxim-ic.com), se ocupa de convertir las seales RS232 que estn
entre +/-12 voltios necesarios para transmitir y recibir datos sobre el puerto serial
de nuestro PC, a seales de 0/5 voltios que puedan ser manjedos por el PIC.
Veamos como funciona en detalle la comunicacin serial RS232.

9.1 Que es y para que sirve el RS232


El estandar RS232 define una serie de especificaciones para la transmisin serial de
datos entre dos dispositivos denominados DTE (Data Terminal Equipment) y DCE
(Data Communication Equipment). Vagamente del nombre podemos intuir, el Data
78

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Communication Equipment es un dispositivo que se ocupa de manejar una


comunicacin de datos mientras el Data Terminal Equipment es un dispositivo que se
ocupa de generar o recibir datos.

En la prctica, el RS232 ha sido creada para conectar un terminal de datos (en


nuestro caso un computador) con un modem para la transmisin a distancia de
datos. Para que exista una conexin de dos computadores es necesario disponer de
cuatro dispositivos como se muestra en la figura: un computador (DTE) conectado a
un modem (DCE) y otro modem (DCE) conectado al otro computador (DTE). De este
modo cualquier dato generado en el primer computador es transmitido a travs de
RS232 a su respectivo modem el cual lo transmitir al modem remoto quien a su vez
se lo entregar a su computador via RS232.

Para utilizar el RS232 para conectar entre s dos computadores sin la intervencin de
ningun modem, debemos simular de alguna manera la conexin intermedia
realizando un cable NULL MODEM para poder intercambiar directamente las seales
entre ambos equipos DTE.

Para conectar el PC a nuestro circuito simularemos un DCE haciendole creer al PC


que se ha conectado a un modem. Antes de esto debemos estudiar en detalle el
principio de funcionamiento de una comunicacin serial.

9.2 La comunicacin serial asincrona


Para permitir la transmisin de datos entre el PC y el modem, el estandard RS232
define una serie de especificaciones eltricas y mecnicas. Una de estas establece
que la comunicacin serial puede ser sincrona o asincrona. En nuestro caso
analizaremos solo la comunicacin serial asincrona ignorando completamente la
sincrona debido a que es un poco ms compleja y no se encuentra disponible en
nuestro PC. Este tema lo abordaremos en detalle en nuestro curso prctico de
comunicaciones seriales.

Una comunicacin serial consiste en generar la transmisin y la recepcin de datos


desde un punto a otro usando una sola linea elctrica. En la prtica, si deseamos
transmitir un byte entero debemos enviarlos secuencialmente bit a a bit sobre la
lnea elctrica. Es algo muy parecido a lo que se hace con el cdigo morse. La
diferencia sustancial est en el hecho de que la generacin y la recepcin de datos
no la hace un telegrafista sino un computador, el cual puede manejar velocidades de
transmisin muy superiores.

79

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Veamos un ejemplo prtico de como funciona un PC transmitiendo y receibiendo


mediante la RS232. La realizacin del siguiente experimento no es necesaria, debido
a que supongo que es muy dificil que en nuestro laboratorio de hobbystas contemos
con dos computadoras y un osciloscopio. Para comprender el funcionamiento de lo
anteriormente expuesto podemos referirnos a la siguiente figura.

Se desarrollamos un copia de esta cable podemos conectar dos computadoras a


travs de su puerto serial. Esto es un PC transmisor (derecha) y un PC receptor
(izquierda).

De esta manera obtedremos la mas sencilla de las conexiones RS232.


La lnea Transmit Data (TXD) presente en el pin 3 del conector DB9 macho de
nuestro computador se conecta a la lnea Receive Data (RXD) presente en el pin 2
del segundo PC. Las tierras (GND) presentes en el pin 5 se deben conectar entre s.
Para observar las seales generadas por el PC al transmitir serialmente debemos
conectar las lneas TXD y GND a un osciloscopio y ejecutar un programa de
emulacin como el hyperterminal o similar. Configuramos el puerto serial a 9600
baud, 8 bits de datos, 1 bit de stop, no parity y deshabilitamos el control de flujo
(handshake) via hardware con xon/xoff. En este momento cualquier cosa que
digitemos desde el PC se transmitir directamente al puerto serial. Es importante
resaltar que nuestro programa de emulacin debe estar configurado correctamente
de acuerdo al puerto serial que estemos utilizando (COM1 o COM2). Podriamos
digitar la letra A y verificar que se haya recibido correctamente y visualizar la
transmisin en el osciloscopio. Cuando sobre la lnea no se encuentra ninguna
transmisin en curso, sobre la lnea TXD deben haber -12 voltios, que corresponden
al estado lgico 1. Para indicarle al PC receptor que se ha iniciado una transmisin, el
PC transmisor debe colocar +12 voltios en la lnea TXD durante el tiempo que dure
transmitir un solo bit. Esto es, por un tiempo inverso a la frecuencia o velocidad de
80

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

transmisin. En nuestro caso, si estamos conectados a 9600 bits por segundo, el


voltaje de alimentacin ser de +12 voltios durante: 1/9600 = 0.104 mS.

Esta seal se denomina START BIT y siempre estar presente al inicio de la


transmisin de cada byte. Despus del start bit viene transmitida la secuencia de bits
que componen el caracter ASCII empezando por el bit menos significativo. En el caso
de la A mayscula, corresponde al valor binario 01000001, y su secuencia de
transmisin es la siguiente:

Una vez transmitido el octavo bit (bit 7), el PC enviar automticamente un ltimo
bit en 1 denominado STOP BIT con el que se indica la terminacin de la transmisin
del byte completo. Esta secuencia se repite para cada uno de los bytes que se
transmitan sobre la lnea.
Si en nuestro cable de comunicacin conectamos el pin TXD del receptor (pin 3) con
el pin RXD (pin 2) del PC trasmisor, podremos efectuar una transmisin RS232
bidireccional.

9.3 Como conectar nuestro circuito de ejemplo


Como lo habiamos mencionado, nuestro circuito simula un dispsitivo DCE. Esto
significa que el cable que debemos realizar no puede ser del tipo NULL MODEM, este
tipo de cables es como el que se utiliza para conectar al PC un modem externo. Dado
que los dispositivos DCE siempre vienen dotados de conector DB9 macho, en nuestro
circuito (que corresponde a un DCE) debemos utilizar un DB9 hembra. Su
descripcin de pines se describe en la siguiente tabla:

Pin 1 Detector de seal de lnea recibida (Data Carrier Detect)


Pin 2 Datos recibidos
Pin 3 Datos transmitidos
Pin 4 Terminal de datos listo
Pin 5 Tierra
Pin 6 Conjunto de datos listo
Pin 7 Peticin para enviar
Pin 8 Listo para recibir
Pin 9 Indicador de ring

81

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Algunos PC estn dotados de un conector DB-25 en lugar del convencional DB-9, en


este caso puede remitirse a la siguiente tabla para hallar la equivalencia:

Pin 1 Tierra de proteccin


Pin 2 Datos transmitidos
Pin 3 Datos recibidos
Pin 4 Peticin para enviar
Pin 5 Listo para enviar
Pin 6 Conjunto de datos listo
Pin 7 Tierra
Pin 8 Detector de seal de lnea recibida (Data Carrier Detect)
Pin 20 Terminal de datos listo
Pin 22 Indicador de ring

El cable de conexin entre el PC y nuestro circuito deber poseer un conectro


femenino en un lado para llegar sin problema a la PC y el otro lado debe ser macho
para conectar a nuestro circuito de prueba. La conexin interna de este cable es la
que se muestra en la figura siguiente.

9.4 Funcionamiento del MAX232


En nuestro circuito de ejemplo utilizaremos un driver RS232, el cual corresponde a
un circuito integrado que permite convertir las seales de +/- 12 voltios en seales
de 0/5 voltios que son manejables por el PIC. Siguiendo el esquema elctrico de
nuestro circuito de ejemplo vemos que las seales de transmisin provenientes del
PC entran por el pin 3 del conector DB9 hembra hacia el pin 12 de U3. En el pin 12
de U3 se tendr una seal de 0 voltios cuando sobre el pin 13 lleguen +12 voltios y
una seal de 5 voltios cuando en el pin 13 hayan -12 voltios. Las seales presentes
en el pin 12 de U3 se envia a la lnea RA1 del puerto A del PIC, que en este caso

82

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ser la lnea de recepcin. Con el pin 18 del PIC (RA1) podemos hacer la analoga
con la lnea TXD del PC.

De la misma manera, a travs del pin 17 (RA0) el PIC genera las seales que se
deben enviar al PC. Como vienen en niveles TTL se deben convertir a seales RS232
por medio de U3, para lo cual se conecta al pin 11 (entrada TTL) y por el pin 14
(salida RS232) se envian al PC a travs del pin 2 del conector J2.

9.5 Aplicacin de ejemplo


Finalmente metamole la mano al fuente de nuestra aplicacin de ejemplo y
observemos como recibir y como transmitir datos desde nuestro PIC. En el archivo
LCDTERM.ASM pueden encontrar todo el programa completo de nuestro terminal de
ejemplo. Una vez montado nuestro circuito de ejemplo y programado correctamente
el PIC16F84 podemos conectar nuestro PC al circuito y alimentarlo. Sobre el diplay
aparecer el cursor parpadeando a la izquierda. En este punto podemos iniciar la
ejecucin del programa de terminal emulador (hyperterminal) y configurarlo a 9600
bps, 8 data bit, 1 stop bit, sin paridad y sin ningn control de flujo.
Probemos ahora digitar cualquier caracter en le PC y observar como se visualizan en
el LCD de nuestro circuito. Oprimiendo CTRL-L podemos borrar la visualizacin actual
y escribir nuevamente.

Anlisis del programa


Procedamos ahora a analizar el cdigo fuente de este ejemplo.
Partamos de la lnea 24 donde encontramos las siguientes directivas:
TX equ 0 ;Tx data
RX equ 1 ;Rx data

83

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En donde se asignan las constantes para establecer las lneas del PIC que se van a
utilizar como TX y RX. En este caso solo utilizaremos la lnea de recepcin pues el
mini-terminal solo servir para recibir y visualizar los datos. Estas dos constantes se
utilizan respectivamente en las subrutinas de transmisin y recepcin de caracteres
via RS232: TxChar (lnea 421) y RxChar (lnea 483). Estas dos subrutinas permiten
en la prctica transmitir y recibir bytes en modalidad seral asincrona a 9600 bps, 8
bit de datos, 1 stop bit y sin paridad. Para transmitir un caracter sobre la lnea TX
basta cargar el registro W con el valor que se va a transmitir y efectuar una llamda a
la subrutina TxChar. Por ejemplo, si queremos transmitir el caracter 'A' al PC
debemos escribir:

movlw 'A'
call TxChar
Para recibir caracteres la operacin es un poco ms compleja. Observemos en
nuestro ejemplo la lnea 129:
MainLoop
btfsc PORTA,RX
goto MainLoop
call RxChar
En la prctica en nuestro programa se hace un loop infinito hasta que no se detecte
el estado lgico 0 sobre la lnea RX. Cuando esto ocurre, se deduce que es probable
que sea un START BIT desde el PC y que en consecuencia siga una serie de bits de
datos transmitidos desde el PC. En este punto se debe invocar a RxChar quien se
ocupar de leer cada uno de los bits recibidos, los compila y los almacena en el
registro ShiftReg. Una vez invocada RxChar se debe borrar el registro ShiftReg en
donde se memorizan los bits recibidos.
RxChar
clrf ShiftReg
el registro BitCount se usa para contar el nmero de bits que deben llegar
movlw 8
movwf BitCount
en este momento se debe hacer una espera de alrededor del periodo de 1 bit para
recibir justo a tiempo el valor del BIT 0 despus de recibido el start bit
DELAY BIT_DELAY+BIT_DELAY/2 ;Espera 1.5 bit
ahora si se puede leeer el estado de la lnea de RX e inserta este valor en la bandera
de CARRY (C) del registro STATUS para luego efectuar una operacin de ROTATE
RIGHT F TROUGHT CARRY (RRF) con el registro ShiftReg, de modo que todos los bits
recibidos se acomodan ordenadamente rotando y partiendo desde el menos
significativo, como se muestra en la siguiente figura:

esta lectura se prepra para otra vuelta a intervalos de tiempo pares a la duracin de
un bit de manera que se logre tener el valor de la lnea de RX siempre en el centro
del bit en recepcin.
wDB
btfss PORTA,RX
84

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

goto RxBitL
RxBitH
nop
bsf STATUS,C
goto RxShift
RxBitL
bcf STATUS,C
goto RxShift
RxShift
nop
rrf ShiftReg,F
retardo por un periodo de tiempo par a 1 bit
DELAY BIT_DELAY
continua leyendo cada uno de los bits
decfsz BitCount,F
goto wDB
RxChar debe haber ledo el ltimo bit
return
en este punto en el registro ShiftReg debemos escribir el byte a transmitir al PC.
Una vez se ha leido el byte proveniente del PC, nuestro programa de ejemplo
controla si el byte recibido es un caracter de control o simplemente se trata de un
caracter para visualizar en el LCD.
El nico caracter de control implementado en nuestro miniterminal es el Form Feed
(FF) correspondiente al cdigo ASCII decimal 12. La transmisin de este caracter
equivale a lo que haciamos en las mquinas de escribir cuando corriamos el carro
para avanzar una lnea. En nuestro caso se limpia el contenido del LCD. El form feed
puede ser trnasmitido desde nuestro simulador de terminal desde el PC oprimiendo
la tecla CTRL seguido de la letra L. La siguiente es la parte del cdigo en donde se
maneja la recepcin de un Form Feed:
CheckFormFeed
movlw 12
xorwf ShiftReg,W
btfss STATUS,Z
goto _CheckFormFeed
clrf xCurPos
clrf yCurPos
call LcdClear
goto MainLoop
_CheckFormFeed
en la prctica se controla si el valor recibido de la subrutina RxChar equivale a 12. En
caso afirmativo se borran los registros xCurPos y yCurPos en donde se mantienen los
valores de de X y Y del cursor en el display. En este punto se llama la subrutina
LcdClear la cual se encarga de enviar el comando correcto al LCD para borrar su
contenido. Si el PC no ha transmitido un FF desde el PC, el caracter recibido se envia
al display mediante el siguiente cdigo:
movf ShiftReg,W
call putchar
y luego se retorna a atender el START BIT del prximo caracter con la siguiente
instruccin:
goto MainLoop
La subrutina putchar en la prctica envia el valor contenido en el registro W al
display LCD en la posicin en donde se encuentra el cursor (xCurPos y yCurPos). Los
registros xCurPos y yCurPos apuntan a la prxima posicin en donde se puede
escirbir el siguiente caracter recibido desde el PC.

85

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

9.6 LCDPRINT un programa de ejemplo para la


utilizacin de nuestro terminal
En el archivo lcdprint.zip puede encontrar el programa ejemplo para utilizar nuestro
terminal RS232. El programa se llama LCDPRINT y funciona en ambiente MS/DOS o
desde un prompt MS/DOS sobre Windows 95/98/ME. LCDPRINT permite visualizar
mensajes en nuestro terminal de una manera bastante sencilla. Basta digitar en el
prompt de MS/DOS el comando LCDPRINT seguido del nmero del puerto serial en
donde se encuentre conectado nuestro terminal y luego la cadena a visualizar. Si por
ejemplo queremos visualizar Adios a todos en el miniterminal conectado al puerto
COM2, deberemos digitar:

LCDPRINT /COM2 "Adios a todos"

Este programa a pesar de ser muy sencillo puede tener muchas aplicaciones. Por
ejemplo, lo podemos utilizar para visualizar mensajes durante el inicio de Windows
95, insertando el comando en el interior del archivo AUTOEXEC.BAT.

9.7 Otro ejemplo con la interfaz RS232


Veamos ahora otro ejemplo de utilizacin del RS232. En este caso realizaremos un
circuito que tiene la posibilidad de hacer transmisin mediante la subrutina TxChar.
Se trata de la evolucin del circuito mostrado en la seccin anterior con 4 led y 4
dipswitch el cual le adicionamos la capacidad de la conexin RS232 para poder
manipular los led y leer en el PC el estado de los dipswitch. En la siguiente figura se
muestra el diagrama esquemtico:

86

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

87

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En los archivos rs232io.asm y rs232io.zip se encuentran los programas del


microcontrolador y el programa en MS/DOS RS232IO que permiten enviar desde el
PC el comando de encendido de los LED y de lectura de los cuatro dipswitch.

9.8 Protocolo de comunicacin con el PC


Como se mencion nuestro circuito cuenta con cuatro LED denominados LED
denominados LED1, LED2, LED3 y LED4 y cuatro pulsadores denominados SWITCH1,
SWITCH2, SWITCH3 y SWITCH4. A travs de un simple protocolo podemos decidir
cual de los cuatro LED vamos a activar y cual de los dipswitch vamos a leer.

El protocolo consiste de una serie de cdigos de control que el PC puede transmitir a


nuestro circuito serialmente. La velocidad de transmisin es de 9600 baud, 8 data
bit, 1 stop bit, sin paridad.

Comandos de encendido de los LED


Podemos activar los LED enviando desde el PC los siguientes comandos:

00h Activar LED 1


01h Activar LED 2
02h Activar LED 3
03h Activar LED 4

Comandos para pagar los LED


Para desactivar los LED desde el PC podemos utilizar los siguientes comandos:

10h Desactivar LED 1


11h Desactivar LED 2
12h Desactivar LED 3
13h Desactivar LED 4

Lectura del estado de los pulsadores


Para leer el estado de todos los pulsadores solo necesitamos un solo comando:

20h Leer el estado de los pulsadores

Cuando el PIC recibe este comando desde el RS232, lee el estado de los bist RB4,
RB5, RB6 y RB7 y envia un nico cdigo al PC que refleja el estado de los cuatro
pulsadores. De este cdigo solo los bits 0,1,2,3 indican el estado de los pulsadores
segn la siguiente tabla.

Bit 0 0 = SWITCH1 normal, 1: SWITCH1 activado


Bit 1 0 = SWITCH2 normal, 1: SWITCH2 activado
Bit 2 0 = SWITCH3 normal, 1: SWITCH3 activado
Bit 3 0 = SWITCH4 normal, 1: SWITCH4 activado

88

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Por ejemplo, si solo tenemos el SWITCH 1 oprimido, la respuesta ser 01h


(00000001 en binario). Si se encuentran presionados los SWITCH 2 y SWITCH 4, la
respuesta ser 0Ah (00001010 binario).

Programa de prueba
El programa de prueba RS232IO.EXE nos permite probar el circuito inmediatamente.
El programa funciona en ambiente MS/DOS o prompt MS/DOS sobre Win 95/98.
Si hemos conectado el circuito en el COM2, para prender el LED 1 se deber digitar:
RS232IO /COM2 /LED1=ON
Si ahora lo queremos apagar el LED 1 y prender el LED 4 podemos digitar:
RS232IO /COM2 /LED1=OFF /LED4=ON
Si ahpra queremos activar solo el LED 3 sin modificar el estado de los otros LED:
RS232IO /COM2 /LED3=ON
Podemos conocer el estado actual de los interruptores cun el comando:
RS232IO /COM2 /SWITCH
El programa responder con lo siguiente:
Switch 1: off
Switch 2: off
Switch 3: ---> Active
Switch 4: off
En este supuesto caso, nos indica que solo el SWITCH 3 est oprimido.

;**************************************************
; Curso integral de microcontroladores Pic
; LCDTERM.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Suppress the following MPASM warning message [# 302]:
;"Register in operand not in bank 0. Ensure that bank bits are correct"
ERRORLEVEL -302
;Flag configuration
__CONFIG 3FF1H
;RS232 lines
TX equ 0 ;Tx data
RX equ 1 ;Rx data
;LCD Control lines
LCD_RS equ 2 ;seleccion de registro
LCD_E equ 3 ;Enable
;LCD data line bus
LCD_DB4 equ 4 ;linea de datos db4 de lcd
LCD_DB5 equ 5 ; linea de datos db5de lcd
LCD_DB6 equ 6 ; linea de datos db6 de lcd
LCD_DB7 equ 7 ; linea de datos db7de lcd
;**********************************************************************
; frecuencia del reloj (4 MHz)
;**********************************************************************
BIT_DELAY equ 23 ;Bit delay a 9600 bps
;**********************************************************************
; MACRO subrutina de retardo con el watch dog
; parametros del macro:
89

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;
; VALUE: retardo obtenico=((VALUE-1)*4+5)*(1/(Fosc/4))
;
;**********************************************************************
DELAY MACRO VALUE
LOCAL REDO
movlw VALUE
movwf TmpRegister
REDO
clrwdt ;Clear watch dog timer
decfsz TmpRegister,F
goto REDO
ENDM
;**********************************************************************
; FILE REGISTER
;**********************************************************************
ORG 0CH
tmpLcdRegister res 2
msDelayCounter res 2
TmpRegister res 1
;Registro usado por las subrutinas rs232
ShiftReg res 1 ;registro de desplazamiento
BitCount res 1 ;contador de bits
;ubicacion del cursor
xCurPos res 1
yCurPos res 1
putTempReg res 1
;Reset Vector
;**********************************************************************
; RESET VECTOR
;**********************************************************************
ORG 00H
Start
bsf STATUS,RP0 ;Swap al banco de registros 1
movlw 00011111B ;
movwf TRISA
movlw 11111111B ;
movwf TRISB
bcf PORTA,TX ;liena TX como salida
bcf PORTB,LCD_DB4 ;
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bcf PORTB,LCD_E
bcf PORTB,LCD_RS
bcf STATUS,RP0 ;
;LCD inizializacion
call LcdInit
;Put terminal cursor on 0,0 position
clrf xCurPos
clrf yCurPos
;Wait until receives a start bit from RS232 line
MainLoop
btfsc PORTA,RX ;Received a start bit ?
goto MainLoop ;No, wait.
call RxChar ;Yes, read the byte on receiving...
CheckFormFeed
movlw 12
xorwf ShiftReg,W
btfss STATUS,Z
90

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

goto _CheckFormFeed
clrf xCurPos
clrf yCurPos
call LcdClear
goto MainLoop
_CheckFormFeed
movf ShiftReg,W
call putchar
goto MainLoop
;**********************************************************************
; Delay subroutine
;
; W = Requested delay time in ms (clock = 4MHz)
;**********************************************************************
msDelay
movwf msDelayCounter+1
clrf msDelayCounter+0
; 1 ms (about) internal loop
msDelayLoop
nop
decfsz msDelayCounter+0,F
goto msDelayLoop
nop
decfsz msDelayCounter+1,F
goto msDelayLoop
return
;**********************************************************************
; Put a char to xCurPos, yCurPos position on LCD
;
; W = Char to show
; xCurPos = x position
; yCurPos = y position
;
; xCurPos and yCurPos will be increase automaticaly
;**********************************************************************
putchar
movwf putTempReg
swapf yCurPos,W
iorwf xCurPos,W
call LcdLocate
movf putTempReg,W
call LcdSendData
incf xCurPos,F
movlw 16
xorwf xCurPos,W
btfss STATUS,Z
goto moveLcdCursor
clrf xCurPos
incf yCurPos,F
movlw 2
xorwf yCurPos,W
btfss STATUS,Z
goto moveLcdCursor
clrf yCurPos
moveLcdCursor
swapf yCurPos,W
iorwf xCurPos,W
call LcdLocate
return
;**********************************************************************
; Init LCD
91

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

; This subroutine must be called before each other lcd subroutine


;**********************************************************************
LcdInit
movlw 30 ;Wait 30 ms
call msDelay
;****************
; Reset sequence
;****************
bcf PORTB,LCD_RS ;Set LCD command mode
;Send a reset sequence to LCD
bsf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ;Enables LCD
movlw 5 ;Wait 5 ms
call msDelay
bcf PORTB,LCD_E ;Disables LCD
movlw 1 ;Wait 1ms
call msDelay
bsf PORTB,LCD_E ;Enables LCD
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ;Disables LCD
movlw 1 ;Wait 1ms
call msDelay
bsf PORTB,LCD_E ;Enables E
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ;Disables E
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_DB4
bsf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
bsf PORTB,LCD_E ;Enables LCD
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ;Disabled LCD
movlw 1 ;Wait 1ms
call msDelay
;Set 4 bit data bus length
movlw 28H;
call LcdSendCommand
;Entry mode set, increment, no shift
movlw 06H;
call LcdSendCommand
;Display ON, Curson ON, Blink OFF
movlw 0EH
call LcdSendCommand
;Clear display
call LcdClear
return
;**********************************************************************
; Clear LCD
;**********************************************************************
LcdClear
;Clear display
movlw 01H
call LcdSendCommand
92

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

movlw 2 ;Wait 2 ms
call msDelay
;DD RAM address set 1st digit
movlw 80H;
call LcdSendCommand
return
;**********************************************************************
; Locate cursor on LCD
; W = D7-D4 row, D3-D0 col
;**********************************************************************
LcdLocate
movwf tmpLcdRegister+0
movlw 80H
movwf tmpLcdRegister+1
movf tmpLcdRegister+0,W
andlw 0FH
iorwf tmpLcdRegister+1,F
btfsc tmpLcdRegister+0,4
bsf tmpLcdRegister+1,6
movf tmpLcdRegister+1,W
call LcdSendCommand
return
;**********************************************************************
; Send a data to LCD
;**********************************************************************
LcdSendData
bsf PORTB,LCD_RS
call LcdSendByte
return
;**********************************************************************
; Send a command to LCD
;**********************************************************************
LcdSendCommand
bcf PORTB,LCD_RS
call LcdSendByte
return
;**********************************************************************
; Send a byte to LCD by 4 bit data bus
;**********************************************************************
LcdSendByte
;Save value to send
movwf tmpLcdRegister
;Send highter four bits
bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc tmpLcdRegister,4
bsf PORTB,LCD_DB4
btfsc tmpLcdRegister,5
bsf PORTB,LCD_DB5
btfsc tmpLcdRegister,6
bsf PORTB,LCD_DB6
btfsc tmpLcdRegister,7
bsf PORTB,LCD_DB7
bsf PORTB,LCD_E ;Enables LCD
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ;Disabled LCD
movlw 1 ;Wait 1ms
call msDelay
93

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;Send lower four bits


bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc tmpLcdRegister,0
bsf PORTB,LCD_DB4
btfsc tmpLcdRegister,1
bsf PORTB,LCD_DB5
btfsc tmpLcdRegister,2
bsf PORTB,LCD_DB6
btfsc tmpLcdRegister,3
bsf PORTB,LCD_DB7
bsf PORTB,LCD_E ;Enables LCD
movlw 1 ;Wait 1ms
call msDelay
bcf PORTB,LCD_E ;Disabled LCD
movlw 1 ;Wait 1ms
call msDelay
return
;***********************************************************************
***
; Send a character on RS232
; (9600 baud,8 data bit, 1 stop bit, No parity)
;
; Input: W = Character to send
;***********************************************************************
***
TxChar
movwf ShiftReg
movlw 8 ;Data lenght
movwf BitCount
bcf PORTA,TX ;Send start bit
nop
nop
nop
nop
nop
nop
nop
DELAY BIT_DELAY
;Tx loop
TxLoop
btfss ShiftReg,0
goto TxLo
nop
bsf PORTA,TX
goto cTx
TxLo
bcf PORTA,TX
goto cTx
cTx
nop
rrf ShiftReg,F
DELAY BIT_DELAY
decfsz BitCount,F
goto TxLoop
nop
nop
nop
nop
94

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

bsf PORTA,TX ;Stop bit


DELAY BIT_DELAY
DELAY 2
nop
bsf PORTA,TX
DELAY BIT_DELAY
DELAY 2
Return
;***********************************************************************
***
; Receive a character from RS232
; (9600 baud,8 data bit, 1 stop bit, No parity)
;
; Return code:
;
; ShiftReg: Received character
;***********************************************************************
***
RxChar
clrf ShiftReg
movlw 8 ;Data lenght
movwf BitCount
DELAY BIT_DELAY+BIT_DELAY/2 ;Wait 1.5 bit
;Loop di lettura dei bit dati
wDB
btfss PORTA,RX
goto RxBitL
RxBitH
nop
bsf STATUS,C
goto RxShift
RxBitL
bcf STATUS,C
goto RxShift
RxShift
nop
rrf ShiftReg,F
DELAY BIT_DELAY
decfsz BitCount,F
goto wDB
return
END

;**************************************************
; Curso integral de microcontroladores Pic
; RS232IO.ASM
;
; (c) 2003, WELGOS electronica
; http://www.wellgos.com
;**************************************************
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
;Suppress the following MPASM warning message [# 302]:
95

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

;"Register in operand not in bank 0. Ensure that bank bits are correct"
ERRORLEVEL -302
;Flag configuration
__CONFIG 3FF1H
;RS232 lines
TX equ 0 ;Tx data
RX equ 1 ;Rx data
;I/O lines on PORTB
LED1 equ 0
LED2 equ 1
LED3 equ 2
LED4 equ 3
SWITCH1 equ 4
SWITCH2 equ 5
SWITCH3 equ 6
SWITCH4 equ 7
;Command code from PC
LED1_ON equ 00h
LED2_ON equ 01h
LED3_ON equ 02h
LED4_ON equ 03h
LED1_OFF equ 10h
LED2_OFF equ 11h
LED3_OFF equ 12h
LED4_OFF equ 13h
GET_SWITCH equ 20h
;**********************************************************************
; Clock frequency related constant (4 MHz)
;**********************************************************************
BIT_DELAY equ 23 ;Bit delay a 9600 bps
;**********************************************************************
; MACRO - Delay subroutine with watch dog timer clearing
;
; Macro parameters:
;
; VALUE: Delay obtained = ((VALUE-1)*4+5)*(1/(Fosc/4))
;
;**********************************************************************
DELAY MACRO VALUE
LOCAL REDO
movlw VALUE
movwf TmpRegister
REDO
clrwdt ;Clear watch dog timer
decfsz TmpRegister,F
goto REDO
ENDM
;**********************************************************************
; FILE REGISTER
;**********************************************************************
ORG 0CH
;Register used by msDelay subroutine and DELAY macro
msDelayCounter res 2
TmpRegister res 1
;Register used by RS232 subroutines
ShiftReg res 1 ;Shift register
BitCount res 1 ;Bit counter
DummyReg res 1
;**********************************************************************
; RESET VECTOR
;**********************************************************************
ORG 00H
96

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Start
bsf STATUS,RP0 ;Swap to register bank 1
movlw 00011111B ;Sets the whole PORTA as input
movwf TRISA
movlw 11111111B ;Sets the whole PORTB as input
movwf TRISB
bcf PORTA,TX ;Sets TX line as output
bcf TRISB,LED1 ;Set output line on PORTB
bcf TRISB,LED2
bcf TRISB,LED3
bcf TRISB,LED4
bcf STATUS,RP0 ;Swap to register bank 0
bcf PORTB,LED1 ;Turn off each leds
bcf PORTB,LED2
bcf PORTB,LED3
bcf PORTB,LED4
;Wait until receives a start bit from RS232 line
MainLoop
btfsc PORTA,RX ;Received a start bit ?
goto MainLoop ;No, wait.
call RxChar ;Yes, read the byte on receiving...
;***********************
; Check for PC commands
;***********************
;***********************
; LED1_ON
;***********************
Led1On
movlw LED1_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led1On
bsf PORTB,LED1
goto MainLoop
_Led1On
;***********************
; LED2_ON
;***********************
Led2On
movlw LED2_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led2On
bsf PORTB,LED2
goto MainLoop
_Led2On
;***********************
; LED3_ON
;***********************
Led3On
movlw LED3_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led3On
bsf PORTB,LED3
goto MainLoop
_Led3On
;***********************
; LED4_ON
;***********************
Led4On
97

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

movlw LED4_ON
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led4On
bsf PORTB,LED4
goto MainLoop
_Led4On
;***********************
; LED1_OFF
;***********************
Led1Off
movlw LED1_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led1Off

bcf PORTB,LED1
goto MainLoop
_Led1Off
;***********************
; LED2_OFF
;***********************
Led2Off
movlw LED2_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led2Off
bcf PORTB,LED2
goto MainLoop
_Led2Off
;***********************
; LED3_OFF
;***********************
Led3Off
movlw LED3_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led3Off
bcf PORTB,LED3
goto MainLoop
_Led3Off
;***********************
; LED4_OFF
;***********************
Led4Off
movlw LED4_OFF
xorwf ShiftReg,W
btfss STATUS,Z
goto _Led4Off
bcf PORTB,LED4
goto MainLoop
_Led4Off
;***********************
; GET_SWITCH
;***********************
GetSwitch
movlw GET_SWITCH
xorwf ShiftReg,W
btfss STATUS,Z
goto _GetSwitch
swapf PORTB,W ;Read the switch state and send
98

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

movwf DummyReg ;it to the PC


comf DummyReg,W
andlw 0Fh
call TxChar
goto MainLoop
_GetSwitch
goto MainLoop

;**********************************************************************
; Delay subroutine
;
; W = Requested delay time in ms (clock = 4MHz)
;**********************************************************************
msDelay
movwf msDelayCounter+1
clrf msDelayCounter+0
; 1 ms (about) internal loop
msDelayLoop
nop
decfsz msDelayCounter+0,F
goto msDelayLoop
nop
decfsz msDelayCounter+1,F
goto msDelayLoop
return
;***********************************************************************
***
; Send a character on RS232
; (9600 baud,8 data bit, 1 stop bit, No parity)
;
; Input: W = Character to send
;***********************************************************************
***
TxChar
movwf ShiftReg
movlw 8 ;Data lenght
movwf BitCount
bcf PORTA,TX ;Send start bit
nop
nop
nop
nop
nop
nop
nop
DELAY BIT_DELAY
;Tx loop
TxLoop
btfss ShiftReg,0
goto TxLo
nop
bsf PORTA,TX
goto cTx
TxLo
bcf PORTA,TX
goto cTx
cTx
nop
rrf ShiftReg,F
DELAY BIT_DELAY
decfsz BitCount,F
goto TxLoop
99

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

nop

nop
nop
nop
bsf PORTA,TX ;Stop bit
DELAY BIT_DELAY
DELAY 2
nop
bsf PORTA,TX
DELAY BIT_DELAY
DELAY 2
return
;***********************************************************************
***
; Receive a character from RS232
; (9600 baud,8 data bit, 1 stop bit, No parity)
;
; Return code:
;
; ShiftReg: Received character
;***********************************************************************
***
RxChar
clrf ShiftReg
movlw 8 ;Data lenght
movwf BitCount
DELAY BIT_DELAY+BIT_DELAY/2 ;Wait 1.5 bit
;Loop di lettura dei bit dati
wDB
btfss PORTA,RX
goto RxBitL
RxBitH
nop
bsf STATUS,C
goto RxShift
RxBitL
bcf STATUS,C
goto RxShift
RxShift
nop
rrf ShiftReg,F
DELAY BIT_DELAY
decfsz BitCount,F
goto wDB
return
END

100

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

CURSO INTEGRAL
PIC
Captulo 10
Prcticas con el entrenador

10.1 Multiplexaje de teclado

En la siguiente figura se muestra la forma de instalar un teclado de 16


elementos, requeriendo de solo 8 lneas I/O para realizar adecuadamente la
lectura. Esta configuracin se denomina matricial y para manejarla se
requiere el multiplexaje.

101

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

En este caso, las lneas del microcontrolador correspondientes a las filas se


deben configurar como salidas y las correspondientes a las columnas como
entradas.

Normalmente las lneas de entrada permanecen en estado alto debido a las


resistencias de pull-up. Para manejar este teclado se debe enviar
secuencialmente un solo cero por las lneas de salida; por ejemplo, si
enviamos un cero por la lnea RA1, cuando orpimimosuna tecla de la segunda
fila (el, 4, 5, 6 7), un nivel lgico bajo se detectar en el pin
correspondiente a las lneas de entrada (RB0, RB1, RB2 RB3
respectivamente). De esta manera, si se encuentra un nivel lgico bajo en la
lnea RB3 podemos concluir que la tecla presionada fu el dgito 7.

Si queremos explorar todo este teclsdo, bastar con rotar el cero


circularmente, de tal manera que solamente un cero se encuentre en las filas
del teclado, cuando se realiza las lecturas de las lneas de entrada (las
columnas) como se muestra en la siguiente figura.

102

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Cuando el cero llegue a la fila ms significativa del teclado, debe reingresar


en la prxima ocasin por la menos significativa, reiniciando la exploracin
del teclado. Como resultado del programa, un valor comprendido entre 0 y
15 queda almacenado en un registro, dicho valor se muestra en un display
de siete segmentos que se ha conectado a los pines RB4 a RB7, para
comprobar el funcionamiento del sistema. El proceso se efecta a una gran
velocidad, por lo que se tiene la sensacin de que todo el teclado se est
sensando permanentemente.

Otro aspecto que no se puede olvidar, son los rebotes causados por la
pulsacin de una tecla. Cuando una tecla se oprime, sus contactos actan
como resortes y la unin elctrica no es etsbale; se generan una serie de
uniones y desuniones mecnicas durante un intervalo significativo de tiempo.
Estos rebotes pueden dar lugar a que, en una aplicacin real, el programa los
interprete como si hubieran generado muchas pulsaciones, si es queno se
toman los correctivos del caso. La solucin para este problema es que
despus de la deteccin de la tecla pulsada se genere un retardo (entre 100
y 125 ms) en la lectura del teclado, de tal manera que se ignoren los
contactos subsiguientes debido a los rebotes.

10.2 Multiplexaje de displays de siete segmentos

En la siguiente figura se muestran cuatros displays de siete segmentos.


Cuatro pines I/O controlan los transistores NPN que alimentan los ctodos de
cada uno de los displays, en donde el bit menos significativo controla el
display de menor peso. Un puerto de ocho bits maneja cada uno de los
segmentos de los displays, en donde el bit menos significativo controla el
103

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

segmento a, elsiguiente el b, y as sucesivamente, hasta llegar al ms


significativo, que controla el punto decimal del display. Las resistencias
tienen como objeto limitar la corriente que fluye a travs de los segmentos y
que ingresa a los pines del microcontrolador. Por la configuracin es fcil
deducir que cuando se tiene un nivel bajo en la base del transistor ste se
comporta comoun interruptor abierto y no se presenta corriente entre emisor
y colector; se necesita tener un uno lgico en las bases de stos para que el
transistor se comporte como un interruptor cerrado y se presente dicha
corriente. Pero an cuando los transistores se comporten como interruptores
cerrados, no se encender ningn display si la salida del puerto que maneja
los segmentos tiene niveles lgicos bajos (ceros); para encenderlo es
necesario colocar un nivel lgico alto en el pin de salida correspondiente a
cada segmento.

As por ejemplo, si queremos mostrar un tres en el segundo display menos


significativo debemos establecer bsicamente los siguientes pasos: *Colocar
el nmero binario 0010 en el puerto que controla los transistores
Enviar el nmero binario 01001111 por el puerto que controla los
segmentos.

Un buen observador encontrar que aunque los anteriores pasos consiguen el


objetivo propuesto (mostrar en pantalla el nmero 3) este proceso puede
conllevar efectos indeseados. Por ejemplo, si el puerto que controla los
segmentos tena un valor diferente del binario 00000000 o del 01001111,
entre la ejecucin de los dos pasos dados se mostrar en el display un
nmero o un smbolo que es diferente del valor deseado. Por ello, es
conveniente apagar momentneamente los segmentos, de tal manera que
nos permita seleccionar adecuadamente el display en cuestin y posterior a
esto, enviar el dato correcto a los segmentos; por lo tanto, un paso 0 que se
debe agregar a este proceso es el de colocar el nmero 00000000 en el
puerto que controla los segmentos.
Otra opcin que permite obtener el mismo resultado, con un proceso
diferente sera el siguiente:
Colocar el nmero binario 0000 en el puerto que controla los transistores
Enviar el nmero binario 01001111 por el puerto que controla los
segmentos
Colocar el nmero binario 0010 en el puerto que controla los transistores

Ahora, si pretendemos visualizar no uno sino los cuatro displays de siete


segmentos, es necesario empezara controlar los transistores
secuencialmente a la vez que se enva por el puerto que controla los
segmentos los datos correspondientes al display en cuestin, realizando este
proceso a una velocidad tal que de nuevo parezca que el proceso se est
realizando simultneamente sobre todos los displays. El tiempo en que
necesitamos sostener el dato en cada display puede variar
significativamente, dependiendo fundamentalmente del valor de las
104

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

resistencias limitadoras, del nmero de dgitos que se tengan que mostrar y


de las caractersticas propias del display; experimentalmente se encuentra
que mostrar cada dgito durante tres milisegundos, cuando se tienen
resistencias limitadoras de 100 ohm, proporcionan un brillo aceptable de un
display estndar y una buena visualizacin a una distancia prudente.

Un variante para este sistema consiste en utilizar un decodificador para


manejar los displays de siete segmentos, en este caso no se requiere la
lectura de tablas y el dato correspondiente se puede llevar al puerto
directamente.

10.3 Manejo de motor paso a paso


Los motores paso a paso se consideran uno de los elementos ms
importantes en proyectos de automatizacin, robtica, etc., debido a la
105

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

preisin de sus movimientos y a su naturaleza digital, lo que facilita


enormemente su manejo.En este caso ,utilizaremos un microcontrolador PIC
como elemento principal para guiar la posicin de un motor de esta clase.
Primero haremos una breve descrpcin de este tipo de motores, luego se
muestra la forma de conectarlo al microcontrolador para conseguir un
movimiento de paso completo y por ltimo se hace un ejercicio con
movimientos en medio paso.

Motores paso a paso


Utilizaremos motores de cuatro bobinas. Este tipo de motores se identifican
porque tienen 5, 6, u 8 cables. En el primer caso existe un cable que es
comn a todos los dems, para el de 6 cables se tiene un comn para cada
pareja de bobinas y en el de 8 cables cada bobina es independiente. En la
siguiente figura se muestra su estructura, incluyendo los colores de los
cables (que son estndares).

Este tipo de motores poseen la ventaja de que pueden operar con una sola
fuente, mientras que los motores de dos bobinas requieren polaridad positiva
y negativa, hacindose necesario utilizar circuito en puente. En la figura
anterior se muestra la forma de conectar el motor de ocho cables. Debe
notarse que los cables rojos y negros se unen para conectarlos a la fuente
positiva. De aqu se puede deducir como sera la conexin para 5 y 6 cables.

El movimiento del motor se obtiene al energizar las bobinas en un orden


determinado. Esto se puede hacer de dos formas: la primera consiste en
106

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

activar una sola bobina a la vez (manejo por ola), la segunda es el manejo
de dos fases o bobbinas al mismo tiempo. Con este ltimo mtodo se puede
conseguir mayor torque. En la siguiente figura se muestran los diagramas de
tiempo de los dos mtodos anteriores.

Control del motor a pasos completos


Cada uno de los pasos se logra cuando se encienden las bobinas
correspondientes segn la secuencia. Tambin se debe aclarar que el punto
comn delas bobinas del motor se debe conectar a +5V, ya que este es el
dato suministrado por el fabricante en la plca de datos del mismo.

107

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Para controlar el motor se utiliza el microcontrolador PIC16F84A, el cual est


empleando un cristal de 4 MHz y utiliza cuatro pines del puerto A (RA0-RA3)
como salidas, para activar o desactivar los transistores que manejan cada
una de las bobinas. En la siguiente figura se muestra el diagrama
esquemtico correspondiente, el cual incluye una tabla con la secuencia que
se debe seguir para conseguir que el motor gire.

Viendo la tabla de la secuencia se puede deducir que con simples rotaciones


de un registro se puede conseguir el objetivo. Cada vez que se enciende la
bobina correspondiente a un valor de la tabla, el motor se mueve un paso.
Por lo tanto para que el motor de un giro completo, debe dar tantos pasos
segn el tipo de motor que se est trabajando.

Para que el motor gire en sentido contrario, slo se debe invertir la


secuencia, es decir, leer la tabla en sentido inverso. Cuando el motor no est
en movimiento se debe garantizar que todas las bobinas estn
desenergizadas. Esto se hace para evitar posibles daos al motor.

108

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Para el ejercicio del motor paso a paso, monte el esquema de la siguiente


figura y el programa que se muestra enseguida.

;**********************************
; Curso integral de microcontroladores PIC *
; WWW.WELLGOS.COM *
; MOTOR PASO A PASO *
;**********************************

PROCESSOR 16F84
RADIX DEC

INCLUDE "P16F84A.INC"

ORG 0x0C

CONTAD RES 1
CONTAD1 RES 1
CONTAD2 RES 1

ORG 0

109

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

BSF STATUS,RP0 ; ENTRA AL BANCO 1


MOVLW B'11111' ; CARGA '11111' EN EL REGISTRO DE TRABAJO 'W'
MOVWF TRISA ; CARGA 'W' EN EL PUERTO A
MOVLW B'00000000' ; CARGA '00000000' EN EL REGISTRO DE TRABAJO
MOVWF TRISB ; CARGA 'W' EN EL PUERTO B
BCF STATUS,RP0 ; SALE DEL BANCO 1 AL BANCO 0

INICIO
BTFSC PORTA,0 ; En este puerto va el pulsador de giro a la
izquierda
GOTO INICIO1
GOTO IZQUIER
INICIO1 BTFSC PORTA,1 ;En este puerto va el pulsador de giro a la
derecha
GOTO INICIO

DERECHA MOVLW B'00001100'


MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
MOVLW B'00000110'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
MOVLW B'00000011'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
MOVLW B'00001001'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
GOTO INICIO

IZQUIER
MOVLW B'00001001'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
MOVLW B'00000011'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
MOVLW B'00000110'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ

110

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

MOVLW B'00001100'
MOVWF PORTB
CALL DIEZ
CALL DIEZ
CALL DIEZ
GOTO INICIO

;*********************************
; RUTINA DE RETARDO
;*********************************

UNSEG
MOVLW .10
MOVWF CONTAD2
UNSEG1
CALL CIEN
DECFSZ CONTAD2,1
GOTO UNSEG1
RETURN

CIEN
MOVLW .100
MOVWF CONTAD
CLRF CONTAD1
UNSEG2
NOP
DECFSZ CONTAD1,1
GOTO UNSEG2
DECFSZ CONTAD,1
GOTO UNSEG2
RETURN

DIEZ
MOVLW .10
MOVWF CONTAD
CLRF CONTAD1
UNSEG3
NOP
DECFSZ CONTAD1,1
GOTO UNSEG3
DECFSZ CONTAD,1
GOTO UNSEG3
RETURN

END

111

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

10.4 Manejo de motor dc

Para activar un motor DC basta alimentadr con voltaje DC sus terminales.


Pero como hacer que el motor cambie su sentido de giro? Si cambiamos la
polaridad con que alimentamos el motor, se cambia su sentido de giro. Pero
como hacer esto desde un microcontrolador?

Para activar el motor podemos utilizar un transistor conectado a un rel.

NOTA Si utilize reles, recuerde colocar un diodo en paralelo a la bobina del rele
para controlar corrientes de fuga que puedan afectar los circuitos.

En esta figura se muestra una sencilla conexin que permite controlar la


activacin del motor desde un microcontrolador. Al aplicar un 1 lgico el
motor gira hacia adelante y aplicanco un 0 lgico el motor se detiene.

En esta figura, al aplicar un 1 lgico el motor gira hacia atrs y aplicanco un


0 lgico el motor se detiene.

Ambos circuitos solo permiten que gire en un solo sentido, hacia adelante en
el primer caso y hacia atrs en el Segundo.

112

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Velocidad de Motor

La manera ms eficiente de controlar esta variable del motor es a travs de


pulsos para obtener un grado de torque determinado, lo cual se refleja en
variacin de la velocidad del motor.

Pero si lo que se necesita es controlar el motor en ambas direcciones desde


un procesador, se necesita una circuitera adicional. Necesitar un puente H.
En la siguiente grfica se puede apreciar una confugracin en H por medio de
rels.

Los reles de la parte superior controlar en voltaje positive hacia el motor y


los rels inferiores controlan el voltaje negativo hacia el motor.

De esta manera, si se activan los rels superior izquierdo y el inferior


derecho, la potencia fluye haciendo que el motor gire hacia adelante. Esto es,
1 en A, 0 en B, 0 en C, y 1 en D.

113

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Para invetir el sentido de giro, se deben activar los reles superior izquierdo e
inferior izquierdo, esto es, 0 en A, 1 en B, 1 en C, y 0 en D.

114

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

PRECAUCION: No debe activar la secuencia para que gire hacia ambos lados,
puede causar un corto circuito que puede afectar el sistema, por ejemplo
activar A y C o B y D.

Puente H Semiconductores
El Puente H se puede implementer con transistores normales o transistores
de efecto de campo (FETs).

En la siguiente figura se muestra como se deben conectar. Estos circuitos de


estado slido proveen las conexiones a la potencia y a la tierra, as como en
la conexin con rels.

Los drivers superiors necesitan ser Fuentes de corriente para lo cual son
buenos los transistores PNP y los P-channel FETs. Los dirvers inferiores
deben ser Buenos sumideros de corriente, por lo que se utilizar transistores
NPN y N-channel FETs.

115

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Si se activan los dos circuitos superiores, el motor se resiste al giro, de


manera que se tiene un mecanismo efectivo de detencin. Lo mismo se
cumple para el caso de los dos circuitos inferiores. Esto se debe a que el
motor es un generador, cuando gira genera un voltaje. Si los terminales del
motor se corto cricuitan, el voltaje generado contraresta el intencin de giro
del motor.

Para cuidar los transistores, conviene adicionar diodos que controlen las
corriente de fuga generadas por las bobinas del motor en los momentos de la
conmutacin de la potencia.

116

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Los transistores, por ser dispositivos semiconductores, tiene cierta


resistencia, la cual causa que no conduzcan mucha corriente. Los Mosfets
son mucho ms eficientes, puede aportar mucha ms corriente y no se
calientan. Ellos por lo general cuentan internamente con los diodos de
proteccin por lo que no necesitan diodos externos.

Es importante que los cuatro cuadrantes de los circuitos de Puente H se


activen y desactiven apropiadamente. Cuando existe una ruta entre los lados
positivo y negativo del puente H adems de la del motor, puede ocurrir un
corto circuito que afecte el sistema. Existen circuitos integrados puentes H en
el comercio, que son mucho ms sencillos de manejar, ms seguros y ms
eficientes que hacerlo uno mismo.

10.5 Manejo de publicidad electrnica


Una de las tendencias ms fuertes de los medios comerciales es el de llegar a
sistemas digitales de publicidad. Este minipublik es un buen principio para los
aficionados a este campo.

En la siguiente figura se muestra el diagrama de conexiones del circuito que


sugerimos como plataforma de pruebas. En el CD se puede descargar el
cdigo fuente de esta aplicacin para que el usuario cree sus propios
patrones.

117

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

El funcionamiento bsico consiste en mandar alternadamente los datos de las


filas y de las columnas a una matriz de diodos led de dimensin 8x8. El dato
se manda por todo el puerto B y mediante los pines del puerto A se origina la
seal de reloj que habilita el paso de esos datos hacia las filas y hacia las
columnas en el momento exacto que corresponda.

El puerto B del microcontrolador se utiliza como bus de datos, conectandose


a las lneas D0-D7 de dos flip-flops octales (74374). Las salidas de estos flip-
flops manejan las lneas de las filas y las columnas. RA0 y RA1 se usan como
reloj para la entrada de los datos en las lneas de filas/columnas.

Para disear una figura se deben poner los datos deseados en la fila en el
puerto B y mandar un flanco de subida para activar el reloj del 374 por el
puerto A (RA1). Ahora se colocan los datos de la columna en el puerto B y se
manda el pulso de activacin del flip flop por el puerto A (RA0). Antes de
movernos a la siguiente fila, se debe poner FF en las lneas de las columnas
para limpiar el display y evitar problemas de fantasmeo.

118

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

10.6 Manejo del tiempo real

El tiempo real es un elemento muy utilizado en muchas aplicaciones con


microcontroladores. Existen circuitos integrados especializados que se
conectan al microcontrolador y que permiten manejar el tiempo real incluso
el calendario. En este ejercicio utilizaremos un cristal de cuarzo de 32.768
KHz como oscilador, lo que nos permite obtener una base de tiempo real
muy precisa, sin necesidad de utilizar ningn circuito integrado externo. Para
ello haga el montaje de la siguiente figura.

Para obtener la base de tiempos basta desarrollar una interrupcin por TMR0
por cada segundo. En la primera parte del programa se tiene las
instrucciones normales del vector de reser donde se direcciona el cuerpo
principal del programa y la direccin de la subrutina de interrupcin.

;*********************** Reset Vector


ORG 0x00 ;Start
goto Main_Prog ;Goto Main_Prog routine
ORG 0x04
goto Interrupt ;Goto Interrupt routine

119

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Dentro de la interupcin se incremetan los registros correspondientes a las


unidades y decenas de los segundos, minutos y horas, para obtener luna
visualizacin de la hora en formato militar.

;********************** Rutina de gestion de interrupcion del TMR0


Interrupt
call Clock
call View_Time
bcf INTCON,T0IF ;Clear interrupt flag TMR0
retfie ;Ritorno dopo interrupt

;******************* Rutina de manejo de las horas, minutos, segundos


Clock
incf Uni_Secondi,F ;Incrementa la unidad de los segundos
movlw 0x0A ;Si las unidades de los segundos
subwf Uni_Secondi,W ;es inferior a 10 sigue
btfss STATUS,Z
return

movlw 0x00 ;Si = 10 borra la unidad de los segundos


movwf Uni_Secondi

incf Dec_Secondi,F ;Incrementa las decenas de segundos


movlw 0x06 ;Si las decenas de segundos
subwf Dec_Secondi,W ;es inferior a 6 sigue
btfss STATUS,Z
return
movlw 0x00 ;Si = 6 borrar las decenas de segundos
movwf Dec_Secondi

Incr_Min ;******************** Incremento minutos en programacion


incf Uni_Min,F ;Incrementa las unidades de minutos
movlw 0x0A ;Si las unidades de minutos son
subwf Uni_Min,W ;inferiores a 10 salta
btfss STATUS,Z
return
;********************** Incremento decenas de minutos
movlw 0x00 ;Si = 10 borra las unidades de minutos
movwf Uni_Min
incf Dec_Min,F ;Incrementa las decenas de minutos
movlw 0x06 ;Si decenas de minutos
subwf Dec_Min,W ;inferior a 6 sigue
btfss STATUS,Z
return

;********************** Incremento unidades de horas


movlw 0x00 ;Si = 6 borra las decenas de minutos
movwf Dec_Min

120

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Incr_Ore ;*************************** Incremento horas en programacion


incf Uni_Ore,F ;Incrementa las unidades de hora
movlw 0x02 ;Si decenas de horas = 2
subwf Dec_Ore,W
btfsc STATUS,Z
call Ore_2X ;llama la rutina de gestion 24 horas
movlw 0x0A ;Si unidad de horas
subwf Uni_Ore,W ;inferior a 10 sigue
btfss STATUS,Z
return

;********************** Incremento decenas de horas


movlw 0x00 ;Si = 10 borra las unidades de hora
movwf Uni_Ore
incf Dec_Ore,F ;Incrementa las decenas de hora
return
;**********************
Ore_2X
movlw 0x04 ;Si la unidad de horas
subwf Uni_Ore,W ;es inferior a 4 sale
btfss STATUS,Z
return
movlw 0x00 ;Si = 4 borra la unidad de horas
movwf Uni_Ore
movlw 0x00 ;borra las decenas de horas
movwf Dec_Ore
return

10.7 Manejo del modulo infrarrojo


Existen diferentes tcnicas para detectar la presencia de cuerpos dentro de
un determinado entorno, pero los detectores pticos en base a luz infrarroja
son de gran popularidad debido a sus grandes ventajas como por ejemplo su
inmunidad ante ambientes ruidosos, humedos o con alta temperatura.

Para poner en funcionamiento la barrera, basta generar una frecuencia


central de transmisin con una tolerancia de +/- 10%, la cual modula la
emisin de luz de los dos diodos LED infrarrojos. Esta frecuencia debe estar
alrededor de los 33 KHz.

El mdulo receptor infrarrojo es un sensor activo que detecta la radiacin IR


por medio de un fotodiodo y mantiene su salida en un nivel activo alto (5V)
mientras no est recibiendo radiacin infrarroja modulada a su frecuencia de
enganche. Sin embargo, cuando una radiacin infrarroja con frecuencia de 33
KHz alcanza su diodo receptor la salida se coloca a nivel bajo.

Veamos como generar la frecuencia de 33 KHz con el microcontrolador.

121

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

10.8 Manejo del frecuencmetro digital con PIC

Con el laboratorio de microcontroladores tendr la opcin de adquirir un


dispositivo medidor de frecuencia de excelente calidad que se puede
constituir en una herramienta de laboratorio muy importante. Sus
caractersticas principales son:

Auto rango
Visualizacin en cuatro displays de siete segmentos
Rango de frecuencias de 0 Hz a 50 MHz
Porttil

En todos los proyectos donde desarrolle generacin o lectura de frecuencia


con sistemas digitales, este dispositivo puede ser de gran utilidad para
realizar todas las comprobaciones del caso.

Este dispositivo se ha construido sobre una tarjeta diseada para ser


manipulada por un usuario de manera similar a como lo hara con una punta
lgica. Esta caracterstica, sumada al alto rango de lecturas que ofrece,
hacen de este instrumento un producto que supera a muchos sistemas
similares que se encuentran en el mercado a un costo ms alto.

Este equipo permite leer frecuencias comprendidas en el rango de 0Hz hasta


50 MHz, y simplemente utiliza un microcontrolador PIC trabajando con un
cristal de 4 MHz. El circuito impreso se ha diseado en forma de lapicero
para facilitar su manipulacin; en l se destacan los cuatro displays de siete
segmentos en donde se visualizar el resultado de las mediciones.
122

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Lectura de los diplays

Como slo cuenta con cuatro diplays para visualizar la lectura, se ha


adoptado una notacin de ingeneira para mostrar el resultado final. De esta
manera los tres primeros dgitos mostrarn un dato que debe ser elevado a
la potencia de 10 indicada en el cuarto diplay, es decir, A.BC*10D. Debido a
esta notacin, el display del exponente se ha ubicado a la derecha y
separado de los tres primeros dentro del circuito impreso. Por ejemplo, una
lectura tpica sera 1,20 x 105 lo que equivale a 1.200 Hz.

123

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ANEXOS
CURSO INTEGRAL
PIC

124

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ANEXO Ae
Descripcin de pines del PIC16F84A
1 RA2
Es una lnea de I/O programable como entrada o salida.
Corresponde al BIT 2 del PUERTO A.

2 RA3
Es una lnea de I/O programable como entrada o salida.
Corresponde al BIT 3 del PUERTO A.

3 RA4 / RTCC
Es un pin multifuncional que puede ser programado como lnea normal de I/O o como lnea
de reloj para la entrada del contador RTCC.
Si se programa como lnea de I/O corresponde al BIT 4 del PUERTO A. A diferencia de los
otros pines, cuando esta lnea funciona como salida, trabaja en configuracin de colector
abierto.

4 MCLR / VPP
En condiciones de normal funcionamento su funcin es la de Master CLeaR es decir, el reset
el cual se activa con un nivel 0. All se puede conectar un circuito externo de reset o
simplemente conectarlo al voltaje positivo.
Cuando el PIC se va a programar "Program Mode" se utiliza como entrada para el voltaje de
programacin Vpp.

5 VSS
Este pin se connecta al negativo de la tensin de alimentacion.

6 RB0
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 0 del PUERTO B y puede ser programado para generar interrupcin.

7 RB1
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 1 del PUERTO B.

8 RB2
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 2 del PUERTO B.

9 RB3
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 3 del PUERTO B.

125

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

1 RB4
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 4 del PUERTO B.

11 RB5
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 5 del PUERTO B.

12 RB6
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 6 del PUERTO B.

13 RB7
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 7 del PUERTO B.

14 VDD
Es el terminal positivo de la alimentacin del PIC. En todas las versiones disponibles del
PIC16F84 (comercial, industrial y automotriz) la tensin puede puede tener un valor mnimo
de 2.0 voltios y un mximo de 6.0 voltios.

5 OSC2 / CLKOUT
Es un pin de conexin en el caso que se este trabajando con quarzo para generar el reloj. Es
una salida en el caso de que se utilize un oscilador RC u otro oscilador externo.

16 OSC1 / CLKIN
Es un pin de conexin en el caso que se este trabajando con quarzo o un circuito RC para
generar el reloj. Es una entrada en el caso de que se utilize un oscilador externo.

17 RA0
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 0 del PUERTO A.

18 RA1
Es una linea de I/O programable como entrada o como salida.
Corresponde al BIT 1 del PUERTO A.

126

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ANEXO B
Conjunto de instrucciones del PIC 16F84
Sintaxis, Descripcin Microchip Operacin equivalente
ADDLW k Suma un literal y W, W = W + k
ADDWF f,d Suma W con f, d = W + f (donde d puede ser W o f)
ANDLW k AND Literal con W, W = W AND k
ANDWF f,d AND W con 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 instruccin
BTFSS f,b Bit Test f, skip if Set, f(b) = 1 ? Si, salta una instruccin
CALL k llamada a la subrutina en la posicin 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 a la direccin k
INCF f,d Increment f, d = f +1 (donde d puede ser W o f)
INCFSZ f,d Increment f, Skip if 0 d = f +1 (donde d puede ser W o f)
si 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 operacin
OPTION Load Option Register, OPTION = W
RETFIE Return from Interrupt. Retorna del servicio de interrupcin
RETLW k Return Literal to W. Retorna de una subrutina con W = k
RETURN Return from Subroutine. Retorna de una subrutina
RLF f,d Rotale Left f through Carry, d = f << 1 (donde d puede ser W o f)
RRF f,d Rotale Right f through Carry, d = f >> 1 (donde d puede ser W o f)
SLEEP Go into Standby Mode. Pone el PIC en standby
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 f Swap f, f = intercambia los bits 0123 con los bits 4567 del registro f
TRIS f Load TRIS. Carga el registro TRIS del registro f, 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)

127

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ADDLW ADD Literal and W


Suma la constante k a W
Sintaxis:
addlw k
Operacin equivalente:
W=W+k
Descripcin:
Suma la costante k al valor memorizado en el acumulador W y pone el resultado en el
acumulador.
Ejemplo:
org 00H
start
movlw 10
addlw 12
...
En este punto del programa el acumulador W valdr 22.
Nota:
Esta instruccin afecta los bits Z, DC y C del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

DC vale 1 si el resultado de la operacin es un nmero superior a 15.

C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0

y 1 si el resultado es negativo o si el bit 7 del registro que contiene el resultado vale 1.

128

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ADDWF ADD W and F


Suma el valor contenido en W con el valor contenido en el registro F
Sintaxis:
addwf f,d
Operacin equivalente:
d = W + f (donde d puede ser W o f)
Descripcin:
Esta instruccin suma el valor contenido en el acumulador W con el valor contenido en el
registro indicado en el parmetro f. El parmetro d es una bandera que indica sobre cual
registro debe ser memorizado el resultado.
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultato viene memorizado en el registro f
Ejemplo:
Veamos un ejemplo de suma entre dos registros:
add1 equ 0CH
add2 equ 0DH
org 00H
movlw 10 ;Primer sumando = 10
movwf add1
movlw 15 ;Segundo sumando = 15
movwf add2
movf add1,W ;W = add1
addwf add2,W ;W = W + add2
Nota:
Esta instruccin influencia los bit Z, DC y C del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

DC vale 1 si el resultado de la operacin es un nmero superior a 15.

C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0

y 1 si el resultado es negativo o si el bit 7 del registro que contiene el resultado vale 1.

129

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ANDLW AND Literal with W


Efecta AND entre W y una costante k
Sintaxis:
andlw k
Operacin equivalente:
W = W AND k
Descripcin:
Efecta una AND entre el valor contenido en el acumulador W y el valor de la constante k.
El resultado se guarda en el acumulador.
Ejemplo:
org 00H
start
movlw 10101010B
andlw 11110000B
...
De haber seguido este programa, el acumulador W valdra 10100000B.
Nota:
Esta instruccin influencia el bit Z del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

130

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

ANDWF AND W with F


Efecta una AND lgica entre el valor contenido en W y el valor contenido en
el registro F
Sintaxis:
andwf f,d
Operacin equivalente:
d = W AND f (donde d puede ser W o f)
Descripcin:
Esta instruccin efecta una AND lgica entre el valor contenido en el acumulador W y el valor
contenido en el registro indicado en el parmetro f. El parmetro d y una bandera que indica
sobre cual registro debe ser memorizado el resultado.
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultato viene memorizado en el registro f
Ejemplo:
La AND lgica puede ser utilizada para enmascarar el valor de algunos bits en el interior de un
registro. Si por ejemplo del nmero binario 01010101B queremos consevar solo los cuatro bits
menos significativos para obtener el valor 00000101B, bastar preparar una mscara del tipo
00001111B y formar una AND con nuestro valor de partida, veamos:

movlw 01010101B ;Memoriza en el registro


movwf 0CH ;0CH el valor inicial de la mscara
movlw 00001111B ;Prepara la mscara de bit
andwf 0CH,W ;Efecta la AND y memoriza el
;resultado en el acumulador W
El resultado en W ser 00000101B como se quera.
W = 00001111 AND
f = 01010101 =
----------------
W = 0000010101
La ANDWF influencia el bit Z del registro STATUS que valdr 1 si el resultado de la operacin
es 0.

131

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

BCF Bit Clear F


Borra un bit en el registro F
Sintaxis:
bcf f,b
Operacin equivalente:
f(b) = 0
Descripcin:
Esta instruccin borra el bit b del registro indicado en f.
Ejemplo:
parm1 equ 0CH
org 00H
movlw 11111111B ;Valor inicial
movwf parm1
bcf parm1,0 ;D0=0
Al termino del programa el registro parm1 valdr 11111110B.
Nota:
Esta instruccin no influencia ningn bit de estado

132

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

BSF Bit Set F


Pone en uno un bit en el registro F
Sintaxis:
bsf f,b
Operacin equivalente:
f(b) = 1
Descripcin:
Esta instruccin pone en uno el bit b del registro indicado en f.
Ejemplo:
parm1 equ 0CH
org 00H
movlw 00000000B ;Valor inicial
movwf parm1
bsf parm1,0 ;D0=1
Al termino del programa el registro parm1 valdr 00000001B.
Nota:
Esta instruccin no influencia algn bit de estado

133

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

BTFSC Bit Test F, Skip if Clear


Salta la instruccin sucesiva si un bit en el registro F vale 0
Sintaxis:
btfsc f,b
Operacin equivalente:
f(b) = 0 ? Si, salta una instruccin
Descripcin:
Prueba el bit b contenido en el registro indicado por f y se salta la instruccin sucesiva si este
vale 0.
Ejemplo:
parm1 equ 0CH
org 00H
movlw 11111110B ;Valor inicial
movwf parm1
loop
btfsc parm1,0 ;D0 = 0 ? Si, salta
goto loop ;No, sigue a loop
Este programa sigue en el loop infinito a menos que hagamos el siguiente cambio:
movlw 11111110B ;Valor inicial
con la instruccin:
movlw 11111111B ;Valor inicial
Nota:
Esta instruccin no modifica ningn bit de estado

134

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

BTFSS Bit Test F, Skip if Set


Salta la instruccin sucesiva si un bit en el registro F vale 1
Sintaxis:
btfss f,b
Operacin equivalente:
f(b) = 1 ? Si, salta una instruccin
Descripcin:
Prueba el bit b contenido en el registro indicado en f y salta la instruccin sucesiva si este
vale 1.
Ejemplo:
parm1 equ 0CH
org 00H
movlw 11111111B ;Valor inicial
movwf parm1
loop
btfss parm1,0 ;D0 = 1 ? Si, salta
goto loop ;No, sigue a loop
Este programa sigue en el loop infinito a menos que hagamos el siguiente cambio:
movlw 11111111B ;Valor inicial
con la instruccin:
movlw 11111110B ;Valor inicial
Nota:
Esta instruccin no modifica ningn bit de estado

135

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

CALL Subroutine CALL


Llamada a subrutina
Sintaxis:
call k
Descripcin:
Invoca la ejecucin de una subrutina memorizada en la etiqueta k. El parmetro k puede
especificarse utilizando directamente el valor numrico de la direccin de la etiqueta.
Ejemplo:
org 00H
call ledOn
...
;Subrutina de encendido de un led
ledOn
bsf PORTB,LED1
return
Cuando la CPU del PIC encuentra una instruccin CALL, memoriza en la pila (STACK) el
valor del registro PC + 1 para poder retomar la ejecucin de la instruccin sucesiva al CALL,
cuando s escribe en el PC la posicin de la subrutina se salta a la ejecucin de esta ltima.

El valor original del PC se repone a la salida de la subrutina con la ejecucin de retorno


RETURN o RETLW. En el PIC16F84 se tienen disponibles 8 niveles en el stack, lo cual
corresponde al nmero mximo de CALL re entrantes, o de instrucciones CALL al interior
de una subrutina.
Nota:
Esta instruccin no influencia ningn bit del registro de estado.

136

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

CLRF CLeaR F register


Borra el registro F
Sintaxis:
clrf f
Operacin equivalente:
f=0
Descripcin:
Esta instruccin borra el valor contenido en el registro indicado en f.
Ejemplo:
Si por ejemplo en el registro TMR0 cuya direccin es 01H, la instruccin para borrarlo ser:
clrf 01H
Si en el inicio de nuestro programa hemos incluido el archivo P16F84.INC, podremos utilizar
el nombre simblico del registro TMR0.
clrf TMR0
Despus de la ejecucin de esta instruccin, el bit Z del registro STATUS se pone en 1.

137

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

CLRW CLeaR W register


Borra el registro W
Sintaxis:
clrw
Operacin equivalente:
W=0
Descripcin:
Borra el contenido del registro W.
Nota:
Despus de la ejecucin de esta instruccin, el bit Z del registro de estado se pone en 1.

138

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

CLRWDT CLeaR WatchDog Timer


Reset el temporizador watchdog
Sintaxis:
clrwdt
Descripcin:
Esta instruccin debe ser utilizada cuando programamos el PIC ocn la opcin de Watchdog
abilitata (fusibile WDTE). En esta modalidad el PIC habilita un timer que, una vez ha
transcurrido un determinado tiempo, efecta el reset del PIC. Para evitar el reset desde
nuestro programa deberemos ejecutar cclicamente la instruccin CLRWDT para borrar el
timer. Si no borramos el timer a tiempo, la circuitera del watchdog (perro guardin)
interpretar esto como un bloqueo del programa que se est ejecutando actualmente y
reiniciar la CPU para desbloquearlo.
Ejemplo:
org 00H
loop
clrwdt
goto loop
Nota:
Esta instruccin no influencia ningn bit de estado.

139

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

COMF COMplement F
Efecta el complemento del registro F
Sintaxis:
comf f,d
Operacin equivalente:
d = NOT f (donde d puede ser W o f)
Descripcin:
Esta instruccin efecta el complemento del valor contenido en el registro indiricado en el
parmetro f. El parmetro d determina el destino del valor obtenido.
Con d = W el valor viene memorizado en el registro W
Con d = F el valor viene memorizado en el registro f.
Ejemplo:
parm1 equ 0CH
org 00H
movlw 01010101B
movwf parm1
comf parm1,F
...
Al terminar la ejecucin del programa el valor del registro parm1 ser 10101010B.
Nota:
Esta instruccin influencia el bit Z del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

140

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

DECF DECrement F register


Decrementa el contenido del registro F
Sintaxis:
decf f,d
Operacin equivalente:
d = f -1 (donde d puede ser W o f)
Descripcin:
Esta instruccin decrementa el contenido del registro indiricado por el parmetro f. El parmetro
d es una bandera que indica sobre cual registro debemos memorizar el resultado.
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f
Ejemplo:
Con el siguiente programa escribimos el valor 23H en el registro de la direccin 0CH y luego lo
decrementamos en uno. Al terminar la ejecucin el registro de la poisicin 0CH contendr el
valor 22H.
movlw 23H ;escribe en W el valor 23H
movwf 0CH ;Copia en el registro 0CH el valor de W
decf OCH,F ;Decremento el valor contenido en el
;registro 0CH
Nota:
Esta instrucci influencia el bit Z del registro STATUS.
Z vale 1 sie el resultado de la operacin vale 0.

141

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

DECFSZ DECrement F, Skip if Zero


Decrementa el valor del registro f y salta la instruccin sucesiva si el
resultado vale zero
Sintaxis:
decfsz f,b
Operacin equivalente:
d = f -1 (donde d puede ser W o f) si d = 0 salta
Descripcin:
Decrementa el valor del registro indicado por f y si el resultado vale zero, salta la instruccin
sucesiva. El resultado del decremento puede memorizarse en el registro f o en el acumulador
W de acuerdo al valor de la bandera d.
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado 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 salta
goto loop ;No, continua
Este programa da 10 vueltas con la instruccin decfsz hasta que counter = 0.
Nota:
Esta instruccin no modifica ningn bit del registro de estado.

142

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

GOTO GO TO address
Lleva la ejecucin a la direccin k
Sintaxis:
goto k
Descripcin:
Determina un salto del programa en ejecucin en la posicin k. El parmetro k puede
especificarse utilizando directamente el valore numrico de la posicin relativa a la etiqueta.
Ejemplo:
org 00H
loop
goto loop
Este programa sigue un ciclo (loop) infinito.
Nota:
Esta instruccin no modifica ningn bit del registro de estado.

143

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

INCF INCrement F
Incrementa el valore del registro indicado F
Sintaxis:
incf f,d
Operacin equivalente:
d = f +1 (donde d puede ser W o f)
Descripcin:
Incrementa el contenido del registro indicado en f y memoriza el resultado en este registro o
en el acumulador W de acuerdo al valor de la bandera d:
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f
Nota:
Esta instruccin altera el bit Z del registro STATUS..
Z vale 1 si el resultado de la operacin vale 0.

144

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

INCFSZ INCrement F, Skip if Zero


Incrementa el valor del registro f y salta a la instruccin sucesiva si el
resultado vale zero
Sintaxis:
incfsz f,b
Operacin equivalente:
d = f +1 (donde d puede ser W o f) si d = 0 salta
Descripcin:
Incrementa el valor del registro indicado por f y si el resultado vale zero salta la instruccin
sucesiva. El resultado del incremento puede memorizarse en el mismo registro f o en el
acumulador W de acuerdo al valor de la bandera d:
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f
Ejemplo:
counter equ 0CH
org 00H
movlw 250 ;counter = 250
movwf counter
loop
incfsz counter,F ;counter = counter + 1
;counter = 0 ? Si salta
goto loop ;No, continua
Este programa ejecuta 256 - 250 = 6 veces la instruccin incfsz hasta que counter = 0. Siendo
counter un registro de 8 bit que cuando llega a 255 y se incrementa asume el valor de 0.
Nota:
Esta instruccin no modifica ningn bit del registro de estado.

145

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

IORLW Inclusive OR Literal with W


Efecta la OR inclusiva entre W y una costante k
Sintaxis:
iorlw k
Operacin equivalente:
W = W OR k
Descripcin:
Efecta la OR inclusiva entre el valor contenido en el acumulador W y el valor de la costante
k.
Ejemplo:
org 00H
start
movlw 00001111B
iorlw 11110000B
...
De haber seguido este programa. El acumulador W valdr 11111111B.
Nota:
Esta instruccin altera el bit Z del registro STATUS.

146

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

IORWF Inclusive OR W with F


Efecta la OR inclusive entre el valor contenido en W y el valor contenido
en el registro F
Sintaxis:
iorwf f,d
Operacin equivalente:
d = f OR W (donde d puede ser W o f)
Descripcin:
Esta instruccin efecta la OR inclusiva entre el valor contenido en el acumulador W y el
valor contenido en el registro indiricado por el parmetro f. El parmetro d determina donde
viene memorizado el resultado de la operacin:
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f
Ejemplo:
parm1 equ 0CH
org 00H
movlw 00001111B
movwf parm1
movlw 11111111B
iorwf parm1,F
Al terminar la ejecucin el valor del registro parm1 ser 11111111B.
Nota:
Esta instruccin altera el bit Z del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

147

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

MOVLW MOVe Literal to W


Asigna a W un valor constante
Sintaxis:
movlw k
Operacin equivalente:
W=k
Descripcin:
Asigna al acumulador W el valor constante k.
Ejemplo:
org 00H
start
movlw 20
...
De haber seguido el programa, el acumulador W valdr 20.
Nota:
Esta instruccin no altera ningn bit de estado.

148

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

MOVF MOVe F
Mueve el contenido del registro F
Sintaxis:
movf f,d
Operacin equivalente:
d = f (donde d puede ser W o f)
Descripcin:
Esta instruccin copia el contenido del registro indiricado por el parmetro f en el
acumulador W o en el mismo registro F. El parmetro d determina el destino.
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f . En este caso la instruccin altera
el bit Z del registro STATUS de acuerdo al valor contenido en el registro f.
Ejemplo:
El siguiente ejemplo copia el valor contenido en el registro con direccin 0CH en el
acumulador W:
movf 0CH,W

149

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

MOVWF MOVe W to F
Mueve el contenido del registro W hacia el registro F
Sintaxis:
movwf f
Operacin equivalente:
f=W
Descripcin:
Esta instruccin copia el contenido del registro W en el registro indiricado en el parmetro f.
Ejemplo:
Si por ejemplo vamos a escribir el valor 10H en el registro TMR0. La instrucciones a seguir
seran las siguientes:
movlw 10H ;escribe en el registro W el valore 10H
movwf 01H ;y lo memoriza en el registro TMR0
Si hemos incluido el archivo P16F84.INC, el cdigo es el siguiente:
movlw 10H ;escribe en el registro W el valor 10H
movwf TMR0 ;y lo memoriza en el registro TMR0
Nota:
Esta instruccin no altera ningn bit de estado.

150

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

NOP No OPeration
Ninguna operacin
Sintaxis:
nop
Descripcin:
Esta intruccin no ejecuta ninguna operacin ms que hacer un retardo de un ciclo de
mquina.
Ejemplo:
Utilizando un quarzo de 4MHz podremos obtener un retardo de 1s para una instruccin
NOP insertada en nuestro cdigo fuente.
nop ;hace un retardo de 1s
Nota:
Esta instruccin no altera ningn bit de estado.

OPTION: load OPTION register


151

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Asigna el valor en W al registro OPTION


Sintaxis:
option
Operacin equivalente:
OPTION = W
Descripcin:
Esta instruccin memoriza en el registro especial OPTION el valor contenido en el
acumulador W.
Ejemplo:
org 00H
start
movlw 01000100B
option
...
Nota:
Esta intruccin puede presentar problemas de compatibilidad con algunos productos de
Microchip. Es ms aconsejable es utilizar la siguiente secuencia:

org 00H
start
bsf STATUS,RP0 ;Activa el banco de registros 1
movlw 01000100B
movwf OPTION_REG
...
En la prctica se aconseja escribir directamente en el registro OPTION del banco 1 mediante
la instruccin MOVWF en lugar de la instruccin OPTION que e el futuro es probable que
no la podamos implementar.

Esta instruccin no altera ningn bit de estado.

RETFIE: RET From Interrupt


Retorna de una interrupcin

152

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Sintaxis:
retfie
Descripcin:
Esta instruccin debe insertarse al terminar el cdigo del servicio de interrupcin para
retornar el control al programa principal.
Ejemplo:
org 00H
loop
goto loop ;Loop infinito
org 04H ;Interrupt vector
intHandler
retfie ;Retorna de la interrupcin
En este cdigo el programa principal sigue un lazo infinito. Si habilitamos una de las
interrupciones del PIC16F84 el control del programa se entregar automticamente al
programa ubicado en la posicin 04H (en el ejemplo: intHandler), la instruccin RETFIE
permitir el retorno al lazo principal.
Nota:
Esta instruccin no altera ningn bit de estado.

RETLW: RETurn Literal to W


153

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Retorna desde una subrutina con una costante en W


Sintaxis:
retlw k
Descripcin:
Esta intruccin retorna el control desde una subrutina al programa principal. A diferencia
de la instruccin RETURN esta permite pasar a travs del acumulador W, el valor constante
k al programa principal.
Ejemplo:
rtc equ 0CH
org 00H
call mySub1
movwf rtc
...
mySub1
nop
retlw 10
Este programa memoriza en el registro rtc el valore 10 pasado desde la subrutina mySub1.
Nota:
Esta instruccin no altera ningn bit de estado.
Ver la instruccin RETURN.

RETURN: RETURN from subroutine


154

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Retorna desde una subrutina


Sintaxis:
return
Descripcin:
Esta intruccin debe insertarse antes de terminar el cdigo dentro de una subrutina para
permitir retornar la ejecucin del programa principal.
Ejemplo:
org 00H
call mySub1
....
mySub1
nop
return
Nota:
En el PIC16F84 podemos anidar hasta 8 llamados a subrutinas de este tipo:
org 00H
call mySub1
....
mySub1
call mySub2
return
mySub2
call mySub3
return
mySub3
return
Nota:
Esta instruccin no altera ningn bit de estado.

155

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

RLF: Rotate Left F through carry


Rota a la izquierda el contenido del registro f passando per il Carry
Sintaxis:
rlf f,b
Operacin equivalente:
d = f << 1 (donde d puede ser W o f)
Descripcin:
Rota el bit contenido en el registro que se indique en f hacia la izquierda (desde el bit menos
significativo hasta el mas significativo) pasando por el bit CARRY del registro STATUS
como se ilustra en la figura:

El contenido del bit CARRY del registro status rota hacia el bit D0 mientras que el valor en
la salida del bit D7 se rota hacia el CARRY. El valor del parmetro d determina el destino
del resultado obtenido al termino de la rotacin:
Con d = W el resultado viene memorizado en el registro W dejando tal cual el valor de f
Con d = F el resultado viene memorizado en el registro f .

Ejemplo:
parm1 equ 0CH
org 00H
clrf C,STATUS ;borra el CARRY
movlw 01010101B ;Valor inicial
movwf parm1
rlf parm1,F
Al termino del programa el registro parm1 valdr 10101010B mientras el CARRY valdr 0.
Nota:
Esta intruccin solo altera el bit CARRY.

RRF: Rotate Right F through carry


156

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Rota a la derecha el contenido el registro f pasando por el Carry


Sintaxis:
rrf f,b
Operacin equivalente:
d = f >> 1 (donde d puede ser W o f)
Descripcin:
Rota los bit contenidos en el registro que se indique en f hacia la derecha (desde el bit mas
significativo hasta el menos significativo) pasando por el bit CARRY del registro STATUS
como se ilustra en la figura:

El contenido del bit CARRY del registro status rota hacia el bit D7 mientras que el valor en
la salida del bit D0 se rota hacia el CARRY. El valor del parmetro d determina el destino
del resultado obtenido al termino de la rotacin:
Con d = W el resultado viene memorizado en el registro W dejando tal cual el valor de f
Con d = F el resultado viene memorizado en el registro f .

Ejemplo:
parm1 equ 0CH
org 00H
clrf C,STATUS ;borra el CARRY
movlw 01010101B ;Valor inicial
movwf parm1
rrf parm1,F
Al termino del programa el registro parm1 valdr 00101010B mientras el CARRY valdr 1.
Nota:
Esta intruccin solo altera el bit CARRY.

SLEEP: go into standby mode


Pone el PIC en standby
157

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Sintaxis:
sleep
Descripcin:
Esta instruccin bloquea la ejecucin programa en curso y pone el PIC en estado de standby
(sleep del ingls to sleep, dormir).
Ejemplo:
org 00H
start
sleep
Nota:
Esta instruccin no altera ningn bit de estado.

158

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

SUBLW: SUBtract W from Literal


Sustrae a k el valor en W
Sintaxis:
sublw k
Operacin equivalente:
W=k-W
Descripcin:
Resta a la constante k el valor memorizado en el acumulador W.
Ejemplo:
org 00H
start
movlw 10
sublw 12
...
De haber seguido este programa el acumulador W valdr 2.
Nota:
Esta instruccin altera los bits Z, DC y C del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

DC vale 1 si el resultado de la operacin es un nmero superior a 15.

C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0

y 1 si el resultado es negativo o si el bit 7 del registro que contiene el resultado vale 1.

159

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

SUBWF: SUBstract W from F


Sustrae el valor contenido en W del valor contenido en el registro F
Sintaxis:
subwf f,d
Operacin equivalente:
d = f - W (donde d puede ser W o f)
Descripcin:
Esta intruccin sustrae el valor contenido en el registro W del valor contenido en el registro
indiricado en el parmetro f. El parmetro d es una bandera que indica sobre cual registro se
debe memorizar el resultado:
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f

Ejemplo:
Analizemos un ejemplo extraido de las hojas de datos de la Microchip:
Si insertamos la instruccin:
subwf REG1,F
Donde reg1 es la direccin de cualquier registro especificado mediante la directiva:
REG1 RES 1
Para un valor inicial de REG1=3 y W=2, despus de la ejecucin tendremos REG1=1 y C=1
debido a que el resultado es positivo.
Para un valor inicial de REG1=2 y W=2, despus de la ejecucin tendremos REG1=0 y C=1
debido a que el resultado es positivo.
Para un valor inicial de REG1=1 y W=2, despus de la ejecucin tendremos REG1=FFH y
C=0 debido a que el resultado es negativo.
Nota:
Esta instruccin altera los bits Z, DC y C del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

C vale 1 si el resultado es positivo o si el bit 7 del registro que contiene el resultado vale 0

y 1 si el resultado es negativo o si el bit 7 del registro que contiene el resultado vale 1.

SWAPF SWAP F
160

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Intercambia el valore de los cuatro bits ms significativos del registro


indicado en F con los cuatro bit menos significativos
Sintaxis:
swap f,d
Operacin equivalente:
f = intercambia los bit 0123 con los bits 4567 de f
Descripcin:
Intercambia el valor de los cuatro bits menos significativos (D7-D4) contenidos en el registro
indiricado en f con los cuatro bits meno significativos (D3-D0) del mismo. El resultado viene
memorizado en el acumulador W o en el mismo registro f segn el valor de d:
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f

Nota:
Esta instruccin no altera ningn bit de estado.

161

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

TRIS: load TRIS register


Asigna el valor de W al registro TRIS
Sintaxis:
tris f
Operacin equivalente:
TRIS di f = W
Descripcin:
Esta instrucin memoriza en uno de los registros especiales TRIS el valor contenido en el
acumulador W. El registro TRIS determina el funcionamiento como entrada o como salida de
las lneas de I/O del PIC. Existe un registro TRIS por cada uno de los puertos de I/O
denominados TRISA, TRISB, etc.
Ejemplo:
org 00H
start
movlw 11111111B
tris PORTA
...
Nota:
En el futuro, para evitar problemas de compatibilidad se aconseja utilizar las siguientes
instrucciones en el momento de configurar los puertos:
org 00H
start
bsf STATUS,RP0 ;Activa el banco registros 1
movlw 11111111B
movwf TRISA
...
En la prctica se aconseja pasar al banco de datos 1 y utilizar la instruccin MOVWF para
configurar los puertos.

Nota:
Esta instruccin no altera ningn bit de estado.

162

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

XORLW: Exclusive OR Literal with W


Efecta la OR exclusiva entre W y una constante k
Sintaxis:
xorlw k
Operacin equivalente:
W = W XOR k
Descripcin:
Efecta la OR exclusiva entre el valor contenido en el acumulador W y el valor constante k.
Ejemplo:
org 00H
start
movlw 00000000B
xorlw 11110000B
...
De haber seguido este programa el acumulador W valdr 11110000B.
Nota:
Esta instruccin altera los bits Z del registro STATUS.
Z vale 1 si el resultado de la operacin vale 0.

XORWF: eXclusive OR W with F


163

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

Efecta la OR exclusiva entre el valor contenido en W y el valor contenido


en el registro F
Sintaxis:
xorwf f,d
Operacin equivalente:
d = f XOR W (donde d puede ser W o f)
Descripcin:
Esta intruccin efecta la OR exclusiva (XOR) entre el valor contenido en el acumulador W
y el valor contenido en el registro indiricado en el parmetro f. El parmetro d es una bandera
que indica sobre cual registro se va a memorizar el resultado.
Con d = W el resultado viene memorizado en el registro W
Con d = F el resultado viene memorizado en el registro f

Esta instruccin altera el bit Z del registro STATUS que valdr 1 si el resultado de la
operacin es 0.
Ejemplo:
Si fueramos a efectuar la XOR entre el registro W y el registro REG1 que se ha definido en
la posicin 0CH con la direttiva:
REG1 EQU 0CH
Podriamos utilizar la instruccin IORWF en dos formas dependiendo de donde queremos
tener el resultado:
xorwf COUNTER,F ;COUNTER = COUNTER XOR W
o:
xorwf COUNTER,W ;W = COUNTER XOR W
Nota:
La OR exclusiva (XOR) es una operacin entre dos bit en donde el bit resultante vale 0 si los
dos bits son iguales. En lenguaje ensamblador la XOR se utiliza para comparar dos valores y
determinar su igualdad. Veamos como:
Si fueramos a determinar si el valor en el registro REG1 es igual a 57H, las instrucciones a
seguir son las siguientes:
movlw 57H ;W = Valor a comparar = 57H
;Resultado. W = 57H
xorwf REG1,W ;W = W XOR REG1 Efectua la XOR con
;el valor en REG1
btfss STATUS,Z ;Salta la instruccin siguiente si el
;resultato de la XOR vale 0, osea
;si el valor de REG1 es igual a 57H
goto diverso ;Salta si es diferente a 57H
goto uguale ;Salta si es igual a 57H

164

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

165

www.welgos.net
CURSO INTEGRAL SOBRE MICROCONTROLADORES

166

www.welgos.net

Das könnte Ihnen auch gefallen