Académique Documents
Professionnel Documents
Culture Documents
Diseo e implementacin
de un taxmetro
Marco Torres, B16592
Microprocesadores
Escuela de Ingeniera Elctrica
Universidad de Costa Rica
Resumen
El problema inicial fue el diseo y la implementacin prctica de una aplicacin real utilizando un
microcontrolador HC12 de Freescale utilizando su lenguaje ensamblador. El taxmetro que se dise tena
que poder tasar el monto a pagar de dos formas, cuando el vehculo estuviera en movimiento (RUN) o
cuando estuviera en espera (WAIT) adems de poder configurar los parmetros de funcionamiento, los
cuales son el factor de conversin de las ruedas (para poder adaptar el taxmetro a cualquier vehculo) y los
precios por kilmetro recorrido y por minuto de espera.
El proyecto est bastante segmentado en subrutinas de propsito muy especfico, esto ayuda en gran
manera a entender el funcionamiento del mismo. Adems cada una de las subrutinas que se utilizaron
estn ampliamente explicadas mediante diagramas de flujo, sus parmetros de entrada y de salida y un
resumen de su funcionamiento.
Tambin el documento cuenta con una seccin de clculos, donde se detallan las decisiones de ciertos
valores que se utilizaron en el diseo, con una seccin de conclusiones y otra de recomendaciones con las
cuales se espera que ayuden al lector a entender mejor el trabajo y/o mejorar el diseo a futuro.
Una vez que se estructur el proyecto y se programaron y probaron cada una de las subrutinas por
aparte los resultados fueron prometedores. La aplicacin funcionaba de manera correcta tal y como se
esperaba.
I.
I.
Diseo de la aplicacin
Programa principal
El programa principal es la lnea que lleva al taxmetro a la ejecucin de cada uno de los
procesos que conforman los modos de operacin del mismo de forma secuencial y cclica. A pesar
de que est conformado por pocas subrutinas, nunca se ejecutan todas en un mismo modo de
operacin, sino que dependiendo de cmo est operando el taxmetro as se ejecutan unas u otras
subrutinas. Antes de discutir la estructura del programa se recomienda ver la figura 1, donde se
puede detallar su diagrama de flujo.
Las subrutinas que se vayan a ejecutar desde el programa principal dependen nicamente del
valor que tenga la variable ESTADO, esta indica el estado actual de la mquina. Al ejecutar el
programa por primera vez la variable tiene su valor inicial ($00) es cual corresponde al estado
LIBRE, este modo de ejecucin el programa se desva de l el primer bloque de interrogacin
TAX632
SP $3000
INIC
TAX_LAZO_1
TAX_SALTO_1
TAX_SALTO_2
ESTADO = 1
ESTADO = 0
ESTADO = 3
CONFIG
DIST_VEL
TAX_SALTO_3
TAX_DSP_1
MINUTO
BIN_BCD
LIBRE
PAGAR
SWTCH
TAX_DSP_2
BCD_7SEG
TAX_DSP_3
DESPLEGAR
II.
Se podra decir que el el taxmetro funciona fluida y constantemente gracias a las ISR, que se
ejecutan independientemente del programa principal u otras subrutina. En general son generadas
por perifricos pero otras como la ISR_RTI son vitales para la ejecucin de funcionalidades en
tiempo real o eventos que suceden dado un tiempo determinado.
II.1.
ISR_RTI
Esta subrutina se encarga de realizar tres tareas, las primeras dos son mutuamente excluyentes
y dependen del estado del taxmetro y la tercera se ejecuta siempre. En la figura 2 y 3 se muestra
el diagrama de flujo de esta subrutina. Todos los parmetros de entrada y salida se pasan por
medio de variables en memoria y se listan a continuacin.
Entrada:
ESTADO
R_OFF
TECLAS+N,
C_DIG
SUP_PTA
BFF_CANT,
KEY_TEMP
COL_MASK
BFF_TCL
SEG_CNT
C_OFF
BFF_TCL+1
SEG
SUP_PTH
KPD_LEIDO
SEG_CNT
C_DIG
SUP_PTH
BFF_TCL+N
SEG
CONT_DIG
OUT_STAT
CONT_DIG
Salida:
Lo primero que se hace al ser llamada la subrutina es saber en que estado esta pues las
primeras dos tareas son mutuamente excluyentes. Si el taxmetro no se encuentra en el estado
CONFIG (3) se ejecutan los bloques que estn en celeste (al lado derecho del diagrama) esta parte
simplemente cuanta segundos en una variable llamada SEG, cuando la subrutina se llama cierto
nmero de veces esta variable se incrementa y al llegar a 60 se reinicia.
La parte de color verde claro (al lado izquierdo) se encarga de leer el teclado matricial y
colocar las teclas ledas en el buffer de teclas, primero se aplica una mscara al puerto A y se
lee el puerto, de este modo los botones presionados aparecen como un cero en el patrn que se
lee. Luego se calcula el desfase correspondiente a las columnas con la subrutina COL_OFFSET,
adems se revisa si el patrn ledo tiene algn cero (lo que indica que se presione alguna tecla y
es distinto de $FF) si no hay ceros se procede calcular la siguiente mscara y revisar la siguiente
fila. En caso de que se encontrara un cero se debe proceder a rotar el patrn para encontrar
cual es el botn que se presione buscando el bit que sea igual a cero, cuando se encuentra este
bit se calcula el desfase correspondiente a las filas para as guardar el nmero ubicado a partir de la posicin TECLAS con el desfase de las columnas y filas, este nmero se guarda en el
buffer y si hubiese otro cero en el patrn tambin se debe guardar , esto para soportar el roll-over.
Una vez que se ejecuta alguna de las dos subrutinas mutuamente excluyentes se salta a el
punto SALTO_RTI_3 donde se cambia por medio de la variable CONT_DIG al pantalla o leds
que se debe encender, esto pasa cada dos interrupciones y este periodo lo maneja la variable
4
ISR_RTI
ESTADO 03
SALTO_RTI_1
SUP_PTA = 0
SUP_PTA (SUP_PTA) -1
SUP_PTA 10
PORTA (COL_MASK)
R1 (PORTA)
R1 (R1) OR $0F
SEG_CNT = 0
C (R1) 0
COL_OFFSET
C=0
J KEY_TEMP + (C_OFF)
R2 (J)
SEG_CNT
(SEG_CNT) -1
ROW_OFFSET
R1 = $FF
K TECLAS + (C_OFF) + (R_OFF)
R1 = R2
SEG_CNT 1000
SEG (SEG) + 1
R2 $FF
(BFF_CANT) = 0
R1 (J)
(J) $FF
R2 $04
(J) (R1)
BFF_TCL (K)
BFF_CANT 1
(BFF_CANT) = 1
SEG = 61
BFF_TCL+1 (K)
BFF_CANT 2
SEG 0
C (COL_MASK) 0
COL_MASK (COL_MASK) + 1
R2 (R2) - 1
COL_MASK =
$F7
R2 0
COL_MASK $FE
SALTO_RTI_3
C_DIG = 0
C_DIG 2
CONT_DIG (CONT_DIG)+1
OUT_STAT 1
C_DIG (C_DIG) - 1
CONT_DIG = 5
CONT_DIG 0
SUP_PTH = 0
SUP_PTH (SUP_PTH) - 1
ATD0CTL5 0
RETORNAR
II.2.
ISR_TC4
BRILLO
OUT_STAT
TC4
Salida:
CONT_TICS
TC4
OUT_STAT
ISR_TC4
CONT_TICS (CONT_TICS) + 1
CONT_TICS
BRILLO
CONT_TICS
20
OUT_STAT 1
CONT_TICS 0
OUT_STAT 0
PTP $FF
PTJ1 1
TC4_SALTO_2
TC4 (TC4) + 19
TC4_SALTO_1
RETORNAR
ISR_TC0
Esta subrutina se encarga de simular los pulsos generados por el sensor de proximidad del
taxi ubicado en las ruedas para medir las distancia recorrida y velocidad. Para esto se utiliza el
mdulo de tiempos en modo de comparacin de salidas (output compare) en el canal 0 el cual
ejecuta esta subrutina dado un tiempo predeterminado el cual es proporcional al valor ledo por
el convertidor analogico digital (ATD) cuya operacion se explica ms adelante.
El diagrama de flujo de esta subrutina se muestra en la figura 5.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
ESTADO
PUL_CNT
PULSOS
TC0
Salida:
PULSOS
PUL_CNT
TC0
ISR_TC0
ESTADO = 1
DEC_PUL_CNT
PUL_CNT = 0
PUL_CNT 500
PUL_CNT (PUL_CNT) -1
PULSOS
(PULSOS) +1
TC0_FIN
TC0 (TC0) +
(TC0_CARGA)
RETORNAR
ISR_ATD
La ISR_ATD sirve para realizar las conversiones analogico-digitales, cuando se llama calcula el
promedio de cuatro mediciones y lo guarda en la variable POT, luego dependiendo del interruptor
PTH7 se procede a cambiar la velocidad a la que incrementa la variable PULSOS o variar el brillo
de las pantallas y los led. En la figura 6 se puede ver el diagrama de flujo de esta subrutina.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
ISR_ATD
RR1 (ADR00H)
RR1 (RR1) + (ADR01H)
RR1 (RR1) + (ADR02H)
RR1 (RR1) + (ADR03H)
0 (RR1) 0
0 (RR1) 0
R1 (R1) + C
R2 (R2) + C
POT (RR1)
SET_BRILLO
PTH7 = 0
R1 20
R2 (POT) / 51
K (R1) - (R2)
ATD_FIN
ATD0CTL5 $87
RETORNAR
ADR01H
ADR02H
TC0_CARGA
ADR03H
Salida:
POT
Los acciones tomadas dentro de los bloques de asignacin luego del bloque de interrogacin
estn explicadas en las parte de clculos.
II.5.
ISR_PTH
Desde el punto de vista de mquina de estado la ISR_PTH actual como la lgica de prximo
estado, esta es la que en base al estado actual y al pulsador que fue presionado calcula el prximo
estado y reinicia las variable necesarias.En la figura 6 se puede ver el diagrama de flujo de esta
subrutina. Todos los parmetros de entrada y salida se pasan por medio de variables en memoria
y se listan a continuacin.
Entrada:
ESTADO
SUP_PTH
PIFH
ESTADO
KMR
A_PAGAR
SUP_PTH
ME
SEG
LED
PULSOS
KM_H.
Salida:
Antes de hacer cualquier cambio la subrutina debe de tomar en cuenta el supresor de rebotes
(SUP_PTH), si este no es cero se decrementa. Luego dependiendo del estado actual se considera
si se presionan o no alguno pulsadores; si el taxmetro est en LIBRE solo se cambia de estado si
se presiono el boton PTH0 o el PTH3, si est en RUN cambia de estado si se presion PTH1 o
PTH2, si est en WAIT cambia de estado si se presiono PTH0 o PTH2 y si est en CONFIG no
cambia de estado, esto porque salir del estado CONFIG le corresponde a otro subrutina.
Luego de saltar a los bloques de asignacin de cada estado nuevo se reinician las variables que
hagan falta.
10
ISR_PTH
SUP_PTH
(SUP_PTH) -1
SUP_PTH = 0
SUP_PTH 10
ESTADO = 0
ESTADO = 2
P_FIN
ESTADO = 1
PIFH0 = 1
S_RUN
PIFH0 = 1
PIFH3 = 1
PIFH2= 1
S_RUN
S_CFG
PIFH2 = 1
S_WT
S_LIB
P_FIN
S_LIB
PIFH3 = 1
P_FIN
S_LIB
S_WT
P_FIN
S_CFG
S_RUN
ESTADO $03
LEDS $04
ESTADO $01
LEDS $01
SEG $00
ESTADO 0
LEDS 0
KMR 0
ME 0
PULSOS 0
A_PAGAR 0
ESTADO $02
LEDS $02
SEG 0
KM_H 0
P_FIN
RETORNAR
11
III.
Subrutinas generales
En este captulo se detallan ampliamente cada una de las subrutinas generales, estas se suelen
llamar desde el programa principal o desde otras subrutinas generales. Estas se podran dividir por
funcionalidad; las subrutinas TECLADO, COL_OFFSET, ROW_OFFSET y BFF_CHECK estn
directamente relacionadas con el funcionamiento del teclado matricial de la tarjeta, las subrutinas
BIN_BCD, SWITCH y DESPLEGAR con el funcionamiento de la pantalla multiplexada mientras
que las dems corresponden al flujo de ejecucin del programa principal.
III.1.
INIC
Esta subrutina se ejecuta solo una vez al iniciar el programa, se encarga de guardar en las
variables de todo el programa los valores iniciales para que as sea seguro que el taxmetro inicie
en un estado conocido (LIBRE) y configurar los puertos con los cuales el procesador se comunica
con los perifricos.
A pesar de lo simple que parece si no se sigue cierto orden a la hora de configurar las variables
se puede inducir un error.
III.2.
LIBRE
Sin ms detalle las subrutina LIBRE solamente se encarga de colocar en las variables DIG los
valores en 7 segmentos de la palabra Libre para que as la subrutina desplegar muestre la palabra
en las pantallas. En la figura 8 se puede ver el diagrama de flujo de esta subrutina.
Los parmetros de salida se pasan por medio de variables en memoria y se listan a continuacin.
Salida:
DIG1
DIG2
DIG3
LIBRE
DIG2 (SEGMENT+12)
DIG1 (SEGMENT+13)
DIG4 (SEGMENT+10)
DIG3 (SEGMENT+11)
RETORNAR
DIG4
12
III.3.
CONFIG
Esta subrutina se encarga de solicitar al usuario los parmetros del taxmetro, el factor de
conversin (FC), el precio por kilmetro recorrido (KMR) y el precio por kilmetro de estera (PM),
adems rechaza los valores que no estn dentro del rango permitido.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
BCD1
CFG_CNT
INGRESOS
BCD_PRE
BCD2
ST_FLAG
FC_BCD
BIN_RES
BCD3
VALOR
PKM_BCD
BCD4
VALOR_DEF
PM_BCD
FC
PKM
Salida:
CFG_CNT
PM
Tanto los parmetros de entrada como los de salida son accesados por posiciones de memoria.
Antes de entrar en detalles se recomienda ver la figura 9 donde se muestra el diagrama de flujo de
esta subrutina.
En particular esta subrutina un poco diferente a las dems, esto porque es la nica (a parte de
la ISR_PTH) que puede modificar la variable ESTADO, adems se disearon subestados con
los cuales la subrutina CONFIG sabe cul parmetro est siendo solicitado y cuales ya fueron
solicitados. Esta subrutina trabaja junto con TECLADO pues cuando el taxmetro est en el modo
de configuracin la ISR_RTI est leyendo las teclas ingresadas por el usuario e ingresarlas a un
buffer y la subrutina TECLADO est convirtiendo estas teclas en el buffer en nmeros en BCD.
Como se puede ver en el diagrama lo primero que se hace es colocar en la variables BCD3
y BCD4 un $0F para que la subrutina desplegar apague las pantallas de la derecha porque los
parmetros son solo de dos dgitos. Luego se pregunta si la variable BCD2 es cero, porque si
asi es se debe tambin apagar la pantalla de este dgito igual que los anteriores. Despus se
llama la subrutina TECLADO, como se discutir luego est luego de que se presione la tecla E
pone el valor que hay en VALOR (valor dinmico que se muestra en pantalla) en VALOR_DEF
(valor definitivo ingresado), antes de validar en nmero ingresado se comprueba si es la primera
vez que se ejecuta esta subrutina desde que el taxmetro cambio de estado (para esto sirven la
variable ST_FLAG), de ser as se debe colocar en la variable VALOR el parmetro configurado
anteriormente y en los led el patrn correspondiente, la siguiente vez no ser necesario.
El siguiente paso es conocer si desde que se cambio de estado se ha presionado alguna tecla
del teclado matricial, para esto si VALOR_DEF tiene un $FF significa que no se ha presionado
y la subrutina salta al final mientras esto suceda. Una vez se presiona una tecla se pregunta en
que subestado se encuentra si CFG_CNT vale cero se est configurando FC, si vale uno se est
configurando el PKM y s vale dos PM, en general si el valor ingresado no est dentro del rango
de valores de cada parmetro se borra el nmero y se espera otro.
13
Cuando se recibe un nmero vlido se guarda este valor en su correspondiente variable en BCD
(FC_BCD, PMK_BCD y PM_BCD, se cambia el patrn de los led por el que indique el prximo
parmetro a configurar, se pone como valor dinmico a desplegar (VALOR) el valor anterior
del parmetro a configurar, se declaran ingresados dos nmeros, se borra el valor ingresado
anteriormente y se incrementa la variable CFG_CNT para indicar que se debe recibir el prximo
parmetro.
Al aceptar el ultimo parametro (PM) sucede algo diferente, se empiezan a convertir los
parmetros en BCD a hexadecimal utilizando la parte de la subrutina que tambin hace la primera
conversin, luego se retorna.
III.4.
TECLADO
Esta subrutina se encarga de leer las teclas ingresadas en el buffer y convertirlas en nmeros.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
KPD_LEIDO
BFF_TCL
ENTER
VALOR_DEF
BFF_CANT
BFF_TCL+1
VALOR
INGRESOS
VALOR_DEF
BCD1
BCD2
Salida:
VALOR
Como se mencion antes esta subrutina opera junto con la ISR_RTI, cuando el taxmetro est
en modo CONFIG la ISR_RTI lee las teclas ingresadas en el teclado matricial y las coloca en
un buffer de teclas que se encarga de manejar el roll-over. Luego la subrutina TECLADO lee lo
que hay en este buffer y lo convierte en valores numricos utilizando la tabla TECLAS. Vase su
diagrama de flujo en la figura 10.
Como no se est analizando la subrutina que llena el buffer con las TECLAS sino la subrutina
que lo vaca, para explicar el funcionamiento suponemos varios casos segn el estado del buffer y
los valores ingresados anteriormente. La variable KPD_LEIDO funciona como un protector de los
datos que se estn leyendo, para la subrutina no lea las teclas hasta que se hayan terminado de
ingresar o que no se ingresen datos mientras se estn leyendo, adems la subrutina BFF_CHECK
sirve para examinar el contenido de buffer buscando teclas especiales, en caso de que se ingrese
una B o una E se borra el buffer con la excepcin de que con la segunda se pone en alto la variable
ENTER para indicar que el valor ingresado en el que el que se debe procesar.
En caso de que el buffer est vaco o se haya vaciado antes (esto por BFF_CHECK) y si importar
los ingresos la subrutina salta a borrar el contenido del buffer, en caso de que hayan ingresos
pero el buffer est vaco sucede lo mismo al igual. El resultado cambia cuando hay uno o ningn
ingreso y el buffer tiene una o dos teclas, si no hubieran ingresos y el buffer tiene una tecla esta se
guarda en valor y se incrementa la variable INGRESOS, si fuesen dos teclas es necesario rotar el
primer nmero cuatro veces hacia la izquierda para ingresar el segundo, lo mismo sucede si hay
un ingreso y el buffer tiene un teclas.
14
CONFIG
C_1
C_2
SALTO_CONFIG_2
BCD4 $0F
BCD3 $0F
BCD2 == 0
C_2
SALTO_CONFIG_3
CFG_CNT == 1
BCD2 $0F
VALOR_DEF
<= $05
VALOR_DEF
<= $03
VALOR_DEF
>= $50
VALOR_DEF
>= $15
PKM_BCD VALOR_DEF
LEDS $24
PM_BCD VALOR_DEF
LEDS $00
VALOR PM_BCD
INGRESOS $02
ESTADO 0
CFG_CNT 0
CNF_CNT (CFG_CNT)+1
VALOR_DEF $FF
ST_FLAG 0
VALOR_DEF $FF
ST_FLAG 1
SALTO_CONFIG_0
TECLADO
ST_FLAG == 1
VALOR FC_BCD
INGRESOS $02
ST_FLAG 0
LEDS $84
SALTO_CONFIG_1
VALOR_DEF
== $FF
C_FIN
C_1
CFG_CNT == 0
FST_CONV
VALOR_DEF
<= $50
FST_CONV
VALOR_DEF
>= $60
FC_BCD VALOR_DEF
LEDS $44
BCD_PRE FC_BCD
BCD_BIN
BCD_BIN
PKM BIN_RES
BCD_PRE PM_BCD
FC BIN_RES
BCD_PRE PKM_BCD
BCD_BIN
VALOR PKM_BCD
INGRESOS $02
CNF_CNT (CFG_CNT)+1
VALOR_DEF $FF
ST_FLAG 0
PM BIN_RES
C_FIN
CONFIG_FIN
C_FIN
RETORNAR
15
TECLADO
KPD_LEIDO
0
KPD_LEIDO 0
BFF_CHECK
INGRESOS = 0
SALTO_KPD_1
INGRESOS = 1
BFF_CANT = 2
VALOR (BFF_TCL)
C (VALOR) 0
C (VALOR) 0
C (VALOR) 0
C (VALOR) 0
VALOR (VALOR) + (BFF_TCL + 1)
INGRESOS (INGRESOS +2)
SALTO_KPD_2
BFF_CANT = 0
BFF_CANT = 1
C (VALOR) 0
C (VALOR) 0
C (VALOR) 0
C (VALOR) 0
VALOR (VALOR) + (BFF_TCL)
INGRESOS (INGRESOS +1)
VALOR (BFF_TCL)
INGRESOS (INGRESOS +1)
BORRAR_BFF
BFF_CANT 0
BFF_TCL $-1
BFF_TCL + 1 $-1
BCD1 $0F
BCD2 $0F
SALTO_KPD_4
R1 (VALOR) (AND) $0F
BCD1 (R1)
ENTER 0
R1 (VALOR)
0 (R1) 0
0 (R1) 0
0 (R1) 0
0 (R1) 0
BCD2 (R1)
ENTER 0
INGRESOS
0
SALTO_KPD_3
VALOR 0
TECLADO_FIN
VALOR_DEF VALOR
INGRESOS 0
VALOR 0
RETORNAR
16
Figura 10: TECLADO | Diagrama de flujo.
La segunda parte de la subrutina no solo borra el buffer si no que depende del valor de ENTER
se guarda la variable VALOR en la variable VALOR_DEF para indicar que no ser modificada y
se borra el contenido de VALOR e INGRESOS, para este momento el contenido de VALOR_DEF
debe ser analizado por la subrutina CONFIG, de no ser vlido ser borrado. En el caso de que
ENTER ser cero VALOR debe ser puesto en pantalla, para esto se copian los primeros cuatro
bits (LSB) a la variable BCD1 y los ltimos cuatro bits (MSB) a BCD2.
Vale la pena recalcar que aunque se llame la subrutina TECLADO sea llamada esta solo puede
leer el contenido del buffer si la ISR_RTI se lo permite cambiando el contenido de KPD_LEIDO.
III.5.
COL_OFFSET
Esta subrutina se basa en la bascara que haya sido aplicada al puerto A al momento de ser
llamada para calcular el desfase pues los botones del teclado matricial se analizan por columnas.
III.6.
ROW_OFFSET
As como COL_OFFSET calcula el desfase de las columnas esta subrutina es calcula el desfase
correspondiente a las filas del teclado en la tabla TECLAS para ubicar el nmero correspondiente
a la tecla presionada. El parametro de entrada se pasa por el acomulador B y todos los parametros
de salida se pasan por medio de variables en memoria y se listan a continuacin.
Entrada:
Bits Rotados (Acomulador B)
Salida:
R_OFF
Vase la figura 12 para ver el diagrama de flujo de esta subrutina.
Como la subrutina TECLADO analiza cada columna de teclas por separado para analizar
los bits de las filas cuando se lee el patrn de una columna se rota para analizar las fila de
17
ROW_OFFSET
C (TEMP) 0
R2 (R2) + (TEMP)
R_OFF (R2)
R_OFF (R2)
R_OFF (R_OFF) -1
TEMP (R_OFF)
RETORNAR
(1)
18
III.7.
BFF_CHECK
El nico propsito de esta subrutina es revisar el buffer de teclas para indicar si se presiono la
tecla E o B. Vase la figura 13.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin. .
Entrada:
BFF_TCL
VALOR
BFF_TCL+1
INGRESOS
BFF_CANT
Salida:
INGRESOS
VALOR
ENTER
BFF_CHECK
BFF_TCL
$ 0B
BFF_TCL
= $ 0E
VALOR -1
B FF_CANT 0
BFF_TCL $-1
BFF_TCL + 1 $-1
INGRESOS 0
ENTER 1
BFF_TCL + 1
$ 0B
BFF_TCL + 1
= $ 0B
RETORNAR
19
III.8.
DESPLEGAR
CONT_DIG
DIG3
BRILLO
DIG1
DIG4
OUT_STAT
DIG2
LEDS
Puerto B
Puerto J1
Salida:
Puerto P
BIN_BCD
Esta subrutina toma convierte el valor en la posicin de memoria BIN y lo convierte a BCD
dividido en cuatro variables; BCD4, BCD3, BCD2 y BCD1 los cuales corresponden a cada dgito
de la pantalla.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se
listan a continuacin.
Entrada:
BIN
Salida:
BCD4
BCD3
BCD2
BCD1
20
DESPLEGAR
BRILLO 20 - K
OUT_STAT 0
CMP0
CONT_DIG = 0
PTJ1 1
PTP $FE
PORTB DIG4
CONT_DIG = 1
PTP $FD
PORTB DIG3
CONT_DIG = 2
PTP $FB
PORTB DIG2
CONT_DIG = 3
PTP $F7
PORTB DIG1
CONT_DIG = 4
PTJ1 0
PTP $FF
PORTB LEDS
CMP1
CMP2
CMP3
CMP4
DESPLEGAR_FIN
RETORNAR
BIN_BCD
RR1 BIN
J 15
BCD 0
RR1 (TEMP_A)
J (J) - 1
LAZO_BCD_2
J= 0
C RR1 0
C BCD C
C RR1 0
C BCD C
TEMP_A (RR1)
RR1 BCD (AND) $000F
RR1 (RR1) + 3
SALTO_BCD_1
LL (RR1)
BCD (BCD) + $F00
HM (RR1)
RR1 BCD (AND) $00F0
RR1 BCD (AND)
$F000
SALTO_BCD_4
C BCD 0 X4
RR1 BCD (AND) $000F
BCD2 (RR1)
LM (RR1)
BCD (RR1)
BCD (BCD) + (HM)
BCD (BCD) + (LM)
BCD (BCD) + (LL)
C BCD 0 X4
RR1 BCD (AND) $000F
BCD3 (RR1)
C BCD 0 X4
RR1 BCD (AND) $000F
BCD4 (RR1)
RETORNAR
III.10.
BCD_BIN
De modo opuesto a la subrutina BIN_BCD, BCD_BIN convierte un nmero en BCD a hexadecimal. Vase el diagrama de flujo de esta subrutina en la figura 16.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
BCD_PRE
Salida:
BIN_RES
BCD_BIN
R1 (BCD_PRE)
C0
0 (R1) 0
0 (R1) 0
0 (R1) 0
0 (R1) 0
TEMP_A (R1)
R2 9
LAZO_BB1
R1 (R1) + (TEMP_A)
R2 (R2) - 1
R2 = 0
R2 (BCD_PRE)
R2 (R2) (AND) ($0F)
R1 (R1) + (R2)
BIN_RES (R1)
RETORNAR
23
Esta subrutina utiliza un algoritmo muy simple que se basa en multiplicar por diez el cuarteto
superior y sumar el cuarteto inferior. Para esto el programa toma el nmero en BCD y lo rota a
la derecha cuatro veces, as solo quedar el cuarteto superior. Luego se guarda en un temporal
para ser sumado diez veces en el acomulador B y finalmente con la ayuda de una mscara ($0F)
se toma el cuarteto inferior y se le suma al nmero calculado anteriormente. Este nmero queda
almacenado en la variable BIN_RES.
III.11.
MINUTO
Esta subrutina sirve para calcular los minutos de espera cuando el taxmetro entra al modo
WAIT. Vase en la figura 17 el diagrama de flujo de esta subrutina.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
ME_FLAG
SEG
ME
Salida:
ME_FLAG
ME
Para contar minutos esta subrutina se vara en la variable de la ISR_RTI SEG, se asume que
cuando SEG llega a 59 ha pasado un minuto. Pero como es muy posible que esta subrutina sea
llamada ms de una vez durante un segundo se coloca una variable llamada ME_FLAG la cual
permite que incrementen los minutos de espera ME solo cuando est en uno. Adems como el
taxmetro slo debe ser capaz de contar hasta 200 minutos cuando la variable ME llega a este
nmero se reinicia y empieza a contar desde cero.
III.12.
DIST_VEL
Esta subrutina sirve para calcular los kilmetros recorridos y la velocidad actual basndose en
el factor de conversin (FC) y los pulsos acomulados (PULSOS). Vase en la figura 18 el diagrama
de flujo de esta subrutina.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
FC
PULSOS
TC0_CARGA
Salida:
KMR
KM_H
A pesar de que el diagrama de flujo se vea un poco sencillo es importante notar que toda la
subrutina son solamente dos asignaciones, ambas se detallan bien en la parte de clculos.
24
MINUTO
ME_FLAG = 0
SEG <= 59
ME (ME) +1
ME >= 200
ME 0
MINUTO_FIN
RETORNAR
25
DIST_VEL
DIST_VEL
PAGAR
La subrutina PAGAR se utiliza para calcular el monto que debe cancelar el usuario al llegar a
su destino, est directamente relacionado a los kilmetros recorridos y a los minutos de espera.
En la figura 19 se puede detallar su diagrama de flujo. Todos los parmetros de entrada y salida
se pasan por medio de variables en memoria y se listan a continuacin.
Entrada:
PM
ME
KMR
PKM
Salida:
A_PAGAR
Lo primero que hace la subrutina es calcular el monto a pagar por los minutos de espera, esto
lo almacena en la variable TEMP_A. Luego depende del valor de KMR, si este es menor a dos
se debe cobrar solamente el primer kilmetro, si es mayor o igual a dos se debe cobrar el primer
kilmetro (est siempre vale 10) y los kilmetros recorridos en base al precio por kilmetro (PKM).
Finalmente se suma al monto correspondiente a los kilmetros recorridos el monto de minutos de
espera almacenado en la variable TEMP_A y se almacena en la variable A_PAGAR.
26
PAGAR
KMR <= 1
PAGAR_
SALTO_1
R2 (KMR) -1
RR1 0
RR1 (R2) *PKM
PAGAR_SALTO_2
A_PAGAR (R1) +
TEMP_A + 10
RETORNAR
27
III.14.
SWITCH
Esta subrutina sirve para cambiar el valor a ser desplegado en las pantallas, cada 15 segundos
cambia entre el monto a pagar y el dato de inters. El la figura 20 se puede observar el diagrama de
flujo de esta subrutina. Todos los parmetros de entrada y salida se pasan por medio de variables
en memoria y se listan a continuacin.
Entrada:
SEG
ESTADO
ME
KM_H
Salida:
BIN
LEDS
SWITCH
SEG <= 15
SEG >= 30
SEG <= 45
DISP_COBRO
ESTADO = $01
BIN A_PAGAR
DISP_RUN
BIN ME
BIN KM_H
RETORNAR
IV.
Clculos
1
= 1,024ms
8 106
(2)
Para el contador de segundos de utilizar el tiempo de la interrupcin RTI, por lo que se tiene
que dado numero de interrupciones RTI se cumplira un segundo.
Tseg = Trti A = 1,024ms 977 = 1, 000448s
(3)
Ttc4 = B
1
1
128 = 0,10133ms
= 19
oscClock
24 106
(4)
Este tiempo se configura de esta forma para que al usar 20 tics en el contador se cumpla la
frecuencia deseada.
f mux =
1
= 493,42Hz = 98,68Hz/digito led
Ttc4 20
(5)
Finalmente para obtener la velocidad del vehculo se utilizan las siguiente ecuaciones.
s = r =
v = r =
1
1
KMR
=
= 2r r =
PULSOS
FC
2FC
1
2
1
m
r
=
=
[ ]
t
2FC TC0_CARGA
FC TC0_CARGA s
km
1350000
=
[ ]
FC TC0_CARGA h
(6)
(7)
(8)
29
II.
Conclusiones y Comentarios
Una de las ventajas del proyecto y que valdra la pena establecer como una prioridad para
futuros proyectos es la modularidad con la que se dise desde un principio la aplicacin, esto no
solo ayud a ir agregando ms funcionalidades sino tambin a solucionar los problemas que iban
apareciendo.
Tambin sera importante destacar que el amplio uso del microcontrolador que se utiliz ayud
a la bsqueda de informacin necesaria para implementar el diseo adems del gran potencial de
esta plataforma pues es una de las ms completas en su nicho.
En general los diagramas de flujo explican muy bien una idea de lo que quiere que haga un
programa, pero cuando a estos se les agrega rigurosidad en cuanto a su notacin y formalismo se
vuelven una poderosa herramienta sobre la cual se puede trabajar en cualquier sistema. Desde
programacin de alto nivel hasta bajo nivel.
III.
Recomendaciones
Como primera recomendacin estara la importancia de tener una idea clara o un plan de
trabajo concreto de cmo se llevar a cabo la aplicacin. Esto ayudar con el paso del tiempo y
conforme avance el proyecto a evaluar resultados y tomar otras decisiones que mantengan los
objetivos del mismo.
Aunque no es vital es importante que en todo momento haya congruencia entre los diagramas
de flujo de los programas y el cdigo de los mismos, as cuando haya que corregir errores ser
ms sencillo ubicar primero la falla en el diagrama y luego buscarlo en el cdigo.
Tan importante como el plan de trabajo para el desarrollo del proyecto es tener un plan de
pruebas que ayude a validar cada mdulo por aparte y aunque no se pueden predecir siempre les
falla a la hora de unir todos los mdulos el verificar cada uno por aparte ayudar a evitar errores
mas grandes.
30