Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

74
Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González 1 MICROCONTR OLADORES PIC 18F4550: EJEMPLOS PRÁCTICOS EN LENGUAJE ENSAMBLADOR Introducción Se presenta a continuación unas notas que tiene n 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 la mayoría de las figuras a Cesar Hugo Pimentel Romero. 

Transcript of Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 1/74

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 2/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

2

Conceptos básicosNuestra 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 RISC.R: ReducedI: instructionS: SetC: Computer

Procesadores CISC.-C: ComplexI: InstructionS: SetC: 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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 3/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

3

Ilustración 1 Bloques básicos que forman una computadora digital

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 4/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

4

Arquitectura de von NeumannArquitectura 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 HarvardEl 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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 5/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

5

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 delectura, 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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 6/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

6

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

MicrocontroladoresUn microcontrolador es una computadora completa de capacidades limitadas orientada aefectuar 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 contienememorias de: programa, datos, datos no volátiles (en algunos casos), puertos deentrada/salida, temporizadores/contadores, temporizador vigía, oscilador, unidades decomunicació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 MCS8048, posteriormente comercializó a la popular familia MCS 8051, ambas de 8 bits, tienetambién poderosas familias de microcontroladores de 16 bits, por ejemplo: MCS96,algunos elementos de esta familia tienen convertidores A/D integrados y otros tienencontroladores de motores.

MOTOROLA, con sus familias de microcontroladores 68HC05, 68HC07.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 7/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

7

NATIONAL con sus microcontroladores COP 8.

ZILOG contribuye con sus dispositivos Z84 y Z86

TEXAS INSTRUMENTS tiene su familia de microcontroladores de 8 bits TMS370, a la cualpertenecen dispositivos con una variedad de periféricos y prestaciones, en encapsuladosdesde 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 elementoscaracterísticos es el 89C51, el cual es un clon del Intel 87C51. Actualmente contribuye demanera 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 stackde 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 yconsecuentemente, diversos números de pines (familias 16xxx), familias poderosas de 77instrucciones, 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 susfamilias de Controladores digitales de señales: los dsPICs, los cuales son chips poderososde 16 bits que incluyen instrucciones para procesamiento de señales mediante su máquinaDSP, debido al auge que han tenido estos procesadores, el fabricante también ofrece estoschips, 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 hastallegar 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 DECIMALAntes 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 Hexadecimal

0 0000 01 0001 12 0010 2

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 8/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

8

3 0011 34 0100 45 0101 56 0110 67 0111 78 1000 89 1001 9

10 1010 A11 1011 B12 1100 C13 1101 D14 1110 E15 1111 F

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,

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 1Convierta los números binarios a hexadecimal, sustituyendo directamente los grupos de 4 bitspor su equivalente en hexadecimal

a.  110011001010101b.  110001101010011

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 9/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

9

c.  101010101110110d.  110101101001111e.  100101111101011

Ejercicio 2Convierta los números hexadecimales a binario, sustituyendo directamente cada dígito decimalpor su equivalente binario

a.  9896b.  A7F2c.  73B1d.  D53Ae.  B3F5

EL MICROCONTROLADOR PIC18F4550Una vez que hemos visto los conceptos fundamentales, veremos un microcontrolador comercial,

en este caso es el 18F4550 del fabricante Microchip

Se muestra en la siguiente figura su diagrama de bloques:

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 10/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

10

Ilustración 5: Diagrama de bloques del PIC18F4550

ORGANIZACIÓN DE LA MEMORIAEstos dispositivos cuentan con tres bloques de memoria:

Memoria de programa

Memoria RAM de datos

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 11/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

11

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.

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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 12/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

12

Ilustración 6 Mapa de memoria de programa

StackLa 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 unainstrucció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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 13/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

13

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 delstack 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 pordefecto 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 PCLATUEl 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 cuatroseñ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:

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 14/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

14

Ilustración 7 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 8 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).

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 15/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

15

ORGANIZACIÓN DE LA MEMORIA DE DATOSLa 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 9 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 más 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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 16/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

16

Ilustración 10 Mapa de memoria de datos

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 17/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

17

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 ESPECIALLos 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 ACCESOEl 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ápida 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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 18/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

18

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 BANCOSLa 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á ef ecto.

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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 19/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

19

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.

Registro STATUS

bit 7 bIt6 bIt5 bIt4 bIt3 bIt2 bIt1 bit0

U-0 U-0 U-0 R/W-x R/W-x R/W-x R/W-x R/W-x- - - N OV Z DC C

Ilustración 11 Registro de estado del procesador

REGISTRO RCONEl 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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 20/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

20

CONFIGURACIÓN DEL OSCILADORLos 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

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 INSTRUCCIONESCon 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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 21/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

21

El operando de destino “d” indica en donde se colocará el resultado de la operación: 

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 “-”). 

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 22/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

22

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 23/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

23

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 24/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

24

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 delensamblador MPASM, que son imprescindibles para escribir programas.

PANORAMA GENERAL DE MPASMMPASM 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 lenguajeLas 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 programación.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 25/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

25

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

TRISDn 1

PORTDn In, entrada

Nótese que esto es mas facil de recordar si escribimos los nombres en ingles: 1 In entrada, 0 Out

salida

TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0

0 0 0 0 0 0 0 0

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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 26/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

26

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

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

;******************************************************************************;Bits de configuración

CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigia apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesocontENDC

;******************************************************************************;Reset vector

ORG 0x0000;Inicio del programa principal

bcf OSCCON,IRCF2,0bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHzmovlw 0x0Fmovwf ADCON1,0 ;Puertos Digitales

clrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salidabsf PORTD,0,0 ;enciende LED conectado en RD0

correi rlcf PORTD,F,0call retardobra correi

;******************************************************************************retardo movlw 0xff

movwf cont,0nada nop

decfsz cont,1,0bra nada

returnEND

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.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 27/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

27

En la figura 12 se muestra una foto con la conexión de los leds

12 Pantalla de MPLAB

13 Conexión de los leds

Para alambrar la práctica en una tablilla de prototipos ( proto board ), presentamos el diagrama de

pines:

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 28/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

28

Ilustración 14 Diagrama de pines del microcontrolador 18F4550

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

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

;******************************************************************************;Bits de configuración

CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigia apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

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

;Definiciones de variablesCBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesocontcicloENDC ;fin del bloque de constantes

;******************************************************************************;Reset vector

ORG 0x0000

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 29/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

29

;Inicio del programa principalbcf OSCCON,IRCF2,0bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHzmovlw 0x0Fmovwf ADCON1,0 ;Puertos Digitalesclrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salidabsf PORTD,0,0 ;enciende LED conectado en RD0

correi rlcf PORTD,F,0call repite ;llama a una rutina más largabra correi

;******************************************************************************retardo movlw 0xff

movwf cont,0nada nop

decfsz cont,1,0bra nada

return;******************************************************************************repite movlw d'25' ;llama 25 veces a la rutina retardo

movwf ciclollama call retardo

decfsz ciclo,F,0bra llamareturnEND

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á encendidocada 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:

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 30/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

30

15 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énllamado 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 segmentosSe muestra en la tabla siguiente, la asignación de los pines del puerto D para la conexión de los

segmentos del display:

RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0

Puntodecimal

g f E d c b 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 Digito 

C0 1100 0000 0

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 31/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

31

F9 1111 1001 1

A4 1010 0100 2

B0 1011 0000 3

99 1001 1001 492 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 segmentospara los dígitos hexadecimales faltantes, para un exhibidor de siete segmentos de ánodo común

Ejercicio E2.2Genere los códigos de siete segmentos, usando el mismo orden de los bits mostrado en la tablaE2 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 <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************;Bits de configuración

CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigia apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesocontcicloENDC ;fin del bloque de constantes

;******************************************************************************;Reset vector

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 32/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

32

ORG 0x0000;Inicio del programa principal

bcf OSCCON,IRCF2,0bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHzmovlw 0x0Fmovwf ADCON1,0 ;Puertos Digitalesclrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salida

cero movlw 0xC0 ;código del ceromovwf PORTD,0call repitemovlw 0xF9 ;código del unomovwf PORTD,0call repitemovlw 0xA4 ;código del dosmovwf PORTD,0call repite

movlw 0xB0 ;código del tresmovwf PORTD,0call repitemovlw 0x99 ;código del cuatromovwf PORTD,0call repitemovlw 0x92 ;código del cincomovwf PORTD,0call repitemovlw 0x82 ;código del seismovwf PORTD,0

call repitemovlw 0xB8 ;código del sietemovwf PORTD,0call repitemovlw 0x80 ;código del ochomovwf PORTD,0call repitemovlw 0x98 ;código del nuevemovwf PORTD,0call repitebra cero

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

retardo movlw 0xffmovwf cont,0

nada nopdecfsz cont,1,0bra nadareturn

;******************************************************************************repite movlw d'25' ;llama 25 veces a la rutina retardo

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 33/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

33

movwf ciclocall retardo

llama decfsz ciclo,F,0bra llamareturnEND

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 ceromovwf PORTD,0call repite

De tal manera que estas tres instrucciones se repiten diez veces, empezando por el código del ceroy terminando con el del nueve, después de esto se regresa el programa nuevamente al código delcero, con la instrucción de salto incondicional:

bra cero

Se muestra en la siguiente figura el diagrama de la simulación en ISIS Proteus:

16 Ventana de simulación en ISIS

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 34/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

34

Ejercicio E2.3Vimos que el ejemplo anterior, consistía en una repetición de diez veces del mismo bloque deinstrucciones. Reescriba el código del ejemplo 2, disminuyendo el número de instrucciones,usando subrutinas

Ejercicio E2.4Extienda el programa del ejemplo 2, para mostrar los dígitos hexadecimales del 0,1,2,…,F,0… 

Ejemplo 3: Contador ascendente-descendenteHasta 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 Conteo1 Ascendente

0 descendente

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

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

;******************************************************************************;Bits de configuración

;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigia apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesocontciclo

ENDC ;fin del bloque de constantes;******************************************************************************;Reset vector

ORG 0x0000;Inicio del programa principal

bcf OSCCON,IRCF2,0bsf OSCCON,IRCF0,0 ;Oscilador interno a125 kHzmovlw 0x0Fmovwf ADCON1,0 ;Puertos Digitales

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 35/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

35

clrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salida

cero movlw 0xC0 ;código del ceromovwf PORTD,0call repitebtfss PORTB,0,0

bra nueveuno movlw 0xF9 ;código del uno

movwf PORTD,0call repitebtfss PORTB,0,0bra cero

dos movlw 0xA4 ;código del dosmovwf PORTD,0call repitebtfss PORTB,0,0bra uno

tres movlw 0xB0 ;código del tresmovwf PORTD,0

call repitebtfss PORTB,0,0bra dos

cuatro movlw 0x99 ;código del cuatromovwf PORTD,0call repitebtfss PORTB,0,0bra tres

cinco movlw 0x92 ;código del cincomovwf PORTD,0call repitebtfss PORTB,0,0

bra cuatroseis movlw 0x82 ;código del seismovwf PORTD,0call repitebtfss PORTB,0,0bra cinco

siete movlw 0xB8 ;código del sietemovwf PORTD,0call repitebtfss PORTB,0,0bra seis

ocho movlw 0x80 ;código del ochomovwf PORTD,0

call repitebtfss PORTB,0,0bra siete

nueve movlw 0x98 ;código del nuevemovwf PORTD,0call repitebtfss PORTB,0,0bra ochobra cero

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 36/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

36

;******************************************************************************retardo movlw 0xff

movwf cont,0nada nop

decfsz cont,1,0bra nada

return;******************************************************************************repite movlw d'1' ;llama una vez a la rutina retardo

movwf ciclonada2 nop

call retardodecfsz ciclo,1,0bra nada2returnEND 

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 seramificará para mostrar el código de siete segmentos del cero. El programa está formado por larepetición de las instrucciones mostradas a continuación:

uno movlw 0xF9 ;código del unomovwf PORTD,0call repitebtfss PORTB,0,0bra cero

Se observa en el programa E3 la secuencia completa, notando que si el nivel en RB0 es alto, el

conteo será ascendente, de lo contrario será descendente.

Ejercicio E3.1Agregue al programa 3 las instrucciones necesarias para exhibir los dígitos hexadecimales de la A

a la F

InterrupcionesEsta 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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 37/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

37

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 deinterrupción

INTCON Registro de control de interrupcionesINTCON2 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éricasPIE1, PIE2 Registros de habilitación de interrupción, contiene los bits de habilitación de las

interrupciones periféricas

IPR1, IPR2 Registros de prioridad de interrupción

Para saber más, se recomienda revisar en las hojas de datos del fabricante DS39632C:

Registros INTCON

Registros PIR

Registros PIE

Registros IPRRegistros RCON

TimersLos timers denominados temporizadores en español, son dispositivos que nos proporcionan

intervalos regulares de tiempo. Prácticamente cualquier fabricante de microcontroladores incluye

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 38/74

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 39/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

39

18 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:

Timer Número de bitsTemporizador/contador 0 8 ó 16

Temporizador/contador 1 16

Timer2 8Temporizador/contador 3 16

Temporizador/Contador 0Este 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 losimpulsos 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 selección (los cuales

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 40/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

40

son bits de control del timer) su funcionamiento, esto se logra con el bit TOCS (Timer 0 Clock

Select ) de tal manera que:

TOCS Configuració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 Flanco activo para incrementar TMR0L

0 Ascendente

1 Descendente

19 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 Prescaler

0 Asignado1 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:

T0PS2 T0PS1 T0PS0 Valor delPrescaler

0 0 0 2

0 0 1 4

0 1 0 80 1 1 16

1 0 0 32

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 41/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

41

1 0 1 641 1 0 128

1 1 1 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 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1

TMR0ON T08BIT TOCS TOSE PSA T0PS2 T0PS1 T0PS0Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 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:

TMR0ON Función

0 Timer 0 Apagado

1 Timer 0 Encendido

T08BIT Función

0 Timer/Contador 0 de 16 bits1 Timer/Contador 0 de 8 bits

En la siguiente figura se muestra el diagrama de bloques del temporizador/ contador 0, en

modalidad de 16 bits. Como podemos apreciar en la figura, la diferencia es que se tienen dos

registros de 8 bits, TMR0L y TMR0H, para formar un temporizador/ contador de 16 bits.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 42/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

42

20 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 delmá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 (3)

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 43/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

43

O equivalentemente:

Valor_precarga= máximo valor del timer-Temporización/(4.Tosc.valor_prescaler) (4)

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.

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 4Ahora 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énque 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 0xE1movwf TMR0H,0movlw 0x7cmovwf 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 de100 ms.

b.  Use el timer 0, para generar una frecuencia de 440 Hz, proponga los valores necesariosdel oscilador principal, así como del pre divisor

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 44/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

44

Ahora debemos configurar los registros necesarios para activar el timer:

T0CON

R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1TMR0ON T08BIT TOCS TOSE PSA T0PS2 T0PS1 T0PS0

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

1 0 0 1 0 1 0 1

Este valor binario 1001 0101 equivale a 0x95, que debemos cargar en el registro T0CON 

El valor de precarga 0xE17C se cargará en los registros del timer, por lo tanto 0xE1 debe cargarse

en TMR0H y 0x7C en TMR0L

Para el funcionamiento óptimo del timer debemos configurar su interrupción, esto se hace en elregistro 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 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-xGIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 01 0 1 0 0 0 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 enrojo.

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

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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 45/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

45

;******************************************************************************;Bits de configuración

CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitado

CONFIG WDT = OFF ;Temporizador vigia apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesoflags ;definimos la dirección 0 como registro de banderasENDC ;fin del bloque de constantes

;******************************************************************************ORG 0x0000 ; vector de resetbra inicioorg 0x08 ;vector de interrupción

bra RST0 ;ramifica servicio interrupción T0org 0x0020

inicio bsf OSCCON,IRCF2,0 ;Inicio del programa principalbsf OSCCON,IRCF1,0bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHzmovlw 0x0Fmovwf ADCON1,0 ;Puertos Digitalesclrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salidamovlw 0x95movwf T0CON,0 ;timer 16 bits prescalerX64movlw 0XA0

movwf INTCON,0 ;interrupcion TMR0 habilitadamovlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHz

cero movlw 0xC0 ;código del ceromovwf PORTD,0call repitebtfss PORTB,0,0bra nueve

uno movlw 0xF9 ;código del unomovwf PORTD,0call repite

btfss PORTB,0,0bra cero

dos movlw 0xA4 ;código del dosmovwf PORTD,0call repitebtfss PORTB,0,0bra uno

tres movlw 0xB0 ;código del tresmovwf PORTD,0

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 46/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

46

call repitebtfss PORTB,0,0bra dos

cuatro movlw 0x99 ;código del cuatromovwf PORTD,0call repite

btfss PORTB,0,0bra tres

cinco movlw 0x92 ;código del cincomovwf PORTD,0call repitebtfss PORTB,0,0bra cuatro

seis movlw 0x82 ;código del seismovwf PORTD,0call repitebtfss PORTB,0,0bra cinco

siete movlw 0xB8 ;código del siete

movwf PORTD,0call repitebtfss PORTB,0,0bra seis

ocho movlw 0x80 ;código del ochomovwf PORTD,0call repitebtfss PORTB,0,0bra siete

nueve movlw 0x98 ;código del nuevemovwf PORTD,0call repite

btfss PORTB,0,0bra ochobra cero

;******************************************************************************repite btfss flags,0,0

bra repitebcf flags,0,0

return;******************************************************************************RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0

movlw 0xE1movwf TMR0H,0movlw 0x7c

movwf TMR0L,0 ;valor de precarga para 500ms a 4MHzbsf flags,0,0retfieEND

Programa 4: Usando el timer 0 para encender cada dígito del display durante exactamente 500 ms

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 47/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

47

21 Diagrama de simulación en ISIS del Programa 4

INTERRUPCIÓN EXTERNA 1Ya 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 Conteo

1 Ascendente0 descendente

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

INTCON3R/W-1 R/W-1 U-0 R/W-0 R/W-0 U-0 R/W-0 R/W-x

INT2IP INT1IP - INT2IE INT1IE - INT2IF INT1IFBit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

1 0 0 0 1 0 0 0

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 48/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

48

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 R/W-0

IPEN SBOREN - /RI /T0 /PD /POR /BORBit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

Para activar este bit lo haremos con la instrucción:

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 lainterrupción externa INT1;******************************************************************************

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

;******************************************************************************;Bits de configuración

;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigía apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesoflags ;banderas

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 49/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

49

ENDC ;fin del bloque de constantes;******************************************************************************;Reset vector

ORG 0x0000bra inicioorg 0x08 ;vector de alta prioridad

bra RST0 ;ramifica servicio interrupcion T0org 0x18 ;vector de baja prioridadbra RSINTorg 0x0020

;Inicio del programa principalinicio bsf OSCCON,IRCF2,0

bsf OSCCON,IRCF1,0bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHzmovlw 0x0Fmovwf ADCON1,0 ;Puertos Digitalesclrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salida

movlw 0x95movwf T0CON,0 ;timer 16 bits prescalerX64movlw 0XE0movwf INTCON,0 ;interrupciones TMR0,prioridad habilitadabsf RCON,IPEN,0 ;habilitamos prioridades de interrupciónmovlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzmovlw 0x88movwf INTCON3,0 ;habilitamos int1 en baja prioridad

cero movlw 0xC0 ;código del cero

movwf PORTD,0call repitebtfss flags,1,0bra nueve

uno movlw 0xF9 ;código del unomovwf PORTD,0call repitebtfss flags,1,0bra cero

dos movlw 0xA4 ;código del dosmovwf PORTD,0call repitebtfss flags,1,0

bra unotres movlw 0xB0 ;código del tres

movwf PORTD,0call repitebtfss flags,1,0bra dos

cuatro movlw 0x99 ;código del cuatromovwf PORTD,0call repite

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 50/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

50

btfss flags,1,0bra tres

cinco movlw 0x92 ;código del cincomovwf PORTD,0call repitebtfss flags,1,0

bra cuatroseis movlw 0x82 ;código del seis

movwf PORTD,0call repitebtfss flags,1,0bra cinco

siete movlw 0xB8 ;código del sietemovwf PORTD,0call repitebtfss flags,1,0bra seis

ocho movlw 0x80 ;código del ochomovwf PORTD,0

call repitebtfss flags,1,0bra siete

nueve movlw 0x98 ;código del nuevemovwf PORTD,0call repitebtfss flags,1,0bra ochobra cero

;******************************************************************************repite btfss flags,0,0

bra repite

bcf flags,0,0return;******************************************************************************RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0

movlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzbsf flags,0,0retfie

;********************************************************************RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupción

btg flags,1,0 ;bit monitor de interrupción

retfieEND

Programa 5 Contador ascendente descendente con interrupciones del timer e INT1

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 51/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

51

22 Diagrama de simulación del contador con interrupción externa

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 desplazamiento,Wcall tabla

.

.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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 52/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

52

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 delgrupo 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 <P18F4550.INC> ;definiciones de variables especificas del procesador

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

;Bits de configuración;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET deshabilitadoCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigia apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesoflags ;banderasíndiceENDC ;fin del bloque de constantes

;******************************************************************************ORG 0x0000 ;vector de resetbra inicioorg 0x08 ;vector de alta prioridadbra RST0 ;ramifica servicio interrupcion T0org 0x18 ;vector de baja prioridadbra RSINTorg 0x0020

inicio bsf OSCCON,IRCF2,0bsf OSCCON,IRCF1,0bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz

movlw 0x0Fmovwf ADCON1,0 ;Puertos Digitalesclrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salida

movlw 0x95movwf T0CON,0 ;timer 16 bits prescalerX64

movlw 0XE0movwf INTCON,0 ;interrupciones TMR0,prioridad habilitadabsf RCON,IPEN,0 ;habilitamos prioridades de interrupción

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 53/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

53

movlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzmovlw 0x88

movwf INTCON3,0 ;habilitamos int1 en baja prioridad

limpia clrf indice,0 ;inicia en ceronext call tabla

movwf PORTD,0 ;exhibe el númerocall repite

tst btfss flags,1,0 ;¿ascendente o descendente?bra decreincf indice,F,0 ;conteo ascendentemovf indice,W,0xorlw 0x0a ;verifica límite superior de tablabtfss STATUS,Z,0bra nextbra limpia

decre decf indice,F,0 ;conteo descendente

movf indice,W,0xorlw 0xFF ;verifica límite inferior de tabla, FF=-1btfsc STATUS,Z,0bra inid

llama call tablamovwf PORTD,0 ;exhibe el númerocall repitebra tst

inid movlw 0x09 ;reinicia en nuevemovwf indice,0bra llama

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

repite btfss flags,0,0bra repitebcf flags,0,0return

;******************************************************************************RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0

movlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzbsf flags,0,0retfie

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

RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupciónbtg flags,1,0 ;bit monitor de interrupciónretfie

;********************************************************************tabla rlcf indice,W,0 ;multiplica índice por 2

addwf PCL,F,0 ;ajusta el PCL de acuerdo al valor del índiceretlw 0xC0 ;código del ceroretlw 0xf9 ;código del unoretlw 0xA4 ;código del dos

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 54/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

54

retlw 0xb0 ;código del tresretlw 0x99 ;código del cuatroretlw 0x92 ;código del cincoretlw 0x82 ;código del seisretlw 0xb8 ;código del sieteretlw 0x80 ;código del ocho

retlw 0x98 ;código del nueveend

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 usandoinstrucciones de lectura de tablaAhora 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 partesuperior

Apuntador de tabla parte alta Apuntador de tabla parte baja

TBLPTRU TBLPTRH TBLPTRL

También existe un registro llamado TABLAT (TABle LATch), para almacenar el dato leído,

correspondiente a la dirección especificada por TBLPTR.

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 55/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

55

En la figura se muestra una operación de lectura de tabla TBLRD *, existen cuatro instrucciones de

lectura de TABLA:

TBLRD * Lectura de tabla

TBLRD *+ Lectura de tabla con pos incremento del apuntador

TBLRD +* Lectura de tabla con pre incremento del apuntadorTBLRD *- Lectura de tabla con pos decremento del apuntador

También existen las instrucciones equivalentes para la escritura en memoria de tabla

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 56/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

56

TBLWT * Escritura de tablaTBLWT *+ Escritura de tabla con pos incremento del apuntador

TBLWT +* Escritura de tabla con pre incremento del apuntador

TBLWT *- Escritura de tabla con pos decremento del apuntador

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

tabla

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

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

;******************************************************************************;Bits de configuración

CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADO

CONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigia apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesoflags ;banderasENDC ;fin del bloque de constantes

;******************************************************************************;Reset vector

ORG 0x0000bra inicioorg 0x08 ;vector de alta prioridadbra RST0 ;ramifica servicio interrupcion T0org 0x18 ;vector de baja prioridadbra RSINTorg 0x0020

;Inicio del programa principalinicio bsf OSCCON,IRCF2,0

bsf OSCCON,IRCF1,0bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHzmovlw 0x0Fmovwf ADCON1,0 ;Puertos Digitales

clrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salidamovlw 0x95movwf T0CON,0 ;timer 16 bits prescalerX64movlw 0XE0movwf INTCON,0 ;interrupciones TMR0,prioridad habilitadabsf RCON,IPEN,0 ;habilitamos prioridades de interrupcionmovlw 0xE1movwf TMR0H,0

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 57/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

57

movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzmovlw 0x88movwf INTCON3,0 ;habilitamos int1 en baja prioridadclrf TBLPTRL,0movlw 0x02

movwf TBLPTRH,0clrf TBLPTRU,0 ;tblptr=0x000200

lee tblrd *+ ;lee tabla e incrementa apuntador movff TABLAT,PORTDcall repitemovf TBLPTRL,W,0xorlw 0x0abtfss STATUS,Z,0bra leeclrf TBLPTRL,0goto lee

;******************************************************************************repite btfss flags,0,0

bra repitebcf flags,0,0return

;******************************************************************************RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0

movlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzbsf flags,0,0retfie

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

RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupciónbtg flags,1,0 ;bit monitor de interrupciónretfie

;********************************************************************org 0x200 ;DB directiva que Define Byte 

DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x80,0x98END

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 lohacemos 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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 58/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

58

siguiente programa, veremos cómo usar instrucciones de lectura de tabla, para hacer un contador

de 0 al 99.

Ejemplo 8, manejando dos displays de siete segmentosAl 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ánconectados 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 ;directiva para definir el procesador#include <P18F4550.INC> ;definiciones de variables especificas del procesador

;******************************************************************************;Bits de configuración

;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigía apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

;******************************************************************************;Definiciones de variables

CBLOCK 0x000 ;ejemplo de definición de variables en RAM de acceso

flags ;banderasiun ;índice de unidadescuni ;código de 7 segmentos de unidadesidec ;índice de decenascdec ;código de 7 segmentos de decenascontENDC ;fin del bloque de constantes

;******************************************************************************;Reset vector

ORG 0x0000bra inicioorg 0x08 ;vector de alta prioridadbra RST0 ;ramifica servicio interrupción T0org 0x18 ;vector de baja prioridadbra RSINTorg 0x0020

inicio bsf OSCCON,IRCF2,0bsf OSCCON,IRCF1,0bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz

movlw 0x0Fmovwf ADCON1,0 ;Puertos Digitalesclrf PORTD,0

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 59/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

59

clrf TRISD,0 ;Puerto D Configurado como salidamovlw 0xfcmovwf TRISC,0 ;RC0 y RC1 como salidasclrf PORTC,0

movlw 0x95movwf T0CON,0 ;timer 16 bits prescalerX64

movlw 0XE0movwf INTCON,0 ;interrupciones TMR0,prioridad habilitadabsf RCON,IPEN,0 ;habilitamos prioridades de interrupciónmovlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzmovlw 0x88

movwf INTCON3,0 ;habilitamos int1 en baja prioridadclrf TBLPTRL,0movlw 0x02movwf TBLPTRH,0clrf TBLPTRU,0 ;tblptr=0x000200

clrf iun,0clrf idec,0 ;iniciamos en 0

lee movff iun,TBLPTRL ;ajusta apuntador tblrd * ;lee la tabla sin modificar apuntadormovff TABLAT,cuni ;cuni tiene código 7 segmentosmovff idec,TBLPTRL  ;ajusta apuntador tblrd * ;lee la tabla sin modificar apuntadormovff TABLAT,cdec ;cdec tiene código 7 segmentos

loop movlw 0x01movwf PORTC,0 ;encendemos display unidadesmovff cuni,PORTDcall retardo

movlw 0x02movwf PORTC,0 ;encendemos display decenasmovff cdec,PORTDcall retardobtfss flags,0,0bra loopbcf flags,0,0incf iun,F,0movf iun,W,0xorlw 0x0abtfss STATUS,Z,0 ;verifica límite de tablabra leeclrf iun,0

incf idec,F,0movf idec,W,0xorlw 0x0abtfss STATUS,Z,0bra leeclrf idec,0goto lee

;******************************************************************************retardo setf cont,0

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 60/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

60

nada nopdecfsz cont,F,0bra nadareturn

;******************************************************************************RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0

movlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzbsf flags,0,0retfie

;********************************************************************RSINT bcf INTCON3,INT1IF,0 ;Limpiamos bandera de interrupción

btg flags,1,0 ;bit monitor de interrupciónretfie

;********************************************************************org 0x200 ;DB directiva que Define ByteDB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x80,0x98

END

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 índice de unidades

Idec índice de decenas

El programa mantiene los índices dentro del valor adecuado, iun inicia en cero, y se incrementa

exactamente cada 500 ms, hasta llegar a 9, una vez que iun tiene el valor de 9, en los siguientes

500 ms, iun se regresa a cero, pero a la vez se incrementa idec. Debido a que para encender los

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 ;ajusta apuntador con el valor de unidadestblrd * ;lee la tabla sin modificar apuntadormovff TABLAT,cuni ;cuni tiene código 7 segmentos de unidades

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 61/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

61

movff idec,TBLPTRL ;ajusta apuntador con el valor de decenastblrd * ;lee la tabla sin modificar apuntadormovff TABLAT,cdec ;cdec tiene código 7 segmentos de decenas

Ejemplo 9: Usando un teclado MatricialHasta 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:

Se muestra en la siguiente figura, el diagrama de flujo para el funcionamiento del teclado

RA0/AN02

  RA1/AN13

  RA2/AN2/VREF-/CVREF4

  RA3/AN3/VREF+5

  RA4/T0CKI/C1OUT/RCV6

  RA5/AN4/SS/LVDIN/C2OUT7

  RA6/OSC2/CLKO14

  OSC1/CLKI13

RB0/AN12/INT0/FLT0/SDI/SDA33

  RB1/AN10/INT1/SCK/SCL34

  RB2/AN8/INT2/VMO35

  RB3/AN9/CCP2/VPO36

  RB4/AN11/KBI0/CSSPP37

  RB5/KBI1/PGM38

  RB6/KBI2/PGC39

  RB7/KBI3/PGD40

RC0/T1OSO/T1CKI  15

RC1/T1OSI/CCP2/UOE  16

RC2/CCP1/P1A  17

VUSB18

RC4/D-/VM  23

RC5/D+/VP  24

RC6/TX/CK  25

RC7/RX/DT/SDO  26

RD0/SPP0  19

RD1/SPP1  20

RD2/SPP2  21

RD3/SPP3  22

RD4/SPP4  27

RD5/SPP5/P1B  28

RD6/SPP6/P1C  29

RD7/SPP7/P1D  30

RE0/AN5/CK1SPP  8

RE1/AN6/CK2SPP  9

RE2/AN7/OESPP  10

RE3/MCLR/VPP  1

U1

PIC18F4550

7 8 9 F

4 5 6 E

1 2 3 D

0 A B C

10k 10k 10k 10k

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 62/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

62

Buy SmartDraw!- purchased copies print this

document without a watermark .

Visit www.smartdraw.com or call 1-800-768-3729.

 

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 63/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

63

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

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 64/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

64

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

instrucción:

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 <P18F4550.INC> ;definiciones de variables especificas del procesador

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

;Bits de configuración;CONFIG FOSC = INTOSC_XT ;Oscilador INT usado por el uC , XT usado por el USBCONFIG BOR = OFF ;BROWNOUT RESET DESHABILITADOCONFIG PWRT = ON ;PWR UP Timer habilitadoCONFIG WDT = OFF ;Temporizador vigía apagadoCONFIG MCLRE=OFF ;Reset apagadoCONFIG PBADEN=OFFCONFIG LVP = OFF

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

RA0/AN02

  RA1/AN13

  RA2/AN2/VREF-/CVREF4

  RA3/AN3/VREF+5

  RA4/T0CKI/C1OUT/RCV6

  RA5/AN4/SS/LVDIN/C2OUT7

  RA6/OSC2/CLKO14

  OSC1/CLKI13

RB0/AN12/INT0/FLT0/SDI/SDA33

  RB1/AN10/INT1/SCK/SCL34

  RB2/AN8/INT2/VMO35

  RB3/AN9/CCP2/VPO36

  RB4/AN11/KBI0/CSSPP37

  RB5/KBI1/PGM38

  RB6/KBI2/PGC39

  RB7/KBI3/PGD40

RC0/T1OSO/T1CKI  15

RC1/T1OSI/CCP2/UOE  16

RC2/CCP1/P1A  17

VUSB18

RC4/D-/VM  23

RC5/D+/VP  24

RC6/TX/CK  25

RC7/RX/DT/SDO  26

RD0/SPP0  19

RD1/SPP1  20

RD2/SPP2  21

RD3/SPP3  22

RD4/SPP4  27

RD5/SPP5/P1B  28

RD6/SPP6/P1C  29

RD7/SPP7/P1D  30

RE0/AN5/CK1SPP  8

RE1/AN6/CK2SPP  9

RE2/AN7/OESPP  10

RE3/MCLR/VPP  1

U1

PIC18F4550

7 8 9 F

4 5 6 E

1 2 3 D

0 A B C

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 65/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

65

;Definiciones de variablesCBLOCK 0x000 ;ejemplo de definición de variables en RAM de accesoflags ;banderasiun ;índice de unidadescuni ;código de unidadesidec ;índice de decenas

cdec ;código de decenasconttecla ;registro de código de tecla pulsadaENDC ;fin del bloque de constantes

;******************************************************************************;Reset vector

ORG 0x0000bra inicioorg 0x08 ;vector de alta prioridadbra RST0 ;ramifica servicio interrupción T0org 0x18 ;vector de baja prioridadbra RSINTorg 0x0020

inicio bsf OSCCON,IRCF2,0bsf OSCCON,IRCF1,0bcf OSCCON,IRCF0,0 ;Oscilador interno a 4 MHz

movlw 0x0Fmovwf ADCON1,0 ;Puertos Digitales

clrf PORTB,0movlw 0xf0movwf TRISB,0 ;Configurar puerto para tecladoclrf PORTD,0clrf TRISD,0 ;Puerto D Configurado como salidamovlw 0xfcmovwf TRISC,0 ;RC0 y RC1 como salidas

clrf PORTC,0movlw 0x95movwf T0CON,0 ;timer 16 bits prescalerX64

movlw 0XE8movwf INTCON,0 ;interrupciones TMR0,RBIE prioridad alta y bajabsf RCON,IPEN,0 ;habilitamos prioridades de interrupciónmovlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzmovlw 0x04

movwf INTCON2,0 ; int RBI en baja prioridad y activamos R pull upclrf TBLPTRL,0

movlw 0x02movwf TBLPTRH,0clrf TBLPTRU,0 ;tblptr=0x000200clrf iun,0clrf idec,0 ;iniciamos en 0

lee movff iun,TBLPTRLtblrd * ;leemovff TABLAT,cuni ;cuni tiene codigo 7 segmentosmovff idec,TBLPTRL

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 66/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

66

tblrd * ;leemovff TABLAT,cdec ;cdec tiene codigo 7 segmentos

loop movlw 0x01movwf PORTC,0 ; encendemos display unidadesmovff cuni,PORTDcall retardo

movlw 0x02movwf PORTC,0 ;encendemos display decenasmovff cdec,PORTDcall retardobtfss flags,0,0bra loopbcf flags,0,0incf iun,F,0movf iun,W,0xorlw 0x0abtfss STATUS,Z,0bra leeclrf iun,0

incf idec,F,0movf idec,W,0xorlw 0x0abtfss STATUS,Z,0bra leeclrf idec,0goto lee

;******************************************************************************retardo setf cont,0nada nop

decfsz cont,F,0bra nada

return;******************************************************************************RST0 bcf INTCON,TMR0IF,0 ;apagamos bandera timer0

movlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzbsf flags,0,0retfie

;********************************************************************RSINT call KBD ;Llamamos rutina del teclado

bcf INTCON,RBIF,0 ;LIMPIAMOS BANDERAmovwf tecla,0 ;guardamos tecla pulsada

movlw 0x0acpfslt tecla,0 ;salta si es que se pulso una tecla entre 0 y 9bra limpiamovff tecla,idec ;carga número de tecla pulsada en decenasmovff idec,TBLPTRLtblrd * ;leemovff TABLAT,cdec ;cdec tiene código 7 segmentosbra exit

limpia movlw 0x0c

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 67/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

67

cpfseq tecla,0bra exitclrf iun,0 ;limpiamos índice de unidadesclrf idec,0 ;limpiamos índice de decenasmovff idec,TBLPTRLtblrd * ;lee

movff TABLAT,cdec ;cdec tiene código 7 segmentosmovff iun,TBLPTRLtblrd * ;leemovff TABLAT,cuni ;cdec tiene código 7 segmentos

exit clrf PORTB,0retfie

;********************************************************************KBD movlw 0x0e

movwf PORTB,0 ;activamos primer renglónbtfss PORTB,4,0retlw 0x00 ;tecla 0btfss PORTB,5,0retlw 0x0A ;tecla a

btfss PORTB,6,0retlw 0x0B ;tecla b

btfss PORTB,7,0retlw 0x0C ;tecla c

movlw 0x0Dmovwf PORTB,0 ;activamos segundo renglónbtfss PORTB,4,0retlw 0x01 ;tecla 1btfss PORTB,5,0retlw 0x02 ;tecla 2btfss PORTB,6,0

retlw 0x03 ;tecla 3

btfss PORTB,7,0retlw 0x0D ;tecla dmovlw 0x0Bmovwf PORTB,0 ;activamos tercer renglónbtfss PORTB,4,0retlw 0x04 ;tecla 4btfss PORTB,5,0retlw 0x05 ;tecla 5btfss PORTB,6,0

retlw 0x06 ;tecla 6btfss PORTB,7,0

retlw 0x0Emovlw 0x07

movwf PORTB,0 ;activamos primer renglónbtfss PORTB,4,0retlw 0x07 ;tecla 7btfss PORTB,5,0retlw 0x08 ;tecla 8btfss PORTB,6,0

retlw 0x09 ;tecla 9btfss PORTB,7,0

retlw 0x0F ;tecla F

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 68/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

68

retlw 0xFF ;ninguna tecla pulsadaorg 0x200 ;DB directiva que Define ByteDB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x80,0x98END

Programa 9, Contador de 0-99, con programación de decenas y borrado con un teclado matricial

Ejercicios 9.1Modifique la rutina RSINT, para que al pulsar la tecla A, el conteo sea ascendente y al pulsar latecla 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

En este ejemplo el timer 2 se utiliza para encender cada display por un intervalo de tiempo de 0.1

ms, el timer 0 se usa para que se incremente el conteo cada 500 ms. Hemos usado nuestroregistro de propósito general (GPR) flags, con la función de sus dígitos como sigue:

flags

Tiempo0.1 ms

Conteoascendente

Tiempo500 ms

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 69/74

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 70/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

70

movlw 0xf8movwf TRISC,0 ;RC0, RC1 y RC2 como salidasclrf PORTC,0movlw 0x95movwf T0CON,0 ;timer 16 bits prescalerX64movlw 0XE8

movwf INTCON,0 ;interrupciones TMR0,RBIE prioridad alta y bajamovlw 0x06movwf T2CON,0 ;Prescalerx16 y TIMER2 ON, POSTCALER 1 movlw 0x06movwf PR2,0 ;valor para registro de periodo de .1mSbsf IPR1,TMR2IP,0 ;timer2 alta prioridadbsf PIE1,TMR2IE,0 ;habilitamos interrupciónbsf RCON,IPEN,0 ;habilitamos prioridades de interrupciónmovlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzmovlw 0x04

movwf INTCON2,0 ;habilitamos int RBI en baja prioridad y R pull upclrf TBLPTRL,0movlw 0x02movwf TBLPTRH,0clrf TBLPTRU,0 ;tblptr=0x000200clrf iun,0clrf idec,0 ;iniciamos en 0

lee movff iun,TBLPTRLtblrd * ;leemovff TABLAT,cuni ;cuni tiene código 7 segmentosmovff idec,TBLPTRLtblrd * ;lee

movff TABLAT,cdec ;cdec tiene codigo 7 segmentosloop clrf PORTB,0movlw 0x01movwf PORTC,0 ; encendemos display unidadesmovff cuni,PORTD

espera1 btfss flags,2,0goto espera1bcf flags,2,0movlw 0x02movwf PORTC,0 ;encendemos display decenasmovff cdec,PORTD

espera2 btfss flags,2,0goto espera2

bcf flags,2,0btfss flags,0,0bra loopbcf flags,0,0incf iun,F,0movf iun,W,0xorlw 0x0abtfss STATUS,Z,0bra lee

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 71/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

71

clrf iun,0incf idec,F,0movf idec,W,0xorlw 0x0abtfss STATUS,Z,0bra lee

clrf idec,0goto lee

;******************************************************************************RSIHP btfss INTCON,TMR0IF,0

bra RST2bcf INTCON,TMR0IF,0 ;apagamos bandera timer0movlw 0xE1movwf TMR0H,0movlw 0x7cmovwf TMR0L,0 ;valor de precarga para 500ms a 4MHzbsf flags,0,0retfie

RST2 bcf PIR1,TMR2IF,0

bsf flags,2 ;monitor de .1 msbtg PORTC,2retfie

;********************************************************************RSINT call KBD ;Llamamos rutina del teclado

bcf INTCON,RBIF,0 ;LIMPIAMOS BANDERAmovwf tecla,0 ;guardamos tecla pulsadamovlw 0x0acpfslt tecla,0bra opcionmovff tecla,idecmovff idec,TBLPTRL

tblrd * ;leemovff TABLAT,cdec ;cdec tiene código 7 segmentosbra exit

opcion movlw 0x0acpfseq tecla,0bra descbsf flags,1,0 ;bandera ascendentebra exit

desc movlw 0x0dcpfseq tecla,0bra clrbcf flags,1,0 ;bandera descendentebra exit

clr movlw 0x0ccpfseq tecla,0bra exitclrf iun,0 ;limpiamos índice de unidadesclrf idec,0 ;limpiamos índice de decenasmovff idec,TBLPTRLtblrd * ;leemovff TABLAT,cdec ;cdec tiene código 7 segmentosmovff iun,TBLPTRL

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 72/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

72

tblrd * ;leemovff TABLAT,cuni ;cdec tiene código 7 segmentos

exit clrf PORTB,0retfie

;********************************************************************;Regresa el numero de la tecla pulsada: 0 a F, si no se pulsó una

;tecla, regresa FFKBD movlw 0x0E

movwf PORTB,0 ;activamos primer renglónbtfss PORTB,4,0retlw 0x00 ;tecla 0btfss PORTB,5,0retlw 0x0A ;tecla abtfss PORTB,6,0retlw 0x0B ;tecla bbtfss PORTB,7,0retlw 0x0C ;tecla cmovlw 0x0Dmovwf PORTB,0 ;activamos segundo renglón

btfss PORTB,4,0retlw 0x01 ;tecla 1btfss PORTB,5,0retlw 0x02 ;tecla 2btfss PORTB,6,0retlw 0x03 ;tecla 3btfss PORTB,7,0retlw 0x0D ;tecla dmovlw 0x0Bmovwf PORTB,0 ;activamos tercer renglónbtfss PORTB,4,0retlw 0x04 ;tecla 4

btfss PORTB,5,0retlw 0x05 ;tecla 5btfss PORTB,6,0retlw 0x06 ;tecla 6btfss PORTB,7,0retlw 0x0Emovlw 0x07movwf PORTB,0 ;activamos cuarto renglonbtfss PORTB,4,0retlw 0x07 ;tecla 7btfss PORTB,5,0retlw 0x08 ;tecla 8btfss PORTB,6,0

retlw 0x09 ;tecla 9btfss PORTB,7,0retlw 0x0F ;tecla Fretlw 0xFF ;ninguna tecla pulsadaorg 0x200 ;DB es una directiva que Define Byte

;en este caso define los códigos de siete segmentosDB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xB8,0x80,0x98END 

Programa 10: Usamos el timer 2, para encender cada digito por 500 ms

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 73/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

73

Ejercicios 10.1

Modifique el programa 10, calculando el valor de timer 0, para encender cada dígito por unsegundoModifique el programa 10, usando el bit de bandera flags,1 para que dependiendo de su valor,se genere el conteo ascendente o descendente

8/11/2019 Microcontroladores Pic 18f4550 Ejemplos Prácticos_vi_2

http://slidepdf.com/reader/full/microcontroladores-pic-18f4550-ejemplos-practicosvi2 74/74

Microcontroladores PIC 18F4550 Ejemplos prácticos Ricardo Álvarez González

Bibliografía

PIC 18F2455/2550/4455/4550 Data sheet, DS39632D2007 Microchip Technology Inc.