KNOWNS AND UNKNOWNS
5.1. Czajkowski’s Marriages and Return to Ukraine
El uc1 es un microcontrolador PIC16F870 el mismo que se encarga de recibir la señal del sensor de caudal, que es un tren de pulsos con relación de trabajo fija pero de frecuencia variable (3 a 42 Hz), y transformarla en un dato digital que está en un rango de 20 a 255. Para ello utiliza un programa que inicialmente ejecuta una subrutina DECLARACION E INICIALIZACION DE REGISTROS, en la cual se pre asigna y se da nombres a locaciones de memoria del microcontrolador con el
objetivo de utilizarlas posteriormente en las operaciones de 16 bits (resta y división) necesarias para la conversión.
Posteriormente se tiene una subrutina CONFIGURACION DE PORTICOS en la misma que se configura al pórtico B como pórtico de salida de datos, con la finalidad de utilizarlo para enviar un dato de 8 bits, resultado de la conversión, hacia el uc2.
Luego se ejecuta una subrutina CONFIGURACION DEL MODULO CCP1 EN MODO CAPTURA Y TIMER1, mediante la cual se configura al módulo CCP que posee este microcontrolador para capturar el tiempo entre flancos ascendentes de la señal del sensor (conectada al pin RC2/CCP1). También se hace la configuración del TIMER1 como temporizador y con el preescaler más alto (8). Al final de esta subrutina, se activa el módulo CCP y se enciende el TIMER1 en el cuál se almacenará el dato capturado.
Se tiene declarado un dato llamado FLANCO. Este dato corresponde al estado del bit PIR1,2 que es la bandera que utiliza el módulo CCP para anunciar que existió un flanco ascendente en la señal y que se ha capturado un dato en los registros CCPR1H y CCPR1L. En el programa principal, y por poleo de este dato, se toman decisiones según el estado del mismo. Si FLANCO está en bajo, significa que no se ha presentado un flanco ascendente, por lo que se procede a testear el estado de un dato llamado DESBORDADO que corresponde al bit PIR1,TMR1IF. Si DESBORDADO está en alto, esto indica que el TIMER1 se ha desbordado y se ejecutan las siguientes acciones:
Se reinicia la cuenta del TIMER1.
Se pone en cero el bit PIR1, TMR1IF.
Se envía al pórtico B el valor 0.
Se regresa a testear el estado de FLANCO
Si DESBORDADO está en bajo, se regresa a testear el estado de FLANCO. Si FLANCO está en alto, se reinicia la cuenta del TIMER1 y se pone en bajo el bit
PIR1,2. Luego se ejecutan dos restas, con la ayuda de una subrutina llamada RESTA. Por medio de estas primero se compara el tiempo obtenido (Tc) con el de trabajo en el límite inferior (Ti). Si Tc es mayor que Ti, se envía un valor de 15 al pórtico B (en el cual el uc2 se basará para saber que la frecuencia medida está en un rango entre 0-4 Hz en donde el sensor no trabaja adecuadamente) y se regresa a testear el estado de FLANCO, si Tc es menor que Ti, se prosigue a la segunda resta en la que se compara el tiempo obtenido (Tc) con el de trabajo en el límite superior (Ts). Si Tc es menor que Ts, se envía un valor de 255 al pórtico B (en el cual el uc2 se basará para saber que la frecuencia medida está en su máximo valor) y se regresa a testear el estado de FLANCO, si Tc es mayor que Ts, se procede a realizar dos divisiones con la ayuda de la subrutina DIVISION. Estas divisiones ayudan a calcular un valor entre 20 y 255, que es proporcional a la frecuencia medida (entre 4 y 43 Hz) y que se envía por el pórtico B al uc2.
Los registros Tx y Ty que se mencionan en el diagrama de flujo se cargan con valores de 60000 y 13 respectivamente. Estos registros son usados en la subrutina DIVISION.
Luego de las operaciones de división, se regresa a testear el estado de FLANCO con lo que inicia de nuevo el programa.
INICIO CONFIGURACION DE PORTICOS CONFIGURACION DE MODULO CCP1 EN MODO CAPTURA Y TIMER1 DECLARACION E INICIALIZACION DE REGISTROS FLANCO=1? L DESBORDADO=1? L Enviar valor 0 al pórtico B DESBORDADO=0 TMR1=0 L FLANCO=0 TMR1=0
INICIALIZAR REGISTROS PARA SUBRUTINA RESTA
CARGAR Ti EN MINUENDO CARGAR Tc EN SUSTRAENDO
CARRY_FINAL=1 RESTA
INICIALIZAR REGISTROS PARA SUBRUTINA DIVISION
CARGAR VALOR Ty EN EL DIVISOR CARGAR Tc EN EL DIVIDENDO
DIVISION
INICIALIZAR REGISTROS PARA SUBRUTINA DIVISION
CARGAR VALOR Tx EN EL DIVIDENDO
CARGAR RESULTADO_DIVISION EN EL DIVISOR DIVISION Enviar valor RESULTADO_DIVISION al pórtico B A A L Enviar valor 15 al pórtico B L INICIALIZAR REGISTROS PARA
SUBRUTINA RESTA CARGAR Ts EN MINUENDO CARGAR Tc EN SUSTRAENDO CARRY_FINAL=0 RESTA B B Enviar valor 255 al pórtico B L Si No Si Si No No No Si
RESTA
REALIZAR RESTA 16 BITS ENTRE MINUENDO Y SUSTRAENDO CARGADOS OBTENER SIGNO DE LA RESTA Y CARGAR EN REGISTRO CARRY_FINAL RETORNAR DIVISION
REALIZAR DIVISION 16 BITS ENTRE DIVIDENDO Y DIVISOR CARGADOS
CARGAR RESULTADO EN REGISTRO RESULTADO_ DIVISION
RETORNAR DECLARACION E
INICIALIZACION DE VARIABLES Asignación de locaciones de memoria para los registros: Dividendo_M Dividendo_L Divisor_M Divisor_L Minuendo_M Minuendo_L Sustraendo_M Sustraendo_L FLANCO DESBORDADO Contador CARRY_FINAL Ty, Tx, Ti, Tc, Ts RESULTADO_DIVISION
Asignación de valores iniciales de los registros: Contador=16 Ty=13 Tx=60000 Ti=31250 Tc=0 Ts=2907 Registros adicionales se inicializan con un valor de 0
RETORNAR CONFIGURACION DE PORTICOS TRISB=0 PORTB=0 RETORNAR CONFIGURACION DEL MODULO CCP1 EN MODO CAPTURA Y TIMER 1 TRISC<2>=1 T1CON=49 TMR1H=0 TMR1L=0 CCP1CON=0 CCP1CON<0>=1 CCP1CON<2>=1 PIR1<0>=0 PIR1<2>=0 RETORNAR
Figura 3.36: Subrutinas adicionales