Você está na página 1de 30

Proyecto final Julio 2015 Microprocesadores

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

Proyecto final Julio 2015 Microprocesadores

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

Figura 1: Programa principal | Diagrama de flujo.

Proyecto final Julio 2015 Microprocesadores

llamando a la subrutina LIBRE y saltando al conector TAX_DSP_3, luego se llama la subrutina


DESPLEGAR para mostrar en las pantallas el mensaje Libr que indica que el taxmetro est en
modo de espera y se vuelve al punto inicial TAX_LAZO_1.
Cuando la variable ESTADO es $03 el programa se encuentra en el modo CONFIG en el
que se le pregunta al usuario por los parmetros del taxmetro. Del diagrama se puede observar que en el segundo bloque de interrogacin el programa llama la subrutina CONFIG con
la cual el usuario ingresa los parmetros que desee, como estos parmetros se almacenan como variables en binario es necesario convertirlas a sus valores correspondientes en 7 segmentos
por lo que luego se salta al conector TAX_DSP_2 y se llama la subrutina BCD_7SEG y DESPLEGAR para mostrar en las pantallas los valores ingresados y se vuelve de nuevo al punto inicial.
Tanto si la variable ESTADO vale $01 o $02 el programa no vara sino hasta el tercer bloque
de interrogacin, aqu se llama la subrutina MINUTO (para WAIT) o DIST_VEL (para RUN)
dependiendo de si el taxi est en movimiento o en espera. Luego de esto se ejecutan las mismas
subrutinas de PAGAR para calcular el monto a cancelar, SWITCH para alternar los valores a
mostrar en la pantalla y BIN_BCD para convertir los valores a BCD, BCD_7SEG y DESPLEGAR
para mostrar los valores de inters para el usuario.
En las secciones siguientes se explican ms a fondo cada una de las subrutinas de atencin
a interrupciones (ISR por sus siglas en ingls) y posteriormente las subrutinas generales que se
citaron anteriormente.
Es de suma importancia que se entienda que las subrutinas de atencin a interrupciones se
ejecutan constantemente iniciadas por un evento ajeno al programa principal sin importar donde se
encuentre este y que tanto el programa principal como las subrutinas de atencin a interrupciones
o las generales llaman otras subrutinas generales o modifican valores que cambiarn el modo de
operacin del taxmetro. Tambin vale la pena mencionar que por la naturaleza del programa
principal este no recibe parmetros.

Proyecto final Julio 2015 Microprocesadores

II.

Subrutinas de servicio de interrupciones (ISR)

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

Proyecto final Julio 2015 Microprocesadores

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

Figura 2: ISR_RTI | Diagrama de flujo 1.

Proyecto final Julio 2015 Microprocesadores

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

Figura 3: ISR_RTI | Diagrama de flujo 2.


C_DIG, luego se decrementa la variable SUP_PTH en caso de que no sea cero, esta suprime los
rebotes en los pulsadores conectados al puerto H.
Finalmente se procede a modificar el registro ATD0CTL5 para que inicie el proceso de conversion analogico digital.

II.2.

ISR_TC4

La subrutina ISR_TC4 se encarga nicamente de multiplexar las pantallas 7 segmentos o leds


para poder utilizar el mismo bus de datos al mostrar los valores de inters del usuario y controlar
el brillo de los mismo. El nivel de intensidad en las pantallas o leds est determinado por el
tiempo que pasen encendidas y apagadas en cada iteracin al desplegar un valor. Vase en la
figura 4 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:
CONT_TICS

BRILLO

OUT_STAT

TC4

Proyecto final Julio 2015 Microprocesadores

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

Figura 4: ISR_TC4 | Diagrama de flujo.


Esta subrutina genera lo que se podran llamar tics, cada vez que se llama se incrementa la
variable llamada CONT_TICS, cuando es igual a la variable BRILLO se apagan las pantallas y
los leds y se pone en cero la variable OUT_STAT para indicar que no se deben encender de nuevo
hasta que CONT_TICS llegue a 20, cuando esto sucede se reinicia CONT_TICS y se habilita
encender las pantallas o leds. Finalmente se suma al registro TC4 19, para que la interrupcin
vuelva a ser llamada en el tiempo preestablecido, este tiempo se detalla en la seccin de clculos.
II.3.

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

Proyecto final Julio 2015 Microprocesadores

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

Figura 5: ISR_TC0 | Diagrama de flujo.


Esta subrutina se encarga de simular el sensor de proximidad ubicado en las ruedas, por lo
cual el ltimo bloque del diagrama de flujo corresponde a asignar TC0_CARGA como el tiempo
para la prxima interrupcin, este valor est determinado por el que se lee en el PAD7 que se
convierte en la ISR_ATD, fuera de esto solamente debe de incrementar la variable PULSOS cada
500 interrupciones cuando el taxmetro est en el estado RUN de lo contrario la subrutina salta al
final.
II.4.

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.

Proyecto final Julio 2015 Microprocesadores

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)

RR1 (POT) +200


TC0_CARGA (RR1)

ATD_FIN
ATD0CTL5 $87

RETORNAR

Figura 6: ISR_ATD | Diagrama de flujo.


Entrada:
ADR00H

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.

Proyecto final Julio 2015 Microprocesadores

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

Proyecto final Julio 2015 Microprocesadores

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

Figura 7: ISR_PTH | Diagrama de flujo.

11

Proyecto final Julio 2015 Microprocesadores

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

Figura 8: LIBRE | Diagrama de flujo.

12

Proyecto final Julio 2015 Microprocesadores

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

Proyecto final Julio 2015 Microprocesadores

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

Proyecto final Julio 2015 Microprocesadores

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

Figura 9: CONFIG | Diagrama de flujo.

15

Proyecto final Julio 2015 Microprocesadores

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.

Proyecto final Julio 2015 Microprocesadores

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

La funcin principal de esta subrutina es calcular el desfase correspondiente a las columnas


del teclado en la tabla TECLAS, esto para poder ubicar el nmero correspondiente a la tecla
presionada.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
COL_MASK
Salida:
C_OFF
Vase la figura 11 para ver el diagrama de flujo de esta subrutina.

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

Proyecto final Julio 2015 Microprocesadores

Figura 11: COL_OFFSET | Diagrama de flujo.

ROW_OFFSET

C (TEMP) 0
R2 (R2) + (TEMP)
R_OFF (R2)

R_OFF (R2)
R_OFF (R_OFF) -1
TEMP (R_OFF)

RETORNAR

Figura 12: ROW_OFFSET | Diagrama de flujo.


esta columna. El nmero de veces que se ha rotado queda almacenado en el acomulador B y
es importante porque indica en qu fila est actualmente. Al momento de llamar la subrutina
ROW_OFFSET el desfase se calcula utilizando la asignacin 1, pues en la memoria los valores
de las teclas estn almacenados linealmente (cuando acaba una fila empieza con la siguiente de
izquierda a derecha).
R_OFF [( B) 1] 3

(1)

18

Proyecto final Julio 2015 Microprocesadores

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

Figura 13: BFF_CHECK | Diagrama de flujo.


En caso de que el buffer tenga un $0B (ya sea en BFF_TCL o en BFF_TCL+1) se debe borrar el
buffer, en caso de que tenga un $0E (ya sea en BFF_TCL o en BFF_TCL+1) se debe poner un uno
en la variable ENTER, esto le indicar a la subrutina TECLADO que las el nmero en la variable
VALOR debe ser procesado.

19

Proyecto final Julio 2015 Microprocesadores

III.8.

DESPLEGAR

La subrutina DESPLEGAR se encarga de multiplexar los datos de inters en las pantallas y


los leds pero la ISR_TC4 es la que modifica las variables OUT_STAT y CONT_DIG que son las
que dictan cuando se deben encender las pantallas o leds y cual pantalla o led se debe encender.
Todos los parmetros de entrada y salida se pasan por medio de variables en memoria y se listan
a continuacin.
Entrada:
K

CONT_DIG

DIG3

BRILLO

DIG1

DIG4

OUT_STAT

DIG2

LEDS

Puerto B

Puerto J1

Salida:
Puerto P

En la figura 14 se muestra el diagrama de flujo de la subrutina DESPLEGAR.


Para la subrutina las variable OUT_STAT actual como un habilitador, esto porque una vez
que la ISR_TC4 apaga las pantallas o leds esta no debe volver a encenderlos por lo que es la
ISR_TC4 la que controla esta variable. Luego simplemente el programa dependiendo del valor de
CONT_DIG as ser la pantalla que encienda, en caso de que sea menor a cuatro se apagan los
leds, en el puerto P se pone la mscara adecuada para encender la pantalla deseada y se copia al
puerto B el valor que corresponde a esa pantalla. En caso de que CONT_DIG sea cuatro se apagan
todas las pantallas y se encienden los leds pero esta vez se copia la variable LEDS al puerto B.
III.9.

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

En la figura 15 se puede ver el diagrama de flujo de esta subrutina.

20

Proyecto final Julio 2015 Microprocesadores

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

Figura 14: DESPLEGAR | Diagrama de flujo.


21

Proyecto final Julio 2015 Microprocesadores

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 BCD (AND) $000F


BCD < $10

RR1 >= $0005

RR1 >= $0500

BCD (BCD) + $F0

RR1 (RR1) + 3
SALTO_BCD_1

RR1 (RR1) + $300


SALTO_BCD_3

BCD < $100

LL (RR1)
BCD (BCD) + $F00
HM (RR1)
RR1 BCD (AND) $00F0
RR1 BCD (AND)
$F000

BCD < $1000

RR1 >= $0050


BCD (BCD) + $F000
RR1 >= $5000
RR1 (RR1) + $30
SALTO_BCD_2

RR1 (RR1) + $3000

RR1 BCD (AND) $000F


BCD1 (R2)

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

Figura 15: BIN_BCD | Diagrama de flujo.


22

Proyecto final Julio 2015 Microprocesadores

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

Figura 16: BCD_BIN | Diagrama de flujo.

23

Proyecto final Julio 2015 Microprocesadores

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

Proyecto final Julio 2015 Microprocesadores

MINUTO

ME_FLAG = 0

SEG <= 59

ME (ME) +1

ME >= 200

ME 0

MINUTO_FIN

RETORNAR

Figura 17: MINUTO | Diagrama de flujo.

25

Proyecto final Julio 2015 Microprocesadores

DIST_VEL

KMR (PULSOS) / (FC)

KM_H 1350000 / [(FC)*(TC0_CARGA)]

DIST_VEL

Figura 18: DIST_VEL | Diagrama de flujo.


III.13.

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

Proyecto final Julio 2015 Microprocesadores

PAGAR

TEMP_A (PM) * (ME)

KMR <= 1

PAGAR_
SALTO_1
R2 (KMR) -1
RR1 0
RR1 (R2) *PKM
PAGAR_SALTO_2

A_PAGAR (R1) +
TEMP_A + 10

RETORNAR

Figura 19: PAGAR | Diagrama de flujo.

27

Proyecto final Julio 2015 Microprocesadores

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

Figura 20: SWITCH | Diagrama de flujo.


Esta subrutina se basa en el valor que tenga la variable SEG, si esta es menor que 15 o mayor
a 30 pero menor a 45 el valor a ser desplegado en las pantallas ser A_PAGAR pero si SEG es
mayor a 45 o mayor a 15 pero menor a 30 de deben a desplegar el dato de inters, este ltimo se
elige en base al estado en el que se encuentre el taxmetro, si est en RUN se muestra KM_H pero
si este en WAIT se muestra ME.
28

Proyecto final Julio 2015 Microprocesadores

IV.

Clculos

Para el tiempo de interrupcin de la subrutina de atencin a interrupciones RTI se necesita 1


ms, por lo cual se toman los parmetros N = 74 y M = 1.
Trti = [( N + 1) 2 M+9 ]

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)

Para la interrupcin TC4 se toma un numero para mantener la frecuencia de multiplexacin en


100Hz / digito-led.

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

Proyecto final Julio 2015 Microprocesadores

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

Você também pode gostar