Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Reloj12h Flujograma PDF
Reloj12h Flujograma PDF
; Valores de constantes:
FRAC_INI D'12' ; Constante para inicio cuenta de fracciones de
; segundo
SEGS_INI D'196' ; Constante para inicio cuenta de segundos
MINS_INI D'196' ; Constante para inicio cuenta de minutos
HORS_INI D'244' ; Constante para inicio cuenta de horas
HORS_12H D'243' ; Constante para inicio cuenta de horas
; HORS_12H se utiliza para el clculo de las horas a mostrar.
; Si nos encontramos a las 1:00 la variable "horas" ser igual a HORS_INI (244) y el
; clculo para mostrar la hora ser:
; Hora display = horas - HORS_12H = 244 - 243 = 1
; Si son las doce, la variable "horas" ser igual a 255 de manera que se mostrar:
; Hora display = horas - HORS_12H = 255 - 243 = 12
ADJMIN D'9' ; Nmero de "frac_sec" que se necesita sumar cada
; minuto para ajustar el tiempo
ADJHOR D'34' ; Nmero de "frac_sec" que se necesita restar cada
; hora para ajustar el tiempo
ADJDIA D'3' ; Nmero de "frac_sec" que se necesita sumar cada
; 12 horas para ajustar el tiempo
;Ajustes:
; Un "frac_sec" es aproximadamente 1 / 244 s
; 1 MHz / 16 = 62.500 Hz ; 62.500 Hz / 256 = 244,140625 Hz ; T = 0,004096 s
; 0,004096 s * 244 = 0,999424 s; dif 1 segundo = -0,000576 s
; 1 "minuto" = 0,999424 s * 60 = 59,96544 s
; 60 s - 59,96544 s = 0,03456 s ; 0,03456 s / 0,004096 s = 8,4375
; 1 "minutoadj" = 59,96544 s + (0,004096 s * 9) = 59,96544 s + 0,036864 s = 60,002304 s
; 1 "hora" = 60,002304 s * 60 = 3600,13824 s
; 3600 s - 3600,13824 s = -0,13824 s ; -0,13824 s / 0,004096 s = -33,75 s ___________
; 1 "horaadj" = 3600,13824 s - (0,004096 s * 34) = DISPLAY DECENA MIN / DECENA SEG -> RA,2 -|1 \__/ 18|- RA,1 <- DISPLAY UNIDAD HR
; = 3600,13824 s - 0,139264 s = 3599,998976 s DISPLAY UNIDAD MIN / UNIDAD SEG -> RA,3 -|2 17|- RA,0 <- DISPLAY DECENA HR
; 12 "horas" = 3599,998976 s * 12 = 43199,987712 s NC -|3 16F84A 16|- XT
; 43200 s - 43199,987712 s = 0,012288 s ; 0,012288 s / 0,004096 s = 3 MCLR/ -|4 15|- XT
; 12 "horasadj" = 43199,987712 s + 0,004096 s * 3 = GND -|5 14|- Vcc
; = 43199,987712 s + 0,012288 s = 43200 s PUNTO dp -> RB,0 -|6 13|- RB,7 -> SEGMENTO g
PUL A (SEG) / SEGMENTO a -> RB,1 -|7 12|- RB,6 -> SEGMENTO f
; Activacin de RB1-3 para las entradas de los pulsadores PUL B (MIN) / SEGMENTO b -> RB,2 -|8 11|- RB,5 -> SEGMENTO e
PULSADOR B'00001110' ; RB1, RB2 y RB3 PUL C (HOR) / SEGMENTO c -> RB,3 -|9________10|- RB,4 -> SEGMENTO d
; Asignacin de banderas. Los pulsadores activos proporcionan un "1" PORTA, control displays 7 segmentos de ctodo comn
CHG H'03' ; Indica que se ha activado un pulsador o que es PORTB, segmetos de los displays, led separadores, pulsadores como entrada
; necesario actualizar los valores de la hora que tienen
; que mostrarse en los displays El pulsador A (conectado a RB1) muestra el segundero en tanto permanezca presionado.
PSEG H'04' ; Pulsador A, modo segundero. El pulsador B (conectado a RB2) avanza rpidamente los minutos.
PMIN H'05' ; Pulsador B, avance rpido minutos. El pulsador C (conectado a RB3) avanza rpidamente las horas.
PHOR H'06' ; Pulsador C, avance rpido horas.
P_ON H'07' ; Un pulsador ha sido activado
TMR0_LLENO
NO SI RB0 = 1
frac_sec = 0
frac_sec = FRAC_INI (12d) Comprueba variables pulsadores
frac_sec = 0, se ha contado 1 segundo
(0,999424 s)
COMPROBAR_PUL
El programa pasa por aqu cada 4,096
ms, esto es unas 244 veces por segundo No hay pulsadores activados
P_ON = 1
NO
Se comprueba si se activo el
pulsador de segundos (Pul A) para
Si no se han activado pulsadores ni ha cambiado la COMPROBAR_SEG mostrar los segundos en el display
hora se salta a DISPLAY_PUL, que principalmente
refresca uno de los displays cada vez que se accede
a ella y escanea pulsadores.
SI NO
PSEG = 1
SI CHG = 1 Este cdigo copia los bits del literal SEGM_OFF que
RB1 = 1 PSEG= 1 se quieran en PORTB, Se copiaran aquellos bits de
P_ON = 1 SEGM_OFF cuya posicin coincida con un 1 en la
mscara que se utiliza con la funcin AND y se
NO
respetaran los valores de los bits PORTB que
coincidan con un 0 en la mscara. En este caso
SEGM_OFF = 00H y en la operacin AND se utiliza
B'11111110' con lo que en PORTB se respetar el
COMPROBAR_PMIN valor de RB0 y se pondrn a cero el resto de bits.
Display es SI
w = digito1
XXXX 0XXX
NO
PRINCIPAL Pag. 2
Divide los segundos o los minutos y las
DIV_DIGITOS horas en digitos independientes, ejemplo,
[14] lo pasa a [1]-[4]
LOOP
El puntero apunta a la
primera posicin de las
Incf FSR,F decenas
Incf INDF,F Se aade 1 a las decenas
Averiguar cuantas decenas Decf FSR,F Se restaura el valor de INDF
INDF = INDF - 10 hay en el nmero. El nmero para la prxima resta hasta
menos diez en cada bucle. que se termine
CARRY = 1 SI
Se comprueba "CARRY",
NO que se pone a 1 si en la
resta no se ha producido
llevada
Si C = 1 se aadir 1 a la
posicin de las decenas
INDF = 10 + INDF
Este LOOP se C = 0, no se incrementan las
utiliza para las decenas y se suma 10 para
horas despus de restaurar las unidades
trabajar con los
minutos o los
segundos
LOOP2
FSR = digito3
PROX_NUM
NO
conta1 = 0
SI
CONVER_COD_7S Pag. 5
Convierte cada dgito a
CONVER_COD_7S cdigo 7 segmentos para los
displays
PROX_DIGITO
Obtener el valor de la
w = INDF
variable "digito" actual
LLamar a la rutina de
Pag. 8 CODIGO_7S conversin a cdigo 7
segmentos
SI
BORRAR_CERO
Si hay un cero en el display de las
decenas de hora no se muestra (borrado
NO de los ceros a la izquierda)
digito4 = 0?
SI
digito4 = SEGM_OFF
Si est pulsado PSEG no se muestra nada en el
display de la posicin de la unidad de hora.
Contando con BORRAR_CERO, esto significa que
slo se mostrarn los segundos.
BORRAR_CERO_SEG
SI
PSEG = 1
NO digito3 = SEGM_OFF
DISPLAY_PUL Pag. 3
Puesta en hora de horas y
PONER_RELOJ
minutos
PONER_MINUTOS
Comprobar si se ha pulsado
PMIN (Pulsador minutos)
NO
PMIN = 1
SI
NO
minutos = 0
SI
Iniciar minutos si al
incrementar se han minutos = MINS_INI
desbordado
PONER_HORAS
Comprobar si se ha pulsado
PHOR (Pulsador horas)
NO
PHOR = 1
SI
NO
horas = 0
SI
OBTENER_H_M Pag. 2
Incrementar segundos, minutos y horas
INC_HORA
Ajustes cada minuto, hora y 12 horas
NO
segundos = 0
SI
NO
minutos = 0
SI
NO
horas = 0
SI
COMPROBAR_CHG Pag. 2
SUBRUTINAS
CODIGO_7S
Devuelve el cdigo 7
segmentos
addwf PCL,F
retlw CERO
retlw UNO
retlw DOS Devuelve en el acumulador
retlw TRES el valor de la constante
retlw CUATRO CERO a NUEVE segn el
retlw CINCO valor que se hubiese
retlw SEIS colocado en w
retlw SIETE
retlw OCHO
retlw NUEVE