1AUTOR: César ÁlvarezDISEÑO INSTRUCCIONAL:Marilú Sánchez y César Álvarez
Escuela de Ingeniería Eléctrica
Contenido Instrucciones
2
INSTRUCCIONES
• Botón para avanzar..........................• Botón para retroceder......................• Botón para ir al contenido
principal..• Botón para retornar..........................• Para ir a un tema del contenido,
hacer clic en título del tema.............• Para salir, presione la tecla..............
INICIO
Tema..
Esc
3
Equipo necesarioRequerimientos mínimos
• Computador personal Pentium III 128MB RAM, disco duro con 100MB libres, unidad de CD, monitor igual o mayor de 14” de alta resolución y puertos: serial (RS-232) o paralelo (LPT), y conexión a Internet (no indispensable, pero recomendable).
• Sistema operativo Windows 98SE o superior.• Software MS Office 2000 o superior (Power Point). En cuanto a componentes, podrás tratar de ubicar lo
siguiente:• Microcontroladores: PIC16C54JW o PIC16F54, PIC16F84A
y un PIC16F877 o algún otro PIC16F87X.• Leds rojos, verdes y amarillos, resistencias, indicadores
numéricos 7 segmentos, pulsadores, interruptores y lo que te interese utilizar para tus aplicaciones.
• Un programador PICSTART Plus. Si no lo consigues o te parece muy costoso, podrás construir tu propio programador, para ello deberás consultar el anexo 7 después de ver el tema 2.
Además será necesario• Mucha voluntad y dedicar suficiente tiempo para
aprender sobre los microcontroladores PIC.
4
INSTALACIONES
• Instalar el siguiente software, si no lo ha hecho con anterioridad,
para la consulta de artículos en Internet y tener tu sistema de
desarrollo:
– Acrobat Reader
– Win Zip
– MPLAB IDE
Para ello podrá hacer Clic en el programa que deseas instalar o
deberás ingresar a los sitios webs de cada uno de ellos,
buscar el software de instalación, bajarlo gratis, y luego hacer
las instalaciones.
Te recordamos que para hacer las instalaciones, deberás salir del
módulo instruccional al pulsar la tecla y
luego llamar a cada uno de los programas instaladores por
separado, en el orden sugerido.
Esc
CONTENIDO
INTRODUCCIÓN. TEMA I. GENERALIDADES DE LOS MICROCONTROLADORES PIC TEMA 2. PROGRAMACIÓN DEL PIC16C54. TEMA 3.
MEMORIA DE PROGRAMA, REGISTROS, PUERTOS Y TEMPORIZADORES
TEMA 4. CARACTERÍSTICAS ESPECIALES DEL HARDWARE TEMA 5. OTROS MICROCONTROLADORES DE LA GAMABÁSICA TEMA 6. MICROCONTROLADOR PIC 16F84A TEMA 7. MICROCONTROLADORES DE LA SERIE PIC16F87X CONCLUSIÓN ANEXOS
6
• El objetivo primordial que nos movió a diseñar este material, es el de que adquieras, a través de su estudio teórico y práctico, las habilidades y destrezas necesarias para conocer los microcontroladores y diseñar circuitos basados en algunos de ellos.
• Se explicará y describirá qué son los microcontroladores, cuáles son sus aplicaciones y funciones, y se describirán ejemplos de circuitos, para aprender a manejarlos.
• Para ello hemos decidido trabajar con los microcontroladores PIC de Microchip, debido a que, en la actualidad, son los que tienen mayor popularidad, tanto en las universidades del continente americano y europeo, como en las diversas industrias que desarrollan proyectos en electrónica.
• Este material se ha dividido en siete temas, con los cuales irás aprendiendo poco a poco acerca de los microcontroladores PIC, desde el más básico, el PIC16C54, luego podrás observar las diferencias con otros miembros de la serie PIC16C5X, si así lo deseas. Después podrás conocer al microcontrolador PIC16F84A que es uno de los más básicos la gama media, y finalmente se hablará sobre los microcontroladores de la serie PIC16F87X, los cuales son los más utilizados de la gama media. INICIO
7
• La metodología empleada consiste en explicar de manera secuencial, desde el microcontrolador más básico, hasta que poco a poco vayas conociendo aquellos componentes con mayor complejidad. Por otro lado, se incluirá desde un principio, nociones básicas del software que te ambientará en el desarrollo de tus programas: El MPLAB, el cual irás empleando, a medida que vayas elaborando tus programas, instrucciones del lenguaje ensamblador, métodos para simular tus programas, elaboración de interfaces electrónicas para la adaptación de señales y el uso del programador, para que puedas hacer el montaje de los circuitos que has desarrollado.
• Este módulo instruccional te ofrece además, algunos anexos, los cuales podrás consultar para profundizar tus conocimientos acerca de los microcontroladores y el software que emplearás, definiciones comúnmente utilizadas en este campo, y sugerencias para la elaboración de circuitos electrónicos con microcontroladores PIC.
INICIO
8
DIVISIÓN DE LOS TEMAS
Los temas están divididos de la siguiente manera:
• Tema 1: Se muestra en forma general el concepto de microcontroladores, cómo han surgido, cuáles son los fabricantes más destacados y se resume las características principales de los microcontroladores PIC. Luego se presenta la arquitectura del microcontrolador PIC16C54 y se describe cada una de las instrucciones de los microcontroladores de la gama básica.
• Tema 2: Se explica detalladamente los pasos para programar cualquier microcontrolador. Se dan ejemplos y se enseñan los primeros pasos para trabajar con el lenguaje Ensamblador y el ambiente de trabajo MPLAB, el cual es una herramienta muy poderosa para trabajar con cualquiera de los microcontroladores PIC que vayas a utilizar en el futuro. Aquí aprenderás: a editar un programa, a ensamblarlo en un código para la memoria del microcontrolador, a simularlo para observar si la lógica del programa está correcta y grabarlo en un microcontrolador. Para ello utilizaremos unos ejemplos sencillos.
• Tema 3: En este aparte, se describe cómo está organizada la memoria de programa y de datos del microcontrolador PIC16C54. Esto te ayudará a comprender cómo programar por medio de los registros de funciones especiales que son los que controlan el programa y algunos circuitos específicos dentro del microcontrolador. Con ello podrás hacer programas un poco más complejos. INICIO
9
TEMAS RELACIONADOS CON MICROCONTROLADORES MÁS AVANZADOS
• Tema 4: Aquí verás las características de los circuitos internos o hardware del microcontrolador PIC16C54. En este tema podrás informarte acerca de la inicialización del circuito, los temporizadores internos, el modo de reposo o bajo consumo y los tipos de osciladores que puedes utilizar.
• Tema 5: En este aparte aprenderás acerca de otros microcontroladores de la gama básica y las diferencias con el PIC16C54.
• Tema 6: En este tema te iniciarás con la familia de los microcontroladores de la gama media. Aquí verás las diferencias entre el PIC16C54 y el PIC16F84A; encontrarás que estas diferencias consisten en algunas mejoras que te permitirán desarrollar circuitos más versátiles. En el estudio del PIC16F84A te darás cuenta que todo lo que aprendiste en los cuatro primeros temas, lo aplicarás a este tema.
• Tema 7: En este último tema encontrarás información sobre los microcontroladores de la gama media de la serie PIC16F87X, los cuales tienen mucha aplicación en la industria. Estos microcontroladores tienen gran capacidad de funciones, ya que pueden leer señales analógicas, hacer control de potencia por modulación de ancho de pulsos, comunicación serial y otras posibilidades más.
• Anexos: En los anexos encontrarás una guía de referencia para consulta: El glosario, el manejo detallado de instrucciones, las directivas del lenguaje ensamblador, algunas notas de aplicación, etc.
INICIO
10
UNOS CONSEJOS MÁS ANTES DE EMPEZAR
• Para el mejor aprendizaje de este módulo es conveniente que leas y practiques con este material de manera ordenada, para que tú, como interesado en esta área, conozcas los microcontroladores, su tecnología electrónica avanzada y su aplicación en la actualidad.
• Es importante que cuentes, al menos con una computadora compatible con las PCs que trabaje en ambiente Windows, e instales el MPLAB IDE, el cual lo puedes bajar gratuitamente en la dirección microchip.com. Si tienes la posibilidad de obtener el PICSTART PLUS, y conseguir algunos microcontroladores, tales como el PIC16F54, el PIC16F84 y el PIC16F877 sería mucho más provechoso para ti todavía, ya que podrás contar con la posibilidad de hacer tus propios montajes.
• Si no tienes la posibilidad de obtener el PICSTART PLUS, en el anexo 7 encontrarás un circuito y un software que podrás utilizar para grabar tu microcontrolador PIC.
• Finalmente, te aconsejamos que para empezar a estudiar con microcontroladores, será necesario que tengas conocimientos de electrónica analógica y electrónica digital: Circuitos con resistencias, condensadores, diodos, leds, transistores, tiristores, amplificadores operacionales, interfaces, Álgebra de Boole, sistemas numéricos binarios y hexadecimales, aritmética de números binarios, compuertas lógicas, bloques funcionales combinacionales, contadores, etc.
• Mientras mayores conocimientos tengas de electrónica, circuitos digitales, instrumentación y otros campos relacionados o no con la electrónica, mejor provecho podrás sacar a estos microcontroladores para tus planes en el futuro.
INICIO
11
Te recomendamos que leas el material detalladamente,
porque así comprenderás mejor el contenido.
Ten presente, que gracias a tu empeño el aprendizaje
dependerá de ti, ya que eres el único responsable directo de
él.
Debes cumplir con las actividades y ejercicios que aparecen
en el material.
Cuando tengas dudas, pide a tu profesor asesor de la
materia una entrevista.
Si eres claro al responder la auto-prueba que aparece en el
material, sabrás cuál ha sido tu avance.
INICIO
1.1.- Contexto histórico de los microcontroladores
1.2.- Definiciones de microcontroladores
1.3.- Funciones de los microcontroladores
1.4.- Aplicaciones de los microcontroladores
1.5.- Algunos fabricantes de microcontroladores
1.6.- Consideraciones que debes tener antes de seleccionar un microcontrolador
1.7.- Familia de los microcontroladores PIC
1.8.- Principales características del PIC16C54
1.9.- Descripción de los microcontroladores PIC16C54
1.10.- Arquitectura del microcontrolador PIC16C54
1.11.- Instrucciones del PIC16C54 y los PIC de la gama básica
Generalidades de los Microcontroladores PIC
INICIO
Objetivos Terminales:
• Describir cómo han surgido los microcontroladores a través del tiempo.
• Enumerar algunas aplicacio-nes de los microcontrolado-res.
• Explicar la arquitectura de los microcontroladores de la serie PIC16C54.
• Clasificar las instrucciones de los microcontroladores de la gama básica.
INICIO
14
Al comenzar la década de 1970, los microcontroladores hicieron su
aparición, y han encontrado una gran aceptación en los diseños de
aplicaciones electrónicas que requieren un nivel básico de automatización
y programación. Hoy en día su uso se extiende en casi cualquier elemento
que contenga componentes electrónicos: equipos de sonido, televisores,
hornos de microondas, aires acondicionados, sistemas de alarmas,
automóviles, periféricos de computadoras, teléfonos inalámbricos y
celulares, calculadoras, agendas electrónicas, traductores de idiomas,
controles inalámbricos, relojes despertadores, equipos de control
industrial, equipos médicos, medidores digitales, y así puede nombrarse
un sinnúmero de aparatos los cuales tienen al microcontrolador como
circuito de control para el funcionamiento de éstos.
La razón de tal aceptación, se debe a que un microcontrolador, es
básicamente una computadora en miniatura, y como tal, puede desarrollar
un gran número de funciones según los programas que tenga grabado en
su memoria.
Hoy en día existen microcontroladores con un potencial superior al de las
primeras computadoras personales, lo cual indica las posibilidades que se
pueden desarrollar con ellos, y todo esto en un pequeño circuito
integrado.
1.1.- Contexto histórico de los Microcontroladores
INICIO
15
Durante la década de 1960, algunas compañías fabricantes de dispositivos
electrónicos, entre ellas Intel, Texas Instruments y Motorala, decidieron
integrar componentes electrónicos para el desarrollo de circuitos
integrados. Intel marcó una pauta al desarrollar un procesador de 4 bits, el
Intel 4004, después fabricó microprocesadores de 8 bits: el 8008 en 1972, el
8080 en 1973 y el 8085 en 1975. Por su parte en 1971 Texas Instruments
anunció el desarrollo de su primer microcontrolador: El TMS1000, cuya
patente fue dada al ingeniero Gary Boone y a la Texas Instruments. Este
componente fue utilizado inicialmente para la construcción de calculadoras
de 8 dígitos que realizaban las cuatro operaciones básicas: suma, resta,
multiplicación y división.
INICIO
El primer microcontrolador
Al TMS1000, en un principio, se le llamó “computador
en un chip”, constaba de las siguientes partes:
oscilador, unidad central de procesamiento con un juego
de 32 instrucciones, 64 x 4bits de RAM, 1024 bytes de
ROM y puertos de entrada salida.
En los últimos veinte años del siglo XX, muchos
fabricantes se han dedicado a la tarea de desarrollar
una gran diversidad de microcontroladores de 4, 8, 16 y
32 bits, siendo los de 8 y 16 bits, los más populares.
16
En cuanto a los microcontroladores PIC, en 1965, la empresa “General
Instruments” creó una división de microelectrónica, “GI Microelectronics
Division”, que comenzó fabricando memorias. A principios de los años
1970 diseñó el microprocesador de 16 bits CP1600, razonablemente
bueno, pero que no manejaba eficazmente las entradas y salidas. Para
solventar este problema, en 1975 diseñó un circuito integrado destinado
a controlar los puertos: el PIC (Peripheral Interface Controller). Se
trataba de un controlador rápido pero limitado y con pocas
instrucciones, pues iba a trabajar en combinación con el
microprocesador CP1600.
La arquitectura del PIC, que se comercializó en 1975, era
sustancialmente la misma que la de los actuales modelos PIC16C5X. En
aquel momento se fabricaba con tecnología NMOS y el producto sólo se
ofrecía con memoria de lectura solamente (ROM) y con un pequeño pero
robusto conjunto de instrucciones.
La década de los años 1980 no fue buena para GI, que tuvo que
reestructurar sus negocios, concentrando sus actividades en los
semiconductores de potencia.
INICIO
Surgimiento de los PICs
17
La “GI Microelectronics División” se convirtió en una empresa
subsidiaria, llamada “GI Microelectronics Inc.” Finalmente, en 1985, la
empresa fue vendida a un grupo de inversores de capital de riesgo, los
cuales, tras analizar la situación, rebautizaron a la empresa con el
nombre de “Arizona Microchip Technology”, y orientaron su negocio a los
PICs, las memorias EPROMs paralelo y las EEPROMs serie. Se comenzó
rediseñando los PICs, que pasaron a fabricarse con tecnología CMOS,
surgiendo la familia de gama básica PIC16C5X, considerada como la
"clásica".
El éxito de los microcontroladores PIC ha sido vertiginoso. Mientras en
1990 ocupaba la vigésima posición en ventas de microcontroladores de 8
bits, en 1999 subió a la segunda posición, y desde 2002 se mantiene en
la primera. En febrero de 2004 llegaron a totalizar las tres mil millones
de unidades vendidas y la tendencia es seguir aumentando esta
cantidad. INICIO
18
Las razones del éxito de los PIC se basa quizás en muchas cosas:
simplicidad en el uso, conjunto de pocas instrucciones con alta eficiencia
de código, rapidez en la ejecución de programas, compatibilidad de
instrucciones desde la gama básica a la alta, gran variedad de modelos,
multiplicidad de interfaces, soporte de software, librería de aplicaciones
prácticas. En pocas palabras, son elementos de muy alta versatilidad
que pueden utilizarse en un sinnúmero de diferentes diseños
electrónicos y, cuando se aprende a manejar uno de ellos, conociendo su
arquitectura y su repertorio de instrucciones, es muy fácil emplear otro
modelo.
Los fabricantes de los PICs, ofrecen una gama de diversos tipos de
microcontroladores, que pueden ser usados en muchas aplicaciones;
desde un sencillo reloj digital, hasta el control de velocidad de motores
de inducción y circuitos de control que utilizan lógica difusa en
aplicaciones de robótica y procesos industriales.
INICIO
19
La diversidad de modelos, abarca los microcontroladores básicos, los cuales
tienen: Unidad central de procesamiento, memoria de programa (PROM,
EPROM o FLASH), memoria de datos (RAM), puertos y temporizadores. Hay
otros, más avanzados, que ofrecen, además de los elementos mencionados
anteriormente, algunos de los circuitos que se nombran a continuación:
Manejador de interrupciones, convertidores A/D, convertidores D/A,
memoria EEPROM y FLASH (que pueden mantener sus datos después de
quitar la alimentación, sin añadir un equipo externo), moduladores de ancho
de pulso, sensores de temperatura, comparadores, interfaces seriales,
entre otros.
INICIO
20
Es un computador completo dedicado, aunque con limitadas
prestaciones, que está contenido en un circuito integrado y se destina
a gobernar una sola tarea.
Son circuitos integrados programables que constan básicamente de
una unidad central de procesamiento (CPU), una memoria de
programa, una memoria de datos, puertos de entrada y salida,
temporizador y circuitos de inicialización y reloj.
1.2.- Definiciones de Microcontrolador
INICIO
21
Los microcontroladores tienen funciones específicas, que se realizan de
acuerdo al programa grabado y a las conexiones de las líneas de entrada
y salida. Estas líneas se conectan a interfaces que manejan elementos
de lectura y de acción final en un equipo o sistema a controlar.
1.3.- Funciones de los Microcontroladores
INICIO
AUTOR: César ÁlvarezDISEÑO INSTRUCCIONAL:M. Sánchez y C. Álvarez
100
0
20
40
60
80
Microcontrolador
Interfaces
22
Los microcontroladores tienen una
gran cantidad de aplicaciones;
prácticamente cualquier aparato
electrónico que se fabrica en la
actualidad utiliza al menos un
microcontrolador.
Las aplicaciones de éstos pueden
desglosarse en áreas de: computación,
comunicaciones, industria, automoción
y electrodomésticos.
1.4.- Aplicaciones de los Microcontroladores
INICIO
1.5.- Algunos Fabricantes de Microcontroladores
Fabricante Microcontroladores Capacidad de MemoriaIntel MCS51, 151, 251 8KB - 16KB ROM, 256B - 1KB RAM
Siemens C540U (8051) 4KB - 8KB ROM, 256B RAMDallas, Atmel 8051-52 2KB - 16KB ROM, 256B - 16KB RAM
Motorola 68HC0568HC0868HC11
0 - 16KB ROM, 176B – 512B RAM16KB - 32KB ROM, 512B - 1KB RAM4KB - 32KB ROM, 256B - 2KB RAM
Texas Instruments TMS370 0KB - 64KB ROM, 128B - 2KB RAMNEC mPD7890xxx
mPD780xxx
2KB - 24KB ROM, 128B – 512B RAM8KB - 60KB ROM, 256B - 2KB RAM
Toshiba TLCS-870TLCS-90
4KB - 60KB ROM, 256B - 2KB RAM0 - 60KB ROM, 0 - 2KB RAM
Hitachi H8/300 8KB- 60KB ROM, 256B - 2KB RAM
SGS-THOMSON(ST-Micro)
ST-6ST-7ST-9
1KB- 8KB ROM, 64B – 320B RAM4KB- 60KB ROM, 256B - 2KB RAM0KB-128KB ROM, 512B - 4KB RAM
NationalSemiconductor
COP820, 840, 880C, 912COP884xx, 888xx
1KB- 4KB ROM, 64B – 128B RAM4KB-32KB ROM, 128B –1088B RAM
Zilog Z8 0,5KB - 32KB ROM, 61B – 237B RAMMicrochip 16Cxx
18Fxx512X12 - 4KX14 ROM, 25B –192B RAM2K - 32Kx16 ROM, 232B – 2KB RAM
INICIO
Las compañías de mayor producción de microcontroladores de 8bits 1990 - 2002
INICIO
25
Principalmente se debe tomar en cuenta, en qué aplicación quieres que éste opere. Si deseas seleccionar algún fabricante específico, para desarrollar muchas prototipos, entonces se deberá escoger aquél que ofrezca ciertas ventajas tanto en las características del hardware como del software.
• Suficiente capacidad de memoria para los programas y datos.
• Líneas de entrada y salida suficientes para la aplicación a desarrollar.
• Que presente rapidez en la ejecución de los programas.
• Sencillez en el montaje.• Sistema de soporte para la
grabación.• Diversidad de productos.• Disponibilidad en el mercado y bajo
costo.
• Debe seleccionarse a aquellos que ofrezcan facilidad de programación y códigos de programación eficientes.
• Programas de simulación de fácil uso.
• Soporte de lenguajes de programación de alto nivel.
• Compatibilidad con los sistemas operativos más comunes.
• Disponibilidad de programas y librerías de aplicaciones.
• Disponibilidad de herramientas de desarrollo.
1.6.- Consideraciones a tomar antes de seleccionar un Microcontrolador:
INICIO
En este módulo instruccional hemos seleccionado a los microcontroladores PIC de Microchip, ya que ofrecen una gran variedad de productos para muchas aplicaciones.
26
En principio, para la selección de un microcontrolador en una aplicación específica, deberás tomar en cuenta muchos factores para que esta escogencia resulte en una relación efectiva de bajo costo. Entre estos factores están: tensión de alimentación, tipo de fuente a utilizar, capacidad de memoria de programa y de datos, tipos de señales a manejar, cantidad de líneas de entrada y salida, tipos de memorias para programa y datos, capacidad de interrupción, tamaño y otros factores más.
Podría darse el caso, de tomar en cuenta muchos de estos factores y luego encontrar otro microcontrolador que se adapte mejor a lo que tú deseabas. En este sentido, no hay mayor problema, ya que el programa que elaboraste en el primer microcontrolador, podrá ejecutarse en otro, si éste es de la misma gama o de una gama superior.
Por otro lado podríamos dar una idea inicial de aquellos microcontroladores que ofrece Microchip, según la serie a la cual pertenece. En las páginas siguientes de este módulo instruccional se mencionan las características principales de estos microcontroladores. Para un análisis más detallado, deberás consultar con las especificaciones que presenta el manual del fabricante.
Finalmente, en este módulo encontrarás cómo trabajar con los microcontroladores más utilizados de Microchip. Obteniendo un buen aprendizaje, podrás seleccionar el microcontrolador más adecuado para tu aplicación específica. INICIO
27
La familia de los microcontroladores de 8 bits de Microchip, es muy variada, y prácticamente hay un tipo de microcontrolador para cada aplicación. La siguiente tabla resume las características principales de cada familia hasta comienzos de 2004. La serie dsPIC, que aparece al final de la tabla, es una familia de procesadores señales de 16bits que entró en producción recientemente.
PIC Memoria de Características Principales Series Programa
PIC 12C5XX 0,5 - 1K x 12 Opción EEPROM, Velocidad: 1 a 2 MIPS PIC 12C6XX 2K x 14 8 Terminales, Oscilador incluido, A/D C
PIC 12F6XX 0,5 - 1K x 14 A/D C, EEPROM, FLASH, Oscila. interno
Velocidad: 5 MIPS, 8 Terminales.PIC 14C000 4K x 14 A/D C 16 Bits, DA/C, Lector de temperat. 28 terminales, manejo de Interrupciones
PIC 16C5X 0,5K -2K x 12 Velocidad: 5 MIPS, Disponibilidad en 14, 18 y 28 terminales
PIC 16CXXX 0,5K -8K x 14 Comparador Digital y analógico, Interrpc. Modulador de ancho de pulso (PWM), Interfaz serial (USART), A/D C , Manejador LCD, variedad de tamaños.
1.7.- Familia de los Microcontroladores PIC
INICIO
28 INICIO
PIC 17C4X/7XX 2K - 8K x 16 Multiplicador de 8x8 bits, Comparador Digital, PWM, Opciones en: OTP, EPROM y FLASH - ROM, USART, I2C,Velocidad: 8,5 MIPS, manejo de Interrupciones,
Disponibilidad de hasta 44 Terminales.
Conjunto de 58 instrucciones de 16 bits.
PIC 16FXXX 0,5K - 8K x 14 A/D C de 10bits, PWM, USART, EEPROM,
FLASH o ROM, Manejo de Interrupciones,
I2C, Comparador Digital, Vel: 5 MIPS,Disponibles en 18, 28,40 y 44
Terminales.
PIC18CXX /18FXX 0 - 65K x 16 Similar a la serie PIC 17C7XX. Conjunto de 77 instrucciones de 16 bits velocidad de 10 MIPS. Compilación en C eficienterfPIC12C5XX 1K x 12 Similar a la serie PIC 12XXX, pero incluye rfPIC12F6XX 1K x 14 un transmisor de radio frecuencia UHF. dsPIC30FXXXX 4K - 48K x 24 A/D C de 12bits, PWM, EEPROM, FLASH(Procesadores de Manejo de Interrupciones, USART, I2C,señales de 16bis) CAN, Comparador Digital, Vel: 30 MIPS,
18 a 80 Terminales. Conjunto de 84 instruc.
29
Facilita la labor de depuración de programas.
Permite el desarrollo de aplicaciones en poco tiempo.
Todas las instrucciones son sencillas y presentan un código eficiente,
lo que permite reducir un programa a la mitad con respecto a otros
microcontroladores de 8 bits.
Circuito de inicialización incluido.
Presenta cuatro configuraciones programables para el oscilador.
Modo “Reposo” (sleep) para el ahorro de energía.
Temporizador “perro guardián” (Watchdog), para prevenir que un
programa se “cuelgue”.
Protección de programas.
1.8.- Principales características del PIC16C54
INICIO
30
El PIC16C54 es un microcontrolador de 8 bits de tecnología CMOS.
Este microcontrolador tiene una arquitectura RISC con un conjunto de
apenas 33 instrucciones de una sola palabra (12 bits), lo cual reduce
esfuerzo en memorizar los códigos de instrucción.
1.9.- Descripción del Microcontrolador PIC16C54
INICIO
31
El microcontrolador PIC16C54 utiliza una arquitectura Harvard, lo cual significa que la memoria de programa y la de datos está separada en dos buses diferentes. Esto mejora la velocidad en el acceso a instrucciones y datos, y permite utilizar palabras de una longitud para las instrucciones y otra para los datos.
El PIC16C54 utiliza códigos de instrucción de 12 bits, esto permite combinar instrucciones de un ciclo donde se incluye el acceso directo a la memoria de datos; además, se cuenta con una estructura de entubamiento en la cual, mientras se ejecuta una instrucción, se prepara la siguiente, es decir, significa un ahorro en el tiempo de ejecución de cada programa, en donde se necesita apenas cuatro períodos del oscilador por cada ciclo de ejecución de una instrucción. Por ejemplo: para un oscilador con una frecuencia igual a 20 MHz, el período del oscilador es de 50nSeg; esto significa que el ciclo de una instrucción tarda 4 X 50nSeg, es decir, 200 nSeg. Las instrucciones en donde se ejecutan saltos demoran dos ciclos, ya que la instrucción que se prepara es la de la siguiente línea del programa, y al realizar el salto se va a una instrucción que está ubicada en otra línea del programa.
A continuación se presenta la arquitectura del microcontrolador PIC 16C54:
1.10.- Arquitectura del Microcontrolador PIC16C54
INICIO
32
Diagrama de Bloques del Microcontrolador PIC16C54
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOS
(SRAM)25 BYTES
F
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
5-7
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
33
Al examinar la figura de la arquitectura, se puede ver que arriba a la izquierda se encuentra la memoria de programa EPROM o ROM; su capacidad es de 512 palabras de 12 bits, y allí está el programa desde la posición 000h.
A la derecha de la memoria de programa, se encuentra el registro PC o Contador de Programa, del cual salen los valores de las direcciones que se leerán en la memoria de programa. El programa del microcontrolador comienza en la dirección 0 que corresponde a la siguiente instrucción después de la inicialización.
Los datos que salen de la memoria de programa, que corresponden a los códigos de instrucción, que son las líneas del programa codificadas en binario, van al Registro de Instrucciones. En este registro se almacena temporalmente el código de la instrucción a ejecutar, la cual es interpretada por el Decodificador de Instrucciones.
El Decodificador de Instrucciones traduce el código o valor binario que está en la memoria del programa a una instrucción que se va a ejecutar. Esta instrucción puede tomar dos caminos: Si la instrucción implica un salto de dirección, entonces se colocará en el registro PC (vía directa) un nuevo valor, el cual corresponde a la nueva dirección del programa; si la instrucción consiste en hacer una operación con uno de los Registros de Propósitos Generales (véase el bloque en la parte derecha de la figura) o con el registro W, se tomarán unas líneas del Registro de Instrucciones para especificar la dirección de acceso al registro, y las otras líneas para colocar el código de la operación que se realizará en la Unidad de Lógica y Aritmética.
INICIO
34
En la Unidad de Lógica y Aritmética se puede hacer cálculos aritméticos, tales como la suma y la resta binarias, u operaciones lógicas, tales como: “and”, “or”, “exor”, complemento y desplazamientos. Las operaciones se pueden ejecutar con una o dos variables de 8 bits, que pueden estar en el registro de trabajo W o en un registro indicado por medio de la dirección F, que señala una posición de la memoria de datos o Registro de Propósitos Generales, un Puerto, un registro TRIS o el temporizador TMR0, como puede observarse en la parte inferior de la arquitectura PIC 16C54.
En la parte superior derecha de la figura, se puede observar el bloque que se refiere a la Palabra de Configuración, la cual define si se va a inhabilitar el Temporizador WDT (perro guardián), si se va a hacer la Protección de Códigos del programa de la memoria y cuál palabra de configuración se va a emplear para seleccionar el tipo de oscilador en el bloque Oscilador, Tiempo y Control.
El registro Option, el cual se escribe por medio del registro W, es el encargado de colocar la palabra de configuración en el Escalamiento de WDT y TMR0. Este escalamiento fijará la programación del divisor de frecuencia en uno de los temporizadores.
Finalmente, en la parte derecha del registro PC, se encuentran los registros Pila1 y Pila2, que se utilizan para almacenar la dirección del contador de programa en el momento en el que se va a ejecutar una subrutina.
INICIO
35
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
36
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
37
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
38
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
39
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
40
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
41
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
42
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
FRAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
43
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
44
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
45
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
46
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
47
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
48
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
49
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
50
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
51
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
52
ENTRADATOCKI
RA3 RA0
TRIS 6TRISB PUERTO B
8 8
8
RB7 RB0
9-11EPROM-ROM 512x12 PC
9-11
REGISTRO DEINSTRUCCIONES
DECODIFICADOR DE
INSTRUCCIONES
PILA 1PILA 2
DIRECCIÓN DIRECTA
TIEMPO DEESPERA DEL
WDT
ESCALAMIENTODE TMRO Y WDT
TEMPORIZADORWDT
PALABRA DE CONFIGURACIÓN
INHABILITA
PROTECCIÓNDE CODIGOS
TIPO DEOSCILAD.
OSCILADOR,TIEMPO YCONTROL
OSC1OSC2 MCLH
REG. OPTIONSLEEP
OPTIONREGISTROS DEPROPOSITOSGENERALES
(SRAM)25 BYTES
RAM DEDIRECCIÓN DIRECTA
W
UNIDADLÓGICA Y
ARITMÉTICA
TMRO
BUS DE DATOS
TRIS 5 TRISA PUERTO A
4 4
4
STATUS
9
8
12
12
8
2
8
6
5
8
8
INICIO
53
Diagrama de conexiones del Microcontrolador PIC16C54
A continuación, se presenta la interconexión del los PIC 16C54
Cada conexión tiene su propia función específica. Haz clic en el terminal deseado para encontrar la función correspondiente en el glosario.
INICIO
PIC
16C54
54
1.11.- Instrucciones del PIC16C54 y los PIC de la gama básica
Un programa que se graba en un microcontrolador, es el encargado de ejecutar una función de aplicación para el circuito a utilizar.
Para hacer un programa, es necesario conocer las instrucciones que ofrece el lenguaje con el que se va a trabajar y manejar el software necesario para comprobar que el programa haga lo que se desea.
Queremos hacerte entender que la labor de programación no es difícil. Hacer un programa es algo así como hablar con alguien para que ejecute una o más acciones. Para realizar esto, tú necesitas conocer una gran cantidad de palabras del idioma con el que te puedas expresar, y la persona deberá entender el mismo lenguaje que tú empleas. Mientras más palabras conozcas, podrás manejar con mayor eficiencia tu lenguaje y tu modo de expresión. Sin embargo, además de conocer las palabras, necesitarás manejar también las reglas de expresión o sintaxis. Por ejemplo cuando le dices a alguien: “Quiero que me traigas 1Kg de azúcar”. En ese caso estás expresando un deseo a ese alguien, que consiste en que esa persona salga de la casa, camine hacia el abasto, entre al lugar, busque el azúcar en los estantes, tome un paquete de 1 Kg de azúcar, vaya a la caja a pagarlo, saque el dinero, tome el vuelto, salga del abasto, regrese a la casa y finalmente te entregue el paquete de azúcar.
Fíjate que en la expresión utilizada inicialmente, que es bastante corta, implica una serie de pasos que se deben ejecutar para llegar a la acción final, y estos pasos podrán ser tan específicos como a nosotros se nos pudiera ocurrir. La expresión “Quiero que me traigas 1Kg de azúcar” podría interpretarse en un software, como una instrucción de un lenguaje de alto nivel o una subrutina de un lenguaje de bajo nivel, y los pasos que implican realizar la acción, pueden verse como los códigos del lenguaje del microcontrolador.
INICIO
55
Cuando se quiere dar órdenes a un microcontrolador, se deberá emplear un lenguaje de programación que él lo entienda directamente. Sabemos que un microcontrolador entenderá códigos compuestos por “1” y “0”, que nosotros podríamos aprenderlo, pero invertiríamos mucho tiempo y sería muy fácil equivocarnos al emplear este lenguaje. Sin embargo, como vamos a contar con una computadora, podremos utilizar un lenguaje un poco más fácil de entender, y la computadora hará las traducciones necesarias al lenguaje del microcontrolador. Este proceso se llama “ensamblaje” o “compilación”.
El lenguaje que se utiliza comúnmente para trabajar con microcontroladores es el lenguaje Ensamblador, que es un lenguaje de bajo nivel. Existen otros lenguajes, de alto nivel, que también se pueden utilizar para programar estos componentes, tales como los lenguajes “C” y “Basic”. El lenguaje Ensamblador es básicamente un lenguaje de máquina, es decir, que las instrucciones que emplea se codifican directamente para ser grabadas en la memoria del programa del microcontrolador.
Para facilitar un poco el entendimiento del lenguaje Ensamblador de un microcontrolador o un microprocesador, las instrucciones se presentan con códigos, que representan abreviaciones, y a continuación, los operadores que van a realizar la instrucción. El lenguaje ensamblador permite colocar, de manera opcional, algunos comentarios, que se reconocerán por ser expresiones que están después de “;” en una línea del programa. Otra opción que nos permite el ensamblador, consiste en colocar etiquetas o encabezados, que indican posiciones en la memoria de programa escritas en palabras de uso común.
INICIO
56
Para escribir un programa en un microcontrolador, sea cual fuere el lenguaje que vamos a emplear, debemos utilizar un software que nos facilite la labor de la comunicación.
En este curso se empleará el software MPLAB, ya que es la plataforma de programación gratuita que ofrece Microchip para todos los microcontroladores que fabrica, y permite realizar todos los pasos necesarios en la programación del microcontrolador, sin necesidad de llamar a otro software.
Para escribir un programa en un microcontrolador, debes comenzar por conocer las instrucciones o el lenguaje que vas a emplear. En este curso comenzaremos por utilizar el lenguaje Ensamblador, ya que éste nos permitirá conocer con bastante profundidad el modo de funcionamiento del microcontrolador. Más adelante podrás emplear un lenguaje de alto nivel; sin embargo queremos que sepas que si puedes hacer un buen programa en el lenguaje ensamblador, éste se ejecutará con mayor rapidez y empleará menos cantidad de memoria que al hacer uso de un compilador de lenguaje de alto nivel.
Después de conocer las instrucciones del lenguaje de programación, podrás utilizar el MPLAB o algún otro software para editar el programa, es decir, escribirlo como si fuera una carta, pero de manera ordenada; luego deberás ejecutar el comando que ensambla o compila el programa; después, si no hubo error de sintaxis, podrás hacer la simulación del programa; y si no hay errores de lógica, podrás finalmente grabarlo en la memoria del microcontrolador para que, de esta manera, puedas probar si funciona correctamente en un circuito. En cada fase debe hacerse las correcciones necesarias según los resultados que se van obteniendo.
INICIO
57
Fíjate en lo siguiente:
El microcontrolador PIC16C54 utiliza palabras de 12 bits divididas en un código de operación que especifica el tipo de instrucción y los registros en donde se va a ejecutar la operación y en qué lugar se va a colocar el resultado. Esto te permite utilizar instrucciones que en el microcontrolador se codifican en una sola palabra. Eso te garantiza que tu programa en el microcontrolador ocupa igual número de instrucciones como las que empleaste en el lenguaje ensamblador. Esto no ocurre con la mayoría de los otros microcontroladores.
El número de instrucciones que presenta el PIC16C54, es de apenas 33. El formato de estas instrucciones, permite tratar a la memoria de datos, como si fueran registros de trabajo, lo cual implica un ahorro tanto en la codificación de la instrucción, como en el tiempo de ejecución en la misma.
Las instrucciones pueden hacer operaciones entre registros de un byte, para lo cual se utiliza el apuntador de direcciones de registros f y el registro de trabajo W; pueden ejecutarse entre operaciones con valores constantes y el registro de trabajo W; también pueden ejecutarse operaciones orientadas a bits, para esto se utiliza la variable b, que indica la posición del bit en el registro apuntado por f.
En las instrucciones orientadas a bytes, f es un valor que representa la dirección de un registro de asignación y d representa el destino, que puede ser el mismo registro apuntado por f o el registro W. Los registros señalados por f, son uno de los 32 lugares de memoria a los que puede acceder la instrucción, por medio de los 5 bits del código especificado para ello.
INICIO
58
En resumen
• W Registro de trabajo.• F Dirección del registro de la RAM.• d Destino, a donde va el resultado (W o F).• b Dirección del bit a utilizar en el registro de
dirección F.• K Valor numérico constante.
INICIO
59
La designación del destino, que se hace por medio de d, indicará si el resultado se llevará al registro de trabajo W, cuando d=W, o al registro de dirección f, cuando d=f. Recuerda que las operaciones lógicas y aritméticas se hacen en código binario, y por lo general se utiliza el código hexadecimal en los valores asignados en el lenguaje ensamblador.
Por ejemplo, la instrucción:ADDWF f,dIndicará sumar (ADD) el registro de trabajo W, con el registro de dirección f. El resultado se colocará en W si d=W, o en f si d=f. Si nocolocas ningún destino, el ensambladorguardará el resultado en el registro de dirección f y te dará un mensaje deadvertencia.
ADDWF f,dIndicará sumar (ADD) el registro de trabajo W, con el registro de dirección f. El resultado se colocará en W si d=W, o en f si d=f. Si nocolocas ningún destino, el ensambladorguardará el resultado en el registro de dirección f y te dará un mensaje deadvertencia.
Operaciones entre W y f
Digamos que la instrucción:
ADDWF 12,W ;Suma en binario el contenido del registro ;W con el contenido del registro 12 y el ;resultado se guardará en el registro W
INICIO
Código de la instrucción
Registro
Destino
60
GOTO K ; (Ejemplo GOTO LAZO)
Indica que el programa saltará a la posición indicada por el valor K, donde K puede ser un número de 9 bits en este caso, o una palabra clave o etiqueta que indica una posición en la memoria de programa.
Para las instrucciones orientadas a bits, b representa la posición de un bit ubicado en el registro f. Por ejemplo, la instrucción:
BCF f,b
Indicará una instrucción (Bit Clear) que borrará el bit en la posición b (0 a 7) del registro de dirección f (0 a 31).
IORLW K
Donde K es un valor constante de 8 bits, indicará que se realizará la función (Inclusive) OR entre los bits del Literal K y los del registro W. El resultado irá a W.Para instrucciones con literales y control, K representa una constante de 8 ó 9 bits, o un valor literal indicado por medio de una palabra clave o etiqueta. Un ejemplo:
IORLW B’10010110’ ; 10010110 es un número ; en binario
Operaciones con literales y bits
INICIO
61
INSTRUCCIONES DEL LENGUAJE ENSAMBLADOR
Clasificación de las instrucciones del microcontrolador PIC16C54:
– Instrucciones de transferencia de datos, las cuales mueven datos de un registro a otro (los registros involucrados son el W y un registro apuntado por f), o un dato constante en la memoria del programa al registro W.
– Instrucciones aritméticas, las cuales ejecutan operaciones aritméticas binarias entre W y un registro de dirección f.
– Instrucciones lógicas, las cuales ejecutan operaciones lógicas bit a bit entre W y un registro de dirección f, o entre W y un valor constante.
– Instrucciones de borrado, las cuales colocan el valor cero a un registro.– Instrucciones de rotación, las cuales permiten rodar el contenido de un registro
de dirección f, un bit hacia la derecha o hacia la izquierda. Estas instrucciones se utilizan para efectuar multiplicaciones y divisiones aritméticas binarias. Entre estas instrucciones también existe una que permite intercambiar grupos de 4 bits, para el manejo de dígitos.
– Instrucciones de manejo de bits, las cuales pueden colocar en “0” o en “1” un bit determinado de un registro de dirección f.
– Instrucciones de saltos, las cuales permiten la posibilidad de cambiar la dirección de ejecución de un programa de manera incondicional o según la evaluación de un bit o si un registro es igual a cero.
– Instrucciones de control, las cuales permiten hacer algunas configuraciones de hardware en el microcontrolador.
INICIO
62
INSTRUCCIONES DE TRANSFERENCIA DE DATOS
MOVF f,d ; Mueve el contenido de f hacia el destino d (W o f)
MOVLW K ; Se asigna a W el valor K
MOVWF f ; Mueve el contenido de W hacia el registro f
INSTRUCCIONES ARITMÉTICAS
ADDWF f,d ; Suma W con f (y guarda el resultado en d: W o f)
SUBWF f,d ; Resta f menos W
DECF f,d ; Decremento en 1 el contenido de f
INCF f,d ; Incremento en 1 en contenido de f
Instrucciones de transferencia de datos y aritméticas
INICIO
63
INSTRUCCIONES LÓGICAS
ANDLW K ; And de los bits de W con los de K y guarda en W
ANDWF f,d ; And de los bits del registro W con los de f
COMF f,d ; Complemento en uno el contenido del registro f
IORLW K ; Or de los bits de W con los de K y guarda en W
IORWF f,d ; Or de los bits del registro W con los de f
XORLW K ; Exor de los bits de W con los de K y guarda en W
XORWF f,d ; Exor de los bits del registro W con los de fINSTRUCCIONES DE BORRADOCLRF f ; Borra el contenido del registro f
CLRW W ; Borra el contenido del registro W
Instrucciones lógicas y de borrado
INICIO
64
INSTRUCCIONES DE ROTACIÓN
RLF f,d ; Rotación de f hacia la izquierda a través de Carry
RRF f,d ; Rotación de f hacia la derecha a través de Carry
SWAPF f,d ; Intercambia nibles (grupo de 4 bits) en el registro f
INSTRUCCIONES DE MANEJO DE BITS
BCF f,b ; Pone en 0 bit b del registro f
BSF f,b ; Pone en 1 bit b del registro f
Instrucciones de rotación y manejo de bits
INICIO
65
INSTRUCCIONES DE SALTO (Si se ejecuta el salto, la instrucción demora dos ciclos)
BTFSC f,b ; Si el bit b de f es cero, salta una instrucción
BTFSS f,b ; Si el bit b de f es uno, salta una instrucción
CALL K ; Llama a subrutina en la dirección K
GOTO K ; El programa va a la dirección K
DECFSZ f,d ; Decremento de f y si es cero, salta una instrucción
INCFSZ f,d ; Incremento de f y si es cero, salta una instrucción
RETLW K ; Retorno de subrutina, W toma el valor de K
Instrucciones de Salto
INICIO
66
INSTRUCCIONES DE CONTROL
CLRWDT ; Borra temporizador “Perro guardián” (WDT)
SLEEP ; Inhabilita el procesador, (Reposo)
NOP ; No ejecuta operación
OPTION ; El contenido de W se carga al registro OPTION, ; que se utiliza para la configuración de los ; temporizadores y el escalamiento.
TRIS f ; Contenido de W va a TRIS (programación puertos), ; f representa uno de los puertos A o B (5 ó 6). ; Un 1 en el bit de programación, configura la línea ; correspondiente al puerto como entrada; un 0 lo ; configura como línea de salida.
Instrucciones de Control
Nota: Si deseas ver el significado en detalle de todas las instrucciones de los microcontroladores PIC de las gamas básica y media, puedes consultar el anexo 2.
INICIO
67
ACTIVIDADES A REALIZAR
En este aparte, se pide que tú desarrolles las actividades que a
continuación se presentan, para comprender mejor el tema siguiente.
1.- Define con tus propias palabras los siguientes términos:
a.- ¿Qué es un Microcontrolador?
b.- ¿Cómo funciona un microcontrolador?
c.- ¿En cuáles aplicaciones se podría utilizar un microcontrolador?
d.- Describe las principales características de los microcontroladores
PIC.
2.- Dibuja la arquitectura de un microcontrolador PIC16C54.
3.- Haz una clasificación de las instrucciones de los microcontroladores
PIC de la gama básica y relaciona el significado de cada código de
operación con la instrucción que ejecuta con sus operadores.
4.- Explica qué es lenguaje ensamblador y haz un ejemplo de un programa
que lea dos datos ubicados en la memoria de datos y los sume.
INICIO
2.1.- Programación de Microcontroladores 2.2.- Pasos para programar un Microcontrolador 2.3.- Representación del circuito. 2.4.- Edición del Programa con el MPLAB 2.5.- Ensamblaje del Programa 2.6.- Simulación 2.7.- Grabación del Microcontrolador 2.8.- Reduciendo el programa 2.9.- Advertencia para un vehículo 2.10.- Control de leds por medio de pulsadores 2.11.- Ejemplo de un programa para sumar2.12.- Resta de dos números
TEMA 2Programación del PIC 16C54
Contenido
INICIO
69
Objetivos Terminales:
• Explicar los pasos necesarios para programar un microcontrolador para una aplicación específica.
• Desarrollar programas básicos para aplicaciones específicas, que puedan ejecutarse por un microcontrolador PIC16C54.
TEMA II: Programación del microcontrolador PIC16C54
INICIO
70
La programación es el modo de organización de las instrucciones que va a realizar el microcontrolador para cumplir una o más funciones específicas.
Para programar los microcontroladores es importante que utilices el lenguaje ensamblador, ya que es el más parecido al lenguaje del procesador, y esto te ayudará a entender mejor cómo trabaja cada instrucción. Existe también la posibilidad de utilizar los programas en lenguaje “C”, “Basic” o algún otro de alto nivel.
Queremos convencerte que esta labor no es difícil, especialmente si ya has programado en cualquier otro lenguaje, recuerda que programar es parecido a hablar o escribir en el idioma que empleas usualmente para comunicarte.
Para hacer un diseño en el que se utilicen circuitos integrados programables, será necesario emplear herramientas que ayuden a la puesta a punto del Hardware y del Software.
2.1.- Programación de Microcontroladores
INICIO
71
Debes tener en cuenta que, además de los compiladores o intérpretes de los lenguajes usados, es muy interesante disponer de simuladores de programas, que consisten en un software que ejecuta las instrucciones que representan, en una computadora, el comportamiento interno del procesador y el estado de las líneas de entrada y salida.
Recuerda que es indispensable el grabador, encargado de escribir el programa en la memoria del microcontrolador. Existen grabadores muy completos capaces de trabajar con muchos modelos de diferentes familias. Otra herramienta de desarrollo, es el emulador en circuito, que consiste en un complejo dispositivo físico que, controlada por un programador desde tu computadora personal, dispone de un conector con cables que van hacia la computadora y que tiene los mismos terminales que el microcontrolador que trata de imitar. El conector se introduce en la base donde irá el microcontrolador, con el programa definitivo en la memoria de la computadora. El emulador en circuito (ICE) hace funcionar el sistema como si hubiese un microcontrolador real, pero con la ventaja de poder observar todo el funcionamiento en la computadora. Un inconveniente de los emuladores, es su elevado precio que los aleja de los usuarios personales INICIO
72
Después de seleccionar un microcontrolador para una aplicación
específica, para programarlo será necesario:
Después de cada fase, se
deberá corregir los
errores hasta que todo
funcione bien.
Ensamblar el programa
Simular el programa
Grabar el programa en el
microcontrolador
Hacer pruebas en el circuito
Editar el programa
Representar el circuito
2.2.- Pasos para programar un Microcontrolador:
INICIO
73
2.3.- Representación del circuito. Un ejemplo
Para representar el circuito, se colocará el siguiente ejemplo:
Se desea hacer un circuito con cuatro interruptores de entrada y ocho indicadores a la salida, de los cuales cuatro serán de color rojo, y cuatro serán de color verde. Cada interruptor estará asociado a dos indicadores de diferente color, y al accionarlo, deberá cambiar el encendido, de uno a otro. Cuando un interruptor esté abierto, deberá encender el indicador de color rojo asociado a éste. En el caso de estar cerrado encenderá el indicador de color verde.
Solución:
De acuerdo al problema planteado, deberás contestar estas preguntas:
¿Cuántas líneas de entrada y salida serán necesarias para desarrollar el circuito?
¿Cuáles serán conectadas como entradas y cuáles se conectarán como salidas?
¿Qué tipo de interfaz se colocará para las entradas?
¿Qué tipo de interfaz se colocará para las salidas?
¿El PIC 16C54 será apropiado para este circuito?
Antes de pasar a la siguiente página, recomendamos que tú respondas estas preguntas. Si lo deseas, podrás consultar con las páginas anteriores de este módulo instruccional.
INICIO
74
Respuestas
De acuerdo a las preguntas planteadas en la página anterior, las respuesta serán las siguientes:
Se necesitarán doce líneas de entrada y salida, de las cuales cuatro serán entradas, que corresponderán a los interruptores y ocho serán salidas, que corresponderán a los indicadores o leds.
Las interfaces se harán de una forma sencilla. Se tomará en cuenta que en los puertos de entrada, si las líneas no están conectadas, la lectura será indefinida (0 ó 1), entonces se conectará una resistencia de 4,7KΩ al voltaje de alimentación para cada entrada, y en el mismo punto, se colocará un interruptor a la referencia negativa o tierra, de manera que si el interruptor está abierto, se leerá un “1”, y si está cerrado, se leerá un “0”. En cuanto a las interfaces de salida, se deberá considerar si los microcontroladores pueden manejar directamente a los leds. Teniendo en cuenta que los puertos de los microcontroladores pueden entregar o absorber hasta 25mA a 25ºC con una alimentación de 5V, y para un led basta una corriente de 5 a 10mA para encenderlo, entonces la interfaz se hará por medio de una resistencia de 300Ω en serie con cada led. La ecuación para calcular la resistencia de cada Led, será: Rled=(Vdd-Vled)/Iled
Donde: Vdd = 5V (O la tensión de alimentación que utilizas para el circuito)
Vled 2V (Depende del color del led: Rojo -> 1,6V; Verde -> 2,4V)
Iled 10mA (Depende del brillo deseado y la corriente máxima del led)
INICIO
75
Selección del Microcontrolador
Según lo establecido anteriormente, el microcontrolador PIC16C54 es adecuado para esta aplicación, ya que tiene doce líneas disponibles para los puertos de entrada-salida. Si en el mercado local no consigues el PIC16C54, podrías utilizar el PIC16F54, el PIC16F84A o algún otro microcontrolador PIC de 18 terminales que pertenezca a la gama básica o media, ya que dispone de doce terminales de entrada-salida, y los programas que se elaboran con los PIC16C54, funcionan con los otros de la gama básica o media; las conexiones externas entre ellos también son compatibles. A continuación se presenta el circuito a utilizar, en donde se escogerá al puerto A como entrada (4 bits) y el puerto B como salida (8 bits).
VddPIC
16C54
INICIO
76
2.4.- Edición del Programacon el MPLAB
Alt
Después de representar el circuito, y de asignar cada línea de entrada y salida a los puertos del microcontrolador, se procederá a editar el programa. Debes tener claro con qué elemento se conecta cada línea de los puertos del microcontrolador.
Existen muchos editores para programar los microcontroladores PIC. Sin embargo, se utilizará el MPLAB, debido a que esta herramienta de programación, ofrece la posibilidad de: Editar, compilar, simular y grabar.
Para entrar al entorno MPLAB, se deberá acceder al software que ofrece gratuitamente la compañía Microchip (www.microchip.com), o al comprar uno de los sistemas de desarrollo para estos microcontroladores. Después de instalar el software, se abrirá el programa MPLAB.
Si deseas alternar entre este módulo instruccional y el MPLAB, puedes hacerlo al presionar simultáneamente las teclas: y (Tab)
La primera vez que se abre este programa, aparecerá la siguiente pantalla: Llamada:
Microchip
MPLAB IDE
INICIO
77
Familiarización con el MPLAB
Después de abrir el MPLAB, ya podrás comenzar a editar tu programa en el espacio donde dice “Untiteled Work space”. Si quieres trabajar con mayor comodidad, podrás ampliar esta ventana.
Los recursos que se ofrecen con este software son bastante variados, es por esto que en este aparte se mostrará sólo algunos de los comandos necesarios para iniciar una edición de un programa.
Algo que deberás tomar en cuenta, es el ser consistente con el dispositivo que vas a usar. Para ello, deberás seleccionar el microcontrolador en este ambiente de trabajo; en este caso el PIC16C54 (o el microcontrolador que encontraste en el mercado local). Para esto se irá a la barra de menú, y se escogerá en “Configure” y luego “Select Device...” Si el MPLAB se está utilizando por primera vez, en pantalla aparecerá la siguiente ventana:
INICIO
78
Opciones del MPLAB
Si vas a utilizar el PIC 16C54, se deberá cambiar a:
Nótese el cambio al PIC16C54. Luego se seleccionará en “OK”. Después de hacer esto, el MPLAB estará listo para trabajar con el PIC16C54. Si se va a trabajar con otro microcontrolador, éste se seleccionará en “Device”. Al regresar al ambiente de trabajo, en la parte inferior aparecerá el tipo de microcontrolador que se va a emplear, el cual deberá ser igual al que se utilizará en el circuito, o de lo contrario podrá haber problemas en el momento de ensamblar, cuando se realice la simulación o al grabar el programa.
1
2
INICIO
79
Es importante documentar bien el programa
En un programa ensamblador, es muy importante hacer una buena documentación; en lo posible, hay que colocar los comentarios que sean necesarios para comprender bien qué es lo que se está haciendo. Los comentarios se reconocerán por el símbolo “;” tal como se puede ver en la figura de la página siguiente, en donde se hace una breve descripción del programa que se va a realizar.
Te recalcamos la importancia de colocar los comentarios, ya que los que comienzan a trabajar en esto, consideran innecesario colocarlos. Sin embargo, un tiempo después, a la hora de analizar el programa no recuerdan qué fue lo que hicieron, y prácticamente tienen que comenzar desde cero para tratar de entender el programa.
Antes de comenzar a editar el programa, te recomendamos que revises, en el tema 1, en la parte de las Instrucciones del Lenguaje Ensamblador, lo que hacen las siguientes instrucciones, o sino accede a las explicaciones de ellas, por medio del hipervínculo asociado:
MOVLW K GOTO K
TRIS f BSF f,b
CLRW BCF f,b
BTFSS f,b BTFSC f,b
En la página siguiente encontrarás la primera parte de la edición del programa. Fíjate bien en los comentarios escritos.
INICIO
80
Comentarios
INICIO
81
Los archivos “INCLUDE”
En el ejemplo de la página anterior, se puede observar una parte inicial compuesta de comentarios, los cuales se colocan para describir el programa. Después se observa la directiva INCLUDE “P16C5X.INC”. Esta directiva, básicamente se utiliza para incluir un archivo que asigna valores numéricos a cada uno de los registros de funciones especiales y los bits del registro STATUS. Esto nos facilitará la elaboración del programa, es decir, que para emplear, por ejemplo, una instrucción MOVF 5,0; el programa entenderá que el contenido del puerto A, que está en la dirección 5, pasará al registro W. Sin embargo, será mucho más fácil comprender la instrucción, si se escribiera de esta manera: MOVF PORTA, W´. Esta última instrucción se aceptará, si previamente se definió “PORTA” y ”W”, y esto se puede hacer con la directiva INCLUDE.
Si deseas más información acerca de las directivas del lenguaje ensamblador, puedes consultar el anexo 3 de este módulo instruccional.
En el archivo P16C5X.INC, está la asignación de los registros de funciones especiales (tal como PORTA y W) de los microcontroladores de la gama básica. En el caso de no utilizar este archivo, tendríamos que asignar nosotros mismos los registros en el programa. Es decir, que antes de comenzar el programa deberíamos escribir lo siguiente:PCL EQU H'0002'
STATUS EQU H'0003'FSR EQU H'0004'PORTA EQU H'0005'PORTB EQU H'0006'
W EQU H'0000'F EQU H'0001‘INDF EQU H'0000'TMR0 EQU H'0001'
INICIO
82
Las Directivas y las Bases Numéricas
El hecho de que un valor aparezca como H’0000’, sólo significa que se está escribiendo en hexadecimal. Por otro lado, EQU significa igual, o sea que al escribir la directiva: W EQU H’0000’, significa que en cualquier instrucción que se escriba W, al codificarse el texto, se colocará un valor 0 en el programa ensamblador. Una directiva, es algo así como una instrucción que no se codifica en el programa, pero que realiza una operación de control en el ensamblador. En otras palabras, la directiva EQU asigna la igualdad entre una etiqueta y un número, para que en el momento de hacer la codificación del programa, en donde aparezca la etiqueta, se asignará el número, ya que en el microcontrolador sólo pueden entrar valores numéricos binarios. El ensamblador permite también que utilices varios tipos de sistemas numéricos, por ejemplo, el número 11 en decimal se puede representar de las siguientes maneras:
Base Numérica RepresentaciónHexadecimal 0B / 0BH / H’0B’ / 0x0BBinaria B’1011’Decimal D’11’
Observa que a los números hexadecimales que empiezan por una letra, le debes colocar un 0 a la izquierda.A continuación seguimos con la elaboración del programa en la siguiente página, donde podrás observar, cómo se separa el programa en columnas, por medio de la tecla de tabulación, de manera que la columna 1 se utiliza para etiquetas, la segunda para la instrucción, la tercera para los operadores y la cuarta para los comentarios:
INICIO
83
Comentarios
Etiquetas
Instrucciones
Operadores
Colu. 1 Colu. 2 Colu. 3 Columna 4
División por columnas
INICIO
84
Comienzo del Programa
Puede verse en la pantalla anterior, la directiva ORG (Origen) poco después de la directiva INCLUDE. Élla asigna la dirección en la cual va a comenzar una sección del programa. En este caso, el programa comienza en la dirección 0 de la memoria EPROM del microcontrolador.
Al comenzar el programa, se debe preparar los puertos y registros que se van a utilizar. En este caso, se asignará la programación de los puertos, tal como se puede observar a partir de la etiqueta “PREPAR” en el programa de la página anterior.
En la sección siguiente se presenta el comienzo el programa. Se verá cómo se realiza el análisis para un “grupo” de una sola entrada del puerto A y dos salidas del puerto B.
INICIO
85
Trata de completar lo que debe ir en las secciones: GRUPO1, GRUPO2 y GRUPO3. Es importante que cada etiqueta se escriba en una sola palabra, sin espacio, es decir que sería incorrecto colocar, por ejemplo, GRUPO 1.
Recuerda que aquí se utiliza la instrucción BTFSS PORTA,0; la cual indica que se va a hacer un test del bit 0 del puerto A, o sea RA0, (Bit Test de F, Salta si es 1). Si el resultado es 0, ejecutará la instrucción siguiente GOTO VERD0ON, la cual hará que el programa salte a la posición VERD0ON, en donde se apagará el led rojo (BCF PORTB,0; que hará RB0=0) y encenderá el led verde (BSF PORTB,1; que hará RB1=1). Si al hacer el test de RA0, éste es igual a 1, el interruptor estará abierto; en el programa se indica que debe saltar una línea, por lo tanto se pasará a la línea ROJO0ON, en donde se apagará el led verde (BCF PORTB,1), y se encenderá el rojo.
Las direcciones que se le asignan a las etiquetas, se hacen de manera automática. Por ejemplo, la etiqueta PREPAR, que está ubicada después de los comentarios iniciales, tendrá asignada la dirección 0, ya que se ubica inmediatamente después de la directiva ORG 0.
La etiqueta INICIO, se ubicará entonces en la dirección 4, ya que está cuatro instrucciones por debajo de PREPAR. Recuerda que ni los comentarios ni las directivas cuentan como instrucciones del programa en el microcontrolador.
En la página siguiente, podrás observar la parte final de este programa, que sirve como una de las soluciones para activar los cuatro interruptores que manejan los ocho leds.
Si no estuvo claro el comienzo, lee esto detenidamente
INICIO
86
Continuación del programa
INICIO
87
2.5.- Ensamblaje del Programa
Después de editar el programa, o en los momentos que creas convenientes, deberás guardar tu programa con un nombre luego un punto (.) y después “asm”: “nombre.asm”. Te recomendamos que abras un subdirectorio en el directorio “Mis documentos” y guardes allí los programas elaborados. Cuando hayas editado todo, procederás a ensamblar el programa. El programa que se presentó anteriormente, no presenta errores de codificación. Sin embargo, tú puedes intentar editarlo, y luego podrás proceder a ensamblarlo o codificarlo. Al ensamblar un programa, se generará un archivo objeto codificado en binario o hexadecimal, el cual será el mismo que se grabará en la memoria del microcontrolador; este archivo tendrá como nombre, el mismo del programa editado, pero con extensión .hex. Por ejemplo si al programa anterior le colocaste por nombre conmutador.asm, el archivo generado al compilar se llamará conmutador.hex. Por otro lado se generará un archivo de listado con todos los símbolos utilizados (conmutador.lst) y un archivo con los errores (conmutador.err),
INICIO
88
Ensamblando el archivo editado
Para ensamblar un archivo, deberás seleccionar en Project y luego Quickbuilt nombre.asm:
INICIO
89
Resultados del ensamblaje
Si al final aparece la frase: “BUILD SUSCCEEDED”, significa Que ha sido exitosa la compilación.
INICIO
90
Archivos con errores
Si algo sale mal, es decir, si hay errores al introducir las instrucciones, entonces habrá que buscar el problema y solucionarlo. Si en tu programa no ha habido errores, te felicitamos, porque lo copiaste muy bien. En caso contrario, no te preocupes, porque te ayudaremos a encontrarlos. Primero volveremos a ensamblar el programa con errores intencionales. Fíjate en esta sección del programa:
INICIO
91
Listado de errores
Al tratar de ensamblar nuevamente, nos encontraremos con un error, tal como lo muestra la siguiente figura:
INICIO
Al aparecer la frase “BUILD FAILED”, indica que no se pudo realizar el ensambalje, debido a que hay uno o más errores en el programa.
92
Encontrando los errores
Una forma sencilla de encontrar en cuál línea se cometió el error, se logra al hacer doble clic en el error que queremos ver. Es posible que un error aparezca varias veces, ya que éste puede reflejarse en las líneas del programa que estén asociadas con ese problema. Hagamos doble clic en donde aparece el error y caemos en el programa fuente, en el cual podemos ver la indicación que señala la línea donde se produjo ese error.
El error consiste en que no se ha definido previamente “PUERTOA”. Para solucionar esto, se deberá colocar la variable PORTA, definida en P16C5X.INC o escribir previamente la directiva PUERTOA EQU 5, para indicar que el puerto A corresponde a la dirección 5 de la memoria de registros o RAM.
Si hay más errores en el programa, el procedimiento para hallarlos es el mismo. En la edición de errores, se hace doble clic en la línea correspondiente, donde aparece el error, luego te indicará dónde se produjo éste en el programa fuente.
Trata de interpretar los mensajes dados, y corrige los errores en el programa. INICIO
Indicación de la línea con error
93
2.6.- Simulación
Debemos asegurarnos que la herramienta MPLAB SIM esté activada, para poder ejecutar la simulación.
Después de ensamblar el programa, en la “memoria ROM” del MPLAB se encuentra el programa ensamblado. Podremos ver las memorias y registros en la simulación al seleccionar en “View”, según veremos en la página siguiente. Las ventanas las podemos colocar según nuestra conveniencia.
¿Corregiste todo? Es importante que lo hagas, y que te fijes bien, para dar el próximo paso.
El próximo paso, consiste en la simulación del programa. Esto significa que se debe revisar si hay errores de lógica, los cuales no se detectan al ensamblar el archivo.
Una vez ensamblado el programa, procederemos a hacer la simulación. Para ello, vamos a asegurarnos que el MPLAB tiene activada la simulación. Nos colocamos en el menú “Debugger”:
INICIO
94
Ventanas para verificar el programa
INICIO
Registros
Memoria de programa
Registro de funciones especiales
95
Simulación de las condiciones de entrada
Será también útil, colocar un simulador de condiciones, para variar los valores en las líneas que corresponden al puerto A. Para ello se seleccionará en Debugger, Stimulus. Esta opción sólo aparecerá, si ya ha sido seleccionada la herramienta de simulación. A continuación aparece la siguiente ventana.
INICIO
96
Para asignar cada entrada
Para asignar cada entrada, se hará lo siguiente:
1. Presionar el botón “Add Row”
2. Presionar uno de los rectángulos blancos de la primera fila. Aparecerá:
INICIO
97
Explicación de los estímulos
INICIO
Los terminales seleccionados y el tipo de acción, se podrán escoger en cada fila:
Type. Indica si la entrada es sincrónica o asincrónica con respecto a los pulsos del reloj. Por lo general, para entradas externas se fija en “Asynch” (Asincrónico).
Enable. Se utiliza para generar la acción en el terminal de entrada.
Pin. Indica el terminal del microcontrolador que se va a utilizar para generar el estímulo: RA0, RA1, etc. Al presionar la flecha adyacente encontrarás las opciones.
Action. Determina el tipo de entrada que se va a colocar: High (cambia a 1), Low (cambia a cero), Toggle (cambia al estado opuesto cada vez que se presiona), Pulse (pulso que cambia momentáneamente al estado opuesto y luego vuelve al inicial).
High cicles. Número de ciclos en que la entrada se mantiene en uno, al aplicar un estímulo sincrónico.
Low cicles. Número de ciclos en que la entrada se mantiene en cero, al aplicar un estímulo sincrónico.
PC. Dirección numérica o símbolo en el cual ocurrirá el estímulo.
Invert. Si el símbolo de chequeo está activo, indica que se invertirá el pulso si se está utilizando un estímulo sincrónico.
Comments. Puedes indicar un comentario relacionado con el estímulo.
98
Asignación de cada entrada
Tú podrás añadir más entradas de estímulo cada vez que presionas el botón “Add Row”. Cuando termines de colocar todos los estímulos con sus características, presionarás “Edit Complete” y luego “Save” para guardar lo que hiciste. Después de esto podrás comenzar la simulación.
Trata de colocar las entradas del puerto A como estímulo tipo “toggle”:
INICIO
99
Ejecución del programa
Para ejecutar el programa, podrás seleccionar inicialmente la velocidad del microcontrolador, los puntos de parada y las opciones de trazado en “Debugger” y luego en “Settings”.Si no has seleccionado nada en “Settings”, al ejecutar el programa y mover adecuadamente las ventanas, encontrarás lo siguiente:
INICIO
Ejecución del programa
Detención del programa
Paso que se ejecuta
Verificación de estados
Estimulación de entradas
Reinicio
Ejecución paso a paso
Ejecución animada
100
Revisión de resultados
INICIO
Los resultados no los podrás ver en el momento del aplicar los estímulos. Para observar los cambios, deberás detener el programa.
También tienes la posibilidad de correr el programa paso a paso, para observar el comportamiento del mismo al ejecutarse cada instrucción, o al presionar F8.
Al ejecutar en forma animada, se observa en el programa editado y en la memoria de programa, cómo se van ejecutando cada paso del programa. En este modo, al aplicar los estímulos no siempre obedecen. Esto se podrá verificar en la lectura de los bits de los puertos.
Después de verificar que el programa se ejecuta correctamente, se deberá proceder a grabar en la EPROM del microcontrolador.
Si existe algún problema, entonces se deberá revisar el programa, ya sea paso a paso o entre dos posiciones de la EPROM.
101
2.7.- Grabación del Microcontrolador
Después de revisar cuidadosamente el programa, ahora se procederá a grabar el microcontrolador. Es importante tener un borrador de EPROM y el programador. Si no tienes el borrador de EPROM que consiste en una lámpara ultravioleta, entonces trabaja mejor con un PIC16F54 o un PIC16F84A. En el caso de no tener el programador, trata de comprarlo o hacer alguno de los que se proponen en la Internet.
Para realizar este paso, supondremos que se dispone del programador PICSTART Plus. La ventaja de utilizar este programador, es que sirve para casi cualquier microcontrolador PIC, desde ocho terminales hasta cuarenta terminales. Si tienes una versión vieja del programador, podrás ir al anexo 7, en el cual se explican los pasos para actualizar el programador.
El programador se conectará por medio de una fuente que trae el equipo, y el puerto de comunicación serial disponible de una computadora personal.
Para empezar, deberás seleccionar en el MPLAB, el programador que vas a utilizar:
INICIO
102
Selección del puerto de comunicación serial
Si se desea cambiar el puerto serial, como por ejemplo, el puerto 2, se deberá escoger en Programmer, Settings, Comunications. Después se selecciona el puerto serial deseado.
INICIO
103
Equipo de Desarrollo PICSTAR Plus
1 Programador PICSTART Plus
2 Cable serial RS-232 (Interfaz con la Computadora)
3 Microcontroladores
4 Disco con software, manuales y notas de aplicaciones
INICIO
104
Comenzando a Grabar
INICIO
Una vez que escogiste el puerto de comunicación serial y tienes todo conectado, entonces colocarás el microcontrolador en el conector del programador. Procederemos a llamar al programador en Programmer, Enable Programmer. Primero se verificará la comunicación con el programador. Si todo está correcto, entonces aparecerá la siguiente ventana:
Chequeo si Leer Grabar Verificar Borrar está borrado memoria programa programación memoria Flash
105
Cargando el programa a la computadora
Si un programa ha sido recién ensamblado, en la ventana “View, Program Memory”, aparecerá el programa en código hexadecimal. En este caso ya todo estaría listo para programar el microcontrolador. Suponiendo que antes de cargar el programa, queremos verificar si el microcontrolador está borrado, al presionar en , se podrá hacer esta verificación. En el caso de hacer una lectura del contenido de la memoria del microcontrolador, los datos se tranferiran a la ventana de la memoria del programa y se borra la del programa ensamblado. Para cargar nuevamente el programa ensamblado, se buscará en File, Import, Download To Memory... Luego se accede al archivo con el nombre con extensión .hex, el cual ha sido ensamblado anteriormente.
INICIO
106
Estableciendo las condiciones de Hardware y grabación en la memoria del
microcontrolador
INICIO
Antes de programar nos fijaremos en la ventana inferior, la cual establece algunas condiciones del hardware del microcontrolador:
De éstas cambiaremos el Watchdog Timer a Off, ya que en nuestro programa, no hemos usado este temporizador. Por otro lado, debemos dejar el Code Protect en off, ya que si lo cambiamos, no podríamos volver a regrabar el microcontrolador.
Una vez realizado esto, se puede proceder a grabar. Para ello, simplemente se activará el botón , y se transfiere los datos a la EPROM del microcontrolador.
Si se desea verificar que la grabación fue correcta, se podrá activar el botón .
107
Si no se dispone del microcontrolador PIC16C54 o un borrador de EPROM
Si no puedes trabajar con el PIC16C54JW, ya sea porque no lo consigues en el mercado local, o porque no tienes la lámpara de luz ultravioleta, entonces podrás utilizar el PIC16F54, el cual es igual al PIC16C54, con la diferencia de que se puede regrabar sin necesidad de la lámpara de luz ultravioleta, gracias a su memoria de programa tipo FLASH. Otro microcontrolador PIC que puedes utilizar, haciendo pocas modificaciones, es el PIC16F84A que también contiene una memoria del tipo FLASH.
Entre el PIC16C54 y el PIC16F84A hay compatibilidad de hardware, es decir que los terminales de conexión coinciden en ambos casos y por lo tanto no tienes que modificar el circuito. Otro detalle que hay en ambos microcontroladores, es la compatibilidad del software. A pesar de que el PIC16F84A es un microcontrolador de la gama media, el programa que editaste con el PIC16C54 puede ejecutarse sin problemas, ya que las instrucciones de los microcontroladores de la gama básica son compatibles con los de la gama media. A pesar de esta compatibilidad, deberás hacer las siguientes modificaciones para que puedas grabar correctamente al PIC16F84A:
• En el programa deberás cambiar la directiva INCLUDE “P16C5X.INC”, por la directiva INCLUDE “P16F84.INC”, ya que vas a trabajar con el PIC16F84A.
• En el MPLAB deberás seleccionar en Options, Development Mode y Processor al PIC16F84A. De esta manera al grabar con el MPLAB seleccionarás los códigos adecuados para este microcontrolador.
• Finalmente, deberás reensamblar el programa, para generar los códigos del PIC16F84.
INICIO
108
Conexiones externas al microcontrolador
Una vez que se ha grabado el microcontrolador, este dispositivo está listo para ser utilizado en un circuito. Como se vio en el capítulo 1, las conexiones restantes a los puertos serán: Vdd voltaje de alimentación positiva, cuyo valor continuo, puede estar comprendido entre 3V y 6V; Vss que corresponde al punto negativo de la fuente o común; MCLR o inicialización, que en operación normal se deberá conectar a Vdd; TOCKI, que es la base de tiempo del temporizador TMR0, y que se deberá conectar a Vdd o a Vss en el caso de no utilizarse. Las otras dos líneas son OSC1 y OSC2, que se utilizan para conectar el circuito oscilador.
Como primera prueba, se podrá conectar el circuito, según se muestra en la siguiente página.
Al activar los interruptores, se deberá observar el funcionamiento del circuito, tal como se programó. En el caso de no ser así, se deberá chequear las conexiones, y las tensiones en cada punto del circuito, observar si hay oscilación en OSC1 y OSC2, y chequear si los leds no están invertidos.
En el caso de haber revisado todo, y el circuito sigue sin funcionar, consulta con tu profesor.
INICIO
109
Circuito final
PIC16C54
18 17 16 15 14 13 12 11 10
5V
5V
1 2 3 4 5 6 7 8 9
5V
5V
8 Resistencias de 3004 Resistencias de 4,7K
10K
f680KHz
100 pF
INICIO
110
Algunas Preguntas
• ¿Para qué sirve la instrucción TRIS?• ¿Cuáles líneas se emplearon para entrada y cuáles para salida?• ¿Qué hace la directiva ORG?• ¿Qué hace la directiva EQU?• ¿Cuál es la diferencia entre una directiva y una instrucción?• ¿Cuánta corriente circulan por los leds, cuando ellos están encendidos?• ¿Qué hace la instrucción BTFSS?• ¿Qué hacen las instrucciones BCF y BSF?• ¿En cuáles partes del programa se ejecutan saltos?• ¿Para qué sirve la directiva END?• ¿Por qué son importantes los comentarios en un programa?• ¿Entendiste la lógica del programa?• ¿Te atreverías a escribir nuevamente un programa que haga lo mismo,
sin consultar este módulo instruccional? Explícalo claramente.• ¿Comprendiste los pasos necesarios para programar a un
microcontrolador?
INICIO
111
2.8.- Reduciendo el programa
Es posible reducir la cantidad de líneas de programa, para utilizar menor espacio en la memoria de programa. Para ello, se leerá el puerto de entrada, y con la instrucción de rotación. Se podrá hacer la evaluación bit por bit en un registro. Con este procedimiento, también se podrá escribir los bits en el puerto de salida.
Te recomendamos que antes de comenzar a interpretar el programa que se presenta en la siguiente página, analiza lo que realizan las siguientes instrucciones:
MOVWF f MOVF f,d
DECF f,d INCF f,d
DECFSZ f,d INCFSZ f,d
RRF f,d RLF f,d
En las instrucciones RRF y RLF, el registro f rueda un bit hacia la derecha o hacia la izquierda respectivamente; sin embargo esto lo hace al través de un noveno bit que se llama Carry (C) que se encuentra en el registro STATUS. Este registro guarda algunas condiciones después de que se ejecutan ciertas operaciones, por ejemplo, si un resultado es igual a cero, en STATUS hay un bit Z, que se colocará en 1. De manera similar, si en el bit 0 de f hay un “1”, al hacer la rotación a la derecha, el bit C del STATUS, se colocará en “1”.
INICIO
112
Programa reducido para lalectura de interruptores
INICIO
113
2.9.- Advertencia para un vehículo
Te recomendamos que analices, edites, ensambles y simules el programa que se presentó anteriormente. Verás que hará lo mismo que el primer programa. Nota que en este programa se utiliza algunas posiciones de la RAM, en la que se guarda los valores temporales del puerto A, puerto B y el contador de ciclos.
A continuación, se presentará un programa que indicará ciertas condiciones de advertencia para un vehículo. Para ello te recomendamos que estudies y analices las siguientes instrucciones:
ANDWF f,d ANDLW K
IORWF f,d IORLW K
XORWF f,d XORLW K
COMF f,d NOP
Recordando las funciones lógicas que se efectuará en cada bit de índice “n” de los registros W y F:
AND IOR XOR COM Donde:
n Posición de bit
f Direc. de RAM
w Reg de trabajo
d Destino (w o f)INICIO
114
Descripción del Problema
Se desea hacer un circuito que indique señales de advertencia para un vehículo de dos puertas. Las advertencias se darán según se cumplan las condiciones siguientes:Condición 1: El motor está encendido y alguna de las puertas está abierta. Se utilizará la línea RA0 para señalar esta condición.Condición 2: El motor está encendido y el cinturón de seguridad del conductor está desabrochado. Se utilizará la línea RA1 para indicar esta condición.Condición 3: El motor está apagado y las luces están encendidas. Se utilizará la línea RA2 para señalar esta condición.Condición 4: El motor está apagado, la puerta del conductor abierta y la llave de encendido puesta. Se utilizará la línea RA3 para indicar esta condición.Advertencia General: Si ocurre cualquiera de las condiciones anteriores. Se tomará la línea RB7 para señalar esta condición.Cada condición se mostrará por medio de un indicador luminoso (Led) y la advertencia general se dará por medio de una señal sonora.Se dispone de seis detectores tipo pulsador, que detectan las señales de entrada y serán conectadas a cada línea de entrada del puerto B. La lógica de los detectores se dará de la siguiente manera:Motor: Indica un “1” si éste está encendido, se conectará a RB0.Pcond (puerta del conductor): Indica un “1” si ésta está abierta, se conectará a RB1.Pacom (la otra puerta): Indica un “1” si ésta está abierta, se conectará a RB2.Cintu (cinturón de seguridad): Indica un 1 si está desabrochado, se conectará a RB3.Luces: Indica un “1” si están encendidas, se conectará a RB4.Llave: Indica un “1” si está colocada, se conectará a RB5.
INICIO
115
Circuito y Ecuaciones Lógicas
De acuerdo a la descripción del problema, te proponemos como actividad, que dibujes el circuito del microcontrolador, con los detectores y las luces de advertencia.
Las ecuaciones lógicas para cada condición de advertencia, según el problema planteado, se podrán colocar de la siguiente manera:
COND1 = MOTOR.(PCOND+PACOM)COND2 = MOTOR.CINTUCOND3 = MOTOR.LUCESCOND4 = MOTOR.PCOND.LLAVEADGEN = COND1 + COND2 + COND3 + COND4
Según las asignaciones en cada puerto, se puede plantear también lo siguiente:
RA0 = RB0.(RB1+RB2)RA1 = RB0.RB3RA2 = RB0.RB4RA3 = RB0.RB1.RB6RB7 = RA0 + RA1 + RA2 + RA3
Donde RAn son las líneas que corresponde al puerto A y RBn son las líneas que corresponden al puerto B. INICIO
116
Lógica del Programa
En un primer intento, la lógica a utilizar en este programa, consiste en asignar un registro a cada entrada, y luego hacer las operaciones lógicas correspondientes, para colocar los resultados en registros que correspondan a cada solución. Esto implica que hay que tomar la lectura de las líneas RB0 hasta RB5, y asignar las condiciones al bit menos significativo de cada uno de los registros correspondientes. Los resultados, se colocarán en el bit menos significativo de cada registro. Véase a continuación, la asignación de etiquetas en el programa:
INCLUDE "P16C5X.INC" ; INCLUYE ETIQUETAS DE P16C5X.INC
MOTOR EQU 10 ;MOTORPCOND EQU 11 ;PUERTA DEL CONDUCTORPACOM EQU 12 ;PUERTA DEL ACOMPAÑANTECINTU EQU 13 ;CINTURON DE SEGURIDADLLAVE EQU 14 ;LLAVE DE ENCENDIDOLUCES EQU 15 ;LUCESCOND1 EQU 16 ;CONDICION 1COND2 EQU 17 ;CONDICION 2COND3 EQU 18 ;CONDICION 3COND4 EQU 19 ;CONDICION 4ALGEN EQU 1A ;ALARMA GENERAL
Nota: Es muy importante que las direcciones asignadas a cada etiqueta, no coincidan con las reservadas para cada uno de los registros de propósitos especiales del microcontrolador. INICIO
117
CONSIDERANDO UN PROGRAMA MODULAR
La forma en la cual se presentó las posiciones de los registros es completamente válida. Sin embargo, te recomendamos que te acostumbres a hacer módulos de subrutina, de manera que con pocos cambios, lo puedas utilizar sin problemas en otros programas.
Para ello, en cada subrutina se especificará la longitud del programa, la dirección de arranque, la cantidad de registros utilizados y la posición de referencia de estos registros. Si te acostumbras a hacer esto, entonces podrás hacer módulos que utilizarías luego sin mucha dificultad. Para ello te proponemos que especifiques los registros de la manera siguiente:
MOTOR EQU 10 ;MOTORPCOND EQU MOTOR+1 ;PUERTA DEL CONDUCTORPACOM EQU MOTOR+2 ;PUERTA DEL ACOMPAÑANTECINTU EQU MOTOR+3 ;CINTURON DE SEGURIDADLLAVE EQU MOTOR+4 ;LLAVE DE ENCENDIDOLUCES EQU MOTOR+5 ;LUCESCOND1 EQU MOTOR+6 ;CONDICION 1COND2 EQU MOTOR+7 ;CONDICION 2COND3 EQU MOTOR+8 ;CONDICION 3COND4 EQU MOTOR+9 ;CONDICION 4ALGEN EQU MOTOR+0A ;ALARMA GENERAL
En este caso, sabremos que la cantidad de registros utilizada es de 11, y que la posición de referencia es “MOTOR”, que ocupa la posicón 10H.
INICIO
118
Otra forma de nombrar bloques de constanes
Otra manera que puedes utilizar para nombrar las etiquetas de tu programa en un bloque, es la siguiente:
cblock 0x10
MOTOR, PCOND, PACOM, CINTU, LLAVE, LUCES,
COND1, COND2, COND3, COND4, ALGEN
endc
La directiva “cblock” asigna un bloque de constantes, a partir de un valor específico, es decir que en el caso anterior se define la etiqueta MOTOR con el valor 10h, y a continuación a PCOND se le asigna el valor 11h, y así sucesivamente. Como podrás observar ésta es una manera más sencilla de asignar valores a un bloque de constantes.
La directiva “endc” indica la finalización de la lista de constantes, es decir que la última de ellas es ALGEN.
INICIO
119
Asignación de detectores a registros
INICIO
120
Asignación de advertencias
INICIO
121
Condición de Alarma General
El programa presentado, es una de las formas de solucionar este problema. En la siguiente página, se presenta otro programa, mucho más corto y que utiliza menos registros. La lógica que se utilizó, se basa en asignar las operaciones lógicas en forma paralela, es decir, que cada condición se manifiesta en un bit de una palabra. Deberá notarse que en todas las operaciones está involucrada la variable “MOTOR”, por lo que se aprovecha esto, para simplificar más el programa.
INICIO
122
Una alternativa más eficiente
La lógica se basa en sí, en que hay dos operadores: OPER1, donde se colocará las condiciones del motor y OPER2, donde se asignarán las otras condiciones. Para ello, en el bit 0 se coloca la condición 1, en el bit 1 la condición 2 y así sucesivamente. Luego se escribe la condición inicial “0011” a OPER1, que asignará una suposición de que el motor está encendido. En el caso de detectarse que está apagado, se inviertirá esta condición.
OPER1 (Motor): Motor Motor Motor Motor
OPER2 (Otros): (Llave. Pcond) Luces Cintu (Pcond+Pacom)
Condición4 Condición3 Condición2 Condición1; COMIENZO DEL PROGRAMA;; ASIGNACIONES DE VARIABLES;OPER1 EQU 10 ; OPERADOR 1 SE UTILIZARA PARA COLOCAR LAS CONDICIONES
; DEL MOTOROPER2 EQU OPER1+1 ; EL OPERADOR 2 SE UTILIZARA PARA COLOCAR LAS OTRAS
; CONDICIONES
INCLUDE "P16C5X.INC" ; INCLUYE ETIQUETAS DE P16C5X.INC
ORG 0PREPAR
CLRW ; EL PUERTO A SERA UTILIZADO COMO ENTRADATRIS PORTAMOVLW 7F ; RB7 SERA UTILIZADO COMO SALIDA Y EL RESTOTRIS PORTB ; DE LOS BITS DEL PUERTO B SERAN ENTRADAS
INICIO
123 INICIO
Programa de advertencia reducido
124
2.10.- Control de leds por medio de pulsadores
En este ejemplo se hará lo mismo que en el caso de la lectura de los interruptores, pero se utilizará pulsadores para encender los leds de manera alterna.
Se deberá considerar el efecto de rebote del pulsador, el cual consiste en que al accionarlo, sus contactos rebotan varias veces antes de lograr permanecer en su estado estable; el tiempo de duración del efecto de rebote, podrá estar entre 5 y 25 mSeg dependiendo de la calidad y el tipo del pulsador. En otras palabras, se deberá hacer la lectura de los conmutadores por lo menos cada 25 mSeg.
El programa a realizar, entonces deberá leer el estado del pulsador. En el caso de que éste se haya presionado, se deberá encender el led que estaba apagado, y apagar el que estaba encendido en el canal correspondiente, además se deberá esperar un tiempo de aproximadamente 25 mSeg, para efectuar la siguiente lectura.
El circuito, entonces deberá constar de cuatro entradas y ocho salidas, de manera similar que en el caso de los interruptores.
INICIO
125
Circuito utilizado para leer pulsadores
De acuerdo a lo establecido anteriormente, se deberá escoger un microcontrolador que tenga al menos doce líneas para puertos de entrada-salida. Una elección posible, podría ser el PIC16C54, ya que tiene doce terminales de entrada-salida. Las conexiones se presentarán a continuación, en donde se escogerá al puerto A como entrada (4 bits) y el puerto B como salida (8 bits).
Vss
PIC
16C54
INICIO
126
Comienzo del Programa
El programa que se presenta a continuación, se utilizará para detectar el estado de uno de los pulsadores.
Como siempre, el programa deberá empezar con comentarios que den suficiente información acerca del programa que se va a realizar.
;;; PROGRAMA PARA LA LECTURA DE PULSADORES;;; Este programa se utilizará en un circuito con cuatro pulsadores de entrada y; ocho indicadores a la salida, de los cuales cuatro serán de color rojo, y cuatro; serán de color verde.;; Longitud del programa 82 (51h) palabras. Dirección de inicio del programa 0H; Cantidad de registros 2. Posición de referencia PBANTES dirección 10h;; Cada pulsador estará asociado con dos indicadores de diferente color, y; al presionarlo, deberá cambiar el encendido, de uno a otro. En condiciones iniciales,; deberán encender los indicadores de color rojo.;; Se tomará el puerto A como entrada para los pulsadores.; Un "1" determinará que el pulsador está abierto; Un "0" determinará que el pulsador está presionado;; El puerto B se utilizará como salida; Los terminales pares se conectarán a los leds rojos; Los terminales impares se conectarán a los leds verdes
INICIO
127
Preparación y detección
INCLUDE "P16F84.INC" ; ESTA DIRECTIVA INDICA QUE SE ASIGNARA VALORES; NUMERICOS A CADA UNO DE LOS REGISTROS DE FUNCIONES; ESPECIALES Y LOS BITS DEL REGISTRO STATUS
PBANTES EQU 10 ; INDICA EL ESTADO ANTERIOR DEL PUERTO BSTTUSPA EQU PBANTES + 1 ; INDICA EL ESTADO DE LOS BITS LEIDOS EN EL PUERTO A
ORG 0PREPAR MOVLW 0F
TRIS PORTA ; PUERTO A SERA ENTRADACLRWTRIS PORTB ; PUERTO B SERA SALIDAMOVLW 55MOVWF PORTB ; SE ALTERNAN 1 Y 0 EN LAS LINEAS DE SALIDA DEL PUERTO BCLRF PBANTES ; PALABRA DE ESTATUS QUE INDICA EN CADA GRUPO QUE LOS
; LEDS ROJOS ESTAN ENCENDIDOS Y LOS VERDES APAGADOSCLRF STTUSPA ; PALABRA DE CONTROL PARA MANTENER VALOR EN LA ENTRADA
INICIO BTFSS PORTA,0 ; CONDICION BIT 0 DEL PUERTO A: SI ES 1 => PULSADOR NO PRESIONADO GOTO CAMBIO0 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 0BCF STTUSPA,0 ; PONE UN 0 PARA MANTENER CONDICION MIENTRAS SE PRESIONA PULSADOR
GRUPO1 BTFSS PORTA,1 ; CHEQUEA CONDICION BIT 1 DEL PUERTO A GOTO CAMBIO1 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 1BCF STTUSPA,1
GRUPO2 BTFSS PORTA,2 ; CHEQUEA CONDICION BIT 2 DEL PUERTO A GOTO CAMBIO2 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 2BCF STTUSPA,2
GRUPO3 BTFSS PORTA,3 ; CHEQUEA CONDICION BIT 3 DEL PUERTO A GOTO CAMBIO3 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 3BCF STTUSPA,3
SIGCICL CALL RETARDO ; LLAMA RUTINA DE RETARDO PARA ESPERAR TIEMPO DE REBOTEGOTO INICIO
INICIO
128
Cambio de estado en dos de los grupos
INICIO
129
Eliminación del Rebote
El programa se repite en forma similar para los otros dos grupos. Intenta tú terminar lo que falta del programa.
Finalmente queda por editar el retardo. Para ello, se asumirá que el oscilador del microcontrolador, produce una frecuencia de 4MHz, lo cual quiere decir que el período es igual a 0,25μSeg. Si una instrucción se ejecuta en cuatro períodos del oscilador, significa que el tiempo de duración de una instrucción es de 1μSeg.
Para eliminar el rebote, se podrá esperar un tiempo de 30mSeg, es decir que se necesitaría ejecutar 30.000 instrucciones. Esto se puede hacer mediante lazos repetitivos, como el que se muestra a continuación, que corresponde a la instrucción siguiente después de la última escritura al puerto B:
INICIO
130
En el siguiente ejemplo, se muestra cómo realizar la suma binaria de dos números de 4 bits que se leen en el puerto B. Trata de aprender a utilizar las siguientes instrucciones:
2.11.- Ejemplo de un programa para sumar
INICIO
ADDWF f,d SUBWF f,dCALL K RETLW KCLRF SWAPF f,d
131
Programa SUMABYTE
; SUMABYTE;
; Programa que suma dos números de 8 bits. Los sumadores se encuentran; en PORTB, luego se ubican en las posiciones 8h y 9h en la memoria de
datos.; El resultado se guardará en la posición 0Ah y sale por PORTA
PREPAR CLRW ; SE ASUME PORTB COMO ENTRADA Y SE PROGRAMA PORTA
TRIS PORTA ; COMO SALIEAINICIO MOVF PORTB,W ; EL CONTENIDO DE PORTB VA A W
ANDLW 0F ; SE TOMAN LOS 4 BITS MENOS SIGNIFICATIVOSMOVWF 8 ; SE GUARDA VALOR EN LA POSICIÓN 8HMOVF PORTB,W ; SE VUELVE A LEER EL PUERTO B ANDLW OFO ; SE TOMAN LOS 4 BITS MAS SIGNIFICATIVOSMOVWF 9 ; SE GUARDA VALOR EN LA POSICIÓN 9HSWAPF 9,F ; EL VALOR SE COLOCA ENCALL SUMABYTEMOVF 0A,WMOVWF PORTAGOTO INICIO ; VA AL INICIO DEL PROGRAMA
SUMABYTE MOVF 8,W ; Mueve Sumador ubicado en la posición 8 a WADDWF 9,W ; Suma valor de la posición 9 con W, resultado
a WMOVWF 0A ; El resultado se guarda en la posición 0ARETLW 0 ; Retorno con W = 0END
INICIO
132
Resta de dos números
Este ejemplo es similar al anterior. Sin embargo, hay que tomar en cuenta que la operación “restar” en un microprocesador, se hace por medio de una suma, en donde el valor negativo se complementa a dos, es decir, se complementa en 1 (se cambia “unos” por “ceros” y viceversa) y luego se le suma 1.;
; RESTABYTE;; Programa que resta dos números de 8 bits; Los valores se encuentran ubicados en las posiciones minuendo (8h); y sustraendo (9h) en ;la memoria de datos.; El resultado se guardará en la posición 0Ah;
MINUENDO EQU 8 ; Posición del minuendoSUSTRAENDO EQU 9 ; Posición del sustraendoRESULTADO EQU 0A ; Posición del resultado
ORG 50 ; Dirección del comienzo del programa 50hRESTABYTE
MOVLW 5 ; Asigna el valor 5 a W (Registro de trabajo)
MOVWF MINUENDO ; El valor 5 pasa al minuendoMOVLW 3 ; Asigna el valor 3 a WMOVWF SUSTRAENDO ; El valor 3 pasa al sustraendoMOVF SUSTRAENDO,W ; El valor del sustraendo pasa a W
SUBWF MINUENDO,W ; Resta MINUENDO – SUSTRAENDO,; resultado en W
MOVWF RESULTADO ; El resultado se guarda en la posición 0A
END ;Finalización del programa INICIO
133
Trata de hacerlo tú
En el siguiente ejemplo se propone hacer el control de cuatro semáforos en una intersección de dos vías. Los semáforos tienen cruces a la izquierda en cada esquina. Se asume que los tiempos de duración serán los que se muestran en la tabla anexa:
Esquinas1 y 3 Esquinas 2 y 4 Duración
Rojo y Verde cruce Rojo 8 segundos
Verde Rojo 20 segundos
Amarillo Rojo 3 segundos
Rojo Rojo y Verde cruce 8 segundos
Rojo Verde 25 segundos
Rojo Amarillo 3 segundos
1
23
4
INICIO
134
ACTIVIDADES A REALIZAR
Hasta este punto hemos visto los pasos necesarios para realizar programas, simulaciones y prototipos con microcontroladores desde un punto de vista muy básico. Algunas de las actividades que puedes realizar, para complementar este tema, son las siguientes:
1.- Edita, compila y simula los programas que se han explicado en este tema.
2.- Graba un microcontrolador PIC16C54JW, PIC16F54 o PIC16F84 con los programas que se proponen como ejemplos y monta los circuitos para verificar el funcionamiento.
3.- Hacer un circuito con un microcontrolador, que detecte una clave secreta de 8 bits. El usuario introducirá un valor binario en uno de los puertos y, por medio de un pulsador, hará válido el código de entrada. Si el código falla tres veces seguidas, se deberá inhibir el circuito por un período de dos minutos. En el caso de que el código sea correcto, se deberá activar una luz indicadora.
4.- Hacer un contador binario de 8 bits, con dos pulsadores de entradas, que permita que cuente en forma ascendente o descendente, de acuerdo al pulsador que se presione.
INICIO
3.1- Organización de las memorias del PIC 16C54:
3.2.- Organización de la memoria de programa del PIC16C54:
3.3.- Organización de la memoria de datos del microcontrolador PIC 16C54:
3.4.- Registro STATUS
3.5.- Registros INDF y FSR, Modo de acceso indirecto
3.6.- Registro contador de programa PC
3.7.- Registro STACK (pila)
3.8.- Puertos de Entrada y Salida
3.9.- Registro OPTION
3.10.- Temporizador contador
3.11.- Temporizador WDT (Perro Guardián)
TEMA 3MEMORIA DE PROGRAMA, REGISTROS, PUERTOS Y TEMPORIZADORES CONTENIDO
INICIO
136
Objetivos Terminales:
• Describir los registros de funciones especiales del microcontrolador PIC16C54.
• Mencionar la utilidad de los temporizadores en los microcontro-ladores.
TEMA III:MEMORIA DE PROGRAMA, REGISTROS, PUERTOS
Y TEMPORIZADORES
INICIO
137
Memoria de DatosMemoria de Programa
Se almacenan todas las instrucciones del programa de control. El tamaño de esta memoria es de 512 palabras.
Los datos que manejan los programas varían continuamente y esto exige que la memoria que los contiene, debe ser de lectura y escritura, por lo que la memoria RAM estática (SRAM) es la más adecuada, aunque sea volátil.
Para entender un poco más las instrucciones, hace falta conocer la organización de la memoria, cuáles son los registros especiales, dónde se ubican, y cuáles son los registros de propósitos generales. Poco a poco se irá incluyendo ejemplos con otras nuevas instrucciones en donde se observará cómo éstas influyen, tanto en los diferentes registros como en el funcionamiento del microcontrolador. La memoria del PIC16C54 se organiza en dos tipos:
3.1- Organización de las memoriasdel PIC16C54
INICIO
138
El PIC16C54, tiene un contador de programa (PC) de 9 bits, capaz de ubicar al programa, en una de las 512 direcciones del espacio de memoria que se utiliza la palabra de 12 bits.
PC<8:0>
NIVEL DE PILA 1NIVEL DE PILA 2
MEMORIA DE
PROGRAMA
VECTOR DE INICIALIZACIÓN
000h
0FFh100h
1FFh
Espaciopara
memoriadel
usuario
CALL, RERLW9
Memoria de programa del PIC16C54
3.2.- Organización de la memoria de programa del PIC 16C54
INICIO
139
La memoria de datos está organizada por registros de un byte de extensión, contenidos en una RAM. Los registros se dividen en dos grupos:
Registros defuncionesespeciales
Registros depropósitos generales
Estos incluyen:
El registro STATUS (Estado)
El Registro FSR (Registro
apuntador de direcciones de la RAM).
El PCL (Contador de programa)
Los registros PORTA y PORTB
(puertos de entrada y salida)
El Registro TMRO (Temporizador)
Se utilizan para guardar información de datos y control por medio de las instrucciones del programa.
3.3.- Organización de la memoria de datos del microcontrolador PIC 16C54
INICIO
140
INDF(1)
TMRO
PCL
STATUS
FSR
PORTA
PORTB
00h
01h
02h
03h
04h
05h
06h
07h
0Fh10h
1Fh
REGISTROS DE
PROPÓSITOSGENERALES
MEMORIA DE DATOS DEL PIC16C54
(1) El registro INDF, no corresponde a una posición física, sino al registro cuya dirección está contenida en el registro FSR.
INICIO
141
a.- Registro de propósitos generales:Los registros de propósitos generales, son aquéllos donde se guardan los datos de los programas de aplicación. Ellos se pueden acceder de manera directa por medio de la dirección f en una instrucción, o de manera indirecta, a través del registro FSR o registro apuntador de direcciones.
b.- Registros de funciones especiales:Estos registros los usa la CPU y los periféricos para el control de la operación del microcontrolador. Debes tener cuidado de no utilizar un registro de función especial, como un registro de propósito general, ya que en los registros de funciones especiales se asigna un control específico, que puede estar relacionado con el hardware del microcontrolador o el control del programa. En la siguiente tabla se representa un resumen de las funciones de estos registros.
Tipos de Registros
INICIO
142
Función de cada bit de los registros de funciones especiales
Nota: “x” significa “cualquier cosa” y “u” significa “no cambia”
Valor después Valor después
Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 de encender WDT y MCLR
N/A Tris Registros de control de Entrada y Salida (TRISA,TRISB) 1111 1111 1111 1111
N/A OPTION Contiene los bits de configuración del escalamiento, TMRO y WDT --11 1111 --11
1111
00h INDF Registro de la mem. de datos, su dirección está en el registro FSR xxxx xxxx uuuu
uuuu
01h TMRO Temporizador contador de tiempo real de 8 bits xxxx xxxx uuuu
uuuu
02h PCL 8 bits de bajo orden del Contador de Programa (PCL) 1111 1111 1111
1111
03h STATUS PA2 PA1 PA0 TO PD Z DC C 0001 1xxx
04H FSR Apuntador de la memoria de datos para acceso indirecto 1xxx xxxx
05h PORTA - - - - RA3 RA2 RA1 RA0 ---- xxxx ---- uuuu
06H PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
INICIO
143
Está ubicado en la dirección 03h, en la memoria de datos, y contiene los bits de estado de la Unidad Lógica y Aritmética y el estado de la inicialización (RESET).
El registro STATUS puede ser el destino para una instrucción, como cualquier otro registro. Si este registro es el destino de una instrucción que afecta los bits C (acarreo), DC (acarreo decimal) o Z (cero), entonces la escritura de estos tres bits es inhibida, es decir, estos bits se establecerán de acuerdo a la lógica del dispositivo.
Por otro lado, los bits TO (Tiempo de espera) y PD (Reposo) no se pueden escribir.
A continuación se presentarán los bits del registro STATUS (dirección: 03h).
3.4 Registro STATUS
INICIO
144
R = bit de lectura W = bit de escritura -N = Valor después de la inicialización.
Bit 7-5: PA2 PA0: No se usan para el PIC16C54Bit 4: TO: Bit “Tiempo de espera”.
1 = Al encender la alimentación o con las instrucciones CLRWT o SLEEP.
0 = Al haber un desbordamiento en el registro WDT.Bit 3: PD: Bit “Reposo”.
1 = Al encender la alimentación o con las instrucciones CLRWT.0 = Al ejecutar la instrucción SLEEP.
Bit 2: Z: Bit cero.1 = El resultado de una operación lógica o aritmética es cero.0 = El resultado de una operación lógica o aritmética es diferente
de cero.Bit 1: DC: Bit de acarreo/débito de dígito (instrucciones ADDWF o SUBWF).
ADDWF1 = Ocurre un acarreo en el cuarto bit del resultado (se excede el valor 0Fh).0 = No ocurre un acarreo en el cuarto bit del resultado.
SUBWF1 = No ocurre un débito en el cuarto bit del resultado.0 = Ocurre un débito en el cuarto bit del resultado.
R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
PA2 PA1 PA0 TO PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INICIO
Bits del Registro STATUS
145
Bit 0: C: Bit de acarreo/débito (instrucciones ADDWF, SUBWF, RRF o RLF).
ADDWF
1 = Ocurre un acarreo.
0 = No ocurre un acarreo.
SUBWF
1 = No ocurre un débito.
0 = Ocurre un débito.
RRF: Toma el valor del bit menos significativo (LSb) del registro f.
RLF: Toma el valor del bit más significativo (MSb) del registro f.
El bit “C” o bit de acarreo (Carry)
INICIO
146
Programa para incrementar un contador BCD
Un programa típico es el de un contador BCD. Éste, a diferencia de los contadores binarios, presentan la salida en código BCD, de manera que pueda ser fácilmente llevado a una presentación decimal.
El programa que se presenta a continuación, cada vez que es llamado, incrementa un contador cuya salida es de código BCD. Para ello se utilizan los bits DC y C del registro STATUS.
INCLUDE "P16C5X.INC"CONT EQU 0X10 ; En CONT se encuentra el contador BCD
org 0clrf CONT ; Se hace CONT igual a 0
Increm incf CONT,F ; Se incrementa CONT en 1movlw 6 ; Se hace el ajuste a BCDaddwf CONT,W ; suma 6 para corrección digito 0btfsc STATUS,DC ; chequea si hubo un acarreo en digito 0movwf CONT ; corrige si hay acarreo digito 0movlw 60addwf CONT,W ; suma 60 para corrección digito 1btfsc STATUS,C ; corrige si hay acarreo digito 1movwf CONTgoto Incremend
INICIO
147
El registro INDF no es un registro físico; si se accede al registro INDF, se coloca en el registro cuya dirección está contenida en el registro FSR, es decir, que FSR es un apuntador de direcciones.
Ejemplo de cómo utilizar los
registros INF y FSR:
La siguiente sección de programa, permite borrar los registros ubicados desde la dirección 10h hasta la 1Fh. Una forma de realizar esto es por medio del modo de acceso indirecto.
MOVLW 0X10 ; Inicialización del apuntador de la RAM
MOVWF FSR ; El Registro FSR toma el valor 10h
Próximo CLRF INDF ; Borra registro cuya dirección está en FSR
INCF FSR, F ; Incremento del apuntador
BTFSS FSR,5 ; ¿Borrado completo? (Examina bit 5 de FSR)
GOTO Próximo ; No, borra siguiente
3.5 Registros INDF y FSR, Modo de acceso indirecto
INICIO
148
Cuando una instrucción es ejecutada, el contador de programa (PC) contendrá la dirección de la próxima instrucción a ejecutarse. El valor del PC se incrementa en uno por cada ciclo de instrucción, al menos que la instrucción cambie el valor del PC.
Para una instrucción GOTO, los bits 8 a 0 del PC se incluyen en dicha instrucción. El registro PCL toma los bits 7 a 0. Véase figura a continuación:
8 7 0
PC PCL
Palabra de Instrucción
PIC16C54
3.6 Registro contador de programa PC
INICIO
149
Para una instrucción CALL, o alguna instrucción donde el PCL es el destino, los bits 7 a 0 del PC se obtienen del código de la instrucción. Sin embargo, el bit 8 del PC no viene del código de la instrucción, sino que es puesto en cero.
Algunas de las instrucciones donde el PCL es el destino, o se le modifica el contenido, son: MOVWF PCL, ADDWF PCL y BSF PCL, 5. Recuerda que la dirección del PCL es la 2
8 7 0
PC PCL
Palabra de Instrucción
PIC16C54
Inicialización A “0”
INICIO
150
Saltos de dirección del programa
A lo largo de este módulo instruccional, hemos visto algunos ejemplos en los que se ejecutan algún cambio en la dirección del programa. Recordemos que estas instrucciones son las únicas que duran dos ciclos de máquinas, es decir, que se demoran en ejecutar el doble de las otras instrucciones.
Veamos algunos ejemplos de saltos de dirección del programa:
BTFSS REG0,3 ; Chequea el bit 3 de REG0 si es “1” salta una instrucción
BTFSC STATUS,C ; Chequea el bit de acarreo del estatus, salta si es “0”
GOTO FINAL ; Salto incondicional a la dirección final, el salto corresponde a 9 bits
CALL MULT ; Ejecuta la rutina MULT, el salto corresponde a 8 bits
RETLW 0 ; Retorno de subrutina, la dirección del STACK va al PC
MOVWF PCL ; El contenido de W va a los 8 bits menos significativos del PC
ADDWF PCL,F ; Se suma W + PCL y el resultado va al PC
XORWF PCL,F ; Se hace el exor entre PCL y W y el resultado modifica al PC
BCF PCL,2 ; Coloca en 0 el bit 2 del PC
Otras instrucciones que ejecutan cambios en el PC son: ANDWF PCL,F;IORWF PCL,F; COMF PCL; BSF PCL,1; RRC PCL,F; RLC PCL, F; INCF PCL,F; DECF PCL,F; INCFSZ PCL,F; DECFSZ PCL,F; CLRF PCL; SWAPF PCL,F; etc.
INICIO
151
El registro STACK guarda las direcciones de retorno de las rutinas que se llaman por medio de la instrucción CALL, y carga la dirección de retorno al PC con la instrucción RETLW. la longitud de palabra de la pila es la misma que la del PC. La pila tiene dos niveles:
Una instrucción CALL coloca el contenido del nivel 1 de la pila, en el nivel 2 y luego coloca el valor del contador del programa actual, incrementando en uno, en el nivel 1 de la pila. Si se llama a más de dos subrutinas en una misma secuencia, únicamente las direcciones de las dos más recientes serán almacenadas.
Una instrucción RETLW, cargará el contenido del nivel 1 de la pila al PC y el del nivel 2 al nivel 1. Si más de dos instrucciones RETLW se ejecutan, la pila se llenará con la dirección almacenada previamente en el nivel 2, y podría dar problemas en el programa.
NOTA:
Al utilizar la instrucción RETLW, el registro W se cargará con el valor literal en la instrucción. Esto es útil para la construcción de tablas de conversión con la memoria de programa.
3.7 Registro STACK (pila)
INICIO
152
Convertidor BCD a 7 Segmentos
Este es un programa típico que utiliza una tabla de conversión BCD a 7 segmentos. Básicamente se coloca el valor a convertir en el registro W, y se utiliza este valor para sumárselo al PC, luego se regresa W con el valor convertido en 7 segmentos. Para esta rutina, se asume que un “1” significa que el valor del segmento es activo, lo cual se usa en indicadores del tipo cátodo común. El bit menos significativo (RB0) corresponde al segmento “a”.
include "P16C5X.INC"valorBCD equ 10
org 0INICIO movf valorBCD,w ; el valor BCD a convertir se lleva a W
call BCD7SEGgoto INICIO
BCD7SEG ; rutina de conversion BCD a 7 segmentosaddwf PCL,f ; El valor BCD se suma al contador de programa
; en el retorno se convierte en 7 segmentosretlw b'00111111' ; 0retlw b'00000110' ; 1retlw b'01011011' ; 2retlw b'01001111' ; 3retlw b'01100110' ; 4retlw b'01101101' ; 5retlw b'01111101' ; 6retlw b'00000111' ; 7retlw b'01111111' ; 8retlw b'01101111' ; 9end
INICIO
a (RB0)
f (RB5) b (RB1)
g (RB6)
e (RB4) c (RB2)
d (RB3)
153
Los puertos de entrada y salida pueden ser leídos y escritos como cualquier registro de datos por medio de las instrucciones de programa. Sin embargo, una instrucción de lectura (por ejemplo MOVF PORTB, W) leerá los terminales de los puertos, independientemente si ellos están programados como entrada o salida. Después de una inicialización, todos los puertos se definen como entrada (alta impedancia), ya que los registros de control TRISA y TRISB son puestos en 1.
Puerto A: El puerto A es un registro de 4 bits (PORTA), los bits que se utilizan son los menos significativos (RA3:RA0). Los bits 7-4 se leen como ceros.
Puerto B: El puerto B es un registro de entrada-salida de 8 bits (PORTB<7:0>).
3.8 Puertos de Entrada y Salida
INICIO
154
Los registros de control de puertos, son cargados con el contenido del registro W, al ejecutar la instrucción TRIS F. Un “1” en un bit del registro TRIS, coloca el adaptador del terminal correspondiente en modo de alta impedancia o entrada. Un “0” en ese bit, coloca el adaptador de ese terminal como salida.
NOTA:Una lectura de los puertos, lee los terminales de los puertos de salida, y no la salida que ha sido enviada. Esto significa que si una salida de un terminal es habilitada para tener un “1” y en el sistema externo, este terminal es forzado a un nivel bajo, la lectura del puerto indicará que en el terminal correspondiente habrá un cero.
Los registros TRIS, son registros de escritura solamente, y son colocados en 1 después de una inicialización (RESET todas las líneas de los puertos quedarán programados como entradas).
Los registros TRIS no tienen una dirección asignada en los microcontroladores de la gama básica. Sin embargo en los microcontroladores de la gama media si tienen una dirección asignada, y por lo tanto, en ellos no se recomienda utilizar la instrucción TRIS.
Registro de control de puerto TRIS
INICIO
155
Cada terminal de un puerto, puede ser utilizado como entrada o salida.
Para operaciones de entrada, estos puertos no guardan la condición.
El nivel de entrada debe permanecer hasta que la instrucción de
lectura se ejecute (por ejemplo MOVF PORTB, W). En el caso de las
salidas, las líneas mantienen su nivel hasta que haya una nueva
instrucción de escritura en el puerto. Para usar un terminal como
salida, la dirección correspondiente del bit de control en TRISA o
TRISB, debe colocarse en cero. Para usar este terminal como entrada,
el bit correspondiente en el registro TRIS debe colocarse en uno.
Cualquier línea de un puerto, puede programarse individualmente
como entrada o salida.
El circuito equivalente para cada línea de un puerto, es el que se
muestra a continuación:
Interfaces de Entrada y Salida
INICIO
156
Registro Tipo D
QD
QCK
Bus deDatos
Escribe en puerto
Registro TRIS
QD
QCK
RegistroW
TRIS f
Inicialización
Lee de Puerto
P
N
Vss
terminal deEntrada/Salida
Vdd
INICIO
157
La siguiente tabla presenta un resumen de la posición de las líneas en cada uno de los puertos:
Nota: “x” significa “cualquier cosa” y “u” significa “no cambia”
INICIO
N/A Tris Registros de control de Entrada y Salida (TRISA,TRISB, TRISC) 1111 1111 1111
1111
05h PORTA - - - - RA3 RA2 RA1 RA0 ---- xxxx ---- uuuu
06H PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
Valor después Valor después
Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 de encender WDT y MCLR
158
Escritura en un Indicador 7 segmentos
RB0
RB1
RB2
PIC 16C54 RB3
RB4
RB5
RB6
En el registro W se encuentra el código 7 segmentos que se va a escribir en el indicador numérico.
La instrucción:
MOVWF PORTB ; Lleva el contenido de W al puerto B.
Previamente se debe programar al puerto B como salida con la instrucción TRIS PORTB.
INICIO
159
Escritura en Dígitos Multiplexados
RA0
RA1
RA2
RA3
PIC16C54
RB0
RB1
RB2
RB3
RB4
RB5
RB6
La siguiente figura muestra una configuración de una salida de cuatro dígitos controlados por los puertos A y B.
Los indicadores numéricos 7 segmentos son del tipo ánodo común, por lo tanto se debe considerar que los segmentos encenderán con un “0” en vez de con un “1”.
Los dígitos se encenderán con un “0” en la entrada del transistor que le corresponde manejar al dígito correspondiente.
En la siguiente página se muestra una rutina para el control de varios dígitos.
INICIO
160
Rutina para el manejo de cuatro dígitos
;4IDIGITOS
;Salida para 4 dígitos 7 segmentosINCLUDE "P16C5X.INC"CBLOCK H'10'
DIGITO0, DIGITO1, DIGITO2, DIGITO3ENDC ; VALORES DE SALIDA DE CADA DIGITOORG 0
PREPARA CLRWTRIS PORTATRIS PORTB ; SE PROGRAMAN PUERTOS A Y B COMO SALIDAS
INICIO MOVF DIGITO0,W ; EL CONTENIDO DE DIGITO 0 VA A WMOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO BMOVLW B’1110’ ; SELECCION DEL PRIMER DIGITOMOVWF PORTA,F ; SE SELECCIONA RA0, PARA EL PRIMER DIGITOCALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADORMOVF DIGITO1,W ; EL CONTENIDO DE DIGITO 1 VA A WMOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO BMOVLW B’1101’ ; SELECCION DEL SEGUNDO DIGITOMOVWF PORTA,F ; SE SELECCIONA RA1, PARA EL PRIMER DIGITOCALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADORMOVF DIGITO2,W ; EL CONTENIDO DE DIGITO 2 VA A WMOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO BMOVLW B’1011’ ; SELECCION DEL TERCER DIGITOMOVWF PORTA,F ; SE SELECCIONA RA2, PARA EL PRIMER DIGITOCALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADORMOVF DIGITO3,W ; EL CONTENIDO DE DIGITO 3 VA A WMOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO BMOVLW B’0111’ ; SELECCION DEL CUARTO DIGITOMOVWF PORTA,F ; SE SELECCIONA RA3, PARA EL PRIMER DIGITOCALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADOR
INICIO
161
Rutina para el manejo de varios dígitos
;MULTIDIGITO;Salida para 4 o más dígitos 7 segmentos
INCLUDE "P16C5X.INC"CBLOCK H'10'
DIGITO0, DIGITO1, DIGITO2, DIGITO3, SELDIGIENDC ; VALORES DE SALIDA DE CADA DIGITOORG 0
PREPARA CLRWTRIS PORTATRIS PORTB ; SE PROGRAMAN PUERTOS A Y B COMO SALIDAS
INICIO MOVLW B’11111110 ; SE HACE 0 EL BIT 0, PARA ENCENDER PRIMER DIGITOMOVWF SELDIGI,F ; EL VALOR SE LLEVA DE W A SELDIGIMOVLW DIGITO0 ; VALOR DIGITO 0 VA A W PARA CARGARLO A FSRMOVWF FSR ; DIGITOX VA AL APUNTADOR DE DIRECCIONES
PROXDIG MOVF INDF,W ; VALOR DEL DIGITO VA A WMOVWF PORTB ; SE SACA VALOR AL PUERTO BMOVF SELDIGI,W ; SELECCIONADOR DE DIGITO A WMOVWF PORTA ; SELECCION DE DIGITO AL PUERTO ABSF STATUS,C ; COLOCA ACARREO EN 1, PARA APAGAR DIGITO 0RLF SELDIGI,F ; CAMBIO EN LA SELECCION DE DIGITOINCF FSR,F ; INCREMENTA APUNTADOR DE DIGITOSCALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADORBTFSS SELDIGI,4 ; SI FINALIZA ULTIMO DIGITO SALTAGOTO PROXDIG ; SINO VA AL PROXIMO DIGITO
INICIO
162
El registro OPTION es un registro de 6 bits de escritura solamente, y contiene los bits de control para configurar el escalamiento del temporizador TMR0 (Timer 0) o del temporizador WDT (Perro guardián). El registro OPTION no tiene dirección asignada en los microcontroladores de la gama básica. Sin embargo, este registro sí tiene una dirección específica en los microcontroladores de la gama media.
A continuación se presenta la asignación de los bits del registro OPTION:U-C U-0 W1 W1 W1 W1 W1 W1
TOCS TOSE PSA PS2 PS1 PS0
7 6 5 4 3 2 1 0
Bit 5: TOCS: Bit de selección de fuente del temporizador TMR0
1 = Transición del terminal TOCKI
0 = Reloj de ciclo de instrucciones interno (CLKOUT)
Bit 4: TOSE: Bit de selección de transición de fuente del temporizador TMR0
1 = Incremento en una transición de bajada en el terminal TOCKI
0 = Incremento en una transición de subida en el terminal TOCKI
3.9 Registro OPTION
INICIO
163
Bit 3: PSA: Bit de asignación del escalamiento.
1 = Se asigna el escalamiento a WDT (perro guardián).
0 = Se asigna el escalamiento al temporizador TMR0 (Timer 0).
Bit 2-0: PS2:PS0: Bits de selección de la relación de escalamiento.
PS2 PS1 PS0 Relación TMR0 Relación WDT
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128
INICIO
164
Cambios en el preescalador
Veamos un ejemplo de cómo cambiar el preescalador para los temporizadores del PIC16C54. En el primer caso se hace un cambio del temporizador 0 al WDT. Recuerda que los valores binarios “x”, son los que vamos a asignar:
CLRWDT ; BORRA EL TEMPORIZADOR PERRO GUARDIAN WDT
CLRF TMR0 ; BORRA TEMPORIZADOR TMR0
MOVLW B’00xx1111’ ; LAS ULTIMAS TRES INSTRUCCIONES SE REQUERIRAN SI
OPTION ; SE DESEA HACER EL CAMBIO
CLRWDT ; PS<2:0> A 000 O 001
MOVLW B’00xx1xxx’ ; SE ESTABLECE EL PREESCALADOR AL VALOR DESEADO
OPTION ; PARA EL WDT
En el segundo caso se hace un cambio del preescalador del WDT al TMR0.
CLRWDT ; BORRA EL WDT Y EL PREESCALADOR
MOVLW B’xxxx0xxx’ ; SELECCIONA EL NUEVO ESCALAMIENTO PARA TMR0 Y LA
OPTION ; FUENTE QUE ACTIVA ESTE TEMPORIZADOR
INICIO
165
Un temporizador contador tiene la función de calcular el tiempo transcurrido durante la ejecución del programa del microcontrolador o, contar los pulsos producidos por uno o más eventos externos. Básicamente el circuito que se utiliza es el de un contador independiente, que puede ser activado por el oscilador del microcontrolador o por un oscilador externo.
El temporizador TMR0 presenta las siguientes características:
Registro contador - temporizador de 8 bits de lectura y escritura.
Escalamiento programable (Véase registro Option).
Selección de entrada de oscilador interna o externa.
Selección del tipo de transición que activa la cuenta.
3.10 Temporizador contador
INICIO
166
El modo temporizador se selecciona al colocar un cero en el bit TOCS, bit 5 del registro OPTION. En este modo, el temporizador se incrementa por cada transición del escalamiento, el cual divide la frecuencia de cada ciclo de instrucción. Si se escribe el registro TMR0 (temporizador 0), el incremento se inhibe durante los dos ciclos siguientes, véase las siguientes figuras:
INICIO
Ciclos del Temporizador 0, para el oscilador interno sin escalamiento:
PC (Contador de programa)
01020304 01020304 01020304 01020304 01020304 01020304 01020304 01020304
Preparación de instrucción
Temporizador 0
Instrucción Ejecutada
Escribir TRMRO Ejecutado
Leer TMRO
Lee NTO
Leer TMRO
Lee NTO
Leer TMRO
Lee NTO
Leer TMRO
Lee NTO+1
Leer TMRO
Lee NTO+2
MOVWF TMR0 MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOV TMR0,W MOVF TMR0, W
Modo Temporizador
167
PC (Contador de programa)
01020304 01020304 01020304 01020304 01020304 01020304 01020304 01020304
Preparación de instrucción
Temporizador 0
Instrucción Ejecutada
Escribir TRMRO Ejecutado
Leer TMRO
Lee NTO
Leer TMRO
Lee NTO
Leer TMRO
Lee NTO
Leer TMRO
Lee NTO
Leer TMRO
Lee NTO+1
MOVWF TMR0 MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOV TMR0,W MOVF TMR0,W
Ciclos del Temporizador 0:Oscilador interno con escalamiento 1 a 2
INICIO
El programador debe considerar este retardo en la escritura para ajustar el valor deseado en TMR0.
168
El modo contador se selecciona al poner en 1 el bit TOCS (bit 5 del registro OPTION). En este modo, el temporizador o el escalamiento se incrementará en 1 cada vez que haya una transición en el terminal de entrada TOCKI. El tipo de transición se determina por medio del bit TOSE (bit 4 del registro OPTION); si éste es cero, la entrada es sensible a transiciones de subida.
En la siguiente figura, se muestra la conexión eléctrica del terminal TOCKI, que es la entrada del temporizador TMR0:
El escalamiento puede ser usado por TMR0 o por el temporizador WDT “perro guardián”, pero no por ambos. La asignación del escalamiento se hace por el bit PSA (bit 3 de OPTION). Si el bit PSA es cero, el escalamiento será asignado al temporizador TMR0. Los valores de escalamiento pueden ser desde 1/2 hasta 1/256, según la tabla mostrada en el registro OPTION. INICIO
TOCKIN
Entrada con Disparador de Schmitt
Modo Contador
169
Valor al Valor después
Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Encender de TMR0 y TO
N/A TMRO Temporizador 0 - Contador/reloj de tiempo real de 8 bits xxxx xxxx uuuu
uuuu
N/A OPTION - - TOCS TOSE PSA PS2 PS1 PS0 11 1111 1111 1111
En la tabla siguiente, se muestra un resumen de los registros asociados con
el temporizador TMR0.
INICIO
170
Contador de tiempo
INICIO
Veamos como ejemplo que se quiere incrementar un contador de tiempo cada segundo, y que en una posición de memoria, se lleve la cuenta del tiempo en minutos. Supongamos que el microcontrolador tiene un cristal de 10MHz.
Para este caso, si el oscilador es de 10MHz, el período del oscilador es igual a 100nSeg. El ciclo de máquina dura cuatro períodos del oscilador, por tanto corresponde a 400nSeg. El valor máximo que se puede asignar al preescalador para el TMR0, corresponde a 256 veces. Es decir que si tomamos el máximo valor, se obtiene: 400nSeg X 256 = 102,4μSeg. El TMR0 es de 8 bits, por tanto este tiempo lo podemos ampliar hasta 102,4μSeg X 255 = 26,112mSeg. Si la idea es obtener un tiempo submúltiplo de 1Seg, podríamos seleccionar por ejemplo 20mSeg o 10mSeg, de manera que al leer 50 o 100 veces el incremento de un registro que detecte cada vez que el TMR0 se desborda, entonces obtendríamos 1 segundo respectivamente.
Supongamos que seleccionamos como base del temporizador 10mSeg, entonces podríamos tomar el valor de escalamiento en 1/128, en vez de 1/256 que es el máximo. Así se podrá tener mayor exactitud en la medición del tiempo.
El incremento del tiempo se hará en 400nSeg X 128 = 51,2μSeg. En 10mSeg se necesitarán 10mSeg/51,2μSeg períodos del TMR0, es decir; 195,3125 ciclos de TMR0. Como éste sólo admite un valor entero, se tomará el 195. El resto podría corregirse con una rutina que retarde la escritura del temporizador unos 51,2μSeg X 0,3125 = 16μSeg, que corresponde a la ejecución de 40 ciclos del PIC. Sin embargo, lo mejor sería probarlo sin tomar en cuenta este remanente, y luego corregir.
Para obtener los 195 ciclos del TMR0, debe cargarse el valor 256-195=61; no se toma en cuenta el retardo en la escritura, ya que el valor del escalamiento es alto.
171
El Contador de segundos y minutos
INICIO
include "P16C5X.INC" ; Incluye los símbolos del PIC16C54cblock 10H
segund, minuto, hora, diaendc
prepara movlw b'00000110' ; Selección del preescalador a TMR0 y división por 128option ; Carga al registro OPTION la configuración
tmr0full movf TMR0,wbtfss STATUS,Z ; Chequea si el TMR0 está en 0goto tmr0fullmovlw d'61'movwf TMR0 ; carga el valor 61 para que se ejecuten 195 ciclos de tmr0incf segund,f ; Se incrementan los segundoscall ajustegoto tmr0full ; Se espera hasta que el tmr0 vuelva a 0. Para otras aplicacione
; el programa principal puede seguir mientras se incrementa TMR0ajuste movlw 6 ; Se hace el ajuste a BCD
addwf segund,w ; suma 6 para corrección digito 0btfsc STATUS,DC ; chequea si hubo un acarreo en digito 0movwf segund ; corrige si hay acarreo digito 0movlw 0A0addwf segund,w ; suma 100 para corrección de segundosbtfsc STATUS,C ; corrige si hay acarreogoto incminu ; va a incrementar los minutosretlw 0 ; retorna si no hay incremento de minutos
incminu movwf segund ; corrige si hay acarreo en el siguiente dígitoincf minuto,f ; • ; el programa continúa, aquí se puede hacer las correcciones para • ; contar los minutos, horas, días, etc.
172
En el programa anterior observamos que el microcontrolador está un tiempo inactivo, mientras espera el desbordamiento del TMR0. Para este programa, puede no ser problema alguno, pero en otros programas se necesita administrar mejor el tiempo del microcontrolador. Esto se puede solucionar si el microcontrolador tuviera una interrupción que avisara que ya se llenó el TMR0. Sin embargo los PIC de la gama media no tienen este recurso, cosa que sí tienen los PICs de gamas más avanzadas.
Si se desea aprovechar mejor un programa de un PIC de la gama básica, entonces se sugiere que el programa que se esté ejecutando realice sus actividades mientras el TMR0 está contabilizando el tiempo. Es importante que mientras se ejecuta dicho programa, el tiempo no exceda al de un ciclo del TMR0, porque sino, al evaluar su salida, pudo ya haber pasado por cero, y entonces habrá que esperar otro desbordamiento del temporizador.
Una consideración respecto al programa anterior
INICIO
173
Un pequeño pulso se pierde en el muestreoEntrada de un
Oscilador Externo o Salida del Escalamiento
Salida del Oscilador Externo/Escalamiento Después del muestreo
01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04
(3)
(1)
Incremento del tem-porizador TMR0 (Q4)Temporizador TMR0
INICIO
Si un oscilador externo se usa para el temporizador TMR0, hay que considerar que debe haber una sincronización con la fase del oscilador externo; sino habrá un retardo en el incremento del temporizador TMR0 después de la sincronización.
Al no usar el escalamiento, la señal del oscilador externo entra directamente al bloque de sincronización. Esta sincronización de TOCKI con la fase del oscilador interno, se realiza por medio del muestreo de la salida escalada en los ciclos Q2 y Q4 de la fase del oscilador interno. Por consiguiente, se necesita que TOCKI esté en 1 por lo menos dos veces el periodo del oscilador y en 0 al menos otro intervalo de tiempo igual. Véase la siguiente figura:
Uso de un oscilador externo para TMR0
174
Cuando se usa el escalamiento, se obtiene una señal simétrica cuya frecuencia está divida con respecto a la de la frecuencia de entrada del oscilador. Es necesario que en la entrada TOCKI, el período sea de por lo menos 4Tosc dividido entre el valor escalado. Por otro lado, la duración de un nivel debe ser mayor que el mínimo ancho de pulso requerido de acuerdo a las especificaciones, es decir 10nSeg.
Debido a que la salida del escalamiento se sincroniza con el oscilador interno, cuando ocurre una transición en la señal externa habrá un pequeño retardo en el incremento del temporizador TMR0.
INICIO
175
En la mayoría de los microcontroladores, se incorpora un temporizador
independiente llamado “perro Guardián” (Watchdog Timer). Éste tiene
la finalidad de reiniciar el programa principal o atender una interrupción,
cuando ocurre una anormalidad en la ejecución de la secuencia de
instrucciones programadas. Básicamente esta “anormalidad” hará que el
programa ejecute un lazo sin retorno, y por tanto el microcontrolador no
hará la función que se le había asignado. Si esto ocurre, y se dispone de
un temporizador “perro guardián”, éste, después de un tiempo de
espera, enviará la señal de interrupción que repondrá al
microcontrolador y podrá ser capaz de iniciar o continuar el programa
principal. Es de suponer, que si se va a utilizar este temporizador, el
programa principal debe borrarlo en un tiempo menor al tiempo de
espera especificado por el temporizador, porque de lo contrario el
programa nunca se ejecutaría completamente.
3.11 Temporizador WDT (Perro Guardián)
INICIO
176
En los PIC16C5X, el temporizador WDT o “perro guardián” es un
oscilador independiente de configuración RC que está dentro del
microcontrolador. Esto significa que este circuito genera una señal,
aunque el oscilador principal (terminales OSC1/CLKIN y OSC2/CLKOUT) se
haya detenido, como por ejemplo al ejecutar la instrucción SLEEP. En una
operación normal o en el modo “Reposo” (SLEEP), una señal de
habilitación del WDT, resultará en una inicialización del microcontrolador.
El bit TO (bit 4 de STATUS) se borrará después de esta señal de
inicialización.
El temporizador WDT puede ser deshabilitado permanentemente al
colocar en “0” el bit de configuración WDTE. Véase el tema IV, acerca de
los bits de configuración para los microcontroladores 16C5X.
INICIO
177
El período de espera del temporizador WDT, es de alrededor 18 mSeg cuando no tiene escalamiento. Si se desea un mayor tiempo de espera, este período se puede aumentar por medio del escalamiento hasta 128 veces. Para ello se debe colocar en “1” los bits PSA, PS2, PS1 y PS0 del registro OPTION. De esta manera, se puede obtener un tiempo de espera normal de hasta 2,3 segundos. Este periodo puede variar con la temperatura, VDD y las tolerancias en las especificaciones.
Período del temporizador WDT
INICIO
178
REGISTROS ASOCIADOS CON EL TEMPORIZADOR WDT (PERRO GUARDIÁN):
Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Valor al Valor después de
Encender TMR0 y MCLR
N/A OPTION - - TOCS TOSE PSA PS2 PS1 PS0 --11 1111 --11 1111
INICIO
Consideraciones al programar el Temporizador WDT:
La instrucción CLRWDT borra el contenido del temporizador WDT y el escalamiento, si éste ha sido asignado a WDT. Esto permitirá que no ocurra una inicialización del microcontrolador.
La instrucción SLEEP, borra el contenido del temporizador WDT y el escalamiento, si éste ha sido asignado a WDT. El “perro guardián” (WDT) “despertará” al microcontrolador en el tiempo máximo de espera fijado por el WDT.
179
Programa que utiliza el WDT para prevenir lazos infinitos
INICIO
Veamos el ejemplo del contador de segundos y minutos. Sabemos que el programa deberá chequear continuamente el temporizador TMR0. Una manera de prevenir que el programa se “guinde” es de la siguiente manera:
tmr0full movf TMR0,wbtfss STATUS,Z ; Chequea si el TMR0 está en 0goto tmr0fullmovlw d'61'movwf TMR0 ; carga el valor 61 para que se ejecuten 195 ciclos de tmr0clrwdt ; Borra el temporizador WDTincf segund,f ; Se incrementan los segundos•••
Recordemos que el WDT reiniciaría el microcontrolador cada 18mSeg aproximadamente, si no se borra antes de que transcurra ese tiempo, ya que este valor no se puede ampliar porque el TMR0 está utilizando el escalador. Si sabemos que el TMR0 se carga cada 10mSeg, entonces podría ser una buena alternativa colocar la instrucción de borrado del WDT después de cargar el valor en el TMR0.Es importante tomar en cuenta, que el WDT se activa por medio de los bits de configuración al hacer la programación del PIC, lo cual se verá en el próximo tema.
180
ACTIVIDADES A REALIZAR
1.- Hacer un contador BCD con dos pulsadores para el control ascendente y descendente, y que tenga dos dígitos de salida en formato siete segmentos.
2.- Hacer un control de luces para el semáforo propuesto en el tema 2, en el cual se lleve la medición del tiempo con el temporizador TMR0. Suponga que la frecuencia del oscilador es igual a 4MHz.
3.- Hacer un reloj digital, que sincronice su velocidad con el temporizador TMR0. Este reloj deberá tener la posibilidad de ajustar la hora y minutos, por medio de pulsadores. Asuma que la frecuencia del oscilador es igual a 20MHz.
4.- Incluir el temporizador WDT en las actividades anteriores, de manera que el programa se ejecute correctamente, en condiciones normales, y que haga la inicialización, en el caso de caer en un lazo infinito.
INICIO
TEMA 4Características Especiales del Hardware
CONTENIDO
4.1.- Configuración de la serie PIC16C5X
4.2.- Modo SLEEP (Reposo)
4.3.- Inicialización de los PIC16C5X
4.4.- El Temporizador de Inicialización (DRT)
4.5.- Inicialización por Encendido (POR)
INICIO
182
Objetivos Terminales:
• Describir los modos de configuración que presentan los microcontroladores PIC.
• Señalar la importancia que tiene activar el modo “Reposo” en un microcontrolador.
• Describir los modos de inicialización que presentan los microcontroladores PIC.
INICIO
183
En la dirección FFFh de los microcontroladores de la serie 16C5X, se
dispone de una palabra de configuración de 12 bits, de los cuales 4 bits
tienen funciones específicas. Cuando se va a grabar el programa en el
microcontrolador, se tiene acceso a esta dirección. Para ello, se dispone
de una ventana que permite configurar algunas características del
hardware del microcontrolador.
Estos bits pueden programarse para seleccionar algunas funciones de
Hardware del microcontrolador.
Dos de los bits son para seleccionar el tipo de oscilador que se va a
utilizar, un bit es para la habilitación del temporizador “Perro
Guardián” (WDT) y un bit es para habilitar la protección del código del
programa.
4.1.- Configuración de la serie PIC16C5X
INICIO
184
CP WDTE FOSC0FOSC1
Bit 11 10 9 8 7 6 5 4 3 2 1 Bit 0
Registro CONFGDirección FFFH
Bits 11-4: No utilizados: Se leen “0”
Bit 3: CP: Bit de protección de códigos
1-> No protegido
0-> Protegido
Bit 2: WDTE: Habilitación del temporizador WDT (Perro Guardián)
1-> Habilitado
0-> Inhabilitado
Diagrama de la palabra de configuración
INICIO
185
Los microcontroladores PIC tienen la posibilidad de proteger el programa grabado en memoria al acceder al bit 3 de la palabra configuración.
Si este Bit tiene valor 0, entonces no será posible leer el programa guardado.
Habilitación del Temporizador WDT
El temporizador WDT se utiliza normalmente para reiniciar el programa principal, cuando ocurre una anormalidad.
En el bit 2 de la palabra de configuración se puede habilitar o no este temporizador, al colocar un 1 ó un 0 respectivamente.
Protección de códigos
INICIO
186
Los microcontroladores PIC16C5X, pueden operar en uno de cuatro modos de oscilación; para ello, el usuario deberá programar dos de los bits de configuración del microcontrolador.
En la palabra de configuración, que sólo se accede a ella en el modo de programación, se encuentran los bits FOSC1 y FOSC0 (bits 1 y 0 respectivamente).
De acuerdo a la combinación de ellos, se puede escoger lo siguiente:
LP Cristal resonante a bajo consumo (00)
XT Cristal resonante (01)
HS Cristal resonante de alta velocidad (10)
RC Resistencia y condensador (11)
Selección del Oscilador
INICIO
187
En las figuras de la página siguiente, se puede observar la conexión del cristal en el microcontrolador, y los valores adecuados de los condensadores según el modo de oscilación seleccionado.
Otra alternativa existente es la de conectar una señal producida por un oscilador externo en la entrada OSC1/CLKIN, lo cual se puede observar a continuación
Señal de un osciladorexterno
Abierto
OSC1
OSC2PIC 16C5X
INICIO
188
Tipo de Frecuencia C1 C2 Oscilador resonante
LP 32KHz 15 pF 15pF
XT 100KHz 15-30 pF 200-300 pF 200KHz 15-30 pF 100-200 pF
455KHz 15-30 pF 15-100 pF 1MHz 15-30 pF 15-30 pF 2MHz 15 pF 15 pF 4MHz 15 pF 15 pF
HS 4MHz 15 pF 15 pF 8MHz 15 pF 15 pF 20MHz 15 pF 15 pF
C2(1)
RS(2)
SLEEP
Hacia lógicainterna
RF(3)
OSC2
XTAL
C1(1) OSC1PIC16C5X
NOTAS:
1.- Ver tabla de selección de C1 y C2
2.- Puede ser necesario colocar una resistencia en cristales sin blindajes
3.- El valor de RF depende del cristal seleccionado
INICIO
Tabla de Selección
189
Para las aplicaciones en las cuales no se requiera precisión en la medición del tiempo, el modo RC ofrece una alternativa económica para el desarrollo de circuitos. La frecuencia del oscilador RC, depende de los valores del voltaje de alimentación, la resistencia Rext, el condensador Cext, la temperatura de operación y la tolerancia que ofrece el dispositivo. Se recomienda utilizar valores de Rext entre 3 K y 100 K. En cuanto a Cext se recomienda utilizar valores por encima de los 20 pF.
En la siguiente figura se muestra la conexión de circuito RC, nótese que se dispone de una salida con la frecuencia de oscilación dividida entre cuatro en el terminal OSC2/CLKOUT.
VDD
Rext
OSC1
PIC16C5X
OSC2/ClkOUTFOSC/4Vss
Cext
Reloj Interno
N
INICIO
190
Valores típicos de frecuencia que sepueden obtener en el modo RC
Cext Rext FrecuenciaVdd= 5V, Tamb=25ºC
20pF3.3K5K
10K100K
5,0MHz3,8MHz2,2MHz260KHz
100pF3.3K5K
10K100K
1,6MHz1,2MHz680KHz72KHz
300pF3.3K5K
10K160K
660KHz480KHz270KHz29KHz
INICIO
191
Los microcontroladores PIC, tienen la posibilidad de estar en un modo de operación de bajo nivel de consumo. Sin embargo, durante ese tiempo, no podrá ejecutar instrucciones, tal como si estuviera durmiendo. Luego podrá despertar para funcionar en el modo normal, por medio de una señal de inicialización.
Para estar en el modo “Reposo”, se deberá ejecutar en el programa la instrucción SLEEP. Si el temporizador “perro guardián” está habilitado, al ejecutar la instrucción SLEEP, borrará el contenido del registro WDT, para dar comienzo el tiempo de espera seleccionado según el escalamiento del WDT, y enviar después la señal del temporizador “perro guardián”. Por otro lado, el bit TO o tiempo de espera (bit 4 de STATUS), se coloca en “1”, y el bit PD o baja potencia (bit 3 de STATUS), se coloca en “0”, entonces el oscilador se detiene. Los puertos de entrada y salida mantienen el estado anterior a la ejecución de la instrucción SLEEP.
Si se desea un consumo aún menor en este estado, se deberá colocar el terminal TOCKI a un nivel fijo (VDD o VSS) y la entrada MCLR/Vpp deberá colocarse a un nivel alto.
4.2.- Modo SLEEP (Reposo)
INICIO
192
Para salir del modo de reposo, existen dos posibilidades: Por medio de una inicialización externa o al cumplirse el tiempo de espera en el temporizador “perro guardián” (si WDT había sido habilitado).
Estas dos formas causarán una inicialización del dispositivo, y los bits TO y PD pueden usarse para determinar cómo se hizo la inicialización.
Un cero en el bit TO, indicará que el tiempo de espera en el WDT “despertó al microcontrolador”.
INICIO
193
Los microcontroladores PIC pueden iniciar sus funciones de las siguientes
formas:
Inicialización por encendido (POR).
Inicialización MCLR (operación normal).
Inicialización MCLR al “despertar” (desde el modo Reposo o SLEEP).
Inicialización WDT (operación normal).
Inicialización del WDT para “despertar” (desde el modo Reposo o
SLEEP).
La siguiente tabla muestra las condiciones de los bits de los registros PCL
y STATUS, después de una inicialización.
4.3.- Inicialización de los PIC16C5X
INICIO
194
Nota: “x” significa “cualquier valor”; “u” significa que mantiene el valor anterior
Condición PCLDirección: 02h
STATUSDirección: 03h
Inicialización por encendido 1111 1111 0001 1xxx
Inicialización MCLR(operación normal)
1111 1111 000u uuuu
Inicialización MCLR al“despertar” (desde modo
Reposo)
1111 1111 0001 0uuu
Inicialización WDT(operación normal)
1111 1111 0000 1uuu
Inicialización WDT al“despertar” (desde modo
Reposo)
1111 1111 0000 0uuu
INICIO
195
Algunos registros se establecerán según la condición de inicialización. Los otros no serán afectados y sus estados serán indefinidos después de una inicialización al encender el dispositivo, y mantendrán sus valores para otro tipo de inicialización. Los bits TO (tiempo de espera) y PD (Reposo); se colocarán en “0” o en “1”, dependiendo de la condición de la inicialización. Estos bits pueden utilizarse para conocer la causa de inicialización. A continuación se muestra cómo se afectan los bits TO y PD según el tipo de inicialización y según ciertas condiciones en el microcontrolador.
TO PD Inicialización fue causada por:
1 1 Encendido (POR)
u u Inicialización MCLR (Operación Normal)
1 0 Inicialización MCLR al despertar
0 1 Inicialización WDT (Operación Normal)
0 0 Inicialización WDT Al despertar
INICIO
196
Registro Dirección Inicialización porEncendido
Inicialización porMCLR o WDT
W N/A xxxx xxxx uuuu uuuu
TRIS N/A 1111 1111 1111 1111
OPTION N/A - - 11 1111 - - 11 1111
INDF 00h xxxx xxxx uuuu uuuu
TMRO 01h xxxx xxxx uuuu uuuu
PCL(1) 02h 1111 1111 1111 1111
Estados de los registros, después de una inicialización
Nota: “x” significa “cualquier valor”.
“u” significa que mantiene el valor anterior.
INICIO
197
Registro Dirección Inicialización porEncendido
Inicialización porMCLR o WDT
STATUS 03h 0001 1xxx 000??uuu
FSR 04h 1xxx xxxx 1000 0000
PORTA 05h --- xxxx ---- uuuu
PORTB 06h xxxx xxxx uuuu uuuu
07h-7Fh xxxx xxxx uuuu uuuuRegistros de
propósitos generales
INICIO
198
En la siguiente figura, se muestra el diagrama de bloques del circuito de inicialización:
Detector de EncendidoVDD
MCLR/VDD
z
Oscilador RC
Interno
Contador de 8 Bits Asincrónico
(Temporizador de Arranque)
Inicio S Q
QR
Inicialización del Chip
POR (Inicializació
n por Encendido)
Tiempo de espera del
WDT
INICIO
199
El temporizador de inicialización (DRT) es un circuito interno, basado en un oscilador RC, que introduce un tiempo de espera nominal de 18mseg, antes de la inicialización del microcontrolador.
El retardo en la inicialización que introduce este circuito, permite la estabilización de la frecuencia de oscilación en el circuito resonante que fija los ciclos del microcontrolador; lo cual evita la necesidad de colocar una red RC externa para este propósito.
El DRT también se activa después de un tiempo de espera del “perro guardián” (WDT), lo cual es importante para aplicaciones en las que “despertará” al microcontrolador, después del modo “dormir” o reposo.
4.4. El Temporizador de Inicialización (DRT)
INICIO
200
Los microcontroladores de la familia PIC16C5X incorporan un circuito de inicialización por encendido dentro del chip, para la mayoría de las situaciones. Para utilizar estas facilidades, el diseñador simplemente debe colocar el terminal MCLR/Vpp al voltaje de alimentación Vpp.
Los circuitos de la inicialización por encendido (POR) y del temporizador de inicialización (DRT), están muy relacionados. Cuando se enciende el microcontrolador, el registro de inicialización se coloca en “1” y se borra el DRT. Luego el DRT arranca cuando detecta un “1” en la línea MCLR. Después de un tiempo de espera, que dura aproximadamente 18mseg, se pone en “0” el registro de inicialización y de esta manera se genera la señal de inicialización.
Un ejemplo de encendido en donde MCLR no se conecta a VDD se grafica en la siguiente figura:
4.5. Inicialización por encendido (POR)
INICIO
201
POR INTERNO
MCLR
VDD
ESPERA DRT
INICIALIZACIÓN INTERNA
TDRT
V1
El VDD aumenta y se estabiliza antes de que MCLR sea
igual a “1”. La inicialización se efectuará un tiempo después de
que MCLR sea “1” y será fijado por el DRT.
INICIO
202
INICIALIZACIÓN INTERNA
VDD
MCLR
POR INTERNO TDRT
ESPERA DRT
V1
El caso conveniente se consigue cuando MCLR se conecta
a VDD. El valor de VDD permanece estable antes de que se cumpla
el tiempo de espera en el DRT, y no hay problemas en obtener la
inicialización adecuada.
La siguiente figura muestra el caso en que MCLR se conecta a VDD.
INICIO
203
Para los casos en los que la alimentación sube de manera muy lenta, ocurre una situación problemática. Véase la siguiente figura:
VDD
INICIALIZACIÓN INTERNA
MCLR
POR INTERNO
ESPERA DRT
V1
TDRT
Cuando VDD se eleva lentamente, el tiempo de espera TDRT se acaba antes de que VDD llegue al valor final. En este ejemplo, el dispositivo tendrá una inicialización apropiada, únicamente si V1 VDD.
INICIO
204
Si se desea mayor información, consultar la nota de aplicación AN522 en el “Embedded Control Handbook” o en www.microchip.com.
Cuando el DRT detecta el “1” lógico en la entrada MCLR/Vpp, y ésta no ha llegado a estabilizar su voltaje, no habrá garantía de que la inicialización en el microcontrolador se haya hecho correctamente. Para estos casos, se recomienda colocar un circuito RC como se muestra a continuación, de manera de solventar este problema.
VDD VDD
D R
R1
C
MCLR
PIC16C5X
INICIO
5.1.- Introducción
5.2.- Familia de los microcontroladores PIC de la gama básica
5.3.- Conexiones externas de los microcontroladores PIC de la gama básica
5.4.- Organización de las memorias de los microcontroladores PIC de la gama básica
5.5.- Registro STATUS
5.6.- Registro Contador de Programa PC
5.7.- Memoria de Datos
TEMA V
Otros Microcontroladores de la Gama Básica
INICIO
206
5.1 INTRODUCCIÓN
Hemos visto hasta ahora todo lo relacionado con el PIC16C54. Este microcontrolador es muy útil para aplicaciones básicas. En la medida en que aumenta la complejidad de un circuito, será necesario utilizar dispositivos con mayor capacidad de memoria, o posiblemente se requiera una mayor cantidad de líneas de entrada y salida, o por el contrario, pueden haber aplicaciones en las que se requiera pocas líneas y bajo consumo. Dentro de los PIC de la gama básica, hay otros microcontroladores que pueden solucionar estos problemas. Recuerda que la idea al utilizar microcontroladores, es para que este circuito haga prácticamente todas las funciones electrónicas de la aplicación requerida. En otras palabras, un circuito con microcontrolador no debería tener, en lo posible, ampliaciones externas de memoria ni circuitos digitales de soporte. ¿Por qué? Simplemente, porque si se hace esto, estas soluciones implican la utilización de más circuitos externos y en muchos casos se sacrificarían líneas que pueden utilizarse como puertos; por otro lado, si en un programa se pueden realizar todas las funciones lógicas, entonces será más económico aprovechar la elaboración de rutinas que ejecuten esas funciones. Por ejemplo, no sería conveniente hacer un contador con un microcontrolador, cuyas salidas vayan a un decodificador BCD a 7 segmentos. Es más económico y funcional hacer la decodificación BCD a 7 segmentos, por medio de una rutina de conversión. Tampoco será lógico añadir una memoria externa para aumentar la capacidad, ya que al comunicar la memoria con el microcontrolador se utilizarán líneas de puerto, que bien pueden emplearse para otra actividad. La solución será adquirir un microcontrolador con mayor capacidad de memoria.
INICIO
207
5.2 Familia de los microcontroladores
PIC de la gama básica
A continuación se presentan otros modelos de microcontroladores PIC de la gama básica con sus características:
INICIO
Producto Memoria de programa RAM Líneas Encapsulado Temporizadores Veloc. Otras características MCU Bytes OTP/EPROM ROM Bytes E/S y WDT Máx.
208
Familia de los microcontroladores PIC de la gama básica con memoria FLASH
A continuación se presentan los dos modelos de microcontroladores PIC de la gama básica con memoria FLASH y sus características:
INICIO
ProductoMCU
Memoria de programa
FLASH
RAMBytes
LíneasE/S
Encapsulado
Temporiza-dores y
WDT
Velocidad
Máx.
OtrasCaracterística
s
PIC16F54 512X12 25 12 18/PDIP18/SOIC 20/SSOP
1-8 bits1-WDT
20MHz Memoria FLASH
PIC16F57 2KX12 72 20 1-8 bits1-WDT
20MHz Memoria FLASH
Podemos observar que las características son idéntica a los PIC16C54 y PIC16C57, con la diferencia de que la memoria de programa es del tipo FLASH. Esto ofrece una ventaja considerable, ya que no se necesita el borrador de luz ultravioleta para poder reprogramar los microcontroladores.
209
5.3 Conexiones externas de los microcontroladores PIC
de la gama básica
A continuación, se presenta la interconexión de los PIC’s 16C54 hasta el 16C58. Puede observarse que las líneas RA0 a RA3, RB0 a RB7 y RC0 a RC7 constituyen las líneas de puertos de entrada y salida.
Cada conexión tiene su propia función específica
INICIO
210
5.4 Organización de las memorias de los microcontroladores PIC
de la gama básicaSabemos que los microcontroladores de la gama básica tienen un mismo conjunto de instrucciones. Sin embargo, debido a las diferencias que hay entre cada modelo, en cuanto a las capacidades de memoria y números de líneas de entrada y salida, se deberá tomar esto en consideración para realizar la programación.
Los 16C54 y 16C55, tienen un contador de programa (PC) de 9 bits, capaz de ubicar al programa, en una de las 512 direcciones del espacio de memoria que se utiliza la palabra de 12 bits.
INICIO
PC<8:0>
NIVEL DE PILA 1NIVEL DE PILA 2
MEMORIA DE
PROGRAMA
VECTOR DE INICIALIZACIÓN
000h
0FFh100h
1FFh
Espaciopara
memoriadel
usuario
CALL, RERLW9
Memoria de programa de los PIC16C54 y 55
211
Organización de las memorias de los microcontroladores PIC16C56, 57 y 58
PC<9:0>
NIVEL DE PILA 1NIVEL DE PILA 2
MEMORIA DE
PROGRAMA(página 0)
VECTOR DE INICIALIZACIÓN
000h
0FFh100h1FFh
Espaciopara
memoriadel
usuario
CALL, RERLW10
MEMORIA DE
PROGRAMA(página 1)
200h2FFh300h
3FFh
Memoria de programa del PIC16C56
PC<10:0>
NIVEL DE PILA 1NIVEL DE PILA 2
MEMORIA DE
PROGRAMA(página 0)
VECTOR DE INICIALIZACIÓN
000h
0FFh100h
1FFh
Espaciopara
memoriadel
usuario
CALL, RERLW11
MEMORIA DE
PROGRAMA(página 1)
200h
2FFh300h3FFh400hMEMORIA
DEPROGRAMA(página 2)MEMORIA
DEPROGRAMA(página 3)
4FFh500h
6FFh700h
7FFh
Memoria de programa del PIC16C57 y 58
5FFh600h
INICIO
212
5.5 Registro STATUS
R = bit de lectura W = bit de escritura -N = Valor después de la inicialización.
Bit 7: PA2: No se usa para la serie 16C5X
Bit 6-5: PA1-PA0: Página seleccionada de la memoria de programa (PIC 16C56/57/58)
00 = Pág. 0 = (000h - 1FFh)01 = Pág. 1 = (200h - 3FFh)10 = Pág. 2 = (400h - 5FFh) PIC16C57/5811 = Pág. 3 = (600h - 7FFh) PIC16C57/58
R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
PA2 PA1 PA0 TO PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INICIO
Hemos visto en la descripción del PIC16C54 que el registro STATUS se ubica en la dirección 03h en la memoria de datos. Este registro tiene unos bits que indican los estados de las operaciones lógicas y aritméticas, la detección del tipo de inicialización y la selección de página de la memoria de programa.
A continuación se presentan los bits del registro STATUS y más abajo, la explicación de los bits PA1 y PA0, los cuales son los bits que se utilizan para la selección de página de la memoria de programa.
213
Cuando una instrucción es ejecutada, el contador de programa (PC) contendrá la dirección de la próxima instrucción a ejecutarse. El valor del PC se incrementa en uno por cada ciclo de instrucción, al menos que la instrucción cambie el valor del PC.
Para una instrucción GOTO, los bits 8 a 0 del PC se incluyen en dicha instrucción. El registro PCL toma los bits 7 a 0. Véase figura a continuación:
5.6 Registro Contador de Programa PC
PIC16C56
7 PA0
STATUS
0
9 8 7 0
PC PCL
Palabra de Instrucción
8 7 0
PC PCL
Palabra de Instrucción
PIC16C54/55
PIC16C57/58
10 9 8 7 0
PC PCL
Palabra de Instrucción2
7
PA1 PA0
STATUS
0
INICIO
214
Para una instrucción CALL, o alguna instrucción donde el PCL es el destino, los bits 7 a 0 del PC se obtienen del código de la instrucción. Sin embargo, el bit 8 del PC no viene del código de la instrucción, sino que es puesto en cero.
Algunas de las instrucciones donde el PCL es el destino, o se le modifica el contenido, son: MOVWF PCL, ADDWF PCL y BSF PCL, 5. Recuerda que la dirección del PCL es la 2
Para los PIC16C56, 16C57 y 16C58, se debe agregar un número de página. El bit 5 del registro STATUS se transfiere al bit 9 del PC para el PIC16C56, y los bits 5 y 6 del registro STATUS se transfieren respectivamente a los bits 9 y 10 del PC para los PIC16C57 y PIC16C58. Véase figura a continuación.
INICIO
215
8 7 0
PC PCL
Palabra de Instrucción
PIC16C54/55
Inicialización A “0”
7 PA0
STATUS
0
9 8 7 0
PC PCL
Palabra de Instrucción
Inicialización A “0”
PIC16C56
PIC16C57/58
10 9 8 7 0
PC PCL
0 Palabra de Instrucción
2
7PA1 PA0
STATUS
0
INICIO
216
El contador de programa (PC) es cargado en la última dirección de la memoria de programa cuando hay una inicialización (RESET), lo cual significa que la dirección del PC se coloca al finalizar la dirección de la última página, es decir al valor del vector inicialización.
Los bits de la página preseleccionada en el registro STATUS, son borrados después de una inicialización, lo cual significa que se preselecciona la página 0. Por consiguiente, después de la inicialización, una instrucción GOTO en la posición del vector inicialización, hará que el programa salte a la página 0.
Si ocurre una inicialización inadecuada (por ejemplo una baja de tensión en la alimentación), los bits de preselección de página, en el registro STATUS, pueden no ser borrados. Por consiguiente, es una buena práctica de programación borrar el registro STATUS (CLRF STATUS) en la posición del vector de inicialización para que después el PC se coloque en la posición 000h.
Efectos de la inicialización
INICIO
217
Consideraciones para las páginasen los PIC 16C56/57/58
Si el contador de programa está apuntando a la última dirección de una
página seleccionada, cuando éste se incremente, hará que el programa
continúe hacia la página siguiente. Sin embargo, los bits de la página
preseleccionada en el registro STATUS, no se actualizarán. Por
consiguiente, la próxima instrucción GOTO, CALL o de modificación del
PCL, enviará al programa a la página especificada por los bits
preseleccionados de página (PA0 o PA1).
Por ejemplo, una instrucción NOP en la posición 1FFh (página 0),
incrementa el PC a 200h (página 1). Un GOTO xxh en la posición 200h,
hará que el programa salte a la posición xxh en la página 0 (asumiendo
que PA1: PA0 valen 0). Para prevenir esto, los bits de la página
preseleccionada deben actualizarse por medio del control del
programa.
INICIO
218
La memoria de programa está seleccionada en páginas de 512 palabras de 12 bits. Cada posición en una página, puede ser accedida directamente cuando se va a ejecutar un salto de dirección por medio de las instrucciones: CALL, RETLW o GOTO.
Para los dispositivos con capacidad de más de 512 palabras, se utilizan los bits de selección de página PA1 y PA0, los cuales se encuentran en el STATUS.
En la memoria de datos se ubican los registros de funciones especiales y los de propósitos generales. En las siguientes páginas, podrás observar la ubicación de los registros en los microcontroladores PIC de la serie 16C5X. En ellos encontrarás que los dispositivos de 28 terminales, tienen al puerto C ubicado en la posición 07h, que corresponde a un registro de propósito general para los microcontroladores de 18 terminales. Por otro lado, observarás que los PIC16C57 y PIC16C58 tienen una memoria RAM de mayor capacidad, y por tanto el acceso se hace por medio del registro FSR, ya sea de manera indirecta a través del registro INDF o directa, por medio de los bits 6 y 5 del registro FSR, ya que éstos indican el banco de memoria a utilizar, que está especificado de acuerdo a su valor en binario.
ecuerda
INICIO
219
5.7 Memoria de datos PIC16C54, 55 y 56
INDF(1)
TMROPCL
STATUS
FSRPORTA
PORTB
00h01h
02h
03h
04h
05h
06h
07h
0Fh10h
1Fh
REGISTROS DE
PROPÓSITOSGENERALES
MEMORIA DE DATOS DE LOS PIC16C54 Y 56
MEMORIA DE DATOS DEL PIC16C55
INDF(1)
TMROPCL
STATUS
FSRPORTA
PORTB
00h01h
02h
03h
04h
05h
06h
07h
0Fh10h
1Fh
REGISTROS DE
PROPÓSITOSGENERALES
PORTC
(1) El registro INDF, no corresponde a una posición física, sino al registro cuya dirección está contenida en el registro FSR.
INICIO
220
Memoria de datos PIC16C57
INDF(1)
TMROPCL
STATUSFSR
PORTAPORTB
00h01h02h03h04h05h06h07h
08h
0Fh
REGISTROS DE
PROPÓSITOSGENERALES
PORTC
00 01 10 11
REGISTROS DE
PROPÓSITOSGENERALES
10h
1Fh
FSR<6:5>Dirección
de registro
REGISTROS DE
PROPÓSITOSGENERALES
30h
3Fh
REGISTROS DE
PROPÓSITOSGENERALES
50h
5Fh
REGISTROS DE
PROPÓSITOSGENERALES
70h
7Fh
20h 40h 60h
Este Mapa de Direccionesretoma a las direccionesdel Banco 0
2Fh 4Fh 6Fh
Banco 0 Banco 1 Banco 2 Banco 3
MEMORIA DE DATOS DEL PIC16C57
INICIO
221
Memoria de datos PIC16C58
INDF(1)
TMROPCL
STATUSFSR
PORTAPORTB
00h01h02h03h04h05h06h07h
0Fh
REGISTROS DE
PROPÓSITOSGENERALES
00 01 10 11
REGISTROS DE
PROPÓSITOSGENERALES
10h
1Fh
FSR<6:5>Dirección de registro
REGISTROS DE
PROPÓSITOSGENERALES
30h
3Fh
REGISTROS DE
PROPÓSITOSGENERALES
50h
5Fh
REGISTROS DE
PROPÓSITOSGENERALES
70h
7Fh
20h 40h 60h
Este Mapa de Direccionesretoma a las direccionesdel Banco 0
2Fh 4Fh 6Fh
Banco 0 Banco 1 Banco 2 Banco 3
MEMORIA DE DATOS DEL PIC16C58
INICIO
6.1.- Introducción
6.2.- Familia de los microcontroladores PIC16F8X
6.3.- El PIC16F84A
6.4.- Nuevas instrucciones de los PIC de la gama media
6.5.- Organización de la memoria del PIC16F84A
6.6.- El registro STATUS
6.7.- Manejo de Interrupciones en el PIC16F84A
6.8.- La Memoria EEPROM
6.9.- Registro Contador de Programa PC
6.10.- El Registro STACK (Pila)
6.11.- Los temporizadores y algo más de PORTB
6.12- Los Bits de configuración
TEMA VI
Microcontrolador PIC16F84A
INICIO
223
Objetivos Terminales:
• Establecer las diferencias de software y hardware entre los microcontroladores de la gama básica y los de la gama media.
• Explicar la arquitectura del microcontrolador PIC16F84.
• Diseñar circuitos básicos con microcontroladores de la gama media.
INICIO
224
6.1- INTRODUCCIÓN
Los microcontroladores de la gama básica son útiles para aplicaciones sencillas, en donde se realiza una tarea a la vez. Ejemplos de estas aplicaciones, pueden ser los relojes digitales, las combinaciones de cajas fuertes y cerraduras, medidores de frecuencia, tacómetros y algunos circuitos básicos de control.
Cuando una aplicación se hace más compleja, se podría añadir circuitos externos a estos microcontroladores; sin embargo, la idea de utilizar estos dispositivos consiste en reducir considerablemente el número de componentes, y por tanto, el espacio y el consumo de energía en los circuitos de diferentes aplicaciones. Por ejemplo. Suponiendo que se necesita diseñar un circuito que sea capaz de controlar un sistema con varias señales analógicas a la vez; si utilizáramos un microcontrolador de la gama básica, tendríamos que añadir al circuito: un convertidor analógico a digital, uno o más multiplexers analógicos, posiblemente se deba agregar más memoria RAM, se necesitaría utilizar una EEPROM externa para guardar constantes del sistema y constantes de calibración, y así el circuito se haría bastante complejo, de tal forma, que quizás sea más indicado utilizar un microprocesador que un microcontrolador.
Como se ha visto en la primera sección de esta guía, existen microcontroladores que internamente tienen los elementos que nombramos anteriormente, y por lo tanto hay la posibilidad de diseñar equipos con cierta complejidad utilizando un solo microcontrolador. En esta sección se verán los microcontroladores de la gama media a partir del PIC16F84.
INICIO
225
6.2- Familia de la serie PIC16F8X
INICIO
Producto Memoria. de programa EEPROM RAM Líneas Encapsulado Canales Comparadores PWM Temporizadores Puertos Veloc. ICSP BOR/ CCP/ Otras características MCU FLASH Bytes Bytes E/S A/D C Analógicos 16bits y WDT seriales Máxima PBOR ECCP
A continuación, se presenta la familia PIC16F8X con sus características principales:
226
6.3- El PIC16F84A
Inicialmente se hará una descripción del PIC16F84A, ya que éste es uno de los más sencillos de la familia de los microcontroladores de la serie PIC16F8X. En principio se establecerán las diferencias con respecto al microcontrolador PIC16C54, luego se harán unos ejemplos de aplicación con este microcontrolador.
El PIC16F84A es un microcontrolador Microchip de la gama media que presenta las siguientes características básicas, las cuales se comparan con las del PIC16C54:
Microcontrolador PIC16F84A PIC16C54JW
Memoria de Programa 1Kx14 tipo Flash 0,5Kx12 tipo EPROM
Memoria de datos 68 bytes tipo RAM
64 bytes tipo EEPROM
25 bytes tipo RAM
Manejo de interrupciones 4 0
Número de líneas de E/S digitales
13 12
Número de temporizadores 2: TMR0 y WDT 2: TMR0 y WDT
INICIO
227
Diferencias entre los microcontroladores de la gama básica y los de la media
Después de programar y utilizar un PIC de la gama básica, notarás que no hay mucha diferencia en la programación con respecto a los PICs de la gama media. Algo importante que debes saber, es que podrás utilizar sin ningún problema el MPLAB para los PIC de la gama media, tal como se sugirió al ejecutar un programa editado para el PIC16C54 en un PIC16F84. En otras palabras, si editas un programa para un PIC de la gama básica, éste se ejecutará en un PIC de la gama media. Sin embargo, existen algunas diferencias que debes tomar en cuenta al programar los PIC de la gama media.
En primer lugar la longitud de las palabras de instrucción en los PICs de la gama media es de 14 bits, en comparación con los 12 bits de la gama básica. Esto significa que se podrá obtener ciertas ventajas en la programación. Por otro lado, los registros TRIS y OPTION, tendrán una dirección definida, y por lo tanto, las instrucciones asociadas a ellas cambian. A pesar de que en un programa, estas instrucciones se pueden ensamblar sin problemas, se recomienda sustituirlas por las instrucciones “MOVWF TRISX”, donde X es el puerto que se desea configurar (A, B, etc.) y “MOVWF OPTION_REG”.
Una ventaja que aparece en el manejo de instrucciones en los microcontroladores de la gama media, es que ahora se podrá acceder directamente a 128 registros de la memoria RAM con una sola instrucción, sin necesidad de seleccionar bancos de memoria, a diferencia de los PICs de la gama básica, en los cuales sólo se tenía acceso directo a 32 registros de la RAM.
Otra ventaja importante de los PICs de la gama media, es que ahora se cuenta con ocho niveles de subrutinas, a diferencia de dos en los PICs de la gama básica.
INICIO
228
6.4 Nuevas instrucciones de los PICs de la gama media
Es importante considerar que existen cuatro nuevas instrucciones en los PICs de la gama media. Dos de ellas permiten hacer operaciones aritméticas con valores constantes, y las otras dos se utilizan para retornos de subrutinas e interrupciones. Si eliminamos las instrucciones TRIS y OPTION, significa que el conjunto de instrucciones de los microcontroladores PIC de la gama media suman un total de 35.
Las nuevas instrucciones y el grupo al que pertenecen, se presentan a continuación:INSTRUCCIONES ARITMÉTICAS
ADDLW K ; Suma W con K, donde K es constante y el resultado va a W. SUBLW K ; Resta K menos W, donde K es un valor constante.
INSTRUCCIONES DE SALTO, se realizan en dos ciclos porque ejecutan un salto hacia la dirección de retorno.
RETFIE ; Retorno y habilitación de interrupción, el PC toma el valor del TOS (Pila) RETURN ; Retorno de subrutina, el PC toma el valor del TOS (Pila)
Cambios en las INSTRUCCIONES DE CONTROL
OPTION MOVWF OPTION_REG ; Las posiciones de estos registros están enTRIS f MOVWF TRISF ; el banco 1 de la RAM (BSF STATUS,RP0)
INICIO
229
6.5- Organización de la Memoria del PIC16F84A
Debido a que los microcontroladores de la gama media tienen una mayor cantidad de funciones, éstas se configuran por medio de registros. Fíjate cómo en los microcontroladores de la gama básica encontrábamos registros de funciones especiales para: INDF, TMR0, PCL, STATUS, FSR, PORTA y PORTB; dependiendo del número de terminales, también podía aparecer PORTC. Ahora hay que agregar los registros OPTION, TRISA y TRISB (y otros PORT y otros TRIS según la cantidad de puertos). Por otro lado existen otros registros de control, que para el PIC16F84A, se resumen en la tabla de la página siguiente.
En primer lugar, se podrá observar la coincidencia con algunas direcciones de los registros de los microcontroladores de la gama básica.
En segundo lugar, se puede ver que las posiciones de los registros TRISA y TRISB están en las direcciones 85h y 86h respectivamente, por otro lado el registro OPTION está en la dirección 81h. Mientras los primeros registros mencionados pertenecen al banco 0 de la memoria RAM, estos últimos pertenecen al banco 1, es decir, hay que considerar en las instrucciones, a cuál banco se está señalando, ya que en la palabra de instrucción de los PIC de la gama media, sólo podemos acceder de manera directa a 128 posiciones de la RAM. Si estamos en el banco 0, podemos acceder desde la posición 00h hasta la 7Fh, y si estamos en el banco 1, desde la posición 80h hasta la 0FFh. La selección del banco se hará por medio del bit RP0 del registro STATUS.
Finalmente veremos que hay un grupo de registros que son nuevos para nosotros, y que serán explicados más adelante.
INICIO
230
Ubicación de los registros del microcontrolador PIC16F84A
INICIO
Banco 0 Banco 1
En la siguiente tabla, se presentan las direcciones y los nombres de los registros del PIC16F84A.
Notas:
(1) Al igual que el PIC16C54, el registro indirecto “INDF”, no corresponde a una posición fija en la RAM; al acceder a ese registro, se lee o escribe en el registro señalado en la dirección señalada por el registro FSR.
(2) Los espacios de la tabla en color gris, corresponden a direcciones no implementadas.
231
Asignación de bits en cada registro
INICIO
Dirección NombreValor después de encender
Valor después de otra inicialización
232
Como en el caso de los microcontroladores de la gama básica, este registro está ubicado en la dirección 03h de la memoria de datos, y contiene los bits de estado de la Unidad Lógica y Aritmética, el estado de la inicialización (RESET), y los bits de selección de los bancos de registros de la memoria de datos.
Los bits de STATUS de los PIC de la gama básica y el PIC16F84A tienen las mismas funciones, con la excepción de que los bits de selección de página en los microcontroladores de la gama básica se cambian por los de selección de banco de los registros de la memoria de datos. Observa las diferencias en el tema 3.
6.6- Registro STATUS
R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
IRP RP1 RP0 TO PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
R = bit de lectura W = bit de escritura -N = Valor después de la inicialización.
Bit 7: IRP: Se utiliza para acceso indirecto 0-> 00h a 0ffh. 1-> 100h a 1ffh (nota: IRP y RP1 no se utilizan en los PIC16F84, por tanto se hacen iguales a 0).
Bit 6-5: RP1-RP0: Selección de banco de la memoria de datos00 = Banco 0 = (00h - 7Fh)01 = Banco 1 = (80h - 0FFh)
10 = Banco 2 = (100h - 17Fh) RP1 no se utiliza en los PIC16F84A 11 = Banco 3 = (180h - 1FFh)
INICIO
233
6.7- Manejo de las Interrupciones en el PIC16F84A
Muchas veces cuando estás desarrollando una actividad, como por ejemplo una tarea para entregarla al día siguiente, encuentras momentos en que necesitas interrumpir tus labores, ya sea para comer, para descansar, para atender una llamada telefónica o para alguna otra cosa. Algo similar ocurre con los programas que se ejecutan en los microcontroladores. Un programa es una secuencia de instrucciones que ejecutan una actividad en el microcontrolador. Si ese programa se encarga de leer un dato en memoria, luego lo muestra en un indicador numérico, y después vuelve a comenzar, para que cíclicamente ejecute esa actividad, entonces esa actividad podría ser “el programa principal”. Supongamos que ese dato que se muestra corresponde a la temperatura de una habitación. Si se quiere leer la señal que corresponde a la lectura de temperatura y llevarla a la posición de memoria que el programa principal busca y lo lleva al indicador, se necesitará interrumpir este programa principal por un momento, ejecutar una rutina de lectura de la señal de temperatura y almacenamiento del dato de temperatura y luego volver al programa principal en el punto donde fue interrumpido, sin que se pierda los valores de los registros que utiliza el programa principal, especialmente el registro W, el registro STATUS y cualquier otro registro que se modifique en la rutina de interrupción.
INICIO
234
Entonces, se puede definir las interrupciones, como desviaciones del flujo de control del programa originadas asíncronamente mediante diversas causas que pueden ser externas al sistema, tales como el cambio de nivel de una entrada; o internas, tal como el desbordamiento en la cuenta de un temporizador.
La manera de ejecutar una interrupción, es similar al llamado de una subrutina con la instrucción CALL, ya que se almacena la dirección del PC de la siguiente instrucción a ejecutar, en el registro PILA, con la diferencia de que en la interrupción, el programa salta a una posición de la memoria de programa llamada “vector de interrupción”.
AUTOR: César ÁlvarezDISEÑO INSTRUCCIONAL:M. Sánchez y C. Álvarez
100
0
20
40
60
80
Programa Principal:
Lee posición de la memoria
Convierte a 7 segmentos
Escribe valor en el indicador
Interrupción:
Lee la señal
Convierte a digital
Guarda en memoria
INICIO
235
Fuentes de interrupción en el PIC16F84A
En el PIC16F84A, el vector de interrupción está ubicado en la dirección 4h de la memoria de programa. Esto significa que en esa posición comienza la rutina de interrupción, y por lo tanto, el programa principal no debería tener nada escrito allí.
Debemos considerar lo siguiente acerca de las interrupciones en el PIC16F84A:
• Una interrupción puede ocurrir debido a diversas causas. Para el PIC16F84A estas causas pueden ser:
• Una activación en la entrada RB0/INT
• Un desbordamiento en la cuenta del temporizador 0 (TMR0).
• El cambio de estado de uno de los 4 terminales de mayor peso del puerto B.
• La finalización de la escritura en la EEPROM.
• Cuando se atiende una interrupción, el microcontrolador deshabilita automáticamente cualquier otra interrupción que pueda ocurrir, al colocarse en 0 el bit GIE del registro INTCON. Al salir de la rutina de interrupción, por medio de la instrucción RETFIE se vuelve a habilitar automáticamente la atención de alguna otra interrupción.
• Las interrupciones se pueden habilitar o deshabilitar por software al escribir un 1 o un 0 en el bit GIE del registro INTCON.
• Cada interrupción se puede habilitar o deshabilitar individualmente según los bits de control del registro INTCON.
INICIO
236
El registro INTCONControl de interrupciones
La mayor parte de las indicaciones de las fuentes de interrupción y las habilitaciones de interrupción, se encuentran en el registro INTCON. En el caso de las habilitaciones de las interrupciones, un 1 indica habilitado y un 0 indica deshabilitado. Para el caso de las indicaciones, un 1 señala que ocurrió el evento, es decir que podrá interrumpir si hay habilitación y un 0 que no ha ocurrido nada.
• GIE. Habilitación global de interrupciones. Si GIE = 0 no se acepta ninguna de las interrupciones. Si GIE = 1, se aceptan solamente las interrupciones habilitadas.
• EEIE. Habilitación de interrupción por finalización de la escritura en la EEPROM.
• T0IE. Habilitación de interrupción por desbordamiento de TMR0 (Temporizador 0).
• INTE. Habilitación de interrupción por la activación del terminal RB0/INT.
• RBIE. Habilitación de interrupción por cambio de estado en RB7, RB6, RB5 ó RB4.
• T0IF. Indicador de un desbordamiento en TMR0.
• INTF. Indicador de la activación en el terminal RB0/INT.
• RBIF. Indicador de un cambio de estado en RB7, RB6, RB5 ó RB4.
INICIO
INTCONGIE EEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
237
Guardar W y STATUS en la rutina de interrupción
En el momento de ejecutar una rutina de interrupción, es sumamente importante guardar los registros W y STATUS, además de algún otro que pueda ser utilizado en el programa principal y que la rutina de interrupción los modifique.
En los PICs de la gama media esta labor no es tan directa como en otros microcontroladores, los cuales utilizan las instrucciones PUSH y POP. Aquí hay que tomar en cuenta el banco seleccionado por la RAM en el programa principal, el cual al interrumpir al microcontrolador, no sabemos cuál está seleccionado. En el caso del PIC 16F84A, los registros de propósitos generales que se acceden en el banco 0, corresponden a la misma dirección en el banco 1, de esta manera bastaría con salvar los registros W y STATUS como se muestra a continuación:
Rut_interr movwf W2 ; se guarda el valor de w en W2. swapf STATUS,w ; se utiliza esta instrucción, ya que movf afecta al bit Z de STATUSmovwf STATUS2 ; Se guarda el STATUS en STATUS2 con los nibbles intercambiados • ; Se ejecuta la rutina de interrupción • •swapf STATUS2,w ; se recupera el valor del STATUS con los nibbles en la posición originalmovwf STATUSswapf W2,f ; se toma el valor de W2 con los nibbles intercambiadosswapf W2,w ; se recupera el valor de w. retfie ; Retorno de la interrupción
INICIO
238
Ejemplo de interrupción por TMR0
include "P16F84A.INC" ; Incluye los símbolos del PIC16F84A • ; Definición de símbolos, tales como: segundo, minuto, hora, día, etc.org 0 ; Dirección inicial del programa en el microcontroladorgoto prepara ; En prepara se establece la selección de TMR0, interrupciones, puertos, etc.org 4 ; Dirección donde comienza la rutina de interrupción
interrupt btfsc INTCON,T0IF ; Evalúa si la interrupción fue del TMR0goto tmr0full ; si es 1 atiende rutina de TMR0btfsc eecon1,eeif ; Evalúa si la interrupción fue de la EEPROM •
tmr0full movwf W2 ; se guarda el valor de w en W2, para recuperarlo al retornoswapf STATUS,wmovwf STATUS2 ; Se guarda el STATUS en STATUS2, para luego recuperarlomovlw d'61‘movwf TMR0 ; carga el valor 61 decimal para que se ejecuten 195 ciclos de tmr0incf segundo,f ; Se incrementan los segundoscall ajuste ; En ajuste se cambia los incrementos a la bases numéricas adecuadasswapf STATUS2,w ; se recupera el valor del STATUSmovwf STATUSswapf W2,fswapf W2,w ; se recupera el valor de wbcf INTCON,T0IF ; se borra el bit de interrupción de TMR0retfie ; Se regresa al programa principal. En la rutina ajuste, se pueden hacer • ; todos los ajustes para llevar la cuenta del tiempo real
prepara movlw b'00000110‘ ; Selección del preescalador a TMR0 y división por 128movwf TMR0 ; Se carga a TMR0 con un valor diferente de 0 ó 0FF para no interrumpir aúnbsf STATUS,RP0 ; Selecciona banco 1 para acceder a los registros OPTION y TRISmovwf REG_OPTION ; Carga al registro OPTION la configuraciónmovlw b’11100000 ; Se habilita interrupción global, la de TMR0 y la EEPROMmovwf INTCONT ; Después de esta instrucción, continúa otras inicializaciones y el programamovlw b’xxxxxxxx’ ; Palbra de configuración del puerto Amovwf TRISA ; Configura puerto A • • • • •
INICIO
239
6.8- La memoria EEPROM
En muchos equipos se hace necesario el uso de datos que deben mantener su valor después de haber quitado la energía del circuito. Un ejemplo de esto lo podemos ver en equipos que necesiten calibración. En estos equipos el ajuste de ciertos parámetros se puede hacer por medio de resistencias ajustables o potenciómetros, los cuales pueden utilizarse para la calibración del cero, la ganancia, la linealidad, los parámetros de control y algunos otros más. Si se dispone de una memoria que mantenga los datos después de apagarse el equipo, estos potenciómetros se hacen innecesarios, ya que estos factores de ajuste se pueden grabar en esta memoria y ser llamados por medio de un simple programa que aproveche éstas y otras constantes para poder introducirlas en ecuaciones matemáticas que compensen las calibraciones. Esto supone una reducción del espacio en el circuito; una mayor seguridad para la realización de los ajustes, ya que se puede incluir una clave secreta que también puede ser grabada en la EEPROM para la solicitud del ajuste; también se puede lograr ajustes con mucha mayor precisión y en un tiempo mucho más corto.
El uso de una EEPROM tiene semejanzas con el de la RAM; sin embargo, hay que tomar en cuenta algunas consideraciones que se mencionarán a continuación:
• El tiempo de escritura de una EEPROM está en el orden de los 10mSeg.
• El número de grabaciones en la EEPROM está limitado entre 105 y 107 veces.
• Se debe utilizar un código especial para la grabación de datos, para evitar el borrado accidental de la EEPROM en el momento de quitarle la alimentación.
INICIO
240
Explicación de los registros relacionados con la EEPROM
Para acceder a las direcciones de la EEPROM en el PIC16F84A, se deberá utilizar los registros: EEADR, EEDATA, EECON1 y EECON2. Las direcciones son: 08h y 09h en el banco 0 y, 88h y 89h en el banco 1 respectivamente.• EEADR: Es el registro de 8 bits que tiene la dirección del dato de la
EEPROM. El PIC16F84, sólo puede acceder a 64 bytes de la EEPROM, por lo tanto estas direcciones están comprendidas desde la dirección 0h hasta la 3Fh.
• EEDATA: Es el registro de 8 bits en el cual se escribe o se lee el valor del dato a guardar en la EEPROM en la dirección que está en el registro EEADR.
• EECON1: Este registro contiene los bits de control de las operaciones en la EEPROM:• RD, Bit 0 (Lectura). Se escribirá 1 cuando se va a realizar un ciclo de
lectura de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WR, Bit 1 (Escritura). Se enviará 1 cuando se va a realizar un ciclo de escritura de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WREN, Bit 2 (Habilitación de escritura). Si se escribe 1, se permitirá la escritura de la EEPROM. Si se coloca 0, no permitirá la escritura en la EEPROM.
• WRERR, Bit 3 (Indicador de error). Se lee un 1 si hubo error en la escritura debido a una inicialización del PIC. Un 0 indicará que la operación se hizo correctamente.
• EEIF, Bit 4 (Indicador de finalización de escritura). Un 1 indicará que se completó el ciclo de escritura. Se deberá colocar en 0 por medio del programa.
• EECON2: En este registro se coloca una secuencia clave para evitar grabaciones accidentales.
INICIO
241
Escribir un dato en la EEPROM
El registro EECON2 se utiliza para colocar el código de control en la escritura de datos de la EEPROM y evitar una grabación accidental de la misma. Para ello, después de habilitar la escritura de la EEPROM al poner en 1 el bit WREN de EECON1, se deberá escribir en EECON2 el código 55h y luego el código AAh; finalmente, para grabar el dato que está en el registro EEDATA en la dirección marcada por el registro EEADR que fija la dirección de la EEPROM, se deberá escribir un 1 en el bit WR del registro ECON1. Un programa propuesto que realiza la escritura de un byte en la EEPROM es el que se presenta a continuación:
BCF STATUS, RP0 ; En el banco 0 están los registros EEADR y EEDATAMOVLW DIRECCION ; DIRECCION indica la posición donde se guardaráMOVWF EEADR ; el dato en la EEPROMMOVLW DATO ; DATO es el valor que irá a la EEPROMMOVWF EEDATA ; BSF STATUS, RP0 ; Selecciona banco 1 de la RAMBCF INTCON, GIE ; Deshabilita interrupciones al escribir EEPROMBCF EECON1, EEIF ; Se borra el bit indicador de finalización de escritura
. BSF EECON1, WREN ; Habilita escritura en la EEPROMMOVLW 55h ; MOVWF EECON2 ; Escribe código 55h en EECON2 MOVLW 0AAh ; (Códigos de protección para no grabar accidental-MOVWF EECON2 ; mente un dato) Escribe código AAH en EECON2BSF EECON1,WR ; Comienza la grabación del datoBSF INTCON,GIE ; Habilitación global de interrupciones
INICIO
242
Lectura de un dato en la EEPROM
Durante la sección del programa que escribe en la EEPROM se recomienda deshabilitar las interrupciones para que el proceso de escritura se realice correctamente. Después de iniciarse el proceso de escritura de la EEPROM, se podrá habilitar las interrupciones por medio de la instrucción “BSF INTCON, GIE”. En la escritura de la EEPROM el bit WR de EECON1 se colocará en 0 automáticamente. Tú podrás determinar cuándo termina el ciclo de escritura al leer un 1 en el bit EEIF del registro EECON1. Después de esto se deberá colocar el bit WREN en 0 para prevenir un borrado accidental de la EEPROM.
Trata de volver a escribir el programa anterior como una rutina, de manera que la dirección y el dato provengan de registros y no de valores constantes.
Para leer un dato en la EEPROM se podrá utilizar la sección de programa que se muestra a continuación:
BCF STATUS, RP0 ; Selecciona banco 0 para EEADRMOVLW DIR_LECT ; Dirección de lectura en WMOVWF EEADR ; Dirección de lectura en EEADR BSF
STATUS, RP0 ; Selecciona banco 1 para EECON1 BSF EECON1, RD ; Lectura de la EEPROM BCF STATUS, RP0 ; Selecciona banco 0 para EEDATA MOVF
EEDATA, W ; Coloca dato leído de EEPROM en W
Una buena práctica para escribir un dato en la EEPROM, consiste en verificar si ese dato ha sido grabado correctamente mediante la lectura del dato escrito y comparación con él mismo por medio de una resta y al evaluar el bit Z del registro STATUS. INICIO
243
Vimos que en los PIC16C5X los 8 bits de menos peso del contador de programa ocupan la posición 2h de la memoria RAM, y los bits de mayor peso se dividen en páginas y se encuentran en el registro STATUS. En el caso de los PICs de la gama media los bits de mayor peso están en los 5 bits de menor peso del registro PCLATCH que está ubicado en la posición 0Ah u 8Ah. Debido a que el PIC16F84A sólo tiene acceso a 1024 direcciones de la memoria de programa (000h a 3FFh), se necesitan 10 bits, de los cuales son efectivos los ocho del PCL y los dos bits menos significativos del PCLATCH.
En las instrucciones GOTO y CALL se incluyen 11 bits para cargar la dirección del PC, por tanto se puede tener acceso a 2048 posiciones. Como la capacidad del PIC16F84A es 1024 bits no tiene sentido hacer divisiones por páginas.
6.9 Registro contador de programa
PIC16F84
12 11 10
9 8 7 0
PC PCL
Palabra de Instrucción27 4
PCLATCH 4-3
PCLATCH
0
11
INICIO
244
Para aquellas instrucciones donde el PCL es el destino, en los bits 7 a 0 del PC se obtienen del código de la instrucción. Los bits superiores provienen del PCLATCH.
Algunas de las instrucciones donde el PCL es el destino, o se le modifica el contenido, son: MOVWF PCL; ADDWF PCL; BSF PCL, 5; etc. Recuerda que la dirección del PCL es la 2h
PIC16F84
12 11 10 9 8 7 0
PC PCL
Resultado de la ALU5
7
PCLATCH4-0
PCLATCH
0
INICIO
El vector de inicialización del PIC16F84A está en la dirección 3FFh, esto significa que la primera instrucción del programa se debe colocar en esa dirección.
245
El registro STACK guarda las direcciones de retorno de las rutinas que se llaman por medio de la instrucción CALL o una interrupción, y carga la dirección de retorno al PC con la instrucción RETLW, RETURN o RETFIE. la longitud de palabra de la pila es la misma que la del PC. La pila tiene ocho niveles, a diferencia de los dos niveles que tienen los microcontroladores de la gama básica:
Una instrucción CALL o una llamada de interrupción coloca el contenido del nivel 7 de la pila, en el nivel 8, el nivel 6 lo coloca en el 7 y así sucesivamente hasta colocar el valor del contador del programa actual, incrementando en uno, en el nivel 1 de la pila. Si se llama a más de ocho subrutinas en una misma secuencia, únicamente las direcciones de las ocho más recientes serán almacenadas.
Una instrucción RETLW, RETURN o RETFIE cargará el contenido del nivel 1 de la pila al PC y el del nivel 2 al nivel 1 y así sucesivamente, hasta colocar el nivel 8 al 7. Si más de ocho instrucciones entre RETLW, RETURN o RETFIE se ejecutan, la pila se llenará con la dirección almacenada previamente en el nivel 8.
6.10 Registro STACK (pila)
INICIO
246
6.11 Los Temporizadores y algo más de PORTB
El PIC16F84A, utiliza, al igual que los PIC de la gama básica el temporizador TMR0 y el WDT, los cuales, a su vez se programan según el registro OPTION.
El registro OPTON del PIC16F84 agrega 2 bits que en los PIC de la gama básica no están asignados. Éstos son: RBPO# (Bit 7) y INTEDEG (Bit 6). Si RBPO# = 0, conecta resistencias de valor alto a Vdd (Pull up). En el caso de INTEDEG, éste determina el tipo de transición que llevará la interrupción externa (RB0): 1=> Transición de subida, 0=> Transición de bajada.
Los circuitos asociados a estos temporizadores son iguales a los de los PIC de la gama básica, con la diferencia de que si se utiliza el TMR0 como temporizador, la entrada RA4/TOCKI se convierte en una línea adicional del puerto A.
En el caso de los PIC16F84A la ubicación del registro OPTION, en la memoria de datos, se encuentra en la posición 81H (banco 1).
Una posibilidad que ofrece los PIC de la gama media, es que cuando se detecta un desbordamiento en el contador, se genera una señal de interrupción, la cual se puede verificar en el bit TOI, el cual es el bit 2 del registro INTCON. Esta interrupción se habilita al colocar un “1” al bit TOIE, que es el bit 5 del registro INTCON
Si deseas repasar el tema de los temporizadores de los PIC de la gama básica, selecciona el menú siguiente:
TMR0 WDT OPTION INTCON
INICIO
247
6.12 Los Bits de Configuración
Al igual que los PICs de la gama básica, los bits de configuración del PIC16F84A se acceden sólo en el momento de grabar el programa en el microcontrolador.
Los bits de configuración WDT, FOSC1 y FOSC0 del PIC 16F84 coinciden en lógica y posición con los de los PICs de la gama básica (Repasar). En el caso del bit de protección de programa, éste trabaja de la misma manera en ambos casos, pero la lógica es invertida y la ubicación es diferente, es decir que en el PIC16F84A este bit se ubica en la posición 4 de la palabra de configuración y un 1 indicará que el dispositivo no estará protegido, y un 0 indicará que no será posible leer el contenido del programa ni los datos de la EEPROM.
Finalmente el PIC16F84A tiene adicionalmente el bit PWRTE#, el cual, con un 0 activa un retardo en el reinicio por 72 ms. Este bit ocupa la posición 3 en la palabra de configuración.
Palabra de Configuración en el PIC16F84A: CP CP CP CP CP CP CP CP PWRTE WDTE FOSC0FOSC1
Bit 11 10 9 8 7 6 5 4 3 2 1 Bit 0
INICIO
248
TEMA VIIMICROCONTROLADORES DE LA SERIE PIC16F87X
7.1 Generalidades 7.2 La familia PIC16F87X 7.3 Registros de funciones especiales 7.4 Las interrupciones de los PIC16F87X 7.5 Las Memorias EEPROM y FLASH 7.6 El Puerto A, el Puerto E y el Convertidor A/D 7.7 El Puerto B 7.8 El Puerto C y los Temporizadores 7.9 El Puerto C y los módulos de Captura, Comparación y PWM 7.10 El Puerto C y el Módulo de Comunicación Serial Síncrona 7.11 El Puerto C y la Comunicación I2C 7.12 El Puerto C y el USART 7.13 El Puerto D, el Puerto E y la Interfaz Paralela 7.14 Palabra de Configuración
INICIO
249
Objetivos Terminales:
Establecer las diferencias de hardware entre el microcontrolador PIC16F84A y los PIC16F87XDescribir las características de los PIC16F87XExplicar el uso de las interrupciones en los PIC16F87XDescribir cada uno de los módulos de hardware de los PIC16F87XDiseñar circuitos con microcontroladores PIC16F87X
INICIO
250
7.1 Generalidades de los PIC16F87X
INICIO
En el tema anterior hemos visto al PIC16F84A, con el cual nos iniciamos a los microcontroladores PIC de la gama media. ¿Quedó todo bien claro? Es importante que lo hayas comprendido todo bien hasta ahora, para continuar con los PIC16F87x. Estos microcontroladores presentan una serie de características que permiten una mayor versatilidad en un sinnúmero de aplicaciones. Estas características se pueden resumir en las siguientes:
* Mayor capacidad de memoria RAM y EEPROM.
* Manejo de hasta 14 fuentes de interrupción.
* Líneas de entrada y salida adicionales.
* Dos temporizadores adicionales: TMR1 y TMR2.
* Módulos de captura, comparación y modulador de ancho de pulsos.
* Convertidor Analógico a Digital de 10 bits para varias entradas.
* Módulos de comunicación serial.
* Los modelos de 40 terminales tienen un módulo de comunicación paralela.
Todas estas características colocan a los PIC16F87X como la familia de microcontroladores de la gama media de mayor cantidad de recursos, y que obviamente se presentan como soluciones a una gran diversidad de desarrollos.
251
7.2 La familia de los PIC16F87X
INICIO
Anteriormente ya habíamos presentado a la familia de los PIC16F87X. Conviene volverlos a mostrar, y esta vez observa mejor las características que presentan cada uno de sus miembros y la comparación con el PIC16F84A:
Microcontrolador
PIC16F84
PIC16F870 PIC16F871 PIC16F872 PIC16F873 PIC16F874 PIC16F876 PIC16F877
FLASH (Programa)
1Kx14 2K x 14 2K x 14 2K x 14 4K x 14 4K x 14 8K x 14 8K x 14
RAM(Datos)
64 bytes
128 bytes 128 bytes 128 bytes 192 bytes 192 bytes 368 bytes 368 bytes
EEPROM(Datos
permanentes)
64 bytes
64 bytes 64 bytes 64bytes 128 bytes 128 bytes 256 bytes 256 bytes
Puertos A,B A, B, C A,B,C,D,E A, B, C A, B, C A,B,C,D,E A, B, C A,B,C,D,E
Entradas Analógicas
No 5 canales 8 canales 5 canales 5 canales 8 canales 5 canales 8 canales
Captura, Comparación y Modulador de ancho de
pulso
No 1 1 1 2 2 2 2
Puerto serial
No AUSART AUSART M2CSPI AUSART/ M2CSPI
AUSART/ M2CSPI
AUSART/ M2CSPI
AUSART/ M2CSPI
Temporizadores
1-8bits, WDT
1-16bits2-8bits,
WDT
1-16bits, 2-
8bits,WDT
1-16bits, 2-8bits,
WDT
1-16bits, 2 8bits, WDT
1-16bits, 2-8bits, WDT
1-16bits, 2-8bits,
WDT
1-16bits2-8bits,
WDT
252
Conexiones de los PIC16F870/72/73/76
INICIO
253
Conexiones de los PIC16F871/74/77
INICIO
254
7.3 Registros de funciones especiales
INICIO
Sabemos que las instrucciones de los microcontroladores PIC16F87X, son las mismas que las del PIC16F84, ya que todos pertenecen a la gama media. Sin embargo, para la programación se hace necesario conocer los nuevos registros de funciones especiales que ofrecen los PIC16F87X con sus características mejoradas. Estos registros se ubican en la memoria RAM del microcontrolador. Recordemos que para acceder a una posición de la RAM, contamos con 7 bits en la palabra de instrucción, que corresponden directamente a 128 posiciones. Para seleccionar un banco de la memoria RAM se cuenta con los bits RP1 y RP0 que se ubican en el registro STATUS. En el caso del PIC16F84 sólo se puede modificar el bit RP0, y por consiguiente, únicamente se puede acceder a dos bancos de la RAM. En el caso de los PIC16F87X, podemos acceder a 4 bancos de la RAM.
Los registros de funciones especiales los podemos ubicar en las tablas de las páginas siguientes, no hace falta que te lo aprendas todavía, después lo analizaremos con más detalle. En ellas encontraremos a los siguientes microcontroladores:
PIC16F870 y PIC16F871
PIC16F872
PIC16F873 y PIC16F874
PIC16F876 y PIC16F877
Bits de los registros de Funciones especiales
255
PIC16F870 y 871
Banco 0 Banco 1 Banco 2 Banco 3
En la siguiente tabla, se presentan las direcciones y los nombres de los registros de los PIC16F870 y PIC16F871.
Notas:(1) El registro indirecto “INDF”,
no corresponde a una posición fija en la RAM; al acceder a ese registro, se lee o escribe en el registro señalado en la dirección indicada por el registro FSR.
(2) Los espacios de la tabla en color gris, corresponden a direcciones no implementadas.
(3) El PIC16F870 no tiene los puertos D y E ni los registros TRIS correspondientes.
INICIO
256
PIC16F872
Banco 0 Banco 1 Banco 2 Banco 3
INICIO
En la siguiente tabla, se presentan las direcciones y los nombres de los registros del PIC16F872.
Notas:(1) El registro indirecto “INDF”,
no corresponde a una posición fija en la RAM; al acceder a ese registro, se lee o escribe en el registro señalado en la dirección indicada por el registro FSR.
(2) Los espacios de la tabla en color gris, corresponden a direcciones no implementadas.
257
PIC16F873 y 874
Banco 0 Banco 1 Banco 2 Banco 3
INICIO
En la siguiente tabla, se presentan las direcciones y los nombres de los registros de los PIC16F873 y PIC16F874.
Notas:(1) El registro indirecto “INDF”,
no corresponde a una posición fija en la RAM; al acceder a ese registro, se lee o escribe en el registro señalado en la dirección indicada por el registro FSR.
(2) Los espacios de la tabla en color gris, corresponden a direcciones no implementadas.
(3) El PIC16F873 no tiene los puertos D y E ni los registros TRIS correspondientes.
258
PIC16F876 y 877
Banco 0 Banco 1 Banco 2 Banco 3
INICIO
En la siguiente tabla, se presentan las direcciones y los nombres de los registros de los PIC16F876 y PIC16F877.
Notas:(1) El registro indirecto “INDF”,
no corresponde a una posición fija en la RAM; al acceder a ese registro, se lee o escribe en el registro señalado en la dirección indicada por el registro FSR.
(2) Los espacios de la tabla en color gris, corresponden a direcciones no implementadas.
(3) El PIC16F876 no tiene los puertos D y E ni los registros TRIS correspondientes.
259
Bits de los Registros de Funciones Especiales (Banco 0)
INICIO
260
Bits de los Registros de Funciones Especiales (Banco 1)
INICIO
261
Bits de los Registros de Funciones Especiales (Bancos 2 y 3)
INICIO
262
Diferencias entre los registros de funciones especiales de los PIC16F87X
Los PIC16F87X tienen más registros de funciones especiales que el PIC16F84. En la siguiente tabla, podemos observar aquellos registros diferentes entre ellos, sus respectivas ubicaciones y a qué función está asociada:
INICIO
Funciones asociadas
Registro PIC16F870 PIC16F871
PIC16F872 PIC16F873
PIC16F874 PIC16F876 PIC16F877
PORTD ----- 08h ----- ----- 08h ----- 08h
Puerto TRISD ----- 88h ----- ----- 88h ----- 88h
Paralelo PORTE ----- 09h ----- ----- 09h ----- 09h
TRISE ----- 89h ----- ----- 89h ----- 89h
SSPBUF ----- ----- 13h 13h 13h 13h 13h
Módulo de SSPCON ----- ----- 14h 14h 14h 14h 14h
Comunicación SSPCON2 ----- ----- 91h 91h 91h 91h 91h
Serial SSPADD ----- ----- 93h 93h 93h 93h 93h
Síncrona SSPSTAT ----- ----- 94h 94h 94h 94h 94h
RCSTA 18h 18h ----- 18h 18h 18h 18h
Puerto TXTA 98h 98h ----- 98h 98h 98h 98h
de Comunicación TXREG 19h 19h ----- 19h 19h 19h 19h
Serial Universal SPBRG 99h 99h ----- 99h 99h 99h 99h
USART RCREG 1Ah 1Ah ----- 1Ah 1Ah 1Ah 1Ah
Segundo módulo CCPR2L ----- ----- ----- 1Bh 1Bh 1Bh 1Bh
de Comparación, CCPR2H ----- ----- ----- 1Ch 1Ch 1Ch 1Ch
Captura y PWM CCP2CON ----- ----- ----- 1Dh 1Dh 1Dh 1Dh
263
7.4 Las Interrupciones de los PIC16F87X
Los microcontroladores PIC de la serie 16F87X de 28 terminales tienen 13 fuentes de interrupción, y los de 40 terminales tienen 14 fuentes de interrupción. Esta cantidad de fuentes de interrupción obedece a que estos microcontroladores cuentan con más periféricos que el PIC16F84. Entre ellos podemos nombrar: El convertidor analógico a digital, el módulo de comparación, captura y modulador de ancho de pulso (PWM), el módulo de comunicación serial y el módulo de comunicación paralela.Los registros asociados a las interrupciones son los siguientes:
Registro Función Direcciones
INTCON Habilitación y señalizado de interrupciones 0
0BH, 8BH, 10BH, 18BH
PIE1 Habilitación de Interrupciones 1 8CH
PIE2 Habilitación de Interrupciones 2 8DH
PIR1 Indicador de Interrupciones 1 0CH
PIR2 Indicador de Interrupciones 2 0DHBásicamente estos registros contienen los bits que permiten o no las interrupciones en el microcontrolador (registros INTCON, PIE1 y PIE2) y los bits que se establecen cuando se genera una interrupción (registros INTCON, PIR1 y PIR2). El registro INTCON es similar al del PIC16F84, con la diferencia de que se sustituye la habilitación de la escritura de la EEPROM por la de habilitación de los dispositivos que no están en INTCON. Esto se podrá ver mejor en la siguiente página.
INICIO
264
El registro INTCONControl de interrupciones
El registro INTCON contiene algunas de las indicaciones de las fuentes de interrupción y las habilitaciones de interrupción. En el caso de las habilitaciones de las interrupciones, un 1 indica habilitado y un 0 indica deshabilitado. Para el caso de las indicaciones, un 1 señala que ocurrió el evento, es decir que podrá interrumpir si hay habilitación y un 0 que no ha ocurrido nada. Los bits del registro INTCON son:
• GIE. Habilitación global de interrupciones. Si GIE = 0, no se acepta ninguna de las interrupciones. Si GIE = 1, se aceptan solamente las interrupciones habilitadas.
• PEIE. Habilitación de interrupciones de dispositivos que no se controlan con INTCON.
• T0IE. Habilitación de interrupción por desbordamiento de TMR0 (Temporizador 0).
• INTE. Habilitación de interrupción por la activación del terminal RB0/INT.
• RBIE. Habilitación de interrupción por cambio de estado en RB7, RB6, RB5 ó RB4.
• T0IF. Indicador de un desbordamiento en TMR0.
• INTF. Indicador de la activación en el terminal RB0/INT.
• RBIF. Indicador de un cambio de estado en RB7, RB6, RB5 ó RB4.
INICIO
INTCON (Acceso a todos los bancos por medio de la dirección 0BH)GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
265
Registro PIE1
BIT Función
PSPIE Habilitación de interrupción para escritura o lectura de la interfaz paralela
ADIE Habilitación de interrupción para indicar la finalización de una conversión A/D
RCIE Habilitación de interrupción que indica que se recibió un dato en del USART
TXIE Habilitación de interrupción que indica que se envió un dato desde el USART
SSPIE Habilitación de interrupción para el puerto serial síncrono
CCP1IE Habilitación de interrupción para CCP1 al producirse una captura o comparación
TMR2IE Habilitación de interrupción para un desbordamiento del TMR2
TMR1IE Habilitación de interrupción para un desbordamiento del TMR1
PIE1 (8CH)PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INICIO
El registro PIE1 contiene 8 bits que se utilizan para la habilitación de ocho de las interrupciones de los PIC16F87X.
266
Registro PIE2
BIT Función
EEIE Habilitación de interrupción para finalización de escritura en la EEPROM
BCLIE Habilitación de interrupción para indicar colisión de datos en el bus SSP
CCP2IE Habilitación de interrupción para CCP2 al producirse una captura o comparación
PIE2 (8DH)--- 0 --- EEIE BCLIE --- --- CCP2IE
bit7 bit6 (1) bit5 bit4 bit3 bit2 bit1 bit0
(1) Este bit es reservado y deberá mantenerse en “0”
INICIO
El registro PIE2 contiene 3 bits que se utilizan para la habilitación de tres de las interrupciones de los PIC16F87X.
267
Registro PIR1
BIT Función
PSPIF Aviso de interrupción por escritura o lectura de la interfaz paralela
ADIF Aviso de interrupción para indicar la finalización de una conversión A/D
RCIF Aviso de interrupción para indicar que indica que se recibió un dato en del USART
TXIF Aviso de interrupción para indicar que indica que se envió un dato desde el USART
SSPIF Aviso de interrupción por el puerto serial síncrono
CCP1IF Aviso de interrupción por CCP1 al producirse una captura o comparación
TMR2IF Aviso de interrupción por un desbordamiento del TMR2
TMR1IF Aviso de interrupción por un desbordamiento del TMR1
PIR1 (0CH)PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INICIO
El registro PIR1 contiene 8 bits que se utilizan para la indicación de ocho de las interrupciones de los PIC16F87X.
268
Registro PIR2
BIT Función
EEIF Aviso de interrupción por finalización de escritura en la EEPROM
BCLIF Aviso de interrupción para indicar colisión de datos en el bus SSP
CCP2IF Aviso de interrupción por CCP2 al producirse una captura o comparación
PIR2 (0DH)--- 0 --- EEIF BCLIF --- --- CCP2IF
bit7 bit6 (1) bit5 bit4 bit3 bit2 bit1 bit0
(1) Este bit es reservado y deberá mantenerse en “0”
INICIO
El registro PIR2 contiene 3 bits que se utilizan para la indicación de tres de las interrupciones de los PIC16F87X.
269
Salvando los registros W y STATUS al atender una interrupción
Hay que tener un especial cuidado cuando se manejan las interrupciones, sobretodo para recuperar el contenido de los registros W y STATUS en el programa principal, ya que de lo contrario se pierde el control del programa. En los microcontroladores de la serie PIC16F87X, encontramos que existen cuatro bancos de la memoria RAM, y si el programa principal está accediendo a uno de ellos, en una interrupción podríamos cambiar el acceso a otro banco de la RAM. El reto está en recuperar los valores de W y STATUS que tenía el programa principal antes de la interrupción.
Si observamos los bancos de memoria en los PIC16F870, 871, 872, 876 y 877; se puede ver que los registros ubicados en la parte final de cada banco, se acceden por medio de las direcciones 70h hasta la 7Fh. Por lo tanto lo que tenemos que hacer, es que en una interrupción se salven W y STATUS en uno de esos registros:
Rut_interr ; Las direcciones de W2 y STATUS2 deben estar entre 70h y 7Fhmovwf W2 ; se guarda el valor de w en W2.swapf STATUS,w ; se utiliza esta instrucción, ya que movf afecta al bit Z de STATUSmovwf STATUS2 ; Se guarda el STATUS en STATUS2 con los nibbles intercambiados • ; Se ejecuta la rutina de interrupción • ; Al final de la interrupción se escribe lo siguienteswapf STATUS2,w ; se recupera el valor del STATUS con los nibbles en la posición movwf STATUS ; original, ya que se había guardado con los nibbles intercambiadosswapf W2,f ; se toma el valor de W2 con los nibbles intercambiadosswapf W2,w ; se recupera el valor original de w. retfie ; Retorno de la interrupción INICIO
270
En el caso de losPIC16F873 y PIC16F874
En los PIC16F873 y 874, no encontramos registros que se acceden en los cuatro bancos, sino en el 0 y 2 ó en el 1 y 3. Es decir que con el control de RP0, podemos guardar y recuperar W y STATUS. Guardar W y STATUS se hace más complejo que en los otros PIC16F87X, y se sugiere hacerlo como se presenta a continuación:
Push btfss STATUS,RP0 ; Chequea si el programa principal señala al banco 0goto rp0_en_0bcf STATUS,RP0 ; Si no estaba, selecciona el banco 0 para guardarmovwf W2 ; w y STATUSswapf STATUS,wmovwf STATUS2bsf STATUS2,1 ; Nótese que se cambia el bit guardado que correspondegoto rutint ; a RP0, que pasó de la posición 5 a 1 con el swapf
rp0_en_0 movwf W2 ; Si el programa principal señala el banco 0 no se swap STATUS,w ; realizan modificacionesmovwf STATUS2
rutint • ; Rutina de interrupción •
pop swapf STATUS2,wmovwf STATUS ; se recupera el status, pero como pudo haber cambiadobtfss STATUS,RP0 ; RP0, se chequea para recuperar correctamente a W2goto recup_w ; en el banco 0bcf STATUS,RP0swap W2,fswap W2,wbsf STATUS,RP0 ; se coloca como estaba RP0 en el programa principalretfie
recup_w swapf W2,f ; si RP0 era 0, no se hace cambios y se recupera wswapf W2,wretfie
INICIO
271
Actividades
Ya hemos visto cómo funcionan las interrupciones, y cómo hacer un programa para salvar los registros W y STATUS cuando se atiende una interrupción. Debes considerar siempre estos programas que se han mostrado anteriormente, por tanto te recomendamos que los escribas, o los copies, y lo guardes en tus archivos personales de tus programas.
Por los momentos, no te proponemos alguna otra actividad. Pensamos que comprenderás mejor acerca del manejo de interrupciones, a medida que vayas conociendo cada módulo de los PIC16F87X, los cuales verás, poco a poco en las siguientes secciones.
Recuerda que es importante que sepas que básicamente en el manejo de las interrupciones, cuentas con bits que te habilitan o no cada una de las interrupciones, y que además puedes acceder a los bits que te avisan cuál fue la interrupción que se generó mientras se ejecutaba el programa principal.
INICIO
272
7.5 Las Memorias EEPROM y FLASH
En los PIC16F87X, se pueden escribir o leer datos, tanto en la EEPROM, como en la memoria FLASH. Para escribir o leer la EEPROM, básicamente se ejecutan los mismos pasos que con el PIC16F84, con la diferencia de que en los PIC16F87X hay que colocar en 0 el bit EEPGD (bit 7) del registro EECON1 (dirección 18CH), para seleccionar la EEPROM. Para leer o escribir la memoria FLASH necesitaremos que los registros de dirección y de datos tengan mayor longitud, porque la FLASH es de 14 bits de contenido, y entre 11 y 13 bits de dirección. Por lo tanto se agregarán los registros EEADRH, para los bits más significativos de la dirección, y EEDATAH, para los bits más significativos del contenido a grabar en la FLASH.
La escritura en la FLASH puede protegerse por áreas o totalmente, por medio de los bits de configuración. Estos bits se acceden en el momento de grabar el programa, al utilizar un programador de microcontroladores.
INICIO
273
Registros asociados para la lectura y escritura de la EEPROM y la FLASH
En la siguiente tabla se presentan los registros asociados para la lectura y escritura de las memorias EEPROM y la FLASH.
Dirección
Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en POR y BOR
OtrosResets
0BH (todos los bancos)
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x
0000 000u
10DH EEADR Registro
Dirección
EEPROM
y la FLASH xxxx xxxx uuuu uuuu
10FH EEADRH ---- ---- ---- Dirección
Alta de la FLASH xxxx xxxx uuuu uuuu
10CH EEDATA Registro
de Dato
de la EEPROM
y la FLASH xxxx xxxx uuuu uuuu
10EH EEDATAH ---- ---- Dato Alto de
la FLASH
xxxx xxxx uuuu uuuu
18CH EECON1 EEPGD ---- ---- ---- WRERR WREN WR RD x--- x000 x--- u000
18DH EECON2 Registro
de control
de la EEPROM
y la FLASH
8DH PIE2 ---- 0 ---- EEIE BCLIE ---- ---- CCP2IE -r-0 0--0 -r-0 0--0
0DH PIR2 ---- 0 ---- EEIF BCLIF ---- ---- CCP2IF -r-0 0--0 -r-0 0--0
INICIO
274
Explicación de los registros relacionados con la EEPROM
Para acceder a las direcciones de la EEPROM en los PIC16F87X, se deberá utilizar los registros: EEADR, EEDATA, EECON1 y EECON2. Las direcciones son: 10Ch y 10Dh en el banco 2, y 18Ch y 18Dh en el banco 3 respectivamente.• EEADR: Es el registro de 8 bits que tiene la dirección del dato de la
EEPROM.• EEDATA: Es el registro de 8 bits en el cual se escribe o se lee el valor del
dato a guardar en la EEPROM en la dirección que está en el registro EEADR.
• EECON1: Este registro contiene los bits de control de las operaciones en la EEPROM:• RD, Bit 0 (Lectura). Se escribirá 1 cuando se va a realizar un ciclo de
lectura de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WR, Bit 1 (Escritura). Se enviará 1 cuando se va a realizar un ciclo de escritura de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WREN, Bit 2 (Habilitación de escritura). Si se escribe 1, se permitirá la escritura de la EEPROM. Si se coloca 0, no permitirá la escritura en la EEPROM.
• WRERR, Bit 3 (Indicador de error). Se lee un 1 si hubo error en la escritura debido a una inicialización del PIC. Un 0 indicará que la operación se hizo correctamente.
• EEPGD, Bit 7 (Acceso a EEPROM o FLASH). Un 1 indicará que la operación se relaciona con la FLASH, un 0 indicará que la operación se relaciona con la EEPROM.
• EECON2: En este registro se coloca una secuencia clave para evitar grabaciones accidentales.
INICIO
275
Escribir un dato en la EEPROM
El registro EECON2 se utiliza para colocar el código de control en la escritura de datos de la EEPROM y evitar una grabación accidental de la misma. Para ello, después de habilitar la escritura de la EEPROM al poner en 1 el bit WREN de EECON1, se deberá escribir en EECON2 el código 55h y luego el código 0AAh; finalmente, para grabar el dato que está en el registro EEDATA en la dirección marcada por el registro EEADR que fija la dirección de la EEPROM, se deberá escribir un 1 en el bit WR del registro ECON1. Un programa propuesto que realiza la escritura de un byte en la EEPROM es el que se presenta a continuación:
BCF STATUS, RP0 ; En el banco 2 están los registros EEADR y EEDATABSF STATUS, RP1 ;MOVF DIRECCION,W ; En DIRECCION está la posición donde se guardaráMOVWF EEADR ; el dato en la EEPROMMOVF DATO,W ; En DATO está el valor que irá a la EEPROMMOVWF EEDATA ; BSF STATUS, RP0 ; Selecciona banco 3 de la RAMBCF INTCON, GIE ; Deshabilita interrupciones al escribir EEPROMBCF EECON1, EEPGD ; Selecciona acceso a la EEPROMBCF EECON1, EEIF ; Se borra el bit indicador de finalización de escritura
. BSF EECON1, WREN ; Habilita escritura en la EEPROMMOVLW 55h ; MOVWF EECON2 ; Escribe código 55h en EECON2 MOVLW 0AAh ; (Códigos de protección para no grabar accidental-MOVWF EECON2 ; mente un dato) Escribe código AAH en EECON2BSF EECON1,WR ; Comienza la grabación del datoBSF INTCON,GIE ; Habilitación global de interrupciones
INICIO
276
Lectura de un dato en la EEPROM
Durante la sección del programa que escribe en la EEPROM se recomienda deshabilitar las interrupciones para que el proceso de escritura se realice correctamente. Después de iniciarse el proceso de escritura de la EEPROM, se podrá habilitar las interrupciones por medio de la instrucción “BSF INTCON, GIE”. En la escritura de la EEPROM el bit WR de EECON1 se colocará en 0 automáticamente. Tú podrás determinar cuándo termina el ciclo de escritura al leer un 1 en el bit EEIF del registro EECON1. Después de esto se deberá colocar el bit WREN en 0 para prevenir un borrado accidental de la EEPROM.
Para leer un dato en la EEPROM se podrá utilizar la sección de programa que se muestra a continuación:
BCF STATUS, RP0 ; Selecciona banco 2 para EEADRBSF STATUS, RP1 :MOVLW DIR_LECT ; Dirección de lectura en WMOVWF EEADR ; Dirección de lectura en EEADRBSF STATUS, RP0 ; Selecciona banco 3 para EECON1BCF EECON1, EEPGD ; Selecciona acceso a la EEPROMBSF EECON1, RD ; Lectura de la EEPROMBCF STATUS, RP0 ; Selecciona banco 2 para EEDATAMOVF EEDATA, W ; Coloca dato leído de EEPROM en W
Una buena práctica para escribir un dato en la EEPROM, consiste en verificar si ese dato ha sido grabado correctamente mediante la lectura del dato escrito y comparación con él mismo por medio de una resta y al evaluar el bit Z del registro STATUS. INICIO
277
Escribir un dato en la FLASH
Para escribir un dato en la FLASH, la dirección de acceso no debe estar protegida. Por otro lado, después del proceso de escritura, el microcontrolador no lee las siguientes dos instrucciones, y éste se inhibe durante la operación de escritura. A continuación se presenta una sección de programa para escribir un dato en la FLASH.
BCF STATUS, RP0 ; En el banco 2 están los registros EEADR, EEADRH, BSF STATUS, RP1 ; EEDATA y EEDATAHMOVF DIRECCIONH,W ; En DIRECCIONH está la posición más significativa dondeMOVWF EEADRH ; se guardará el dato en la FLASHMOVF DIRECCIONL,W ; En DIRECCIONL está la posición menos significativa dondeMOVWF EEADR ; se guardará el dato en la FLASHMOVF DATOH,W ; En DATOH está el valor más significativo del datoMOVWF EEDATAH ; MOVF DATOL,W ; En DATOL está el valor menos significativo del datoMOVWF EEDATABSF STATUS, RP0 ; Selecciona banco 3 de la RAMBCF INTCON, GIE ; Deshabilita interrupciones al escribir en la FLASHBSF EECON1, EEPGD ; Selecciona acceso a la FLASHBCF EECON1, EEIF ; Se borra el bit indicador de finalización de escritura
. BSF EECON1, WREN ; Habilita escritura en la EEPROMMOVLW 55h ; MOVWF EECON2 ; Escribe código 55h en EECON2 MOVLW 0AAh ; (Códigos de protección para no grabar accidental-MOVWF EECON2 ; mente un dato) Escribe código AAH en EECON2BSF EECON1,WR ; Comienza la grabación del datoNOP ; El microcontrolador ignora estas dos instrucciones y continúaNOP ; después de terminar el proceso de grabaciónBSF INTCON,GIE ; Habilitación global de interrupcionesBCF EECON1, WREN ; Se deshabilita la escritura para prevenir un borrado accidental
INICIO
278
Lectura de un dato en la FLASH
Una sección de programa para leer un dato de la FLASH, es la que se muestra a continuación:
BCF STATUS, RP0 ; Selecciona banco 2 para EEADRBSF STATUS, RP1 :MOVLW DIR_LECTH ; Dirección más significativa de lectura en WMOVWF EEADRH ; DIR_LECTH en EEADRHMOVLW DIR_LECTL ; Dirección menos significativa de lectura en WMOVWF EEADR ; DIR_LECTL en EEADRBSF STATUS, RP0 ; Selecciona banco 3 para EECON1BSF EECON1, EEPGD ; Selecciona acceso a la FLASHBSF EECON1, RD ; Lectura de la FLASHNOP ; Después de esta instrucción, la memoria de programaNOP ; es leída en los siguientes dos ciclosBCF STATUS, RP0 ; Selecciona banco 2 para EEDATAMOVF EEDATA, W ; Coloca dato bajo leído de la FLASH en WMOVWF DATOL ; Parte menos significativa del dato en DATOLMOVF EEDATAH,W ; Coloca dato alto leído de la FLASH en WMOVWF DATOH ; Parte más significativa del dato en DATOH
Al igual que en el caso de la EEPROM, se considera buena práctica leer los datos, depués de que estos sean grabados.
INICIO
279
Protección de la FLASH
La memoria FLASH puede ser protegida totalmente o por secciones, tanto para la lectura como para la escritura. Para ello, antes del proceso de grabación o lectura, hay que acceder a los bits CP1, CP0 y WRT de la palabra de configuración del microcontrolador. Si el bit WRT vale “1” se podrá escribir en la memoria FLASH del microcontrolador, si vale “0” no se podrá escribir. A continuación se presenta cómo se protege la escritura de la FLASH según los valores de CP1 y CP0 y el modelo del microcontrolador.
Modelo PIC CP1 CP0 Dirección inicial de protección
Dirección final de protección
PIC16F870/871/872 0 0 TODO PROTEGIDO
PIC16F873/874 0 0 0000H 0FFFH
PIC16F873/874 0 1 0800H 0FFFH
PIC16F873/874 1 0 0F00H 0FFFH
PIC16F876/877 0 0 0000H 1FFFH
PIC16F876/877 0 1 1000H 1FFFH
PIC16F876/877 1 0 1F00H 1FFFH
Todos los modelos 1 1 NO PROTEGIDO
INICIO
280
Actividades
Hemos visto cómo puedes guardar y leer datos de la EEPROM, por supuesto que las líneas de programa mostradas anteriormente necesitan ser completadas para que pueda trabajar bien en un programa.
La primera actividad propuesta para esta sección, es que puedas introducir un dato de 8 bits, a través del puerto B, lo guardes en la EEPROM. Después apagues el dispositivo, y puedas leer el dato que habías guardado en ese puerto. Para ello deberás colocar un interruptor de control en una línea del puerto C, de manera que en un momento dado el puerto B trabaje como entrada, lea el dato y lo guarde en una posición de la EEPROM, y en la otra posición de esa línea del puerto C, el puerto B trabaje como salida y aparezca el dato desde la posición donde guardaste el dato anteriormente.
La segunda actividad propuesta es hacer un contador de dos dígitos 7 segmentos, que tenga un pulsador para la cuenta ascendente, otro para la cuenta descendente y uno más para almacenar el valor de la cuenta en la EEPROM, de manera que al encender el dispositivo, el valor que aparezca en pantalla, sea el que se almacenó en la EEPROM, y desde allí se seguirá el conteo.
INICIO
281
7.6 El Puerto A, el Puerto Ey el Convertidor A/D
INICIO
En vista de que los microcontroladores de la serie PIC16F87X tienen muy diversas aplicaciones, los terminales de los puertos pueden poseer varias funciones de manera multiplexada. Por otro lado, los dispositivos de 28 terminales tienen 22 líneas de entrada-salida (PORTA, PORTB y PORC) y los microcontroladores de 40 terminales tienen 33 líneas E/S (PORTA, PORTB, PORTC, PORTD y PORTE). Recuerda que cada terminal de un puerto, si está configurado como E/S digital, se puede programar como entrada o salida, al colocar el bit asociado del registro TRIS en 1 ó 0 respectivamente.
El puerto A (PORTA) dispone de 6 terminales. La función que puede realizar cada terminal se resume en la siguiente tabla:
Cada terminal se puede configurar como entrada o salida de manera individual mediante el registro TRISA, ubicado en la dirección 85h de la RAM, tal como se hace con el PIC16F84A. Para configurar una función relacionada con el convertidor analógico a digital, se deberá acceder a los registros ADCON0 y ADCON1 (direcciones 1FH y 9FH respectivamente).
RA5/AN4/SS# RA4/TOCKI RA3/AN3/Vref RA2/AN2 RA1/AN1 RA0/AN0
E/S DIGITAL E/S DIGITAL E/S DIGITAL E/S DIGITAL E/S DIGITAL E/S DIGITAL
ENTRADA ANALÓGICA 4
ENTRADA ANALÓGICA 3
ENTRADA ANALÓGICA 2
ENTRADA ANALÓGICA 1
ENTRADA ANALÓGICA 0
MODO ESCLAVO EN COMUNICACIÓN
SERIAL SÍNCRONA
ENTRADA DE RELOJ DEL
TMRO
VOLTAJE DE REFERENCIA A/D
C
282
Registros asociados a PORTA
INICIO
La siguiente tabla muestra los registros asociados al puerto A y la ubicación de los mismos en la memoria RAM.
Las líneas PCFG0 – PCFG3 del registro ADCON1 configuran las líneas del puerto A y el puerto E para que trabajen como entradas analógicas o digitales (los PIC16F870, 872, 873 y 876 no tienen puerto E). Debemos observar que los bits de estos registros son puestos a 0 después de un RESET, un POR (inicialización por encendido) o un BOR (inicialización por baja de Vdd). Esto significa, como se verá más adelante, que la configuración inicial de las líneas de los puertos A y E estarán como entradas analógicas. Si se desea que todas ellas trabajen en forma digital, deberá escribirse el valor “011x” en los cuatro bits menos significativos del registro ADCON1.
0--- 00000--- 0000PCFG0
PCFG1
PCFG2
PCFG3
---------ADFMADCON19Fh
0000 00-0
--11 1111
--0u 0000
Otros
Resets
0000 00-0
--11 1111
--0x 0000
Valor en POR y BOR
CHS2
RA5
Bit 5
ADCS0
---
---
Bit 6
ADCS1
---
---
Bit 7
ADCON0
TRISA
PORTA
Registro
ADON---GO/DONE#
CHS0CHS1
1Fh
85h
RA0RA1RA2RA3RA405h
Bit 0Bit 1Bit 2Bit 3Bit 4Dirección
Registro de Configuración de PORTA
283
El Puerto E y las entradas analógicas AN5, AN6 y AN7
Los microcontroladores PIC16F871, 874 y 877 tienen tres entradas analógicas adicionales, las cuales se encuentran en el puerto E (PORTE, dirección 09H).
En la tabla se indica que cada línea del puerto E, puede trabajar como Entrada/Salida Digital, como entrada analógica o como control del puerto paralelo. En esta sección, sólo veremos las dos primeras funciones, y cuando se estudie el puerto paralelo, se verá la tercera función.
En la dirección 89H se encuentra TRISE, que es el que configura las líneas digitales del puerto E y la interfaz paralela (Bits 4 a 7). La configuración como entrada analógica o E/S digital, se hace por medio del registro ADCON1.Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en
POR y BOROtros
Resets
89h TRISE IBF OBF IBOV PSPMODE
--- 0000 -111
0000 -111
Registro de Configuración de
PORTE
INICIO
Lectura en el modo PSP (RD)
Entrada Analógica 5
E/S DIGITAL
RE0/RD#/AN5
Escritura en el modo PSP (WR)
Entrada Analógica 6
E/S DIGITAL
RE1/WR#/AN6
Selección de Chip en el modo PSP (CS)
Entrada Analógica 7
E/S DIGITAL
RE2/CS#/AN7
c
c
284
El Convertidor Analógico a Digital
Los microcontroladores PIC16F87X poseen un convertidor analógico digital de 10 bits de resolución y cinco canales de entrada en los modelos de 28 terminales (puerto A) y ocho canales en los que tienen 40 terminales (puertos A y E).Este convertidor puede aceptar sólo señales positivas comprendidas entre Vref
+ y Vref-. La resolución que tiene cada bit que procede de la conversión es
función de la tensión de referencia según la siguiente ecuación:
Resolución = (Vref+ - Vref
-)/1024bits
En el caso de que la tensión de referencia positiva (Vref+) sea igual a 5 voltios
y la negativa sea 0V, la resolución será de 4,8mV/bit. La tensión de referencia determina los límites máximo y mínimo de la tensión analógica que puede leer el microcontrolador, y puede seleccionarse externamente por medio de RA3 (Vref
+) y RA2 (Vref-) o emplearse la fuente de alimentación del
microcontrolador (Vdd y Vss).El convertidor analógico digital es el único dispositivo que puede seleccionarse para que esté activo en el modo de reposo, para ello, los pulsos del convertidor deberán conectarse al oscilador RC interno.Los cinco primeros canales de entradas analógicas del PIC16F87X están en el puerto A. Por lo tanto se deben configurar dichas líneas para expresar aquéllas que se utilizarán como entradas analógicas.El convertidor analógico a digital utiliza la técnica de aproximaciones sucesivas y requiere una tensión mayor a 2V y menor a Vdd – Vss como voltaje de referencia.
INICIO
285
Descripción del funcionamiento del AD/C
Para que funcione el convertidor analógico a digital (AD/C), se necesita configurarlo inicialmente. Esto significa que hay que definir las líneas que se utilizarán como entradas analógicas, cuáles van a ser las tensiones de referencia a emplear, la velocidad de conversión del AD/C, cuál oscilador se va a emplear, cómo se escribirá el valor digital en los registros ADRESH y ADRESL, y la habilitación o no de la interrupción por convertidor. Después de esto, en el programa se seleccionará cada canal a convertir seguido de la orden de conversión.
En principio, el AD/C utiliza la técnica de aproximaciones sucesivas y está controlado por un oscilador. Estos pulsos pueden ser una señal proveniente del oscilador de cristal, dividida entre 2, 8 ó 32, o el oscilador RC interno del microcontrolador. Si se selecciona esta última opción, se podrán hacer conversiones durante el modo de reposo. Es importante tomar en cuenta que el tiempo del AD/C para cada bit, no debe ser menor de 1,6μSeg, para que las conversiones se hagan correctamente. En el caso de utilizar el oscilador RC, este tiempo es de aproximadamente 4μSeg.
La señal a convertir se selecciona por medio del multiplexer analógico, luego va al circuito de muestreo y retención y después al convertidor A/D. El tiempo total de lectura está dado por el tiempo de adquisición mas el tiempo que emplea el convertidor.
Un dato importante es conocer el tiempo de lectura de cada señal, para el empleo de circuitos de control. En la siguiente página se muestra el cálculo del tiempo de lectura y la frecuencia de muestreo para la señal correspondiente a un canal.
INICIO
286
Tiempo de lectura del convertidor A/D
El tiempo de lectura para la señal de cada canal, está dado por el tiempo de adquisición mas el tiempo de conversión del convertidor A/D.
El tiempo de adquisición está dado por la siguiente ecuación:
tadq = tamp + tcc + tcT
Donde: tamp es el tiempo de establecimiento del amplificador, 2μSeg.
tcc es el tiempo de carga del condensador del circuito de muestreo y retención (sample & hold),
16,5μSeg.
tcT es el tiempo debido al coeficiente de temperatura:
tcT = (T-25°C)0,05μSeg
El tiempo de conversión está dado por 12tAD, donde tAD es el tiempo de conversión de cada bit.
El tiempo de lectura mínimo a 25°C está dado para tAD = 1,6μSeg:
tlect = 2μSeg + 16,5μSeg + 0 + 12x1,6μSeg = 37,7μSeg
La máxima velocidad de muestreo se dará para 40μSeg, dando un margen de 2μSeg para la espera del convertidor y la realización de instrucciones de lectura y ordenamiento, es decir que estará en el orden de las 25K muestras por segundo.
INICIO
287
Configuración del Convertidor A/D
En resumen, los pasos necesarios para configurar el convertidor A/D son:
• Determinar las líneas que se utilizarán como entradas analógicas.
• Seleccionar las tensiones de referencia.
• Seleccionar el oscilador del convertidor.
• Seleccionar el modo de escritura en los registros ADRESH-L del convertidor A/D.
• Activar la interrupción para el convertidor A/D.
INICIO
288
Selección de las entradas analógicas y las de referencia
Para seleccionar las líneas que se utilizarán como entradas analógicas y las tensiones de referencia, se selecciona el código apropiado de PCFG3-0 en el registro ADCON1, para ello se busca en la siguiente tabla la opción más conveniente:
Notas:
1: Estos canales no son disponibles en los PIC16F870, 872, 873 y 876.
2: Esta columna indica el número de canales analógicos y el número de entradas de referencia.
INICIO
289
El oscilador del convertidor A/D
ADCS1 - ADCS0 Frecuencia
00 fosc/2
01 fosc/8
10 fosc/32
11 Osilador RC interno
Para seleccionar el oscilador, se debe acceder a los bits ADCS1 y ADCS0 del registro ADCON0. En la siguiente tabla podrás escoger la opción adecuada:
Debe tomarse en cuenta que el tiempo de conversión de cada bit debe ser mayor o igual a 1,6μSeg. La frecuencia máxima del cristal según los valores de ADCS1-ADCS0 se muestra a continuación:
Nota 1: El tiempo típico de conversión, al utilizar el oscilador interno, es aproximadamente 4μSeg, aunque éste puede estar comprendido entre 2 y 6μSeg.
INICIO
290
Selección de la escritura en los registros ADRESH y ADRESL
En los registros ADRESH y ADRESL se escribe el resultado de la conversión analógica a digital. Por medio del bit ACFM (bit7) que está en el registro ADCON1 (dirección 9FH). Un “1” en el bit ACFM alínea la lectura hacia la derecha, y un “0” lo alínea hacia la izquierda.
INICIO
291
Configuración de los registros de interrupciones para el convertidor A/D
El tiempo de conversión puede variar según la frecuencia del oscilador del convertidor A/D y la temperatura. Al estar lista la conversión analógica de un dato digital, se activan las líneas ADON a “0” del registro ADCON0 y se coloca en “1” la línea ADIF del registro PIR1. Si las interrupciones están habilitadas por medio de un “1” en el bit GIE del registro INTCON y la interrupción del convertidor A/D está habilitada por medio de un “1” en la línea ADIE del registro PIE1, al finalizar la conversión del dato analógico a digital, provocará una interrupción en el microcontrolador y se cargará el vector de interrupción al contador de programa (dirección 4H). Para atender la rutina de interrupción debida al convertidor A/D, bastará con leer el bit ADIF del registro PIR1.
INICIO
PIE1 (8CH)PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
cc
PIR1 (0CH)PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
cc
292
Manejo del Convertidor A/D
En la siguiente figura se muestra un esquema de las conexiones internas del convertidor analógico a digital. Podemos observar que las entradas analógicas van a un multiplexer analógico, y la selección del canal a convertir se realiza por medio de los bits CHS2, CHS1 y CHS0 del registro ADCON0.
Por otro lado, vemos que es posible sacrificar las entradas AN3 y AN2, para colocar las tensiones de referencia externas, y con ello mejorar la exactitud en las lecturas del convertidor A/D.
Nota 1: No disponible en los PIC16F870, 872, 873 y 876
INICIO
293
Ejemplo de un programa que configura al convertidor A/D
INICIO
De acuerdo a lo que hemos visto hasta ahora, presentamos a continuación un programa que configura al convertidor A/D, a partir de los siguientes criterios:
N° canales de entrada = 4, tensión de referencia = 2,5V (referida a tierra), Fosc = 20MHz, tiempo de lectura = 40μSeg, lectura alineada a la derecha.
CONFIGADBCF RP1 ; Selecciona el banco 1 de la RAMBSF RP0MOVLW 3F ; Configuración de las líneas del puerto A como entradasMOVWF TRISAMOVLW B’10000011 ; Configura: RA0, RA1, RA2 y RA4 como entradas analógicas; RA3 seráMOVWF ADCON1 ; la entrada de Vref y los 10 bits de lectura del A/D se alínean a la derechaBSF PIE1,ADIE ; Habilita la interrupción para el AD/CBCF RP1 ; Selecciona el banco 0 de la RAMMOVLW B’10000001 ; MOVWF ADCON0 ; Se configura el oscilador de 20MHz para dividir por 32 y enciende el
ADC
El convertidor A/D queda configurado. Para hacer lecturas de cada canal, se deberá seleccionar los canales por medio de los bits CHS2, CHS1 y CHS0 del registro ADCON0, y colocar en “1” el bit Go/Done del mismo registro ADCON0.
294
Actividades
INICIO
Para una mejor comprensión del manejo del convertidor analógico a digital, te proponemos las siguientes actividades:
Hacer un programa y montar un circuito con un microcontrolador PIC, que lea el canal 0, y coloque el valor binario en los 8 bits del puerto B, y en 2 bits del puerto C.
Hacer un programa y montar un circuito que haga las veces de voltímetro digital, en donde se muestre la lectura de un canal a seleccionar y se haga la conversión a BCD, y luego a 7 segmentos, para presentarlo en un indicador de tres dígitos y medio (0,000 a 1,998), para ello la tensión de referencia deberá ser de 2V.
295
7.7 El Puerto B
INICIO
0000 000x
0000 000x
RBIFINTFTOIFRBIEINTETOIEPEIEGIEINTCON0Bh, 8Bh,10Bh,18B
h
1111 1111
1111 1111
uuuu uuuu
Otros
Resets
1111 1111
1111 1111
xxxx xxxx
Valor en POR y BOR
TOCS
RB5
Bit 5
INTEDEG
RB6
Bit 6
RBPU#
RB7
Bit 7
OPTION_REG
TRISB
PORTB
Registro
PS0PS1PS2PSATOSE81h,181h
86h,186h
RB0RB1RB2RB3RB406h,106h
Bit 0Bit 1Bit 2Bit 3Bit 4Dirección
Registro de Configuración de PORTB
El puerto B dispone de 8 líneas bidireccionales que se utilizan para entradas o salidas digitales. Cada línea se puede programar como salida o entrada al colocar en “0” o en “1” respectivamente el bit asociado en el registro TRISB. Dos de las líneas de este puerto se utilizan en el momento de grabar la memoria de programa del microcontrolador. Estas dos entras son: RB6/PGC (Program Clock) y RB7/PGD (Program Data) para más detalles, ver el anexo 7. El terminal RB0 se puede emplear como entrada de interrupción externa. Por otro lado, es posible hacer la conexión de cada terminal RBn a una resistencia interna asociada a Vdd (Pull-up), al colocar un 0 en el bit RBPU# del registro OPTION REG. Por otro lado, si seleccionas a RB0 como entrada de interrupción, podrás escoger el tipo de transición a la cual se activará ésta. Un “0” en el bit INTEDEG del registro OPTION_REG, hará que la interrupción en el microcontrolador sea por medio de una transición de bajada y un “1”, por una transición de subida. En la siguiente tabla se resume los registros asociados a PORTB.
296
7.8 El Puerto C y losTemporizadores
INICIO
RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA
RC3/SCK/SCL
RC2/CCP1 RC1/T10SC1/
CCP2
RC0/T1OSC0/
T1CKI
E/S DIGITAL E/S DIGITAL E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
RECEPCIÓN USART
TRANSMIS. USART
SALIDA DATOS
SPI
ENTRADA DATOS
SPI
RELOJ SPI ENTRADA CAPTURA
1
ENTR. TMR1ENTR. CAPT2
ENTRADA TMR1
DATOS TRANS
SINCRONA
RELOJ TRANS
SINCRONA
ENTRADA DATOS
I2C
RELOJ I2C SAL COMP1
SAL PWM1
SAL COMP2SAL PWM2
SALIDA TMR1
Debemos tomar en cuenta que los PIC16F870/871/872 sólo tienen un módulo de comparación, captura y PWM. Por otro lado, los PIC16F870/871 no poseen el módulo SPI y el PIC16F872 no tiene el módulo de comunicación USART. Por lo tanto es conveniente tomar en consideración esto al programar el puerto C.
El puerto C dispone de 8 líneas bidireccionales, que están multiplexadas con otras funciones relacionadas con los temporizadores TMR1 y TMR2, la transmisión-recepción serial, la captura, la comparación y la modulación de ancho de pulsos.
Los PIC16F87x tienen tres temporizadores TMR0, TMR1 y TMR2. El funcionamiento de TMR0 es básicamente igual al de los PIC16C54 y PIC16F84A. TMR1 es un temporizador con 16 bits de capacidad y TMR2 contiene 8 bits con pre y post escalamiento.
En la siguiente tabla se muestra las funciones de los terminales del puerto C.
297
El Temporizador TMR1
INICIO
TMR1 es un temporizador con preescalamiento de conteo ascendente, con una capacidad de 16 bits. Esto significa que se necesitan dos registros para cargar un valor entre 0000H y 0FFFFH: TMR1H (dirección 0FH) y TMR1L (dirección 0EH). Al igual que con TMR0 en el PIC16F84A, al haber un desbordamiento en la cuenta, puede generar una interrupción por medio del bit TMR1IF del registro PIR1. La habilitación de esta interrupción se hace por medio del bit TMR1IE del registro PIE1.
Los pulsos de conteo de TMR1 pueden provenir del oscilador del microcontrolador (fosc/4) o externamente a través de los terminales RC0 o RC1. El registro de control de TMR1 es el T1CON y se ubica en la posición 10H. El diagrama de bloques de TMR1 es el que se muestra en la siguiente figura:
298
Registro de control del TMR1:
T1CON
INICIO
BIT Función
TMR1ON Un “1” en este bit enciende el TMR1
TMR1CS Selección de pulsos del TMR1: “0” fosc/4; “1” Entrada externa (RC0, RC1)
TISYNC# Sincronización con externa con oscilador interno: “0” Sincronizado; “1” No sincronizado
T1OSCEN Habilitación de circuito oscilador. Si T1OSCEN es “1”, Al colocar un cristal de valor inferior a 200KHz entre RC0 (T1OSC0) y RC1 (T1OSC1) generará la base de tiempo del TMR1. Si TOSCEN vale “0” TMR1 funcionará como contador de eventos de RC0
T1CKPS0 Bits del preescalador. Relación de frecuencia según T1CKPS1 - T1CKPS0:
T1CKPS1 0-0 1:1; 0-1 1:2; 1-0 1:4; 1-1 1:8
T1CON (10CH) ---- ---- T1CKPS1 T1CKPS0 T1OSCEN TISYNC# TMR1CS TMR1ON
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
En la figura anterior hemos visto cómo se controla el TMR1 por medio de los bits del registro T1CON. A continuación se describe el funcionamiento de cada uno de estos bits.
299
Algo más sobre TMR1
INICIO
El TMR1 es colocado automáticamente en 0 cuando en la cuenta hay un desbordamiento al pasar de 0FFFFh. Otra forma de hacer 0 a TMR1 automáticamente, es por medio de los módulos CCPs (Comparación, captura y modulación de ancho de pulso). Para ello, alguno de los módulos CCP1, CCP2 o ambos se deben configurar como comparadores.
Se debe tener cuidado al leer o escribir en TMR1 mientras éste se está incrementando, ya que podría suceder que haya un desbordamiento de uno de los 8 bits, y el valor cambie para uno de los registros. Para evitar esto, se recomienda que, durante una operación de lectura o escritura, se detenga a TMR1. En el caso de que éste no se pueda detener, ya que lleva la cuenta del tiempo real del programa, se recomienda hacer la lectura de la siguiente forma:LEETMR1 MOVF TMR1H, W ; Lee el byte de mayor peso de TMR1 a W
MOVWF TEMPH ; El valor va a un registro temporal TEMPHMOVF TMR1L, W ; Lee el byte de menor peso de TMR1MOVF TEMPL ; El valor va a TEMPLMOVF TMR1H, W ; S vuelve a leer el byte de mayor pesoSUBWF TEMPH, W ; Se restan ambas lecturasBTFSC STATUS, Z ; Si el resultado es cero, no hubo cambio en TMR1H mientras se leíaGOTO CONTINUA ; Por lo tanto, el programa continúaGOTO LEETMR1; ; Sino, se vuelve a leer TMR1
CONTINUA ; Continúa con el programa principal
Al escribir un valor en TMR1, se deberá también tener cuidado de que no haya un incremento en TMR1H mientras se ejecuta la operación. Para evitar esto se podría iniciar la escritura borrando inicialmente a TMR1L.
300
Actividades
INICIO
Hemos visto la operación del temporizador 1, y que éste tiene una resolución de 16 bits. Por otro lado, vimos una sección de programa que permite hacer la lectura del TMR1 sin necesidad de detenerlo. Te proponemos que hagas un circuito y programa de un reloj digital, que tenga como base de tiempo a la frecuencia del oscilador del PIC y el temporizador TMR1.
301
El Temporizador TMR2
INICIO
El temporizador TMR2 es un contador ascendente de 8 bits, que se puede leer y escribir, y también puede realizar funciones con el módulo de comunicación serial SSP y los módulos de captura y comparación. TMR2 se ubica en la posición 11H de la memoria RAM, utiliza la señal fosc/4, la cual pasa por un pre-escalador, y luego su salida pasa por un post-escalador. El registro de control de TMR2 es T2CON. A continuación se muestra el diagrama de bloques de TMR2.
El encendido del TMR2 se hace al colocar un “1” en el bit TMR2ON del registro T2CON. La salida de TMR2 puede seleccionarse por software, para que en el puerto de comunicación serial trabaje como generador de baudios. El bit TMR2IF del registro PIR1 se coloca en 1 al haber un desbordamiento del post-escalador de TMR2 y puede ser utilizado como interrupción al habilitarla por medio del bit TMR2IE del registro PIE1.
El registro PR2 (dirección 92H) se utiliza para fijar un valor de conteo máximo del TMR2 cuando se trabaja en modulación de ancho de pulsos (PWM).
302
Registro de control del TMR2:
T2CON
T2SCKPS1 - T2CKPS0 Relación del predivisor
00 1:1
01 1:4
1x 1:16
INICIO
A continuación se describe el funcionamiento de cada uno de los bits del registro T2CON.
T2CON (12CH) ---- - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2SCKPS1 T2SCKPS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Los bits T2SCKPS1 y T2CKPS0 sirven para seleccionar la frecuencia del pre-escalador según la siguiente tabla:
Los bits TOUTPS3 hasta TOUTPS0 sirven para seleccionar la frecuencia del post-escalador según la siguiente tabla: funcionamiento de cada uno de los bits.TOUTPS3 - TOUTPS0 Relación del postdivisor
0000 1:1
0001 1:2
0010 1:3
..... 1:Bn + 1
1110 1:15
1111 1:16
El bit TMR2ON se utiliza para encender con un “1” al TMR2. Un “0 deshabilitará al TMR2.
303
7.9 El Puerto C y los Módulos de Captura, Comparación y PWM
INICIO
Los PIC16F870-872 disponen de un módulo CCP1, mientras que los otros PIC de las serie 16F87x tienen dos módulos CCP: CCP1 y CCP2, los cuales son prácticamente iguales. Las funciones que realizan los módulos CCP son las que se muestran a continuación:• Modo Captura. Dos registros de un módulo CCP capturan el valor de
TMR1 cuando ocurre un evento especial en el terminal RC2/CCP1 o en el terminal RC1/CCP2.
• Modo Comparación. Se compara el valor de TMR1 con el de los dos registros de un CCP, y cuando coinciden ocurre un evento en el terminal RC2/CCP1 o en RC1/CCP2.
• Modo Modulación de Ancho de Pulsos (PWM). Se mantiene un nivel alto en la salida RC2/CCP1 o en RC1/CCP2, según se determina en el módulo CCP correspondiente.
CCP1 utiliza los registros CCPR1H y CCPR1L (posiciones 15H y 16H), y para la configuración se utiliza el registro CCP1CON (17H). Para CCP2 están CCPR2H, CCPR2L y CCP2CON. En la siguiente tabla se muestran los terminales involucrados del puerto C:
SALIDA TMR1
ENTRADA TMR1
E/S DIGITAL
RC0/T1OSC0/
T1CKI
SAL COMP2SAL PWM2
ENTR. TMR1ENTR. CAPT2
E/S DIGITAL
RC1/T10SC1/
CCP2
SAL COMP1SAL PWM1
RELOJ I2CENTRADA DATOS I2C
RELOJ TRANS
SINCRONA
DATOS TRANS
SINCRONA
ENTRADA CAPTURA 1
RELOJ SPI ENTRADA DATOS SPI
SALIDA DATOS
SPI
TRANSMIS. USART
RECEPCIÓN USART
E/S DIGITALE/S DIGITALE/S DIGITALE/S DIGITAL
E/S DIGITALE/S DIGITAL
RC2/CCP1RC3/SCK/SCLRC4/SDI/SDARC5/SDORC6/TX/CKRC7/RX/DT
c
c
c
304
El Registro CCP1CON
INICIO
En el registro CCP1CON se utilizan 4 bits para configurar la función del módulo CCP1, los cuales son CCP1M3-CCP1M0. Por otro lado, los bits CCP1X y CCP1Y sólo se utilizan en el modo PWM y representan los bits menos significativos del valor de un ciclo de trabajo. Los 8 bits más significativos del ciclo de trabajo, se encuentran en el registro CCPR1L. A continuación se presenta la disposición de los bits de CCP1CON y en la tabla se describe el modo de trabajo de CCP1, según los valores de CCP1M3 – CCP1M0.
CCP1M3-CCP1M0 Función
0000 Módulo CCP1 desconectado
0100 Modo captura con cada flanco descendente en RC2/CCP1
0101 Modo captura con cada flanco ascendente en RC2/CCP1
0110 Modo captura con cada 4 flancos ascendentes en RC2/CCP1
0111 Modo captura con cada 16 flancos ascendentes en RC2/CCP1
1000 Modo comparación que activa el terminal RC2/CCP1 al coincidir valores
1001 Modo comparación que desactiva el terminal RC2/CCP1 al coincidir valores
1010 Modo comparación que genera una interrupción (no afecta al terminal RC2/CCP1)
1011 Modo comparación que pone a 0 TMR1 y provoca interrupciones periódicas
11xx Modo PWM
CCP1CON (17H)
---- ---- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
305
El Registro CCP2CON
INICIO
Al igual que CCP1CON, en el registro CCP2CON se utilizan 4 bits para configurar la función del módulo CCP2, los cuales son CCP2M3-CCP2M0; los bits CCP2X y CCP2Y sólo se utilizan en el modo PWM y representan los bits menos significativos del valor de un ciclo de trabajo. Los 8 bits más significativos de ese ciclo de trabajo se encuentran en el registro CCPR2L. A continuación se presenta la disposición de los bits de CCP2CON y el modo de trabajo de CCP2 según los valores de CCP2M3 – CCP2M0.
CCP1M3-CCP1M0 Función
0000 Módulo CCP2 desconectado
0100 Modo captura con cada flanco descendente en RC1/CCP2
0101 Modo captura con cada flanco ascendente en RC1/CCP2
0110 Modo captura con cada 4 flancos ascendentes en RC1/CCP2
0111 Modo captura con cada 16 flancos ascendentes en RC1/CCP2
1000 Modo comparación que activa el terminal RC1/CCP2 al coincidir valores
1001 Modo comparación que desactiva el terminal RC1/CCP2 al coincidir valores
1010 Modo comparación que genera una interrupción (no afecta al terminal RC1/CCP2)
1011 Modo comparación que pone a 0 TMR1 y provoca interrupciones periódicas
11xx Modo PWM
CCP2CON (1DH)
---- ---- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
306
Modo Captura
INICIO
En este modo, si ocurre un evento en los terminales RC2/CCP1 o RC1/CCP2, el valor del temporizador se carga a los registros CCPR1H-L o CCPR2H-L respectivamente. Esto podría utilizarse para la medición de intervalos de tiempo entre pulsos o para la medición de la duración de un pulso. Sin estos módulos, las mediciones de intervalos de tiempo habrían que hacerla con un temporizador al detectar una interrupción externa, el problema está en que la lectura no será precisa debido a que el temporizador sigue contando mientras se ejecuta la rutina de interrupción que va a leer su contenido. En el modo de captura es importante que el TMR1 esté configurado como temporizador o como contador sincrónico para que la transferencia se haga correctamente. Como se vio en las tablas de los registros CCP1CON y CCP2CON, los eventos pueden darse como: una detección de una transición de subida, una detección de una transición de bajada, una detección de 4 pulsos de transición ascendente o una detección de 16 pulsos de transición ascendente. La selección se hace por medio de los bits CCP1M3-0 ó CCP2M3-0, según el módulo que se vaya a utilizar.La resolución en la medición del tiempo de captura y el período máximo están dados por el ancho de los pulsos que activan al TMR1. Por ejemplo si selecciona a fOSC/4 como entrada del TMR1, el escalamiento es 1:1, y la frecuencia fOSC es igual a 20MHz, entonces la resolución de la medición del intervalo será igual a 200nSeg. El período máximo en el cual se podrá hacer la captura, será igual a 13,107mSeg. ¿Por qué?
307
Esquema del Modo Captura
INICIO
En el momento de ocurrir una captura, se activa el indicador CCP1IF del registro PIR1 o el bit CCP2IF del registro PIR2, según el evento que se registra. La interrupción se realizará si están activos el bit GIE del registro INTCON y el bit CCP1IE o CCP2IE de los registros PIE1 o PIE2. Esta interrupción puede ser utilizada para leer el contenido de CCPR1H-L o CCPR2H-L, ya que si ocurre un nuevo evento, entonces se carga el valor de TMR1 después de que este nuevo evento ocurra.En la siguiente figura se puede observar el diagrama de bloques de cómo funcionan los PIC16F87X en el modo de captura para el módulo CCP1.
308
Inicialización en el modo Captura
INICIO
A continuación se presenta la sección de un programa para la inicialización del módulo CCP1, para que éste trabaje en el modo Captura.
CLRF CCP1CON ; El módulo CCP es apagadoCLRF TMR1L ; Borra byte de menor peso del temporizador 1CLRF TMR1H ; Borra byte de mayor peso del temporizador 1CLRF INTCON ; Deshabilita interrupciones y borra TOIFBSF STATUS, RP0 ; Selecciona Banco 1BSF TRISC, CCP1 ; Configura CCP como terminal de entradaCLRF PIE1 ; Deshabilita interrupcionesBCF STATUS, RP0 ; Selecciona Banco 0CLRF PIR1 ; Borra avisos de interrupcionesMOVLW 0x06 ; Configura modo de captura, cada 4 transiciones
ascendenteMOVWF CCP1CON ;BSF T1CON, TMR1ON ; Arranca el temporizador 1
; Al estar la interrupción de CCP1 deshabilitada se evalúa; el bit CCP1IF continuamente
CAPTURABTFSS PIR1, CCP1IFGOTO CAPTURA
; Ocurre la capturaBCF PIR1, CCP1IF ; Este bit debe borrarse antes de la próxima comparación
309
Modo Comparación
INICIO
En este modo se compara continuamente los valores de los registros CCPR1H-L o CCPR2H-L con el de TMR1H-L. En el caso de haber coincidencia, ocurre un evento según se haya programado en los registros CCP1CON y CCP2CON. Estos eventos pueden ser: Colocar un “1” en el terminal RC2/CCP1 o RC1/CCP2; colocar un “0” en uno de esos terminales; activar una interrupción por medio de los bits CCP1IF de PIR1 o CCP2IF de PIR2, sin afectar a los terminales mencionados; o poner en 0 al TMR1. En este último caso, si la comparación ocurre con CCPR1H-L, puede activar una interrupción mediante el bit CCP1IF, y si la comparación ocurre con CCPR2H-L, entonces activa una conversión del módulo convertidor analógico a digital.Al trabajar el módulo CCP en el modo comparación, el módulo TMR1 deberá trabajar en modo temporizador o como contador sincrónico para que se haga la comparación correctamente.Al haber en TMR1H-L un valor igual al de CCPR1H-L o CCPR2H-L, se coloca en “1” el bit CCP1IF del registro PIR1 o el indicador CCP2IF del registro PIR2, según la igualdad que se registre. La interrupción se realizará si están activos el bit GIE del registro INTCON y el bit CCP1IE o CCP2IE de los registros PIE1 o PIE2. Esta interrupción puede ser utilizada para disparar con precisión algún tiristor que controle la velocidad de un motor de corriente alterna. Al igual que en el modo de captura, la precisión del disparo y el tiempo en que éste ocurre, está dada por la frecuencia del oscilador que envía los pulsos a TMR1.
310
Modo Comparación
INICIO
En la siguiente figura se muestra el esquema de funcionamiento en el modo Comparación para el módulo CCP1.
311
Inicialización en el modo Comparación
INICIO
La siguiente sección de programa presenta la configuración del módulo CCP1 para trabajar en el modo Comparación.
CLRF CCP1CON ; El módulo CCP es apagadoCLRF TMR1L ; Borra byte de menor peso del temporizador 1CLRF TMR1H ; Borra byte de mayor peso del temporizador 1CLRF INTCON ; Deshabilita interrupciones y borra TOIFBSF STATUS, RP0 ; Selecciona Banco 1BSF TRISC, CCP1 ; Configura CCP como terminal de entradaCLRF PIE1 ; Deshabilita interrupcionesBCF STATUS, RP0 ; Selecciona Banco 0CLRF PIR1 ; Borra avisos de interrupcionesMOVLW 0x08 ; Configura modo comparación, establece terminalMOVWF CCP1CON ; para la comparaciónBSF T1CON, TMR1ON ; Arranca el temporizador 1
; Al estar la interrupción de CCP1 deshabilitada se evalúa; el bit CCP1IF continuamente
COMPARABTFSS PIR1, CCP1IFGOTO COMPARA
; Ocurre la comparaciónBCF PIR1, CCP1IF ; Este bit debe borrarse antes de la próxima comparación
312
Modo Modulación de Ancho de Pulsos (PWM)
INICIO
En este modo se obtienen pulsos lógicos cuyo ancho en el nivel “1” tiene una duración programable con respecto a un período fijo. La relación entre el tiempo que dura el nivel “1” y el período total, se denomina ciclo de trabajo. Los PWMs tienen aplicaciones en convertidores digitales a analógicos (D/A), control de velocidad de motores DC, disparos de Transistores de potencia en el manejo de motores AC y disparos de relés en el control de temperatura, entre otras. El promedio del valor DC de salida en un PWM es igual al ciclo de trabajo multiplicado por el valor de la tensión de la fuente de alimentación. La siguiente explicación del funcionamiento del módulo PWM de CCP1 aplica también al módulo CCP2 para los PIC16F873-77. El valor alto que se ha de mantener en el terminal RC2/CCP1 está determinado por un tiempo de 10 bits de resolución, donde los 8 bits más significativos del valor que dura el “1” se escribe en el registro CCPR1L y los otros dos bits se escriben en CCP1X-Y del registro CCP1CON. Los 8 bits más significativos del período total, están determinados por el valor que está en el registro PR2. Para ello el TMR2 (8 bits más significativos) y los dos bits de un contador que está conectado entre el preescalador y TMR2, al comenzar a contar, colocan a R2/CCP1 en 1. Cuando el valor del temporizador coincide con el valor que CCPR1L transfirió a CCPR1H, la salida RC2/CCP1 se hace 0, y éste se mantiene hasta que los bits más significativos del temporizador coincidan con el valor de PR2. Cuando esto ocurre, se reinicia TMR2, se vuelve a establecer en “1” RC2/CCP1, exceptuando si el ciclo de trabajo es 0. El valor de CCPR1L se carga a CCPR1H, de esta manera es posible escribir en cualquier momento el valor en CCPR1L, ya que la comparación con ese valor se efectuará después de reiniciarse TMR2.
313
Duración del ciclo en el PWM
INICIO
En el modo PWM, el bit RC2/CCP1 deberá programarse como salida mediante el registro TRISC. El valor del período que entra al contador menos significativo que está antes de TMR2 es igual a Tosc multiplicado por la relación del preescalador. De esta manera, el período del ciclo es:
TCICLO = (PR2 + 1) X 4 X TOSC X preescalador de TMR2
Para el módulo CCP1, el ancho del pulso estará dado por la siguiente ecuación:
T1 = (CCPR1L,CCP1X,CCP1Y) X Tosc X preescalador de TMR2
La resolución del PWM será mejor cuando mayor es el valor de PR2. Para obtener una precisión de 10bits, PR2 deberá valer 255, ya que de esta manera el valor a escribir en CCPR1L, y los bits CCP1X y CCP1Y corresponden a 10 bits. La misma explicación dada hasta ahora se aplica para el CCP2 para los microcontroladores que tienen dos módulos CCP.
314
Diagramas de bloques del PWM
INICIO
A continuación se presenta el diagrama de bloques del modulador de ancho de pulsos para el módulo CCP1.
315
Configuración del PWM
INICIO
La siguiente sección de programa presenta la configuración del PWM.
CLRF CCP1CON ; El módulo CCP es apagadoCLRF TMR2 ; Borra contenido del temporizador 2MOVLW 0x7F ;MOVWF PR2 ;MOVLW 0x1F ;MOVWF CCPR1L ; Configura ciclo de trabajo al 25% del período de PWMCLRF INTCON ; Deshabilita interrupciones y borra TOIFBSF STATUS, RP0 ; Selecciona Banco 1BSF TRiSC, PWM1 ; terminal RC2/PWM1 como terminal de salidaCLRF PIE1 ; Deshabilita interrupcionesBCF STATUS, RP0 ; Selecciona Banco 0CLRF PIR1 ; Borra avisos de interrupcionesMOVLW 0x2C ; Configura modo PWM, 2 bits de bajo peso del cicloMOVWF CCP1CON ; de trabajo = 10BSF T2CON, TMR2ON ; Arranca el temporizador 2
; Al estar la interrupción de CCP1 deshabilitada se evalúa; el bit CCP1IF continuamente
PER_PWMBTFSS PIR1, TMR2IFGOTO PER_PWM
; Se actualiza este período del PWM y sigue siguiente cicloBCF PIR1, TMR2IF ; Este bit debe borrarse antes de la próxima comparación
316
Actividades
INICIO
Las actividades a realizar en esta sección corresponderán a las funciones del módulo de captura, comparación y modulación de anchos de pulso.Con respecto al modo captura, te proponemos que hagas un programa y un circuito capaz de medir el tiempo que tarda en hacer una revolución un motor. Para ello deberás colocar una marca al eje del motor y un sistema de emisión y recepción infrarroja o magnética, de manera que cada vez que se detecte esa marca, se medirá el tiempo transcurrido entre una y otra aparición de la lectura. Por medio de este método, podrás calcular las revoluciones por minuto del motor.Para la parte de comparación, te proponemos mejorar la precisión del reloj digital propuesto en la actividad con el temporizador 1. En este caso, la propuesta es cargar automáticamente un valor al temporizador, por medio de los registros CCPR1H y CCPR1L, de manera que el TMR1 se inicialice automáticamente. Esto te permitirá contar con un contador de tiempo fiel, al cual no tendrás que cargar un valor cada vez que se ponga en “0”. Para ello podríamos fijar que la inicialización del temporizador se efectúe cada 10 mSeg, y utilices este valor como base para el contador de tiempo.En cuanto a la modulación de ancho de pulsos, te proponemos hacer un convertidor digital a analógico que tenga una precisión de 10 bits. Para ello colocarás una resistencia y un condensador como filtro pasa bajo a la salida del modulador de ancho de pulsos, de manera que promedie la señal de salida. El valor DC a la salida del circuito RC será igual a la relación entre el tiempo en que dura el “1” a la salida del PWM y el período total. Deberás en este caso calcular los valores de R y C para que el rizado sea mínimo.
317
7.10 El Puerto C y el Módulo deComunicación Serial Síncrona
La comunicación serial es una manera muy utilizada para la transferencia de datos entre equipos digitales, esto se debe a la cantidad reducida de líneas que utiliza. Los PIC16F87X, con excepción de los PIC16F870 y PIC16F871, tienen un módulo MSSP (Master Synchronous Serial Port) el cual proporciona una interfaz entre el microcontrolador y otros dispositivos electrónicos tales como: otros microcontroladores, memorias seriales, pantallas de cristal líquido, convertidores A/D, etc. Para ello disponen de los terminales: RC3/SDO (Datos de salida), RC4/SDI (Datos de entrada) y RC5/SCK (señal de sincronización o reloj).
El módulo serial, entre otras cosas, puede trabajar en uno de los siguientes modos de comunicación: SPI (Serial Peripheral Interface) e I2C (Inter Integrated Circuit), los cuales son muy utilizados actualmente.
INICIO
En la figura anexa se presenta el diagrama de bloques del módulo MSSP. El funcionamiento de este módulo está basado en el registro de desplazamiento SSPSR, el cual transmite y recibe los datos en serie, por medio de las líneas SDO y SDI respectivamente. La sincronización de SSPSR se ejecuta mediante la señal SCK. La carga y recepción de estos datos se realiza por medio del registro SSPBUF, el cual tiene conexión con el bus interno del microcontrolador. La selección del tipo de transición y el control del desplazamiento de datos del registro SSPSR, se hace por medio de otros registros internos del PIC16F87X.
318
La comunicación SPI
La comunicación en el modo SPI (Serial Peripheral Interface) permite la transferencia de datos de 8 bits en serie, los cuales se transmiten y reciben en forma síncrona y simultáneamente. El microcontrolador en este tipo de transmisión puede trabajar como “maestro” o como “esclavo”. En el caso de trabajar como “esclavo”, además de utilizar los terminales SDO, SDI y SCK, utilizará una línea adicional de selección de esclavo, la cual se ubica en el terminal RA5/SS# y que deberá ser puesta a nivel “0”.
Para que un dispositivo trabaje como “maestro”, se deberá configurar la línea RC5/SCK como salida. Cuando se trabaja en modo “esclavo”, las líneas RC5/SCK y RA5/SS# se deberán configurar como entradas; esta última se colocará a 0V. Para ambos casos, la línea RC3/SDO se configurará como salida y la línea RC4/SDI se configurará como entrada.
La transferencia de información entre el “maestro” y el “esclavo” se suele hacer de la siguiente manera:• Escritura: El “maestro” envía la dirección,
luego el comando de escritura y después el dato.
• Lectura: El “maestro” envía la dirección, luego el comando de lectura y después el “esclavo” envía el dato.
INICIO
319
Formas de onda en modo Maestro
En la figura siguiente se presentan las formas de ondas para la comunicación en el modo SPI. Nótese las diversas combinaciones que se pueden obtener con la señal de sincronización SCK, según los valores de los bits CKP y CKE, los cuales se ubican en los registros SSPCON y SSPSTAT respectivamente. También se observa cuándo un dato en la entrada SDI se tomará como válido según el valor del bit SMP, ubicado en el registro SSPSTAT. Esto es importante para la compatibilidad en la comunicación con otros dispositivos seriales. Finalmente, podemos ver la línea SSPIF del registro PIR1, la cual se utilizará para interrumpir al programa principal cuando un dato se haya transmitido o recibido.
INICIO
320
Formas de onda en modo Esclavo
Similarmente podemos observar a continuación las formas do onda en modo esclavo.
Para CKE=0
INICIO
Para CKE=1
321
Registros asociados
En el modo SPI los registros asociados son los que se presentan en la siguiente tabla. Para mayor detalles de los registros SSPCON y SSPSTAT, nos referiremos a las páginas siguientes en donde se presenta el funcionamiento de cada bit.
INICIO
322
Registro SSPSTATRegistro de Estatus del MSSP
SMP: Modo de muestreo.
Maestro: 1 muestreo al final del dato de salida.
0 muestreo a la mitad del dato de salida.
Esclavo: Debe ponerse en 0.
CKE: Selección de transición de la señal se sincronización.
Si CKP=0: 1 La transmisión ocurre desde el estado de activación hasta el de reposo de la señal de sincronización.
0 La transición ocurre desde el estado de reposo hasta el de activación de la señal de sincronización.
Si CKP=1: 1 El dato es transmitido en la transición de bajada de SCK.
0 El dato es transmitido en la transición de subidad de SCK.
BF: Registro SSPBUF lleno.
1 Recepción terminada. SSPBUF está lleno.
0 No ha finalizado la recepción. SSPBUF está vacío.INICIO
c
323
Registro SSPCONRegistro de control del MSSP
WCOL: Detección de colisión de bits.
1 Hay colisión; 0 No hay colisión.
SSPOV: Indicador de desbordamiento en la recepción.
1 Se recibió dato sin haber leído SSPBUF; 0 No hay desbordamiento.
SSPEN: Habilitación del puerto serial. Los terminales del puerto serial deben ser configurados apropiadamente como entradas y salidas.
1 Puerto serial habilitado. 0 Terminales configurados como E/S.
CKP: Selección de polaridad de la señal de sincronización (SCK).
1 Estado de reposo de SCK = 1; 0 Estado de reposo de SCK = 0.
SSPM3- Modo de trabajo del MSSP. Para el modo de trabajo del puerto serial
SSPM0: síncrono, ver la tabla de la página siguiente.
INICIO
324
Bits SSPM3-SSPM0
INICIO
Modo maestro I2C controlado por firmware, con bits de arranque y parada, interrupción activada y dirección de 10bits
1111
Modo maestro I2C controlado por firmware, con bits de arranque y parada, interrupción activada y dirección de 7bits
1110
Modo maestro I2C controlado por firmware1011
Modo maestro I2C con sincronización = Fosc/(4(SSPAD+1))1000
Modo esclavo I2C con dirección de 10 bits0111
Modo esclavo I2C con dirección de 7 bits0110
Modo esclavo SPI con sincronización igual a SCK (SS# no está activo)0101
Modo esclavo SPI con sincronización igual a SCK (SS# = 0)0100
Modo maestro SPI con sincronización igual a la salida de TMR2/20011
Modo maestro SPI con sincronización a Fosc/640010
Modo maestro SPI con sincronización a Fosc/160001
Modo maestro SPI con sincronización a Fosc/40000
Modo de trabajoSSPM3-SSPM0
c
325
Programa ejemplo
INICIO
Configuración y transmisión y recepción en Modo “maestro”CLRF STATUS ; Selección del banco 0
CLRF SSPSTAT, CKE ; SMP = 0, CKE = 0, bits de STATUS en 0
MOVLW 0x31 ; Activa puerto SPI, modo maestro y CLK/16
MOVWF SSPCON ; Los datos se transmiten en transición de bajada
; Los datos se leen en la mitad del pulso (SMP = 0)
BSF STATUS, RP0 ; Selección del banco 1
BSF PIE, SSPIE ; Habilitación de la interrupción SSP
BCF STATUS, RP0 ; Selección del banco 0
BSF INTCON, GIE ; Habilitación global de interrupciones
MOVLW DATOTX ; Se coloca el dato a ser transmitido
MOVWF SSPBUF ; Comienza la transmisión
•
• ; Lectura de un dato
MOVF SPBUF,W ; Dato pasa a W
MOVWF DATORX ; Se guarda dato en la RAM
MOVF TRANSM,W ; El dato a transmitir va a W
MOVWF SPBUF ; Se carga SPBUF y se transmite el
; dato automáticamente
326
Ejercicio: Transmitir un dato enmodo SPI
INICIO
Configurar el PIC16F87x que vayas a utilizar (con excepción de los PIC16F870 y 871), para que transmita un dato de 8 bits a un registro de desplazamiento 74xx164. Para ello deberás buscar las características de este dispositivo, de manera de hacer compatible la transmisión de datos.
74XX164
SI
Clock
PIC16F87X
SDO
SCK
327
7.11 El Puerto C y la Comunicación I2C
Este protocolo de comunicación fue desarrollado por Philips en la década de 1980. Utiliza dos líneas para la transferencia de información entre varios elementos; éstas son: La SDA, la cual se encarga de la transferencia de datos en forma bidireccional, y la línea SCL la cual es generada por un dispositivo “maestro” hacia los “esclavos”, y lleva los pulsos de sincronización. La interconexión entre dispositivos es la que se muestra en la figura siguiente, en donde puede haber en cada caso, más de un dispositivo “maestro” y no se necesita que todos los dispositivos tengan la misma tecnología digital.
Los dispositivos involucrados en la comunicación I2C se conectan formando un “AND cableado” con las líneas SDA y SCL, ya que las salidas de cada uno es del tipo drenador abierto o colector abierto (open drain or open collector). De allí que sea necesario colocar resistencias a una de las alimentaciones en las líneas SDA y SCL. Esta configuración, a la vez evita que ocurra fallas, en el caso de haber colisión de datos cuando dos dispositivos traten de enviar señales al mismo tiempo. Observa las conexiones de varios elementos y las resistencias Rp en la figura siguiente.
INICIO
NMOS
VDD1
328
Funcionamiento del protocolo I2C
INICIO
Cuando el bus está libre, las líneas SDA y SCL se encuentran en “1”, es decir, los transistores de salida se encuentran en estado “abierto”. Cuando comienza una transmisión, el dispositivo “maestro” envía una señal “0” en la salida SDA, luego la salida SCL se coloca en “0” y después se envía el conjunto de 8 bits en modo serial por la línea SDA, los cuales corresponden a 7 bits de la dirección del “esclavo” con el cual se va a comunicar y un bit de R/W, según la operación que se va a realizar (lectura o escritura); simultáneamente se envían los pulsos de sincronización. Los valores de los bits de la línea SDA se considerarán válidos, en los momentos en que la señal de sincronización está en “1”. Después de enviada la dirección, se envía el bit de parada, el cual corresponde a un “1”. Entonces el dispositivo “esclavo” envía una señal de reconcimiento, que corresponde a un “0”, lo cual indica que se ha recibido la información. A continuación, dependiendo de si la operación es escritura o lectura, se enviará el dato serial del “maestro” al “esclavo” o viceversa. Observa las formas de ondas en la figura anexa. En las figuras de la página siguiente, se observa con mayor detalle, el proceso de comunicación serial I2C en los PIC16F87X, en los que se detallan las señales de estado de este microcontrolador.
(RC4)
(RC3)
329
Formas de ondas en la transmisióny recepción en el protocolo I2C
Formas de onda para la escritura de datos al “esclavo”:
INICIO
Formas de onda para la lectura de datos desde el “esclavo”:
330
Colisión de datos
Existe la posibilidad de que en un bus I2C dos dispositivos “maestros” puedan generar una transmisión simultáneamente. Para resolver este problema los dispositivos maestros “leen” el valor en la línea SDA y lo compara con el valor enviado. En el caso de que envíe un “1” y lee un “0”, querrá decir que otro maestro tiene dominio del bus y por tanto el primero tendrá que ceder e inhibir su salida SDA. Podría suceder que en este conflicto, el maestro que toma el control esté enviando información al maestro que cedió el bus. En este caso el maestro que cedió el bus deberá pasarse a la condición de “esclavo”.
La figura siguiente muestra en un diagrama de tiempo de cómo un primer maestro cede el bus al segundo maestro, ya que el tiempo en “0” del segundo se mantiene por más tiempo que el del primero.
INICIO
331
Diagrama de bloques del módulo I2C en los PIC16F87X
Los PIC16F87X, con excepción de los PIC16F870 y 871, cuentan con un módulo de comunicación serial que puede configurarse con el protocolo I2C. Este módulo genera todas las secuencias necesarias para este protocolo, con un mínimo de programación. La configuración se puede realizar para que trabaje tanto en modo “maestro”, como “esclavo”.
INICIO
332
Registros asociados al I2C
La siguiente tabla muestra los registros asociados al puerto I2C. En cada uno de los registros se podrán encontrar la función de cada bit.
INICIO
0000 00000000 0000A0A1A2A3A4A5A6A7SSPADD93h
0000 00000000 0000TC0TC1TC2TC3TC4TC5TC6TC7TRISC87h
0000 00000000 0000RC0RC1RC2RC3/SClRC4/SDARC5RC6RC7PORTC07h
333
Registro SSPSTAT(Registro de Estatus del MSSP)
INICIO
SMP: Modo de muestreo.1 Control de transición deshabilitado para velocidad estándar (100KHz). 0 Control de transición habilitado para alta velocidad (400KHz).
CKE: Selección de transición de la señal se sincronización.1 Compatibilidad con SMBUS. 0 Compatibilidad con I2C.
D/A: Dato/Dirección1 Último byte fue un dato. 0 Último byte fue una dirección.
P Bit de parada.1 Detección de bit de parada al final. 0 No se detectó bit de parada.
S Bit de arranque.1 Detección de bit de arranque al final. 0 No se detecto el arranque.
R/W Bit de información de lectura y escritura.Modo esclavo: 1 Lectura. 0 Escritura.Modo maestro: 1 Hay una transmisión en proceos. 0 No hay transmisión.
UA Actualización de la dirección.1 Debe actualizarse la dirección. 0 La dirección no se necesita actualizar.
BF Registro SPBUF lleno.Recepción: 1 Recepción completa, SPBUF lleno. 0 Recepción incompleta,
SPBUF vacío.Transmisión: 1 Transmisión en proceso, SPBUF lleno. 0 Transmisión
finalizada.
334
Registro SSPCON(Registro de control del MSSP)
WCOL: Detección de colisión de bits.
1 Hay colisión; 0 No hay colisión.
SSPOV: Indicador de desbordamiento en la recepción.
1 Se recibió dato sin haber leído SPBUF; 0 No hay desbordamiento.
SSPEN: Habilitación del puerto serial. Los terminales del puerto serial deben ser configurados apropiadamente como entradas y salidas.
1 Puerto serial habilitado, configura a SDA y SCL.
0 Terminales configurados como E/S.
CKP: Selección de polaridad de la señal de sincronización (SCL, sólo en modo maestro).
1 Habilita sincronización (reloj); 0 Estado de reposo de SCL = 0.
SSPM3- Modo de trabajo del MSSP. Para el modo de trabajo del puerto serial
SSPM0: síncrono, ver la tabla de la página siguiente.
INICIO
335
Bits SSPM3-SSPM0
INICIO
Modo maestro I2C controlado por firmware, con bits de arranque y parada, interrupción activada y dirección de 10bits
1111
Modo maestro I2C controlado por firmware, con bits de arranque y parada, interrupción activada y dirección de 7bits
1110
Modo maestro I2C controlado por firmware1011
Modo maestro I2C con sincronización = Fosc/(4(SSPADD+1))1000
Modo esclavo I2C con dirección de 10 bits0111
Modo esclavo I2C con dirección de 7 bits0110
Modo esclavo SPI con sincronización igual a SCK (SS# no está activo)0101
Modo esclavo SPI con sincronización igual a SCK (SS# = 0)0100
Modo maestro SPI con sincronización igual a la salida de TMR2/20011
Modo maestro SPI con sincronización a Fosc/640010
Modo maestro SPI con sincronización a Fosc/160001
Modo maestro SPI con sincronización a Fosc/40000
Modo de trabajoSSPM3-SSPM0
c
336
Registro SSPCON2(Registro de control 2 del MSSP)
GCEN: Habilitación de llamada general (sólo en modo esclavo).
1 Habilita interrupción al detectar dirección 0000H; 0 Deshabilitado.
ACKSTAT: Bit de reconocimiento de estatus (Sólo en modo maestro).
1 No se recibió reconocimiento del esclavo; 0 Si hubo reconocimiento.
ACKDT: Bit de reconocimiento de dato (Sólo en modo maestro).
1 No reconocido. 0 Reconocido.
ACKEN: Reconocimiento de habilitación de secuencia (Sólo en modo maestro).
1 Reconoce secuencia en SDA y SCL y transmite bit de reconocimiento = 0
0 Secuencia de reconocimiento en reposo.
RCEN Bit de habilitación de recepción (Sólo en modo maestro).
1 Habilita modo de recepción; 0 Recepción en reposo.
PEN: Habilitación de la condición de parada (Sólo en modo maestro).
1 Habilita condición de parada en SDA y SCL. 0Condición de parada en reposo.
RSEN: Condición de arranque repetido (Sólo en modo maestro).
1 Inicia condición repetida de arranque en SDA y SCL. 0 Arranque en reposo.
SEN: Habilitación de condición de arranque (Sólo en modo maestro).
1 Inicia condición de arranque en SDA y SCL. 0 Condición de arranque en reposo.
INICIO
337
Configuración del puerto I2C
A continuación se presenta una sección de un programa que configura al puerto I2C en el modo “maestro”.
movlw b’00101000’ ; Carga a w el valor de la configuración
clrf STATUS ; Selección del banco 0
movwf SPCON1 ; Configuración en modo maestro
Para configurar la frecuencia de transmisión a 400KHz, asumiendo que la frecuencia del oscilador del microcontrolador es 16MHz, recurrimos a la ecuación:
ftrsm = fosc/(4(SSPADD+1))
movlw b’00001001’ ; Carga a w el valor de configuración
bsf STATUS,RP0 ; Selección del banco 1
movwf SSPADD ; Configuración de la frecuencia de transmisión a 400KHz
La configuración del control de la transición y fase de la sincronización se hace por medio del registro SSPSTAT.
movlw b’00000000’ ; Carga a W el valor de la configuración del registro SSPTAT
movwf SSPSTAT
Finalmente, se deben programar las líneas SCL y SDA como entradas, para que éstas trabajen en el modo I2C.
movlw b’00000110 ; Carga a W el valor de la configuración del puerto C
movwf TRISC ; Configura a SCL y SDA como entradas
INICIO
338
Implementación y control del puerto I2C
Otro aspecto que debemos tomar en cuenta, es si se va a configurar las interrupciones en el caso de que ocurran eventos tales como si hay un dato en SPBUF (bit SSPIE en el registro PIE1) y si hay una colisión al tratar de enviar un dato (bit BCLIE en el registro PIE2).
Una vez configurado el puerto I2C, entonces vendría la parte de implementación y control. Para ello se deberá seguir los siguientes pasos:
1) Arranque (Start).
2) Continuación (Restart).
3) Parada (Stop).
4) Lectura (recepción).
5) Reconocimiento (Acknowlege, después de una lectura).
ACK (Reconocimiento)
NACK (No reconocimiento)
6) Escritura.
Hasta aquí te hemos dado una introducción relacionada con el puerto I2C. Si deseas saber más detallada sobre este tema, te recomendamos que leas la nota de aplicación AN735,
INICIO
339
Actividad
Para esta sección, te proponemos que ubiques componentes que se comuniquen en el modo I2C y desarrolles programas que establezcan la comunicación con esos dispositivos. Si por alguna razón no te es posible ubicarlos, entonces te proponemos que hagas la comunicación entre dos microcontroladores PIC, de manera que transfieran datos entre uno y otro... Utiliza tu imaginación.
INICIO
340
7.12 El Puerto C y el USART
INICIO
Un USART es un Transmisor y Receptor Serial Asíncrono o Síncrono Universal. Éste es un dispositivo de suma importancia para la comunicación con una diversidad de equipos electrónicos, entre los cuales destacan: Computadores Personales, monitores, programadores, controles industriales, MODEM, etc. Los PICs de la serie 16F87X, con excepción del PIC16F872, tienen un módulo USART que puede trabajar en modo bidireccional asíncrono (full duplex) o en modo síncrono unidireccional (half duplex). Veamos en la siguiente tabla, los terminales del puerto C involucrados con este módulo.
En una transmisión sincrónica el terminal RC7/RX/DT se utiliza para la transferencia de datos en forma serial (DT) y en el terminal R6/TX/CK están los pulsos de sincronización (CK). En modo síncrono, el PIC podrá trabajar en los modos “maestro” o “esclavo”.
En una transmisión asíncrona, el terminal RC7/RX se utiliza para la recepción de datos (RX), mientras que el terminal RC6/TX se emplea para la transmisión de datos (TX).
SALIDA TMR1
ENTRADA TMR1
E/S DIGITAL
RC0/T1OSC0/
T1CKI
SAL COMP2SAL PMW2
ENTR. TMR1ENTR. CAPT2
E/S DIGITAL
RC1/T10SC1/
CCP2
SAL COMP1
SAL PMW1
RELOJ I2CENTRADA DATOS I2C
RELOJ TRANS
SINCRONA
DATOS TRANS
SINCRONA
ENTRADA CAPTURA
1
RELOJ SPI ENTRADA DATOS
SPI
SALIDA DATOS
SCPI
TRANSMIS. USART
RECEPCIÓN USART
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITALE/S DIGITAL
RC2/CCP1RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDORC6/TX/CKRC7/RX/DT
c
c
341
Transmisión Asíncrona
INICIO
En la siguiente figura se muestra un esquema de dos equipos que se comunican de manera serial asincrónica.
La comunicación serial asíncrona es muy utilizada en una gran variedad de aplicaciones, tanto en equipos de computación, como en equipos industriales. Su ventaja radica en que sólo necesita de dos o tres cables para interconectar dos equipos, y por medio de ellos transmitir mensajes. Además de esto, debido a que la comunicación se realiza en forma serial, se adapta muy bien a sistemas de transmisión inalámbrica.
Al USART también se le suele llamar SCI por las siglas “Serial Comunications Interface”, y para el protocolo de transmisión de datos, es muy utilizada la norma RS-232-C.
La configuración del USART se hace mediante los registros: TXSTA (dirección 98h), RCSTA (dirección 18h) y SPBRG (dirección 99h), los cuales corresponden al control del transmisor, el control del receptor y el generador de baudios respectivamente.
RS-232C Tx
Rx
Gnd
Rx
Tx
Gnd
PIC 1 PIC 2
342
Diagrama de bloquesde la transmisión del USART
INICIO
En la siguiente figura se muestra el diagrama de funcionamiento de la sección de transmisión serial del USART que se encuentra en los PIC16F87X.
En una transmisión serial asíncrona, para enviar un dato de 8 bits, éste se coloca en el registro TXREG; ese dato se transfiere al registro de desplazamiento TSR, el cual hará que los datos salgan por el terminal de salida RC6/TX/CK. El dato a enviar, podrá tener un bit adicional, el cual se utiliza normalmente para colocar la paridad de los datos transmitidos, según se habilite o no el bit 8 por medio de TX9. Cuando se desea hacer la transmisión se coloca en “1” el bit TXEN (habilitación de transmisión) y con ello, el oscilador del generador de velocidad de transmisión envía los pulsos para que se produzca el desplazamiento de los datos del registro TSR y salgan por el terminal RC6/TX/CK. El bit TXIF, el cual se puede utilizar para interrumpir el programa principal para colocar un nuevo dato en TXREG, se activa cuando un dato se transfiere de TXREG a TSR al iniciarse una nueva transmisión, entonces TXREG está listo para recibir un nuevo dato.
343
Bits de configuración de la transmisión del USART
INICIO
De acuerdo a la explicación anterior, podemos nombrar los bits que configuran al transmisor del USART ubicados en el registro TXSTA.
CSRC: Selección de la fuente del oscilador.1 Modo Maestro (oscilador interno). 0 Modo esclavo (Oscilador
externo)TX9: Habilitación del bit 9 de transmisión.
1 Transmisión de 9 bits. 0 Transmisión de 8 bits.TXEN: Habilitación de la transmisión.
1 Transmisión habilitada. 0 Transmisión inhabilitada.SYNC: Selección del modo de operación del USART.
1 Modo síncrono. 0 Modo asíncrono.BRGH: Velocidad de transmisión:
1 Velocidad alta. 0 Velocidad baja.TRMT: Estado del registro de transmisión:
1 Registro vacío (transmitió los datos). 0 Registro no vacío.TX9D: Bit 9 del dato a transmitir. Usualmente se utiliza para el bit de paridad.
344
Formas de onda en la transmisión asíncrona
Otra manera de observar el funcionamiento de esta interfaz serial, la podemos analizar de acuerdo al diagrama de las formas de onda involucradas.
Vemos que la señal BRG es una oscilación libre, la cual determinará la velocidad de transmisión. En un segmento de transmisión, podemos ver que el envío comienza con un bit de arranque (start bit) que comienza con valor “0”, luego se envía el dato de 8 ó 9 bits y finaliza con un bit de parada (stop bit) el cual es de valor “1”. Un dato se puede escribir en el registro TXREG después de haberse transmitido el bit de parada (stop bit) de un dato previo, es decir, que mientras se está transmitiendo un dato, por medio del registro TSR, se puede cargar otro en el registro TXREG. El bit TXIF del registro PIR1 es el que nos indicará cuándo se puede cargar un dato a transmitir en el registro TXREG. El bit TRMT indicará si el registro TSR está vacío. INICIO
345
Diagrama de bloquesde la recepción del USART
INICIO
Conociendo el funcionamiento de un dispositivo de transmisión serial asíncrona, será más fácil comprender el receptor serial. En principio, el receptor serial deberá ser un dispositivo que lea los datos enviados por el transmisor serial. En la siguiente figura se muestra el diagrama de funcionamiento de la sección de recepción serial del USART que se encuentra en los PIC16F87X.
Los datos entran por el terminal RC7/RX/DT, y de allí pasan al registro RSR cuando el bit CREN está en “1”. El circuito de control de datos de entrada y el generador de baudios, se encargan de transferir el dato al registro RSR. Al llenarse el registro RSR, se activa el bit RCIF del registro PIR1, el cual se puede utilizar como interrupción, y se transfiere el dato a una memoria FIFO con dos datos de capacidad, la cual se podrá leer por medio del PIC16F87X al acceder al registro RCREG.
346
Bits de configuración de la recepción del USART
INICIO
Veamos a continuación la descripción de los bits de configuración del registro RCSTA:
SPEN: Habilitación del puerto serial.1 Puerto serial habilitado. 0 Puerto serial deshabilitado.
RX9: Habilitación del bit 9 de Recepción.1 Recepción de 9bits. 0 Recepción de 8 bits.
SREN: Configuración de la recepción sencilla en modo síncrono maestro.1 Habilita la recepción sencilla. 0 Deshabilita la recepción
sencilla.CREN: Configura la recepción continua.
1 Habilita la recepción continua. 0 Deshabilita la recepción continua.ADDEN: Habilitación de la detección de dirección:
1 Activa la detección de dirección e interrupción. 0 Inhibe la detección de dirección y el bit 9 puede ser utilizado.
FERR: Error de trama:1 Hay error de trama. 0 No hay error de trama.
OERR: Error de desbordamiento1 Hay error de desbordamiento. 0 No hay error de
desbordamiento.RX9D: Bit 9 del dato Recibido. Usualmente se utiliza para el bit de paridad.
347
Formas de onda en la transmisión asíncrona
Otra manera de observar el funcionamiento del receptor serial, la podemos analizar de acuerdo al diagrama de las formas de ondas involucradas.
En la figura se muestra una recepción de tres datos simultáneos. Cada vez que se activa el bit de parada, se transfiere un dato a la FIFO, que es leída como el registro RCREG, y se activa el bit RCIF de PIR1, que puede utilizarse para interrumpir al programa principal del microcontrolador. Si la lectura del registro RCREG no se realiza, y se llena la FIFO, Se colocará el bit OERR en “1”, para indicar que hay un desbordamiento, y que podrían perderse datos.
INICIO
348
Velocidad de transmisión
La cantidad de datos que se pueden enviar por unidad de tiempo depende de la velocidad de transmisión. A mayor velocidad, podremos transferir más rápidamente los datos de un dispositivo a otro, pero esto podría llevar algunos inconvenientes, tales como la incompatibilidad de velocidad con el otro equipo, una mayor probabilidad de error, una menor distancia de transmisión y una mayor dedicación del microcontrolador al manejo de los datos enviados y recibidos. El compromiso está en poder transmitir a la mayor velocidad posible, sin que ocurra algún inconveniente de importancia, lo cual amerita un estudio de mayor profundidad.
En los PIC16F87X, la velocidad de transmisión se puede obtener en base al oscilador interno del microcontrolador o algún oscilador externo. Además se cuenta con el registro SPBRG, el cual fija la relación de velocidad de transmisión en función de la frecuencia del oscilador y el bit BRGH del registro TXSTA. A continuación se presenta esta relación:
Velocidad de transmisión (Baudios o Bits/Seg) = fosc/K(X + 1)
Donde: X es el valor cargado en el registro SPBRGK = 64 si BRGH = 0, y K = 16 si BRGH = 1
En las tablas de la siguiente página, podemos obtener las velocidades de transmisión estandarizadas para la norma RS-232-C, en función de la frecuencia del oscilador y el valor del registro SPBRG y el bit BRGH.
INICIO
349
Determinar la velocidadde transmisión
En el caso de que BGRH=1, obtenemos la siguiente tabla:
En el caso de que BGRH=0, obtenemos la siguiente tabla:
INICIO
350
Pasos para configurar al módulode transmisión serial asíncrono
Para configurar el módulo USART para una transmisión serial asíncrona, se deberá seguir los siguientes pasos:• Configurar R6/TX/CK como salida y R7/RX/DT como entrada por medio de
TRISC.• Se fija la velocidad de transmisión al cargar el valor adecuado en SBREG y
BGRH.• Colocar SYNC = 0, para indicar que la transmisión es asíncrona.• Colocar SPEN = 1, para habilitar al puerto serial.• Colocar los bits GIE y TXIE en “1” si se va a habilitar las interrupciones del
transmisor y el receptor.• Si el dato es de 9 bits, hacer TX9 = 1.• Se activa la transmisión con TXEN = 1, TXIF se colocará en 1, ya que
TXREG se encuentra vacío.• Se carga en TXREG el dato a transmitir, y comienza la transmisión.• Al comenzar la transmisión, si TSR estaba vacío, éste se cargará con el
contenido de TXREG, por tanto se podrá colocar otro dato a enviar en TXREG. Para saber si se puede cargar ese dato, bastará con evaluar el bit TXIF.
INICIO
351
Bits utilizados para latransmisión asíncrona
A continuación se presentan los bits utilizados para configurar la transmisión asíncrona en el USART.
INICIO
En la siguiente página se muestra un programa ejemplo para seguir los pasos mencionados anteriormente.
352
Pasos para configurar al módulode recepción serial asíncrono
Para configurar el módulo USART para una recepción serial asíncrona, en el caso en el que no se haya configurado el bloque transmisor, se deberá seguir los siguientes pasos:• Se fija la velocidad de transmisión al cargar el valor adecuado en SBREG y
BGRH.• Colocar SYNC = 0, para indicar que la transmisión es asíncrona.• Colocar SPEN = 1, para habilitar al puerto serial.• Colocar los bits GIE y RCIE en “1” si se va a habilitar las interrupciones del
transmisor y el receptor.• Si el dato es de 9 bits, hacer RX9 = 1.• Habilitar la recepción al hacer CREN = 1
El módulo de recepción serial quedará configurado. Cuando un dato se recibe, el bit de aviso RCIF se colocará en “1”, y si el bit RCIE está habilitado, habrá una interrupción. En ese momento se podrá leer el registro RCSTA obtener el noveno bit (RX9D) y determinar si hubo algún error en la recepción (bits FERR y OERR). Para leer un próximo dato, estos dos bits deberán ser borrados al colocar en “1” el bit CREN.
Si no se encuentra errores, se leerá el dato en el registro RCREG.
INICIO
353
Bits utilizados para larecepción asíncrona
A continuación se presentan los bits utilizados para configurar la recepción asíncrona en el USART.
INICIO
En la siguiente página se muestra un programa ejemplo para seguir los pasos mencionados anteriormente.
354
Programa de configuracióndel USART en modo asíncrono
; Configuración del USART para transmisión y recepción serial asíncrona
BCF STATUS, RP1
BSF STATUS, RP0 ; Selección del banco 1 para configurar TRISC
MOVLW b’10xxxxxx’ ; Palabra de configuración del puerto C
MOVWR TRISC ; Configura las líneas RC7 como entrada y RC6 como salida
MOVLW BAUDIOS ; Establece la velocidad de transmisión, el valor de
MOVWF SPBRG ; BAUDIOS se calcula según la tablas de SPBRG
MOVLW 0x40 ; Transmisión de 8 bits, modo baja velocidad
MOVWF TXTA ; Modo asincrónico, habilitación del USART
BSF PIE1,TXIE ; Habilita interrupción del transmisor
BSF PIE1,RCIE ; Habilita interrupción del receptor
BCF STATUS,RP0 ; Selección del banco 0
MOVLW 0x90 ; Recepción de 8 bits, receptor habilitado,
MOVWF RCSTA ; Puerto serial habilitado
INICIO
355
Configuración para la recepciónde una dirección
La detección de direcciones en un módulo de comunicación serial tiene aplicaciones en sistemas en donde varios equipos se conectan juntos. Para configurar el módulo USART para la recepción de una dirección, se siguen prácticamente los mismos pasos que en la recepción de un dato, con la diferencia de que en el caso de detectar una dirección, se deberá habilitar el bit ADDEN del registro RCSTA:• Se fija la velocidad de transmisión al cargar el valor adecuado en SBREG y
BGRH.• Colocar SYNC = 0, para indicar que la transmisión es asíncrona.• Colocar SPEN = 1, para habilitar al puerto serial.• Colocar los bits GIE y RCIE en “1” si se va a habilitar las interrupciones
del transmisor y el receptor.• Si el dato es de 9 bits, hacer RX9 = 1.• Colocar en “1” el bit ADDEN para habilitar la lectura de la dirección.• Habilitar la recepción al hacer CREN = 1
El módulo de recepción serial quedará configurado. Cuando una dirección se recibe, el bit de aviso RCIF se colocará en “1”, y si el bit RCIE está habilitado, habrá una interrupción. En ese momento se podrá leer el registro RCSTA obtener el noveno bit (RX9D) y determinar si hubo algún error en la recepción (bits FERR y OERR). Para leer un próximo dato, estos dos bits deberán ser borrados al colocar un “1” en CREN. Si se obtuvo la dirección al leer el registro RCREG, se deberá borrar el bit ADDEN, para la lectura de datos. INICIO
356
Algunos formatos de utilizadosen la transmisión asíncrona
Quizás las interfaces más comunes de comunicación serial que utilizan el USART, son la RS-232 y la RS-485. La mayoría de los computadores personales tiene uno o más puertos que utilizan la interfaz RS-232, la cual sirve para comunicarte con otro dispositivo, tales como un ratón, un módem o un programador de PICs. En el caso de la interfaz RS-485, ésta es muy utilizada en la industria, y permite comunicar un dispositivo maestro con varios esclavos por medio de un par trenzado.
Entre las características del RS-232, se puede mencionar que utiliza comúnmente dos líneas de señal y la referencia o tierra. Las abreviaciones utilizadas para estas líneas son: GND que es la referencia, TXD que es la salida a transmitir y RXD que es la entrada a recibir. Existen también otras líneas que pueden ser utilizadas en algunos casos para el protocolo. Sin embargo, lo común es que se utilicen sólo estas tres líneas.
Los conectores más comunes utilizados para las interfaces RS-232 son los de 9 terminales y un poco menos los de 25 terminales. En la parte posterior de tu computador podrás observar si tienes una interfaz de 9 terminales machos, similar a la que se presenta en la siguiente figura:
A pesar de las nueve líneas que se presentan en el conector, bastaría con utilizar solamente tres. En la figura de la siguiente página se muestra un esquema de la conexión de dos elementos con la interfaz RS-232.
INICIO
357
Conexión RS-232
La figura muestra las líneas de transmisión y recepción, ya que se sobreentiende que éstas están referidas a tierra (GND) y representa el sistema más sencillo de transmisión bidireccional RS-232.
INICIO
Por lo general, una tensión positiva (mayor que +3Vdc) representa un “0” y una negativa (menor que -3Vdc) representa un “1”. Los elementos que se representan por medio de un rectángulo a trazos, se les conoce con el nombre de “Transceiver”, y se utiliza para convertir los niveles lógicos de 0 a 5V en los niveles de voltaje RS-232. Un ejemplo de esta interfaz es el circuito integrado SN75155.
La comunicación RS232 podría ser sencilla, ya que el USART transmite y recibe datos en el formato de bytes. Esta transmisión se podrá hacer más compleja, si se incluye la paridad, las señales de protocolo y el estado de “break”, el cual consiste en una salida cero que se mantiene por un período en el orden de 100mS a 500mS.
INTERFAZ o “TRANSCEIVER”
2
3
358
Asignación de terminales en un conector RS-232
N° Terminal Nombre DTE-DCE Función
1 DCD Detector de portadora de dato
2 RD Recepción de datos
3 TD Transmisión de datos
4 DTR Terminal listo
5 SG Tierra de señales
6 DSR Dato listo en el DCE
7 RTS Responde para enviar
8 CTS Borrar envío
9 RI Indicador de llamada
INICIO
De estos terminales, los que se utilizan con más frecuencia son: RD, TD y SG; es decir: recepción de datos, transmisión de datos y tierra de señales. Debemos recordar que en el equipo de comunicación, el tipo de conector es hembra y el terminal 2 corresponde al de transmisión de datos y el 3 al de recepción de datos.
5 4 3 2 1
9 8 7 6
A continuación, en la siguiente tabla, se presenta la asignación de cada terminal en la mayoría de los conectores macho RS-232-C de 9 pines que emplean terminales o computadores. Además se muestran las abreviaciones y los nombres de cada terminal, y el sentido de flujo de datos entre un DTE (computador o terminal) y DCE (equipo de comunicación).
359
Utilización y configuración delpuerto RS-232-C de tu PC
INICIO
Para hacer utilización del puerto serial de tu computador personal, podrás entrar en el modo “Hiperterminal. Para ello deberás acceder a: Inicio, Programas, Accesorios, Comunicaciones y luego a Hyper Terminal.
Aparecerá entonces la siguiente ventana: En ella deberás hacer doble clic en Hypertrm
360
Utilizando tu PC en modo Hyper Terminal
INICIO
Al acceder al Hyper Terminal, deberás hacer la configuración. Aparecerá la ventana que está a la izquierda, en ella podrás escoger algún icono y colocar un nombre como por ejemplo “Puerto Serial 1”. Luego tendrás que hacer clic en “Aceptar”. Después aparecerá la ventana que está a la derecha, en la cual podrás seleccionar el puerto serial que utilizarás.
Al hacer esto, aparecerá un cuadro para configurar el puerto serial, en el cual deberás seleccionar los parámetros adecuados para la comunicación con tu microcontrolador.
361
Configuración del puerto RS-232-C
INICIO
En la siguiente ventana introducirás los parámetros del puerto de comunicación serial de tu computadora, y deberás seleccionar los valores que sean compatibles con el del puerto USART del PIC16F87X que tú irás a programar.
Después de configurar el puerto serial, tendrás lista tu PC para utilizar su puerto serial. Lo que escribas desde el teclado, será enviado por el terminal TX del puerto serial, y los caracteres que veas en pantalla, serán aquéllos que entran por el terminal RX del mismo puerto.
Es importante que utilices la interfaz que convierta las señales del PIC a los niveles establecidos por la norma RS-232C. Al final de este aparte te proponemos una actividad en la que deberás utilizar el puerto RS-232C.
362
Conexión RS-485
La interfaz RS-485 utiliza señales de transmisión en modo diferencial, de esta manera hay dos señales de voltaje que indican su valor por su diferencia de potencial relativa. Las salidas del RS-485 pueden ser tres estados, lo cual permite la conexión de varios dispositivos para transmitir o recibir con el mismo par de señales. Los dispositivos se configuran en un arreglo de un “maestro” y varios “esclavos”, y la transmisión puede hacerse mediante un par de cables o dos pares de cables. La figura muestra el esquema de conexión en una transmisión con dos pares de cables en donde las líneas son conectadas a varios dispositivos.
INICIO
363
Implementación RS-485
El software para la interfaz RS-485 puede ser significativamente más complejo que el de la interfaz RS-232. Se requiere un protocolo de comunicación para arbitrar el bus, y no exista colisión de datos al tratar de transmitir dos dispositivos a la vez.
Los buses RS-485 se suelen implementar con un “maestro” y varios “esclavos”. El “maestro” es el único dispositivo que inicia la comunicación en el bus, para así evitar problemas de colisiones. Esta comunicación se comienza al enviar una dirección y un comando, entonces el “esclavo” que está siendo seleccionado responderá. Cada esclavo deberá tener una dirección diferente, y debe “entender” el formato de los datos que se le envían. Adicionalmente cada dispositivo debe controlar la habilitación de la señal de salida en su “transceiver”.
Debido a que en el bus se conectan varios dispositivos “esclavos”, el USART debe utilizar el modo de detección de direcciones, al habilitar el bit ADDEN del registro RCSTA. Esto permitirá que en una transmisión, los “esclavos” no seleccionados previamente ignoren los bits de datos recibidos. Si en una transmisión, “el maestro” coloca en “1” el bit ADDEN, se indica que se está transmitiendo una dirección a ellos. En el momento de detectar el bit ADDEN, cada “esclavo” hará la comparación de la dirección recibida con la que ellos tienen establecidas, y en el caso de coincidir, ese “esclavo” sabrá que los datos y comandos siguientes corresponderán a él. Esto reducirá y facilitará el software de comunicación entre varios dispositivos conectados en un mismo par de líneas.
Para más detalles, deberás conocer los formatos de cada protocolo, para que puedas programar el USART en tu PIC. Algunos de los protocolos industriales que utilizan la interfaz RS485 son: el ASCII ANSI X3 28-2.5-A4, el BSAP y el MODBUS, entre otros.
INICIO
364
Transmisión Síncrona enmodo “maestro”
La transmisión síncrona con el USART se realiza en modo Half Duplex, es decir, la transmisión y la recepción no ocurren al mismo tiempo. Al transmitir un dato, la recepción se inhibe y viceversa, ya que éstas se hacen por una misma línea. La otra línea es utilizada para sincronizar los datos, es decir, saldrán los niveles del oscilador si el transmisor es “maestro” o los recibirá si es un dispositivo “esclavo”. La ventaja de la transmisión síncrona, es que ésta es más sencilla y no requiere de una lógica complicada.
Para configurar el módulo USART en la comunicación serial síncrona en modo “maestro” se colocarán en “1” los bits SYNC (modo síncrono) y CSRC (oscilador interno) del registro TXSTA. Al habilitar el bit SPEN del registro RCSTA, se configuran los terminales RC6/TX/CK como el que produce la señal de sincronización o reloj, y el terminal RC7/RX/DT se utilizará como la línea que envía y recibe datos.
La transmisión serial síncrona ocurre de manera similar a la asíncrona. La gran diferencia está en que la señal del oscilador de sincronización, la cual es producida por el generador de baudios, se transmite simultáneamente con la señal de datos.
Para configurar el módulo USART para la transmisión síncrona en modo “maestro”, se deberá hacer pasos similares para la configuración en modo asíncrono. La única diferecncia será que hay que hacer “1” los bits SYNC y CSRC del registro TXSTA.
En la siguiente página se muestran los bits involucrados en la transmisión serial síncrona en modo “maestro” y las formas de ondas.
INICIO
365
Bits y formas de ondas relacionadoscon la transmisión síncrona
INICIO
366
Comunicación Síncrona enmodo “esclavo”
La transmisión síncrona en modo “esclavo” se diferencia de la del modo “maestro” en que, en modo esclavo el oscilador que produce la sincronización de datos es externo al dispositivo. Para especificar que el dispositivo trabaja en modo “esclavo”, se deberá colocar el bit CSRC = 0, el cual está en el registro TXSTA.
En el caso de la recepción síncrona en modo “esclavo”, se siguen los mismos pasos que en modo “maestro”.
Debido a que la sincronización en modo “esclavo” es externa, el dispositivo podrá trabajar en modo “reposo”. En este caso habrá diferencias en la configuración con respecto al modo “maestro”.
INICIO
367
Registros asociados en la comunicación síncrona en modo “esclavo”
INICIO
368
Programa de configuracióndel USART en modo síncrono
; Configuración de la transmisión serial síncrona
BCF STATUS,RP1
BSF STATUS,RP0 ; Selección del Banco 1
MOVLW BAUDIOS ; Establece la velocidad de transmisión
MOVWF SPBRG
MOVLW 0xB0 ; Transmisión de 8 bits, modo baja velocidad
MOVWF TXTA ; Modo sincrónico, habilitación del USART
BSF PIE1,TXIE ; Habilita interrupción del transmisor
BSF PIE1,RCIE ; Habilita interrupción del receptor
BCF STATUS,RP0 ; Selección del banco 0
MOVLW 0x90 ; Recepción de 8 bits, receptor habilitado,
MOVWF RCSTA ; Puerto serial habilitado
INICIO
369
Actividades
Ya hemos visto el funcionamiento del puerto universal sincrónico-asincrónico (USART). En principio, te habíamos mencionado la importancia de este puerto para realizar la comunicación con otros equipos, entre ellos, el computador.
La actividad que se propone, es la de que hagas un programa y montes un circuito que sea capaz de leer una señal analógica, la convierta a digital y la envíe al puerto RS-232 de tu computadora. Claro está, que deberás utilizar una interfaz que convierta la señal de 0 a 5V que maneja tu microcontrolador, en la de 12V a -12V que se emplea en el estándar RS-232-C. Para ello, te proponemos que emplees el dispositivo de la figura anexa, o uno similar. Por otro lado, deberás adquirir un cable para la conexión RS-232, el cual podrás comprar en una tienda de electrónica o computación.
INICIO
SN75155 Recepción
RS232C
Transmisión RS232C
RC7/RX del PIC
-12V
+12V
RC6/TX del PIC
370
Registros asociados al Puerto C
INICIO
0000 0000
0000 0000
BFR/WUASPD/ACKESMPSSPSTAT94h
0000 0000
0000 0000
SSPADD93h
0000 0000
0000 0000
SENRSENPENRCENACKEN
ACKDT
ACKSTATGCENSSPCON291h
0000 0000
0000 0000
SSPM0SSPM1
SSPM2
SSPM3
CKPSSPEN
SSPOV
WCOLSSPCON14h
uuuu uuuu
xxxx xxxxSSPBUF13h
0000 0000
0000 0000
RCREG1Ah
0000 0000
0000 0000
SPBRG99h
0000 0000
0000 0000
TXREG19h
0000 -010
0000 -010TX9DTRMTBRGH
---SYNCTXENTX9CSRCTXTA98h
0000 000x
0000 000x
RX9DOERRFERRADDEN
CRENSRENRX9SPENRCSTA 18h
--00 0000--00 0000CCP2M0
CCP2M1
CCP2M2
CCP2M3
CCP2YCCP2X------CCP2CON1Dh
uuuu uuuu
xxxx xxxxCCPR2H1Ch
uuuu uuuu
xxxx xxxxCCPR2L1Bh
--00 0000--00 0000CCP1M0
CCP1M1
CCP1M2
CCP1M3
CCP1YCCP1X------CCP1CON17h
uuuu uuuu
xxxx xxxxCCPR1H16h
uuuu uuuu
xxxx xxxxCCPR1L15h
1111 1111
1111 1111
uuuu uuuu
Otros
Resets
1111 1111
1111 1111
xxxx xxxx
Valor en POR y BOR
TOCS
RC5
Bit 5
INTDG
RC6
Bit 6
RBPU#
RC7
Bit 7
OPTION_REG
TRISC
PORTC
Registro
PS0PS1PS2PSATOSE81h, 181h
87h
RC0RC1RC2RC3RC407h
Bit 0Bit 1Bit 2Bit 3Bit 4Dirección
Registro de Configuración de PORTC
Registro 1 de Captura, Comparación y PWM menos significativo
Registro 1 de Captura, Comparación y PWM más significativo
Registro 2 de Captura, Comparación y PWM menos
significativo
Registro 2 de Captura, Comparación y PWM más significativo
Registro de datos a transmitir del USART
Registro de generación de la velocidad de transmisión
(Baudios)
Registro de datos recibidos del USART
Registro de datos transmitidos y recibidos del puerto serial
sincrónico
Registro de Direcciones del puerto serial sincrónico en modo
I2C
371
7.13 El Puerto D, el Puerto E y la Interfaz Paralela
RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
E/S DIGITAL
Bit 7 PSP Bit 6 PSP Bit 5 PSP Bit 4 PSP Bit 3 PSP Bit 2 PSP Bit 1 PSP Bit 0 PSP
INICIO
Los PIC16F870/872/873/876 no tienen los puertos D y E, así que la tabla aplica solamente a los PIC16F871, PIC16F874 y PIC16F877.
El puerto D sólo lo tienen los dispositivos de 40 terminales o más. Dispone de 8 líneas bidireccionales multiplexadas y, las que se usan como entradas, tienen un disparador de Schmitt. El puerto D o PORTD, se ubica en la dirección 08h, mientras que TRISD se encuentra en la 88h.
El puerto D puede utilizarse como puerto paralelo esclavo de 8 líneas (PSP). Para que trabaje de esta manera, se deberá colocar el bit PSMODE en “1”. Este bit se ubica en la posición 4 del registro TRISE. Las líneas de control del puerto paralelo PSP, las cuales son RD, WR y CS se encuentran en el puerto E
En la siguiente tabla, podemos observar la función de cada terminal del puerto D.
372
Diagrama de bloques delPuerto Paralelo
INICIO
El puerto paralelo opera con palabras de 8 bits cuando el bit de control PSPMODE, ubicado en TRISE, se coloque en “1”. En el caso de que el puerto trabaje en modo “esclavo”, se podrá leer o escribir de manera asíncrona por medio de los terminales RE0/RD y RE1/WR respectivamente.
La interfaz paralela puede hacer del microcontrolador, un dispositivo de comunicación con microprocesadores de 8bits. Para ello se deberán configurar los bits RE2/CS, RE1/WR y RE0/RD como entradas de control que se conectarían a la selección del dispositivo (CS), la lectura RD y la escritura WR. Los datos se conectarán a las líneas del puerto D, que al ser bidireccionales, no tendrá efecto el registro TRISD en el puerto D.
En la siguiente figura se presenta el diagrama de bloques del puerto paralelo. Al analizar este diagrama, se podrá comprender el funcionamiento de las líneas del puerto D y las líneas de control que se encuentran en el puerto E.
373
Formas de onda parala escritura de datos
INICIO
La escritura en el puerto PSP ocurre al colocar en “0” las líneas CS y WR. Cuando estas líneas pasan a “1”, el bit IBF, el cual indica que el registro de entrada está lleno, y está ubicado en el registro TRISE se establece en el período Q4 del siguiente ciclo del oscilador del microcontrolador. La señal estará escrita cuando aparece el pulso Q2 de ese ciclo. El bit de aviso de interrupción PSPIF, ubicado en PIR1, se establecerá también en el período Q4 y se podrá utilizar para interrumpir al microcontrolador. Este bit se borrará al leer el dato en el puerto D en el programa del microcontrolador. El bit de desbordamiento, IBOV, ubicado en TRISE, se colocará en “1”, si una nueva escritura se hace en el registro del PSP antes de haberse leído el dato que estaba en ese registro. En la siguiente figura se presentan las formas de onda para la escritura de datos en el PSP.
374
Formas de onda parala lectura de datos
INICIO
La lectura del PSP ocurre cuando se detecta un “0” en cada una de las líneas CS y RD. El bit que indica que el registro de salida está lleno (OBF), ubicado en el registro TRISE, se coloca en cero inmediatamente, para indicar que el puerto D está a la espera de ser leído por el bus externo. Al colocar el bit CS o RD en “1”, el bit de interrupción PSPIF se coloca en “1” en el período Q4 del ciclo del oscilador del microcontrolador, para indicar que la lectura ha sido realizada. En la siguiente figura se presentan las formas de onda para la lectura de datos.
375
Registros asociados alPuerto Paralelo
INICIO
La ventaja de utilizar al puerto paralelo como elemento controlado por otro dispositivo externo, es que nos permite hacer transferencias de datos de un dispositivo a otro de manera más rápida e independiente, y para ello se utilizarían las interrupciones.
En la siguiente tabla se encuentran los bits asociados al puerto paralelo.
376
Registros Asociados a PORTD
INICIO
0000 -111
1111 1111
uuuu uuuu
Otros
Resets
0000 -111
1111 1111
xxxx xxxx
Valor en POR y BOR
IBOV
RD5
Bit 5
OBF
RD6
Bit 6
IBF
RD7
Bit 7
TRISE
TRISD
PORTD
Registro
PSPMODE
89h
88h
RD0RD1RD2RD3RD408h
Bit 0Bit 1Bit 2Bit 3Bit 4Dirección
Registro de Configuración de PORTD Registro de
Configuración de PORTE
377
El Puerto E
INICIO
El puerto E o PORTE ocupa la dirección 09h, dispone de 3 líneas bidireccionales, multiplexadas con otras funciones relacionadas con el control del puerto paralelo esclavo (PSP) y las entradas del Convertidor Analógico a Digital.
Los PIC16F870/872/873/876 no tienen los puerto D y E, así que la tabla aplica solamente a los PIC16F871, PIC16F874 y PIC16F877.
La configuración del puerto E se realiza por medio del registro TRISE.
Lectura en el modo PSP (RD)
Entrada Analógica 5
E/S DIGITAL
RE0/RD#/AN5
Escritura en el modo PSP (WR)
Entrada Analógica 6
E/S DIGITAL
RE1/WR#/AN6
Selección de Chip en el modo PSP
(CS)
Entrada Analógica 7
E/S DIGITAL
RE2/CS#/AN7
0000 -111
Otros
Resets
0000 -111
Valor en POR y BOR
IBOV
Bit 5
OBF
Bit 6
IBF
Bit 7
TRISE
Registro
---PSPMOD
E
89h
Bit 0Bit 1Bit 2Bit 3Bit 4Dirección
Configuración de las
Entradas/Salida Digitales
378
Actividades
INICIO
Con este aparte finalizamos la descripción de los módulos de los PIC16F87X. La primera actividad propuesta, relacionada con el puerto paralelo, será la de conectar dos microcontroladores entre sí por medio del puerto paralelo. Deberás enviar datos desde uno a otro, mediante un programa que tú mismo elaborarás. Recuerda utilizar las líneas de control RD, WR y CS, para el control del flujo de datos.
Otra actividad que podrás realizar, es la de transferir datos desde el puerto paralelo de tu computadora. Para ello, deberás buscar información de cómo se conectan las líneas de este puerto.
379
7.14 Palabra de Configuración
La palabra de configuración es una posición reservada en la memoria de programa, que se ubica en la posición 2007h, y sólo se puede acceder a ella en el momento de la grabación del PIC. Los bits de esta palabra determinarán algunas características de funcionamiento del microcontrolador.B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0
CP1 CP0 - Debug
WRT CP0
LVP BODEN CP1
CP0
PWRTE# WDTE FOSC1 FOSC0
Los bits FOSC0, FOSC1, WDTE y PWRTE# se configuran de la misma manera que en los PIC16F84A y PIC16C54 (repasar). CP1 y CP0 se utilizan para proteger secciones de la memoria de programa, y éstas dependen de los modelos del PIC que se va a utilizar. Para más detalles, véase la tabla de la página siguiente.
• BODEN. Habilitación de inicialización por caída de tensión. 1 Habilitada, 0 Deshabiltada.
• LVP. Habilitación para programar en bajo voltaje. 1 RB3 habilitada, 0 RB3 funciona como E/S digital y la programación se realizará por alto voltaje.
• CPD. Protección de la memoria EEPROM de datos. 1 No protegida, 0 Protegida
• WRT. Habilitación para la escritura de la memoria de programa FLASH. 1 Se podrá escribir en la parte no protegida de la FLASH, 0 No se permitirá la escritura.
• Debug. Modo de depuración del circuito. 1 Desactivado. RB7 y RB6 actuarán como líneas de E/S. 0 Activado. RB7 y RB6 actúan en modo de depuración. La depuración se podrá hacer desde el MPLAB.
INICIO
380
Protección de la memoria deprograma de los PIC16F87X
Modelo PIC CP1 CP0 Dirección inicial de
protección
Dirección final de protección
PIC16F870/871/872 0 0 TODO PROTEGIDO
PIC16F873/874 0 0 0000H 0FFFH
PIC16F873/874 0 1 0800H 0FFFH
PIC16F873/874 1 0 0F00H 0FFFH
PIC16F876/877 0 0 0000H 1FFFH
PIC16F876/877 0 1 1000H 1FFFH
PIC16F876/877 1 0 1F00H 1FFFH
Todos los modelos 1 1 NO PROTEGIDO
INICIO
Conclusión
Hemos hablado acerca de lo que puedes hacer con los microcontroladores PIC y has visto la descripción de algunos de ellos, desde el más básico, el PIC16C54, hasta los de la gama media de la serie PIC16F87X. Entre ellos podrás considerar sus potencialidades a la hora de hacer algún diseño.
Has aprendido las instrucciones del lenguaje ensamblador y la forma en que puedes desarrollar programas y grabarlos para realizar varias aplicaciones.
Has visto cómo trabajan los módulos de circuitos incluidos en los diferentes microcontroladores y cómo acceder a sus registros de configuración. Pudiste observar también la importancia de estos módulos para el desarrollo de interfaces con el mundo exterior.
En el anexo 5 te presentamos algunos circuitos, notas de aplicación y direcciones de Internet, los cuales te ayudarán a ampliar los conocimientos sobre los microcontroladores PIC.
Tu estudio siguiente lo podrás hacer en los microcontroladores PIC18FXXX, lenguaje C, y los procesadores de señal dsPIC o TMS320.
Finalmente, te deseamos el mejor de los éxitos, y si encuentras alguna sugerencia para mejorar y promocionar este material, podrás escribir un correo electrónico a la dirección:[email protected]
INICIO
ANEXOS
ANEXO 1. GLOSARIO ANEXO 2. EXPLICACIÓN DETALLADA DE LAS INSTRUCCIONES ANEXO 3. DIRECTIVAS DEL LENGUAJE ENSAMBLADOR ANEXO 4. REGISTROS Y BITS DE FUNCIONES ESPECIALES ANEXO 5. INTERFACES Y PROYECTOS CON MICROCONTROLADORE
S PIC ANEXO 6. ACTUALIZACIÓN DEL PICSTART PLUS ANEXO 7. GRABACIÓN DE UN PROGRAMA EN LOS PIC16F87X
INICIO
383
GLO
SARIO
INICIO
384
Símbolo matemático que indica mayor o igual que.
Símbolo matemático que indica menor o igual que.
<> Los valores que estén encerrados en estos símbolos, indican
bits que
están asignados a un registro.
El valor que esté debajo de una línea continua, indica que
está negado o invertido lógicamente.
INICIO
385
Acceso: Entrada de datos a un lugar de memoria o puerto.
Actuador: Elemento de acción final en un sistema de control.
A/DC: Convertidor Analógico a digital.
ADD: Instrucción que ejecuta la operación suma o adición.
Analógico: Se dice a aquella señal o función que varía de forma continua en el tiempo.
AND: Instrucción que ejecuta la operación lógica AND, la cual tiene como resultado “0”, cuando cualquiera de sus entradas es “0”.
INICIO
386
Aritmética: Operación matemática, normalmente se refiere a una instrucción que ejecuta una suma, resta, incremento o decremento.
Arquitectura: Estructura interna de un microcontrolador donde se ubica sus elementos y la interconexión entre ellos.
ASCII: Se refiere a un formato internacional de caracteres, en los que un código binario corresponde a una letra, número o signo utilizado en un idioma. También corresponde a un protocolo de comunicación entre varios dispositivos. El protocolo ASCII ANSI X3 28-2.5-A4, corresponde a una norma de comunicación industrial en los que varios dispositivos se conectan a un par de cables.
Asincrónico: Que no está sincronizado con otra señal.
Atmel: Fabricante de semiconductores.
INICIO
387
B (b): Posición de un bit en un registro.
Bajo consumo: Que absorbe poca potencia.
Básica: Se refiere a la gama de los microcontroladores con palabras de instrucción de 12 bits.
Bidireccional: Que puede transferir datos en las dos direcciones.
Bit: Es la mínima unidad de información. Puede valer “0” ó “1”.
Booleano: Se refiere a la lógica o los elementos digitales.
Boole: Matemático que desarrolló el álgebra que lleva su nombre y los postulados de lógica que se usa como base para la elaboración de funciones digitales.
INICIO
388
Borrado: Acción de colocar los datos con valor “0”. En el caso de las memorias EPROM, EEPROM y FLASH, la acción de borrar significa colocar todos los datos en “1”.
BSAP: Se refiere a las siglas “Bristol Synchronous Asynchronous Protocol”. Es un protocolo utilizado para el control y supervisión de sistemas de control.
Bus: Líneas que agrupan dirección, datos o señales de control.
Byte: Octeto o agrupación de 8 bits.
INICIO
389
C: Lenguaje de programación de alto nivel. Es muy utilizado para compilar programas a lenguaje de máquina.
CAN: Protocolo de comunicación serial utilizado en la industria.
Call: Instrucción que consiste en llamar a una rutina o subprograma.
Capacitor: Condensador eléctrico.
Carry o C: Es el bit 0 del registro STATUS, que indica cuándo en una operación de suma se lleva un acarreo, o en una resta se lleva un débito.
Cero: Valor nulo.
Cext: Condensador externo.
Chip: Circuito integrado.
Ciclo: Período en el cual transcurre una instrucción.
CLEAR: Instrucción de borrado o puesta a cero de un dato.
INICIO
390
CLK: Reloj o señal de oscilación que define la frecuencia de trabajo del microcontrolador.
CMOS: Tecnología digital de bajo consumo, basada en el uso de transistoresMOS complementarios (Complementary Metal Oxide Semiconductor).
CLKOUT: Señal de salida del reloj o CLK.
Comparador: Elemento que lee dos magnitudes y las compara.
Complemento: Obtención del valor opuesto.
Configuración: Efecto de establecer unas condiciones que definen algunas funciones permanentes de un dispositivo.
Contador: Registro que efectúa la acción de contar.
Control: Organización de determinada información.
CPU: “Central Processor Unit” Unidad central deProcesamiento. Microprocesador.
INICIO
391
D/AC: Convertidor Digital a Analógico.
Dallas: Fabricante de Semiconductores
Dato: Cualquier valor que puede leerse o escribirse en un registro o memoria o puerto
DC: Corriente Directa. Acarreo decimal (Decimal Carry)
Decimal Carry: Acarreo decimal referido a un nibble. Corresponde al bit 1 del registro STATUS. Cuando en una operación suma (o resta) se excede el valor 1111, se activa el Decimal Carry.
Decremento: Disminución en una unidad el valor de un dato específico.
Deshabilitar: Inhabilitar o inhibir las funciones de un elemento.
INICIO
392
Dirección: Valor numérico o etiqueta en donde se puede ubicar un determinado dato o instrucción en una posición de memoria.
Disparador de Schmitt: Elemento que incorpora a su entrada un detector de
histéresis, es decir que compara con dos valores, según si laseñal a detectar tiene pendiente positiva o negativa.
DRT: Temporizador interno que retarda la inicialización del microcontrolador en aproximadamente 18 mseg.
INICIO
393
EEPROM: Memoria para lectura solamente, a la que se le puede grabar con pulsos eléctricos. Esta memoria se puede usar para guardar datos, que deben mantenerse, aun al quitar la alimentación de la memoria.
Ejecución: Acción de realizar la instrucción o instrucciones de un programa.
Embedded: Elemento dentro de otro, normalmente se refiere al microcontrolador como un sistema dentro de un chip
Emulador: Elemento que imita al microcontrolador, y que posee los mismos terminales que éste, y una conexión a la computadora.
Éste se inserta en el conector destinado al microcontrolador en un prototipo, y mediantela computadora se puede observar y corregirel programa que esté en el sistema diseñado
INICIO
394
Entrada: Terminal de conexión cuya señal se dirige hacia un dispositivo.
Entrada-Salida: Terminales de conexión al microcontrolador que pueden emplearse como entrada o salida.
EPROM: “Eraseble Programable Read Only Memory” Memoria de sólo lectura, que puede ser borrada con luz ultravioleta, y luego puede ser regrabada.
Escalamiento: Efecto de cambiar de escala a un valor.
Escribir: Almacenar un dato en una memoria, registro o puerto.
Escritura: Almacenamiento de un dato en una memoria, registro o puerto.
EXOR: Instrucción que ejecuta la función lógica “o exclusivo”. Esta instrucción definida para dos entradas tiene como resultado 0, si las dos entradas son iguales. Tiene como resultado 1 si las dos entradas son diferentes.
INICIO
395
F: Apuntador de direcciones de los registros de la memoria de datos.
FIFO: De las siglas “First In First Out” (Primero entrado, primero salido. Se refiere a las memorias cuyos datos van a una pila, y el dato que se lee es el que entró de primero.
Flash: Memoria de programa que puede borrar grupos de datos por medio de pulsos eléctricos.
FOSC: Frecuencia del oscilador del microcontrolador (reloj).
FSR: Registro apuntador de direcciones de la memoria de datos.
Gama: Grupo.
GOTO: Instrucción utilizada para cambiar la dirección de
ejecución del programa.
y
INICIO
396
e
Handbook: Manual del fabricante.
Harvard: Arquitectura que consiste en separar la memoria de programa de la de datos.
Hitachi: Fabricante japonés de semiconductores.
Hz: Unidad de frecuencia que indica Hertz o ciclo por segundo.
I2C ó I2C: Protocolo de comunicación serial desarrollado por Philips. Este protocolo permite comunicar varios dispositivos utilizando únicamente dos líneas y el común.
I/O: Entrada/Salida.
Incremento: Aumenta en una unidad el valor de un dato específico.
IND: Registro de acceso indirecto, cuya dirección está dada
por el registro FSR.
INICIO
397
Inicialización: Acción y efecto de dar valores iniciales a un dispositivo.
Instrucción: Acción que se desea que ejecute una línea de un programa.
INTCON: Registro de control de interrupciones
Intel: Fabricante estadounidense de microprocesadores y otros semiconductores.
Interfaz: Punto de enlace entre dos medios. Normalmente se aplica a las entradas y salidas de una computadora con el medio.
Interrupción: Detención momentánea de un programa, debido al llamado de un elemento que necesita ser atendido por medio de una rutina.
IOR: Instrucción que ejecuta la función lógica OR (inclusivo).
INICIO
398
yK: Prefijo que significa 1000. Letra que se utiliza para designar
a una constante.
K: Unidad de resistencia eléctrica equivalente a 1000 ohmios.
LCD: Pantalla de cristal líquido (Liquid Crystal Display).
Lectura: Obtención de un dato de una memoria, registro o puerto.
Leer: Acción y efecto de obtener un dato desde una memoria,
registro o puerto.
Literal: Valor constante o etiqueta.
Lógica: Que se relaciona con el álgebra de Boole o elementosdigitales. Sólo toma dos valores: “0” ó “1”.
LSB: Bit menos significativo o de menor peso.(Least Significant bit).
INICIO
399
MCLR: Entrada de inicialización del dispositivo. Se activa con “0”. Este terminal también tiene la funcion Vpp, que es la tensión de programación els microcontrolador.
MCS: “Micro-Computer System”. Se refiere a un sistema realizado con microcomputador e interfaces.
MCU: “Microcontroller Unit”. Se refiere a un microcontrolador.
Media: Se refiere a la gama de los microcontroladores que tienen palabras de instrucción de 14 bits.
Memoria Memory: Elemento capaz de almacenar información (datos o programas).
Programming: Grabación o programación de una memoria.
MHz: Unidad de frecuencia equivalente a un millón de Hertz.
Microchip: Fabricante estadounidense de semiconductores.
Microcomputadora: Computadora pequeña, antes se refería así a un microcontrolador.
Microcontrolador: Dispositivo que está compuesto de un microprocesador, memorias, puertos, temporizadores y algunos
otros elementos,que ejecuta una o más funcionesespecíficas de acuerdo a su programación y conexión.
INICIO
400
Microprocesador: Elemento que consta de una unidad de control, registros y unidad de lógica y aritmética, capaz de realizar funciones de procesamiento y cómputo.
MIPS: Millones de instrucciones por segundo, esto da una idea de la velocidad de procesamiento de un microprocesador o microcontrolador.
MODBUS: Protocolo industrial utilizado para el control de procesos.
MODEM: Se refiere al término “Modulador Demodulador”, y es un dispositivo que se emplea para transmitir y recibir señales por medio de la modulación y demodulación de la misma.
Motorola: Fabricante estadounidense de semiconductores y equipos de comunicación.
MOVE: Instrucción que transfiere un dato de un lugar a otro.
MPLAB: Software de ambiente de desarrollo para los PIC.
MSb: Bit más significativo o de mayor peso. (More Significant bit).
mseg o ms: Unidad de tiempo que representa una milésima de segundo.
Mux: Multi-seleccionador o multiplexer, elemento que conmuta varias señales.
INICIO
401
NationalSemiconductor: Fabricante estadounidense de semiconductores.
NEC: Fabricante japonés de semiconductores.
Nibbles: Agrupación de 4 bits.
NMOS: Tecnología digital basada en transistores MOSFET canal N.
NOP: Instrucción que no ejecuta ninguna operación.
nSeg: Unidad de tiempo que representa una milmillonésima parte de segundo.
INICIO
402
OPTION: Registro que configura el escalamiento del TMRO o el WDT.
OR: Función lógica cuyo resultado es “1”, cuando cualquiera de sus
entradas es “1”.
Oscilador: Circuito capaz de producir una señal cíclica a una frecuencia estable.
OSC1/CLKIN: Es una de las conexiones para un cristal resonador, que fije la frecuencia de oscilación. En el caso de no utilizar un cristal resonador, ese terminal se podrá conectar a la
entrada de un oscilador externo.
OSC2/CLKOUT: Es la otra conexión para un cristal resonador. En modo RC, ésta es la salida de oscilación que tiene un valor de ¼
de la frecuencia de OSC1, y determina el tiempo de duración de un ciclo de instrucción.
OTP: Dispositivo programable una sola vez.
INICIO
403
PA: Puerto A (PORTA).
Paralelo: Se aplica a un conjunto de datos que se envían o reciben en forma simultánea por un medio de transmisión que utiliza un grupo de líneas.
PB: Puerto B. (PORTB).
PC: Contador de programa. Puerto C (PORTC).
PD: PD Bit 5 del registro STATUS que indica que el dispositivo está en el modo “SLEEP” o Reposo. Puerto D (PORTD).
Perro Guardián:“Watchdog”, término con el que se le designa al temporizador que hace la inicialización del microcontrolador, cuando detecta una condición anormal.
Philips: Fabricante de semiconductores. Entre otras cosas es una empresa considerada un gigante en productos electrónicos. INICIO
404
PIC: “Peripheral Interface Controller” Sigla que identifica a los microcontroladores de Microchip.
PICSTART PLUS:Programador para cualquier microcontrolador PIC.
Pila: “Stack”, registros donde se guardan las direcciones de retorno de rutinas.
POR: “Power on reset”, circuito de inicialización por encendido.
PORT: Nombre con el que se designa a cada puerto, el cual es una interfaz o registro de conexión externa del microcontrolador.
Programa: Secuencia y efecto de escribir instrucciones que realizan una función específica.
Programador: Dispositivo que graba un programa en el microcontrolador. Persona que desarrolla un programa.
INICIO
405
PROM: “Programble Read Only Memory” Memoria programable sólo para lectura.
PS: Bit que se encuentra en el registro OPTION, y que está relacionado con el escalamiento. El bit PSA
(Bit 3 de OPTION), es el bit de asignación al escalamiento, y los bits PS0 - PS2 (Bits 0 al 2 de OPTION) están relacionado con el valor del escalamiento.
Puerto: Interfaz o registro de conexión externa a un microcontrolador.
Puerto Serial: Interfaz que transmite o recibe datos en una sola línea. Los datos se envían de manera secuencial en grupos de varios bits y además se incluyen bits de control.
Pull up: Conexión a la fuente de alimentación positiva. Se refiere normalmente a las resistencias que se conectan al voltaje de alimentación (VDD).
PWM: “Pulse With Modulator” Modulador de ancho de pulsos.
INICIO
406
RA0 – RA4: Terminal de conexión del puerto A, el sufijo indica el bit
que corresponde a ese puerto.
RAM: “Random Access Memory” Memoria para escritura y
lectura.
RB0 – RB7: Terminal de conexión del puerto B, el sufijo indica el bit
que corresponde a ese puerto.
RC: Resistencia - Condensador. Terminal de conexión del
puerto C, el sufijo indica el bit que corresponde a ese
puerto.
Registro: Elemento electrónico que almacena un dato.
Reloj: Señal producida por un oscilador que se utiliza como
referencia del tiempo.
Reset: Inicialización. Efecto de dar condiciones iniciales a algoINICIO
407
Resistencia: Elemento eléctrico que se opone parcialmente al paso de la
corriente eléctrica.
Resonante: Que tiene una frecuencia natural de oscilación.
RET, RETURN: Instrucción de retorno. Se aplica cuando una rutina finaliza.
REXT: Resistencia externa.
RISC: Conjunto reducido de instrucciones (Reduced Instruction Set).
Se utiliza en microprocesadores de alta velocidad.
Rodar: Desplazar los bits de un registro.
ROM: “Read Only Memory” Memoria sólo para lectura.
Rotación: Acción y efecto de desplazar los bits de un registro.
Rutina: Subprograma que se ejecuta en forma separada al programa principal.
INICIO
408
Salida: Terminal de conexión cuya señal es generada por un dispositivo.
Salto: Cambio de dirección de la memoria de programa en forma no secuencial.
Sensor: Elemento que detecta una variable física y la convierte en señal eléctrica.
Serial: Se aplica a los datos que entran o salen uno por uno o bit por bit en una sola línea de transmisión.
SGS-THOMSON: Fabricante europeo de semiconductores.
Siemens: Fabricante europeo de semiconductores.
INICIO
409
Sincrónico: Que ocurre a la par de otra señal guía.
Sleep: Dormir. Se emplea para decir que un dispositivo está en reposo, y por tanto disminuye el consumo de potencia.
Stack: Pila de registros donde se almacenan las direcciones de retorno de las rutinas.
STATUS: Registro donde se guarda los bits de control de un microprocesador.
SUB: Instrucción que ejecuta la resta de dos valores.
Subrutina: Subprograma de una rutina.
SWAP: Instrucción que intercambia la posición de los nibles
(agrupación de 4 bits) de un registro.
INICIO
410 INICIO
Tecnología Se refiere al tipo de semiconductor utilizado en los dispositivosDgital: lógicos. Destacan: TTL, CMOS, NMOS, ECL, PMOS, etc.
Temporizador: “Timer”, elemento que contabiliza el tiempo.
Terminal: Conexión física de un elemento.
Texas Fabricante estadounidense de semiconductores. Son muyInstruments: conocidos los DSPs que fabrica esta compañía.
Tiempo Tiempo por el cual no se ejecutará una acción alguna, hasta quede espera: éste se acabe.
Timer: Temporizador, elemento que contabiliza el tiempo.
TMRO: Temporizador 0. Contiene una longitud de 8 bits.
TO: Tiempo de espera (time out). TO corresponde al bit 4 del
registro STATUS, e indica si la ejecución del programade un microcontrolador, ha sido interrumpido por el
WDT.
411
TOCKI: Es el terminal que corresponde a la base de tiempo del temporizador 0 (TMR0). Debe colocarse a Vss
o VDD en el caso de no utilizarse, para reducir el consumo de energía.
TOCS: Bit 5 del registro OPTION, que se utiliza como selección de la fuente del temporizador 0.
TOSE: Bit 4 del registro OPTION, que se utiliza como selección de la transición de la fuente del temporizador 0.
Toshiba: Fabricante japonés de semiconductores.
Transferencia: Mover un dato de un registro, memoria o puerto a otra posición.
Tres estados: Son salidas de dispositivos lógicos que tienen, además de los estados “0” y “1”, un tercer estado que es el de alta impedancia o desconexión. Esto es útil para la transferencia de datos de forma bidireccional.
TRIS: Registro de programación de los puertos del microcontrolador.
INICIO
412
y
USART: Transmisor y receptor universal sincrónico o asincrónico.
VDD: Terminal que se conecta al voltaje de alimentación positiva en circuitos MOS. En el caso de los microcontroladores PIC, la tensión a aplicar en este terminal deberá estar comprendida entre 3V y 6V.
Verify Specification: Verificación de especificación.
VSS: Terminal que se conecta al voltaje de referencia o nulo (0V) en circuitos electrónicos MOS.
Vpp: Tensión de programación
INICIO
413
aW: Registro de trabajo de los microcontroladores PIC.
Watchdog: “Perro guardián”, término con el que se le designa al temporizador que hace la inicialización del
microcontrolador, cuando detecta una condición anormal.
WDT: Temporizador “perro guardián” o “Watchdog timer”.
XOR: Instrucción que ejecuta la función lógica “o exclusivo”, la cual consiste en obtener un “0” si las dos entradas son iguales, y un “1” si éstas son diferentes.
Z: Bit 2 del registro STATUS que se activa cuando un resultado es igual a cero.
Zero: Cero o valor nulo.
INICIO
414INICIO
415
Conjunto de instrucciones de los PIC16C5X, PIC16F5X y 12C5X (Gama
Básica):
Código En- Operadoressamblador
Descripción NotasBits STATUSafectados
Código de OperaciónMsb Lsb
Ciclos
ADDWF f,d Suma W con f 1 0001 11df ffff C, DC, Z 1,2,4ANDWF f,d AND de W con f 1 0001 01df ffff Z 2,4CLRF f Borra f 1 0000 011f ffff Z 4CLRW - Borra W 1 0000 0100 0000 Z COMF f,d Complementa f 1 0010 01df ffff Z DECF f,d Decremento f 1 0000 11df ffff Z 2,4 DECFSZ f,d Decrementa f, salta si es 0 1(2) 0010 11df ffff 2,4 INCF f,d Incremento f 1 0010 10df ffff Z 2,4 INCFSZ f,d Incremento f, salta si es 0 1(2) 0011 11df ffff 2,4 IORWF f,d OR inclusivo de W con f 1 0001 00df ffff Z 2,4 MOVF f,d Mueve f 1 0010 00df ffff Z 2,4 MOVWF f Mueve W a f 1 0000 001f ffff 1,4 NOP - No operación 1 0000 0000 0000 RLF f,d Rotación izqu. a través del Carry 1 0011 01df ffff C 2,4 RRF f,d Rotación der. a través del Carry 1 0011 00df ffff C 2,4 SUBWF f,d Resta W de f 1 0000 10df ffff C,DC,Z 1,2,4
SWAPF f,d Intercambia nibles de f 1 0011 10df ffff 2,4
XORWF f,d OR exclusivo de W con f 1 0001 10df ffff Z 2,4
OPERACIONES ORIENTADAS A BYTES
INICIO
416
OPERACIONES ORIENTADAS A BITS DE REGISTROS
Código EnsambladorOperadores Descripción Notas
Bits de STATUS
afectados
Código de Operación
Msb LsbCiclos
BCF f,b Borra bit de f 1 0100 bbbf ffff 2,4BSF f,b Pone un “1” a bit de f 1 0101 bbbf ffff 2,4BTFSC f,b Salta si bit de f es “0” 1(2) 0110 bbbf ffff BTFSS f,b Salta si bit de f es “1” 1(2) 0111 bbbf ffff
OPERACIONES CON LITERAL Y CONTROLANDLW K AND de K con W 1 1110 kkkk kkkk Z
CALL K Llamar a subrutina 2 1001 kkkk kkkk 1CLRWDT K Borra temporizador WDT 1 0000 0000 0100 TOPD
GOTO K Salto incondicional 2 101k kkkk kkkk
IORLW K OR inclusivo de k con W 1 1101 kkkk kkkk Z
MOVLW K Mover valor k hacia W 1 1100 kkkk kkkk
OPTION K Mover valor k a OPTION 1 0000 0000 0010
RETLW K Retornar, asignar valor k a W 2 1000 kkkk kkkk
SLEEP - Habilita modo de bajo consum. 1 0000 0000 0011 TO, PD TRIS f Mover valor de W a TRIS 1 0000 0000 0fff 3 XORLW k EXOR DE k con W 1 1111 kkkk kkkk Z
INICIO
417
Conjunto de instrucciones de los PIC16CXXX, 16FXXX, 12C6XX,
12F6XX Y 14CXXX (Gama media).
Código EnsambladorOperadores Descripción Notas
Bits de STATUS
afectados
Código de Operación
Msb LsbCiclos
ADDWF f,d Suma W con f 1 00 0001 11df ffff C, DC, Z 1,2,4ANDWF f,d AND de W con f 1 00 0001 01df ffff Z 2,4CLRF f Borra f 1 00 0000 011f ffff Z 4CLRW - Borra W 1 00 0000 0100 0000 Z COMF f,d Complementa f 1 00 0010 01df ffff Z DECF f,d Decremento f 1 00 0000 11df ffff Z 2,4 DECFSZ f,d Decrementa f, salta si es 0 1(2) 00 0010 11df ffff 2,4 INCF f,d Incremento f 1 00 0010 10df ffff Z 2,4 INCFSZ f,d Incremento f, salta si es 0 1(2) 00 0011 11df ffff 2,4 IORWF f,d OR inclusivo de W con f 1 00 0001 00df ffff Z 2,4 MOVF f,d Mueve f 1 00 0010 00df ffff Z 2,4 MOVWF f Mueve W a f 1 00 0000 001f ffff 1,4 NOP - No operación 1 00 0000 0000 0000 RLF f,d Rotación izq. a través del Carry 1 00 0011 01df ffff C 2,4 RRF f,d Rotación der. a través del Carry 1 00 0011 00df ffff C 2,4 SUBWF f,d Resta W de f 1 00 0000 10df ffff C,DC,Z 1,2,4
SWAPF f,d Intercambia nibles de f 1 00 0011 10df ffff 2,4
XORWF f,d OR exclusivo de W con f 1 00 0001 10df ffff Z 2,4
OPERAECIONES ORIENTADAS A BYTES
INICIO
418
OPERACIONES ORIENTADAS A BITS DE REGISTROS
Código EnsambladorOperadores Descripción Notas
Bits de STATUS
afectados
Código de Operación
Msb LsbCiclos
BCF f,b Borra bit de f 1 01 00bb bfff ffff 1,2BSF f,b Pone un “1” a bit de f 1 01 01bb bfff ffff 1,2BTFSC f,b Salta si bit de f es “0” 1(2) 01 10bb bfff ffff 3BTFSS f,b Salta si bit de f es “1” 1(2) 01 11bb bfff ffff 3
OPERACIONES CON LITERAL Y CONTROLADDLW K Suma K con W 1 11 111x kkkk kkkk C,DC,Z
ANDLW K AND de K con W 1 11 1001 kkkk kkkk Z CALL K Llamar a subrutina 2 10 0kkk kkkk kkkk
GOTO K Salto incondicional 2 10 1kkk kkkk kkkk
IORLW K OR inclusivo de k con W 1 11 1000 kkkk kkkk Z
MOVLW K Mover valor k hacia W 1 11 00xx kkkk kkkk
RETRE - Retorno de interrupción 2 00 0000 0000 1001
RETLW K Retornar, asignar valor k a W 2 11 01xx kkkk kkkk
SLEEP - Habilita modo de bajo consum. 1 00 0000 0110 0011 TO, PD SUBLW K Restar W del valor K 1 11 110k kkkk kkkk C,DC,Z
XORLW k EXOR de k con W 1 11 1010 kkkk kkkk Z
INICIO
419
ADDLWSuma valor literal con W
Nota: Esta instrucción no está incluida en los PIC de la gama básica
Código Ensamblador: (Etiqueta) ADDLWK
Operadores: 0 ≤ K ≤ 255
Operación: (W) + (K) (W)
Bits de estado que se afectan: C, DC, Z
Descripción: Se suma el contenido del
registro W con el valor “K”
El resultado se coloca en W.
Ejemplo: ADDLW 0 x 15
Antes de la Instrucción
W = 0x10
Después de la Instrucción
W = 0x25
INICIO
420
ADDWF Suma W y “f”
Código Ensamblador: (Etiqueta) ADDWF f,dOperadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)d (0,1)
Operación: (W) + (f) (dest)Bits de estado que se afectan: C, DC, ZDescripción: Suma los contenidos de los
registros W y “f”Si “d” es 0, el resultado se coloca
en W, si “d” es 1, se coloca en “f”
Ejemplo: ADDWF FSR, 0Antes de la Instrucción
W = 0x17FSR = 0xC2
Después de la InstrucciónW = 0xD9FSR = 0xC2
INICIO
421
Código Ensamblador: (Etiqueta) ANDLW k
Operadores: 0 ≤ K ≤ 255
Operación: (W). AND.(K) (W)
Bits de estado que se afectan: Z
Descripción: Se realiza la función lógica AND entre
los bits del registro W y el valor “K”.
El resultado se coloca en W.
Ejemplo: ANDLW 0x5F
Antes de la Instrucción
W = 0xA3
Después de la Instrucción
W = 0x03
And del valor literal con WANDLW
INICIO
422
ANDWF AND W con “f”
Código Ensamblador: (Etiqueta) ANDWF f,dOperadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)d (0,1)
Operación: (W).AND. (f) (dest)Bits de estado que se afectan: ZDescripción: Se ejecuta la función lógica AND entre
los bits del registro W y los bits del
registro “f” Si “d” es 0, el resultado se coloca en
W, si “d” es 1, se coloca en “f”
Ejemplo: ANDWF FSR, 1Antes de la Instrucción
W = 0x17FSR = 0xC2
Después de la InstrucciónW = 0x17FSR = 0x02
INICIO
423
BCF Borra bit en “f”
Código Ensamblador: (Etiqueta) BCF f,b
Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
0 ≤ b ≤ 7
Operación: 0 (f<b>)
Bits de estado que se afectan: Ninguno
Descripción: Se coloca en 0 bit “b” en registro “f”
Ejemplo: BCF FLAG_REG, 7
Antes de la Instrucción
FLAG_REG = =0xC7
Después de la Instrucción
FLAG_REG = 0x47
INICIO
424
BSF Establece en 1 bit en “f”
Código Ensamblador: (Etiqueta) BSF f,b
Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
0 ≤ b ≤ 7
Operación: 1 (f<b>)
Bits de estado que se afectan: Ninguno
Descripción: Se coloca en 1 bit “b” del registro “f”
Ejemplo: BSF FLAG_REG, 7
Antes de la Instrucción
FLAG_REG = =0x0A
Después de la Instrucción
FLAG_REG = 0x8A
INICIO
425
Código Ensamblador: (Etiqueta) BTFSC f,dOperadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)0 ≤ b ≤ 7
Operación: Salta si (f<b>) = 0Bits de estado que se afectan: NingunoDescripción: Si bit “b” en el registro “f” es 0, entonces
se salta la siguiente instrucción, la cualse había preparado para ejecutar, pero sedescarta y se ejecuta un NOP, lo cual haceque la instrucción dure dos ciclos. Si bit “b”en “f” es 1, entonces la instrucción actualse ejecuta en un ciclo, luego se ejecuta lasiguiente instrucción
Prueba bit en f, salta si es cero
BTFSC
Ejemplo: AQUÍ BTFSC FLAG, 1FALSO GOTO COD_PROCESOCIERTO
Antes de la InstrucciónPC = dirección (AQUÍ)
Después de la InstrucciónSi FLAG<1> = 0,PC = dirección (CIERTO); Ejecución en dos ciclosSi FLAG<1> = 1,PC = dirección (FALSO); Ejecución en un ciclo
INICIO
426
Código Ensamblador: (Etiqueta) BTFSS f,dOperadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)0 ≤ b ≤ 7
Operación: Salta si (f<b>) = 1Bits de estado que se afectan: NingunoDescripción: Si bit “b” en el registro “f” es 1, entonces
se salta la siguiente instrucción, la cualse había preparado para ejecutar, pero sedescarta y se ejecuta un NOP, lo cual haceque la instrucción dure dos ciclos. Si bit “b”en “f” es 0, entonces la instrucción actualse ejecuta en un ciclo, luego se ejecuta lasiguiente instrucción
BTFSS Prueba bit en f, salta si es 1
Ejemplo: AQUÍ BTFSS FLAG, 1FALSO GOTO COD_PROCESOCIERTO
Antes de la InstrucciónPC = dirección (AQUÍ)
Después de la InstrucciónSi FLAG<1> = 0,PC = dirección (FALSO); Ejecución en un cicloSi FLAG<1> = 1,PC = dirección (CIERTO); Ejecución en dos ciclos
INICIO
427
CALL Llamar a subrutina
Código Ensamblador: (Etiqueta) CALL KOperadores: 0 ≤ K ≤ 255Operación: (PC) +1 Tope de la pila (Stack);
K PC<7:0>;(STATUS <6:5>) PC <10:9>;0 PC <8>
Bits de estado que se afectan: NingunoDescripción: Llama a subrutina. Primero la dirección de
retorno (PC+1) se coloca en la pila (Stack).Los bits 8 de “K” se colocan en los bits<7:0> del PC. Los bits <10:9> del PC tomanlos valores de los bits <6:5> del STATUS. El bit 8 del PC es colocado en 0. Esta instrucción dura dos ciclos.
Ejemplo: AQUÍ CALL ALLA
Antes de la InstrucciónPC = dirección (AQUÍ)
Después de la InstrucciónPC = dirección (ALLA)
TOS = dirección (AQUÍ + 1)
INICIO
428
CLRFBorra “f”
Código Ensamblador: (Etiqueta) CLRF f
Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
Operación: 00h (f);
1 Z
Bits de estado que se afectan: Z
Descripción: El contenido del registro “f” es borrado
y el bit Z es puesto en 1
Ejemplo: CLRF FLAG_REG
Antes de la Instrucción
FLAG_REG = =0x5A
Después de la Instrucción
FLAG_REG = 0x00
z = 1
INICIO
429
Código Ensamblador: (Etiqueta) CLRW
Operadores: Ninguno
Operación: 00h (W);
1 Z
Bits de estado que se afectan: Z
Descripción: El registro W es borrado y el bit Z es
puesto en 1.
Ejemplo: CLRW
Antes de la Instrucción
W = 0x5A
Después de la Instrucción
W = 0x00
z = 1
INICIO
430
Código Ensamblador: (Etiqueta) CLRWDTOperadores: NingunoOperación: 00h WDT;
0 Escalamiento WDT (si es asignadoa éste);1 TO;1 PD
Bits de estado que se afectan: TO, PDDescripción: Borra el registro WDT y también al
escalamiento, si éste es asignado alWDT y no al temporizador Timer0.Los bits de estado TO y PD se ponen
en 1
Ejemplo: CLRWDTAntes de la Instrucción
Contador WDT = ?Después de la Instrucción
Contador WDT = 0x00Escalamiento de WDT = 0TO = 1PD = 1
CLRWDTBorra temporizador
perro guardián (WDT)
INICIO
431
Código Ensamblador: (Etiqueta) COMF f,dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d 0,1
Operación: (f) - 1 (dest)Bits de estado que se afectan: ZDescripción: Se complementa el contenido del registro
“f”. Si “d” es 0, el resultado se coloca en
W, si “d” es 1, el resultado se coloca en
“f”.
Ejemplo: COMF REG1, 0Antes de la Instrucción
REG1 = 0x13Después de la Instrucción
REG1 = 0x13 W = 0xEC
Complementa “f”Complementa “f”
INICIO
432
Código Ensamblador: (Etiqueta) DECF f,dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d 0,1
Operación: (f) - 1 (dest)Bits de estado que se afectan: ZDescripción: Decrementa el contenido del registro “f”.
Si “d” es 0, el resultado se coloca en W,
si “d” es 1, el resultado se coloca en “f”.
Ejemplo: DECF CNT, 1Antes de la Instrucción
CNT = 0x01Z = 0
Después de la InstrucciónCNT = 0x00Z = 1
Decremento de “f”Decremento de “f”
INICIO
433
Código Ensamblador: (Etiqueta) DECFSZ f,dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d 0,1
Operación: (f) - 1 d; salta si el resultado = 0Bits de estado que se afectan: NingunoDescripción: Decrementa el contenido del registro “f”.
Si “d” es 0, el resultado se coloca en W, si “d” es 1, el resultado se coloca en “f”.Si el resultado es 0, entones se salta la siguiente instrucción, la cual se había preparado para ejecutar,pero se descartta y se ejecuta un NOP, lo cualhace que la instrucción dure dos ciclos.Si el resultado es diferente de cero, en un ciclo, y luegoentonces la instrucción actual se ejecutase ejecuta la siguiente instrucción.
Decremento de “f”, salta si es 0
Ejemplo: AQUI DECFSZ CNT, 1GOTO LAZO
CONTI
Antes de la InstrucciónPC = dirección (AQUÍ)
Después de la InstrucciónCNT = CNT - 1;Si CNT = 0,PC = dirección (CONTI); Ejecución en dos ciclosSi CNT ‡ 0,PC = dirección (AQUÍ+1); Ejecución en un ciclo
INICIO
434
Código Ensamblador: (Etiqueta) GOTO kOperadores gama básica: 0 k 512Operadores gama media: 0 k 2047 Operación gama básica: k PC <8:0>
(STATUS <6:5> PC <10:9>Operación gama media: k PC <10:0>
(PCLATCH <4:3>) PC <12:11>Bits de estado que se afectan: NingunoDescripción: Salto incondicional. Los 9 bits de “k” se
colocan en los bits <8:0> del PC. Los bits <10:9> del PC toman los valores
delos bits <6:5> del registro STATUS.Esta instrucción dura dos ciclos
Ejemplo: GOTO ALLA
Después de la InstrucciónPC = dirección (ALLA)
Salto IncondicionalSalto Incondicional
INICIO
435
Código Ensamblador: (Etiqueta) INCF f,dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d 0,1
Operación: (f) + 1 (dest) Bits de estado que se afectan: ZDescripción: Se incrementa el contenido de “f”
Si “d” es 0, el resultado se colocaen W, si “d” es 1, el resultado se
coloca en “f”
Ejemplo: INCF CNT, 1
Antes de la InstrucciónCNT = 0xFFZ = 0
Después de la InstrucciónCNT = 0x00Z = 1
Incremento de “f”Incremento de “f”
INICIO
436
Código Ensamblador: (Etiqueta) INCFSZ f,dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d 0,1
Operación: (f) + 1 (dest), salta si el resultado = 0 Bits de estado afectados: NingunoDescripción: Incrementa el contenido del registro “f”.
Si “d” es 0, el resultado se coloca en W, si “d” es 1, el resultado se coloca en “f”.Si el resultado es 0, entones se salta la
siguiente instrucción, la cual se había preparado para ejecutar, pero se descarta y se ejecuta un NOP, lo cual hace que la instrucción dure dos ciclos. Si el resultado es diferente de cero, entonces la instrucción actual se ejecuta en un ciclo, y luego se ejecuta la siguiente instrucción.
Ejemplo: AQUI INCFSZ CNT, 1GOTO LAZO
CONTI
Antes de la InstrucciónPC = dirección (AQUÍ)
Después de la InstrucciónCNT = CNT - 1;Si CNT = 0,PC = dirección (CONTI); Ejecución en dos ciclosSi CNT ‡ 0,PC = dirección (AQUÍ+1); Ejecución en un ciclo
Incremento de “f”salta si es 0
INICIO
437
Código Ensamblador: (Etiqueta) IORLW k
Operadores: 0 ≤ K ≤ 255
Operación: (W).OR.(K) (W);
Bits de estado que se afectan: Z
Descripción: Se ejecuta la función lógica OR
(inclusivo) entre los bits del registro W
y los bits del valor literal “k”. El
resultado se coloca en W.
Ejemplo: IORLWF 0x35
Antes de la Instrucción
W = 0x9A
Después de la Instrucción
W = 0xBF
Z = 0
OR Inclusivo devalor literal con WOR Inclusivo de
valor literal con W
INICIO
438
Código Ensamblador: (Etiqueta) IORWF f,dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d 0,1
Operación: (W).OR.(F) (dest), Bits de estado que se afectan: ZDescripción: Se ejecuta la función lógica OR
(inclusivo) entre los bits del registro W
y los bits del registro “f”.Si “d” es 0, el resultado se coloca en
W, si “d” es 1, el resultado se coloca en
“f”.
Ejemplo: IORWF RESULT, 0 Antes de la Instrucción
RESULT = 0x13W = 0x91
Después de la InstrucciónRESULT = 0x13W = 0xBFZ = 0
OR Inclusivo de W con “f”
IORWF
INICIO
439
MOVF Mueve “f”
Código Ensamblador: (Etiqueta) MOVF f,d
Operadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)
d 0,1Operación: (f) (dest)
Bits de estado que se afectan: Z
Descripción: El valor de “f” se mueve hacia “d”. Si “d”
es 0, el valor se coloca en W, si “d” es 1,
el valor se coloca en “f”. Esta instrucción
es útil para saber si el contenido de “f” es
cero, ya que se afecta al bit Z.
Ejemplo: MOVF FSR, 0
Después de la Instrucción
W = Valor en el registro FSRINICIO
440
Código Ensamblador: (Etiqueta) MOVLW k
Operadores: 0 ≤ K ≤ 255
Operación: K (W);
Bits de estado que se afectan: Ninguno
Descripción: Se carga el valor de “k” en el
registro W.
Ejemplo: MOVLW 0x5A
Después de la Instrucción
W = 0x5A
MOVLW Mueve valor literal a W
INICIO
441
Código Ensamblador: (Etiqueta) MOVWF f
Operadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)
Operación: (W) (f)
Bits de estado que se afectan: Ninguno
Descripción: Mueve el dato desde W a “f”
Ejemplo: MOVWF TEMP_REG
Antes de la Instrucción
TEMP_REG = 0xFF
W = 0x4F
Después de la Instrucción
TEMP_REG = 0x4F
W = 0x4F
MOVWF Mueve W a “f”
INICIO
442
Código Ensamblador: (Etiqueta) NOP
Operadores: Ninguno
Operación: No operación
Bits de estado que se afectan: Ninguno
Descripción: No hay operación.
Simplemente se ejecuta un ciclo,
sin afectar nada.
Ejemplo: NOP
NOP No operación
NO
INICIO
443
Nota: Esta instrucción no se recomienda utilizar en los PIC de la gama media.
Código Ensamblador: (Etiqueta) OPTION
Operadores: Ninguno)
Operación: (W) OPTION
Bits de estado que se afectan: Ninguno
Descripción: El contenido de W es cargado al Registro
OPTION.
Ejemplo: OPTION
Antes de la Instrucción
W = 0x07
Después de la Instrucción
OPTION = 0x07
OPTION Carga el registro OPTION
INICIO
444
RETFIE Retorno de Interrupción
Nota: Esta instrucción no está incluida en los PIC de la Gama BásicaCódigo Ensamblador: (Etiqueta) RETFIEOperadores: Ninguno)Operación: TOS PC Bits de estado que se afectan: 1 GIEDescripción: Retorno de una Interrupción. El valor del
tope de la pila (TOS) es cargado en el contador de programa (PC).Las interrupciones se habilitan al
poneren “1” el bit de habilitación global deinterrupciones (GIE). Este bit se
encuentra ubicado en el registro INTCON (bit 7).Esta instrucción dura dos ciclos.
Ejemplo: RETFIE
Después de la InstrucciónPIC = TOSGIE = 1
INICIO
445
Nota: Esta instrucción no está incluida en los PIC de la Gama Básica
Código Ensamblador: (Etiqueta) RETURN
Operadores: Ninguno)
Operación: TOS PC
Bits de estado que se afectan: Ninguno
Descripción: Retorno de una subrutina. El valor del
tope de la pila (TOS) es cargado en el
contador de programa (PC).
Esta instrucción dura dos ciclos.
Ejemplo: RETURN
Después de la Instrucción
PC = TOS
RETURN Retorno de Interrupción
INICIO
446
RETLWRETLW Retorno con valor literal en W
Retorno con valor literal en W
Código Ensamblador: (Etiqueta) RETLW KOperadores: 0 K 255Operación: K (W)
TOS PCBits de estado afectados: NingunoDescripción: El registro W se carga con el valor del literal “k”. El contador de programa PC se carga con el tope de la pila (STACK, dirección de retorno). Esta instrucción es útil para convertir valores por medio de una tabla de equivalencia, véase ejemplo. Esta instrucción dura dos ciclos.
Ejemplo: CALL TABLA ;W contiene tabla de valores de la
;conversión. Después de ejecutar la ;rutina, W tendrá el valor convertido
TABLA ADDWF PCL ;W = desplazamientoRETLW k0 ;Comienza tablaRETLW k1 RETLW kn ;Final de la tabla
Antes de la InstrucciónW = 0x07
Después de la InstrucciónW = valor de k7
INICIO
447
Código Ensamblador: (Etiqueta) RLF f, dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d [0,1]
Operación: Ver descripción abajoBits de estado que se afectan: CDescripción: Los bits de “f” son rodeados (desplazados)
en un bit hacia la izquierda, pasando por el
bit Carry. El bit 0 de “f”, forma el valor
anterior del bit 7 de “f”.Si “d” es 0, el resultado se coloca en
W,si “d” es 1, el resultado se coloca en
“f”.
Ejemplo: RLF REG1, 0
Antes de la InstrucciónREG1 = 1110 0110C = 0
Después de la InstrucciónREG1 = 1110 0110W = 1100 1100C = 1
RLFRLFRodar “f” a la Izquierda
a través del CarryRodar “f” a la Izquierda
a través del Carry
INICIO
448
Código Ensamblador: (Etiqueta) RRF f, dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d [0,1]
Operación: Ver descripción abajoBits de estado que se afectan: CDescripción: Los bits de “f” son rodeados (desplazados)
en un bit hacia la derecha, pasando por el
bit Carry. El bit 7 de “f”, toma el valor
anterior del bit Carry, y el bit Carrytoma el valor anterior del bit 0 de “f”Si “d” es 0, el resultado se coloca en
W,si “d” es 1, el resultado se coloca en
“f”.
Ejemplo: RRF REG1, 0Antes de la Instrucción
REG1 = 1110 0110C = 0
Después de la InstrucciónREG1 = 1110 0110W = 0111 0011C = 0
RRFRRF Rodar “f” a la Derecha a través del Carry
INICIO
449
Código Ensamblador: (Etiqueta) SLEEP
Operadores: Ninguno
Operación: 00h WDT
0 Escalamiento del WDT;
1 TO
0 PD
Bits de estado que se afectan: TO, PD
Descripción: Se coloca en 1 el bit TO del registro de
estado. Los bits de estado de: potencia
baja. El WDT y el escalamiento se colocan
en 0.
El procesador se coloca en estado
de reposo (SLEEP), el oscilador se
detiene y el consumo es mínimo.
Ejemplo: SLEEP
SLEEP Entra en el modo de reposo
INICIO
450
Nota: Esta instrucción no está incluida en los PIC de la Gama Básica
Código Ensamblador: (Etiqueta) SUBLW KOperadores: 0 ≤ K ≤ 255Operación: K - (W) (W)Bits de estado que se afectan: C, DC, ZDescripción: Se resta el contenido de W con el de
los 8 bits de k (en complemento a 2).El resultado se coloca en W
Ejemplo 1: SUBLW 0x02Antes de la Instrucción
W = 1C = ?
Después de la InstrucciónW = 1C = 1; el resultado es positivo
Ejemplo 2: Antes de la InstrucciónW = 2C = ?
Después de la InstrucciónW = 0C = 1; el resultado es 0
Ejemplo 3: Antes de la InstrucciónW = 3C = ?
Después de la InstrucciónW = FFC = 0; el resultado es negativo
Resta W de Valor Literal
INICIO
451
Código Ensamblador: (Etiqueta) SUBWF f, dOperadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)d [0,1]
Operación: (f) - (W) (dest)Bits de estado que se afectan: C, DC, ZDescripción: Se resta el contenido de W con el del
registro “f” (en complemento a 2).Si “d” es 0, el resultado se coloca en
WSi “d” es 1, el resultado se coloca en
“f”
Ejemplo 1: SUBWF REG, 1Antes de la Instrucción
REG1 = 3, W = 2, C = ?Después de la Instrucción
REG1 = 1, W = 2, C = 1; el resultado es positivo
Ejemplo 2: Antes de la InstrucciónREG1 = 2, W = 2, C = ?
Después de la InstrucciónREG1 = 0, W = 2, C = 1; el resultado es 0
Ejemplo 3: Antes de la InstrucciónREG1 = 1, W = 2, C = ?
Después de la InstrucciónREG1 = FF, W = 2, C = 1; el resultado es negativo
Resta W de f
INICIO
452
Código Ensamblador: (Etiqueta) SWAPF f, d
Operadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)
d [0,1]
Operación: (f<3:0>) (dest<7:4>)
(f<7:4>) (dest<3:0>)
Bits de estado que se afectan: Ninguno
Descripción: Los nibles (grupo de 4 bits) superiores e
inferiores de “f” son intercambiados
Si “d” es 0, el resultado se coloca en W
Si “d” es 1, el resultado se coloca en f.
Ejemplo: SWAPF REG1, 0
Antes de la InstrucciónREG1 = 0xA5
Después de la InstrucciónREG1 = 0xA5W = 0x5A
Intercambio de Nibles in “f”
INICIO
453
Nota: Esta instrucción no se recomienda utilizar en los PIC de la gama media.
Código Ensamblador: (Etiqueta) TRIS f
Operadores: f = 5, 6 ó 7
Operación: (W) TRIS registro f
Bits de estado que se afectan: Ninguno
Descripción: El registro TRIS “f” (f = 5, 6, ó 7) toma
el valor del contenido de W. El registro
TRIS es el de programación de los
puertos como entrada o salida
Ejemplo: TRIS PORTA
Antes de la InstrucciónW = 0xA5
Después de la InstrucciónTRISA = 0xA5
Carga valor al registro TRIS con W
INICIO
454
Código Ensamblador: (Etiqueta) XORLW K
Operadores: 0 ≤ K ≤ 255
Operación: (W).XOR.K (W)
Bits de estado que se afectan: Z
Descripción: Se ejecuta la operación lógica OR
Exclusivo entre el contenido W y el
valor literal “k”. El resultado se
guarda en W.
Ejemplo: XORLW 0xAF
Antes de la Instrucción
W = 0xB5
Después de la Instrucción
W = 0x1a
OR Exclusivo valor literal con W
INICIO
455
Código Ensamblador: (Etiqueta) XORWF f, d
Operadores: 0 f 31 (Gama básica)
0 f 127 (Gama media)
d [0,1]
Operación: (W).XOR.(f) (dest)
Bits de estado que se afectan: Z
Descripción: Se ejecuta la operación lógica OR
Exclusivo del contenido con el contenido
del registro “f”.
Si “d” es 0, el resultado se coloca en W
Si “d” es 1, el resultado se coloca en “f”.
Ejemplo: XORWF REG1, 0
Antes de la InstrucciónREG = 0xAF (B’10101111)W = 0xB5 (B’10110101)
Después de la InstrucciónREG = 0x1A (B’00011010)W = 0xB5 (B’10110101)
OR Exclusivo de W con “f”
INICIO
456INICIO
457
El lenguaje ensamblador provee una plataforma para desarrollar los códigos de los programas en los microcontroladores. En este anexo se expondrá una explicación acerca de las opciones de comandos y las directivas que ofrece este lenguaje.
En el momento en el que te dispones a ensamblar un programa editado, en el MPLAB tendrás acceso a una ventana, tal como la que se muestra en la siguiente página. Allí podrás establecer una serie de comandos de opción para que tengas la posibilidad de generar o no diferentes archivos que provendrán de tu archivo editado o archivo fuente, el cual deberá tener un nombre y la extensión “.asm”. Por ejemplo, si el archivo que editaste tiene como nombre “miprog.asm”, entonces podrás generar los siguientes archivos:
• miprog.lst, el cual te muestra una lista de los códigos y símbolos generados.
• miprog.err, el cual te muestra una lista de los errores.
• miprog.hex. Este archivo es el que contiene los códigos del programa en hexadecimal y es el que vas a grabar en el microcontrolador.
• miprog.cod. Este archivo te muestra los símbolos y la depuración.
• miprog.hxl o .hxh, el cual separa los bytes del archivo hexadecimal.
INICIO
458
Opciones de las líneas de comando
Para ensamblar un programa en el MPLAB seleccionas “Project” en el meú principal y luego “Build Node”, tendrás acceso a la ventana con las opciones de las líneas de comando, tal como se muestra en la figura de abajo. En la siguiente página se explica el significado de estos comandos que se establecerán los archivos generados.
INICIO
459
Opción
Por defecto
Descripción
/a INHX8M Establece el formato del archivo .hex
/c On Habilita/deshabilita la sensitividad del caso
/d Ninguno Define símbolo: /dDebug /dMax=5 /dString=“abc”
/e On Habilita/Deshabilita la generación del archivo de error
/l On Habilita/Deshabilita la generación del archivo de listado
/m On Habilita/Deshabilita la expansión macro
/o On Habilita/Deshabilita la generación del archivo .obj
/p Ninguno Selecciona el tipo de microcontrolador
/q Off Habilita/Deshabilita el modo de salida de pantalla
/r Hexadecimal
Selecciona el tipo de formato numérico
/t 8 Coloca el número de espacios por Tabulación
/w 0 Selecciona los mensajes: 0 = todos, 1 = errores y advertencias2 = solamente errores
/x Off Habilita/Deshabilita la generación de la tabla de referencia
Descripción de las opciones
INICIO
460
Te recordamos que las directivas del lenguaje ensamblador son comandos
que aparecen en el lenguaje que tú editas, pero que no se convierten en
códigos del programa del microcontrolador. Ellas se utilizan para controlar
la compilación del programa que vas a utilizar en el microcontrolador, es
decir, dónde vas a colocar las direcciones de los datos según su nombre, en
cuál línea comenzará una parte del programa, dónde termina el programa,
cuáles son las entradas y salidas, y otras especificaciones más.
Las directivas del ensamblador se clasifican en:
• Directivas de Control, que colocan secciones condicionales en el código
ensamblado.
• Directivas de Datos, que asignan nombres a posiciones de memoria.
• Directivas de Listado, que controlan el archivo de listado (.lst).
• Directivas de macro, que controlan un grupo de comandos.
A continuación te mostraremos una tabla de las directivas que puedes
utilizar en el lenguaje ensamblador.INICIO
461
Directiva
Descripción Sintaxis Ejemplo
_ _BADRAM Especifica localidades inválidas en la RAM
_ _badram <exp> _ _badram 87-89,91
CBLOCK
ENDC
Define un bloque de constantes, la directiva ENDC debe colocarse al final
cblock[<exp>] <etiq> <,etiq>endc
cblock 0x20 nomb1, nomb2...endc
_ _CONFIG Especifica bits de configuración. Ver p 4-3
_ _config<exp> _ _config H’FFFF’
CONSTANT Declara constante de símbolo constant <etiq> constant long=125
DATA Crea Datos numéricos y de texto <etiq> data <exp> data 1, 2, externa
DB Declara datos de un Byte <etiq> db <exp> db ‘t’, 0xd, ‘e’, 3
DE Define datos en EEPROM <etiq> de <exp> de “miprog”, 0
#DEFINE Define etiqueta de sustitución de texto #define<nomb> [<tex>]
#define long 20
DT Define tabla <etiq> dt <exp> dt val1, val2
DW Declara datos de una palabra <etiq> dw <exp> dw 27, W27, W29
ELSE Comienza alternativa después de un IFIF es un si condicional, ELSE = sino
else else dw frio
END Finaliza bloque de programa end end
INICIO
462
Directiva Descripción Sintaxis Ejemplo
ENDC Finaliza un bloque de constantes endc endc ;ver CBLOCK
ENDIF Finaliza un bloque condicional IF endif endif ;ver IF
ENDM Finaliza la definición de una macro
endm endm ;ver MACRO
ENDW Finaliza un lazo condicional While Loop
endw endw ;ver WHILE
EQU Define una constante <etiq> equ <exp> portb equ 0x5
ERROR Crea un mensaje de error error “<texto>” error “fuera escala”
ERRORLEVEL Especifica los tipos de mensajes de error en los archivos .lst y .err
errorlevel 0|1|2<+|-><num>
errorlevel 1, -212
EXITM Sale de una macro exitm exitm ;ver MACRO
EXPAND Escribe las macros en el archivo .lst
expand expand
FILL Llena memoria <etiq> fill <exp> fill 0x100, 5
_ _IDLOCS Especifica localizaciones ID _ _idlocs <exp> idlocs 1234
INICIO
463
Directiva
Descripción Sintaxis Ejemplo
IF
ELSE
ENDIF
Comienza un bloque condicional. Se pregunta por una condición, si ésta es cierta se ejecuta la acción, sino se ejecuta la línea siguiente. Si en esa línea aparece ELSE entonces se asigna la acción que le sigue. El bloque IF se cierra con ENDIF
if <exp> <instruc><else <exp>> <instruc>endif
if temper > 100 dw calienteelse dw frioendif
IFDEF
IFNDEF
Se ejecuta si los símbolos se han definido
Se ejecuta si los símbolos no se han definido
ifdef <etiq> <instruc>endif
ifndef cierto dw no_ciertoendif
#INCLUDE Incluye un archivo fuente adicional. Ver p2-15
include <arch> include p16f84.inc
LIST Lista opciones. Ver tabla de opciones A3-3
list |<lista>| list p=16c71,r=dec
LOCAL Declara variable como macro local. Ver macro
local <etiq> local
MACRO
ENDM
Declara definición de macro. Una macro son un conjunto de instrucciones que pueden ser insertadas como código fuente.
<etiq> macro <instruc> endm
leer macro d1, d2 movlw d1... endm
_ _MAXRAM Especifica máxima dirección de la RAM _ _maxram<exp> _ _maxram 0x0bf
MESSG Crea un mensaje definido por el usuario messg “<text>” messg “error 1”
NOEXPAND Elimina macros del archivo .lst noexpand noexpand
INICIO
464
Directiva Descripción Sintaxis Ejemplo
NOLIST Elimina lista de salida nolist nolist
ORG Especifica dirección de origen <etiq> org <exp> org 50 ;ver p2-18
PAGE Inserta salto de página en la lista page page
PROCESSOR Especifica el tipo de microcontrolador
processor<tipo> processor 16f84
RADIX Especifica la base numérica a utilizar
radix<base num> radix dec ;(hex, oct)
RES Reserva memoria <etiq>res <num> menres res 64
SET Define una variable en el ensamblador
<label> set<exp> long set 0x12;
SPACE Inserta líneas vacías en el archivo .list
space <exp> space 3
SUBTITLE Especifica subtítulo del programa subtitle <texto> subtitle “lazo”
TITLE Especifica título del programa title <texto> title “comienzo”
#UNDEFINE Borra una etiqueta de sustitución #undefine <etiq> #undefine long
VARIABLE Declara variable de símbolo variable <etiq>=>exp>
variable grablong=64constant parclong=512
WHILE
ENDW
Hace un lazo si una condición es cierta
while <exp> while i<contador i+=1endw INICIO
465INICIO
466
PIC16C54 y 56
INDF(1)
TMROPCL
STATUS
FSRPORTA
PORTB
00h01h
02h
03h
04h
05h
06h
07h
0Fh10h
1Fh
REGISTROS DE
PROPÓSITOSGENERALES
MEMORIA DE DATOS DE LOS PIC16C54 Y 56
INICIO
467
PIC16C55
MEMORIA DE DATOS DEL PIC16C55
INDF(1)
TMROPCL
STATUS
FSRPORTA
PORTB
00h01h
02h
03h
04h
05h
06h
07h
0Fh10h
1Fh
REGISTROS DE
PROPÓSITOSGENERALES
PORTC
INICIO
468
PIC16C57
INDF(1)
TMROPCL
STATUSFSR
PORTAPORTB
00h01h02h03h04h05h06h07h
08h
0Fh
REGISTROS DE
PROPÓSITOSGENERALES
PORTC
00 01 10 11
REGISTROS DE
PROPÓSITOSGENERALES
10h
1Fh
FSR<6:5>Dirección
de registro
REGISTROS DE
PROPÓSITOSGENERALES
30h
3Fh
REGISTROS DE
PROPÓSITOSGENERALES
50h
5Fh
REGISTROS DE
PROPÓSITOSGENERALES
70h
7Fh
20h 40h 60h
Este Mapa de Direccionesretoma a las direccionesdel Banco 0
2Fh 4Fh 6Fh
Banco 0 Banco 1 Banco 2 Banco 3
INICIO
469
PIC16C58
INDF(1)
TMROPCL
STATUSFSR
PORTAPORTB
00h01h02h03h04h05h06h07h
0Fh
REGISTROS DE
PROPÓSITOSGENERALES
00 01 10 11
REGISTROS DE
PROPÓSITOSGENERALES
10h
1Fh
FSR<6:5>Dirección de registro
REGISTROS DE
PROPÓSITOSGENERALES
30h
3Fh
REGISTROS DE
PROPÓSITOSGENERALES
50h
5Fh
REGISTROS DE
PROPÓSITOSGENERALES
70h
7Fh
20h 40h 60h
Este Mapa de Direccionesretoma a las direccionesdel Banco 0
2Fh 4Fh 6Fh
Banco 0 Banco 1 Banco 2 Banco 3
INICIO
470
Registros de funciones especiales y bits de los PIC16C5X
Valor después Valor después
Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 de encender WDT y MCLR
N/A Tris Registros de control de Entrada y Salida (TRISA,TRISB, TRISC) 1111 1111 1111
1111
N/A OPTION - - TOCS TOSE PSA PS2 PS1 PS0 --11 1111 --11 1111
00h INDF Registro de la mem. de datos, su dirección está en el registro FSR xxxx xxxx uuuu
uuuu
01h TMRO Temporizador contador de tiempo real de 8 bits xxxx xxxx uuuu
uuuu
02h PCL 8 bits de bajo orden del Contador de Programa (PCL) 1111 1111 1111
1111
03h STATUS PA2 PA1 PA0 TO PD Z DC C 0001 1xxx
04H FSR Apuntador de la memoria de datos para acceso indirecto 1xxx xxxx
05h PORTA - - - - RA3 RA2 RA1 RA0 ---- xxxx ---- uuuu
06H PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
07H PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx uuuu uuuuINICIO
471
PIC16F84
Banco 0 Banco 1
INICIO
472 INICIO
473
BANCO 0 PIC16F87X
INICIO
474
BANCO 1 PIC16F87X
INICIO
475
BANCOS 2 y 3 PIC16F87X
INICIO
476INICIO
477
Algunas Interfaces
INICIO
En las siguientes figuras se mostrarán algunos circuitos que podrás emplear como interfaces de entrada y salida, para que ellos actúen con los microcontroladores. En sí, no se dan detalles del funcionamiento; sin embargo, con tus conocimientos de electrónica, esperamos que sepas interpretar cómo trabajan.
El hecho de que estas interfaces se presenten aquí, de ninguna manera significa que sean las únicas soluciones para poder conectar tu microcontrolador al mundo exterior. Simplemente los presentamos, para darte una idea de cómo convertir señales de 0 a 5v, las cuales generan los microcontroladores, en órdenes que pueden manejar elementos que trabajen a tensiones diferentes. Por otro lado, también podrás observar cómo señales de tensiones diferentes a la de los niveles lógicos, puedan ser adaptadas para que la lean los microcontroladores.
En la siguiente parte, se presenta una lista de proyectos propuestos, y al lado se presenta el número de nota de aplicación que puedes consultar para que los puedas desarrollar. Las notas de aplicación fueron obtenidas del sitio www.microchip.com, por lo tanto las encontrarás en inglés. Otros sitios web que podrás consultar, los podrás acceder mediante algún motor de búsqueda al colocar palabras claves, tales como: “microcontroladores”, “pic”, “proyectos”, entre otras. (p.e. en www.google.com). De todas formas, al final de este anexo te presentamos alguanas direcciones en español que tú podrás acceder donde se describen algunos proyectos en español.
478
Encendido de un diodo emisor de luz (LED)
INICIO
Encendido con un “1” lógico Encendido con un “0” lógico
Terminal
del Puerto
Terminal
del Puerto
479
Lectura de interruptores o pulsadores
PIC16C54
18 17 16 15 14 13 12 11 10
5V
1 2 3 4 5 6 7 8 9
5V
4 Resistencias de 4,7K
VssPIC
16F84A
INICIO
480
Control de la Línea de Corriente Alterna
INICIO
Relé
NC
C
NA
0 a 5V
481
Control de la Línea de Corriente Alterna 1
INICIO
0 a 5V 0 a 5V
482
Control de la Línea de Corriente Alterna 2
INICIO
0 a 5V
483
Control de la Línea de Corriente Alterna 3
INICIO
0 a 5V
484
Detector de Cruces por Cero
0 a 5V 0 a 5V
INICIO
485
Encendido de un Indicador de 7 Segmentos Ánodo Común (Display)
INICIO
Salida de los terminales de un Puerto. Los segmentos encenderán con un “0” lógico. El ánodo se conectará a una tensión positiva Vdd.
Segmento a
Segmento b
Segmento c
Segmento d
Segmento e
Segmento f
Segmento g
0 a 5V
486
Encendido de un Indicador 7 Segmentos de varios dígitos
INICIO
Dígito 0
Dígito 1
Dígito 2
Dígito 3
Segmento a
Segmento b
Segmento c
Segmento d
Segmento e
Segmento f
Segmento g
0 a 5V
0 a 5V
487
MATRIZ DE LEDS
INICIO
Valores de cada Columna
Selección de columna
0 a 5V
0 a 5V
488
Lectura de un teclado matricial
INICIO
0 a 5V
Entradas
0 a 5V
Salidas
Rb3
Rb2
Rb1
Rb0
Ra0
Ra1Ra2Ra1
S1 S2
S5 S6
S9 S10
S13 S14
S3 S4
S7 S8
S11 S12
S15 S16
R110k
R210k
R310k
R410k
489
Aplicación de un reloj con bajo consumo en el modo “Reposo”
INICIO
490
Interruptor Analógico
INICIO
0 a 5V
491
Notas de AplicaciónPIC16C5X y PIC16F84
AN712 Detector Autobaudio RS-232 para dispositivos PIC16C5X.AN619 Interfaces para un PIC16C5X con las memorias 93XX76 y 93XX86. AN657 Decodificador de un control remoto Infrarrojo con un PIC16C5X. AN526 Rutinas de utilidad matemática para los PIC16C5x/PIC16Cxx. AN541 Utilización de un PIC16C5x como un periférico inteligente IIC. AN530 Interfaz para un PIC16C5X con la EEPROM serial 93CX6. AN563 Utilización de los microcontroladores PIC16C5x como manejadores de LCD. AN592 Contador de frecuencia con un PIC16C5x. AN515 Comunicación con un bus IIC por medio de un PIC16C5X. TB050 Lectura de varios puntos de temperatura con sensores TC74 y un PIC16C5x. AN558 Uso de los dispositivos 24XX65 y 24XX32 con los códigos del PIC16C54. AN567 Interfaz para un PIC16C54 con una EEPROM serial 24LCXXB.AN590 Diseño de un reloj con pantalla de leds e interruptores con el PIC16C54. AN648 Interfaz del microcontrolador PIC16C54 con una EEPROM serial SPI.AN577 Resultados EMI del PIC16C54A.AN661 Decodificador Hopping para un codificador KeeLoq por medio de un PIC16C56AN715 Medida de sincronización usando un PIC16F84A y un ADXL202.AN689 Asistente de ingeniero por medio de un PIC16F84A.
INICIO
492
Notas de AplicaciónPIC16F87X
AN686 Circuitos Supervisores.AN246 Manejo de las entradas analógicas de un Convertidor SAR A/D.AN236 Automatización del hogar X-10 usando el PIC16F877A.AN826 Conceptos para el oscilador de cristal en un rfPIC™ y un PICmicro®.TB052 Monitorización de temperatura multizona.TB051 Medición de temperatura.AN670 Conversión coma flotante a ASCII.AN777 Multitarea para el PIC16F877 con el Salvo RTOS.AN732 Implementación de un cargador boot para el PIC16F87X.AN693 Entendiendo las especificaciones de un convertidor A/D.AN656 Programador para calibración de parámetros.AN582 Reloj de tiempo real de baja potencia.TB028 Técnica para calcular el día de la semana.TB033 Uso del PIC16F877 para desarrollar códigos del PIC16CXXX.AN709 Consideraciones de diseño a nivel de sistema.TB026 Cálculo de chequeo de la memoria de programa con el PIC16F87X.TB025 Carga de archivos HEX al PIC16F87X.TB029 Manejador complementario de LEDs.AN690 Autodetección de memoria de I²C™.
INICIO
493
Notas de AplicaciónPIC16F87X
TB004 Calibración automática del tiempo de espera del WDT.TB008 Técnicas para fuentes de alimentación sin transformador. AN597 Implementación a frecuencias ultrasónicas.AN587 Interfaz de un microcontrolador PIC a un módulo LCD.AN607 Detector de fallas de la alimentación. AN660 Rutinas de coma flotante.AN595 Mejora de la Susceptibilidad de una aplicación.AN591 Bus de escritorio de la Apple.AN594 Uso de los módulos CCP. AN655 Conversión D/A por medio de un PWM y una red R-2R.AN667 Cargador inteligente de baterías con interfaz SMBus.AN617 Rutinas de coma flotante.AN893 Control de un motor DC con escobillas por medio del PIC16F684.AN892 Monitor de seguridad contra falla e interruptor de frecuencia con un PIC16F684.AN889 Control VF de motores de inducción trifásicos por medio del PIC16F7X7.AN880 Referencia rápida de códigos de conversión entre un 8051 y un PIC.AN879 Uso de un PIC de bajo consumo para un módulo reloj despertador.AN258 Programador de microcontroladores con interfaz USB de bajo costo. AN774 Comunicación asíncrona con el módulo USART.AN212 Sensor inteligente de nodo CAN utilizando el MCP2510 y el PIC16F876.
INICIO
494
Notas de AplicaciónOtros PIC
AN239 Nodo “esclavo” LIN para PIC16 y PIC18.AN240 Nodo “esclavo” LIN en un PIC16C433.AN237 Implementación de un nodo “esclavo” LIN en un PIC16F73.AN851 Transferencia de datos a la FLASH para dispositivos PIC16 y PIC18. AN844 Interfaces simplificadas para termocuplas en microcontroladores PIC.AN847 Control de motor en aeromodelismo. AN821 Encriptación avanzada estándar por medio de un PIC16XXX.TB053 Generación de alto voltaje por medio de los PIC16C781/782. AN756 Uso de un MCP2120 para comunicaciones por infrarrojo. AN758 Uso de un MCP2150 para añadir una conectividad inalámbrica IrDA®.TB045 Rutinas de codificación de recepción Manchester para dispositivos Keeloq.AN744 Decodificador Keeloq modular con PIC de la gama media en lenguaje C. AN746 Interfaz de los potenciómetros digitales MCP41XXX/42XXX con microcontroladores PIC.AN747 Comunicación con protocolo para los potenciómetros digitales MCP42XXX.AN217 Programador para los KeeLoQ HCS30X, HCS200. AN742 Decodificador Hopping modular con microcontroladores PIC de la gama media.TB043 Rutinas de verificación CRC para KeeLoq.AN823 Diseño analógico en el mundo digital por medio de controladores de señales mezcladas. AN220 Medidor de vatios-hora por medio de un PIC16C923 y un CS5460.AN735 Utilización del módulo MSSP para comunicaciones I2C.
INICIO
495
Notas de AplicaciónOtros PIC
AN734 Utilizacion del módulo SSP en modo “esclavo” para la comunicación I2C.AN216 Controlador de convertidor DC/DC con un microcontrolador PIC. AN214 Compatibilidad de un transductor inteligente IEEE 1451.2 con un PIC.AN731 Incrustación de un microcontrolador PIC en el Internet. AN730 Chequeo y generación CRC.TB016 Implementación de un ICSP con un PIC16F8X.TB013 Implementación de un ICSP con un PIC16CXXX.AN585 Sistema operativo en tiempo real para un PIC16/17.AN724 Utilización de un PIC para conectar a Internet vía PPP.AN656 Uso de parámetros de calibración para la programación serial en los PIC.AN703 Conexión de un PIC con el convertidor serial de 12 bits MCP320X.AN580 Utilización del temporizador 1 en modo de reloj asíncrono.AN578 Uso del módulo SSP en el ambiente “multimaestro” IIC.AN579 Utilización del puerto paralelo de 8 bits.AN714 Implementación de sistema de seguridad inalámbrico con Keeloq y un PIC.AN716 Migración de diseños desde el PIC16C74A/74B hacia el PIC18C442AN719 Interfaz del convertidor analógico a digital MCP3201 con un microcontrolador PIC.TB028 Técnica para calcular el día de la semana.AN701 Eliminador de batería en modo de conmutación basado en un PIC16C72A.AN700 Convertidor Delta-Sigma por medio de un módulo de comparación analógica.
INICIO
496
Notas de AplicaciónOtros PIC
PICREF-3 Medidor de vatios hora.PICREF-2 Cargador de baterías inteligente.PICREF-5 Cargador de baterías nivel 3 del SMBus para el PIC16C73A.TB020 Emulación del PIC12C67X con el PIC16C72.AN672 Decodificador de código Hopping con PIC del la gama media.TB004 Calibración automática del período de espera del temporizador WDT.TB008 Fuente de alimentación sin transformadores. AN668 Interfaz de un PIC16C92x a una EEPROM serial SPI.AN514 Técnicas de interrupción por Software. AN654 El PWM, una solución de software mediante los PIC16CXXX.TB010 Un convertidor A/D de 4 canales de 8bits a un PIC17C4X.AN546 Utilización del Convertidor Analógico a Digital.AN597 Implementación en el rango ultrasónico.AN615 Diseño de un reloj económico mediante técnicas de baja potencia.AN511 Reemplazo de PLD.AN589 Desarrollo de un programador basado en un PC para el PIC16C84.TB011 Utilización de la SRAM con un PIC16CXX.AN588 Guía de diseño de osciladores para los PIC16/17.AN607 Determinación de fallas de encendido.AN663 Decodificador sencillo de código Hopping con Keeloq.
INICIO
497
Notas de AplicaciónOtros PIC
AN529 Manejador de LED y teclado 4x4 por muestreo.AN606 Utilización de diseños de baja potencia con PIC16/17.AN566 Utilización del las interrupciones del puerto B como interrupciones externas. AN576 Técnicas para deshabilitar interrupciones globales.AN616 Procesamiento digital de señales con el PIC16C74.AN662 Decodificador de Código Hopping con KeeLoq por medio de aprendizaje seguro.Fact 2 Convertidor A/D del PIC16C7X.AN552 Implementación de un despertador con teclado.AN520 Comparaciones entre microcontroladores de 8 bits.AN556 Implementación de una tabla de lectura.AN522 Consideraciones durante el encendido.AN595 Mejoramiento de la susceptibilidad en una aplicación a ESD. AN649 Caracteríssticas del reloj del PIC16C924.AN531 Posicionador remoto inteligente.AN575 Rutinas de coma flotante compatibles con la norma IEEE 754. AN658 Fundamentos de los LCD con los PIC16C92X.AN613 Uso de las EEPROMs seriales de la serie 93 con el puerto SPI. AN513 Conversión Analógica a Digital.AN600 Control de flujo de aire con lógica difusa.AN527 Software administrador de la pila (Stack).
INICIO
498
Notas de AplicaciónOtros PIC
AN528 Implementación de un despertador con teclado. AN557 Voltímetro digital de cuatro canales con teclado y pantalla.AN560 Uso de las EEPROM seriales 93LC56 y 93LC66.AN535 Lógica a utilizar con EEPROM seriales. AN655 Conversión D/A por medio del PWM y una red R-2R para generar ondas seno y DTMFL.AN643 Modulación de Código de Pulso Diferencial Adaptable.AN647 Interfaz entre un PIC16C64/74 con una EEPROM Serial. Fact 3 Cuidado y alimentación del PIC16C74.AN584 Soporte de PICMASTER en Microsoft Windows(TM) DDE.AN521 Intefaz con líneas de potencia AC.AN554 Implementación de Software del bus of I²C maestro.AN611 Medición de Resistencia y Capacitancia cou un PIC 16C622.AN667 Cargador de batería inteligente con la interfaz SMBus.AN555 Implementación de Software para el puerto serial asíncrono.AN519 Desarrollo de un ratón serial.Fact 1 Guía de diseño de osciladores para los PIC.
INICIO
499
• http://www.comunidadelectronicos.com/sitios2.htm • http://www.siste.com.ar/enlacesarchivos/Micros.htm • http://www.sagitron.es • http://www.todorobot.com.ar • http://www.todopic.com.ar/ • http://robotia.com.ar/rb/links/links.htm• http://www.abcdatos.com/tutoriales/electronicayelectricidad/electronica/microcon
troladorespic.html
• http://perso.wanadoo.es/juanramon.villodas/favorite.htm • http://www.micropic.arrakis.es/marcos.htm• http://www.miguelo.com.ar/mchip/index.html• http://www.conket.com/modules.php?name=Topics• http://www.geocities.com/micramtechnologies/seteando.htm• http://www.hackemate.com.ar/mirrors/karpoff/manuales/topcite/archivos/hitechPI
C.htm• http://boards1.melodysoft.com/app?ID=creatronica.microcontroladores&DOC=1
21• http://www.geocities.com/alva_cesar/rutas.htm
Lista de algunos sitios web relacionados con PIC
INICIO
500 INICIO
501
Equipo requerido para la actualización del PICSTART PLUS
A medida que van fabricando nuevos modelos de microcontroladores, será necesario que tú actualices el MPLAB IDE y el programador PICSTART PLUS, para que puedas utilizarlos en los nuevos componentes ofrecidos. La versión nueva del MPLAB IDE, la puedes bajar en www.microchip.com. El equipo requerido para actualizar al PICSTART PLUS, es el siguiente:
• Programador PICSTART PLUS, el cual debe estar encendido y conectado al computador con el puerto serial.
• Última versión del Software MPLAB IDE.• Microcontrolador PIC17C44 (de 25MHz o más veloz) borrado.• Archivo actualizado psf######.hex (donde ###### es el número de la
última versión). Éste se encuentra en el software de instalación del MPLAB IDE.
• Un destornillador de estrías.
Sin embargo, a partir del año 2004, los PIC17C44 ya no tienen la capacidad suficiente para aceptar esta actualización. Para ello, necesitarás adquirir un módulo UK003010, y seguir las instrucciones para realizar la actualización del PICSTART PLUS. Para más detalles consulta en alguna de las direcciones siguientes: http://www.sagitron.es o http://www.microchip.com.
Otro detalle, si tu PICSTART PLUS ya contiene el módulo UK003010, ya sea porque es nuevo (versión R20 o superior), o porque ya instalaste dicho módulo, no necesitarás seguir los pasos de actualización que se presentan en las siguientes páginas, simplemente descargarás la actualización desde tu computador.
INICIO
502
Procedimiento para la actualización del PICSTART PLUS
• Seleccionar en el MPLAB al microcontrolador PIC17C44.• Habilitar al programador PICSTART PLUS.• Seleccionar en los bits de configuración lo siguiente:
– Oscillator: XT.– Processor Mode: Microcontroller.– Watchdog timer: TMR.
• Seleccione en el menú: File, Import y luego escoja el archivo de actualización ######.hex.
• Inserte al PIC17C44 borrado en el sócalo del programador.
• Verifique que el dispositivo está borrado.• Seleccione el botón “Program” para transferir el archivo
al PIC17C44.• Al terminar la transferencia, extraiga al PIC17C44.• Salga del MPLAB, desconecte la fuente y la conexión
serial del computador al programador... (Continúa en la página siguiente).
INICIO
503
Procedimiento para la actualización del PICSTART PLUS (continuación)
• Extraiga la tapa posterior del programador.• Saque con cuidado al microcontrolador que está en el
programador y guárdelo, servirá para otras actualizaciones.
• Inserte cuidadosamente al PIC17C44 recién programado. El terminal 1 del PIC debe estar hacia el conector serial.
• Coloque la tapa posterior del programador y atorníllela con cuidado, sin aplicar un torque excesivo.
• Vuelva a conectar el programador PICSTART PLUS a la fuente y al puerto serial del computador.
• Arranque al MPLAB IDE y habilite al programador.• Podrás verificar que se ha actualizado la versión del
programador al habilitarlo. Igualmente podrás verificar la versión del MPLAB IDE en “Help, About MPLAB IDE”.
• Tu programador PICSTART PLUS está actualizado.
INICIO
504INICIO
505
Grabación de un programa en un PIC16F87X
La grabación de un microcontrolador PIC16F87X se realiza en forma serial, y para ello se puede hacer aplicando una tensión baja al terminal MCLR#/Vpp (5V) o con una tensión alta aplicada a ese terminal (13V ±5%). Para programar en ambos casos se utilizan la línea RB6/PGC para colocar los pulsos de sincronización o señal de reloj, y la línea RB7/PGD para colocar los bits datos en serie. En el caso de optarse por la programación de tensión baja, entonces se deberá colocar el terminal RB3/PGM en nivel alto.
A continuación te presentamos los planos y las instrucciones para que hagas un programador de los PIC16F84 y los de la serie PIC16F87X. Los programas para este programador los podrás bajar en Internet en la dirección:
http://www.todorobot.com.ar.
INICIO
506
Diagrama del circuitoprogramador
INICIO
507
El PicProg
Descripción:
PicProg Programador para PIC 16F8xx(Versión 2.0) (c) TodoRobot - 2002
El PicProg está preparado para programar los siguientes modelos de la familia de Microchip:
16F84, 16F870, 16F871, 16F872, 16F873, 16F874, 16F876, 16F877.
El PicProg le permite Programar, Verificar y Borrar todos los modelos anteriormente detallados.El archivo Hexadecimal (.hex) a grabar debe ser formato Intel INHX8M. Éste es el formato estándar generado por la herramienta de desarrollo MPLAB que puede descargarse gratis en el sitio de Microchip.
Para ir al sitio web donde está el software de instalación del PicProg haz clic aquí.
INICIO
508
Instrucciones para el PicProg
ProgramarEl PicProg verifica antes y después de grabar cada dirección. De esta forma se evita grabar el mismo dato ya grabado, prolongando la vida útil de la Flash Memory. Y luego realiza la verificación posterior al grabado para asegurarse que el dato ha sido grabado adecuadamente.
VerificarComo se dijo en el punto anterior, el PicProg realiza una verificación al grabar cada dirección, por lo tanto no es necesario ejecutar este procedimiento luego de cada programación. Esta función es más bien útil cuando no se está seguro de cual es el programa que ha sido o tiene cargado un determinado micro. BorrarEsta función es solamente necesaria cuando el PIC ha sido programado con código de protección (CP). En estos caso la única forma de regrabar el micro es efectuando un borrado general. Está función borra la memoria de programa y la de datos. Poner el PIC en Modo RUNEsta función haced qued la línea MCLR/VPP pase a 5v y por lo tanto el PIC salgo del modo Reset para pasar al modo de ejecución normal.Está funcionalidad solo es útil cuando se está usando la modalidad In-Circuit o bien se esté trabajando en un diseño usando el PIC instalado en el Programador.
INICIO
509
Programación Paso por paso
1°) Seleccionar el puerto LPT a usar mediante el menú desplegable correspondiente. Si por algún motivo no se pudiese detectar el Hardware del programador, aparecerá un mensaje en rojo indicando el error y se bloquearán todos los controles hasta tanto no se resuelva el problema. Generalmente la dirección 0x378 corresponde al LPT1 y 0x278 al LPT2. Pero en contados casos, puede darse que el LPT1 tenga la dirección 0x3BC, en cuyo caso el LPT2 asume la dirección 0x378.2°) Seleccionar el modelo de Microcontrolador que se desea programar. Esta función puede dejarse también en Autodetectar para permitir que el PicProg lo detecte automáticamente.3°) Ingresar el archivo Hexadecimal (.hex) que contiene el programa a descargar al PIC. Puede usarse el botón BUSCAR para encontrar el archivo a grabar o bien escribirlo directamente en la ventana.4°) Pulsar el botón CONFIGURAR para establecer la configuración deseada para el PIC (Watchdog, Power Up Timer, etc). Todas las configuraciones están por defecto seteadas para detectar estos parámetros directamente desde el archivo hexadecimal (.hex), para que esto funcione se debieron haber colocado previamente en el código fuente a fin de que el compilador genere el código necesario en el archivo hexadecimal. En ese caso este punto puede ser salteado y pasar directamente al punto siguiente.5°) Pulsar el botón PROGRAMAR para iniciar la descarga hacia el PIC. Aparecerá una ventana pidiendo confirmación de los parámetros que se usarán en la programación y, una vez aceptado, si todo ha funcionado correctamente, aparecerá una ventana indicando la finalización del proceso.INICIO
510
Algunas sugerencias
IMPORTANTE: Antes de insertar o extraer un micro del zócalo de programación, se debe tener la precaución de retirar la alimentación del programador, debido a que no se ha previsto ningún circuito de aislamiento y podría resultar dañado el chip o el puerto paralelo de la PC. Asimismo es aconsejable no alimentar el programador hasta tanto el programa PicProg no haya sido ejecutado y se encuentre activo en pantalla. Reporte de errores a [email protected] http://www.todorobot.com.ar
INICIO
Recommended