Sie sind auf Seite 1von 66

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez

1

MICROCONTROLADORES PIC
18F4550: EJEMPLOS PRCTICOS EN
LENGUAJE ENSAMBLADOR
Introduccin
Se presenta a continuacin unas notas que tienen por objetivo facilitar al lector en el uso de
microcontroladores PIC 18F4550, mediante una serie de ejemplos prcticos que le permiten
iniciarse en el uso de los mismos, y tambin aprender a escribir sus propios programas, tomando
como base estos ejemplos, complementndolos a sus necesidades especficas aadindole su
toque personal.
La informacin terica se tom de las hojas de datos del fabricante, pero no se pretende ser un
reemplazo de ellas, por lo que siempre se sugiere acudir a las mismas, de tal manera que se
sugiere al lector consultar dicha literatura para abundar sobre el tema que considere que se trata
aqu de una manera muy escueta.
Se agradece la elaboracin de las figuras a Cesar Hugo Pimentel Romero.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
2


Conceptos bsicos
Nuestra cmoda vida moderna lo es gracias a la gran cantidad de artculos y artefactos con los que
interactuamos diariamente sin ni siquiera darnos cuenta!, muchos de estos artefactos son
electrnicos, y recientemente estn basados en las computadoras digitales.
En la historia de las computadoras, los primeros prototipos fueron mecnicos, debido al momento
tecnolgico histrico en el que aparecieron. Cuando aparecen los primeros componentes
electrnicos, de manera natural se utilizaron para realizar los primeros prototipos de las
computadoras electrnicas
Microprocesador. Es un circuito integrado que tiene una alta capacidad de procesamiento de
informacin, usado tpicamente como el CPU de una computadora personal. Est compuesto
bsicamente por un camino de datos (la conexin de un ALU con sus registros) y una unidad de
control.
Los microprocesadores pueden clasificarse como CISC y RISC
En la siguiente tabla se muestra el significado de estos acrnimos
Procesadores RISC.
R: Reduced
I: instruction
S: Set
C: Computer

Procesadores CISC.-
C: Complex
I: Instruction
S: Set
C: Computer

Tabla 1.1 Microprocesadores CISC y RISC
Si una mquina RISC requiere 4 5 instrucciones para hacer lo que una mquina CISC hace en una
instruccin, pero si las instrucciones RISC son diez veces ms rpidas, RISC gana.
Otro concepto muy importante, es el de Sistema mnimo, el cual consiste en agregarle a un
microprocesador, los elementos indispensables necesarios para que pueda ejecutar una tarea
especfica
Computadora: Es un sistema digital de alta capacidad de procesamiento de informacin, recibe
datos de entrada, genera resultados a alta velocidad y con gran exactitud, mediante la ejecucin
de programas.




Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
3











Ilustracin 1 Bloques bsicos que forman una computadora digital


Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
4

Arquitectura de von Neumann
Arquitectura Von Neumann: El tamao de la palabra de memoria y de la palabra de datos es el
mismo (o equivalente), de tal manera que una parte del Mapa de memoria corresponde a
programa y otra corresponde a datos.



Ilustracin 2 Arquitectura Von Neumann



Arquitectura Harvard
El tamao de la palabra de memoria de programa y la palabra de memoria de datos es diferente.
Los mapas de memoria de programa y de memoria de datos son ajenos. Se puede accesar
concurrentemente a instrucciones y a datos.
Es mucho ms rpida, va de la mano con RISC.

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
5


Ilustracin 3 Arquitectura Harvard


Los componentes de una computadora estan conectados mediante buses:
Bus de direcciones: Cuando el procesador lee instrucciones de escribe datos a la memoria a
la que desea accesar. Cada dispositivo de E/S como un monitor, teclado o disco duro tambin
tienen una direccin de memoria.

Los datos son transferidos va el bus de datos, cuando el CPU busca datos de la memoria primero
se leen las direcciones del bus de direcciones, despus el microprocesador genera la seal de
lectura, y accede a las instrucciones mediante el bus de datos.
El bus de control, consiste en un conjunto de seales dedicadas a realizar operaciones tales como
lectura (RD), escritura (WR), especificar si una lectura o escritura se refiere a un dispositivo de
memoria, o a un dispositivo de salida (M/IO), la seal de reset etc.

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
6


Ilustracin 4 Computadora de tres buses
Un sistema puede tener una jerarqua de buses:
Puede usar bus de direcciones, de datos y de control para accesar a la memoria y a un controlador
de E/S. El controlador de E/S, en cambio, podra accesar a todos los dispositivos de E/S usando un
segundo bus llamado: Bus local Bus de E/S. La perspectiva prctica describe al bus PCI, un bus
local usado comunmente en computadoras personales
Microcontroladores
Un microcontrolador es una computadora completa de capacidades limitadas orientada a
efectuar tareas de control, la cual se encuentra encapsulada en un solo circuito integrado.
Es un sistema mnimo encapsulado en un solo circuito integrado, el cual contiene
memorias de: programa, datos, datos no voltiles (en algunos casos), puertos de
entrada/salida, temporizadores/contadores, temporizador viga, oscilador, unidades de
comunicacin serial, convertidores analgico digitales etc.

Existe una amplia variedad de fabricantes de microcontroladores, entre los cuales podemos
mencionar algunos de ellos:

INTEL, el cual es considerado como el padre de los microcontroladores, con la familia MCS
8048, posteriormente comercializ a la popular familia MCS 8051, ambas de 8 bits, tiene
tambin poderosas familias de microcontroladores de 16 bits, por ejemplo: MCS96,
algunos elementos de esta familia tienen convertidores A/D integrados y otros tienen
controladores de motores.

MOTOROLA, con sus familias de microcontroladores 68HC05, 68HC07.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
7


NATIONAL con sus microcontroladores COP 8.

ZILOG contribuye con sus dispositivos Z84 y Z86

TEXAS INSTRUMENTS tiene su familia de microcontroladores de 8 bits TMS370, a la cual
pertenecen dispositivos con una variedad de perifricos y prestaciones, en encapsulados
desde 28 hasta 68 pines.

ATMEL inicialmente contribuy con microcontroladores que eran clones de otros
fabricantes, especialmente de Intel, pero bajo tecnologa Flash, uno de sus elementos
caractersticos es el 89C51, el cual es un clon del Intel 87C51. Actualmente contribuye de
manera muy importante con sus microcontroladores AVR.

MICROCHIP, con su amplia gama de familias de microcontroladores de 8, 16 y 32 bits,
presentan desde microcontroladores en encapsulados de 6 pines, 33 instrucciones y stack
de dos niveles (familia 10F), dispositivos de 8 pines con un conjunto de 33 instrucciones
(familia 16c5x), familias de 35 instrucciones con chips con una variedad de caractersticas y
consecuentemente, diversos nmeros de pines (familias 16xxx), familias poderosas de 77
instrucciones, con un tamao de palabra de instruccin de 16 bits (familias: 17xxx, 18xxx)
varios de estos microcontroladores disponen tambin de interfaz USB., tambin ofrece sus
familias de Controladores digitales de seales: los dsPICs, los cuales son chips poderosos
de 16 bits que incluyen instrucciones para procesamiento de seales mediante su mquina
DSP, debido al auge que han tenido estos procesadores, el fabricante tambin ofrece estos
chips, pero sin la mquina DSP (para aplicaciones que no usan las instrucciones DSP),
obteniendo as la familia PIC24XXX; para realizar aplicaciones inalmbricas: los rfPICs hasta
llegar a los poderosos microcontroladores de 32 bits, con la familia PIC32.

Cada uno de los fabricantes antes mencionados proveen tpicamente de las especificaciones de
sus chips (data sheets), notas de aplicacin, herramientas de desarrollo etc. Algunos fabricantes
venden esta informacin, otros la proporcionan libremente en sus sitios de internet.
NMEROS EN BINARIO, HEXADECIMAL Y DECIMAL
Antes de entrar de lleno a la revisin de los conceptos arquitectnicos fundamentales de los
microcontroladores PIC18F4550, es importante recordar los equivalentes en binario y decimal de
los nmeros hexadecimales, ya que la notacin hexadecimal es abreviada, debido a que cada uno
de sus nmeros representan 4 bits, es ms cmodo y menos susceptible de error escribir un
nmero que cuatro:
decimal Binario Hexadecimal
0 0000 0
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
8

1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
Tabla 1: Equivalentes binarios y decimales de los nmeros hexadecimales
Es altamente recomendable, que el lector memorice estos equivalentes en binario de los nmeros
hexadecimales, ya que finalmente cualquier microprocesador y microcontrolador solamente
procesa nmeros binarios, pero para las personas que escribirn un programa en lenguaje
ensamblador, es ms cmodo usar la notacin abreviada del hexadecimal. Cualquier nmero
binario puede convertirse rpidamente al hexadecimal agrupando los bits de cuatro en cuatro,
iniciando por el bit menos significativo (LSB), por ejemplo:
El nmero de 8 bits 0011 1001, se convierte rpidamente al hexadecimal reemplazando sus dos
grupos de 4 bits, por su equivalente en hexadecimal: 39, como veremos posteriormente, por
compatibilidad con el lenguaje ensamblador de los PICs, podemos anteponer 0x al nmero para
especificar que se trata de un hexadecimal: 0x39, incluso esta notacin nos sirve a nosotros
tambin para no confundirlo con el treinta y nueve decimal.
Otro ejemplo:
11001100010, formando grupos de cuatro bits, iniciando por el LSB tenemos:
110 0110 0010 que es equivalente al hexadecimal 0x662,
Ntese que el ltimo grupo solo fue de 3 bits, pero podemos agregarle un cero a la izquierda sin
alterar su valor, para completar los cuatro bits, tenamos 110, agregndole el cero: 0110
corresponde al hexadecimal 6. Se pueden agregar los ceros necesarios a la izquierda
(correspondiente al nmero hexadecimal ms significativo), para formar grupos de cuatro bits y
reemplazarlo por su equivalente hexadecimal fcilmente.
Ejercicio 1
Convierta los nmeros binarios a hexadecimal, sustituyendo directamente los grupos de 4 bits
por su equivalente en hexadecimal

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
9

a. 110011001010101
b. 110001101010011
c. 101010101110110
d. 110101101001111
e. 100101111101011

Ejercicio 2
Convierta los nmeros hexadecimales a binario, sustituyendo directamente cada dgito decimal
por su equivalente binario
a. 9896
b. A7F2
c. 73B1
d. D53A
e. B3F5



0RGANIZACIN DE LA MEMORIA
Estos dispositivos cuentan con tres bloques de memoria:
Memoria de programa
Memoria RAM de datos
Memoria EEPROM de datos

La memoria de datos y de programa usan buses independientes, lo cual permite acceso
concurrente a esos bloques.

Organizacin de la memoria de programa.
Un contador de programa de 21 bits es capaz de direccionar un espacio de memoria de programa
de 2 Mbyte (MB). Accediendo a una localidad que este entre la memoria implementada
fsicamente y la direccin 2 MB causar una lectura de ceros (una instruccin NOP).

Los PIC 18F4550 tienen 32 Kbyte (KB) de memoria Flash, esto implica que pueden almacenar hasta
16K palabras de instruccin.
El vector de reset es la direccin 0000h y existen dos vectores de interrupcin: el de alta prioridad
tiene la direccin 0008h y el de baja prioridad la 0018h.

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
10

La figura siguiente muestra el mapa de memoria de programa para los dispositivos PIC 18FX550

Ilustracin 5 Mapa de memoria de programa

Stack
La pila (stack) permite cualquier combinacin de hasta 31 llamadas y reconocimientos de
interrupcin. El contador del programa (PC) es metido (pushed) al stack, cuando se ejecuta una
instruccin CALL o RCALL o cuando una interrupcin es reconocida. El PC es recuperado (pulled)
del stack, en cualquiera de las instrucciones siguientes: RETURN, RETLW o RETFIE.
El stack funciona como una RAM de 31 palabras de 21 bits cada una y un apuntador del stack
(STKPTR) de 5 bits.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
11


La parte alta del stack es de lectura y escritura. Existen tres registros: TOSU, TOSH y TOSL, que
mantienen el contenido de la localidad apuntada por el registro STKPTR, esto permite a los
usuarios implementar un stack por software si es que fuera necesario.
El registro STKPTR contiene el valor del apuntador del stack y los bits de estado STKFUL (stack
lleno) y STKUNF (subflujo del stack). El registro 4-1 muestra el registro STKPTR. El apuntador del
stack se incrementa cuando se introducen valores en la pila, y se decrementa cuando se extraen
valores de ella.
Reinicializaciones (resets) por stack lleno, o por desbordamiento por
defecto del stack.
Estos resets son habilitados por la programacin del bit STVREN. Cuando este bit es deshabilitado,
la condicin de full o de underflow pondr los bits STKFUL o STKUNF, respectivamente, pero no
causar una reinicializacin del dispositivo, si el bit STVREN es puesto, adems de ponerse los bits
antes mencionados en caso de que se llene el stack o se produzca un subflujo, causar que se
reinicie (reset) el procesador. Los bits STKFUL y STKUNF deben de limpiarse por software o
mediante un reset por apagado del dispositivo (POR).

PCL, PCLATH Y PCLATU
El contador de programa (PC) especifica la direccin en la que se buscar la instruccin (fetch)
para su ejecucin. El PC es de 21 bits de ancho. El byte mas bajo es llamado el registro PCL, este
registro es de lectura y escritura. El byte alto es el registro PCH, este registro contiene los bits
PC<15:8> y no se puede leer o escribir directamente; se pueden hacer actualizaciones al registro
PCH se pueden efectuar mediante el registro PCLATH. El byte superior es llamado PCU, este
registro contiene los bits PC<20:16> y no se puede leer o escribir directamente, se pueden hacer
correcciones al registro PCU mediante el registro PCLATU.

El PC direcciona bytes en la memoria de programa. Para prevenir que el PC este desalineado con
las palabras de instruccin, el LSB del PCL esta fijo al valor de 0. El PC incrementa por dos las
direcciones de instrucciones secuenciales en la memoria de programa.

CICLO DE INSTRUCCIN.
La entrada de reloj (mediante OSC1) es dividida internamente por cuatro, para generar cuatro
seales de reloj en cuadratura, no traslapados, llamados Q1, Q2 Q3 y Q4. Internamente el PC es
incrementado cada Q1, la instruccin es buscada de la memoria de programa y capturada en el
registro de instruccin en Q4. La instruccin es decodificada y ejecutada durante el siguiente Q1
hasta Q4. Las seales de reloj y la ejecucin del flujo de instrucciones se muestran en la siguiente
figura:
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
12



Ilustracin 6 Divisin del ciclo de reloj

FLUJO DE INSTRUCCIN Y SEGMENTACIN.
Un ciclo de instruccin consiste de cuatro ciclos Q: Q1, Q2, Q3 y Q4, la bsqueda de la instruccin
y la decodificacin son segmentadas (pipelined) de tal manera que la bsqueda toma un ciclo de
instruccin, mientras que la decodificacin y la ejecucin toman otro ciclo de instruccin. Sin
embargo, debido a la segmentacin, cada instruccin se ejecuta efectivamente en un solo ciclo. Si
una instruccin causa que el contador de programa cambie (goto, por ejemplo), entonces se
necesitan dos ciclos para completar la instruccin.


Ilustracin 7 Ejemplo de ejecucin de instrucciones

INSTRUCCIONES EN MEMORIA DE PROGRAMA.
La memoria de programa es direccionada en bytes. Las instrucciones son almacenadas como dos o
cuatro bytes en memoria de programa. El byte menos significativo de una palabra de instruccin,
siempre es almacenado en una localidad de memoria de programa en una localidad par (LSB=0).
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
13


ORGANIZACIN DE LA MEMORIA DE DATOS
La memoria de datos es implementada como RAM esttica. Cada registro en la memoria de datos
tiene una direccin de 12 bits, permitiendo hasta 4096 bytes de memoria de datos. En la figura 9
se muestra la organizacin de la memoria de datos para los PIC18FXX2.

El mapa de memoria de datos est dividido en 16 bancos que contienen 256 bytes cada uno. Los
cuatro bits menos significativos del registro de seleccin de bancos (BSR<3:0> seleccionan cual
banco ser elegido, los cuatro bits ms significativos del BSR no son implementados.


Ilustracin 8 Almacenamiento de instrucciones en memoria de programa
La memoria de datos contiene registros de funcin especial (SFR) y registros de propsito general
(GPR). Los SFRs son usados para control y estado del controlador y funciones perifricas, mientras
que los GPRs son usados para abastecimiento de datos y para guardar resultados de operaciones
de la aplicacin del usuario.

Los SFRs inician en la ltima localidad del banco 15 (0xfff) y se extienden hacia abajo. Cualquier
espacio disponible mas all de los SFRs en el banco, podran implementarse como GPRs. Los GPRs
inician en la primera localidad del banco 0 y crecen hacia arriba. Cualquier lectura a una localidad
no implementada se leer como ceros.


Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
14


Ilustracin 9 Mapa de memoria de datos

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
15

La memoria de datos puede accederse directa o indirectamente. El direccionamiento directo
podra requerir el uso del registro BSR. El direccionamiento indirecto requiere el uso de un registro
de seleccin de archivo (FSR) y un operando de archivo indirecto (INDFn). Cada FSR mantiene una
direccin de 12 bits que puede usarse para acceder a cualquier localidad en la memoria de datos,
sin necesidad de cambiarse de banco.

Para asegurarse que los registros comnmente usados (SFRs y GPRs seleccionados) puedan
accederse en un solo ciclo, sin importar el valor del registro BSR, se ha implementado un banco de
acceso. Un segmento del banco 0 y un segmento del banco 15 comprenden el acceso a la RAM.
REGISTROS DE FUNCIN ESPECIAL
Los registros de funcin especial (SFRs) son registros usados por el CPU y mdulos perifricos para
controlar la operacin deseada del dispositivo. Estos registros se implementan como RAM
esttica.
Los SFRs pueden clasificarse en dos conjuntos:
SFRs asociados con el dispositivo genrico o ncleo (core).
SFRs asociados con las funciones perifricas.

BANCO DE ACCESO
El banco de acceso es una mejora arquitectnica la cual es muy til para la optimizacin de cdigo
de un compilador de C. Las tcnicas usadas por un compilador de C pueden ser tiles para
programas escritos en ensamblador.

La regin de la memoria de datos puede utilizarse para:
Almacenamiento de clculo intermedio de valores.
Variables locales de subrutinas.
Almacenamiento/ conmutacin rpido de variables.
Variables comunes.
Evaluacin/ control rpido de SFRs (sin recurrir a los bancos).

El banco de acceso est compuesto de los 160 bytes superiores en el banco 15 (SFRs) y los 96
bytes inferiores en el banco 0. Esas dos secciones sern referidas como el acceso a la RAM alta y el
acceso a la RAM baja, respectivamente.
Un bit en la palabra de instruccin, especifica si la operacin ocurre en el banco especificado por el
registro BSR o en el banco de acceso. Este bit es denotado por el bit a (por bit de acceso).

Cuando a=0, implica que se permanece en el banco de acceso y la ltima direccin en el acceso a
la RAM baja es seguida por la primera direccin en el acceso a la RAM alta. El acceso a la RAM alta
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
16

mapea los registros de funcin especial (SFRs), de tal manera que esos registros pueden accederse
sin ningn otro apoyo de software. Esto es til para verificar las banderas de estado y para
modificar los bits de control.

REGISTROS DE SELECCIN DE BANCOS
La necesidad de un espacio grande de memoria de propsito general, origina un esquema de
bancos de memoria RAM. La memoria de datos est seccionada en diecisis bancos. Cuando se
usa direccionamiento directo, el registro de seleccin de banco (BSR) debe configurarse para el
banco deseado.

BSR<3:0> mantiene los 4 bits superiores de la direccin de 12 bits de la RAM. Los bits BSR<7:4>
siempre se leern como 0s , y su escritura a ellos no tendr efecto.

La instruccin MOVLB se proporciona en el conjunto de instrucciones, para asistir en la seleccin
de los bancos.

Si el banco seleccionado actualmente no est implementado, cualquier lectura ser de 0s, y
todas las escrituras sern ignoradas. Los bits del registro de estado (STATUS) sern puestos/
limpiados correctamente, de acuerdo a la instruccin ejecutada.
Cada banco se extiende hasta FF (256 bytes). Toda la memoria de datos es implementada como
RAM esttica.

Una instruccin MOVFF ignora el BSR, debido a que las direcciones estn incrustadas en la palabra
de instruccin.

REGISTRO DE ESTADO (STATUS).
El registro de estado (le llamaremos simplemente status en lo sucesivo), contiene el estado
aritmtico del ALU. El registro STATUS puede ser el destino para cualquier instruccin, como
sucede con cualquier otro registro. Si el registro STATUS es el destino de una instruccin que
afecta a la bandera de cero (Z), al acarreo en el cuarto bit (DC), al acarreo (C), al bit de sobre flujo
(OV) o la bandera de signo negativo (N), entonces la escritura a esos cinco bits es deshabilitada.
Esos bits son puestos o limpiados de acuerdo a la lgica del dispositivo. Por lo tanto, el resultado
de una instruccin con el registro STATUS como destino puede ser diferente del esperado. Se
recomienda entonces, que solamente las instrucciones BCF, BSF, SAWPF, MOVFF Y MOVF sean
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
17

usadas para alterar el registro de estado, debido a que esas instrucciones no afectan a los bits de
bandera del registro status: Z, C, DC, OV N.

Ilustracin 10 Registro de estado del procesador
REGISTRO RCON
El registro de control de reset (RCON) contiene los bits de bandera que permiten diferenciar entre
las fuentes de reset del dispositivo. Estas banderas incluyen a los bits TO, PD, POR, BOR y RI. Este
registro es de lectura y escritura.

CONFIGURACIN DEL OSCILADOR
Los PIC18F2455/2550/4455/4550 cuentan con una amplia variedad de opciones para el oscilador,
adems,debido a la existencia del mdulo USB que requiere una seal de reloj estable, se necesita
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
18

contar con un mdulo de reloj independiente para el, que sea compatible con las velocidades de
baja y alta velocidad requeridas por el estandar USB.
Para cumplr con stos requerimientos, esta familia tiene una nueva ramificacin del reloj, para
proporcionar una seal de 48 MHz, para que opere el mdulo USB a mxima velocidad. Debido a
que esta es derivada a partir de la fuente primaria de oscilacin, existe una gran cantidad de
preescalers y postscaler para generar una amplia variedad de frecuencias de oscilacin.
Estos chips pueden funcionar en doce distintas configuraciones del oscilador.
Para saber mas:
Consulte en las hojas de datos del fabricante, las opciones del oscilador.
RESUMEN DEL CONJUNTO DE INSTRUCCIONES
Con la finalidad de iniciar con algunos ejemplos de aplicacin, se presentarn ahora el conjunto de
instrucciones de la familia PIC18FXXX.
La mayora de las instrucciones son ocupan una sola palabra de memoria (16 bits), pero hay tres
instrucciones que requieren dos localidades de la memoria de programa.
Cada palabra de instruccin es de 16 bits dividida en un cdigo de operacin (opcode), lo cual
especifica el tipo de instruccin y uno o ms operandos, lo cual especifica la operacin de la
instruccin.
El conjunto de instrucciones es altamente ortogonal y est agrupado en cuatro categoras bsicas:
Operaciones orientadas a bytes.
Operaciones orientadas a bits.
Operaciones con literales.
Operaciones de control.

El conjunto de instrucciones de los PIC18FXXX est resumido en la tabla 26-2.
La mayora de las instrucciones orientadas a bytes tienen tres operandos:

1. El registro de archivo (representado por f).
2. El destino del resultado (representado por d).
3. La memoria accedida (representada por a).

El operando de registro de archivo f indica cual registro de archivo ser usado por la instruccin.
El operando de destino d indica en donde se colocar el resultado de la operacin:
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
19


Si d=0, el resultado es colocado en el registro de trabajo (WREG).
Si d=1, el resultado es colocado en el registro f especificado por la instruccin.

Todas las instrucciones orientadas a bits tienen tres operandos:
1. El registro de archivo (representado por f).
2. El bit en el registro de archivo (representado por b).
3. La memoria accedida (representada por a).
El operando de bit b, selecciona el nmero del bit afectado por la operacin, mientras el de
registro de archivo f representa el nmero del archivo en el cual est localizado el bit.
Las instrucciones de literal pueden usar algunos de los siguientes operandos:
Un valor de literal que ser cargado en un registro de archivo, especificado por k.
El registro deseado en el cual se cargar el valor de la literal (representado por f).
Ningn operando requerido (representado por -).

Las instrucciones de control pueden usar algunos de los siguientes operandos:

Una direccin de memoria de programa (especificado por n).
El modo de las instrucciones Call o Return (especificado por s).
El modo de instrucciones para lectura y escritura de la tabla (especificado por m).
Ningn operando requerido (representado por -).
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
20



Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
21


Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
22


Todas las instrucciones de una sola palabra son ejecutadas en un solo ciclo, a menos que una
prueba condicional sea verdadera, o que el contador de programa haya cambiado como resultado
de la instruccin. En esos casos, la instruccin toma dos ciclos de instruccin, con el ciclo de
instruccin adicional ejecutado como un NOP.
Una vez que se ha presentado superficialmente el repertorio de instrucciones de los PIC18FXXX,
para mostrar algunos programas de ejemplo, solo nos hace falta revisar algunas directivas del
ensamblador MPASM, que son imprescindibles para escribir programas.

PANORAMA GENERAL DE MPASM
MPASM es una aplicacin basada en el sistema operativo DOS o en WINDOWS, que suministra una
plataforma para desarrollar cdigo en lenguaje ensamblador para las familias de
microcontroladores PIC de 12-bit, 14-bit, 16-bit, y 16-bit incrementadas de Microchip,
manteniendo una compatibilidad directa con el ambiente de desarrollo integrado (IDE) MPLAB.

Directivas del lenguaje
Las directivas son comandos que aparecen en el cdigo fuente, pero no son traducidas
directamente en cdigo de operacin. Son usadas para controlar el ensamblador: su entrada,
salida y localizacin de datos. Muchas de las directivas de ensamblador tienen nombres y formatos
alternos. Esos podran existir para proporcionar compatibilidad con ensambladores previos de
Microchip y para ser compatible con prcticas individuales de programacin.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
23


Existen cinco tipos bsicos de directivas proporcionadas por MPASM:
a. Directivas de control. Permiten secciones de cdigo condicionalmente ensamblado.
b. Directivas de datos. Controlan la localizacin de variables en memoria y proporcionan una
manera para referirse a los datos simblicamente mediante nombres significativos.
c. Directivas de listado. Controlan el formato del archivo de listado (*.lst) generado por
MPASM. Permitiendo la especificacin de ttulos, paginacin y otros controles del listado.
d. Macro directivas. Controlan la localizacin de datos y la ejecucin mediante definiciones
de macros.
e. Directivas de archivo Objeto. Se usan solamente cuando se crea un archivo objeto.
Ahora estamos listos para escribir nuestro primer programa. Se trata de un ejemplo muy simple,
en el cual se han colocado leds en cada uno de los pines del PUERTO D, lo que queremos hacer es
encender secuencialmente cada uno de ellos, para lo cual debemos de declarar dicho puerto como
salida, lo cual conseguimos escribiendo la palabra adecuada de configuracin en su registro de
direccin de datos TRISD, tomando en cuenta que al escribir un 1 en un bit del registro TRISD,
configurar su bit de puerto asociado como entrada, en el caso de escribir un cero se configurar
su bit de puerto respectivo como salida. Esto se muestra en las figuras siguientes, debido a que
esto se cumple para cualquier bit del puerto D, (y en verdad para cualquier puerto de los
microcontroladores PIC), se han representado como los bits de puerto m y n, en donde pueden
tener valores mximos entr 0 y 7, ya que PORTD es de 8 bits
TRISDm 0
PORTDm Out, Salida


TRISDn 1
PORTDn In, entrada

Ntese que esto es mas facil de recordar si escribimos los nombres en ingles: 1 In entrada, 0 Out
salida
TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0
0 0 0 0 0 0 0 0


PORTD0 PORTD0 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0
Salida Salida Salida Salida Salida Salida Salida Salida

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
24

Ejemplo 1 Controlando ocho leds
;******************************************************************************

LIST P=18F4550 ;directiva para efinir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
cont
ENDC
;******************************************************************************
;Reset vector
ORG 0x0000
;Inicio del programa principal
bcf OSCCON,IRCF2,0
bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
bsf PORTD,0,0 ;enciende LED conectado en RD0
correi rlcf PORTD,F,0
call retardo
bra correi
;******************************************************************************
retardo movlw 0xff
movwf cont,0
nada nop
decfsz cont,1,0
bra nada
return
END
Programa E1: Rotacin de luces
En la figura 11 se muestra una pantalla del ambiente de desarrollo integrado MPLAB. En la
ventana en donde pregunta si se desea que el proyecto genere codigo absoluto o relocalizable,
debemos seleccionar absoluto, por ahora.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
25

En la figura 12 se muestra una foto con la conexin de los leds

11 Pantalla de MPLAB

12 Conexin de los leds
Para alambrar la prctica en una tablilla de prototipos (proto board), presentamos el diagrama de
pines:
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
26


Ilustracin 13 Diagrama de pines del microcontrolador 18F4550

;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
cont
ciclo
ENDC ;fin del bloque de constantes
;******************************************************************************
;Reset vector
ORG 0x0000
;Inicio del programa principal
bcf OSCCON,IRCF2,0
bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHz
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
27

movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
bsf PORTD,0,0 ;enciende LED conectado en RD0
correi rlcf PORTD,F,0
call repite ;llama a una rutina ms larga
bra correi
;******************************************************************************
retardo movlw 0xff
movwf cont,0
nada nop
decfsz cont,1,0
bra nada
return
;******************************************************************************
repite movlw d'25' ;llama 25 veces a la rutina retardo
movwf ciclo
llama call retardo
decfsz ciclo,F,0
bra llama
return
END
Programa E1.1 Segunda Versin de rotacin de luces
En la segunda versin del programa de rotacin de luces, el tiempo en el que durar encendido
cada led, ser veinticinco veces ms largo que en el ejemplo 1, esto se logra con la subrutina repite
la cual llama a la rutina retardo veinticinco veces. Notese como el nmero de veces se especifica
directamente en decimal, para lo cual es necesario encerrar el nmero entre apstrofes y debe ir
precedido por una d de decimal, esto est expresado en la instruccin:
movlw d'25' ;llama 25 veces a la rutina retardo
Con esta rutina repite se puede modificar el nmero de veces que se llamar a la rutina retardo
Ejemplo 2 Control de un exhibidor de siete segmentos de nodo comn
conectado al PORTD.
Ahora estamos listos para controlar un exhibidor de siete segmentos. Como ya sabemos existen
bsicamente dos tipos de displays de siete segmentos, de acuerdo a como se muestra en la
siguiente figura:
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
28


14 Displays de siete segmentos


Si ya se entendi el funcionamiento del ejemplo 1, en donde encendemos un led, ahora en este
ejemplo podemos encender ocho leds, dispuestos en un exhibidor de siete segmentos, tambin
llamado por su nombre en ingles display; se mostrarn los dgitos del 0 al 9, la duracin de
exhibicin de cada uno de ellos est determinada por la rutina repite del ejemplo anterior.
Ejemplo2: Control de un exhibidor de siete segmentos
Se muestra en la tabla siguiente, la asignacin de los pines del puerto D para la conexin de los
segmentos del display:
RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
Punto
decimal
G f E d c b A
Tabla E2
Los cdigos de siete segmentos para el display de nodo comn, (considerando en
este caso que encienden con cero) son los siguientes:
Hexadecimal Binario Digito
C0 1100 0000 0
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
29

F9 1111 1001 1
A4 1010 0100 2
B0 1011 0000 3
99 1001 1001 4
92 1001 0010 5
82 1000 0010 6
B8 1011 1000 7
80 1000 0000 8
98 1001 1000 9
Ejercicio E2.1
Usando el mismo orden de los bits mostrado en la tabla E2, genere los cdigos de siete segmentos
para los dgitos hexadecimales faltantes, para un exhibidor de siete segmentos de nodo comn

Ejercicio E2.2
Genere los cdigos de siete segmentos, usando el mismo orden de los bits mostrado en la tabla
E2 para los dgitos hexadecimales, para un exhibidor de siete segmentos de ctodo comn

;******************************************************************************

LIST P=18F4550 ;directiva para efinir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
cont
ciclo
ENDC ;fin del bloque de constantes
;******************************************************************************
;Reset vector
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
30

ORG 0x0000
;Inicio del programa principal
bcf OSCCON,IRCF2,0
bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
cero movlw 0xC0 ;cdigo del cero
movwf PORTD,0
call repite
movlw 0xF9 ;cdigo del uno
movwf PORTD,0
call repite
movlw 0xA4 ;cdigo del dos
movwf PORTD,0
call repite
movlw 0xB0 ;cdigo del tres
movwf PORTD,0
call repite
movlw 0x99 ;cdigo del cuatro
movwf PORTD,0
call repite
movlw 0x92 ;cdigo del cinco
movwf PORTD,0
call repite
movlw 0x82 ;cdigo del seis
movwf PORTD,0
call repite
movlw 0xB8 ;cdigo del siete
movwf PORTD,0
call repite
movlw 0x80 ;cdigo del ocho
movwf PORTD,0
call repite
movlw 0x98 ;cdigo del nueve
movwf PORTD,0
call repite
bra cero
;******************************************************************************
retardo movlw 0xff
movwf cont,0
nada nop
decfsz cont,1,0
bra nada
return
;******************************************************************************
repite movlw d'25' ;llama 25 veces a la rutina retardo
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
31

movwf ciclo
call retardo
llama decfsz ciclo,F,0
bra llama
return
END

Programa E2: Control de un display de siete segmentos
Como podemos apreciar en el cdigo anterior, el control del display es muy simple, consiste
solamente en enviar cada cdigo por el puerto d y llamar a la rutina repite para que permanezca
encendido el tiempo que dure la misma, esto se logra con las instrucciones:
Cero movlw 0xC0 ;cdigo del cero
movwf PORTD,0
call repite

De tal manera que estas tres instrucciones se repiten diez veces, empezando por el cdigo del cero
y terminando con el del nueve, despus de esto se regresa el programa nuevamente al cdigo del
cero, con la instruccin de salto incondicional:
bra cero
Se muestra en la siguiente figura el diagrama de la simulacin en ISIS Proteus:

15 Ventana de simulacin en ISIS
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
32

Ejercicio E2.3
Vimos que el ejemplo anterior, consista en una repeticin de diez veces del mismo bloque de
instrucciones. Reescriba el cdigo del ejemplo 2, disminuyendo el nmero de instrucciones,
usando subrutinas

Ejercicio E2.4
Extienda el programa del ejemplo 2, para mostrar los dgitos hexadecimales del 0,1,2,,F,0


Ejemplo 3: Contador ascendente-descendente
Hasta ahora, hemos realizado ejemplos usando nicamente puertos de salida, por lo cual, el
siguiente ejemplo usar un puerto de entrada RB0, de acuerdo a como se explica en la siguiente
tabla:
RB0 Conteo
1 Ascendente
0 descendente

;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
cont
ciclo
ENDC ;fin del bloque de constantes
;******************************************************************************
;Reset vector
ORG 0x0000
;Inicio del programa principal
bcf OSCCON,IRCF2,0
bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
33

clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
cero movlw 0xC0 ;cdigo del cero
movwf PORTD,0
call repite
btfss PORTB,0,0
bra nueve
uno movlw 0xF9 ;cdigo del uno
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cero
dos movlw 0xA4 ;cdigo del dos
movwf PORTD,0
call repite
btfss PORTB,0,0
bra uno
tres movlw 0xB0 ;cdigo del tres
movwf PORTD,0
call repite
btfss PORTB,0,0
bra dos
cuatro movlw 0x99 ;cdigo del cuatro
movwf PORTD,0
call repite
btfss PORTB,0,0
bra tres
cinco movlw 0x92 ;cdigo del cinco
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cuatro
seis movlw 0x82 ;cdigo del seis
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cinco
siete movlw 0xB8 ;cdigo del siete
movwf PORTD,0
call repite
btfss PORTB,0,0
bra seis
ocho movlw 0x80 ;cdigo del ocho
movwf PORTD,0
call repite
btfss PORTB,0,0
bra siete
nueve movlw 0x98 ;cdigo del nueve
movwf PORTD,0
call repite
btfss PORTB,0,0
bra ocho
bra cero
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
34

;******************************************************************************
retardo movlw 0xff
movwf cont,0
nada nop
decfsz cont,1,0
bra nada
return
;******************************************************************************
repite movlw d'1' ;llama 1 vez a la rutina retardo
movwf ciclo
nada2 nop
call retardo
decfsz ciclo,1,0
bra nada2
return
END
Programa E3: Contador ascendente descendente
En este programa, no es necesario declarar el pin RB0, ya que despus de un reset, los puertos del
microcontrolador estn declarados como entrada. Una vez que se ha mostrado un digito en el
display, el tiempo determinado por la rutina repite, se verifica el nivel en el puerto B, con la
instruccin:
btfss PORTB,0,0
si el nivel de RB0 es alto, la instruccin brincar la instruccin:
bra cero
y mandar a escribir en el puerto D el cdigo de siete segmentos del uno, de lo contrario se
ramificar para mostrar el cdigo de siete segmentos del cero. El programa est formado por la
repeticin de las instrucciones mostradas a continuacin:

uno movlw 0xF9 ;cdigo del uno
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cero
Se observa en el programa E3 la secuencia completa, notando que si el nivel en RB0 es alto, el
conteo ser ascendente, de lo contrario ser descendente.
Ejercicio E3.1
Agregue al programa 3 las instrucciones necesarias para exhibir los dgitos hexadecimales de la A
a la F

Interrupciones
Esta familia de microcontroladores tiene mltiples fuentes de interrupcin. Una interrupcin
consiste en que el procesador suspende temporalmente la tarea que est ejecutando para atender
a algn perifrico, mediante la ejecucin de una rutina de servicio de interrupcin, una vez que se
concluye esta, el procesador continua con la tarea que estaba ejecutando antes de haber sido
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
35

interrumpido. A diferencia de una subrutina ordinaria que termina con una instruccin return, Las
rutinas de servicio de interrupcin deben concluir con la instruccin retfie que significa retorno
de interrupcin habilitada (return from interrupt enable). Al momento de la suspensin de una
tarea, la direccin de la siguiente instruccin que debera ejecutar, se guarda en el stack, y se
carga el contador de programa con el vector de interrupcin. Para los PICS18 existen dos vectores
de interrupcin:
0x0008 vector de interrupcin de alta prioridad
0x0018 vector de interrupcin de baja prioridad
Cada fuente de interrupcin tiene tres bits para controlar su funcionamiento:
1. El bit de habilitacin
2. El bit de bandera
3. El bit de prioridad de interrupcin
Existen diez registros para el control de interrupciones:
RCON Registro de control de reset, tiene el bit de habilitacin de prioridad de
interrupcin

INTCON Registro de control de interrupciones
INTCON2

Registro de control de interrupciones
INTCON3

Registro de control de interrupciones
PIR1, PIR2

Registros de solicitud de interrupcin, contiene los bits de bandera de las
interrupciones perifricas
PIE1, PIE2

Registros de habilitacin de interrupcin, contiene los bits de habilitacin de las
interrupciones perifricas
IPR1, IPR2

Registros de prioridad de interrupcin

Para saber ms, se recomienda revisar en las hojas de datos del fabricante DS39632C:
Registros INTCON
Registros PIR
Registros PIE
Registros IPR
Registros RCON


Timers
Los timers denominados temporizadores en espaol, son dispositivos que nos proporcionan
intervalos regulares de tiempo. Prcticamente cualquier fabricante de microcontroladores incluye
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
36

por lo menos un timer en sus dispositivos, pueden programarse para un intervalo de tiempo, y una
vez que se cumple, interrumpen al procesador para avisarle que ha transcurrido el tiempo
programado.
Pero existen muchas maneras de generar intervalos de tiempo. En la antigedad existieron unos
dispositivos denominados clepsidras, que eran unos tipos de relojes que funcionaban a base de
agua.
Algo similar podemos hacer con la cubeta que se llena con una llave de agua, como la que se
muestra en la figura 5, supongamos que colocamos una cubeta vacia, abrimos la llave y cuando se
llena, han transcurrido 10 segundos, para que no se riegue el agua cerramos la llave justo cuando
empieza a desbordarse el agua. Sabiendo que la cubeta se desbordar en 10 segundos, podemos
lograr que este sistema nos indique cuando ha transcurrido un tiempo menor, por ejemplo, si
quisiramos que nos indique el tiempo de tres segundos, bastara con depositar en la cubeta, un
valor de precarga de 7/10 de su capacidad, de tal manera que cuando se desborde, habrn
transcurrido los tres segundos.

16 Con la llave de agua abierta la cubeta se llena en 10 segundos
Para obtener intervalos de tiempo mayores con este mismo sistema, podramos disminuir el
chorro de agua, cerrando un poco la llave, de tal manera que supongamos que con este ajuste de
la llave, al colocar la cubeta vaca, tarda ahora 10 minutos en llenarse.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
37


17 Con el chorro de agua pequeo, la cubeta se llena en 10 minutos
Cul ser el valor de precarga necesario para que este sistema nos indique que ha transcurrido
un tiempo de 6 minutos? Seria depositar en la cubeta 4/10 de su capacidad. Si se ha entendido el
funcionamiento de este sistema, se entender fcilmente el funcionamiento tpico de los timers.
La familia a la que pertenece el PIC18F4550 incluye los timers:
Timer Nmero de bits
Temporizador/contador 0 8 16
Temporizador/contador 1 16
Timer2 8
Temporizador/contador 3 16

Temporizador/Contador 0
Este perifrico puede funcionar como timer, teniendo como base de tiempo, el ciclo interno de
ejecucin de instrucciones Fosc/4, pero tambin puede funcionar como contador, contando los
impulsos que le llegan por el pin RA4 en su funcin alterna T0CKI (Timer 0 Clock Input).
Este perifrico puede funcionar en dos modalidades: 8 y 16 bits
En la figura siguiente, se muestra el diagrama de bloques del timer 0 en modo de 8 bits. Como se
puede observar, existen multiplexores para seleccionar mediante sus bits de seleccin (los cuales
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
38

son bits de control del timer) su funcionamiento, esto se logra con el bit TOCS (Timer 0 Clock
Select) de tal manera que:
TOCS Configuracin
0 Selecciona como seal de sincrona el ciclo interno de instruccin Fosc/4 es decir,
funciona como timer
1 Selecciona como seal de sincrona los flancos provenientes del pin RA4/T0CK1,
funcionando entonces como contador externo
El bit TOSE (Timer 0 Select Edge) selecciona el flanco con el que se incrementar el registro TMR0L
TOSE Flanco activo para incrementar TMR0L
0 Ascendente
1 Descendente


18 Diagrama de bloques del Timer contador 0 en modo de 8 bits
Como podemos observar en la figura se puede seleccionar un pre divisor (prescaler) programable,
la seleccin de este pre divisor se selecciona con el bit PSA
PSA Prescaler
0 Asignado
1 No asignado

El pre divisor sirve para incrementar la capacidad del timer, si no est asignado, el timer se
incrementar cada vez que reciba un flanco, con cada ciclo de instruccin, segn se halla
programado como contador o temporizador, respectivamente. Este divisor se puede programar
con los bits T0PS (Timer 0 Preescaler Select) de acuerdo a como lo indica la siguiente tabla:
T0PS2 T0PS1 T0PS0 Valor del
Prescaler
0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
39

1 0 1 64
1 1 0 128
1 1 1 256

Estos bits de configuracin que hemos descrito, estn en el registro de control del timer0, llamado
T0CON:
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
TMR0ON T08BIT TOCS TOSE PSA T0PS2 T0PS1 T0PS0
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Como podemos ver en la tabla anterior, el rengln superior indica el valor de los bits despus de
un reset, R/W indica que los bits son de lectura/escritura, el rengln inferior indica el nmero de
bit.
Ya explicamos el funcionamiento de cada bit, solamente faltaron los bits 7 y 6, los cuales tienen la
funcin:
TMR0ON Funcin
0 Timer 0 Apagado
1 Timer 0 Encendido

T08BIT Funcin
0 Timer/Contador 0 de 16 bits
1 Timer/Contador 0 de 8 bits

En la siguiente figura se muestra el diagrama de bloques del temporizador/ contador 0, en
modalidad de 16 bits. Como podemos apreciar en la figura, la diferencia es que se tienen dos
registros de 8 bits, TMR0L y TMR0H, para formar un temporizador/ contador de 16 bits.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
40


19 Diagrama de bloques del temporizador/contador 0 en modo 16 bits
Ahora, recordando nuestro sistema de la cubeta, mostrado en las figuras 5 y 6, podemos hacer
una analoga entre l y el timer:
El prescaler viene siendo la llave, ya que con ella se regula el chorro de agua, y
consecuentemente el tiempo en que tardar en desparramarse
El registro del timer, es equivalente a la capacidad del recipiente, por ejemplo para el
modo de 16 bits, ya no hablaramos de una cubeta, sino tal vez de un tonel
La cantidad de agua que se deposita previamente en la cubeta, para generar intervalos de
tiempo ms pequeos, funciona exactamente de la misma manera que el valor de
precarga del timer
La interrupcin se genera al desbordarse el timer, de la misma manera que nosotros
tenemos que suspender lo que hacemos, cuando escuchamos que se empieza a
desparramar el agua, y corremos a cerrar la llave de agua.
Para los PICS, podemos usar una expresin para calcular el valor de precarga necesario:
Temporizacin=4.Tosc.valor_prescaler.valor_del_timer (1)
En donde Tosc es el valor del periodo del oscilador principal del microcontrolador
De tal manera que:
Valor_del_timer=Temporizacin/(4.Tosc.valor_prescaler) (2)
Debemos de tomar en cuenta, que este valor obtenido en la expresin 2, tenemos que restarlo del
mximo valor del timer (de la misma manera que restbamos la cantidad de agua de la capacidad
total de la cubeta).
De tal manera que:
Valor_precarga=mximo valor del timer-valor_del_timer (3)
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
41

O equivalentemente:
Valor_precarga= mximo valor del timer-Temporizacin/(4.Tosc.valor_prescaler) (4)
El mximo valor para un timer de 8 bits es 0xFF +1, ya que se desborda al iniciar nuevamente en
cero, en decimal este valor es 256.
Para un timer de 16 bits el mximo valor al que puede llegar es 0xFFFF y se desborda en 0xFFFF+1,
es decir 65536 en decimal.
Para saber ms, se recomienda revisar en las hojas de datos del fabricante DS39632C:
Mdulo timer 0
Mdulo timer 1
Mdulo timer 2
Mdulo timer 3


Ejemplo 4
Ahora estamos listos para nuestro siguiente ejemplo, usando el timer 0. Se quiere generar un
tiempo de 500 ms, considerando que el oscilador principal funciona a una frecuencia de 4 MHz y
un prescaler de 64, sustituyendo estos valores en la ecuacin 3 tenemos:
Valor_del_timer=500 ms/(4*0.25 s*64)
=500 ms/64 s
=7812.5
Debido a que solo podemos usar valores enteros, el valor del timer es 7812, y notamos tambin
que debemos de usar el timer de 16 bits, pero recordemos que este valor tenemos que restarlo
del valor mximo. Por lo que:
Valor_precarga=65536-7812=57724
Este valor tenemos que cargarlo en los registros TMR0H y TMR0L, por lo que debemos de
convertir el valor a hexadecimal, que es 0xE17C. Esto se har con las instrucciones:
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
Ejercicios E4.1
a. Considerando un pre divisor de 32 y una frecuencia del oscilador principal de 1 MHz,
calcule el valor necesario de precarga del timer 0, para generar un intervalo de tiempo de
100 ms.
b. Use el timer 0, para generar una frecuencia de 440 Hz, proponga los valores necesarios
del oscilador principal, as como del pre divisor
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
42



Ahora debemos configurar los registros necesarios para activar el timer:
T0CON
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
TMR0ON T08BIT TOCS TOSE PSA T0PS2 T0PS1 T0PS0
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
1 0 0 1 0 1 0 1

Este valor binario 1001 0101 equivale a 0x95, que debemos cargar en el registro T0CON
El valor de precarga 0xE17C se cargar en los registros del timer, por lo tanto 0xE1 debe cargarse
en TMR0H y 0x7C en TMR0L
Para el funcionamiento ptimo del timer debemos configurar su interrupcin, esto se hace en el
registro INTCON, habilitando los bits:
GIE/GIEH=1, bit de habitacin global de interrupciones
TMR0IE=1, bit de habilitacin de interrupcin del timer 0
INTCON
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
1 0 1 0 0 0 0 0

Por lo que el valor de configuracin para INTCON es 1010 0000, 0xA0
Ejercicios E4.2
Escriba el valor necesario para el registro T0CON para los requerimientos de los ejercicios E4.1

El programa siguiente, es la versin mejorada del contador ascendente, descendente, aqu la
duracin de cada nmero exhibido es de exactamente 500 ms. La rutina repite ahora es ms
eficiente y controlada por el timer 0. Ntese que ahora se configur el oscilador interno del c a 4
MHz, de acuerdo a los clculos realizados. Los cambios con respecto al programa anterior estn en
rojo.

;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
43


;******************************************************************************
;Bits de configuracin
CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
flags ;definimos la direccin 0 como registro de banderas
ENDC ;fin del bloque de constantes
;******************************************************************************
ORG 0x0000 ; vector de reset
bra inicio
org 0x08 ;vector de interrupcin
bra RST0 ;ramifica servicio interrupcin T0
org 0x0020
inicio bsf OSCCON,IRCF2,0 ;Inicio del programa principal
bsf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
movlw 0x95
movwf T0CON,0 ;timer 16 bits prescalerX64
movlw 0XA0
movwf INTCON,0 ;interrupcion TMR0 habilitada
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
cero movlw 0xC0 ;cdigo del cero
movwf PORTD,0
call repite
btfss PORTB,0,0
bra nueve
uno movlw 0xF9 ;cdigo del uno
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cero
dos movlw 0xA4 ;cdigo del dos
movwf PORTD,0
call repite
btfss PORTB,0,0
bra uno
tres movlw 0xB0 ;cdigo del tres
movwf PORTD,0
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
44

call repite
btfss PORTB,0,0
bra dos
cuatro movlw 0x99 ;cdigo del cuatro
movwf PORTD,0
call repite
btfss PORTB,0,0
bra tres
cinco movlw 0x92 ;cdigo del cinco
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cuatro
seis movlw 0x82 ;cdigo del seis
movwf PORTD,0
call repite
btfss PORTB,0,0
bra cinco
siete movlw 0xB8 ;cdigo del siete
movwf PORTD,0
call repite
btfss PORTB,0,0
bra seis
ocho movlw 0x80 ;cdigo del ocho
movwf PORTD,0
call repite
btfss PORTB,0,0
bra siete
nueve movlw 0x98 ;cdigo del nueve
movwf PORTD,0
call repite
btfss PORTB,0,0
bra ocho
bra cero
;******************************************************************************
repite btfss flags,0,0
bra repite
bcf flags,0,0
return
;******************************************************************************
RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
bsf flags,0,0
retfie
END

Programa 4: Usando el timer 0 para encender cada dgito del display durante exactamente 500 ms
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
45


20 Diagrama de simulacin en ISIS del Programa 4
INTERRUPCIN EXTERNA 1
Ya revisamos en el ejemplo anterior cmo funciona la interrupcin del temporizador 0. Ahora
veremos cmo funciona la interrupcin externa INT1. Recordemos que para lograr que el contador
fuera ascendente o descendente, dependa del valor del nivel lgico presente en el puerto de
entrada RB0:
RB0 Conteo
1 Ascendente
0 descendente

Nuestra nueva versin de este programa, har uso de la interrupcin externa INT1, la cual est
asociada al puerto de entrada RB1, colocaremos en este pin un botn pulsador y en vez de
detectar un nivel lgico en este pin, se detectar un flanco ascendente generado por el
accionamiento de este botn, que interrumpir al procesador y en su rutina de servicio de
interrupcin modificaremos el valor de una bandera de propsito general, para cambiar el sentido
del contador.
Para activar la interrupcin INT1, debemos:
poner el bit INT1IE del registro INTCON3:
limpiar el bit INT1IP, ya que le asignaremos un nivel de prioridad bajo a esta interrupcin
INTCON3
R/W-1 R/W-1 U-0 R/W-0 R/W-0 U-0 R/W-0 R/W-x
INT2IP INT1IP - INT2IE INT1IE - INT2IF INT1IF
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
1 0 0 0 1 0 0 0

Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
46

Segn la tabla anterior, el valor para el registro INTCON3 sera: 1000 1000 es decir 0x88
En este programa ejemplificaremos el uso de prioridades de interrupcin, por lo que el timer 0, lo
dejaremos en alta prioridad y la interrupcin externa en baja, pero debemos de activar el bit de
habilitacin de prioridades de interrupcin IPEN (Interrupt Priority ENable), que est ubicado en el
registro de control de reset RCON:
RCON
R/W-0 R/W-1 U-0 R/W-1 R-1 R-1 R/W-0 R/W-0
IPEN SBOREN - /RI /T0 /PD /POR /BOR
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Para activar este bit lo haremos con la instruccin:
bsf RCON,IPEN,0 ;habilitamos prioridades de interrupcin
En el ejemplo anterior, solamente tenamos una interrupcin activa: la del timer 0, que funcionaba
en alta prioridad, ya que no habamos activado las prioridades de interrupcin; esta interrupcin
cuando se generaba, responda en el vector 0x08. Ahora se adicionan prioridades de interrupcin
e INT1, le asignamos baja prioridad, por lo que responder en el vector de baja prioridad de
interrupcin 0x 18.
Para saber ms, se recomienda revisar en las hojas de datos del fabricante, DS39632C:
Interrupciones en los pines INTn

En el siguiente programa se muestran en rojo las instrucciones correspondientes a la activacin de
la interrupcin INT1, as como tambin las instrucciones que se modificaron como consecuencia
de este cambio
Ejemplo 5 Contador ascendente descendente, usando el timer 0 y la
interrupcin externa INT1
;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador viga apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
flags ;banderas
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
47

ENDC ;fin del bloque de constantes
;******************************************************************************
;Reset vector
ORG 0x0000
bra inicio
org 0x08 ;vector de alta prioridad
bra RST0 ;ramifica servicio interrupcion T0
org 0x18 ;vector de baja prioridad
bra RSINT
org 0x0020

;Inicio del programa principal
inicio bsf OSCCON,IRCF2,0
bsf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
movlw 0x95
movwf T0CON,0 ;timer 16 bits prescalerX64
movlw 0XE0
movwf INTCON,0 ;interrupciones TMR0,prioridad habilitada
bsf RCON,IPEN,0 ;habilitamos prioridades de interrupcin
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
movlw 0x88
movwf INTCON3,0 ;habilitamos int1 en baja prioridad
cero movlw 0xC0 ;cdigo del cero
movwf PORTD,0
call repite
btfss flags,1,0
bra nueve
uno movlw 0xF9 ;cdigo del uno
movwf PORTD,0
call repite
btfss flags,1,0
bra cero
dos movlw 0xA4 ;cdigo del dos
movwf PORTD,0
call repite
btfss flags,1,0
bra uno
tres movlw 0xB0 ;cdigo del tres
movwf PORTD,0
call repite
btfss flags,1,0
bra dos
cuatro movlw 0x99 ;cdigo del cuatro
movwf PORTD,0
call repite
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
48

btfss flags,1,0
bra tres
cinco movlw 0x92 ;cdigo del cinco
movwf PORTD,0
call repite
btfss flags,1,0
bra cuatro
seis movlw 0x82 ;cdigo del seis
movwf PORTD,0
call repite
btfss flags,1,0
bra cinco
siete movlw 0xB8 ;cdigo del siete
movwf PORTD,0
call repite
btfss flags,1,0
bra seis
ocho movlw 0x80 ;cdigo del ocho
movwf PORTD,0
call repite
btfss flags,1,0
bra siete
nueve movlw 0x98 ;cdigo del nueve
movwf PORTD,0
call repite
btfss flags,1,0
bra ocho
bra cero
;******************************************************************************
repite btfss flags,0,0
bra repite
bcf flags,0,0
return
;******************************************************************************
RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
bsf flags,0,0
retfie
;********************************************************************
RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupcin
btg flags,1,0 ;bit monitor de interrupcin
retfie
END

Programa 5 Contador ascendente descendente con interrupciones del timer e INT1
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
49


21 Diagrama de simulacin del contador con interrupcin externa
Como hemos visto, en el programa anterior, mandamos a exhibir los cdigos de manera directa,
uno por uno, con la consecuencia de que el programa tiene una secuencia repetitiva de
instrucciones, pero qu pasara si quisiramos usar dos displays y exhibir un conteo hasta el 99?
No sera conveniente repetir una secuencia de instrucciones 100 veces!, por lo cual tenemos que
usar otro mtodo ms eficiente para enviar los cdigos de siete segmentos al PORTD, que
veremos en la siguiente seccin.
Ejemplo 6: Manejando tablas por el mtodo del goto calculado
Para crear tablas de bsqueda en memoria de programa con los microcontroladores PIC18, existen
dos mtodos:
1. Goto calculado
2. Instrucciones especficas de lectura de tabla
En este ejemplo, veremos el primer mtodo. Para crear un goto calculado, es necesario primero
cargar el valor de desplazamiento en el registro w y sumar un valor de desplazamiento (offset) al
contador de programa, seguida de un grupo de instrucciones retlw nn, como se muestra a
continuacin:
movf desplazamiento,W
call tabla
.
.
tabla addwf PCL
retlw nn
retlw nn
.
.
retlw nn

El valor del desplazamiento indica el nmero de bytes que debe avanzar el contador de programa
y debe ser un mltiplo de dos. Este mtodo recibe el nombre de goto calculado, porque igual que
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
50

una instruccin goto, realiza una ramificacin, o equivalentemente un salto; pero se logra
sumando un valor al contador de programa.
Debido a que nicamente se suma el desplazamiento al PCL, debe tenerse cuidado de que el grupo
de instrucciones retlw nn, no cruce una pgina de 256 bytes, ya que el PCL es de 8 bits, y cundo
cambie de FF a 00, no generar un acarreo hacia el registro PCH, ocasionando un salto fuera del
grupo de instrucciones retlw nn, afectando la secuencia del programa, que percibiremos como
un funcionamiento errtico del mismo.
Veamos la nueva versin del contador ascendente-descendente del 0 al 9:
;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
flags ;banderas
ndice
ENDC ;fin del bloque de constantes
;******************************************************************************
ORG 0x0000 ;vector de reset
bra inicio
org 0x08 ;vector de alta prioridad
bra RST0 ;ramifica servicio interrupcion T0
org 0x18 ;vector de baja prioridad
bra RSINT
org 0x0020
inicio bsf OSCCON,IRCF2,0
bsf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
movlw 0x95
movwf T0CON,0 ;timer 16 bits prescalerX64
movlw 0XE0
movwf INTCON,0 ;interrupciones TMR0,prioridad habilitada
bsf RCON,IPEN,0 ;habilitamos prioridades de interrupcin
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
51

movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
movlw 0x88
movwf INTCON3,0 ;habilitamos int1 en baja prioridad
limpia clrf indice,0 ;inicia en cero
next call tabla
movwf PORTD,0 ;exhibe el nmero
call repite
tst btfss flags,1,0 ;ascendente o descendente?
bra decre
incf indice,F,0 ;conteo ascendente
movf indice,W,0
xorlw 0x0a ;verifica lmite superior de tabla
btfss STATUS,Z,0
bra next
bra limpia
decre decf indice,F,0 ;conteo descendente
movf indice,W,0
xorlw 0xFF ;verifica lmite inferior de tabla, FF=-1
btfsc STATUS,Z,0
bra inid
llama call tabla
movwf PORTD,0 ;exhibe el nmero
call repite
bra tst
inid movlw 0x09 ;reinicia en nueve
movwf indice,0
bra llama
;******************************************************************************
repite btfss flags,0,0
bra repite
bcf flags,0,0
return
;******************************************************************************
RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
bsf flags,0,0
retfie
;********************************************************************
RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupcin
btg flags,1,0 ;bit monitor de interrupcin
retfie
;********************************************************************
tabla rlcf indice,W,0 ;multiplica ndice por 2
addwf PCL,F,0 ;ajusta el PCL de acuerdo al valor del ndice
retlw 0xC0 ;cdigo del cero
retlw 0xf9 ;cdigo del uno
retlw 0xA4 ;cdigo del dos
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
52

retlw 0xb0 ;cdigo del tres
retlw 0x99 ;cdigo del cuatro
retlw 0x92 ;cdigo del cinco
retlw 0x82 ;cdigo del seis
retlw 0xb8 ;cdigo del siete
retlw 0x80 ;cdigo del ocho
retlw 0x98 ;cdigo del nueve
end

Programa 6, contador ascendente-descendente del 0 al 9, usando tablas con goto calculado
Como podemos ver en el programa 6, la rutina tabla implementa el mtodo de goto calculado,
vemos que en comparacin con el programa 5, esta versin es ms compacta. Las modificaciones
de este programa aparecen en rojo. Cada uno de los cdigos de siete segmentos forma parte de
una instruccin retlw, de tal manera que cuando se produce el retorno de subrutina, el registro W
contiene este cdigo; por lo tanto, usando este mtodo se puede almacenar un dato de un byte
por cada palabra de instruccin, que como recordamos, es de dos bytes.
Ejemplo 7, tablas de bsqueda en memoria de programa usando
instrucciones de lectura de tabla
Ahora veremos el segundo mtodo, que ya habamos mencionado. Para tener un alcance
suficiente, en los PIC18 que tengan mayor capacidad de memoria de programa, tenemos un
apuntador de tabla de 24 bits, llamado TBLPTR (TaBLe PoinTeR) que est distribuido en tres
registros de 8 bits:
TBLPTRL
TBLPTRH
TBLPTRU
Apuntador de tabla parte
superior
Apuntador de tabla parte alta Apuntador de tabla parte baja
TBLPTRU TBLPTRH TBLPTRL

Tambin existe un registro llamado TABLAT (TABle LATch), para almacenar el dato ledo,
correspondiente a la direccin especificada por TBLPTR.
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
53


En la figura se muestra una operacin de lectura de tabla TBLRD *, existen cuatro instrucciones de
lectura de TABLA:
TBLRD * Lectura de tabla
TBLRD *+ Lectura de tabla con pos incremento del apuntador
TBLRD +* Lectura de tabla con pre incremento del apuntador
TBLRD *- Lectura de tabla con pos decremento del apuntador

Tambin existen las instrucciones equivalentes para la escritura en memoria de tabla


Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
54

TBLWT * Escritura de tabla
TBLWT *+ Escritura de tabla con pos incremento del apuntador
TBLWT +* Escritura de tabla con pre incremento del apuntador
TBLWT *- Escritura de tabla con pos decremento del apuntador

Presentamos ahora nuestro contador ascendente del 0 al 9, usando instrucciones de lectura de
tabla
;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador vigia apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
flags ;banderas
ENDC ;fin del bloque de constantes
;******************************************************************************
;Reset vector
ORG 0x0000
bra inicio
org 0x08 ;vector de alta prioridad
bra RST0 ;ramifica servicio interrupcion T0
org 0x18 ;vector de baja prioridad
bra RSINT
org 0x0020
;Inicio del programa principal
inicio bsf OSCCON,IRCF2,0
bsf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
movlw 0x95
movwf T0CON,0 ;timer 16 bits prescalerX64
movlw 0XE0
movwf INTCON,0 ;interrupciones TMR0,prioridad habilitada
bsf RCON,IPEN,0 ;habilitamos prioridades de interrupcion
movlw 0xE1
movwf TMR0H,0
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
55

movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
movlw 0x88
movwf INTCON3,0 ;habilitamos int1 en baja prioridad
clrf TBLPTRL,0
movlw 0x02
movwf TBLPTRH,0
clrf TBLPTRU,0 ;tblptr=0x000200
lee tblrd *+ ;lee tabla e incrementa apuntador
movff TABLAT,PORTD
call repite
movf TBLPTRL,W,0
xorlw 0x0a
btfss STATUS,Z,0
bra lee
clrf TBLPTRL,0
goto lee
;******************************************************************************
repite btfss flags,0,0
bra repite
bcf flags,0,0
return
;******************************************************************************
RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
bsf flags,0,0
retfie
;********************************************************************
RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupcin
btg flags,1,0 ;bit monitor de interrupcin
retfie
;********************************************************************
org 0x200 ;DB directiva que Define Byte
DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x80,0x98
END


Programa 7, usando instrucciones de lectura de tabla
Nuevamente en el programa 7, se muestran en rojo, las instrucciones usadas para la lectura de
tablas. Iniciamos el apuntador de tabla, TBLPTR con la direccin 0x200, ntese que esto lo
hacemos al configurar los tres registros correspondientes al apuntador. Tambin usamos una
nueva directiva: DB, la cual sirve para definir un byte a partir de la direccin especificada por la
directiva ORG que la antecede, en nuestro caso, indica la direccin 0x200, a partir de esta
direccin definimos nuestros cdigos de siete segmentos. Usando esta tcnica, optimizamos el uso
de la memoria, ya que almacenamos cada cdigo usando un solo byte. Este programa hace
exactamente lo que el anterior, pero usando las instrucciones de lectura de tabla, pero en el
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
56

siguiente programa, veremos como usar instrucciones de lectura de tabla, para hacer un contador
de 0 al 99.
Ejemplo 8, manejando dos displays de siete segmentos
Al tener dos displays, podemos incrementar el conteo hasta el 99, para esto usamos transistores
como interruptores, para encender un solo display a la vez, ya que los segmentos estn
conectados en paralelo, es decir, el segmento a esta conectado con el a, el b con el b, y as
sucesivamente, pero solo encender el display cuyo transistor est encendido, esta tcnica se
conoce como multiplexin, al encender y apagar los transistores a una frecuencia suficientemente
alta (en el rden de los 10 KHz), apreciamos los dos displays como si siempre estuvieran
encendidos.
;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador viga apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
flags ;banderas
iun ;ndice de unidades
cuni ;cdigo de 7 segmentos de unidades
idec ;ndice de decenas
cdec ;cdigo de 7 segmentos de decenas
cont
ENDC ;fin del bloque de constantes
;******************************************************************************
;Reset vector
ORG 0x0000
bra inicio
org 0x08 ;vector de alta prioridad
bra RST0 ;ramifica servicio interrupcin T0
org 0x18 ;vector de baja prioridad
bra RSINT
org 0x0020
inicio bsf OSCCON,IRCF2,0
bsf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTD,0
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
57

clrf TRISD,0 ;Puerto D Configurado como salida
movlw 0xfc
movwf TRISC,0 ;RC0 y RC1 como salidas
clrf PORTC,0
movlw 0x95
movwf T0CON,0 ;timer 16 bits prescalerX64
movlw 0XE0
movwf INTCON,0 ;interrupciones TMR0,prioridad habilitada
bsf RCON,IPEN,0 ;habilitamos prioridades de interrupcin
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
movlw 0x88
movwf INTCON3,0 ;habilitamos int1 en baja prioridad
clrf TBLPTRL,0
movlw 0x02
movwf TBLPTRH,0
clrf TBLPTRU,0 ;tblptr=0x000200
clrf iun,0
clrf idec,0 ;iniciamos en 0
lee movff iun,TBLPTRL ;ajusta apuntador
tblrd * ;lee la tabla sin modificar apuntador
movff TABLAT,cuni ;cuni tiene cdigo 7 segmentos
movff idec,TBLPTRL ;ajusta apuntador
tblrd * ;lee la tabla sin modificar apuntador
movff TABLAT,cdec ;cdec tiene cdigo 7 segmentos
loop movlw 0x01
movwf PORTC,0 ;encendemos display unidades
movff cuni,PORTD
call retardo
movlw 0x02
movwf PORTC,0 ;encendemos display decenas
movff cdec,PORTD
call retardo
btfss flags,0,0
bra loop
bcf flags,0,0
incf iun,F,0
movf iun,W,0
xorlw 0x0a
btfss STATUS,Z,0 ;verifica lmite de tabla
bra lee
clrf iun,0
incf idec,F,0
movf idec,W,0
xorlw 0x0a
btfss STATUS,Z,0
bra lee
clrf idec,0
goto lee
;******************************************************************************
retardo setf cont,0
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
58

nada nop
decfsz cont,F,0
bra nada
return
;******************************************************************************
RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
bsf flags,0,0
retfie
;********************************************************************
RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupcin
btg flags,1,0 ;bit monitor de interrupcin
retfie
;********************************************************************
org 0x200 ;DB directiva que Define Byte
DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x80,0x98
END

Programa 8, controlando dos exhibidores de 7 segmentos
Como observamos en el cdigo del programa anterior, para controlar dos exhibidores,
necesitamos dos bits de puerto configurados como salida, ya que ellos sern los encargados de
encender y apagar los transistores que manejan los displays. En este programa, no se usa la
instruccin TBLRD *+, ya que tenemos un par de registros en donde se guardan los ndices
necesarios para el conteo:
Iun ndice de unidades
Idec ndice de decenas
El programa mantiene los ndices dentro del valor adecuado, iun inicia en cero, y se incrementa
exactamente cada 500 ms, hasta llegar a 9, una vez que iun tiene el valor de 9, en los siguientes
500 ms, iun se regresa a cero, pero a la vez se incrementa idec. Debido a que para encender los
dgitos necesitamos los cdigos de 7 segmentos, tenemos tambin dos registros que los
almacenan
Cuni cdigo de 7 segmentos de unidades
Cdec cdigo de 7 segmentos de decenas
El programa lo que hace es cargar el cdigo de siete segmentos en el PORTD, el tiempo que dura la
rutina retardo, cada 500ms se incrementa iun (y cuando regresa a cero, se incrementa idec) y se
actualiza el cdigo de siete segmentos con las instrucciones:
movff iun,TBLPTRL ;ajusta apuntador con el valor de unidades
tblrd * ;lee la tabla sin modificar apuntador
movff TABLAT,cuni ;cuni tiene cdigo 7 segmentos de unidades
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
59

movff idec,TBLPTRL ;ajusta apuntador con el valor de decenas
tblrd * ;lee la tabla sin modificar apuntador
movff TABLAT,cdec ;cdec tiene cdigo 7 segmentos de decenas

Ejemplo 9: Usando un teclado Matricial
Hasta ahora solamente hemos trabajado bsicamente con puertos configurados como salida,
tambin hemos usado un bit de puerto configurado como entrada, para el contador ascendente
descendente. Usaremos un teclado de 16 teclas, pero con la finalidad de optimizar puertos de
entrada, trabajaremos con el teclado matricial, ya que con el solo necesitaremos un puerto de 8
bits, ya que est organizado en cuatro renglones y cuatro columnas. Esto se observa en la
siguiente figura:

Se muestra en la siguiente figura, el diagrama de flujo para el funcionamiento del teclado
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA3/AN3/VREF+
5
RA4/T0CKI/C1OUT/RCV
6
RA5/AN4/SS/LVDIN/C2OUT
7
RA6/OSC2/CLKO
14
OSC1/CLKI
13
RB0/AN12/INT0/FLT0/SDI/SDA
33
RB1/AN10/INT1/SCK/SCL
34
RB2/AN8/INT2/VMO
35
RB3/AN9/CCP2/VPO
36
RB4/AN11/KBI0/CSSPP
37
RB5/KBI1/PGM
38
RB6/KBI2/PGC
39
RB7/KBI3/PGD
40
RC0/T1OSO/T1CKI
15
RC1/T1OSI/CCP2/UOE
16
RC2/CCP1/P1A
17
VUSB
18
RC4/D-/VM
23
RC5/D+/VP
24
RC6/TX/CK
25
RC7/RX/DT/SDO
26
RD0/SPP0
19
RD1/SPP1
20
RD2/SPP2
21
RD3/SPP3
22
RD4/SPP4
27
RD5/SPP5/P1B
28
RD6/SPP6/P1C
29
RD7/SPP7/P1D
30
RE0/AN5/CK1SPP
8
RE1/AN6/CK2SPP
9
RE2/AN7/OESPP
10
RE3/MCLR/VPP
1
U1
PIC18F4550
7 8 9 F
4 5 6 E
1 2 3 D
0 A B C
10k 10k 10k 10k
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
60


Buy SmartDraw!- purchased copies print this
document without a watermark .
Visit www.smartdraw.com or call 1-800-768-3729.


Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
61


Buy SmartDraw!- purchased copies print this
document without a watermark .
Visit www.smartdraw.com or call 1-800-768-3729.

Como se puede observar en los diagramas de flujo, el barrido de teclado consiste en activar cada
uno de los renglones, esto se hace limpiando solamente uno de los bits que controlan los
renglones, y los otros tres bits restantes ponindolos a uno. Una vez que se activa un rengln, se
verifica cada una de las columnas para ver si existe un cero, esto nos dice que se puls una tecla y
finaliza la rutina colocando en el registro de trabajo su cdigo correspondiente; si en las columnas
existe un nivel alto, es porque no se ha pulsado ninguna tecla, por lo que se desactiva el rengln
correspondiente escribiendo un uno en su bit de puerto y activando el siguiente, escribiendo un
cero en su bit de puerto. En la siguiente figura, mostramos el diagrama del teclado, ntese que se
han omitido las resistencias que se conectan entre cada columna y el voltaje de alimentacin, esto
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
62

es porque usamos las resistencias de pull up del microcontrolador, estas las activamos con la
instruccin:


Se muestra a continuacin el programa del teclado. La rutina KBD ejecuta el cdigo
correspondiente al diagrama de flujo anterior, entrega como resultado un cdigo de 4 bits
correspondiente a la tecla pulsada, si por alguna razn ninguna tecla se puls, regresa el cdigo FF,
aunque, debido a que activamos la interrupcin por cambio de estado en la parte alta del puerto
B, sabemos que si se activ la interrupcin, es porque se puls una tecla. Incluimos el cdigo nulo,
para que la rutina KBD pueda ejecutarse tambin sin interrupcin, es decir, invocar
peridicamente esta rutina, para que cuando se pulse una tecla, se obtenga su cdigo; este
mtodo es conocido como encuesta (polling). En la rutina de servicio de interrupcin RSINT
invocamos la rutina KBD, y si la tecla pulsada es menor que 0xA, entonces usamos este valor para
modificar el dgito de decenas de nuestro contador, si se oprime la tecla C, limpia el contador, es
decir, inicia en 00.
;******************************************************************************

LIST P=18F4550 ;directiva para definir el procesador
#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************
;Bits de configuracin
;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USB
CONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO
CONFIG PWRT = ON ;PWR UP Timer habilitado
CONFIG WDT = OFF ;Temporizador viga apagado
CONFIG MCLRE=OFF ;Reset apagado
CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA3/AN3/VREF+
5
RA4/T0CKI/C1OUT/RCV
6
RA5/AN4/SS/LVDIN/C2OUT
7
RA6/OSC2/CLKO
14
OSC1/CLKI
13
RB0/AN12/INT0/FLT0/SDI/SDA
33
RB1/AN10/INT1/SCK/SCL
34
RB2/AN8/INT2/VMO
35
RB3/AN9/CCP2/VPO
36
RB4/AN11/KBI0/CSSPP
37
RB5/KBI1/PGM
38
RB6/KBI2/PGC
39
RB7/KBI3/PGD
40
RC0/T1OSO/T1CKI
15
RC1/T1OSI/CCP2/UOE
16
RC2/CCP1/P1A
17
VUSB
18
RC4/D-/VM
23
RC5/D+/VP
24
RC6/TX/CK
25
RC7/RX/DT/SDO
26
RD0/SPP0
19
RD1/SPP1
20
RD2/SPP2
21
RD3/SPP3
22
RD4/SPP4
27
RD5/SPP5/P1B
28
RD6/SPP6/P1C
29
RD7/SPP7/P1D
30
RE0/AN5/CK1SPP
8
RE1/AN6/CK2SPP
9
RE2/AN7/OESPP
10
RE3/MCLR/VPP
1
U1
PIC18F4550
7 8 9 F
4 5 6 E
1 2 3 D
0 A B C
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
63

;Definiciones de variables
CBLOCK 0x000 ;ejemplo de definicin de variables en RAM de acceso
flags ;banderas
iun ;ndice de unidades
cuni ;cdigo de unidades
idec ;ndice de decenas
cdec ;cdigo de decenas
cont
tecla ;registro de cdigo de tecla pulsada
ENDC ;fin del bloque de constantes
;******************************************************************************
;Reset vector
ORG 0x0000
bra inicio
org 0x08 ;vector de alta prioridad
bra RST0 ;ramifica servicio interrupcin T0
org 0x18 ;vector de baja prioridad
bra RSINT
org 0x0020
inicio bsf OSCCON,IRCF2,0
bsf OSCCON,IRCF1,0
bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz
movlw 0x0F
movwf ADCON1,0 ;Puertos Digitales
clrf PORTB,0
movlw 0xf0
movwf TRISB,0 ;Configurar puerto para teclado
clrf PORTD,0
clrf TRISD,0 ;Puerto D Configurado como salida
movlw 0xfc
movwf TRISC,0 ;RC0 y RC1 como salidas
clrf PORTC,0
movlw 0x95
movwf T0CON,0 ;timer 16 bits prescalerX64
movlw 0XE8
movwf INTCON,0 ;interrupciones TMR0,RBIE prioridad alta y baja
bsf RCON,IPEN,0 ;habilitamos prioridades de interrupcin
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
movlw 0x04
movwf INTCON2,0 ; int RBI en baja prioridad y activamos R pull up
clrf TBLPTRL,0
movlw 0x02
movwf TBLPTRH,0
clrf TBLPTRU,0 ;tblptr=0x000200
clrf iun,0
clrf idec,0 ;iniciamos en 0
lee movff iun,TBLPTRL
tblrd * ;lee
movff TABLAT,cuni ;cuni tiene codigo 7 segmentos
movff idec,TBLPTRL
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
64

tblrd * ;lee
movff TABLAT,cdec ;cdec tiene codigo 7 segmentos
loop movlw 0x01
movwf PORTC,0 ; encendemos display unidades
movff cuni,PORTD
call retardo
movlw 0x02
movwf PORTC,0 ;encendemos display decenas
movff cdec,PORTD
call retardo
btfss flags,0,0
bra loop
bcf flags,0,0
incf iun,F,0
movf iun,W,0
xorlw 0x0a
btfss STATUS,Z,0
bra lee
clrf iun,0
incf idec,F,0
movf idec,W,0
xorlw 0x0a
btfss STATUS,Z,0
bra lee
clrf idec,0
goto lee
;******************************************************************************
retardo setf cont,0
nada nop
decfsz cont,F,0
bra nada
return
;******************************************************************************
RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0 ;valor de precarga para 500ms a 4MHz
bsf flags,0,0
retfie
;********************************************************************
RSINT call KBD ;Llamamos rutina del teclado
bcf INTCON,RBIF,0 ;LIMPIAMOS BANDERA
movwf tecla,0 ;guardamos tecla pulsada
movlw 0x0a
cpfslt tecla,0 ;salta si es que se pulso una tecla entre 0 y 9
bra limpia
movff tecla,idec ;carga nmero de tecla pulsada en decenas
movff idec,TBLPTRL
tblrd * ;lee
movff TABLAT,cdec ;cdec tiene cdigo 7 segmentos
bra exit
limpia movlw 0x0c
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
65

cpfseq tecla,0
bra exit
clrf iun,0 ;limpiamos ndice de unidades
clrf idec,0 ;limpiamos ndice de decenas
movff idec,TBLPTRL
tblrd * ;lee
movff TABLAT,cdec ;cdec tiene cdigo 7 segmentos
movff iun,TBLPTRL
tblrd * ;lee
movff TABLAT,cuni ;cdec tiene cdigo 7 segmentos
exit clrf PORTB,0
retfie
;********************************************************************
KBD movlw 0x0e
movwf PORTB,0 ;activamos primer rengln
btfss PORTB,4,0
retlw 0x00 ;tecla 0
btfss PORTB,5,0
retlw 0x0A ;tecla a
btfss PORTB,6,0
retlw 0x0B ;tecla b
btfss PORTB,7,0
retlw 0x0C ;tecla c
movlw 0x0D
movwf PORTB,0 ;activamos segundo rengln
btfss PORTB,4,0
retlw 0x01 ;tecla 1
btfss PORTB,5,0
retlw 0x02 ;tecla 2
btfss PORTB,6,0
retlw 0x03 ;tecla 3
btfss PORTB,7,0
retlw 0x0D ;tecla d
movlw 0x0B
movwf PORTB,0 ;activamos tercer rengln
btfss PORTB,4,0
retlw 0x04 ;tecla 4
btfss PORTB,5,0
retlw 0x05 ;tecla 5
btfss PORTB,6,0
retlw 0x06 ;tecla 6
btfss PORTB,7,0
retlw 0x0E
movlw 0x07
movwf PORTB,0 ;activamos primer rengln
btfss PORTB,4,0
retlw 0x07 ;tecla 7
btfss PORTB,5,0
retlw 0x08 ;tecla 8
btfss PORTB,6,0
retlw 0x09 ;tecla 9
btfss PORTB,7,0
retlw 0x0F ;tecla F
Microcontroladores PIC 18F4550 Ejemplos prcticos Ricardo lvarez Gonzlez
66

retlw 0xFF ;ninguna tecla pulsada
org 0x200 ;DB directiva que Define Byte
DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x80,0x98
END

Programa 9, Contador de 0-99, con programacin de decenas y borrado con un teclado matricial
Ejercicios 9.1
Modifique la rutina RSINT, para que al pulsar la tecla A, el conteo sea ascendente y al pulsar la
tecla D, el conteo sea descendente.

Ejemplo 10: Usando el timer 2
En los programas anteriores, usamos nuevamente nuestra rutina bsica de retardo, la cual
funciona por el tiempo de ejecucin de instrucciones. Pero ahora, modificaremos esta rutina,
usando el timer 2.

Como podemos ver en su diagrama de bloques, el timer 2 tiene las siguientes caractersticas
nicas, con respecto a los otros timers existentes en este microcontrolador:
Solamente puede funcionar como timer
Cuenta adems del pre divisor, con post divisor
Su funcionamiento no est basado en su desbordamiento, sino que cuenta con un registro
de periodo en donde se coloca su valor de precarga, y mediante un comparador detecta
cuando el timer alcanza y coincide con ese valor

Das könnte Ihnen auch gefallen