Subido por Laura Wallis

227141786-Microcontroladores-Pic-18f4550-Ejemplos-Practicos-convertido

Anuncio
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
MICROCONTROLADORES PIC
18F4550: EJEMPLOS PRÁCTICOS EN
LENGUAJE ENSAMBLADOR
Introducción
Se presenta a continuación unas notas que tienen por objetivo facilitar al lector en el uso
de microcontroladores PIC 18F4550, mediante una serie de ejemplos prácticos que le
permiten iniciarse en el uso de los mismos, y también aprender a escribir sus propios
programas, tomando como base estos ejemplos, complementándolos a sus necesidades
específicas añadiéndole su toque personal.
La información teórica 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 elaboración de las figuras a Cesar Hugo Pimentel Romero.
1
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Conceptos básicos
Nuestra cómoda vida moderna lo es gracias a la gran cantidad de artículos y artefactos
con los que interactuamos diariamente ¡sin ni siquiera darnos cuenta!, muchos de estos
artefactos son electrónicos, y recientemente están basados en las computadoras digitales.
En la historia de las computadoras, los primeros prototipos fueron mecánicos, debido al
momento tecnológico histórico en el que aparecieron. Cuando aparecen los primeros
componentes electrónicos, de manera natural se utilizaron para realizar los primeros
prototipos de las computadoras electrónicas
Microprocesador. Es un circuito integrado que tiene una alta capacidad de
procesamiento de información, usado típicamente como el CPU de una computadora
personal. Está compuesto básicamente por un camino de datos (la conexión 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 acrónimos
Procesadores CISC.C:
Complex I:
Instruction
S: Set
C: Computer
Procesadores RISC.
R:
Reduced I:
instruction
S: Set
C: Computer
Tabla 1.1 Microprocesadores CISC y RISC
Si una máquina RISC requiere 4 ó 5 instrucciones para hacer lo que una máquina CISC
hace en una instrucción, pero si las instrucciones RISC son diez veces más rápidas, RISC
gana.
Otro concepto muy importante, es el de Sistema mínimo, el cual consiste en agregarle
a un microprocesador, los elementos indispensables necesarios para que pueda
ejecutar una tarea específica
Computadora: Es un sistema digital de alta capacidad de procesamiento de información,
recibe datos de entrada, genera resultados a alta velocidad y con gran exactitud,
mediante la ejecución de programas.
2
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ilustración 1 Bloques básicos que forman una computadora digital
3
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Arquitectura de von Neumann
Arquitectura Von Neumann: El tamaño 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.
Ilustración 2 Arquitectura Von Neumann
Arquitectura Harvard
El tamaño 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 más rápida, va de la mano con RISC.
4
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ilustración 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 también tienen una dirección de memoria.
Los datos son transferidos vía el bus de datos, cuando el CPU busca datos de la
memoria primero se leen las direcciones del bus de direcciones, después el
microprocesador genera la señal de lectura, y accede a las instrucciones mediante el bus
de datos.
El bus de control, consiste en un conjunto de señales 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 señal de reset etc.
5
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ilustración 4 Computadora de tres buses
Un sistema puede tener una jerarquía 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, podría accesar a todos los
dispositivos de E/S usando un segundo bus llamado: Bus local ó Bus de E/S. La
perspectiva práctica 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 mínimo encapsulado en un solo circuito integrado, el cual contiene
memorias de: programa, datos, datos no volátiles (en algunos casos), puertos de
entrada/salida, temporizadores/contadores, temporizador vigía, oscilador, unidades
de comunicación serial, convertidores analógico 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 también 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.
6
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos

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 periféricos 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 tecnología Flash, uno de sus
elementos característicos 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 características y consecuentemente, diversos números de
pines (familias 16xxx), familias poderosas de 77 instrucciones, con un tamaño de
palabra de instrucción de 16 bits (familias: 17xxx, 18xxx) varios de estos
microcontroladores disponen también de interfaz USB., también ofrece sus familias
de Controladores digitales de señales: los dsPICs, los cuales son chips poderosos
de 16 bits que incluyen instrucciones para procesamiento de señales mediante su
máquina DSP, debido al auge que han tenido estos procesadores, el fabricante
también ofrece estos chips, pero sin la máquina DSP (para aplicaciones que no
usan las instrucciones DSP), obteniendo así la familia PIC24XXX; para realizar
aplicaciones inalámbricas: los rfPICs hasta llegar a los poderosos
microcontroladores de 32 bits, con la familia PIC32.
Cada uno de los fabricantes antes mencionados proveen típicamente de las
especificaciones de sus chips (data sheets), notas de aplicación, herramientas de
desarrollo etc. Algunos fabricantes venden esta información, otros la proporcionan
libremente en sus sitios de internet.
NÚMEROS EN BINARIO, HEXADECIMAL Y DECIMAL
Antes de entrar de lleno a la revisión de los conceptos arquitectónicos fundamentales de
los microcontroladores PIC18F4550, es importante recordar los equivalentes en binario y
decimal de los números hexadecimales, ya que la notación hexadecimal es abreviada,
debido a que cada uno de sus números representan 4 bits, es más cómodo y menos
susceptible de error escribir un número que cuatro:
decimal
Binario
7
Hexadecim
al
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
0
0000
8
0
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ricardo Álvarez
González
1
000
1
1
2
001
2
0
3
001
3
1
4
010
4
0
5
010
5
1
6
011
6
0
7
011
7
1
8
100
8
0
9
100
9
1
10
101
A
0
11
101
B
1
12
110
C
0
13
110
D
1
14
111
E
0
15
111
F
1
Tabla 1: Equivalentes binarios y decimales de los números hexadecimales
Es altamente recomendable, que el lector memorice estos equivalentes en binario de los
números hexadecimales, ya que finalmente cualquier microprocesador y microcontrolador
solamente procesa números binarios, pero para las personas que escribirán un programa
en lenguaje ensamblador, es más cómodo usar la notación abreviada del hexadecimal.
Cualquier número binario puede convertirse rápidamente al hexadecimal agrupando los
bits de cuatro en cuatro, iniciando por el bit menos significativo (LSB), por ejemplo:
El número de 8 bits 0011 1001, se convierte rápidamente 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 número para especificar que se trata de un hexadecimal: 0x39, incluso
esta notación nos sirve a nosotros también 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,
9
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Nótese 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, teníamos 110, agregándole el
cero: 0110 corresponde al hexadecimal 6. Se pueden agregar los ceros necesarios a la
izquierda (correspondiente al número hexadecimal más significativo), para formar grupos
de cuatro bits y reemplazarlo por su equivalente hexadecimal fácilmente.
Ejercicio 1
Convierta los números binarios a hexadecimal, sustituyendo directamente los grupos de
4 bits por su equivalente en hexadecimal
10
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
a. 110011001010101
b. 110001101010011
c. 101010101110110
d. 110101101001111
e. 100101111101011
Ejercicio 2
Convierta los números hexadecimales a binario, sustituyendo directamente cada dígito
decimal por su equivalente binario
a. 9896
b. A7F2
c. 73B1
d. D53A
e. B3F5
0RGANIZACIÓN 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.
Organización 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 físicamente y la dirección 2 MB causará una lectura de ceros (una
instrucción NOP).
Los PIC 18F4550 tienen 32 Kbyte (KB) de memoria Flash, esto implica que pueden
almacenar hasta 16K palabras de instrucción.
El vector de reset es la dirección 0000h y existen dos vectores de interrupción: el de alta
prioridad tiene la dirección 0008h y el de baja prioridad la 0018h.
11
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
La figura siguiente muestra el mapa de memoria de programa para los dispositivos PIC
18FX550
Ilustración 5 Mapa de memoria de programa
Stack
La pila (stack) permite cualquier combinación de hasta 31 llamadas y reconocimientos de
interrupción. El contador del programa (PC) es metido (pushed) al stack, cuando se
ejecuta una instrucción CALL o RCALL o cuando una interrupción 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.
12
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ricardo Álvarez
González
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 programación del bit STVREN. Cuando este bit es
deshabilitado, la condición de full o de underflow pondrá los bits STKFUL o STKUNF,
respectivamente, pero no causará una reinicialización del dispositivo, si el bit STVREN es
puesto, además 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 dirección en la que se buscará la instrucción
(fetch) para su ejecución. 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 instrucción, 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 INSTRUCCIÓN.
La entrada de reloj (mediante OSC1) es dividida internamente por cuatro, para generar
cuatro señales de reloj en cuadratura, no traslapados, llamados Q1, Q2 Q3 y Q4.
Internamente el PC es incrementado cada Q1, la instrucción es buscada de la memoria de
programa y capturada en el registro de instrucción en Q4. La instrucción es decodificada y
ejecutada durante el siguiente Q1 hasta Q4. Las señales de reloj y la ejecución del flujo
de instrucciones se muestran en la siguiente figura:
13
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ilustración 6 División del ciclo de reloj
FLUJO DE INSTRUCCIÓN Y SEGMENTACIÓN.
Un ciclo de instrucción consiste de cuatro ciclos Q: Q1, Q2, Q3 y Q4, la búsqueda de la
instrucción y la decodificación son segmentadas (pipelined) de tal manera que la
búsqueda toma un ciclo de instrucción, mientras que la decodificación y la ejecución
toman otro ciclo de instrucción. Sin embargo, debido a la segmentación, cada instrucción
se ejecuta efectivamente en un solo ciclo. Si una instrucción causa que el contador de
programa cambie (goto, por ejemplo), entonces se necesitan dos ciclos para completar la
instrucción.
Ilustración 7 Ejemplo de ejecución 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 instrucción, siempre es almacenado en una localidad de memoria de programa
en una localidad par (LSB=0).
14
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
ORGANIZACIÓN DE LA MEMORIA DE DATOS
La memoria de datos es implementada como RAM estática. Cada registro en la memoria
de datos tiene una dirección de 12 bits, permitiendo hasta 4096 bytes de memoria de
datos. En la figura 9 se muestra la organización 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 selección de bancos (BSR<3:0>
seleccionan cual banco será elegido, los cuatro bits más significativos del BSR no son
implementados.
Ilustración 8 Almacenamiento de instrucciones en memoria de programa
La memoria de datos contiene registros de función especial (SFR) y registros de propósito
general (GPR). Los SFRs son usados para control y estado del controlador y funciones
periféricas, mientras que los GPRs son usados para abastecimiento de datos y para
guardar resultados de operaciones de la aplicación 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, podrían 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.
15
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ilustración 9 Mapa de memoria de datos
16
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ricardo Álvarez
González
La memoria de datos puede accederse directa o indirectamente. El direccionamiento
directo podría requerir el uso del registro BSR. El direccionamiento indirecto requiere el
uso de un registro de selección de archivo (FSR) y un operando de archivo indirecto
(INDFn). Cada FSR mantiene una dirección 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 comúnmente 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 FUNCIÓN ESPECIAL
Los registros de función especial (SFRs) son registros usados por el CPU y módulos
periféricos para controlar la operación deseada del dispositivo. Estos registros se
implementan como RAM estática.
Los SFRs pueden clasificarse en dos conjuntos:


SFRs asociados con el dispositivo genérico o núcleo (core).
SFRs asociados con las funciones periféricas.
BANCO DE ACCESO
El banco de acceso es una mejora arquitectónica la cual es muy útil para la optimización
de código de un compilador de C. Las técnicas usadas por un compilador de C pueden
ser útiles para programas escritos en ensamblador.
La región de la memoria de datos puede utilizarse para:





Almacenamiento de cálculo intermedio de valores.
Variables locales de subrutinas.
Almacenamiento/ conmutación rápido de variables.
Variables comunes.
Evaluación/ control rápido 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 serán referidas como el acceso
a la RAM alta y el acceso a la RAM baja, respectivamente.
Un bit en la palabra de instrucción, especifica si la operación 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 dirección en el
acceso a la RAM baja es seguida por la primera dirección en el acceso a la RAM alta. El
acceso a la RAM alta
17
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
mapea los registros de función especial (SFRs), de tal manera que esos registros pueden
accederse sin ningún otro apoyo de software. Esto es útil para verificar las banderas de
estado y para modificar los bits de control.
REGISTROS DE SELECCIÓN DE BANCOS
La necesidad de un espacio grande de memoria de propósito general, origina un esquema
de bancos de memoria RAM. La memoria de datos está seccionada en dieciséis bancos.
Cuando se usa direccionamiento directo, el registro de selección de banco (BSR) debe
configurarse para el banco deseado.
BSR<3:0> mantiene los 4 bits superiores de la dirección de 12 bits de la RAM. Los bits
BSR<7:4> siempre se leerán como “0”s , y su escritura a ellos no tendrá efecto.
La instrucción MOVLB se proporciona en el conjunto de instrucciones, para asistir en la
selección de los bancos.
Si el banco seleccionado actualmente no está implementado, cualquier lectura será de “0”s, y
todas las escrituras serán ignoradas. Los bits del registro de estado (STATUS) serán
puestos/ limpiados correctamente, de acuerdo a la instrucción ejecutada.
Cada banco se extiende hasta FF (256 bytes). Toda la memoria de datos es
implementada como RAM estática.
Una instrucción MOVFF ignora el BSR, debido a que las direcciones están incrustadas en
la palabra de instrucción.
REGISTRO DE ESTADO (STATUS).
El registro de estado (le llamaremos simplemente status en lo sucesivo), contiene el
estado aritmético del ALU. El registro STATUS puede ser el destino para cualquier
instrucción, como sucede con cualquier otro registro. Si el registro STATUS es el destino
de una instrucción 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 lógica del dispositivo. Por lo tanto, el resultado de una instrucción 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
18
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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.
Ilustración 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.
CONFIGURACIÓN DEL OSCILADOR
Los PIC18F2455/2550/4455/4550 cuentan con una amplia variedad de opciones para el oscilador,
además,debido a la existencia del módulo USB que requiere una señal de reloj estable, se
necesita
19
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
contar con un módulo 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 ramificación del reloj,
para proporcionar una señal de 48 MHz, para que opere el módulo USB a máxima
velocidad. Debido a que esta es derivada a partir de la fuente primaria de oscilación,
existe una gran cantidad de preescalers y postscaler para generar una amplia variedad de
frecuencias de oscilación.
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 aplicación, se presentarán ahora el conjunto de
instrucciones de la familia PIC18FXXX.
La mayoría 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 instrucción es de 16 bits dividida en un código de operación (opcode), lo
cual especifica el tipo de instrucción y uno o más operandos, lo cual especifica la
operación de la instrucción.
El conjunto de instrucciones es altamente ortogonal y está agrupado en cuatro categorías
básicas:
 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 mayoría 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
instrucción. El operando de destino “d” indica en donde se colocará el resultado de la
20
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
operación:
21
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos


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 instrucción.
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 número del bit afectado por la operación, mientras el
de registro de archivo “f” representa el número 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”).
Ningún operando requerido (representado por “-”).
Las instrucciones de control pueden usar algunos de los siguientes operandos:




Una dirección 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”).
Ningún operando requerido (representado por “-”).
22
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
23
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
24
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ricardo Álvarez
González
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 instrucción. En esos casos, la instrucción toma dos ciclos de
instrucción, con el ciclo de instrucción 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 aplicación basada en el sistema operativo DOS o en WINDOWS, que
suministra una plataforma para desarrollar código 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 código fuente, pero no son traducidas
directamente en código de operación. Son usadas para controlar el ensamblador: su
entrada, salida y localización de datos. Muchas de las directivas de ensamblador tienen
nombres y formatos alternos. Esos podrían existir para proporcionar compatibilidad con
ensambladores previos de Microchip y para ser compatible con prácticas individuales de
25
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
programación.
26
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Existen cinco tipos básicos de directivas proporcionadas por MPASM:
a. Directivas de control. Permiten secciones de código condicionalmente ensamblado.
b. Directivas de datos. Controlan la localización de variables en memoria y
proporcionan una manera para referirse a los datos simbólicamente mediante
nombres significativos.
c. Directivas de listado. Controlan el formato del archivo de listado (*.lst) generado
por MPASM. Permitiendo la especificación de títulos, paginación y otros controles
del listado.
d. Macro directivas. Controlan la localización de datos y la ejecución 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 configuración en su registro de dirección 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 máximos entr 0 y 7, ya que PORTD es de 8 bits
TRISDm 0
PORTDm Out, Salida
TRISD
n
PORTD
n
1
In,
entrada
Nótese que esto es mas facil de recordar si escribimos los nombres en ingles: 1 In
entrada, 0 Out salida
TRISD TRISD6 TRISD5 TRISD4 TRISD TRISD TRISD TRISD
7
3
2
1
0
0
0
0
0
0
0
0
0
PORTD PORTD
0
0
PORTD
5
PORTD PORTD PORTD PORTD PORTD
4
3
2
1
0
27
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Salida
Salida
Salida
Salida
Salida
28
Salida
Salida
Salida
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ejemplo 1 Controlando ocho leds
;******************************************************************************
LIST P=18F4550
;directiva para efinir el procesador
#include
;definiciones de variables especificas del
<P18F4550.INC>
procesador
;******************************************************************************
;Bits de configuración
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
CBLOCK0x000
;ejemplo de definición 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
;enciende LED conectado en
rlcf
,0
corre
cal
PORTD,F
RD0
i
l
,0
br
retard
;******************************************************************************
a
o
retard
movl 0xff
correi
o
w
cont,
movwf 0
nop
nada
cont,1,
decfsz 0
bra
nada
return
END
Programa E1: Rotación 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.
29
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
En la figura 12 se muestra una foto con la conexión de los leds
11
Pantalla de MPLAB
12
Conexión de los leds
Para alambrar la práctica en una tablilla de prototipos (proto board), presentamos el
diagrama de pines:
30
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ilustración 13 Diagrama de pines del microcontrolador
18F4550
;******************************************************************************
LIST P=18F4550
#include <P18F4550.INC>
;directiva para definir el procesador
;definiciones de variables especificas del procesador
;******************************************************************************
;Bits de configuración
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
CBLOCK0x000
;ejemplo de definición 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
31
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
movlw 0x0F
movwf
;Puertos Digitales
ADCON1,0 clrf
PORTD,0
;Puerto D Configurado como
clrf
TRISD,0
salida
bsf
;enciende LED conectado en
correi rlcf
PORTD,
call
repite
;llama a una rutina más larga
PORTD,0
RD0
F,0
bra
correi
,0
;****************************************************************************** retardo
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
movlw
Programa E1.1 Segunda Versión de rotación de luces
En la segunda versión del programa de rotación de luces, el tiempo en el que durará
encendido cada led, será veinticinco veces más 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
número de veces se especifica directamente en decimal, para lo cual es necesario
encerrar el número entre apóstrofes y debe ir precedido por una d de “decimal”, esto está
expresado en la instrucción:
movlw d'25'
;llama 25 veces a la rutina retardo
Con esta rutina repite se puede modificar el número de veces que se llamará a la rutina
retardo
Ejemplo 2 Control de un exhibidor de siete segmentos de ánodo común
conectado al PORTD.
Ahora estamos listos para controlar un exhibidor de siete segmentos. Como ya
sabemos existen básicamente dos tipos de displays de siete segmentos, de acuerdo a
como se muestra en la siguiente figura:
32
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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, también llamado por su nombre en ingles display; se mostrarán los dígitos del
0 al 9, la duración de exhibición 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 asignación de los pines del puerto D para la
conexión de los segmentos del display:
RD7
Punto
decima
l
RD6
G
RD5
f
RD4
E
RD3
d
RD2
c
RD1
b
RD0
A
Tabla E2
Los códigos de siete segmentos para el display de ánodo común, (considerando en este caso
que encienden con cero) son los siguientes:
Hexadecimal Binario
C0
Digito
1100 0000
33
0
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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 códigos de siete
segmentos para los dígitos hexadecimales faltantes, para un exhibidor de siete
segmentos de ánodo común
Ejercicio E2.2
Genere los códigos de siete segmentos, usando el mismo orden de los bits mostrado en
la tabla E2 para los dígitos hexadecimales, para un exhibidor de siete segmentos de
cátodo común
;******************************************************************************
LIST P=18F4550
;directiva para efinir el procesador
#include
;definiciones de variables especificas del
<P18F4550.INC>
procesador
;******************************************************************************
;Bits de configuración
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
;ejemplo de definición de variables en RAM de
CBLOCK0x0
acceso
00
cont
ciclo
;fin del bloque de
END
constantes
;******************************************************************************
C
;Reset vector
34
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
ORG 0x0000
;Inicio del programa principal
bcf
OSCCON,IRCF2,0
bsf
OSCCON,IRCF0,0 ;Oscilador interno
a125 kHz movlw 0x0F
;Puertos Digitales
movwf ADCON1,
0
clrf
PORTD
;Puerto D Configurado como salida
clrf
,0
;código del cero
cero
movl
TRISD,
w
0 0xC0
movwf PORTD,0
;código del uno
call
repite
movlw 0xF9
;código del dos
movwf PORTD,0
call
repite
movlw 0xA4
;código del tres
movwf PORTD,0
call
repite
movlw 0xB0
;código del cuatro
movwf PORTD,0
call
repite
movlw 0x99
;código del cinco
movwf PORTD,0
call
repite
movlw 0x92
;código del seis
movwf PORTD,0
call
repite
movlw 0x82
;código del siete
movwf PORTD,0
call
repite
;código del ocho
movlw 0xB8
movwf PORTD,0
call
repite
;código del nueve
movlw 0x80
movwf PORTD,0
call
repite
movlw 0x98
;****************************************************************************** retardo
movwf PORTD,0
0xff
call
repite
movwf cont,0
bra
cero
nada
nop
decfsz
cont,1,0 bra
nada
return
;****************************************************************************** repite
d'25'
;llama 25 veces a la rutina retardo
30
movlw
movlw
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
movwf ciclo
call
retardo
decfsz
llam
a
ciclo,F,0 bra
llama
return
END
Programa E2: Control de un display de siete segmentos
Como podemos apreciar en el código anterior, el control del display es muy simple,
consiste solamente en enviar cada código 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
;código del
cero movwf PORTD,0
call
repite
De tal manera que estas tres instrucciones se repiten diez veces, empezando por el
código del cero y terminando con el del nueve, después de esto se regresa el programa
nuevamente al código del cero, con la instrucción de salto incondicional:
bra
cero
Se muestra en la siguiente figura el diagrama de la simulación en ISIS Proteus:
15
Ventana de simulación en ISIS
31
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ejercicio E2.3
Vimos que el ejemplo anterior, consistía en una repetición de diez veces del mismo
bloque de instrucciones. Reescriba el código del ejemplo 2, disminuyendo el número
de instrucciones, usando subrutinas
Ejercicio E2.4
Extienda el programa del ejemplo 2, para mostrar los dígitos 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
1
0
Conteo
Ascendente
descendent
e
;******************************************************************************
LIST P=18F4550
;directiva para definir el procesador
#include
;definiciones de variables especificas del
<P18F4550.INC>
procesador
;******************************************************************************
;Bits de configuración
;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
;ejemplo de definición de variables en RAM de
CBLOCK
acceso
0x000
cont
ciclo
;fin del bloque de
END
constantes
;******************************************************************************
C
;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
32
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
clrf
clrf
cero
movlw
movwf
call
btfss
bra
movlw
uno
movwf
call
btfss
bra
dos
movlw
movwf
call
btfss
bra
tres
movlw
movwf
call
btfss
bra
cuatro movlw
movwf
call
btfss
bra
cinco movlw
movwf
call
btfss
bra
seis
movlw
movwf
call
btfss
bra
siete movlw
movwf
call
btfss
bra
ocho movlw
movwf
call
btfss
bra
nueve movlw
movwf
call
btfss
bra
bra
PORTD,0
TRISD,0
0xC0
PORTD,0
repite
PORTB,0,0
nueve
0xF9
PORTD,0
repite
PORTB,0,0
cero
0xA4
PORTD,0
repite
PORTB,0,0
uno
0xB0
PORTD,0
repite
PORTB,0,0
dos
0x99
PORTD,0
repite
PORTB,0,0
tres
0x92
PORTD,0
repite
PORTB,0,0
cuatro
0x82
PORTD,0
repite
PORTB,0,0
cinco
0xB8
PORTD,0
repite
PORTB,0,0
seis
0x80
PORTD,0
repite
PORTB,0,0
siete
0x98
PORTD,0
repite
PORTB,0,0
ocho
cero
;Puerto D Configurado como salida
;código del cero
;código del uno
;código del dos
;código del tres
;código del cuatro
;código del cinco
;código del seis
;código del siete
;código del ocho
;código del nueve
33
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
;******************************************************************************
retardo movlw 0xff
movwf cont,0
nad
nop
a
decfsz cont,1,
0
bra
return nada
;******************************************************************************
;llama 1 vez a la rutina
repite movlw d'1'
retardo
movwf cicl
nada2 nop
o
call
retardo
decfs ciclo,1,
z bra 0
retur nada2
n
END
Programa E3: Contador ascendente descendente
En este programa, no es necesario declarar el pin RB0, ya que después de un reset, los
puertos del microcontrolador están 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 instrucción:
btfss
PORTB,0,0
si el nivel de RB0 es alto, la instrucción brincará la
instrucción: bra cero
y mandará a escribir en el puerto D el código de siete segmentos del uno, de lo contrario
se ramificará para mostrar el código de siete segmentos del cero. El programa está
formado por la repetición de las instrucciones mostradas a continuación:
;código del uno
0xF9
PORTD,0
repite
PORTB,0
,0
Se observa
el programa E3 la secuencia completa, notando que si el nivel en RB0
bra encero
es alto, el conteo será ascendente, de lo contrario será descendente.
uno
movlw
movwf
call
btfss
Ejercicio E3.1
Agregue al programa 3 las instrucciones necesarias para exhibir los dígitos
hexadecimales de la A a la F
Interrupciones
Esta familia de microcontroladores tiene múltiples fuentes de interrupción. Una
interrupción consiste en que el procesador suspende temporalmente la tarea que está
ejecutando para atender a algún periférico, mediante la ejecución de una rutina de
servicio de interrupción, una vez que se concluye esta, el procesador continua con la
tarea que estaba ejecutando antes de haber sido
34
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ricardo Álvarez
González
interrumpido. A diferencia de una subrutina ordinaria que termina con una instrucción
return, Las rutinas de servicio de interrupción deben concluir con la instrucción retfie que
significa “retorno de interrupción habilitada” (return from interrupt enable). Al momento de
la suspensión de una tarea, la dirección de la siguiente instrucción que debería ejecutar,
se guarda en el stack, y se carga el contador de programa con el vector de interrupción.
Para los PICS18 existen dos vectores de interrupción:
0x0008
vector de interrupción de alta
prioridad 0x0018
vector de interrupción de baja
prioridad
Cada fuente de interrupción tiene tres bits para controlar su funcionamiento:
1. El bit de habilitación
2. El bit de bandera
3. El bit de prioridad de interrupción
Existen diez registros para el control de interrupciones:
RCON
Registro de control de reset, tiene el bit de habilitación de prioridad de
interrupción
INTCON
INTCON2
Registro de control de interrupciones
Registro de control de interrupciones
INTCON3
Registro de control de interrupciones
PIR1, PIR2
Registros de solicitud de interrupción, contiene los bits de bandera de las
interrupciones periféricas
Registros de habilitación de interrupción, contiene los bits de habilitación de
las
interrupciones periféricas
Registros de prioridad de interrupción
PIE1, PIE2
IPR1, IPR2
Para saber más, 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 español, son dispositivos que nos
proporcionan intervalos regulares de tiempo. Prácticamente cualquier fabricante de
35
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
microcontroladores incluye
36
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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 antigüedad
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 quisiéramos que nos indique el tiempo de
tres segundos, bastaría con depositar en la cubeta, un valor de precarga de 7/10 de su
capacidad, de tal manera que cuando se desborde, habrán 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, podríamos 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 vacía, tarda ahora 10 minutos en llenarse.
37
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
17
Con el chorro de agua pequeño, la cubeta se llena en 10 minutos
¿Cuál 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á fácilmente el
funcionamiento típico de los timers.
La familia a la que pertenece el PIC18F4550 incluye los timers:
Time
r
Temporizador/contador 0
Temporizador/contador 1
Timer2
Temporizador/contador 3
Número de bits
8ó
16
16
8
16
Temporizador/Contador 0
Este periférico puede funcionar como timer, teniendo como base de tiempo, el ciclo
interno de ejecución de instrucciones Fosc/4, pero también puede funcionar como
contador, contando los impulsos que le llegan por el pin RA4 en su función alterna
T0CKI (Timer 0 Clock Input).
Este periférico 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
38
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
selección (los cuales
39
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
son bits de control del timer) su funcionamiento, esto se logra con el bit TOCS
(Timer 0 Clock Select) de tal manera que:
TOC
Configuració
S
n
0
Selecciona como señal de sincronía el ciclo interno de instrucción Fosc/4 es decir,
funciona como timer
1
Selecciona como señal de sincronía 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
0
1
18
Flanco activo para incrementar
TMR0L
Ascendente
Descendente
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 selección de este pre divisor se selecciona con el bit PSA
PSA
0
1
Prescaler
Asignado
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 instrucción, según 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:
T0PS T0PS
2
1
0
0
0
0
0
1
T0PS
0
0
1
0
40
Valor del
Prescaler
2
4
8
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
0
1
1
0
1
0
41
16
32
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
1
1
1
0
1
1
1
0
1
64
128
256
Estos bits de configuración que hemos descrito, están en el registro de control del timer0,
llamado T0CON:
R/W-1
R/W-1
R/W-1
T08BIT
R/W1
TOCS
TMR0O
N
Bit 7
R/W-1
R/W-1
TOSE
R/W1
PSA
T0PS2
T0PS1
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
R/W1
T0PS
0
Bit 0
Como podemos ver en la tabla anterior, el renglón superior indica el valor de los bits
después de un reset, R/W indica que los bits son de lectura/escritura, el renglón inferior
indica el número de bit.
Ya explicamos el funcionamiento de cada bit, solamente faltaron los bits 7 y 6, los cuales
tienen la función:
TMR0O
N
0
1
Función
Timer 0 Apagado
Timer 0
Encendido
Función
Timer/Contador 0 de 16
bits
Timer/Contador 0 de 8
bits
T08BIT
0
1
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.
42
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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 analogía 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 hablaríamos 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 más pequeños, funciona exactamente de la misma manera
que el valor de precarga del timer
La interrupción 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 expresión para calcular el valor de precarga necesario:
Temporización=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=Temporización/(4.Tosc.valor_prescaler)
(2)
Debemos de tomar en cuenta, que este valor obtenido en la expresión 2, tenemos que
restarlo del máximo valor del timer (de la misma manera que restábamos la cantidad de
agua de la capacidad total de la cubeta).
De tal manera que:
Valor_precarga=máximo valor del timer-valor_del_timer
43
(3)
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
O equivalentemente:
Valor_precarga= máximo valor del timer-Temporización/(4.Tosc.valor_prescaler)
El máximo 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.
(4)
Para un timer de 16 bits el máximo valor al que puede llegar es 0xFFFF y se desborda en
0xFFFF+1, es decir 65536 en decimal.
Para saber más, se recomienda revisar en las hojas de datos del fabricante DS39632C:
 Módulo timer 0
 Módulo timer 1
 Módulo timer 2
 Módulo 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 ecuación 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
también que debemos de usar el timer de 16 bits, pero recordemos que este valor
tenemos que restarlo del valor máximo. 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
44
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ahora debemos configurar los registros necesarios para activar el
timer: T0CON
R/W-1
R/W-1
R/W1
TOCS
R/W-1
R/W1
PSA
R/W-1
R/W-1
R/W1
TMR0O
T08BIT
TOSE
T0PS2
T0PS1
T0PS
N
0
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 interrupción, esto se
hace en el registro INTCON, habilitando los bits:


GIE/GIEH=1, bit de habitación global de interrupciones
TMR0IE=1, bit de habilitación de interrupción del
timer 0 INTCON
R/W-0
R/W-0
GIE/GIEH PEIE/GIE
L
Bit 7
Bit 6
1
0
R/W-0
TMR0IE
R/W-0
INT0IE
R/W-0
RBIE
R/W-0
TMR0IF
R/W-0
INT0IF
R/W-x
RBIF
Bit 5
1
Bit 4
0
Bit 3
0
Bit 2
0
Bit 1
0
Bit 0
0
Por lo que el valor de configuración 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 versión mejorada del contador ascendente, descendente,
aquí la duración de cada número exhibido es de exactamente 500 ms. La rutina repite
ahora es más eficiente y controlada por el timer 0. Nótese que ahora se configuró el
oscilador interno del µc a 4 MHz, de acuerdo a los cálculos realizados. Los cambios con
respecto al programa anterior están en rojo.
;******************************************************************************
LIST P=18F4550
#include
<P18F4550.INC>
;directiva para definir el procesador
;definiciones de variables especificas del
procesador
45
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
;******************************************************************************
;Bits de configuración
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 definición de variables en RAM de
acceso flags
;definimos la dirección 0 como registro de
banderas
ENDC
;fin del bloque de constantes
;******************************************************************************
ORG
0x0000
; vector de reset
bra
inicio
org
0x08
;vector de interrupción
bra
RST0
;ramifica servicio interrupción T0
org
0x0020
inicio
bsf
OSCCON,IRCF2,0
;Inicio del programa principal
bsf
OSCCON,IRCF1,0
;Oscilador interno a 4 MHz
bcf
OSCCON,IRCF0,0
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
movlw 0xC0
cero
;código del cero
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
nueve
uno
;código del uno
movlw 0xF9
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
cero
dos
movlw 0xA4
;código del dos
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
uno
46
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
tres
movlw
movwf
0xB0
PORTD,0
;código del tres
47
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
call
repite
btfs
PORTB,0,0
s
bra
dos
movlw 0x99
cuatro
;código del cuatro
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
tres
cinco
;código del cinco
movlw 0x92
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
cuatro
seis
movlw 0x82
;código del seis
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
cinco
movlw 0xB8
siete
;código del siete
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
seis
ocho
;código del ocho
movlw 0x80
movwf PORTD,0
call
repite
btfss
PORTB,0,0
bra
siete
nueve
movlw 0x98
;código 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
;valor de precarga para 500ms a 4MHz
movwf TMR0L,0
bsf
flags,0,0
retfie
END
Programa 4: Usando el timer 0 para encender cada dígito del display durante exactamente
500 ms
48
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Diagrama de simulación en ISIS del Programa 4
20
INTERRUPCIÓN EXTERNA 1
Ya revisamos en el ejemplo anterior cómo funciona la interrupción del temporizador 0.
Ahora veremos cómo funciona la interrupción externa INT1. Recordemos que para lograr
que el contador fuera ascendente o descendente, dependía del valor del nivel lógico
presente en el puerto de entrada RB0:
RB0
1
0
Conteo
Ascendente
descendent
e
Nuestra nueva versión de este programa, hará uso de la interrupción externa INT1, la cual
está asociada al puerto de entrada RB1, colocaremos en este pin un botón pulsador y en
vez de detectar un nivel lógico en este pin, se detectará un flanco ascendente generado
por el accionamiento de este botón, que interrumpirá al procesador y en su rutina de
servicio de interrupción modificaremos el valor de una bandera de propósito general, para
cambiar el sentido del contador.
Para activar la interrupción INT1, debemos:


poner el bit INT1IE del registro INTCON3:
limpiar el bit INT1IP, ya que le asignaremos un nivel de prioridad bajo a esta
interrupción INTCON3
R/W-1
R/W-1
U-0
R/W-0
INT2IP
INT1IP
-
INT2IE
Bit 7
1
Bit 6
0
Bit 5
0
Bit 4
0
R/W0
INT1I
E
Bit 3
1
49
U-0
R/W-0
R/W-x
-
INT2IF
Bit 2
0
Bit 1
0
INT1I
F
Bit 0
0
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Según la tabla anterior, el valor para el registro INTCON3 sera: 1000 1000 es decir 0x88
En este programa ejemplificaremos el uso de prioridades de interrupción, por lo que el
timer 0, lo dejaremos en alta prioridad y la interrupción externa en baja, pero debemos de
activar el bit de habilitación de prioridades de interrupción 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
SBORE
/RI
/T0
N
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Para activar este bit lo haremos con la instrucción:
/PD
/POR
R/W0
/BOR
Bit 2
Bit 1
Bit 0
IPEN
bsf
RCON,IPEN,0
;habilitamos
prioridades
de
interrupción En el ejemplo anterior, solamente teníamos una interrupción activa: la del
timer 0, que funcionaba
en alta prioridad, ya que no habíamos activado las prioridades de interrupción; esta
interrupción cuando se generaba, respondía en el vector 0x08. Ahora se adicionan
prioridades de interrupción e INT1, le asignamos baja prioridad, por lo que responderá en
el vector de baja prioridad de interrupción 0x 18.
Para saber más, 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
activación de la interrupción INT1, así como también las instrucciones que se modificaron
como consecuencia de este cambio
Ejemplo 5 Contador ascendente descendente, usando el timer 0 y la
interrupción externa INT1
50
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
;******************************************************************************
LIST P=18F4550
;directiva para definir el procesador
#include
;definiciones de variables especificas del
<P18F4550.INC>
procesador
;******************************************************************************
;Bits de configuración
;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 vigía apagado
CONFIG MCLRE=OFF
;Reset
apagado CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000
;ejemplo de definición de variables en RAM de
acceso
flags
;banderas
51
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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
movlw 0x0F
movwf ADCON1,0
clrf
PORTD,0
clrf
TRISD,0
movlw 0x95
movwf T0CON,0
movlw 0XE0
movwf INTCON,0
bsf
RCON,IPEN,0
movlw 0xE1
movwf TMR0H,0
movlw 0x7c
movwf TMR0L,0
movlw 0x88
movwf INTCON3,0
cero
movlw 0xC0
movwf PORTD,0
call
repite
btfss flags,1,0
bra
nueve
uno
movlw 0xF9
movwf PORTD,0
call
repite
btfss flags,1,0
bra
cero
movlw
0xA4
dos
movwf PORTD,0
call
repite
btfss flags,1,0
bra
uno
tres
movlw 0xB0
movwf PORTD,0
call
repite
btfss flags,1,0
bra
dos
cuatro
movlw 0x99
movwf PORTD,0
call
repite
;Oscilador interno a 4 MHz
;Puertos Digitales
;Puerto D Configurado como salida
;timer 16 bits prescalerX64
;interrupciones TMR0,prioridad habilitada
;habilitamos prioridades de interrupción
;valor de precarga para 500ms a 4MHz
;habilitamos int1 en baja prioridad
;código del cero
;código del uno
;código del dos
;código del tres
;código del cuatro
52
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
btfss
bra
movlw
movwf
call
flags,1,0
tres
cinco
0x92
;código del cinco
PORTD,
0
repite
btfss flags,1,0
bra
cuatro
movlw 0x82
seis
;código del seis
movwf PORTD,
0
call
repite
btfss flags,1,0
bra
cinco
siete
;código del siete
movlw 0xB8
movwf PORTD,
0
call
repite
btfss flags,1,0
bra
seis
ocho
movlw 0x80
;código del ocho
movwf PORTD,
0
call
repite
btfss flags,1,0
bra
siete
movlw 0x98
nueve
;código 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,TMR0I
;apagamos bandera timer0
F,0
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
interrupción
btg flags,1,0
;bit monitor de interrupción
retfie
END
53
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Programa 5 Contador ascendente descendente con interrupciones del timer e INT1
54
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Diagrama de simulación del contador con interrupción externa
21
Como hemos visto, en el programa anterior, mandamos a exhibir los códigos de manera
directa, uno por uno, con la consecuencia de que el programa tiene una secuencia
repetitiva de instrucciones, pero ¿qué pasaría si quisiéramos usar dos displays y exhibir
un conteo hasta el 99?
¡No sería conveniente repetir una secuencia de instrucciones 100 veces!, por lo cual
tenemos que usar otro método más eficiente para enviar los códigos de siete segmentos
al PORTD, que veremos en la siguiente sección.
Ejemplo 6: Manejando tablas por el método del “goto calculado”
Para crear tablas de búsqueda en memoria de programa con los microcontroladores
PIC18, existen dos métodos:
1. Goto calculado
2. Instrucciones específicas de lectura de tabla
En este ejemplo, veremos el primer método. 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 continuación:
movf
tabla
desplazamiento,
W call tabla
.
.
addwf PCL
retlw nn
retlw nn
.
.
retlw nn
El valor del desplazamiento indica el número de bytes que debe avanzar el contador de
programa y debe ser un múltiplo de dos. Este método recibe el nombre de goto
calculado, porque igual que
55
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
una instrucción goto, realiza una ramificación, 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 página 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 errático del mismo.
Veamos la nueva versión del contador ascendente-descendente del 0 al 9:
;******************************************************************************
LIST P=18F4550
;directiva para definir el procesador
#include
;definiciones de variables especificas del
<P18F4550.INC>
procesador
;******************************************************************************
;Bits de configuración
;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
;ejemplo de definición de variables en RAM de
0x000
acceso
flags
;banderas
índic
;fin del bloque de
e
constantes
;******************************************************************************
END
ORG 0x0000
;vector de reset
C
br
inicio
a
0x08
;vector de alta prioridad
or
RST0
;ramifica servicio interrupcion
g
0x18
T0
br
RSIN
;vector de baja prioridad
a
T
or
0x002
inici
g
0
o
br
OSCCON,IRCF
;Oscilador interno a 4 MHz
a
2,0
or
OSCCON,IRCF
;Puertos Digitales
g
1,0
bsf
OSCCON,IRCF
;Puerto D Configurado como
bsf
0,0 0x0F
salida
movlw ADCON1
0x95
bcf
movwf ,0
T0CON,0
;timer 16 bits
movl
prescalerX64
movlw 0XE0
w
PORTD,0
movwf TRISD,0
INTCON,0
;interrupciones TMR0,prioridad
movw
bsf
RCON,IPEN,0 ;habilitamos
fhabilitada
clrf
prioridades
de interrupción
clrf
56
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
movl 0xE1
w
TMR0H,0
movwf
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
call
tabla
next
;exhibe el número
movwf PORTD,0
call
repite
tst
btfss
flags,1,0
;¿ascendente o descendente?
bra
decre
;conteo ascendente
incf
indice,F,0
movf
indice,W,0
xorlw 0x0a
;verifica límite superior de tabla
btfss
STATUS,Z,0
bra
next
bra
limpia
decf
indice,F,0
decre
;conteo descendente
movf
indice,W,0
xorlw 0xFF
;verifica límite inferior de tabla, FF=-1
btfsc STATUS,Z,0
bra
inid
llama
call
tabla
movwf PORTD,0
;exhibe el número
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
;apagamos bandera timer0
INTCON,TMR0IF,0
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 interrupción
btg flags,1,0
;bit monitor de interrupción
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
;código del cero
retlw 0xf9
;código del uno
retlw 0xA4
;código del dos
57
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
retlw
retlw
retlw
retlw
retlw
retlw
retlw
end
0xb0
0x99
0x92
0x82
0xb8
0x80
0x98
;código del tres
;código del cuatro
;código del cinco
;código del seis
;código del siete
;código del ocho
;código del nueve
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 método de goto
calculado, vemos que en comparación con el programa 5, esta versión es más compacta.
Las modificaciones de este programa aparecen en rojo. Cada uno de los códigos de siete
segmentos forma parte de una instrucción retlw, de tal manera que cuando se produce el
retorno de subrutina, el registro W contiene este código; por lo tanto, usando este método
se puede almacenar un dato de un byte por cada palabra de instrucción, que como
recordamos, es de dos bytes.
Ejemplo 7, tablas de búsqueda en memoria de programa usando
instrucciones de lectura de tabla
Ahora veremos el segundo método, que ya habíamos 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
TBLPTRU
Apuntador de tabla parte alta
TBLPTRH
Apuntador de tabla parte
baja
TBLPTRL
También existe un registro llamado TABLAT (TABle LATch), para almacenar el
dato leído, correspondiente a la dirección especificada por TBLPTR.
58
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
En la figura se muestra una operación de lectura de tabla TBLRD *, existen cuatro
instrucciones de lectura de TABLA:
TBLRD *
TBLRD
*+
TBLRD
+*
TBLRD *-
Lectura de tabla
Lectura de tabla con pos incremento del apuntador
Lectura de tabla con pre incremento del apuntador
Lectura de tabla con pos decremento del apuntador
También existen las instrucciones equivalentes para la escritura en memoria de tabla
59
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
TBLWT *
TBLWT *+
TBLWT +*
TBLWT *-
Escritura de tabla
Escritura de tabla con pos incremento del apuntador
Escritura de tabla con pre incremento del apuntador
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
#include <P18F4550.INC>
;directiva para definir el procesador
;definiciones de variables especificas del procesador
;******************************************************************************
;Bits de configuración
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 definición de variables en RAM de acceso
flags
;banderas
ENDC
;fin del bloque de constantes
;******************************************************************************
;Reset vector
ORG 0x0000
bra
inicio
;vector de alta prioridad
org
0x08
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
60
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Ricardo Álvarez
González
movl 0x7c
;valor de precarga para 500ms a 4MHz
w
TMR0L,0
movwf 0x88
movl
INTCON3,0
;habilitamos int1 en baja prioridad
w
movwf
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 interrupción
btg
flags,1,0
;bit monitor de interrupción
retfie
;********************************************************************
or
0x20
;DB directiva que Define
g
0
Byte
DB
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x8
0,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 dirección 0x200, nótese
que esto lo hacemos al configurar los tres registros correspondientes al apuntador.
También usamos una nueva directiva: DB, la cual sirve para definir un byte a partir de la
dirección especificada por la directiva ORG que la antecede, en nuestro caso, indica la
dirección 0x200, a partir de esta dirección definimos nuestros códigos de siete segmentos.
Usando esta técnica, optimizamos el uso de la memoria, ya que almacenamos cada
código usando un solo byte. Este programa hace exactamente lo que el anterior, pero
usando las instrucciones de lectura de tabla, pero en el
61
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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 están 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 técnica se conoce como multiplexión, 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
#include <P18F4550.INC>
procesador
;directiva para definir el procesador
;definiciones de variables especificas del
;******************************************************************************
;Bits de configuración
;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 vigía apagado
CONFIG MCLRE=OFF
;Reset
apagado CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
;Definiciones de variables
CBLOCK 0x000
;ejemplo de definición de variables en RAM de
acceso
flags
;banderas
iun
;índice de unidades
cuni
;código de 7 segmentos de unidades
idec
;índice de decenas
cdec
;código 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 interrupción 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
62
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
clrf
PORTD,0
63
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
clrf
movlw
movwf
clrf
movlw
movwf
movlw
movwf
bsf
movlw
movwf
movlw
movwf
movlw
movwf
clrf
movlw
movwf
clrf
clrf
lee
clrf
movff
tblrd
movff
movff
tblrd
movff
loop
movlw
movwf
movff
call
movlw
movwf
movff
call
btfss
bra
bcf
incf
movf
xorlw
btfss
bra
TRISD,0
0xfc
TRISC,0
PORTC,0
0x95
T0CON,0
0XE0
INTCON,0
RCON,IPE
N,0
0xE1
TMR0H,0
0x7c
TMR0L,0
0x88
INTCON3,
0
TBLPTRL,
0
0x02
TBLPTRH,
0
TBLPTRU,
0
iun,0
idec,0
iun,TBLPT
RL
*
TABLAT,cu
ni
idec,TBLPT
RL
*
TABLAT,cd
ec
0x01
PORTC,0
cuni,PORT
D
retardo
0x02
PORTC,0
cdec,PORT
D
retardo
flags,0,0
loop
flags,0,0
iun,F,0
iun,W,0
0x0a
STATUS,Z,0
lee
;Puerto D Configurado como salida
;RC0 y RC1 como salidas
;timer 16 bits prescalerX64
;interrupciones TMR0,prioridad habilitada
;habilitamos prioridades de interrupción
;valor de precarga para 500ms a 4MHz
;habilitamos int1 en baja prioridad
;tblptr=0x000200
;iniciamos en 0
;ajusta apuntador
;lee la tabla sin modificar apuntador
;cuni tiene código 7 segmentos
;ajusta apuntador
;lee la tabla sin modificar apuntador
;cdec tiene código 7 segmentos
;encendemos display unidades
;encendemos display decenas
;verifica límite de tabla
64
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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
cont,0
65
setf
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
nad
a
nop
decfsz
cont,F,
0 bra nada
return
;******************************************************************************
RST
;apagamos bandera
bcf
INTCON,TMR0I
0
timer0
movl F,0
0xE1
w
movwf TMR0H,0
movl 0x7c
;valor de precarga para 500ms a
TMR0L,0
w
4MHz
movwf flags,0,0
bsf
;********************************************************************
retfie
RSINT
bcf
INTCON3,INT1IF,0
;Limpiamos bandera de
interrupción
flags,1,
btg
;bit monitor de interrupción
retfie 0
;********************************************************************
0x20
;DB directiva que Define
org
0
Byte
DB
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x8
0,0x98
EN
D
Programa 8, controlando dos exhibidores de 7 segmentos
Como observamos en el código del programa anterior, para controlar dos exhibidores,
necesitamos dos bits de puerto configurados como salida, ya que ellos serán los
encargados de encender y apagar los transistores que manejan los displays. En este
programa, no se usa la instrucción TBLRD *+, ya que tenemos un par de registros en
donde se guardan los índices necesarios para el conteo:


Iun
Idec
índice de unidades
í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 dígitos necesitamos los códigos de 7 segmentos,
tenemos también dos registros que los almacenan


Cuni código de 7 segmentos de unidades
Cdec código de 7 segmentos de decenas
El programa lo que hace es cargar el código 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 código de siete segmentos con las instrucciones:
movff iun,TBLPTRL
unidades tblrd
movff TABLAT,cuni
;ajusta apuntador con el valor de
* ;lee la tabla sin modificar apuntador
;cuni tiene código 7 segmentos de unidades
66
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
movff idec,TBLPTRL
;ajusta apuntador con el valor de
decenas
;lee la tabla sin modificar apuntador
;cdec tiene código 7 segmentos de
decenas
tblrd *
movff TABLAT,cdec
Ejemplo 9: Usando un teclado Matricial
Hasta ahora solamente hemos trabajado básicamente con puertos configurados como
salida, también 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:
U1
18
10k
10k
10k
VUSB
10k
7
8
9
F
4
5
6
E
1
2
3
D
0
A
B
C
40
39
38
37
36
35
34
33
RB7/KBI3/PGD
RB6/KBI2/PGC
RB5/KBI1/PGM
RB4/AN11/KBI0/CSSPP
RB3/AN9/CCP2/VPO
RB2/AN8/INT2/VMO
RB1/AN10/INT1/SCK/SCL
RB0/AN12/INT0/FLT0/SDI/SDA
13
14
7
6
5
4
3
2
1
RE3/MCLR/VPP
10
RE2/AN7/OESPP
9
RE1/AN6/CK2SPP
8
RE0/AN5/CK1SPP
RD7/SPP7/P1D
RD6/SPP6/P1C
RD5/SPP5/P1B
RD4/SPP4
RD3/SPP3
RD2/SPP2
RD1/SPP1
RD0/SPP0
OSC1/CLKI
RA6/OSC2/CLKO
RC7/RX/DT/SDO
RA5/AN4/SS/LVDIN/C2OUT
RC6/TX/CK
RA4/T0CKI/C1OUT/RCV
RC5/D+/VP
RA3/AN3/VREF+
RC4/D-/VM
RA2/AN2/VREF-/CVREF
RC2/CCP1/P1A
RA1/AN1
RC1/T1OSI/CCP2/UOE
RA0/AN0
RC0/T1OSO/T1CKI
30
29
28
27
22
21
20
19
26
25
24
23
17
16
15
PIC18F4550
Se muestra en la siguiente figura, el diagrama de flujo para el funcionamiento del teclado
67
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
Buy SmartDraw !- purchased copies print this
document without a watermark .
Visit www.smartdraw.com or call 1-800-768-3729.
68
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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 poniéndolos a uno. Una vez que se
activa un renglón, 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
código correspondiente; si en las columnas existe un nivel alto, es porque no se ha
pulsado ninguna tecla, por lo que se desactiva el renglón 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, nótese que se han omitido las
resistencias que se conectan entre cada columna y el voltaje de alimentación, esto
69
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
es porque usamos las resistencias de pull up del microcontrolador, estas las activamos
con la instrucción:
U1
18
7
8
9
F
4
5
6
E
1
2
3
D
0
A
B
C
VUSB
RE3/MCLR/VPP
RE2/AN7/OESPP
RE1/AN6/CK2SPP
RE0/AN5/CK1SPP
40
RB7/KBI3/PGD
39
RB6/KBI2/PGC
38
RB5/KBI1/PGM
37
RB4/AN11/KBI0/CSSPP
36
RB3/AN9/CCP2/VPO
35
RB2/AN8/INT2/VMO
34
RB1/AN10/INT1/SCK/SCL
33
RB0/AN12/INT0/FLT0/SDI/SDA
13
14
7
6
5
4
3
2
RD7/SPP7/P1D
RD6/SPP6/P1C
RD5/SPP5/P1B
RD4/SPP4
RD3/SPP3
RD2/SPP2
RD1/SPP1
RD0/SPP0
OSC1/CLKI
RA6/OSC2/CLKO
RC7/RX/DT/SDO
RA5/AN4/SS/LVDIN/C2OUT
RC6/TX/CK
RA4/T0CKI/C1OUT/RCV
RC5/D+/VP
RA3/AN3/VREF+
RC4/D-/VM
RA2/AN2/VREF-/CVREF
RC2/CCP1/P1A
RA1/AN1
RC1/T1OSI/CCP2/UOE
RA0/AN0
RC0/T1OSO/T1CKI
1
10
9
8
30
29
28
27
22
21
20
19
26
25
24
23
17
16
15
PIC18F4550
Se muestra a continuación el programa del teclado. La rutina KBD ejecuta el código
correspondiente al diagrama de flujo anterior, entrega como resultado un código de 4 bits
correspondiente a la tecla pulsada, si por alguna razón ninguna tecla se pulsó, regresa el
código FF, aunque, debido a que activamos la interrupción por cambio de estado en la
parte alta del puerto B, sabemos que si se activó la interrupción, es porque se pulsó una
tecla. Incluimos el código nulo, para que la rutina KBD pueda ejecutarse también sin
interrupción, es decir, invocar periódicamente esta rutina, para que cuando se pulse una
tecla, se obtenga su código; este método es conocido como encuesta (polling). En la
rutina de servicio de interrupción RSINT invocamos la rutina KBD, y si la tecla pulsada es
menor que 0xA, entonces usamos este valor para modificar el dígito 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
;definiciones de variables especificas del
<P18F4550.INC>
procesador
;******************************************************************************
;Bits de configuración
;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 vigía apagado
CONFIG MCLRE=OFF
;Reset
apagado CONFIG PBADEN=OFF
CONFIG LVP = OFF
;******************************************************************************
70
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
;Definiciones de variables
CBLOCK 0x000
;ejemplo de definición de variables en RAM de
acceso
flags
;banderas
iun
;índice de unidades
cuni
;código de unidades
idec
;índice de decenas
cdec
;código de decenas
cont
tecla
;registro de código 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 interrupción 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 interrupción
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
71
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
tblrd
movff
*
;lee
TABLAT,cd
;cdec tiene codigo 7 segmentos
ec
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
;valor de precarga para 500ms a 4MHz
movwf TMR0L,0
bsf
flags,0,0
retfie
;********************
************* ***********************************
RSINT
call
KBD
;Llamamos rutina del teclado
bcf
INTCON,RBI
;LIMPIAMOS BANDERA
F,0
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 número de tecla pulsada en decenas
movff idec,TBLPTR
L
tblrd
*
;lee
movff TABLAT,cde
;cdec tiene código 7 segmentos
72
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
limpia
c
bra
exit
movlw 0x0c
73
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
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 código 7
segmentos movff iun,TBLPTRL
tblrd
*
;lee
movff TABLAT,cuni
;cdec tiene código 7
segmentos exit clrf
PORTB,0
retfie
;********************************************************************
KBD
movlw 0x0e
movw PORTB,0
f
PORTB,4,0
btfss
retlw 0x00
btfss PORTB,5,0
retlw 0x0A
btfss PORTB,6,0
retlw 0x0B
btfss PORTB,7,0
retlw 0x0C
movlw 0x0D
movw PORTB,0
f
btfss PORTB,4,0
retlw 0x01
btfss
PORTB,5,0
retlw 0x02
btfss PORTB,6,0
retlw 0x03
btfss PORTB,7,0
retlw 0x0D
movlw 0x0B
movw PORTB,0
f
btfss PORTB,4,0
retlw 0x04
btfss PORTB,5,0
retlw 0x05
btfss PORTB,6,0
retlw 0x06
btfss PORTB,7,0
retlw 0x0E
movlw 0x07
movw PORTB,0
f
btfss PORTB,4,0
retlw 0x07
btfss PORTB,5,0
retlw 0x08
btfss PORTB,6,0
;activamos primer renglón
;tecla 0
;tecla a
;tecla b
;tecla c
;activamos segundo renglón
;tecla 1
;tecla 2
;tecla 3
;tecla d
;activamos tercer renglón
;tecla 4
;tecla 5
;tecla 6
;activamos primer renglón
;tecla 7
;tecla 8
74
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
retlw
btfss
retlw
0x09
PORTB,7,0
0x0F
;tecla 9
;tecla F
75
Ricardo Álvarez
González
Microcontroladores PIC 18F4550 Ejemplos
prácticos
retlw
org
DB
END
0xFF
;ninguna tecla pulsada
0x20
;DB directiva que Define
0
Byte
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x8
0,0x98
Programa 9, Contador de 0-99, con programación 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 básica de retardo,
la cual funciona por el tiempo de ejecución 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
características únicas, con respecto a los otros timers existentes en este
microcontrolador:



Solamente puede funcionar como timer
Cuenta además 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
76
Descargar