APLICACIÓN DE MICROCONTROLADORES - …148.206.53.84/tesiuami/UAMI13022.pdf · § Unidad de...
Transcript of APLICACIÓN DE MICROCONTROLADORES - …148.206.53.84/tesiuami/UAMI13022.pdf · § Unidad de...
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________1
UNIVESIDAD AUTONOMA METROPOLITANA
Unidad IZTAPALAPA
División CIENCIAS BASICAS E INGENIERÍA
Grado LICENCIATURA EN ING. BIOMEDICA
Título de Trabajo APLICACIÓN DE MICROCONTROLADORES
Nombre del Participante MENDEZ DELGADILLO ARLES MONICA
Nombre del Asesor M. EN C. VICTOR H. TELLEZ ARRIETA
Firma del Asesor
Lugar y Fecha de Realización MEXICO, D.F. MAYO 1999.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________2
CONTENIDO
• Introducción
• Marco Teórico
• Que es un Microcontrolador
• Caracteristicas y arquitectura de los microcontroladores PIC
§ Memoria de programa
§ Memoria de Datos
§ Interfases/Periféricos
§ Características Especiales
§ Esquema de Reloj/Ciclo de Instrucción
• CPU y ALU
§ Unidad de Procesamiento Central
§ Unidad Lógica Aritmética (ALU)
• Puertos de Entrada/Salida “I/O”
• Convertidores A/D
• Ejemplos de programas con aplicaciones de microcontroladores
• Conclusiones
• Bibliografía
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________3
APLICACIÓN DE MICROCONTROLADORES
INTRODUCCCION
En el mundo moderno la tecnología nos lleva a buscar mejores soluciones, mas
especializadas, mas altos rendimientos y mejores costos. Como un balance de
efectividad, rendimiento, y bajo costo, se desarrollan pequeños computadores que
pasan a ser parte de nuestra vida cotidiana, los microcontroladores.
Los microcontroladores están dentro de muchos tipos de equipos electrónicos,
representan la gran mayoría de procesadores vendidos: más del 50% son
controladores “sencillos”, y otro 20% son procesadores digitales de señales
(DSPs) mas especializados. Un hogar típico en un país desarrollado es probable
que tenga solamente uno o dos microprocesadores de propósito general pero algo
entre una y varias docenas de microcontroladores. Estos pueden encontrarse en
equipos eléctricos, lavadoras, hornos de microondas, teléfonos, celulares, etc.
La instrumentación y la electromedicina son dos campos idóneos para la
implementación de microcontroladores. Otra importante industria consumidora de
estos circuitos integrados es la automotriz, que los aplica en el control de aspectos
tan populares como la climatización, la seguridad y los frenos ABS, entre otros.
MARCO TEORICO
QUE ES UN MICROCONTROLADOR
Un microcontrolador es un circuito integrado programable que contiene todos los
componentes de una computadora. Un microcontrolador es una computadora en
un chip utilizada para controlar el funcionamiento de una tarea determinada en
dispositivos electrónicos y suele ser incorporado en el propio dispositivo que
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________4
gobierna, por cuya característica tiene la denominación de “controlador incrustado”
(embedded controller). Es un tipo de microprocesador que enfatiza la
autosuficiencia y el costo-efectividad, en contraste con los microprocesadores de
propósito general (como los utilizados en una PC). Un microcontrolador típico
contiene todas las memorias e interfaces necesarias para una aplicación simple,
mientras que un microprocesador requiere de chips adicionales para proveer estas
funciones.
CARACTERISTICAS Y ARQUITECTURA DE LOS
MICROCONTROLADORES PIC
Un microcontrolador es un circuito integrado simple que posee todos los
componentes de un computador pero con características fijas que no pueden
alterarse.
Sus principales características son las siguientes:
1. Procesador
2. Memoria no volátil para almacenamiento del programa
3. Memoria de lectura/escritura para almacenamiento de datos
4. Interfases de Entrada/Salida o Periféricos
5. Características Especiales.
Esta integración reduce dramáticamente el número de chips y la cantidad de
cableado y espacio que sería necesario para producir sistemas equivalentes
usando chips separados.
En la arquitectura Harvard se tienen la memoria de programa y la memoria de
datos como memorias separadas las cuales se accesan desde buses separados.
Esto mejora por mucho la arquitectura tradicional Von Newman en la cual el
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________5
Memoriade Datos CPU
Memoria deInstrucciones
CPU Memoria deDatos e
Instrucciones
programa y los datos eran capturados desde la misma memoria utilizando el
mismo bus.
Los microcontroladores utilizan la arquitectura Harvard en la cual son
independientes la memoria de instrucciones y la memoria de datos y cada una
dispone de su propio sistema de buses para el acceso. Esta dualidad además de
propiciar el paralelismo, permite la adecuación del tamaño de las palabras y los
buses a los requerimientos específicos de las instrucciones y de los datos.
También la capacidad de cada memoria es diferente. El aislamiento y
diferenciación de los dos tipos de memoria permite que cada uno tenga la longitud
y el tamaño adecuados.
ARQUITECTURA HARVARD vs ARQUITECTURA VON NEWMAN
8 14
BUS DE DATOS BUS DEINSTRUCCIONES
HARVARD
8
BUS DE DATOS/INSTRUCCIONES
VON NEWMAN
El procesador de los microcontroladores responde a la arquitectura RISC
(Reduced Instruction Set Computer), que se caracteriza por poseer un repertorio
de instrucciones máquina pequeño y simple, de forma que la mayor parte de las
instrucciones se ejecuta en un ciclo de instrucción.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________6
El rendimiento del computador es aumentado por el paralelismo implícito que
consiste en la segmentación del procesador (pipe-line), descomponiéndolo en
etapas para poder procesar una instrucción diferente en cada etapa y trabajar con
varias a la vez.
La arquitectura de los microcontroladores PIC está basada en un juego de
instrucciones RISC modificado que provee una ruta de migración desde 6 hasta 8
pines y desde 384 bytes hasta 128Kbytes de memoria de programa.
Los microcontroladores PIC incorporan en su procesador las siguientes tres
características avanzadas:
- Arquitectura Harvard
- Instrucciones tipo RISC
- Procesador segmentado
Al integrar estos elementos se logra alto rendimiento y elevada velocidad, ya que
los PICs son capaces de ejecutar en un ciclo de instrucción todas las
instrucciones, con excepción de las de salto.
En la arquitectura de los microcontroladores PIC se utilizan instrucciones
ortogonales. Estas instrucciones ortogonales hacen posible que se lleve a cabo
cualquier operación en cualquier registro usando cualquier modo de
direccionamiento. Esta naturaleza simétrica y carente de “instrucciones
especiales” hacen de la programación simple eficiente.
Las ventajas que se obtienen de la arquitectura que utilizan los PIC son:
- Instrucciones de 12-, 14- y 16-bit de ancho que son mas compatibles y
mejor confeccionadas para maximizar la eficiencia en el proceso y
elevar el rendimiento.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________7
- Las instrucciones y los datos son transferidos en buses separados,
evitando cuellos de botella en el procesamiento e incrementando
sobretodo el rendimiento del sistema.
- Las etapas de segmentación (pipelining) habilitan que una instrucción
sea ejecutada mientras la siguiente es recogida o capturada.
- Las instrucciones con un ancho de palabra sencillo incrementan la
eficiencia del código de software y reduce memoria de programa
requerida.
Memoria de programa
El diseño del microcontrolador es tal que en su memoria se almacenan todas las
instrucciones del programa de control sin la posibilidad de utilizar memorias
externas de ampliación.
Ya que el programa a ejecutar es siempre el mismo, éste se graba de forma
permanente. Para cubrir los exigentes requerimientos de diseño existen las
siguientes opciones de programación:
ROM CON MASCARA
En este tipo de memoria el programa se graba en el chip durante el proceso de
fabricación mediante el uso de “máscaras”. Esta opción ofrece el mas bajo costo
para productos en alto volumen.
EPROM
La grabación de esta memoria se realiza mediante un “grabador”, que es un
dispositivo físico controlado desde una PC. En la superficie del encapsulado existe
una ventana de cristal por la que se somete al chip de la memoria a rayos
ultravioleta para producir su borrado y emplearlo nuevamente. Su uso es
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________8
recomendable en la fase de diseño, pero debe considerarse que su costo unitario
es alto.
OTP (One Time Programmable)
Los microcontroladores OTP son manufacturados en altos volúmenes sin un
software específico para el consumidor y pueden ser programados una sola vez
por el usuario, utilizando el mismo procedimiento que con la memoria EPROM. No
es posible su borrado posterior. Tienen precios muy accesibles y la sencillez de
grabación sugieren este tipo de memoria para prototipos finales y series de
producción cortas así como para consumidores que necesitan rápido acceso en el
mercado y flexibilidad para actualizaciones de software frecuentes.
EEPROM
La grabación es similar a las memorias OTP y EPROM, pero el borrado es mucho
mas sencillo al poderse efectuar de la misma forma que el grabado, esto es,
eléctricamente. De esta manera las memorias EEPROM pueden ser programadas
y grabadas cuantas veces se requiera. A este tipo de memorias corresponde el
PIC16C84 que es de los mas versátiles y convenientes de su tipo.
Este tipo de microcontroladores por sus características es ideal para la enseñanza
y creación de nuevos proyectos aunque tienen limitaciones en su capacidad,
además el tiempo de escritura es relativamente grande y con elevado consumo de
energía.
FLASH (ELECTRICAMENTE RE-PROGRAMABLE)
Los microcontroladores Flash PIC permiten borrar y reprogramar la memoria de
programa en el microcontrolador. Es una memoria no volátil, de bajo consumo,
que se puede escribir y borrar al igual que las EEPROM, pero cuentan con mayor
capacidad. Los microcontroladores Flash pueden ser programados por los
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________9
usuarios en el proceso de manufactura o actualizar sistemas en campo. Estas
características permiten una revisión sencilla de código, parametrización de
sistema u opciones específicas de usuario sin desperdicio. La re-programabilidad
reduce también el ciclo de verificación de diseño.
PROGRAMACION SERIAL EN CIRCUITO “ICSP™” (In-circuit serial
programming)
Los microcontroladores Flash y OTP tienen la característica de ICSP. La ICSP
permite que el microcontrolador sea programado después de ser colocado en la
tablilla del circuito, ofreciendo una enorme flexibilidad, tiempo reducido de
desarrollo e incremento en la eficiencia de manufactura. Esta popular tecnología
hace posible costos reducidos de actualizaciones en campo, calibraciones de
sistema durante la manufactura y la adición de códigos únicos de identificación al
sistema. Requiriendo solamente dos pines de Entrada/Salida para la mayoría de
los dispositivos, se ofrece la metodología de programación menos invasiva en la
industria.
AUTOPROGRAMACION
Existen familias de microcontroladores con la capacidad de auto programación. La
auto programación habilita actualizaciones remotas a la memoria de programa tipo
Flash y al dispositivo final a través de una variedad de medios que van desde
Internet y modem hasta RF e infrarrojos. Para fijar la auto programación, el
diseñador programa un sencillo algoritmo cargador de parche en una área de
código protegido de la memoria de programa Flash. A través del medio
seleccionado un comando seguro permite la entrada dentro del microcontrolador a
través de diferentes puertos de comunicación como lo son I2C o SPI serial. El
cargador de parche entonces se habilita para reprogramar la memoria de
programa con los datos recibidos, así la auto programación se lleva a cabo sin la
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________10
necesidad de componentes externos y sin limitaciones de velocidad de operación
o voltaje.
Memoria de Datos
Ya que los datos que manejan los programas se modifican constantemente, los
microcontroladores cuentan con memorias de lectura y escritura. Los hay con
memorias del tipo EEPROM que evitan la pérdida de información con el corte de
energía y que la mantienen disponible para cuando se reinicie el programa.
También los hay con memorias tipo SRAM
La memoria de datos está construida por el área de Registros de Funciones
Especiales (SFR) y por el área de Registros de Propósitos Generales (GPR). Los
SFR son usados para control y estado del microcontrolador y funciones
periféricas, mientras que los GPR son el área general para almacenamiento de
datos y operaciones en el uso de parches. La memoria de datos/archivos de
registro pueden ser directamente o indirectamente direccionados. Todos los
registros de funciones especiales, incluyendo el contador de programa, se mapean
en la memoria de datos.
Interfases/Periféricos
Los periféricos son las características que suman una diferenciación de un
microprocesador. Estos facilitan la interfase al mundo exterior (tales como E/S de
propósito general, entradas A/D, y salidas PWM), y a tareas internas, tal como el
mantener diferentes tiempos bases (p.e. temporizadores). Estos periféricos son
los siguientes:
1. Entradas/Salidas “E/S”
2. Puerto Paralelo Esclavo “PSP”
3. Temporizadores “Timer”
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________11
4. Captura/Comparación/PWM (Modulación de Ancho de Pulso)
5. Puerto Serial Esclavo “SSP”
6. Puerto Serial Maestro Sincronizado “MSSP”
7. USART direccionable (Módulo Transmisor Receptor Asíncrono SíncronoUniversal)
8. CAN (Controller Area Network)
9. Comparador de Voltaje
10. Comparadores
11. Convertidor A/D compatible
Características Especiales
Las características especiales son las características únicas que ayudan a:
§ Decrementar el costo del sistema
§ Incrementar la confiabilidad del sistema
§ Incremetar la flexibilidad de diseño
Varias características especiales que ayudan a alcanzar estas metas son:
1. Detección de Bajo Voltaje
2. Operación WDT y “Dormido”
3. Bits de configuración del dispositivo
4. Programación Serial “En Circuito” (ICSP)
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________12
DIAGRAMA DE BLOQUES DEL PIC16F84A
Esquema de Reloj/Ciclo de Instrucción
La entrada del reloj está internamente dividida para generar los diferentes relojes
(Q1, Q2, Q3, Q4) graduales sin traslaparse. Internamente, el contador de
programa se incrementa cada Q1, y la instrucción es capturada de la memoria de
programa y colocada en el registro de instrucción en Q4 (para este caso en
particular donde suponemos que el PIC cuenta con cuatro relojes). La instrucción
es decodificada y ejecutada durante el siguiente Q1 hasta Q4. El flujo del reloj y de
la ejecución de instrucciones se ilustra como sigue:
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________13
CICLO DE RELOJ/INSTRUCCIÓN
Hay tres fuentes de reloj/oscilador desde las cuales el dispositivo puede operar.
Estas son:
1. Reloj de sistema externo (Tosc)
2. Lazo de fase cerrada (PLL)
3. Oscilador temporizador (TT1P)
CPU y ALU
Unidad de Procesamiento Central
La Unidad de Procesamiento Central (CPU) es responsable de usar la información
en la memoria de programa (instrucciones) para controlar la operación del
dispositivo. Muchas de estas instrucciones operan en la memoria de datos. Para
operar en la memoria de datos se requiere de la Unidad Lógica Aritmética (ALU).
Para ejecutar operaciones aritméticas y lógicas la ALU controla el estado de los
bits los cuales se encuentran en el Registro de “Status”. El resultado de algunas
instrucciones forzan el status de los bits a un valor dependiendo del estado del
resultado.
La CPU reconoce sus códigos máquina así como los mnemónicos (instrucciones)
que el macro ensamblador correspondiente reconoce para generar estos códigos.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________14
La familia de instrucciones que manejan los PICs puede tener cinco formatos
generales como se muestra adelante. , y cuyos códigos de instrucciones (opcode)
varían desde 4 bits hasta 8 bits. Este tamaño variable de “opcode” es lo que
permite que sean implementados juegos de instrucciones reducidos.
Formato general para Instrucciones
a. Operaciones de registros de archive orientadas por Byte
d = 0 para el destino que resulte para ser el registro WREG d = 1 para el destino que resulte para ser el registro de archivo (f) a = 0 para forzar al Banco de Acceso a = 1 para BSR para seleccionar el banco f = dirección de registro de archivo de 8 bit
Ejemplo de Instrucción: ADDWF MYREG, W, a
b. Operaciones de movimiento Byte a Byte
f = dirección de registro de 12 bits Ejemplo: MOVFF MYREG1, MYREG2
c. Operaciones de registros de archivo orientados por Bit
b = posición de 3 bits del bit en el registro de archivo (f) a = 0 para forzar al Banco de Acceso a = 1 para BSR para seleccionar banco f = dirección de registro de archivo de 8 bits
Ejemplo: BSF MYREG, bit, a
d. Operaciones literales
k = valor inmediato de 8 bit
Ejemplo: MOVLW 0X7F
15 10 9 8 7 0OPCODE d a f(FILE#)
15 12 11 0OPCODE f( FILE# fuente)
15 12 11 01111 f( FILE# destino)
15 12 11 8 8 7 0OPCODE b (BIT #) a f(FILE#)
15 8 7 0OPCODE k(literal)
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________15
e. Operaciones de control
n = valor inmediato 20 bits
Ejemplo: Instrucciones “CALL” y “GOTO”
La CPU puede ser catalogada como el cerebro del equipo. Es responsable de
capturar las instrucciones correctas para su ejecución, decodificar esa instrucción
y entonces ejecutarla.
La CPU en ocasiones trabajo en conjunción con la ALU para completar la
ejecución de la instrucción en operaciones lógicas y aritméticas.
La CPU controla el bus de direcciones de la memoria de programa, el bus de
direcciones de la memoria de datos y el acceso a la pila.
Unidad Lógica Aritmética (ALU)
Los dispositivos PIC contienen una ALU de 8 bits y un registro de trabajo (WREG)
de 8 bits. La ALU es una unidad lógica y aritmética de propósito general. Esta lleva
a cabo funciones aritméticas y Boleanas entre los datos en el registro de trabajo y
cualquier registro de archivo. El registro WREG está directamente direccionado y
en el mapa de memoria SFR.
15 8 7 0 OPCODE n<7:0>(literal)15 12 11 0
1111 n<19:8>(literal)
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________16
Registro WREG
Registro STATUSRegistros deFuncionesEspeciales (SFR)y RAM depropósito general(GPR)
OPERACION DE LA ALU Y REGISTRO WREG
Literal de 8 bits Archivo de Registros (de palabra de instrucción)
Valor de registro de 8 bits(de instrucción o dirección directa o indirecta)
8 8
8 8
Bit C Bits N, OV, Z, DC y C
ALU
Bit d o de instrucción 8
La ALU tiene un ancho de 8 bits y es capaz de realizar operaciones de suma,
substracción, multiplicación, intercambio y lógicas. Al menos que se mencione lo
contrario, las operaciones aritméticas son complemento de dos en naturaleza. En
instrucciones de dos operandos, típicamente un operando es el registro WREG. El
otro operando es un registro de archivo o una constante inmediata. En
instrucciones de operandos sencillos, el operando es ya sea el registro WREG o
un registro de archivo.
El multiplicador 8x8 opera en un ciclo sencillo, colocando el resultado de 16 bits en
un par de registros.
Dependiendo de la instrucción ejecutada, la ALU puede afectar los valores de los
bits del Cargador (C), Cargador de Digito (DC), Cero (Z), Sobreflujo (OV), y
Negativo (N) en el registro STATUS.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________17
Puertos de Entrada/Salida “I/O”
Los pines de I/O de propósito general pueden ser considerados como los mas
simples de los periféricos. Ellos le permiten al PIC monitorear y controlar otros
dispositivos. Para dar flexibilidad y funcionalidad a un dispositivo, algunos pines
son multiplexados con función(es) alternativa(s). Estas funciones dependen de
cuales características periféricas están en el dispositivo. En general, cuando un
periférico está funcionando, ese pin no puede ser utilizado como pin de I/O de
propósito general.
Para la mayoría de los puertos, la dirección de lso pines de I/O (entrada o salida)
es controlada por el registro de dirección de dato, llamado registro TRIS. El
TRIS<x> controla la dirección del Puerto<x>. Un “1” en el bit TRIS corresponde a
que el pin está siendo una entrada, mientras que un “0” corresponde a que el pin
parece O (salida).
El registro de Puerto es el enlace “latcht” para el dato para la salida. Cuando el
Puerto es leído el dispositivo lee los niveles presentes en los pines de I/O (no el
enlace). Esto significa que se debe tener cuidado con los comandos de lectura-
modificación-escritura en los puertos y cambiar la dirección de un pin desde una
entrada hasta una salida. El escribir a un puerto implica que los pines del puerto
son leídos, este valor es modificado, y entonces escrito al enlace de dato del
puerto.
EJEMPLO: INICIALIZACION DE PuertoA
Nota: En un Reset de Encendido, estos pines son configurados como entradas y se leen como “0”
;************************************************************BCF STATUS, RP0 ;CLRF PORTA ; Inicializa el PuertoA limpiando la salida; enlaza datosBSF STATUS, RP0 ; Selecciona el Banco1MOVLW 0x0F ; Valor usado parsa inicializar la dirección de datoMOVWF TRISA ; Establece a RA<3:0> como entradas; RA4 como salidas; TRISA<7:5> son siempre leídos como “0”;************************************************************
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________18
Convertidores A/D
Algunos microcontroladores PIC cuentan con modulos convetidores A/D. Para
estos casos una entrada analógica carga una muestra y un capacitor. La salida de
la muestra y el capacitor es la entrada del convertidor. El convertidor genera
entonces un resultado digital de este nivel analógico vía una aproximación exitosa.
Esta conversión A/D de la señal de entrada analógica da como resultado un
número digital correspondiente.
Los voltajes analógicos de referencia (suministro positivo y negativo) son
seleccionables vía software ya sea para los voltajes de suministro del dispositivo
(AVDD, AVss) o para el nivel de voltaje de referencia.
El convertidor A/D tiene la característica única de ser capaz de convertir mientras
el dispositivo está en modo dormido. Los convertidores A/D de los
microcontroladores tienen diferentes registros para los diferentes resultados y
registros de control.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________19
EJEMPLOS DE PROGRAMAS CON APLICACIONES DEMICROCONTROLADORES
Ahora bien que hemos mostrado a groso modo el funcionamiento general de los
microcontroladores PIC y algunas de sus aplicaciones, plantearemos algunos
ejemplos de sus aplicaciones más representativas.
1. Entradas/Salidas “E/S”
2. Puerto Paralelo Esclavo “PSP”
3. Temporizadores “Timer”
4. Captura/Comparación/PWM
5. Puerto Serial Esclavo “SSP”
6. USART direccionable
7. Convertidor A/D compatible
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________20
;************************************************************
; Ejemplo para el PIC18CXX2;;;************************************************************; Este programa muestra cómo leer un push-button y el control de LEDs; El PuertoB está conectado a un LED de 8 segmentos. RA4 está conectado a un switch (S2).; Este programa incrementa una cuenta del registro de archivo cada vez que S2 es presionado; El valor de la cuenta se despliega en el LED conectado al PuertoB; El LED debe incrementarse de forma binaria cada vez que S2 se presiona.list p=18c452#include<P18C452.INC>;************************************************************; variables
Countequ0x000ce Code;************************************************************; reset vectors
org 00000h ; Vector de resetgotoStart
;************************************************************;el código de programa comienza aquí
org 00020h ; Comienzo del programa EPROMStart; Comienza
clrfLATB ; Limpia el PuertoBclrfTRISB ; Convierte todos los pines del PuertoB en salidas.clrfCount ; Limpia la cuenta
Loop; lazobtfscPORTA,4 ; ¿Se ha presionado S2? (Normalmente el valor alto,
;baja cuando ha sido presionado)gotoLoop ; No, revisa otra vez
IncCountincfCount,F ; Incrementa la cuentamovffCount,LATB; mueve la cuenta a PuertoB
DebouncebtfssPORTA,4 ; ¿Ha sido liberada el botón?gotoDebounce ; No, espera masgotoLoop ; Sí, espera por la siguiente vez que se presione
END ; directiva que indica el final del código.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________21
;************************************************************; Ejemplo para el PIC18CXX2;;;************************************************************; Este programa utiliza el Timer1 y Timer3 para demostrar el uso de prioridad.;; El Timer1 está configurado para interrupciones de alta prioridad; y el Timer3 está configurado para interrupciones de baja prioridad. Escribiendo; a los LEDS del PuertoB, se muestra que una interrupción de alta prioridad; anula una interrupción de baja prioridad.list p=18c452, n=48, t=ON, st=OFF#include "p18c452.inc";------------------DEFINICIONES DE BIT ------------------------------------F EQU 0x0001;------------------VECTORES-------------------------------------------org 0x000000 ; vector de resetbra STARTorg 0x000008 ; vector de interrupción de alta prioridadbra TMR1_ISRorg 0x000018 ; vector de interrupción de baja prioridadbra TMR3_ISR;--------------------PROGRAMA-----------------------------------START
rcall INIT; Establece las interrupciones de prioridad.
bsf RCON,IPEN ; habilita las interrupciones de prioridad.bsf IPR1,TMR1IP ; Establece al Timer1 como fuente de interrupción de alta prioridadbcf IPR2,TMR3IP ; Establece al Timer3 como fuente de interrupción de alta prioridadbcf PIR1,TMR1IF ; limpia la bandera de interrupción del Timer1bcf PIR2,TMR3IF ; limpia la bandera de interrupción del Timer3bsf PIE1,TMR1IE ; habilita las interrupciones del Timer1bsf PIE2,TMR3IE ; habilita las interrupciones del Timer3bsf INTCON,GIEH ; establece el bit que hace posible la interrupción globalbsf INTCON,GIEL
;Se establece el Timer1clrfT1CONclrfTMR1H ; limpia el alto del Timer1clrfTMR1L ; limpia el bajo del Timer1bsf T1CON,TMR1ON ; hecha a andar al (enciende)Timer1
;Se establece elTimer3clrfT3CONmovlw0xF0movwfTMR3H ; escribe 0xf000 en el Timer3clrfTMR3Lbsf T3CON,TMR3ON ; enciende al Timer3
MLOOPgotoMLOOP
;-------------------------------SUBRUTINAS---------------------------------TMR1_ISR ; ISR de alta prioridad
bcf PIR1,TMR1IF ;limpia la badera de interrupción del Timer1.bcf PORTB,0 ;Apaga al PORTB<0> para indicar alta prioridad; la interrupción ha anulado la prioridad baja.bsf PORTB,7 ;Enciende el PORTB<7> para indicar alta prioridad; la interrupción está ocurriendo.
T1POLLbtfssPIR1,TMR1IF ;Se censa a la bandera de interrupción del TMR11
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________22
;para esperar por otro sobreflujo del TMR1.bra T1POLLbcf PIR1,TMR1IF ; limpia la bandera de interrupción del Timer1 otra vez.bcf PORTB,7 ; Apaga al PORTB<7> para indicar que el ISR de
; alta prioridad ha terminadoretfie
TMR3_ISR ; ISR de baja prioridadbcf PIR2,TMR3IF ; Limpia la bandera de interrupción del TMR3.movlw0xF0 ; Carga al TMR3 con el valor 0xF000movwfTMR3HclrfTMR3Lbsf PORTB,0 ; Enciende el PORTB<0> para indicar que una interrupción
; de baja prioridad está ocurriendo.T3POLL
btfssPIR2,TMR3IF ; Censa la bandera de interrupción del TMR3 para esperar; por otro sobreflujo del TMR3.
bra T3POLLmovlw0xF0 ; Carga al TMR3 con el valor de 0xF000 otra vez.movwfTMR3HclrfTMR3Lbcf PIR2,TMR3IF ; Limpia la bandera de interrupción del Timer3 otra vez.bcf PORTB,0 ; Apaga el PORTB<0> para indicar que el ISR de
; baja prioridad terminó.retfie
INITclrfPORTB ; establece al PuertoB para salidaclrfDDRBreturn
END ; fin de código
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________23
;***********************************************************; EJEMPLO DE CODIGO PARA PIC18CXX2 CON PICDEM-2;;************************************************************; Este programa demuestra la funcionalidad básica del USART;; El PuertoB se conecta a un LED de 8 segmentos.; Cuando el PIC18C452 recibe una palabra de datos desde; el USART, el valor se despliega en el LED y; es retransmitido a la computadora huésped.;; Se establece un programa terminal a 9600 baudios, 1 bit de “stop”, sin paridadlist p=18c452; establece el tipo de procesadorlist n=0; suprime ruptures en la página en el archive de listainclude <P18c452.INC>;************************************************************; Vectores de Reset e Interrupción
org 00000h ; Reset VectorgotoStartorg 00008h ; Interrupt vectorgotoIntVector
;************************************************************; El programa comienza aquí
org 00020h ; Comienzo de programa EPROMStart
clrfLATB ; Limpia los enlaces “latches” de salida del PuertoBclrfTRISB ; Configura al PuertoB como salidasbcf TRISC,6 ; Hace al RC6 una salidamovlw19h ; 9600 baudios @4MHzmovwfSPBRGbsf TXSTA,TXEN ; Habilita la transmisiónbsf TXSTA,BRGH ; Selecciona la frecuencia alta de baudiosbsf RCSTA,SPEN ; Habilita el Puerto Serialbsf RCSTA,CREN ; Habilita la recepción continuabcf PIR1,RCIF ; Limpia la bandera de interrupción RCIFbsf PIE1,RCIE ; Establece la interrupción RCIEbsf INTCON,PEIE ; Habilita interrupciones periféricasbsf INTCON,GIE ; Habilita las interrupciones globales
;************************************************************; Lazo principal Main
gotoMain ; lazo a sí mismo;************************************************************; Rutina de Servicio de InterrupciónIntVector; Salva el contexto (registros WREG y STATUS) si es necesario.
btfssPIR1,RCIF ; ¿el USART causó interrupción?gotoOtherInt ; No, otra interrupciónmovlw06h ; Enmascara los bits no deseadosandwfRCSTA,W ; Revisa si hay erroresbtfssSTATUS,Z ; ¿Estaba el bit de Status de error puesto?gotoRcvError ; Se encontró error, banderamovfRCREG,W ; Obtiene dato de entradamovwfLATB ; Despliegue en LEDsmovwfTXREG ; Caracter Eco regresagotoISREnd ; va al final de ISR, restablece el contexto, regresa
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________24
RcvErrorbcf RCSTA,CREN ; Limpia el status del receptorbsf RCSTA,CRENmovlw0FFh ; Enciende todos los LEDsmovwfPORTBgotoISREnd ; va al final de ISR, restablece el contexto, regresa
OtherIntgoto$ ; Encuentra la causa de la interrupción y le da servicio
; antes de regresar de la interrupción.; Si no, la misma interrupción re-ocurrirá tan pronto como; una ejecución regrese al programa interrumpido.
ISREnd; Restablece el contexto si es necesario.retfie
end ; fin de código de programa
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________25
;************************************************************; EJEMPLO PARA PIC18CXX2 CON PICDEM-2;; HW: Tarjeta PICDEM-2; FRECUENCIA: 4MHz
;************************************************************; Este programa demuestra la modulación de ancho de pulso (PWM) usando CCP2.;; El periodo de PWM se fija y entonces el ciclo de trabajo varía; al buscar un Nuevo valor en una tabla. Cuando el valor final de; la tabla se lee, la tabla se lee en reversa. La salida de PWM; se establece con RC1. La señal de PWM puede observarse; en el pin RC1. Las partes Y3, C6 & C7 no están instaladas en: la tarjeta del PICDEM 2.;
list p=18c452, n=48, t=ON, st=OFF#include "p18c452.inc"
;************************************************************; definiciones de bitsF EQU 0x0001 ;************************************************************; Locaciones RAM 18C452DIRFLAG EQU 0x0000;************************************************************; Locaciones ROM 18C452TABLADDR EQU 0x0003000;************************************************************; vectors
org 0x000000 ; vector resetbra STARTorg 0x000008 ; vector de interrupción de alta prioridadbra TMR1_ISR
;************************************************************; Inicio de programaSTART; Establece el modulo PWM; Establece el periodo de PWM escribiendo en PR2; Establece el ciclo de trabajo de PWM al escribir al registro CCPR2L; y al CCP2CON<5:4>>bits; Hace al pin CCP2 una salida al limpiar el TRISC<2> bit.
clrfCCP2CON ; el módulo CCP está apagadobsf CCP2CON, CCP2M3; selecciona el modo PWMbsf CCP2CON, CCP2M2;selecciona el modo PWMmovlw0x3F ; Se establece la frecuencia PWM a 78.12kHzmovwfPR2;bcf TRISC, 1 ; hace del canal 1 una salidamovlw0x00movwfCCPR2L
;Establece el valor prescalar de TMR2 y habilita al Timer2 al escribir en T2CON;Configura el módulo CCP2 para la operación PWM
clrfT2CON ; limpia T2CONclrfTMR2 ; limpia Timer2bsf T2CON,TMR2ON ; enciende Timer2
;inicializa la bandera de dirección para tablaclrfDIRFLAG
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________26
; Inicializa los registros apuntadores de la tabla; a la primera locación del dato almacenado en la memoria de programa.
movlwUPPER(TABLADDR)movwfTBLPTRUmovlwHIGH(TABLADDR)movwfTBLPTRHmovlwLOW(TABLADDR)movwfTBLPTRL
;establece interrupciónbsf RCON,IPEN ; habilita interrupciones de prioridad.bsf IPR1,TMR1IP ; establece al Timer1 como una fuente de interrupción
; de alta prioridadbcf PIR1,TMR1IF ; limpia la bandera de interrupción de Timer1bsf PIE1,TMR1IE ; habilita la interrupción de Timer1bsf INTCON,GIEH ; establece los bits que habilitan las interrupciones globalesbsf INTCON,GIEL
;Timer1 setupclrfT1CONclrfTMR1H ; limpia el valor alto de Timer1clrfTMR1L ; limpia el valor bajo de Timer1bsf T1CON,TMR1ON ; enciende Timer1
MLOOPgotoMLOOP
;************************************************************; subrutinasTMR1_ISR ; ISR de alta prioridad
bcf PIR1,TMR1IF ; limpia la bandera de interrupción de Timer1.rcall CHECK_ADDRbtfsc DIRFLAG,0bra RD_DOWN
RD_UP; Aquí el código hace una lectura de tabla, post- incrementa, y escribe el; valor al registro de ciclo-trabajo CCPR2L PWM.
tblrd*+movffTABLAT,CCPR2Lbra T1POLL
RD_DOWN; Aquí el código hace una lectura de tabla, post-decrementa, y escribe el; valor al registro de ciclo-trabajo CCPR2L PWM.
tblrd*-movffTABLAT,CCPR2Lbra T1POLL
T1POLLbtfssPIR1,TMR1IF ; Censa si hay bandera de interrupción Timer1 para;esperar por otra
; Sobreflujo de TMR1.bra T1POLLbcf PIR1,TMR1IF ;Limpia la bandera de interrupción de Timer1 otra vez.retfie
CHECK_ADDRmovlw LOW(TABEND) - 1subwf TBLPTRL,Wbnz CHECK_LOWsetf DIRFLAGreturn
CHECK_LOW
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________27
movlw LOW(TABLADDR)subwf TBLPTRL,Wbnz DONE_CHECKclrf DIRFLAG
DONE_CHECKreturn
;-------------------------------Datos---------------------------------------org TABLADDR
DB 0x00,0x06,0x0C,0x12,0x18,0x1E,0x23,0x28DB 0x2D,0x31,0x35,0x38,0x3A,0x3D,0x3E,0x3FTABENDEND ; fin de código de programa
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________28
;************************************************************************; Ejemplo para el PIC16C64/74; Puerto Paralelo Esclavo;;************************************************************************; Este programa es una demostración de la función del Puerto Paralelo Esclavo; del PIC16C64/74. El programa es manejado con interrupción, cuando al PIC; se le lee o se le escribe, se genera una interrupción. Si la interrupción; fue causada por una lectura, se incrementa un registro y; la nueva cuenta es colocada en una cola de salida. Si la interrupción fue; causada por una escritura, el dato se coloca en los pines del PuertoB;;Compatibilidad con MPASMWIN 1.40;;********************************************************************list p=16c64ERRORLEVEL -302;
include "p16c64.inc"LIST;------------------Definiciones de Registros ----------------------------FLAGREG equ 20h ;Registro de Bit BanderaOUTDATA equ 21h ;Dato de salidaINDATA equ 22h ;Dato de entradaCOUNT equ 23h ;Cuenta las veces que el registro de salida se lee;----------Definición de Bits para registros de bandera -----------
err equ 00h ;Bit bandera de errorOUTRDY equ 01h ;Bandera de dato de salida listoINFULL equ 02h ;Bandera de dato de entrada recibidoorg 0000h ;Vector Resetgoto Start ; lazoorg 0005h ; Vector Resetgoto Service_Int
;--------------------------------Programa ----------------------------------Start ;comienzo de código de programa
clrf OUTDATA ; Limpia los registros de datosclrf INDATAbsf STATUS,RP0 ; Selecciona el registro Bank1movlw b'00010111' ; Establece a RD, WR, y CS como entradasmovwf TRISE ; Habilita el Puerto Esclavo Paralelomovlw 0FFhmovwf TRISB ; Establece al PuertoB como salidamovlw b'10000000' ;movwf PIE1 ; Habilita la interrupción del Puerto Esclavo Paralelobcf STATUS,RP0 ;Selecciona registro Bank0movf OUTDATA,W ; Establece el Dato de salida en el PuertoDmovwf PORTDmovlw b'11000000' ; Establece GIE, PEIE (habilita interrupciones)movwf INTCON
Loop ; lazobtfsc FLAGREG,INFULL ;Revisa si se ha recibido un dato de entradagoto Checkout ;No hay dato listo, revisa la salidabcf FLAGREG,INFULL ;Limpia la bandera de dato de entrada listomovf INDATA,W ;Obtiene dato de entradamovwf PORTB ; Dato de entrada de salida a PuertoB
Checkoutbtfsc FLAGREG,OUTRDY ; Revisa si la salida de dato lista
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________29
goto Loop ;No hay salida aún, lazoincf COUNT, F ;Incrementa el dato de salidamovf COUNT,W ; Obtiene dato de salidamovwf OUTDATA ;Pone el dato en la cola de salidabsf FLAGREG,OUTRDY ; Establece bandera para rutina de interrupcióngoto Loop
;*********************************************************************;*Rutina de Servicio de Interrupción;* Inputs: FLAGREG - Registro bandera para/desde rutina principal:;* Bit 1: OUTRDY – Para que el Servicio de Interrupción;* indique que hay dato listo en la cola de salida;* OUTDATA – Dato de salida en la cola;* PIR1 – Registro Bandera de Interrupción;* TRISE – Registro Bandera del Puerto Esclavo Paralelo;* PORTD – Dato de entrada desde Puerto esclavo;*;* Salidas:;* PORTD – Datos de salida a puerto esclavo;* INDATA – Cola de datos de entrada;* FLAGREG – Registro bandera para/desde la rutina principal:;* Bit 0: ERROR – desde el Servicio de Interupción, indica que;* buffer de entrada con sobreflujo;* Bit 2: INFULL – desde Servicio de Interrupción, indica;* dato recibido y en INDATA;*********************************************************************Service_Int
btfss PIR1,PSPIF ;Prueba la interrupción de periféricosgoto Intout ;No hay una interrupción de periférico, salirbcf PIR1,PSPIF ;Limpia la interrupción periféricabsf STATUS,RP0 ;Selecciona Bank1btfss TRISE,IBF ;Revisa si dato de entrada listogoto Notinput ;No entrada, revisa salidabcf STATUS,RP0 ;Entrada lista, selecciona Bank0bsf FLAGREG,INFULL ;Establece bandera para rutina principalmovf PORTD,W ;Obtiene dato de entradamovwf INDATA ;Pone Byte en cola de entrada
Notinput ;no entradabtfsc TRISE,OBF ;Revisa si el dato de salida ha sido leídogoto Intout ;No lectura, salirbcf STATUS,RP0 ;Selecciona Bank0btfss FLAGREG,OUTRDY ;Revisa si hay dato en cola de salidagoto Intout ;Salida sin leer, salirmovf OUTDATA,W ;Obtiene dato desde colamovf PORTD, F ;Pone dato en buffer de salidabcf FLAGREG,OUTRDY ;Limpia bandera para rutina principal
Intoutbsf STATUS,RP0 ;Selecciona Bank1btfsc TRISE,IBOV ;Revisa bandera de sobreflujo del buffer de entradagoto Interror ;Si no esta limpia, errorbcf STATUS,RP0 ;Selecciona Bank0retfie ;Re-habilita GIE y regresa
Interrorbcf STATUS,RP0 ;Selecciona Bank0bsf FLAGREG,err ;Establece bandera de error para rutina principalretfie ;Re-habilita GIE y regresa
end ;Fin de código de programa
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________30
;************************************************************; EJEMPLO PARA EL PIC18CXX2 PARA PICDEM-2;;************************************************************; Este programa es una implementación simple de un convertidor A/D para el PIC18C452.;; Se selecciona un canal (AN0).; El hardware para este programa es el de PICDEM-2.; El programa convierte el valor de un potenciómetro en RA0 y lo despliega; como un valor binario en el PuertoB;; El convertidor A/D se configure como sigue:; Vref = +5V internos; A/D Osc. = RC interno; A/D Channel = AN0 (RA0); Fosc=4MHz
LIST P=18C452#include <P18C452.INC>; El archivo contiene direcciones para registros
;y nombres de bit;************************************************************; reset y vectores de interrupción
org 0x00000 ; Dirección del Vector de ResetgotoStartorg 0x00008 ; Dirección del Vector de InterrupcióngotoISR ; ir a la Rutina de Servicio de Interrupción
;************************************************************; el código de programa comienza aquí
org 0x00020Start
clrfPORTB ; limpia todos los bits del PuertoBclrfTRISB ; Establece al PuertoB como salidascallInitializeAD ; configura el módulo A/DcallSetupDelay ; retraso por 15 ciclos de instrucciónbsf ADCON0,GO ; Comienza la primera conversión A/D
MaingotoMain; lazo;************************************************************; Servicio de Interrupción A/D; Obtiene el valor y lo despliega en los LEDs ISR
; Salva el contexto (WREG y STATUS) si se require.btfssPIR1,ADIF ; ¿El convertidor A/D causó interrupción?gotoOtherInt ; No, revisa otras fuentesmovfADRESH,W ; Obtiene el valor del convertidor A/DmovwfLATB ; Despliegue del valor en LEDsbcf PIR1,ADIF ; Resetea la bandera interna del conv A/DcallSetupDelay ; Retraso de 15 ciclosbsf ADCON0,GO ; Comienza la conversion A/DgotoEndISR ; regresa de ISR
OtherInt; Esto puede ser reemplazado por código para revisar y dar servicio a otras fuentes deinterrupción goto$ ; trampa, lazo consigo mismo
EndISR; Restablece el contexto si fué salvadoretfie ; Regresa, habilita a GIE
;************************************************************; InitializeAD – inicializa y establece el hardware del A/D.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________31
; Selecciona de AN0 hasta AN3 como entradas analógicas, al reloj RC clock, y lee AN0.InitializeAD
movlwB'00000100' ; Hace de RA0,RA1,RA4 entradas analógicas.movwfADCON1movlwB'11000001' ; Selecciona el oscilador RC, AN0 está seleccionado,movwfADCON0 ; el A/D queda habilitadobcf PIR1,ADIF ; Limpia la bandera de interrupción A/Dbsf PIE1,ADIE ; Habilita la interrupción del A/Dbsf INTCON,PEIE ; Habilita las Interrupciones Periféricasbsf INTCON,GIE ; Habilita las Interrupciones Globalesreturn
;************************************************************; Esto es usado para darle tiempo del convertidor A/D de muestrear la entrada; (tiempo de adquisición);; Esta rutina require de 11 ciclos para ser completada.; La llamada “call” y el regreso “return” adicionan otros 4 ciclos.;; 15 ciclos con Fosc=4MHz significa que este retraso consume 15us.SetupDelay
movlw.3 ; Carga Temporal con 3 decimalmovwfTEMP
SDdecfszTEMP, F ; Lazo para retrasogotoSDreturn
END ; fin de código de programa
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________32
;************************************************************; EJEMPLO PARA PIC18CXX2 CON;; HW: TARJETA PICDEM-2; FR: 4MHz:;************************************************************; Este programa utiliza las características avanzadas del PIC18C452, específicamente; el soporte de hardware completo para el módulo maestro I2C.;; Este programa carga las direcciones 0x00 a 0xFF de la EEPROM con 0x00 hasta 0xFF; (cada locación contiene su propia dirección).:; Cada locación es leída y comparada con lo que se espera.; El dato es desplegado en los LEDs. Si el dato es incorrecto,; el LED TX encenderá brevemente antes de proceder a la siguiente dirección.;;; Nota: 1) Todos los tiempos están basados en una frecuencia de referencia de 4Hz.; la cual es equivalente a un ciclo de instrucción.; 2) Las direcciones y valores literales son leídos en hexadecimal a menos; que se especifique lo contrario.; 3) El modulo MSSP del PIC18C452 ofrece soporte de HW completo para el módulo; maestro I2C.;************************************************************
LIST P=18C452;#include <P18C452.INC>listn=0 ; suprime lo saltos de página del archivolistST=off ; suprime la tabla de símbolos de archivo;
************************************************************; Asignación de Archivo de Registro
EEADDRequ0x000 ; Registro de direcciónEEDATAequ0x001 ; dato para leer/escribirEESLAVE equ 0x002 ; Dirección de dispositivo (1010xxxy)DelayCtr1equ0x003 ; contador de rutina de retrasoDelayCtr2equ0x004 ; contador de rutina de retrasoSlaveAddrequ0xA0 ; dirección literal esclava
;************************************************************; Asignación de vectores
ORG 0x00000gotoStart ; Vector de Reset
;************************************************************; Programa Principal
ORG 0x00020 ; Inicio de ProgramaStart; inicializa PuertoB
clrfLATB ; Limpia el “latch” de salida de PuertoBclrfTRISB ; Establece el PuertoB como salida
; configura SSP para módulo maestro de HW I2Cbsf SSPSTAT,SMP ; control de frecuencia I2C deshabilitadobsf SSPCON1,SSPM3 ; I2C master mode in hardwarebsf SSPCON1,SSPEN ; habilita el módulo SSPmovlw0x09 ; establece la frecuencia del reloj de I2C a 100kHzmovwfSSPADDbsf TRISC,3 ; el pin SCL de I2C es entradabsf PORTC,3 ; (será controlado por SSP)
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________33
bsf TRISC,4 ; pin SDA de I2C SDA es entradabsf PORTC,4 ; (sera controlada por SSP)movlwSlaveAddr ; dirección I2C EEPROM
movwfEESLAVEMain
clrfPORTB ; inicializa variablesclrfEEDATAclrfEEADDR
WrEEPROMbsf PORTB,7 ; indica escritura, LED TX se ilumina LEDrcallDelaybcf EESLAVE,0 ; modo de escriturarcallWakeSlave ; obtiene la atención del esclavorcallWrADDR ; manda dirrección de EEPROMrcallWrDATA ; manda dato a esclavorcallStop ; manda bit de alto “stop”incfPORTB,F ; incrementa la cuentaincfEEDATA,F ; incrementa el datoincfEEADDR,F ; Apunta a la próxima direcciónbtfssEEADDR,7 ; al final de la EEPROM?gotoWrEEPROM ; no, escribe ms datos
RdLoopclrfPORTB ; inicializa variablesclrfEEDATAclrfEEADDR
RdEEPROMrcallDelaybcf EESLAVE,0 ; modo de escriturarcallWakeSlave ; obtiene atención de esclavorcallWrADDR ; manda dirección de EEPROMrcallStop ; manda bit de altobsf EESLAVE,0 ; modo de lecturarcallWakeSlave ; obtiene la atención de esclavorcallRdDATA ; recive un byte de datos, deja desocupadomovfEEDATA,W ; obtiene datomovwfPORTB ; mueve el dato recibido al PuertoBxorwfEEADDR,W ; compara dato con direcciónbz GoodData ; rama si DATA=ADDRrcallErrorloop ; DATA está equivocado, indica error
GoodDataincfEEADDR,F ; Apunta a la siguiente direcciónbtfssEEADDR,7 ; ¿final de la EEPROM?gotoRdEEPROM ; no, lee mas datosgotoMain ; hazlo todo otra vez
;************************************************************; LED TX parpadea para indicar error mientras despliega los datos recibidos.Errorloop
rcallDelaybtg PORTB,7 ; LED TX parpadearcallDelaybtg PORTB,7rcallDelaybtg PORTB,7rcallDelaybtg PORTB,7rcallDelaybtg PORTB,7
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________34
rcallDelaybtg PORTB,7return
;************************************************************; manda un bit de comienzo, dirección esclava; si ACK no es recibida, manda reiniciar, prueba otra vez; la ejecución puede atorarse en este lazo si el esclavo no está presente; puede ser usado para censar el status del esclavo; (prueba mientras el esclavo responde)WakeSlave
bsf SSPCON2,SEN ; Manda bit de comienzobtfscSSPCON2,SEN ; ¿ya se ha limpiado SEN?goto$-2 ; No, lazo de regreso para prueba.
rWakeSlavebcf PIR1,SSPIF ; limpia bandera de interrupciónnopmovfEESLAVE,WmovwfSSPBUF ; mueve la dirección esclava a SSPBUFbtfssPIR1,SSPIF ; ¿SSP ha completado mandar la dirección ESCLAVO?goto$-2 ; no, lazo de regreso para pruebabtfssSSPCON2,ACKSTAT ;¿Fue ACK recibido desde esclavo?return ; si, regresa al llamado de la rutinabsf SSPCON2,RSEN ; manda el bit de comienzo repetido btfscSSPCON2,RSEN ; ¿Se ha mandado comienzo repetido?goto$-2 ; no, lazo de regreso para pruebabra rWakeSlave ; manda dirección de esclavo otra vez
;************************************************************; Escribe la dirección de memoria EEPROM, suspende si no ACKWrADDR
bcf PIR1,SSPIF ; limpia bandera de interrupciónmovffEEADDR,SSPBUF ; mueve la dirección EEPROM a SSPBUFbtfssPIR1,SSPIF ; ¿SSP ha terminado de mandar la dirección EEPROM?goto$-2 ; no, loop back to testbtfscSSPCON2,ACKSTAT ; ¿el esclavo ha mandado ACK?goto$-2 ; no, trata otra vezreturn
;************************************************************; Manda un byte de datos a esclavo, suspende si no ACKWrDATA
bcf PIR1,SSPIF ; limpia bandera de interrupciónmovffEEDATA,SSPBUF ; mueve dato a SSPBUFbtfssPIR1,SSPIF ; ¿SSP ha terminado de mandar dato a EEPROM?goto$-2 ; no, lazo de regreso a pruebabtfscSSPCON2,ACKSTAT ; ¿Esclavo ha enviado ACK?goto$-2 ; no, prueba otra vezreturn
;************************************************************; recibe un byte del esclavo; no envíe ACK, en lugar de ACK manda un bit de altoRdDATA
bcf PIR1,SSPIF ; limpia bandera de interrupciónbsf SSPCON2,RCEN ; habilita el modo de recepciónbtfssPIR1,SSPIF ; ¿SSP ha recibido un byte de dato?goto$-2 ; no, lazo de regreso a pruebabsf SSPCON2,ACKDT ; no ACK bsf SSPCON2,ACKEN ; manda bit ACKDT
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________35
btfscSSPCON2,ACKEN ; ¿ya se ha enviado el bit ACKDT?goto$-2 ; no, lazo de regreso a pruebabsf SSPCON2,PEN ; manda bit de altobtfscSSPCON2,PEN ; ¿se ha mandado ya bit de alto?goto$-2 ; no, lazo de regreso a pruebamovffSSPBUF,EEDATA ; salva datos en RAMbcf SSPCON2,RCEN ; deshabilita el modo de recepciónreturn
;************************************************************; Sends stop bit, waits until sentStop
bsf SSPCON2,PEN ; manda bit de altobtfscSSPCON2,PEN ; ¿se ha enviado bit de alto?goto$-2 ; no, lazo de regreso a pruebareturn
;************************************************************; retaraso de 98.57mSDelaymovlw0x80movwfDelayCtr2 ; presetclrfDelayCtr1 ; limpia contadorDelay1decfszDelayCtr1 ; decrementa contadorbra Delay1 ; regresa al inicio de lazodecfszDelayCtr2 ; decrementa contadorbra Delay1 ; regresa al inicio de lazoreturnEND ;fin de código de programa
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________36
CONCLUSIONES
Podemos concluir que el alto desempeño de los microcontroladores PIC puedeser atribuida a las características de arquitectura comúnmente encontradas en losmicroprocesadores RISC. Estas incluyen:
§ Arquitectura Harvard§ Instrucciones de palabras largas§ Instrucciones de palabras cortas§ Instrucciones de palabras sencillas§ Segmentación de instrucciones “pipelining”§ Juego de Instrucciones Reducido§ Arquitectura de Archivo de Registro§ Instrucciones Ortogonales (simétricas)
Los microcontroladores son una elección lógica para diseños que requierenflexibilidad y desempeño. Es importante tomar en cuenta a la hora de seleccionarun PIC sus características de capacidad, desempeño, costo, tamaño,programación (lenguaje que utilizan) ya que se cuenta con una gama vasta paralas diferentes necesidades de diseño.
Su funcionalidad puede aplicarse a solucionar problemas de tecnología de puntaademás de abatir costos de diseño que han sido la mayoría de las veces unobstáculo para la solución de los mismos.
Mientras muchas veces el lenguaje ha sido una limitante, en otras loscompiladores que están ya disponibles tienen ambientes de programación muyamigables al usuario, por lo que nos permite realizar aplicaciones cada vez mascomplejas con menor esfuerzo.
La flexibilidad de diseño en el manejo de microcontroladores nos permite suaplicación en prácticamente cualquier campo en donde la electrónica y laautomatización de procesos se requiera.
____________________________________________________________________________________________APLICACIÓN DE MICROCONTROLADORES
_________________________________________________________________________________________________________________37
BIBLIOGRAFÍ A
§ “Manual de Referencia de la familia PICmicro 18C MCU”. MicrochipTechnology Incorporated. USA, 1999.
§ Angulo A., José M. “Microcontroladores PIC. Diseño práctico deaplicaciones.” 1ª ed. Mc Graw Hill. España, 1997.
§ “Data Sheet. PIC16F84A”. Microchip Technology Incorporated. USA, 1999.
§ Fink, Scott. “Using the 8-Bit Parallel Slave Port”. Microchip TechnologyIncorporated. USA, 1997.
§ Fink, Scott. “Use of the SSP Module in the I2C Multi-Master Environment”.Microchip Technology Incorporated. USA, 1997.