universidad autÓnoma metropolitana148.206.53.84/tesiuami/uami15651.pdf · electrónica. se montó...

52
UNIVERSIDAD AUTÓNOMA METROPOLITANA Unidad: IZTAPALAPA Alumnos de Proyecto: Botello Aguirre Álvaro. M: 204213796 Cruz Santiago Alberto. M: 203213206 Manzano Hernández Ernesto M: 204322437 Licenciatura: Ing. Electrónica en Comunicaciones División: CBI Proyecto: Alarma de Automóvil Asesor de Proyecto: Dr. Fausto Marcos Casco Sánchez

Upload: duonghanh

Post on 10-Dec-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDAD AUTÓNOMA METROPOLITANA

Unidad: IZTAPALAPA

Alumnos de Proyecto:

Botello Aguirre Álvaro. M: 204213796

Cruz Santiago Alberto. M: 203213206

Manzano Hernández Ernesto M: 204322437

Licenciatura: Ing. Electrónica en Comunicaciones

División: CBI

Proyecto: Alarma de Automóvil

Asesor de Proyecto: Dr. Fausto Marcos Casco Sánchez

ÍNDICE

CAPITULO1: DESCRIPCIÓN DEL PROYECTO

1.1.-INTRODUCCIÓN….……………………………………………1 1.2.-JUSTIFICACIÓN………………………………………………..2 1.3.-OBJETIVOS GENERALES……………………………………..2 1.4.-OBJETIVOS PARTICULARES…………………………………3 1.5.-DESARROLLO……………………………………………….....3 1.5.1.-FUNDAMENTOS………………………………………...4 1.5.2.-DIAGRAMA DE FLUJO………………………………. ..5

CAPITULO 2: MARCO TEÓRICO

2.1. DESCRIPCIÓN GENERAL DEL PIC……………………………………....……..…..........6

2.2.3. NOMENCLATURA……………………......………….….7 2.2.4. DIAGRAMA ……………………………...………….…8 2.2.5. DESCRIPCIÓN………………………...…………...…..8 2.2.6. CICLO DE INTERRUPCIÓN…………..…………........9 2.2.7. REGISTRO DEL PIC…………………….………….….10 2.2.8. TIMER0..………………………………….……….........11 2.2.9. INTERRUPCIÓN EXTERNA ..………….………….....14

2.2.10. CONJUNTO DE INSTRUCCIONES…...….…………..15 2.2.11. OPERACIÓN……..………………………………….....16

CAPITULO 3: FUNCIONAMIENTO DE LOS COMPONENTES

3.1.-FUNCIONAMIENTO DEL RELÉ...………………….……...……………..…...183.2.-FUNCIONAMIENTO DEL TECLADO MATRICIAL…........……….………....19 3.3.-CONEXIÓN DE UN TECLADO AUN PIC…………………...………………...21 3.4.-FUNCIONAMIENTO DEL TRANSISTOR…………………....………………..22

CAPITULO 4: SOFTWARE 4.1.-IMPLEMENTACIÓN DEL SOFTWARE………...……………………………... 26 4.2.-CÓDIGO DEL PROGRAMA ……………………………....................................27 CAPITULO5: 5.1.-RESULTADOS…………………………….………………………..……..…...…41 5.2.-CONCLUSIONES……………………………….………………….…………… 42 5.3-APÉNDICE A.………………………………………….….....................................43 5.4.-APENDICE B………………………………………………………….………….47 5.5.-BIBLIOGRAFÍA………………………..…………...............................................48 5.6.-GLOSARIO…………………………………………………………..…..…….....49

| 1

INTRODUCCIÓN: El proyecto está pensado en aportar un beneficio a nuestra sociedad, esto es creando un sistema de seguridad el cual consiste en una alarma para automóvil para evitar el robo del mismo, para esto nos dimos a la tarea de recabar información; también se aplican conocimientos adquiridos durante nuestra carrera universitaria, así mismo se contó con la asesoría del Dr. Fausto Marcos Casco Sánchez. Nuestro proyecto consta del diseño e implementación de una cerradura electrónica. Se montó un teclado matricial con un LCD para ser controlado con un Microcontrolador PIC sobre un circuito impreso. Se interconectaron todos los dispositivos con sus respectivos componentes como resistencias y capacitores. Por último se conectó una etapa de potencia para cerrar un circuito que nos permita obtener una señal eléctrica, la cual permite encender la bomba de gasolina de un automóvil. La fuente de alimentación será con una batería. El circuito no estará sometido a fuertes vibraciones, ni a cambios bruscos, ni a humedades, así como tampoco tendrá que soportar fluctuaciones importantes de tensión. La salida para activar la cerradura será de 5V. El sistema se construye a partir de un Microcontrolador 16F84A. La velocidad de reloj se fija a 4MHz no siendo necesaria una velocidad mayor para el correcto funcionamiento del aparato. Con el objeto de simplificar el hardware en lo posible, se prescinde de toda circuitería asociada al teclado, haciendo una conexión matricial de los contactos del mismo (un terminal por fila, uno por columna). La construcción de nuestro proyecto la repartiremos en dos partes las cuales son: 1.‐Etapa digital. 2.‐Etapa de potencia. Las cuales trabajan de forma síncrona con el fin de evitar el siniestro (robo). La alarma consistirá básicamente en introducir una clave de reconocimiento del usuario hacia el automóvil, el encendido del automóvil consta de 3 tiempos, para explicar mejor el comienzo de ciclo de trabajo de la alarma se tiene: 1.‐Introducción de la llave. (Para dar corriente a la cerradura)

| 2

2.‐ Se prende o apaga la bomba de gasolina con la introducción de la clave en nuestro teclado matricial.

En ese momento el sistema de seguridad ya ha cumplido con el objetivo de reconocer si la clave fue correcta.

3.‐ Encendido del motor del automóvil.

Si la clave fuera incorrecta, el sistema de seguridad no encenderá el auto.

JUSTIFICACIÓN

Los Microcontroladores nos permiten reducir tamaño y costos en muchos equipos. De manera que vale la pena utilizarlos en muchas aplicaciones donde antes se utilizaban componentes electrónicos de menor capacidad.

La seguridad en la actualidad es un tema de mucha importancia, por lo cual se pensó en mejorar el sistema de seguridad de un automóvil. Por medio de una cerradura electrónica.

OBJETIVOS GENERALES:

Emplear el conocimiento tecnológico para aportar a la sociedad un sistema de

seguridad para evitar el robo de su automóvil.

Entrar y competir en el mercado con marcas que se encuentran

posicionadas en el país, desde luego innovando y mejorando nuestro

trabajo al máximo.

Mostrar que la electrónica digital y la electrónica analógica pueden

trabajar en conjunto para el desarrollo de cualquier trabajo.

| 3

Entregar el proyecto culminado junto con el reporte en tiempo y forma

para obtener nuestra calificación y así culminar con nuestra formación

académica.

OBJETIVOS PARTICULARES:

Acoplar la etapa digital con la etapa de potencia para enviar el ciclo de

instrucción, el cual consistirá del envió de la etapa digital con un 1 ó 0

lógicos. Para activar o desactivar la etapa de potencia con un 1 si es

correcta la clave que se introduce y manteniendo de esta manera el paso

de corriente, en caso contrario el automóvil no encenderá.

El sistema de seguridad tendrá la misión de afectar directamente el

funcionamiento de la bomba de gasolina, en caso de que la clave sea

correcta nuestra etapa digital mantendrá la bomba de gasolina

funcionando, en caso contrario nuestra etapa digital mandará la señal a la

de potencia para que interrumpa el paso de corriente a la bomba de

gasolina y así no pueda prender el automóvil.

Ya funcionando la etapa de potencia con la etapa digital estarán montados

sobre una placa de cobre, lista para su aplicación en el automóvil.

DESARROLLO:

DISEÑO DEL CIRCUITO

La figura DI muestra el diagrama esquemático del circuito que será empleado para desarrollar nuestra aplicación. Como se puede observar utilizaremos un microcontrolador PIC16F84A debido a que reúne las características necesarias para poder trabajar, también utilizaremos un LCD de 16 por 2 que nos servirán para poder visualizar el dato que será enviado al PIC, por el teclado matricial. En la etapa de potencia contamos con un

| 4

FIGURA D1

relevador y los transistores que se muestran en la figura D1. Esta etapa es para darle la corriente requerida al relevador sin quemar el PIC. Finalmente cuando la cerradura electrónica este en optimo funcionamiento trasladaremos en circuito a una placa impresa que será la presentación.

FUNDAMENTOS

El teclado matricial será de 4 x 4, es decir de cuatro filas y cuatro columnas, que nos da un total de 16 teclas, para manipular el teclado mediante el microcontrolador es necesario tener líneas de entrada y líneas de salida, en este caso las líneas de entrada están conectadas a las filas, y las líneas de salida están conectadas a las columnas.

Para que el teclado funcione hay que activar las columnas de manera alternada, después de activar una de las columnas hay que verificar si se ha activado alguna de las filas, el que una de las filas esté activada implica que una de las teclas ha sido presionada y si una de las teclas ha sido presionada hay que determinar qué tecla fue, la tecla presionada corresponde a la intersección de la columna activada y la fila activada, en el caso de que ninguna de las filas esté activa se asume que ninguna tecla de la columna activada fue presionada, por lo que se procede a activar una columna diferente.

| 5

En el caso de que el PIC detecte la pulsación de algún botón este número será desplegado en el LCD, este número será representado por un símbolo para seguridad del usuario que ejecute el tecleo. Cuando la clave sea correcta se activara el relé. La salida final mostrara un LED prendido que es la ejecución satisfactoria de una clave correcta.

Por otra parte se muestra el funcionamiento general de la parte lógica en la figura D2.Suponemos este diagrama es de tal forma que la persona que lo lea puede no tener un conocimiento previo en electrónica.

FIGURA D2.

| 6

MARCO TEORICO:

Descripción general del PIC16F84A. Microcontrolador PIC16F84A de Microchip pertenece a la familia de microcontroladores de 8 bits (bus de datos) que tienen las siguientes características generales:

Tecnología CMOS

Tecnología RISC

Arquitectura Harvard

Estas características se conjugan para lograr un dispositivo altamente eficiente en el uso de la memoria de datos, programa y por lo tanto en la velocidad de procesamiento de instrucciones. Microchip ha dividido sus microcontroladores en tres subfamilias de acuerdo al número de bits de su bus de instrucciones las cuales se mencionan a continuación: Subfamilia Bits del bus de Instrucción NomenclaturaMid‐Range 14 PIC16XXXBase‐Line 12 PIC12XXX y PIC14XXX

High‐End 16 PIC17XXX y PIC18XXX

| 7

Los microcontroladores que produce Microchip cubren un amplio rango de dispositivos cuyas características pueden variar de la siguiente manera.

Su frecuencia de operación (Hasta 20 Mhz)

El empaquetado (desde 8 patitas hasta 68 patitas)

Los voltajes de operación (desde 2.5 v. Hasta 6v)

Tecnología de la memoria incluida (EPROM, ROM, Flash)

Nomenclatura

En el nombre específico del microcontrolador pueden aparecer algunas siglas como se muestra en la siguiente tabla: Tipo de Memoria

Rango de voltaje Estándar Extendido

EPROM

PIC16CXXX PIC16LCXXX

ROM

PIC16CRXXX PIC16LCRXXX

Flash

PIC16FXXX PIC16LFXXX

A continuación se especifican los rangos de voltaje estándar y extendido manejados por los dispositivos:

Rango de voltaje EPROM ROM

Flash

Extendido LC 2.5 a 6V 2.5 a

4.5 a 6V LF 2 a 6V

| 8

Diagrama del PIC16F84A. En la siguiente figura1 se muestra el diagrama del PIC16F84A, para tener una visión exterior del Chip.

Figura 1. Microcontrolador PIC16F84A.

Descripción de la CPU. La responsable de la interpretación y ejecución de la información (instrucciones) guardada en la memoria de programa. Muchas de estas instrucciones operan sobre la memoria de datos. Para operar sobre la memoria de datos, además, si se van a realizar operaciones lógicas o aritméticas, requieren usar la Unidad de Lógica y Aritmética (ALU). La ALU controla los bits de estado (Registro STATUS), los bits de este registro se alteran dependiendo del resultado de las instrucciones implementadas.

6VEstándar C 4.5 a 6V CR 4.5 a 6V F 4.5 a 6V

| 9

Ciclo de instrucción. Contador de programa PC (<‐registro) es gobernado por el ciclo de instrucción como se muestra en la siguiente figura. Cada ciclo de instrucción la CPU lee (ciclo Fetch) la instrucción guardada en la memoria de programa apuntada por el PC y al mismo tiempo ejecuta la instrucción anterior, esto debido a una cola de instrucciones que le permite ejecutar una instrucción mientras lee la próxima:

Figura 2. Ciclos de instrucción.

Se puede observar que cada ciclo de instrucción (Tcy) se compone a su vez de cuatro ciclos del oscilador (Tosc). Cada ciclo Q provee la sincronización para los siguientes eventos:

Q1: Decodificación de la instrucción Q2: Lectura del dato Q3: Procesa el dato Q4: Escribe el dato

Nota: lectura de dato (si lo hay) Por lo tanto debido a esto cada ciclo de instrucción consume 4 ciclos de reloj, de manera que si la frecuencia de oscilación es Fosc, Tcy será 4/Fosc.

| 10

Registros de la CPU. A continuación se darán los siguientes registros con los que se trabajará en el proyecto. Registro PC: Registro de 13 bits que siempre apunta a la siguiente instrucción a ejecutarse. En la siguiente sección se dan mayores detalles en el manejo de este registro. Registro de Instrucción: Registro de 14 bits. Todas las instrucciones se colocan en el para ser decodificadas por la CPU antes de ejecutarlas. Registro STATUS: Registro de 8 bits, cada uno de sus bits (denominados Banderas) es un indicador de estado de la CPU o del resultado de la última operación como se indica en la siguiente figura: Registro W: Registro de 8 bits que guarda resultados temporales de las operaciones realizadas por la ALU

C.‐ Bit de acarreo/préstamo’ de la última operación aritmética (en el caso de resta, se guarda el préstamo invertido CD.‐ Acarreo/Préstamo’ proveniente del cuarto bit menos significativo. Funciona igual que el bit C, pero para operaciones de 4 bits. Z.‐ Este bit se pone (=1) para indicar que el resultado de la última operación fue cero, de lo contrario se limpia (=0)

| 11

Timer0 En las aplicaciones el microcontrolador debe trabajar con la variable tiempo. Por ejemplo, para generar señales de una determinada frecuencia, para medir la duración de una señal, o simplemente para llevar la fecha y la hora, el microcontrolador necesita algún recurso para contar el tiempo con precisión. Los microcontroladores PIC de clase media hay hasta tres módulos básicos para temporizar, que se identifican con los nombres Timer0, Timer1 y Timer2. En este trabajo se presenta la estructura, funcionamiento y programación del módulo Timer0, ya que fue el elegido para realizar la temporización de la alarma. El módulo Timer0 consta básicamente de un pre‐divisor y un contador ascendente de 8 bits (figura 3). El pre‐divisor es un contador asincrónico ascendente con factor de división programable cuyo conteo no es visible para el programador. El contador ascendente de 8 bits se puede leer o escribir a través del registro de funciones especiales TMR0.

El Timer0 puede trabajar como contador de ciclos máquina o como contador de pulsos externos. En el primer caso se dice que el módulo opera en el modo temporizador (timer). Si cuenta pulsos externos, el módulo opera en el modo contador (counter). Los pulsos externos llegan por la terminal T0CKI. A su paso por el Timer0, los pulsos llegan al bloque de sincronización. En este bloque, los pulsos que entran son muestreados en dos instantes de tiempo dentro de cada ciclo de máquina, de lo que resulta una señal cuyos flancos ocurren en fase con el reloj del microcontrolador. Con esta señal sincronizada se excita el contador TMR0. Para que no se pierdan pulsos en la sincronización, es necesario que los pulsos que entran en el bloque de sincronización permanezcan en 1 ó en 0 al menos durante la mitad del tiempo que dura un ciclo de máquina. Cuando el Timer0 trabaja en el modo contador, el bloque de sincronización determina el valor mínimo del período (o la frecuencia máxima) de los pulsos que entran por

| 12

la terminal T0CKI. Si TOSC es el período del oscilador principal del microcontrolador y P es el factor de división del pre‐divisor, el período Ti de los pulsos que entran por la terminal T0CKI debe cumplir

Donde:

P=1 si no se usa el pre‐divisor

P= 2, 4,…, 256 si se usa. Cuenta con tres registros de funciones especiales asociados al Timer0: TMR0, OPTION e INTCON. La figura 4 muestra los nombres de los bits de los registros OPTION e INTCON. El registro TMR0 almacena el valor que tiene el contador del Timer0. Este valor se puede leer o escribir en cualquier momento desde que el programa que ejecuta el microcontrolador. Cuando se escribe un valor en TMR0, la cuenta del pre‐divisor, si está asignado al Timer0, se pone a 0. Además, una escritura en el registro TMR0 inhibe el conteo del Timer0 durante dos ciclos de máquina. Con respecto al desbordamiento del Timer0 hace que el indicador TMR0IF (bit INTCON<2>) pase a 1. Si la atención al Timer0 se hace usando la técnica de E/S programada (comúnmente llamada consulta o poleo), entonces se debe consultar el bit TMR0IF para saber si el Timer0 se ha desbordado. Una vez comprobado el desbordamiento, este indicador debe ser puesto a 0 mediante software.

P

T4T

OSCi

| 13

Si la interrupción del Timer0 está habilitada, lo cual se hace poniendo a 1 el bit TMR01E (INTCON<5>), cuando se desborda el Timer0 se produce una solicitud de interrupción. En el registro OPTION están los bits de control del Timer0. La fuente de los pulsos de reloj se selecciona con el bit T0CS. Si se selecciona una fuente de reloj externa en la terminal T0CKI, el bit T0SE sirve para hacer que el contador se incremente con los flancos de subida (con T0SE=0) o de bajada (con T0SE=1) de los pulsos en T0CKI. Con el Timer0 y el WDT comparten el pre‐divisor, en un esquema como el que se muestra en la figura 5. El pre‐divisor, un contador asincrónico ascendente de 8 bits, puede ser asignado al Timer0 o al WDT. Esta asignación es excluyente, es decir, si el pre‐divisor se asigna al WDT, el Timer0 no lo puede usar y viceversa. Cuando está asignado al WDT, el pre‐divisor funciona como post‐divisor del Perro Guardián. El pre‐divisor se asigna al Timer0 poniendo a 1 el bit PSA (OPTION<3>). Si PSA es puesto a 0, el pre‐divisor queda asignado al WDT. El factor de división del pre‐divisor asignado al Timer0 se selecciona con los bits PS2, PS1 y PS0 del registro OPTION.

Factor de división P del pre‐divisor asignado al Timer0 puede tomar los valores:

P= 2, 4,8,…,2n+1,…256

| 14

Donde:

n=0,1,…,7 es el valor situado en los bits PS2:PS0.

Si el pre‐divisor es asignado al WDT, el factor de división es entonces:

P= 1, 2,4,…,2n,…,128.

Para el cálculo de él tiempo de desbordamiento del Timer0 se puede proceder de la forma siguiente. Sea N la cantidad de pulsos que deben llegar al Timer0 para que se desborde, P el factor de división del pre‐divisor y Ti el período de los pulsos de entrada al pre‐divisor. Si el Timer0 opera como temporizador, entonces Ti es la duración de un ciclo de máquina; si opera como contador, Ti es el período de los pulsos externos. El tiempo Td que tarda en desbordarse el Timer0 es:

Se debe tomar en cuenta que el valor que se carga en el registro TMR0 no es N, sino su complemento a 2 en 8 bits, es decir, lo que le falta a N para llegar a 256. Por lo tanto, el valor que se carga en TMRO debe ser: NTMRO= 256‐N Si el Timer0 está trabajando en el modo temporizador, es decir, como contador de ciclos de máquina, entonces hay que tener en cuenta que el conteo se inhibe durante dos ciclos de máquina después de haber escrito un valor en el registro TMR0. Por lo tanto, para compensar esa demora, el valor que hay que depositar en TMR0 en este caso debe ser: NTMRO= 256‐N+2

3.6. Interrupciones externas Las interrupciones consisten en un mecanismo por el cual un evento interno o externo, asíncrono respecto al programa, puede interrumpir la normal ejecución de éste produciendo automáticamente un salto a una subrutina, de manera que pueda atender inmediatamente el evento, y retomar luego la ejecución del programa exactamente en donde estaba en el momento de ser interrumpido. Este mecanismo es muy útil por ejemplo para el manejo de timers o rutinas que deben repetirse periódicamente (contra‐rebotes para teclado, detección de pulsos externos, recepción de datos, etc.).

| 15

Conjunto de instrucciones La tabla que se muestra a continuación resume las 35 instrucciones que reconoce la CPU de los PIC de medio rango, incluyendo su mnemónico, tiempo de ejecución, código de máquina y afectación de las banderas:

| 16

Operación. Conoceremos el funcionamiento: Las interrupciones se comportan en forma muy similar a las subrutinas. Desde el punto de vista del control del programa, al producirse una interrupción se produce el mismo efecto que ocurriría si el programa tuviese un CALL 0004 h (una llamada a una subrutina situada en la posición de memoria 0004h) en el punto en el que se produjo la interrupción. Las etapas que transcurren al atender a una solicitud de interrupción son las siguientes:

El microcontrolador completa la ejecución de la instrucción en curso.

El valor del PC se guarda en la pila, para “recordar” la dirección de la instrucción a la que hay que regresar cuando termine la atención a la interrupción.

La dirección de la subrutina de atención a la interrupción se pone en el PC, con lo cual se salta a esa dirección y comienza la ejecución de la subrutina.

Se ejecuta la subrutina de atención a la interrupción. Como toda subrutina, termina su ejecución con una instrucción de retorno.

Con la ejecución de la instrucción de retorno, se regresa al programa interrumpido.

Posibles fuentes de interrupción del PIC16F84A están las siguientes:

Interrupción por el puerto serie USART.

Interrupción por el convertidor A/D.

Escritura de EEPROM finalizada.

Interrupción externa por pin RB0/INT.

Interrupción por cambio en el nivel lógico de las entradas RB4:RB7 del puerto B.

Desbordamiento del Timer0, Timer1 y Timer2.

Evento en el módulo CCP. Los PIC de clase media usan al menos un registro de funciones especiales para controlar las interrupciones: el registro INTCON. En este registro se controlan la interrupción (proveniente del pin RB0/INT), la interrupción por cambio en los pines RB4 a RB7 y la interrupción por desbordamiento del Timer0.

| 17

El registro de control del sistema de interrupciones principal (INTCON) existe un bit de habilitación general de interrupciones GIE, que debe ser programado a 1 para que las interrupciones puedan actuar. En la figura 6 se muestran los bits del registro INTCON (sólo explicaremos los que utilizamos en el programa).

GIE (Global Interrupt Enable). Con este bit se habilita (con GIE=1) o inhabilita (con GIE=0) el sistema de interrupción del microcontrolador. Cuando se produce una solicitud de interrupción, este bit pasa automáticamente a 0, con lo cual se inhabilita el sistema de interrupción, que no atenderá nuevas solicitudes hasta que GIE=1. La instrucción de retorno de una subrutina de atención a una interrupción pone el bit GIE EN 1 y así el sistema de interrupción del PIC queda nuevamente habilitado. Al producirse un reset, el bit GIE es puesto a 0, quedando así inhabilitado el sistema de interrupción. TMR0IE, TMR0IF. Bits relacionados con la interrupción del Timer0. Con el bit TMR0IE puesto a 1 se habilita la interrupción del Timer0. TMR0IF es el indicador de desbordamiento del TIMER0: cuando este bit pasa a 1, se genera la solicitud de interrupción correspondiente, si TMR0IE=1. INTE, INTF. Bits relacionados con la interrupción externa. Con el bit INTE se habilita esta interrupción, mientras que INTF es el indicador de que se ha detectado un flanco de subida o de bajada en el pin de entrada RB0/INT. La figura 7 ilustra cómo operan los bits del registro INTCON. La solicitud de interrupción externa se hace a través del pin RB0/INT. Esta interrupción se produce con los flancos de la señal en el pin INT. El flanco que produce la interrupción puede ser el de subida o el de bajada, lo cual se programa mediante el bit INTEDG del registro OPTION (bit<6>). La interrupción externa queda reportada mediante el bit INTF del registro INTCON y se habilita o inhabilita mediante el bit INTE de ese mismo registro.

| 18

La instrucción RETFIE se utiliza al final de la rutina de interrupción, y es idéntica a un retorno de subrutina, salvo que además coloca a 1 automáticamente el bit GIE volviendo a habilitar las interrupciones. Dentro de la rutina de interrupción, el programa deberá comprobar el estado de las banderas de interrupción de cada una de las fuentes habilitadas, para detectar cual fue la que causó la interrupción y así decidir que acción tomar.

Funcionamiento del Relé:

En la figura R1 se muestra el funcionamiento básico de un relevador convencional que fue el que utilizamos en la cerradura electrónica: Si el electroimán está activo jala el brazo (armadura) y conecta los puntos C y D. Si el electroimán se desactiva, conecta los puntos D y E. De esta manera se puede conectar algo, cuando el electroimán está activo, y otra cosa conectada, cuando está inactivo. Es importante saber cuál es la resistencia del bobinado del electroimán (lo que está entre los terminales A y B) que activa el relé y con cuanto voltaje éste se activa. Este voltaje y esta resistencia nos informan que magnitud debe de tener la señal que activará el relé y cuanta corriente se debe suministrar a éste. La corriente se obtiene con ayuda de la Ley de Ohm: I = V / R. donde: ‐ I es la corriente necesaria para activar el relé

| 19

‐ V es el voltaje para activar el relé ‐ R es la resistencia del bobinado del relé

FIGURA R1

Ventajas del Relé ‐ El Relé permite el control de un dispositivo a distancia. No se necesita estar junto al dispositivo para hacerlo funcionar. ‐ El Relé es activado con poca corriente, sin embargo puede activar grandes máquinas que consumen gran cantidad de corriente. ‐ Con una sola señal de control, puedo controlar varios relés a la vez.

FUNCIONAMIENTO DEL TECLADO MATRICIAL ANTECEDENTES En algunas aplicaciones con microcontroladores, puede que sea necesario transmitir alguna información desde un microcontrolador hacia un periférico de propósito especifico, y dependiendo de la aplicación puede que resulte ser conveniente utilizar un pequeño teclado para indicar cuál es esa información que se tiene que enviar, por ejemplo una clave que tenga que ser verificada o un comando que indique el inicio de un proceso, o simplemente la captura de algún dato importante. En este apartado se explicará cuáles son los pasos que hay que seguir para enviar datos mediante un microcontrolador que controla un teclado matricial hacia un LCD. Una imagen de un teclado matricial se muestra en la figura T1.

| 20

FIGURA T1.

FUNCIONAMIENTO

Este teclado esta constituido por una matriz de pulsadores dispuestos en filas y columnas, como el que se muestra en la figura T2. Su intención es reducir el número de líneas para su conexión.

FIGURA T2.

| 21

La figura T2 muestra la estructura interna y aspecto físico de un teclado matricial hexadecimal de 16 teclas. Cada tecla se conecta a una fila y una columna. Las 16 teclas solo necesitan 8 líneas para conectarse, en lugar de 16 que hubiera necesitado teclas independientes, cuando una tecla es pulsada queda en contacto una fila con una columna, si no hay tecla alguna presionada, las filas están desconectadas de las columnas.

CONEXIÓN DE UN TECLADO A UN PIC16F84

La figura T2 describe la conexión del teclado al PIC. ‐Las filas del teclado se conectan a la parte baja del puerto B configuradas como salidas. Las columnas del teclado se conectan a las líneas de la parte alta del puerto B configuradas como entradas.

FIGURA T3. Las resistencias de 330 Ω en serie con las filas tienen como misión evitar cortocircuitos entre la línea de la parte baja y la alta del puerto B cuando el microcontrolador use estas líneas para funciones distintas de la exploración del teclado.

| 22

FUNCIONAMIENTO DEL TRANSISTOR

Transistor, denominación común para un grupo de componentes electrónicos utilizados como amplificadores u osciladores en sistemas de comunicaciones, control y computación. A continuación ofrecemos una descripción rápida de su funcionamiento. Funcionamiento En un transistor se pueden combinar dos uniones para obtener amplificación. Un tipo, llamado transistor de unión npn, consiste en una capa muy fina de material tipo p entre dos secciones de material tipo n, formando un circuito como el mostrado en la figura 2. El material tipo n a la izquierda del diagrama representa el elemento emisor del transistor, que constituye la fuente de electrones. Para permitir el avance de la corriente a lo largo de la unión np, el emisor tiene un pequeño voltaje negativo con respecto a la capa tipo p, o componente base, que controla el flujo de electrones. El material tipo n en el circuito de salida sirve como elemento colector y tiene un voltaje positivo alto con respecto a la base, para evitar la inversión del flujo de corriente. Los electrones que salen del emisor entran en la base, son atraídos hacia el colector cargado positivamente y fluyen a través del circuito de salida. La impedancia de entrada (la resistencia al paso de corriente) entre el emisor y la base es reducida, mientras que la impedancia de salida entre el colector y la base es elevada. Por lo tanto, pequeños cambios en el voltaje de la base provocan grandes cambios en la caída de voltaje a lo largo de la resistencia del colector, convirtiendo a este tipo de transistor en un eficaz amplificador. Similar al tipo npn en cuanto a su funcionamiento, el transistor de unión pnp dispone también de dos uniones y es equivalente al tubo de vacío denominado triodo. Otros tipos con tres uniones, tales como el transistor de unión npnp, proporcionan mayor amplificación que los transistores de dos uniones. En la figura S1 se muestra el diagrama básico de un transistor.

FIGURA S1

| 23

TRANSISTORES DE POTENCIA El funcionamiento y utilización de los transistores de potencia es idéntico al de los transistores normales, teniendo como características especiales las altas tensiones e intensidades que tienen que soportar y, por tanto, las altas potencias a disipar. Existen tres tipos de transistores de potencia:

bipolar. unipolar o FET (Transistor de Efecto de Campo). IGBT.

Modos de trabajo Existen cuatro condiciones de polarización posibles. Dependiendo del sentido o signo de los voltajes de polarización en cada una de las uniones del transistor pueden ser:

Región activa directa: Corresponde a una polarización directa de la unión emisor ‐ base y a una polarización inversa de la unión colector ‐ base. Esta es la región de operación normal del transistor para amplificación.

Región activa inversa: Corresponde a una polarización inversa de la unión emisor ‐ base y a una polarización directa de la unión colector ‐ base. Esta región es usada raramente.

Región de corte: Corresponde a una polarización inversa de ambas uniones. La operación en ésta región corresponde a aplicaciones de conmutación en el modo apagado, pues el transistor actúa como un interruptor abierto (IC 0).

Región de saturación: Corresponde a una polarización directa de ambas uniones. La operación en esta región corresponde a aplicaciones de conmutación en el modo encendido, pues el transistor actúa como un interruptor cerrado (VCE 0).

| 24

Como lo muestra la figura D1 nuestro caso es un cálculo de potencia con elementos resistivos, por cual explicaremos este punto.

Cálculo de potencias disipadas en conmutación con carga resistiva

La gráfica superior muestra las señales idealizadas de los tiempos de conmutación (ton y toff) para el caso de una carga resistiva. Supongamos el momento origen en el comienzo del tiempo de subida (tr) de la corriente de colector. En estas condiciones (0, t, tr) tendremos:

Donde maxCI vale :

También tenemos que la tensión colector ‐ emisor viene dada como :

Sustituyendo, tendremos que :

Nosotros asumiremos que la VCE en saturación es despreciable en comparación con Vcc. Así, la potencia instantánea por el transistor durante este intervalo viene dada por :

La energía, Wr, disipada en el transistor durante el tiempo de subida está dada

| 25

por la integral de la potencia durante el intervalo del tiempo de caída, con el resultado:

De forma similar, la energía (Wf) disipada en el transistor durante el tiempo de caída, viene dado como:

La potencia media resultante dependerá de la frecuencia con que se efectúe la conmutación:

Un último paso es considerar tr despreciable frente a tf, con lo que no cometeríamos un error apreciable si finalmente dejamos la potencia media, tras sustituir, como:

| 26

IMPLEMENTACIÓN DEL SOFTWARE EL software se basa en una lectura continua del teclado, saltando a uno u otro sitio dependiendo de un registro de estado, haciendo después un test de botón liberado para volver de nuevo a la lectura del teclado. La parte más interesante del programa es la propia lectura del teclado, que se hace rastreando, es decir, ponemos un 0 lógico en el pin correspondiente a la primera columna (P con todos los demás a 1, después leemos del puerto y miramos si tenemos un 0 en alguna de las filas, lo cual querrá decir que hemos presionado uno de los botones. En cuanto a la estructura de datos utilizada, se almacenan todos los datos de cada pulsación en la memoria RAM interna. Un byte por dígito de la clave, uno para el número de accesos autorizados y otro más como contador de accesos. Obviamente, el usuario solo necesita de s el número de accesos al sistema. Debemos mencionar que existen varias rutinas que nos permiten estar tecleando varias veces, detecta si la tecla ha dejado de ser presionada para poder continuar con el tecleo para ver que otra tecla se presionó. Tenemos implementado una base de registros donde el programa de acuerdo a los acontecimientos el programa sabe a dónde debe de ir, esta tabla de registros direcciona todas las acciones del sistema, como el ingreso de los usuarios que se hace de acuerdo a una tabla en la cual se registran todos los datos de los usuarios en memoria. Después tenemos la rutina de captura de clave que se va almacenar en algunos registros de modo que al concluir el ingreso del último dígito de la clave, luego verificar si la clave que se ha digitado es la correcta y a quien pertenece. Si la clave es incorrecta va hacia una subrutina que limpia todos los valores para que se digite de nuevo la clave, si se introdujo erróneamente la clave el programa entra en un estado que no permite abrir la cerradura electrónica, este estado no puede ser parado por nadie, si la clave ha sido correcta y si es usuario normal se abre la puerta y se cuenta una entrada a favor del usuario. La seguridad que se pensó y de acuerdo a la necesidad de nuestro cliente, dicha clave es solo responsabilidad de los usuarios, el sistema es totalmente flexible en cuanto a las claves todas las claves se pueden cambiar, se pensó en un criterio para que pueda ser utilizado por cualquier tipo de persona.

| 27

CODIGO DEL PROGRAMA ;**************************** Librería "TECLADO.INC" *********************************** ; ; Librería de subrutinas para la gestión de un teclado organizado en una matriz de 4 x 4 y ; conectado al Puerto B según la disposición siguiente y explicada en la figura 19‐2 del ; del libro: ; ; RB4 RB5 RB6 RB7 ; ^ ^ ^ ^ ; |‐‐‐‐|‐‐‐‐|‐‐‐‐|‐‐‐‐| ; RB0 ‐‐> | 0 | 1 | 2 | 3 | ; |‐‐‐‐|‐‐‐‐|‐‐‐‐|‐‐‐‐| ; RB1 ‐‐> | 4 | 5 | 6 | 7 | ; |‐‐‐‐|‐‐‐‐|‐‐‐‐|‐‐‐‐| ; RB2 ‐‐> | 8 | 9 | 10 | 11 | ; |‐‐‐‐|‐‐‐‐|‐‐‐‐|‐‐‐‐| ; RB3 ‐‐> | 12 | 13 | 14 | 15 | ; |‐‐‐‐|‐‐‐‐|‐‐‐‐|‐‐‐‐| ; ; Los números que se han dibujado dentro de cada cuadrado son el orden de las teclas ; que no tienen por qué coincidir con lo serigrafiado sobre ellas. El paso del número de ; orden de la tecla al valor que hay serigrafiado sobre la misma se hace con una tabla de ; conversión. ; ; ZONA DE DATOS ********************************************************************** ; CBLOCK Tecl_TeclaOrden ; Orden de la tecla a chequear. ENDC Tecl_UltimaTecla EQU d'15' ; Valor de orden de la última tecla utilizada. ; Subrutina "Teclado_LeeHex" ************************************************************ ; ; Cada tecla tiene asignado un número de orden que es contabilizado en la variable ; Tecl_TeclaOrden. Para convertir a su valor según el tipo de teclado en concreto se ; utiliza una tabla de conversión. ; A continuación se expone la relación entre el número de orden de la tecla y los ; valores correspondientes para el teclado hexadecimal más utilizado. ; ; ORDEN DE TECLA: TECLADO HEX. UTILIZADO: ; 0 1 2 3 1 2 3 F ; 4 5 6 7 4 5 6 E ; 8 9 10 11 7 8 9 D ; 12 13 14 15 A 0 B C ; ; Así, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 3 y la ; tecla "9" el orden 10. ; Si cambia el teclado también hay cambiar de tabla de conversión.

| 28

; ; Entrada: En (W) el orden de la tecla pulsada. ; Salida: En (W) el valor hexadecimal para este teclado concreto. ; Teclado_LeeHex call Teclado_LeeOrdenTecla ; Lee el Orden de la tecla pulsada. btfss STATUS,C ; ¿Pulsa alguna tecla?, ¿C=1? goto Tecl_FinLeeHex ; No, por tanto sale. call Tecl_ConvierteOrdenEnHex ; Lo convierte en su valor real mediante tabla. bsf STATUS,C ; Vuelve a posicionar el Carry, porque la Tecl_FinLeeHex ; instrucción "addwf PCL,F" lo pone a "0". return ; Tecl_ConvierteOrdenEnHex ; Según el teclado utilizado resulta: addwf PCL,F DT 1h,2h,3h,0Ah ; Primera fila del teclado. DT 4h,5h,6h,0Bh ; Segunda fila del teclado DT 7h,8h,9h,0Ch ; Tercera fila del teclado. DT 0Fh,0h,0Eh,0Dh ; Cuarta fila del teclado. Teclado_FinTablaHex ; ; Esta tabla se sitúa al principio de la librería con el propósito de que no supere a la ; posición 0FFh de memoria ROM de programa. De todas formas, en caso que así fuera ; visualizaría el siguiente mensaje de error en el proceso de ensamblado: ; IF (Teclado_FinTablaHex > 0xFF) ERROR "Atención: La tabla ha superado el tamaño de la página de los" MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente." ENDIF ; Subrutina "Teclado_Inicializa" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Esta subrutina configura las líneas del Puerto B según la conexión del teclado realizada ; y comprueba que no hay pulsada tecla alguna al principio. Teclado_Inicializa bsf STATUS,RP0 ; Configura las líneas del puerto: movlw b'11110000' ; <RB7:RB4> entradas, <RB3:RB0> salidas movwf PORTB bcf OPTION_REG,NOT_RBPU ; Habilita resistencia de Pull‐Up del Puerto B. bcf STATUS,RP0 ; Acceso al banco 0. ; call Teclado_EsperaDejePulsar ; return ; ; Subrutina "Teclado_EsperaDejePulsar" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ;Permanece en esta subrutina mientras siga pulsada la tecla. ; Teclado_Comprobacion EQU b'11110000' Teclado_EsperaDejePulsar: movlw Teclado_Comprobacion ; Pone a cero las cuatro líneas de salida del movwf PORTB ; Puerto B. Teclado_SigueEsperando call Retardo_20ms ; Espera a que se estabilicen los niveles de tensión. movf PORTB,W ; Lee el Puerto B. sublw Teclado_Comprobacion ; Si es lo mismo que escribió es que ya no pulsa

| 29

btfss STATUS,Z ; tecla alguna. goto Teclado_SigueEsperando return ; ; Subrutina "Teclado_LeeOrdenTecla" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Lee el teclado, obteniendo el orden de la tecla pulsada. ; ; Salida: En (W) el número de orden de la tecla pulsada. Además Carry se pone a "1" si ; se pulsa una tecla ó a "0" si no se pulsa tecla alguna. ; Teclado_LeeOrdenTecla: clrf Tecl_TeclaOrden ; Todavía no ha empezado a chequear el teclado. movlw b'11111110' ; Va a chequear primera fila. Tecl_ChequeaFila ; (Ver esquema de conexión). movwf PORTB ; Activa la fila correspondiente. call Retardo_1ms Tecl_Columna1 btfss PORTB,4 ; Chequea la 1ª columna buscando un cero. goto Tecl_GuardaValor ; Sí, es cero y por tanto guarda su valor y sale. incf Tecl_TeclaOrden,F ; Va a chequear la siguiente tecla. Tecl_Columna2 ; Repite proceso para las siguientes btfss PORTB,5 ; columnas. goto Tecl_GuardaValor incf Tecl_TeclaOrden,F Tecl_Columna3 btfss PORTB,6 goto Tecl_GuardaValor incf Tecl_TeclaOrden,F Tecl_Columna4 btfss PORTB,7 goto Tecl_GuardaValor incf Tecl_TeclaOrden,F ; ; Comprueba si ha checado la última tecla, en cuyo caso sale. Para ello testea si ; el contenido del registro Tecl_TeclaOrden es igual al número de teclas del teclado. ; Tecl_TerminaColumnas movlw Tecl_UltimaTecla subwf Tecl_TeclaOrden,W ; (W) = (Tecl_TeclaOrden)‐Tecl_UltimaTecla. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Tecl_TeclaOrden)<15? goto Tecl_NoPulsada ; No, se ha llegado al final del chequeo. bsf STATUS,C ; Sí. Va a checar la siguiente fila. rlf PORTB,W ; Apunta a la siguiente fila. goto Tecl_Checa Fila Tecl_NoPulsada bcf STATUS,C ; Posiciona C=0, indicando que no ha pulsado goto Tecl_FinTecladoLee ; tecla alguna y sale. Tecl_GuardaValor movf Tecl_TeclaOrden,W ; El orden de la tecla pulsada en (W) y sale. bsf STATUS,C ; Como hay tecla tecla pulsada, pone C=1. Tecl_FinTecladoLee return

| 30

LIBRERÍA PARA EL LCD ;**************************** Librería "LCD_MENS.INC" ******************************** ; Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD. CBLOCK LCD_ApuntaCaracter ; Indica la posición del carácter a visualizar ; respecto del comienzo de todos los ; (posición de la etiqueta "Mensajes"). LCD_ValorCaracter ; Código ASCII del caracter a ENDC ; visualizar. ; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la ; memoria de programa, es decir, no pueden superar la dirección 0FFh. ; Subrutina "LCD_Mensaje" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Visualiza por pantalla el mensaje apuntado por el registro W. ; ; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que ; tenga la siguiente estructura: ; ; Mensajes ; ¡Etiqueta obligatoria! ; addwf PCL,F ; Mensaje0 ; Posición inicial del mensaje. ; DT ".. ..", 0x00 ; Mensaje terminado en 0x00. ; Mensaje1 ; ... ; ... ; FinMensajes ; ; La llamada a esta subrutina se realizará siguiendo este ejemplo: ; ; movlw Mensaje0 ; Carga la posición del mensaje. ; call LCD_Mensaje ; Visualiza el mensaje. ; LCD_Mensaje movwf LCD_ApuntaCaracter ; Posición del primer caracter del mensaje. movlw Mensajes ; Halla la posición relativa del primer carácter subwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mensajes". decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F". LCD_VisualizaOtroCaracter movf LCD_ApuntaCaracter,W call Mensajes ; Obtiene el código ASCII del caracter apuntado. movwf LCD_ValorCaracter ; Guarda el valor de carácter. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto LCD_FinMensaje ; de mensaje, sale fuera. LCD_NoUltimoCaracter call LCD_Caracter ; Visualiza el caracter ASCII leído.

| 31

incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente caracter goto LCD_VisualizaOtroCaracter ; dentro del mensaje. LCD_FinMensaje return ; Vuelve al programa principal. ; Subrutina "LCD_MensajeMovimiento" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse ; en una línea, por tanto se desplaza a través de la pantalla. ; ; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para ; conseguir que el desplazamiento del mensaje sea lo más legible posible. ; CBLOCK LCD_CursorPosicion ; Contabiliza la posición del cursor dentro de la ENDC ; pantalla LCD LCD_MensajeMovimiento movwf LCD_ApuntaCaracter ; Posición del primer caracter del mensaje. movlw Mensajes ; Halla la posición relativa del primer carácter subwf LCD_ApuntaCaracter,F ; del mensaje respecto de la etiqueta "Mensajes". decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F". LCD_PrimeraPosicion clrf LCD_CursorPosicion ; El cursor en la posición 0 de la línea. call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y LCD_VisualizaCaracter ; borra la pantalla. movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea? subwf LCD_CursorPosicion,W btfss STATUS,Z goto LCD_NoEsFinalLinea LCD_EsFinalLinea call Retardo_200ms ; Lo mantiene visualizado durante este tiempo. call Retardo_200ms movlw LCD_CaracteresPorLinea‐1; Apunta a la posición del segundo caracter visualizado subwf LCD_ApuntaCaracter,F ; en pantalla, que será el primero en la siguiente goto LCD_PrimeraPosicion ; visualización de línea, para producir el efecto LCD_NoEsFinalLinea ; de desplazamiento hacia la izquierda. movf LCD_ApuntaCaracter,W call Mensajes ; Obtiene el ASCII del caracter apuntado. movwf LCD_ValorCaracter ; Guarda el valor del caracter. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto LCD_FinMovimiento ; de mensaje, sale fuera. LCD_NoUltimoCaracter2 call LCD_Caracter ; Visualiza el caracter ASCII leído. incf LCD_CursorPosicion,F ; Contabiliza el incremento de posición del ; cursor en la pantalla. incf LCD_ApuntaCaracter,F ; Apunta a la siguiente posición por visualizar. goto LCD_VisualizaCaracter ; Vuelve a visualizar el siguiente caracter LCD_FinMovimiento ; de la línea. return ; Vuelve al programa principal.

| 32

CONTROL DEL LCD ;**************************** Librería "LCD_4BIT.INC" *********************************** ; ; ; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2 ; líneas por 16 caracteres, compatible con el modelo LM016L. ; ; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las ; conexiones son: ; ‐ Las 4 líneas superiores del módulo LCD, pines <DB7:DB4> se conectan a las 4 ; líneas superiores del Puerto B del PIC, pines <RB7:RB4>. ; ‐ Pin RS del LCD a la línea RA0 del PIC. ; ‐ Pin R/W del LCD a la línea RA1 del PIC, o a masa. ; ‐ Pin Enable del LCD a la línea RA2 del PIC. ; ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería ; RETARDOS.INC. ; ; ZONA DE DATOS ********************************************************************* CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISB LCD_Auxiliar1 LCD_Auxiliar2 ENDC LCD_CaracteresPorLinea EQU .16 ; Número de caracteres por línea de la pantalla. #DEFINE LCD_PinRS PORTA,0 #DEFINE LCD_PinRW PORTA,1 #DEFINE LCD_PinEnable PORTA,2 #DEFINE LCD_BusDatos PORTB ; Subrutina "LCD_Inicializa" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software, ; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la ; configuración inicial hay que hacerla como sigue: ; LCD_Inicializa bsf STATUS,RP0 ; Configura las líneas conectadas al pines RS, bcf LCD_PinRS ; R/W y E. bcf LCD_PinEnable bcf LCD_PinRW bcf STATUS,RP0

| 33

bcf LCD_PinRW ; En caso de que esté conectado le indica ; que se va a escribir en el LCD. bcf LCD_PinEnable ; Impide funcionamiento del LCD poniendo E=0. bcf LCD_PinRS ; Activa el Modo Comando poniendo RS=0. call Retardo_20ms movlw b'00110000' call LCD_EscribeLCD ; Escribe el dato en el LCD. call Retardo_5ms movlw b'00110000' call LCD_EscribeLCD call Retardo_200micros movlw b'00110000' call LCD_EscribeLCD call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS. movlw b'00100000' ; Interface de 4 bits. call LCD_EscribeLCD call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS. ; Ahora configura el resto de los parámetros: call LCD_2Lineas4Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos. call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio call LCD_CursorOFF ; de la línea 1. Cursor apagado. call LCD_CursorIncr ; Cursor en modo incrementar. return ; Subrutina "LCD_EscribeLCD" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin ; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que ; no son utilizadas para el LCD (pines RB3:RB0), primero se leen estas líneas y después se ; vuelve a enviar este dato sin cambiarlo. LCD_EscribeLCD andlw b'11110000' ; Se queda con el nibble alto del dato que es el movwf LCD_Dato ; que hay que enviar y lo guarda. movf LCD_BusDatos,W ; Lee la información actual de la parte baja andlw b'00001111' ; del Puerto B, que no se debe alterar. iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada ; y en la parte baja lo que había antes. bsf STATUS,RP0 ; Acceso al Banco 1. movf TRISB,W ; Guarda la configuración que tenía antes TRISB. movwf LCD_GuardaTRISB movlw b'00001111' ; Las 4 líneas inferiores del Puerto B se dejan andwf PORTB,F ; como estaban y las 4 superiores como salida. bcf STATUS,RP0 ; Acceso al Banco 0. ; movf LCD_Dato,W ; Recupera el dato a enviar. movwf LCD_BusDatos ; Envía el dato al módulo LCD. bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD.

| 34

bsf STATUS,RP0 ; Acceso al Banco 1. Restaura el antiguo valor en movf LCD_GuardaTRISB,W ; la configuración del Puerto B. movwf TRISB bcf STATUS,RP0 ; Acceso al Banco 0. return ; Subrutinas variadas para el control del módulo LCD ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ;Los comandos que pueden ser ejecutados son: ; LCD_CursorIncr ; Cursor en modo incrementar. movlw b'00000110' goto LCD_EnviaComando LCD_Linea1 ; Cursor al principio de la Línea 1. movlw b'10000000' ; Dirección 00h de la DDRAM goto LCD_EnviaComando LCD_Linea2 ; Cursor al principio de la Línea 2. movlw b'11000000' ; Dirección 40h de la DDRAM goto LCD_EnviaComando LCD_Linea3 ; Cursor al principio de la Línea 3 movlw b'10010100' ; Dirección 14h de la DDRAM goto LCD_EnviaComando LCD_Linea4 ; Cursor al principio de la Línea 4 movlw b'11010100' ; Dirección 54h de la DDRAM goto LCD_EnviaComando LCD_PosicionLinea1 ; Cursor a posición de la Línea 1, a partir de la iorlw b'10000000' ; dirección 00h de la DDRAM más el valor del goto LCD_EnviaComando ; registro W. LCD_PosicionLinea2 ; Cursor a posición de la Línea 2, a partir de la iorlw b'11000000' ; dirección 40h de la DDRAM más el valor del goto LCD_EnviaComando ; registro W. LCD_OFF ; Pantalla apagada. movlw b'00001000' goto LCD_EnviaComando LCD_CursorON ; Pantalla encendida y cursor encendido. movlw b'00001110' goto LCD_EnviaComando LCD_CursorOFF ; Pantalla encendida y cursor apagado. movlw b'00001100' goto LCD_EnviaComando LCD_Borra ; Borra toda la pantalla, memoria DDRAM y pone el movlw b'00000001' ; cursor a principio de la línea 1. goto LCD_EnviaComando LCD_2Lineas4Bits5x7 ; Define la pantalla de 2 líneas, con caracteres movlw b'00101000' ; de 5x7 puntos y conexión al PIC mediante bus de ; goto LCD_EnviaComando ; 4 bits. ; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de

| 35

; comando ha sido entregada a través del registro W. Trabaja en Modo Comando. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a ; a través del registro W. Trabaja en Modo Dato. ; LCD_EnviaComando bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0. goto LCD_Envia LCD_Caracter bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1. call LCD_CodigoCGROM ; Obtiene el código para correcta visualización. LCD_Envia movwf LCD_GuardaDato ; Guarda el dato a enviar. call LCD_EscribeLCD ; Primero envía el nibble alto. swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el ; nibble bajo del dato a enviar a parte alta del byte. call LCD_EscribeLCD ; Se envía al visualizador LCD. btfss LCD_PinRS ; Debe garantizar una correcta escritura manteniendo call Retardo_2ms ; 2 ms en modo comando y 50 µs en modo cáracter. call Retardo_50micros return ; Subrutina "LCD_CodigoCGROM" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la ; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código ; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh. ; ; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que ; que puedan ser visualizado en el módulo LM016L. ; ; Entrada: En (W) el código ASCII del carácter que se desea visualizar. ; Salida: En (W) el código definido en la tabla CGROM. LCD_CodigoCGROM movwf LCD_Dato ; Guarda el valor del carácter y comprueba si es LCD_EnheMinuscula ; un caracter especial. sublw 'ñ' ; ¿Es la "ñ"? btfss STATUS,Z goto LCD_EnheMayuscula ; No es "ñ". movlw b'11101110' ; Código CGROM de la "ñ". movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato,W ; Recupera el código ASCII de entrada. sublw 'Ñ' ; ¿Es la "Ñ"? btfss STATUS,Z goto LCD_Grado ; No es "Ñ". movlw b'11101110' ; Código CGROM de la "ñ". (No hay símbolo para movwf LCD_Dato ; la "Ñ" mayúscula en la CGROM). goto LCD_FinCGROM LCD_Grado movf LCD_Dato,W ; Recupera el código ASCII de entrada. sublw 'º' ; ¿Es el símbolo "º"?

| 36

btfss STATUS,Z goto LCD_FinCGROM ; No es "º". movlw b'11011111' ; Código CGROM del símbolo "º". movwf LCD_Dato LCD_FinCGROM movf LCD_Dato,W ; En (W) el código buscado. return ; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Visualiza espacios en blanco. LCD_LineaEnBlanco movlw LCD_CaracteresPorLinea goto LCD_EnviaBlancos LCD_UnEspacioBlanco movlw .1 goto LCD_EnviaBlancos LCD_DosEspaciosBlancos movlw .2 goto LCD_EnviaBlancos LCD_TresEspaciosBlancos movlw .3 LCD_EnviaBlancos movwf LCD_Auxiliar1 ; (LCD_Auxiliar1) se utiliza como contador. LCD_EnviaOtroBlanco movlw ' ' ; Esto es un espacio en blanco. call LCD_Caracter ; Visualiza tanto espacios en blanco como se decfsz LCD_Auxiliar1,F ; haya cargado en (LCD_Auxiliar1). goto LCD_EnviaOtroBlanco return ; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el ; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE". ; ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE" ; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante). ; ; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante. ; LCD_Byte movwf LCD_Auxiliar2 ; Guarda el valor de entrada. andlw b'11110000' ; Analiza si el nibble alto es cero. btfss STATUS,Z ; Si es cero lo apaga. goto LCD_VisualizaAlto ; No es cero y lo visualiza. movlw ' ' ; Visualiza un espacio en blanco. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 ; Guarda el valor de entrada. LCD_VisualizaAlto swapf LCD_Auxiliar2,W ; Pone el nibble alto en la parte baja. call LCD_Nibble ; Lo visualiza.

| 37

LCD_VisualizaBajo movf LCD_Auxiliar2,W ; Repite el proceso con el nibble bajo. ; call LCD_Nibble ; Lo visualiza. ; return ; Subrutina "LCD_Nibble" ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos: ; ‐ Si (W)=b'01010110', se visualizará "6". ; ‐ Si (W)=b'10101110', se visualizará "E". ; LCD_Nibble andlw b'00001111' ; Se queda con la parte baja. movwf LCD_Auxiliar1 ; Lo guarda. sublw 0x09 ; Comprueba si hay que representarlo con letra. btfss STATUS,C goto LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw '0' ; El número se pasa a carácter ASCII sumándole goto LCD_FinVisualizaDigito ; el ASCII del cero y lo visualiza. LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw 'A'‐0x0A ; Sí, por tanto, se le suma el ASCII de la 'A'. LCD_FinVisualizaDigito goto LCD_Caracter ; Y visualiza el caracter. Se hace con un "goto" ; para no sobrecargar la pila.

RETARDOS ;**************************** Librería "RETARDOS.INC" ********************************* ; ; ; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. ; Además se pueden implementar otras subrutinas muy fácilmente. ; ; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal ; de cuarzo a 4 MHz. Como cada ciclo de máquina son 4 ciclos de reloj, resulta que cada ; ciclo de máquina tarda 4 x 1/4MHz = 1 µs. ; ; En los comentarios, "cm" significa "ciclos máquina". ; ; ZONA DE DATOS ********************************************************************* CBLOCK R_ContA ; Contadores para los retardos. R_ContB R_ContC ENDC ; ; RETARDOS de 4 hasta 10 microsegundos ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; ; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ, ; la llamada a subrutina "call" tarda 2 ciclos de máquina, el retorno de subrutina

| 38

; "return" toma otros 2 ciclos de máquina y cada instrucción "nop" tarda 1 ciclo máquina. ; Retardo_10micros ; La llamada "call" aporta 2 ciclos de máquina. nop ; Aporta 1 ciclo de máquina. nop ; Aporta 1 ciclo de máquina. nop ; Aporta 1 ciclo de máquina. nop ; Aporta 1 ciclo de máquina. nop ; Aporta 1 ciclo de máquina. Retardo_5micros ; La llamada "call" aporta 2 ciclos de máquina. nop ; Aporta 1 ciclo máquina. Retardo_4micros ; La llamada "call" aporta 2 ciclos de máquina. return ; El salto del retorno aporta 2 ciclos de máquina. ; ; RETARDOS de 20 hasta 500 microsegundos ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; Retardo_500micros ; La llamada "call" aporta 2 ciclos de máquina. nop ; Aporta 1 ciclo de máquina. movlw d'164' ; Aporta 1 ciclo de máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos de máquina. Retardo_200micros ; La llamada "call" aporta 2 ciclos de máquina. nop ; Aporta 1 ciclo de máquina. movlw d'64' ; Aporta 1 ciclo de máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos de máquina. Retardo_100micros ; La llamada "call" aporta 2 ciclos de máquina. movlw d'31' ; Aporta 1 ciclo de máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos de máquina. Retardo_50micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclode máquina. movlw d'14' ; Aporta 1 ciclo de máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos de máquina. Retardo_20micros ; La llamada "call" aporta 2 ciclos de máquina. movlw d'5' ; Aporta 1 ciclode máquina. Este es el valor de "K". ; ; El próximo bloque "RetardoMicros" tarda: ; 1 + (K‐1) + 2 + (K‐1)x2 + 2 = (2 + 3K) ciclos de máquina. ; RetardoMicros movwf R_ContA ; Aporta 1 ciclo de máquina. Rmicros_Bucle decfsz R_ContA,F ; (K‐1)x1 cm (cuando no salta) + 2 cm (al saltar). goto Rmicros_Bucle ; Aporta (K‐1)x2 ciclosde máquina. return ; El salto del retorno aporta 2 ciclos de máquina. ; ;En total estas subrutinas tardan: ; ‐ Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz). ; ‐ Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz). ; ‐ Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz). ; ‐ Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 µs. (para K= 14 y 4 MHz). ; ‐ Retardo_20micros : 2 + 1 + (2 + 3K) = 20 cm = 20 µs. (para K= 5 y 4 MHz). ; ; RETARDOS de 1 ms hasta 200 ms. ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; Retardo_200ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'200' ; Aporta 1 ciclo de máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos de máquina. Retardo_100ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'100' ; Aporta 1 ciclo de máquina. Este es el valor de "M".

| 39

goto Retardos_ms ; Aporta 2 ciclos de máquina. Retardo_50ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'50' ; Aporta 1 ciclo de máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos de máquina. Retardo_20ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'20' ; Aporta 1 ciclo de máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos de máquina. Retardo_10ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'10' ; Aporta 1 ciclo de máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos de máquina. Retardo_5ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'5' ; Aporta 1 ciclo de máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos de máquina. Retardo_2ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'2' ; Aporta 1 ciclo de máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos de máquina. Retardo_1ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'1' ; Aporta 1 ciclo de máquina. Este es el valor de "M". ; ; El próximo bloque "Retardos_ms" tarda: ; 1 + M + M + KxM + (K‐1)xM + Mx2 + (K‐1)Mx2 + (M‐1) + 2 + (M‐1)x2 + 2 = ; = (2 + 4M + 4KM) ciclos de máquina. Para K=249 y M=1 supone 1002 ciclos de máquina ; que a 4 MHz son 1002 µs = 1 ms. ; Retardos_ms movwf R_ContB ; Aporta 1 ciclo de máquina. R1ms_BucleExterno movlw d'249' ; Aporta Mx1 ciclos de máquina. Este es el valor de "K". movwf R_ContA ; Aporta Mx1 ciclos de máquina. R1ms_BucleInterno nop ; Aporta KxMx1 ciclos de máquina. decfsz R_ContA,F ; (K‐1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar). goto R1ms_BucleInterno ; Aporta (K‐1)xMx2 ciclos de máquina. decfsz R_ContB,F ; (M‐1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1ms_BucleExterno ; Aporta (M‐1)x2 ciclos de máquina. return ; El salto del retorno aporta 2 ciclos de máquina. ; ;En total estas subrutinas tardan: ; ‐ Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249). ; ‐ Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249). ; ‐ Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. (M= 50 y K=249). ; ‐ Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M= 20 y K=249). ; ‐ Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. (M= 10 y K=249). ; ‐ Retardo_5ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249). ; ‐ Retardo_2ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249). ; ‐ Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249). ; ; RETARDOS de 0.5 hasta 20 segundos ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ; Retardo_20s ; La llamada "call" aporta 2 ciclos de máquina. movlw d'200' ; Aporta 1 ciclo de máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos de máquina. Retardo_10s ; La llamada "call" aporta 2 ciclos de máquina. movlw d'100' ; Aporta 1 ciclo de máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos de máquina.

| 40

Retardo_5s ; La llamada "call" aporta 2 ciclos de máquina. movlw d'50' ; Aporta 1 ciclo de máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos de máquina. Retardo_2s ; La llamada "call" aporta 2 ciclos de máquina. movlw d'20' ; Aporta 1 ciclo de máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos de máquina. Retardo_1s ; La llamada "call" aporta 2 ciclos máquina. movlw d'10' ; Aporta 1 ciclo de máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos de máquina. Retardo_500ms ; La llamada "call" aporta 2 ciclos de máquina. movlw d'5' ; Aporta 1 ciclo de máquina. Este es el valor de "N". ; ; El próximo bloque "Retardo_1Decima" tarda: ; 1 + N + N + MxN + MxN + KxMxN + (K‐1)xMxN + MxNx2 + (K‐1)xMxNx2 + ; + (M‐1)xN + Nx2 + (M‐1)xNx2 + (N‐1) + 2 + (N‐1)x2 + 2 = ; = (2 + 4M + 4MN + 4KM) ciclos de máquina. Para K=249, M=100 y N=1 supone 100011 ; ciclos de máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo. ; Retardo_1Decima movwf R_ContC ; Aporta 1 ciclo de máquina. R1Decima_BucleExterno2 movlw d'100' ; Aporta Nx1 ciclos de máquina. Este es el valor de "M". movwf R_ContB ; Aporta Nx1 ciclos de de máquina. R1Decima_BucleExterno movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K". movwf R_ContA ; Aporta MxNx1 ciclos de máquina. R1Decima_BucleInterno nop ; Aporta KxMxNx1 ciclosde máquina. decfsz R_ContA,F ; (K‐1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar). goto R1Decima_BucleInterno ; Aporta (K‐1)xMxNx2 ciclos de máquina. decfsz R_ContB,F ; (M‐1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar). goto R1Decima_BucleExterno ; Aporta (M‐1)xNx2 ciclos de máquina. decfsz R_ContC,F ; (N‐1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1Decima_BucleExterno2 ; Aporta (N‐1)x2 ciclos de máquina. return ; El salto del retorno aporta 2 ciclos de máquina. ; ;En total estas subrutinas tardan: ; ‐ Retardo_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s. ; (N=200, M=100 y K=249). ; ‐ Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s. ; (N=100, M=100 y K=249). ; ‐ Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s. ; (N= 50, M=100 y K=249). ; ‐ Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s. ; (N= 20, M=100 y K=249). ; ‐ Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s. ; (N= 10, M=100 y K=249). ; ‐ Retardo_500ms: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 cm = 0,5 s. ; (N= 5, M=100 y K=249).

| 41

RESULTADOS En la figura R1 a R3 se muestra la cerradura electrónica en pleno funcionamiento, Cada uno de sus componentes esta acoplado de manera efectiva, de esta manera su funcionamiento es el adecuado. Pues el resultado es el esperado. Cuando tecleas la clave predeterminada por nosotros se observa como la corriente pasa a través del relevador y led nos indica que efectivamente la bomba de gasolina esta funcionamiento ya que es excitada por el paso de corriente de la cerradura electrónica. FIGURA R1 FIGURA R2

FIGURA R3

| 42

Conclusiones Las aplicaciones con microcontroladores son muy versátiles ya que nos permite operar con diferentes componentes electrónicas, realizar proyectos sencillos o muy complejos. Su bajo costo en comparación con otros dispositivos es un argumento que nos permite seleccionar este microcontrolador. La aplicación de este proyecto fue dar un beneficio a la sociedad debido a que en la actualidad el robo de autos es muy constante un dato es que se roban 66 autos al día en la ciudad de México por eso nuestro sistema de seguridad puede tener una gran impacto en la industria automotriz.

| 43

APENDICE A En este primer apéndice A damos a conocer el funcionamiento y características del Grabador de Microcontroladores que utilizamos. Se entiende que explicar los funcionamientos específicos de un grabador, es cuestión de un tema muy amplio, por lo que solo nos reducimos a hablar de ello en una manera que el usuario obtenga una introducción del tema.

GRABADOR VOLNIA

El USP 3.0 permite realizar la programación de Microcontroladores PIC de forma simple, integra características que lo hacen ideal en aplicaciones dentro del laboratorio o en el campo de trabajo. Recomendado para profesionistas, estudiantes y aficionados. Se muestra en la figura A1. Características destacadas: • Tamaño compacto. • Chasis plástico de alta resistencia. • Actualizaciones gratuitas. • Software y soporte técnico en español. Especificaciones: • Comunicación USB2.0 Full Speed. • Sistema operativo Windows XP, VISTA

FIGURA A1

| 44

DESCRIPCION DEL HARDWARE

FUNCIONES PRINCIPALES

| 45

| 46

3.- DISPOSITIVOS SOPORTADOS software USP3.0 v1.26 FAMILIA PIC12F635/16F636/639 • PIC12F635 • PIC16F636 • PIC16F639 PIC12F629/675 • PIC12F629 • PIC12F675 PIC12F683 • PIC12F683 PIC16F630/676 • PIC16F630 • PIC16F676 PIC16F8X • PIC16F84A PIC16F62X • PIC16F627 • PIC16F628 • PIC16LF627 • PIC16LF628 PIC16F62XA • PIC16F627A • PIC16F628A • PIC16F648A • PIC16LF627A • PIC16LF628A • PIC16LF648A PIC16F631/677/690 • PIC16F631 • PIC16F677• PIC16F685 • PIC16F687 • PIC16F689• PIC16F690 PIC16F684/688 • PIC16F684 • PIC16F688 PIC16F87X • PIC16F870 • PIC16F874 • PIC16F871 • PIC16F876 • PIC16F877 • PIC16F873 PIC16F87XA • PIC16F873A • PIC16F876A • PIC16F874A • PIC16F877A PIC16F818/819 • PIC16F818 • PIC16F819 PIC18FXX2/XX8 • PIC18F242 • PIC18F248 • PIC18F252 • PIC18F258 • PIC18F442 • PIC18F448 • PIC18F452 • PIC18F458 PIC18F2XXX/4XXX • PIC18F2221 • PIC18F2580 • PIC18F4480 • PIC18F2321 • PIC18F2585 • PIC18F4510 • PIC18F2410 • PIC18F2610 • PIC18F4515 • PIC18F2420 • PIC18F2620 • PIC18F4520 • PIC18F2423 • PIC18F2680 • PIC18F4523 • PIC18F2450 • PIC18F2682 • PIC18F4525 • PIC18F2455 • PIC18F2685 • PIC18F4550 • PIC18F2458 • PIC18F4221 • PIC18F4553 • PIC18F2480 • PIC18F4321 • PIC18F4580 • PIC18F2510 • PIC18F4410 • PIC18F4585 • PIC18F2515 • PIC18F4420 • PIC18F4610 • PIC18F2520 • PIC18F4423 • PIC18F4620 • PIC18F2523 • PIC18F4450 • PIC18F4680 • PIC18F2525 • PIC18F4455 • PIC18F4682 • PIC18F2550 • PIC18F4458 • PIC18F4685 • PIC18F2553 PIC18F2331/4431 • PIC18F2331 • PIC18F2431 • PIC18F4331 • PIC18F4431 PIC18F1230/1330 • PIC18F1230• PIC18F1330 PIC16F883/884/886/887 • PIC16F882 • PIC16F883 • PIC16F884 • PIC16F886 • PIC16F887

| 47

APÉNDICE B En las figuras B1 a B2 se muestra la elaboración de la placa. FIGURA B1 PERFORACIÓN DE LA PLACA

FIGURA B2. AJUSTANDO EL TALADRO

| 48

BIBLIOGRAFÍA Palacios, Enrique; Microcontrolador PIC16F84. Desarrollo de Proyectos.

Editorial Alfa omega.

Editorial Quark SRL ‐ Herrera 761, (1295), Bs. As. ‐ Argentina ‐ Director: H.

D. Vallejo.

Revista Electrónica Practica Resistores.

www.todopic.com.ar

www.microchip.com

www.superrobotica.com

| 49

GLOSARIO

Amplificador transistorizado: Circuito basado en el transistor con ganancia de potencia mayor a 1.

PIC: (Programmable Interrupt Controller) Controlador de Interrupciones Programable, se encarga de la comunicación entre los periféricos y el procesador.

Diferencia entre microcontrolador y microprocesador: a modo de resumen, el primero es un sistema autónomo e independiente, mientras que el segundo es una parte, cabe decir que esencial, que forma parte de un sistema mayor.

en la memoria del programa.

| 50