Professional Documents
Culture Documents
de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
Módulos de Temporización hardware (TMR0 y TMR1 simultáneos)
* En el supuesto de que se utilice la placa PICDEM 2 PLUS se debe sustituir RC2 por RB0
1
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
sólo será posible si partimos del estado parado y mostrando 0.00
en los displays.
2
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
S M/P
(selección) (marcha/parada)
R6 R5 R7
4K7 4K7 4K7
R2 R3 R4
RA1 Q1 RA2 Q1 RA3 Q1
BC557 BC557 BC557
1K2 1K2 1K2
VCC
J1 R1
GND 1 2 +5V RD0 1 16 S0
3 + + 4 RA1 RD6 2 15 S6
RA2 5 + + 6 RA3 RD4 3 14 S4
RD0 7 + + 8 RD1 RD3 4 13 S3
RD2 9 + + 10 RD3 RD1 5 12 S1
RD4 11 + + 12 RD5 RD5 6 11 S5
RD6 13 + + 14 RD7 RD2 7 10 S2
+ + RD7 8 9 S7
Conector IDC14
8x100 ohmios
3
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
UNA POSIBLE SOLUCIÓN
(que por supuesto no es única)
Pulsación S
Pulsación en M/P
PARADO Y
CUENTA
CONFIGURANDO
DESCENDENTE
Fin de la cuenta
Pulsación M/P
Pulsado M/P
más de 2 s Pulsación M/P
PARADO
MOSTRANDO T
RESTANTE
4
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
• Si acabamos de pasar del Estado 1 al Estado 2 (Parado) por pulsación
sobre M/P para ver si este pulsador permanece más de 2 segundos
pulsado
Dada la disposición de los displays con una conexión común de las líneas de
control de los segmentos, el programa principal se dedicará a realizar un
barrido continuo de los mismos. El procedimiento de selección de un display
y su representación se realizará dentro de un subprograma que incluirá el
código correspondiente a un barrido completo de los 3 displays y la decisión
sobre la representación de minutos y segundos o de segundos y décimas
de segundo. La ejecución de ese subprograma tardará aproximadamente
15ms ya que retendremos la representación sobre cada display durante 5ms.
Esa temporización la realizaremos con el TMR0.
b7 b6 b5 b4 b3 b2 b1 b0
ANTES RA4 “antes” RC2 “antes”
(S) (M/P)
selección marcha/parada
5
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
Antes de dar como válida una pulsación de cualquiera de los pulsadores, se
establece una temporización que permita descartar posibles rebotes, esto
se consigue llamando 7 veces al subprograma de barrido para así completar
unos 105 ms (7 x 15ms) de espera antes de volver a examinar el estado de
los pulsadores y asegura así la desaparición de rebotes.
Algoritmo utilizado:
INICIALIZACIÓN
6
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
• INTERRUPCIONES: habilitar las de TMR1 y borrar el flag
TMR1IF
• Inicializamos las variables:
• DECIMAS, MINUTOS y SEGUNDOS a cero
• ESTADO a cero (parado y listo para configurar)
• Estado anterior de los pulsadores (bits 0 y 1 de la posición
ANTES a uno para indicar que se consideran no pulsados en el
arranque)
7
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
MINUTOS=MINUTOS+1
Si MINUTOS=10 entonces
MINUTOS=0
si no sigue RA4 a 0 (en RA4 había rebote)
Cargamos estado actual de este pulsador:
AHORA<1>=1
• Si el ESTADO es el 1 (Contando) entonces
Si el pulsador M/P está pulsado (AHORA<0>=0) entonces
Si antes estaba a 1 (ANTES<0> =1) entonces
Llamamos a subprograma de espera para descartar
posibles rebotes (CALL T_REBOTES)
Si sigue RC2 a 0 (era una pulsación) entonces
Cambiamos ESTADO a 2 (Parado)
Dejamos TMR1 en marcha para contar 2
segundos de pulsación continua (ya que se
acaba de detectar cambio)
Ponemos T_PULSADO=0 contador de
interrupciones de TMR1 para saber si
llegamos a 20 (2s pulsado)
si no sigue RC2 a 0 (era un rebote en RC2)
Cargamos estado actual de este pulsador:
AHORA<0>=1
• Si el ESTADO es el 2 (Parado) entonces
Si el pulsador M/P está pulsado (AHORA<0>=0) entonces
Si antes estaba a 1 (ANTES<0> =1) entonces
Llamamos a subprograma de espera para descartar
posibles rebotes (CALL T_REBOTES)
Si sigue RC2 a 0 (era una pulsación) entonces
Cambiamos ESTADO a 1 (Contando)
Ponemos TMR1 en marcha (TMR1ON=1)
si no sigue RC2 a 0 (era un rebote)
Cargamos estado actual de este pulsador:
AHORA<0>=1
• Registramos estado actual de pulsadores en ANTES para el
siguiente paso de muestreo:
ANTES <- AHORA
• Si el ESTADO es el 1 (temporizando) entonces
Encendemos el led conectado al pin 4 del puerto B
si no
Apagamos el led
• Vamos al principio del bucle del programa principal
8
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
PROGRAMA DE TRATAMIENTO DE LA INTERRUPCIÓN DE TMR1
SUBPROGRAMA DE DECREMENTO
• Si DECIMAS no es 0 entonces
DECIMAS=DECIMAS-1
Si DECIMAS=0 entonces
Si SEGUNDOS=0 entonces
Si MINUTOS=0 entonces
Es que hemos llegado al final de la
temporización y lo que hacemos es:
Parar el TMR1 (TMR1ON=0)
Pasar el ESTADO 0 (parado y configurando)
si no (DECIMAS=0)
DECIMAS=9
Si las unidades de SEGUNDOS no son 0 entonces
unidades de SEGUNDOS = unidades de SEGUNDOS-1
si no (unidades de SEGUNDOS=0)
unidades de SEGUNDOS=9
9
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
Si las decenas de SEGUNDOS no son 0 entonces
dec. de SEGUNDOS = dec. de SEGUNDOS –1
si no (decenas de SEGUNDOS=0)
dec. de SEGUNDOS = 5
Si MINUTOS no es 0
MINUTOS=MINUTOS-1
• Retorno de Subprograma de Decremento
10
E.P.S. de Ingeniería de Gijón
Ejemplos de Programación para Microcontroladores PIC
SUBPROGRAMA TABLALED
SUBPROGRAMA ESPERA
SUBPROGRAMA T_REBOTES
(Subprograma de temporización de 105 ms con barrido simultáneo de los
displays de 7 segmentos)
11