Taxímetro con Pic16F887

26
INSTITUTO POLITÉCNICO NACIONAL CENTRO DE INVESTIGACIÓN EN COMPUTACIÓN EVALUACIÓN Microprocesadores MCIC Hernández Lara Derlis Aplicación de los periféricos de un microcontrolador, uso del TMR1 y control de LCD con PIC16F. Proyecto: Taxímetro Profesor: Dr. Alfonso Gutiérrez Aldana MÉXICO, D.F. JUNIO 2014

description

Implementación de un taxímetro con Pic16F887 y LCD

Transcript of Taxímetro con Pic16F887

Page 1: Taxímetro con Pic16F887

INSTITUTO POLITÉCNICO NACIONAL

CENTRO DE INVESTIGACIÓN EN COMPUTACIÓN

2° EVALUACIÓN

Microprocesadores

MCIC

Hernández Lara Derlis

Aplicación de los periféricos de un microcontrolador, uso del TMR1 y control de LCD con PIC16F.

Proyecto: Taxímetro

Profesor:

Dr. Alfonso Gutiérrez Aldana

MÉXICO, D.F. JUNIO 2014

Page 2: Taxímetro con Pic16F887

Derlis Hernández Lara

2

Conociendo los microcontroladores PIC16F

En este trabajo se describe la práctica realizada para la segunda evaluación de la materia

de microprocesadores. Se vio durante el curso correspondiente a este periodo, como

configurar y utilizar algunos de los periféricos más usados de un PIC, como los son el

módulo CCP (Compare/Capture/PWM), control de LCD, programación serial en

circuito (ICSP) y el puerto de comunicación serial (SSP).

Introducción:

Se está trabajando con el PIC16F887 en específico, este es un microcontrolador de 8

bits de mediano rango, con 40 terminales y con una arquitectura Harvard lo que indica

que tiene dos memorias, una para datos y una de programa, además utiliza instrucciones

RISC (del inglés Reduced Instruction Set Computer, en español Computador con

Conjunto de Instrucciones Reducidas).

Taxímetro

El proyecto propuesto es la realización de un sistema que funcione de manera similar a

un taxímetro, este dispositivo se encuentra usualmente instalado en los taxis y mide el

importe a cobrar en relación tanto a la distancia recorrida como al tiempo trascurrido.

Para realizar dicho sistema, se necesita un LCD que muestre el monto a cobrar y que

este vaya incrementando según corresponda, el LCD será controlado por un pic16f887,

para el aumento de tarifa debido al tiempo transcurrido se utilizará el TMR1 en modo de

temporizador que servirá para contar los 45 segundos a los cuales se incrementa la

tarifa, mientras que para el incremento por distancia también se utilizara el TMR1, pero

en modo contador, por el pin RC0 se obtendrá la señal que determinara cuantos metros

se han recorrido.

TMR1

El microcontrolador PIC16F887 dispone de tres temporizadores/contadores

independientes, denominados Timer0, Timer1 y Timer2.

Es un módulo que sirve como contador o como temporizador de 16 bits, cuyo valor se

almacena en dos registros de 8 bits el TMR1H y el TMR1L, ambos registros se pueden

leer y escribir su valor durante la ejecución del programa. Cuando el Timer1 está

habilitado, el valor de esos registros se incrementan desde 0000h a FFFFh y una vez que

llega a su máximo valor empieza otra vez desde 0 avisándonos de ello por medio de la

bandera TMR1F.

Si está activa la interrupción por desbordamiento del Timer 1 al desbordarse el

contador, el programa entra en la función de tratamiento a la interrupción por

desbordamiento del Timer1.

El TMR1 puede funcionar de dos maneras; como contador de eventos o como

temporizador. Lo configuramos por medio del bit TMR1CS del registro TICON.

Page 3: Taxímetro con Pic16F887

Derlis Hernández Lara

3

Cuando está en modo contador su valor se incrementa en cada flanco de subida de la

señal de reloj externa introducida por RC0.

Se decidió usar TMR1 y no TMR0, por que el tiempo a contar es relativamente grande y

si se usara TMR0 se usarían más recursos del microcontrolador por que habría que

realizar más operaciones o ciclos para contar los 45 segundos necesarios, el TMR1 al

ser de 16 bits tiene mayor capacidad para guardar cuentas más grandes.

El TMR1 (16 Bits) se puede dividir con un preescaler máximo de 8 si así se necesitara,

este registro tiene una capacidad de 65536 (de 0 a 65535) en vez de 256 como el TMR0

(de 0 a 255).

LCD

Cuando se trabaja en diseño de circuitos electrónicos es frecuente encontrarse con la

necesidad de visualizar un mensaje, que tiene que ver con el estado de la máquina a

controlar, con instrucciones para el operario, o si es un instrumento de medida, mostrar

el valor registrado. En la mayoría de los casos, recurrimos a los displays de siete

segmentos, pero estos además de no mostrar caracteres alfanuméricos ni ASCII, tienen

un elevado consumo de corriente y son un poco dispendiosos de manejar, cuando se

requiere hacer multiplexaje.

Los módulos de cristal líquido o LCD, solucionan estos inconvenientes y presentan

algunas ventajas, como un menor consumo de corriente, no hay que preocuparse por

hacer multiplexaje, no hay que hacer tablas especiales con los caracteres que se desea

mostrar, se pueden conectar fácilmente con microprocesadores o microcontroladores y

además, los proyectos adquieren una óptima presentación y funcionalidad.

Los módulos LCD se encuentran en diferentes presentaciones, por ejemplo (2 líneas por

16 caracteres), 2x20, 4x20, 4x40, etc. La forma de utilizarlos y sus interfaces son

similares, por eso, los conceptos vistos aquí se pueden emplear en cualquiera de ellos.

En nuestro caso, trabajaremos con un display de 2x16, ya que es de bajo costo, se

consigue fácilmente en el comercio y tiene un tamaño suficiente para la mayoría de las

aplicaciones.

Estos dispositivos vienen gobernados por un microcontrolador, que normalmente va

incorporado sobre la misma placa de circuito impreso que soporta el LCD (figura 1). En

el mercado es habitual encontrarse con el controlador HD44780 de Hitachi. Este

controlador se encarga de gestionar el display líquido: polariza los puntos de pantalla,

genera los caracteres, desplazar la pantalla, mostrar el cursos, etc. el usuario se

despreocupa de todos esos problemas y solo necesita conocer una serie de comandos o

instrucciones de alto nivel (limpia display, posicionar cursor, etc.) que le permitirán

mostrar mensajes o animaciones sobre la pantalla de forma sencilla. Para comunicarse

con el controlador del display se dispone de un interfaz paralelo al exterior, de fácil

conexión a otros microcontroladores o microprocesadores.

Page 4: Taxímetro con Pic16F887

Derlis Hernández Lara

4

Figura 1.- Microcontrolador HD44780, en la parte trasera del LCD.

Conexiones a este tipo de LCD:

El número de pines de un display alfanumérico es normalmente de 14 (o 16 si el LCD

es retroiluminado) y son compatibles TTL. En la tabla 1 se muestra el significado de las

señales de cada pin. Hay tres tipos de señales en el LCD: de alimentación, de control y

de datos.

Page 5: Taxímetro con Pic16F887

Derlis Hernández Lara

5

Según la operación que se desee realizar sobre el módulo de cristal líquido, los pines de

control E, RS y R/W deben tener un estado determinado. Además, debe tener en el bus

de datos un código que indique un caracter para mostrar en la pantalla o una instrucción

de control. En la figura 2 se muestra el diagrama de tiempos que se debe cumplir para

manejar el módulo.

Figura 2.- Diagrama de tiempo del módulo LCD.

El módulo LCD responde a un conjunto especial de instrucciones, estas deben ser

enviadas por el microcontrolador o sistema de control al display, según la operación que

se requiera, obsérvese figura 3.

La interface entre el microcontrolador y el display de cristal líquido se puede hacer con

el bus de datos trabajando a 4 u 8 bits. Las señales de control trabajan de la misma

forma en cualquiera de los dos casos, la diferencia se establece en el momento de iniciar

el sistema, ya que existe una instrucción que permite establecer dicha configuración.

Los caracteres que se envían al display se almacenan en la memoria RAM del módulo.

Existen posiciones de memoria RAM, cuyos datos son visibles en la pantalla y otras que

no son visibles, estas últimas se pueden utilizar para guardar caracteres que luego se

desplazan hacia la parte visible.

Es importante anotar que sólo se pueden mostrar caracteres ASCII de 7 bits, por lo tanto

algunos caracteres especiales no se pueden ver (se debe tener a la mano una tabla de los

caracteres ASCII para conocer los datos que son prohibidos). Por otra parte, se tiene la

opción de crear caracteres especiales (creados por el programador), y almacenarlos en la

memoria RAM que posee el módulo.

Page 6: Taxímetro con Pic16F887

Derlis Hernández Lara

6

Figura 3.- Conjunto de instrucciones del módulo LCD.

Page 7: Taxímetro con Pic16F887

Derlis Hernández Lara

7

DESARROLLO:

Realizar un programa y circuito correspondiente que funcione como un taxímetro, el

cual aumenta la tarifa a cobrar cada 45 segundos o cada 250 metros.

Aumento por tiempo:

1° Para la parte de los 45 segundos, sabiendo que TMR1 puede contar hasta 65535 y

que además se conforma de dos registros TMR1H y TMR1L, se utiliza como

temporizador.

Se decide programar una temporización de 0.5 segundos (500 ms), que después será

ejecutada 90 veces para así tener una temporización total de 45 segundos utilizando un

cristal de 4 MHz como oscilador principal del microcontrolador.

Si el oscilador= 4 MHz; Tosc=0.25µs

Para alcanzar el valor necesario se utilizará el preescaler. Si lo colocamos a 1:8 se

obtendrá el valor deseado:

Retardo=4*Tosc*TMR1*Preescaler

Para calcular el valor a precargar en TMR1:

Retardo=4*0.25us * 62500*8

Retardo=500 ms

65535-62500=3035

Por lo tanto 3035 es el valor a precargar en TMR1 para lograr los 0.5 s. Se apoyó en el

bit de desborde del módulo timer 1 TMR1F. Si se cuenta 90 veces esta temporización se

logran los 45 segundos buscados, la programación y simulación se muestra a

continuación:

Figura 4.- Simulación de los 500 ms, al precargar TMR1 con 3035.

Page 8: Taxímetro con Pic16F887

Derlis Hernández Lara

8

Figura 5.- Código para el aumento por tiempo, cada 45 segundos la tarifa aumenta una

unidad.

Figura 6.- Simulación de los 45 segundos, al temporizar TMR1 con 500ms durante 90

ocasiones.

Los registros usados para configurar TMR1 serán descritos con mayor detalle más

adelante, ya que se volverá a usar este timer.

Page 9: Taxímetro con Pic16F887

Derlis Hernández Lara

9

Aumento por distancia:

Partiendo de ciertos datos se determinará a cuantos pulsos equivalen 250 metros, que es

la distancia a la cual la tarifa aumenta en una unidad. Para así poder configurar el TMR1

de manera correcta como contador de pulsos externos en el pin RC0.

2° Se sabe que la velocidad tangencial a la que circula el vehículo está relacionada con

el diámetro de sus ruedas, para saber la distancia recorrida no interesa por el momento

la velocidad, pero si el diámetro de la rueda. En la figura 7 se muestra un ejemplo de

cómo se obtiene el diámetro total de una llanta.

Figura 7.- Ejemplo de cómo obtener el diámetro total de una llanta.

Para este trabajo en específico se propone una rueda con un radio de 26 cm (.26 m),

luego entonces su diámetro es de 52 cm (.52 m), para saber cuántas vueltas debe dar esa

rueda para recorrer 250 m, solo se debe conocer su perímetro y este multiplicado por el

número de vueltas debe dar 250 m.

La rueda debe dar 153 vueltas para recorrer 250 m.

Ahora bien, hay que tener en cuenta cómo va a ser el sensor que estará midiendo las

vueltas de la rueda, se propone que el sensor sea óptico acoplado a una rueda dentada de

4 dientes, lo que significa que cada 4 pulsos obtenidos equivale a una vuelta completa

de la rueda.

Entonces: 153*4=612

Page 10: Taxímetro con Pic16F887

Derlis Hernández Lara

10

Se deben de contar 612 pulsos en RC0 para incrementar la tarifa en una unidad debido

al aumento por cada 250 m.

Para esto se configura TMR1 como contador de pulso externos en RC0. Los registros

involucrados son: INTCON, T1CON (figura 9), TMR1H, TMR1L y la interrupción

particular PIE1. El diagrama de bloques correspondiente a TMR1 se muestra en la

figura 8.

Como se necesitan contar 612 pulsos, el valor a precargar en TMR1 es:

Si bien es cierto que TMR1 es de 16 bits y puede contar hasta 65535, pensando en el

momento de enviar los datos al LCD para mostrar el monto a pagar, es más fácil

trabajar con 8 bits para la parte de la transformación del dato en código ASCII, por eso

se optó por solo trabajar con la parte baja del registro que es TMR1L y para poder

contar los 612 pulsos se tienes que usar el preescaler de 4, lo que indica que cada 4

pulsos aumentara un valor el registro TMR1.

612/4=153;

Luego entonces habrá que contar 153 en TMR1 para que se produzca el aumento

correspondiente.

Para lo cual TMR1L que es la parte baja de TMR1 sería precargado con:

255-153=102

Entonces los valores a precargar son:

TMR1H=255

TMR1L=102

Con esta configuración cada que se desborde TMR1 se generara una interrupción en

donde se incrementara la tarifa como corresponde. En la figura 10 se muestra el código

correspondiente a esta etapa.

Figura 8.- Diagrama a bloques del registro TMR1.

Page 11: Taxímetro con Pic16F887

Derlis Hernández Lara

11

Figura 9.- Registro para configurar TMR1 como contador.

Page 12: Taxímetro con Pic16F887

Derlis Hernández Lara

12

Figura 10.- Código correspondiente a la configuración de TMR1 como contador

para el incremento de la tarida por distancia (cada 250 m).

Mostrar tarifa en LCD:

Para enviar los datos que se desean mostrar en la LCD, se considera toda la explicación

teórica-practica comentada anteriormente.

3° Lo primero es decidir por qué puerto del PIC se enviaran los datos correspondientes

al LCD, para este caso se utiliza el puerto B para el bus de bidireccional de datos (DB0-

DB7) y el puerto E para las señales de control (RS, R/W y E). La configuración se

muestra en la siguiente figura 11.

Page 13: Taxímetro con Pic16F887

Derlis Hernández Lara

13

Figura 11.- Configuración de puertos para el control de LCD.

Ahora se necesitan rutinas que le indiquen al LCD que deseamos hacer, como encender

el LCD, posicionarlo en alguna celda en específico, indicarle que se mandara una

instrucción o un dato, enviar datos para su impresión en el LCD, actualizar la tarifa y

opción de cobre correspondiente, borrar pantalla, etc.; dichas rutinas se muestran a

continuación (figura 12).

Page 14: Taxímetro con Pic16F887

Derlis Hernández Lara

14

RETURN

Page 15: Taxímetro con Pic16F887

Derlis Hernández Lara

15

RETURN

Figura 12.- Subrutinas para gobernar el LCD.

Page 16: Taxímetro con Pic16F887

Derlis Hernández Lara

16

Para la parte de pintar el dato deseado en la pantalla, hay que recordar que el LCD

espera el codigo ASCII del carácter a pintar, por lo que si la mandas un número este

pintara el equivalente en ASCII a dicho número, para lo que hay que trasformar dicho

número a su equivalente en ASCII, existen varios metodos para realizar esto, en este

caso se propone trasformar el valor de la tarifa (8 bits) al sistema BCD y apartir de allí

obtener su equivalente en ASCII, la transformación a BCD se realiza mediante restas

sucesivas, para obtener el equivalente a ASCII se le suma 30 en hexadecimal, el codigo

correspondiente se muestra a continuación en la figura 13.

Figura 13.- Obtención del código ASCII para enviar al LCD.

Comentarios:

Existe un criterio para decidir cuándo se aumenta la tarifa por tiempo y cuando por

distancia, al cual se le llama velocidad critica.

Page 17: Taxímetro con Pic16F887

Derlis Hernández Lara

17

Hay tres formas básicas según las cuales se computa por tiempo o por distancia. Pero en

la mayoría de los casos el tiempo y la distancia están vinculados. Para la más común la

condición es la siguiente:

Para el caso de estudio:

Si aumenta $1.00 cada 45 s, en hora aumentará: 3600 s / 45 s= $80.00 cada hora.

Si aumenta $1.00 cada 250 m, en 250 m aumentará: 1000 m / 250 m= $4.00 cada Km.

Lo que indica que si el vehículo está avanzado a más de 20 Km/h el aumento deberá ser

por distancia de lo contrario será por tiempo.

Las tres formas de pasar a contar por tiempo o distancia son: manualmente (a través de

un botón), automáticamente al detenerse completamente el vehículo por más de un

determinado tiempo, o automáticamente a través de la velocidad de crítica (la más

utilizada).

La velocidad de crítica es la velocidad que marca el límite entre contar por tiempo, o

por distancia, según cobre más. Se calcula automáticamente a partir de los valores de

distancia y tiempo, y puede deducirse con una regla de tres.

Para saber a cuantos pulsos por segundo equivalen 20 Km/h, se parte de la expresión de

velocidad tangencial que se obtuvo (lo cual se pondrá más adelante):

Velocidad=3/2 (dato) (Km/h)

Dato: Pulsos por segundo

Luego entonces si sabemos a partir de 20Km/h se cobrara por distancia:

Lo que indica que si en un segundo contamos 14 pulsos de decide aumentar la tarifa por

distancia, de lo contrario será por tiempo.

Para este caso no se introdujo esta consideración en el proyecto y se estableció que la

selección de elegir una u otra opción fuera manual a través de un interruptor (que

también es correcta según la teoría), pero si se desea acoplar la decisión automática,

solo hay que contar cuantos pulsos se leen en un segundo y con base en ello decidir.

Page 18: Taxímetro con Pic16F887

Derlis Hernández Lara

18

Constante para el cálculo de velocidad:

Se propone un radio de rueda de 26 cm y una rudea con 4 muescas para la parte del

sensor (cada 4 pulsos detectados una vuelta completa de la rueda).

Dato=Pulsos por segundo

Page 19: Taxímetro con Pic16F887

Derlis Hernández Lara

19

3/2 multiplicado por dato sera el valor en Km/h calculados, según las consideraciones

anteriores.

Conclusiones:

Con la elaboración de este proyecto se desarrollaron las habilidades necesarias para

poder analizar y configurar aspectos básicos a la hora de usar un microcontrolador y sus

diferentes periféricos, se aplicaron los conceptos de contador, temporizador, manejo de

LCD etc., además de entender cómo funciona un taxímetro y las consideraciones físicas

que esto conlleva a la hora de diseñar uno, como lo son diámetro de la rueda, velocidad

angular, velocidad tangencial, frecuencia, etc.

La parte más laboriosa fue el control del LCD en ensamblador, pero una vez logrado

este objetivo se obtiene la destreza para enfrentar otros problemas que necesiten LCD,

sin necesidad de dedicar el mismo tiempo a su control. Además de que se reafirma que

los timer de los microcontroladores son una herramienta sumamente importante en la

solución de muchas necesidades y que es casi seguro que se encuentren en la mayoría

de las aplicaciones a realizar.

Nota: Se anexa el código completo en ensamblador del taxímetro diseñado y simulación

en Proteus (figura 14).

Referencias:

“PICmicro Mid-Range MCU Family Reference Manual”, Microchip rev/DS33023A,

December 1997.

“PIC16F887 Data sheet” Microchiop rev/30292c, 2001

“MAX232 Data sheet”, Texas Instruments, 2003.

HD44780U (LCD-II), Data sheet.

JHD162A SERIES, Data sheet.

“Como gobernar un display LCD alfanumérico basado en el controlador HD44780”,

José Ignacio Suárez Marcelo.

Page 20: Taxímetro con Pic16F887

Derlis Hernández Lara

20

Anexo:

; TAXÍMETRO CON OPCIÓN A ELEGIR AUMENTO DE TARIFA POR TIEMPO O POR DIDTANCIA:

; COMO CONFIGUARACION INICIAL (POR DEFAUL) ESTA EN OPCIÓN DE COBRAR POR TIEMPO, ORPIMIENDO UN

BOTON ; CAMBIARÁ A COBRO POR DISTANCIA.

; PROYECTO TAXIMETRO

PROCESSOR 16F887

INCLUDE P16F887.INC

TARIFA EQU 020 ; SE ASIGNA LA ETIQUETA TARIFA A LA LOCALDAD 20 EN LA MEMORIA

CONT EQU 021

;VARIABLES PARA EL RETARDO DEL ENABLE DE LA LCD

VAL1 EQU 022 VAL2 EQU 023

;VARIABLES PARA SEPARAR EL RESULTADO DE LA TARIFA EN VALOR BCD UNIDADES EQU 024

DECENAS EQU 025

CENTENAS EQU 026 RESTO EQU 027

ORG 0 ;SE INICIA A PARTIR DE LA DIRECCIÓN CERO EN LA MEMORIA DE PROGRAMA GOTO INICIO

ORG 4 GOTO INTER

INICIO ;______________________________________________________________________________

;LCD

;CONFIGURACIÓN DE PUERTOS BSF STATUS,RP0 ; BANCO 1

CLRF TRISE ; SE CONFIGURA COMO SALIDAS EL PUERTO E BSF STATUS,RP1 ; BANCO 3

MOVLW 01F; 0001 1111

MOVWF ANSEL BCF STATUS,RP1 ; BANCO 1

BCF STATUS,RP0 ; BANCO 0

MOVLW TRISD MOVWF FSR ; DIRECCIONAMIENTO INDIRECTO

;_______________________________________________________________________________

;PORTA COMO ENTRADA: PARA EL INTERRUPTOR DE SELECCIÓN EL MODO DE AUMENTO DE LA TARIFA

BSF STATUS,RP0 ;BANCO 1

MOVLW b'00111111' MOVWF TRISA

BSF STATUS,RP1; BANCO 3

CLRF ANSEL ;SE CONFIGURA DE MANERA DIGITAL BCF STATUS,RP0

BCF STATUS,RP1

;______________________________________________________________________________

;AUMENTO POR TIEMPO:

;_____________________________________________________________________________

MOVLW .8

MOVWF TARIFA

;INICIO DEL PROGRAMA:

INICIO1

CALL LCDON CALL IMPRIME_TARIFA

OPCION:

CALL ACTUALIZA_OPCION2 BTFSC PORTA,0

GOTO AUMENTO_DISTANCIA

Page 21: Taxímetro con Pic16F887

Derlis Hernández Lara

21

CALL AUMENTO_TIEMPO

CALL ACTUALIZA_TARIFA

GOTO OPCION

;AUMENTO DE TARIFA POR TIEMPO, CADA 45 SEGUNDOS AUMENTA $1 PESO AUMENTO_TIEMPO:

MOVLW .90

MOVWF CONT MOVLW 030 ; SE ELIGE EL PREESCALER DE TMR1 1:8

MOVWF T1CON

BCF PIR1,TMR1IF _45

CALL RETARDO

DECFSZ CONT,1 GOTO _45

TAR1

MOVLW .1

ADDWF TARIFA,F ; INCREMENTA LA TARIFA EN UNA UNIDAD CADA 45 SEGUNDOS

RETURN

RETARDO

BSF T1CON,TMR1ON ;HABÍLITA TMR1

MOVLW 00B ;11 MOVWF TMR1H ;SE INICIALIZA CON ESTOS VALORES, LOS REGISTROS DE TMR1 (3035)

MOVLW 0DB ;219

MOVWF TMR1L BSF T1CON,TMR1ON ;HABÍLITA TMR1

ESPERA BTFSS PIR1,TMR1IF

GOTO ESPERA

BCF T1CON,TMR1ON ;SE REINICIA LA BANDERA DE TMR1 PARA INICIAR EL PROCESO DE NUEVO BCF PIR1,TMR1IF

RETURN

;______________________________________________________________________________________

;AUMENTO POR DISTANCIA ;______________________________________________________________________________________

AUMENTO_DISTANCIA

CALL ACTUALIZA_OPCION BSF STATUS,RP0 ;BANCO 1

BSF PIE1,0 ;HABILITACIÓN PÁRTICULAR DE TMR1

BCF STATUS,RP0 ;BANCO 0

MOVLW B'11000000'

MOVWF INTCON ;HABILITACIÓN GLOBAL DE INTERRUPCIONES PARA EL DESBORDE DE TMR1 ;TMR1

MOVLW 0X27;'0010 0111'

MOVWF T1CON ; SE CONFIGURA TMR1 PARA CONTAR PULSOS EXTERNOS Y SE ENCIENDE

MOVLW .255

MOVWF TMR1H ; SE INICIALIZA CON LOS VALORES NECECITADOS MOVLW .103

MOVWF TMR1L

;TERMINA CONFIGURAIÓN TIMER

CONTEO GOTO CONTEO ;CICLO PARA REALIZAR EL CONTEO HASTA LA INTERRUPCIÓN

INTER ;LLAMADA A INTERRUPCIÓN

INCF TARIFA CALL ACTUALIZA_TARIFA

INCF PORTB BCF PIR1,TMR1IF

OPCION1:

BTFSS PORTA,0

GOTO OPCION

MOVLW .255

MOVWF TMR1H

Page 22: Taxímetro con Pic16F887

Derlis Hernández Lara

22

MOVLW .103

MOVWF TMR1L

RETFIE ;REGRESAR A DONDE SE PRODUJO LA INTERRUPCIÓN

;______________________________________________________________________________________ ;SUBRUTINAS LCD

;SUBRUTINA PARA COLOCAR EL CURSOR EN LA POSICIÓN DESEADA: POSICION1:

BCF PORTE,2 ; EL RS EN 0 INDICANDO UNA INSTRUCCION

BCF PORTE,1 ; EN 0 EL RW INDICANDO QUE ESCRIBIREMOS CLRF INDF ; EL PUERTO D COMO SALIDAS

MOVLW b'10001001'

MOVWF PORTD ; INSTRUCCION (SET THE DD RAM ADDRESS ), POSISION 9 DE LA FILA 1 CALL INSTRUCCION

BSF PORTE,2; MODO DATO

RETURN

POSICION2:

BCF PORTE,2 ; EL RS EN 0 INDICANDO UNA INSTRUCCION BCF PORTE,1 ; EN 0 EL RW INDICANDO QUE ESCRIBIREMOS

CLRF INDF ; EL PUERTO D COMO SALIDAS

MOVLW b'11001000' MOVWF PORTD ; INSTRUCCION (SET THE DD RAM ADDRESS ), POSISION 9 DE LA FILA 2

CALL INSTRUCCION

BSF PORTE,2; MODO DATO RETURN

;SUBRUTINA PARA ENCENDER LCD LCDON:

BCF PORTE,2 ; EL RS EN 0 INDICANDO UNA INSTRUCCION

BCF PORTE,1 ; EN 0 EL RW INDICANDO QUE ESCRIBIREMOS CLRF INDF ; EL PUERTO D COMO SALIDAS

MOVLW b'00111000'

MOVWF PORTD ; INSTRUCCION (FUNCTION SET)

CALL INSTRUCCION

MOVLW b'00001110'

MOVWF PORTD ; INSTRUCCION (LCDON) CALL INSTRUCCION

MOVLW b'00000110' ; SELECCIONA LA PRIMERA LÍNEA MOVWF PORTD

CALL INSTRUCCION ; SE DA DE ALTA EL COMANDO

MOVLW b'10000000' MOVWF PORTD ; INSTRUCCION (ENTRY MODE SET)

CALL INSTRUCCION

BSF PORTE,2; MODO DATO RETURN

;SUBRUTINA PARA ENVIAR INSTRUCCIONES

INSTRUCCION:

IINSTRUCCION:

BSF PORTE,0 ; EN CERO EL ENABLE CALL DELAY ;TIEMPO DE ESPERA

BCF PORTE,0 ;EN CERO EL ENABLE

RETURN

;SUBRUTINA DE RETARDO

DELAY: MOVLW 0X0F

MOVWF VAL2

CICLO: MOVLW 0X4F

MOVWF VAL1

CICLO2: DECFSZ VAL1,1

GOTO CICLO2

DECFSZ VAL2,1

GOTO CICLO

RETURN

;SUBRUTINA PARA IMPRIMIR EN LA LCD

IMPRIME_TARIFA:

Page 23: Taxímetro con Pic16F887

Derlis Hernández Lara

23

CALL ERASE_LCD ;LIMPIA LCD

MOVLW 'T' MOVWF PORTD

CALL ENVIA

MOVLW 'A' MOVWF PORTD

CALL ENVIA

MOVLW 'X' MOVWF PORTD

CALL ENVIA

MOVLW 'I' MOVWF PORTD

CALL ENVIA

MOVLW ' ' MOVWF PORTD

CALL ENVIA

MOVLW 'P'

MOVWF PORTD

CALL ENVIA

MOVLW 'O' MOVWF PORTD

CALL ENVIA

MOVLW 'R' MOVWF PORTD

CALL ENVIA

MOVLW ' ' MOVWF PORTD

CALL ENVIA

CALL FILA2

MOVLW 'T'

MOVWF PORTD CALL ENVIA

MOVLW 'A'

MOVWF PORTD

CALL ENVIA

MOVLW 'R'

MOVWF PORTD CALL ENVIA

MOVLW 'I' MOVWF PORTD

CALL ENVIA

MOVLW 'F' MOVWF PORTD

CALL ENVIA

MOVLW 'A' MOVWF PORTD

CALL ENVIA

MOVLW '=' MOVWF PORTD

CALL ENVIA

MOVLW '$' ;IMPRIME EL SIMBOLO "$" MOVWF PORTD

CALL ENVIA

CALL READ_TIEMPO ;LLAMADA A RUTINA QUE OBTINE EL

;VALOR DE LA TARIFA A PARTIR

;DEL RESULTADO DEL CONV A/D O DEL TIEMPO TRANSCURRIDO

MOVF CENTENAS,W ;IMPRIME EL DÍGITO DE LAS CENTENAS

MOVWF PORTD CALL ENVIA

MOVF DECENAS,W ;IMPRIME EL DÍGITO DE LAS DECENAS

MOVWF PORTD CALL ENVIA

MOVF UNIDADES,W ;IMPRIME EL DÍGITO DE LAS UNIDADES

MOVWF PORTD CALL ENVIA

MOVLW ' '

MOVWF PORTD

CALL ENVIA

MOVLW 'M'

MOVWF PORTD CALL ENVIA

MOVLW '.'

Page 24: Taxímetro con Pic16F887

Derlis Hernández Lara

24

MOVWF PORTD

CALL ENVIA

MOVLW 'N' MOVWF PORTD

CALL ENVIA

MOVLW '.' MOVWF PORTD

CALL ENVIA

RETURN

;SUBRUTINA PARA ACTUALIZAR SOLO EL MONTO A PAGAR:

ACTUALIZA_TARIFA: CALL POSICION2

CALL READ_TIEMPO ;LLAMADA A RUTINA QUE OBTINE EL

;VALOR DE LA TARIFA A PARTIR ;DEL RESULTADO DEL CONV A/D O DEL TIEMPO TRANSCURRIDO

MOVF CENTENAS,W ;IMPRIME EL DÍGITO DE LAS CENTENAS

MOVWF PORTD

CALL ENVIA

MOVF DECENAS,W ;IMPRIME EL DÍGITO DE LAS DECENAS MOVWF PORTD

CALL ENVIA

MOVF UNIDADES,W ;IMPRIME EL DÍGITO DE LAS UNIDADES MOVWF PORTD

CALL ENVIA

RETURN

ACTUALIZA_OPCION:

CALL POSICION1 MOVLW 'M'

MOVWF PORTD

CALL ENVIA MOVLW 'E'

MOVWF PORTD

CALL ENVIA

MOVLW 'T'

MOVWF PORTD

CALL ENVIA MOVLW 'R'

MOVWF PORTD CALL ENVIA

MOVLW 'O'

MOVWF PORTD CALL ENVIA

MOVLW 'S'

MOVWF PORTD CALL ENVIA

RETURN

ACTUALIZA_OPCION2:

CALL POSICION1

MOVLW 'T' MOVWF PORTD

CALL ENVIA

MOVLW 'I' MOVWF PORTD

CALL ENVIA

MOVLW 'E' MOVWF PORTD

CALL ENVIA

MOVLW 'M' MOVWF PORTD

CALL ENVIA

MOVLW 'P' MOVWF PORTD

CALL ENVIA

MOVLW 'O' MOVWF PORTD

CALL ENVIA

RETURN

;SUBRUTINA PARA ENVIAR DATOS

ENVIA:

BSF PORTE,2 ; EL RS EN 1 INDICANDO QUE ES UN DATO BCF PORTE,1 ; EN 0 EL RW INDICANDO QUE ESCRIBIREMOS

CLRF INDF ; EL PUERTO D COMO SALIDAS

Page 25: Taxímetro con Pic16F887

Derlis Hernández Lara

25

CALL INSTRUCCION

RETURN

;SUBRUTINA PARA CAMBIAR A LINEA2 DEL LCD

FILA2:

BCF PORTE,2 ; EL RS EN 0 INDICANDO UNA INSTRUCCION BCF PORTE,1 ; EN 0 EL RW INDICANDO QUE ESCRIBIREMOS

CLRF INDF ; EL PUERTO D COMO SALIDAS

MOVLW 0XC0 MOVWF PORTD ; INSTRUCCION (FUNCTION SET)

CALL INSTRUCCION;

RETURN

;RUTINA PARA LIMPAR PANTALLA LCD

ERASE_LCD: BCF PORTE,2 ; RS=0 MODO INSTRUCCION

BCF PORTE,1 ; EN 0 EL RW INDICANDO QUE ESCRIBIREMOS

CLRF INDF ; EL PUERTO D COMO SALIDAS

MOVLW 0X01 ; 0X01 LIMPIA LA PANTALLA EN EL LCD

MOVWF PORTD

CALL INSTRUCCION ; SE DA DE ALTA EL COMANDO BSF PORTE,2 ; RS=1 MODO DATO

RETURN

READ_TIEMPO:

CLRF CENTENAS ;SE LIMPIAN LOS REGISTROS PARA LA CONVERSIÓN BCD

CLRF DECENAS CLRF UNIDADES

MOVF TARIFA,W MOVWF RESTO ;GUARDA EL VALOR DE TMR1 EN RESTO

;BCD

;COMIENZA EL PROCESO DE OTENCIÓN DE VALORES BCD ;PARA CENTENAS, DECENAS Y UNIDADES ATRAVES DE RESTAS

;SUCESIVAS.

CENTENAS1

MOVLW D'100' ;W=D'100'

SUBWF RESTO,W ;RESTO - D'100' (W)

BTFSS STATUS,C ;RESTO MENOR QUE D'100'? GOTO DECENAS1 ;SI

MOVWF RESTO ;NO, SALVA EL RESTO INCF CENTENAS,1 ;INCREMENTA EL CONTADOR DE CENTENAS BCD

GOTO CENTENAS1 ;REALIZA OTRA RESTA

DECENAS1 MOVLW D'10' ;W=D'10'

SUBWF RESTO,W ;RESTO - D'10' (W)

BTFSS STATUS,C ;RESTO MENOR QUE D'10'? GOTO UNIDADES1 ;SI

MOVWF RESTO ;NO, SALVA EL RESTO

INCF DECENAS,1 ;INCREMENTA EL CONTADOR DE CENTENAS BCD GOTO DECENAS1 ;REALIZA OTRA RESTA

UNIDADES1

MOVF RESTO,W ;EL RESTO SON LA UNIDADES BCD MOVWF UNIDADES

;RUTINA QUE OBTIENE EL EQUIVALENTE EN ASCII

OBTEN_ASCII

MOVLW H'30' IORWF UNIDADES,F

IORWF DECENAS,F

IORWF CENTENAS,F RETURN

END

Page 26: Taxímetro con Pic16F887

Derlis Hernández Lara

26

Figura 14. Simulación del taxímetro en Proteus.