Está en la página 1de 83

TEMPORIZADORES Y CONTADORES (T/C)

(Timers/Counters)
Objetivos

? Conocer y comprender la utilidad de los temporizadores y contadores.

? Comprender su estructura y lógica de funcionamiento.

? Sintetizar programas que hagan uso del sistema de contadores/temporizadores.

? Sintetizar manejadores de interrupción para los contadores/temporizadores.

TEMPORIZADORES Y CONTADORES 2
Resumen de contenidos

1 Introducción.

2 Los Temporizadores/Contadores 0 y 1.
2.1 Características básicas.
2.2 Hardware involucrado.
2.3 Diagrama de bloques.
2.4 Registros SFR TMOD y TCON.
2.5 Modos de funcionamiento.
2.6 Ejemplos.

3 Interrupciones asociadas a los contadores/temporizadores.

4 Ejemplos de aplicación.
4.1 Medición del ancho de un pulso positivo.
4.2 Medición del período de una señal.
4.3 Generación de un pulso.
4.4 Generación de una señal PWM.

TEMPORIZADORES Y CONTADORES 3
1 - Introducción

TEMPORIZADORES Y CONTADORES 4
1 - Introducción

Muchas aplicaciones de automatización y regulación necesitan ...

? Contabilizar eventos externos


– Contar cajas en una cinta transportadora, vehículos en una carretera, ...
– Velocidad de un motor (encoder)

? Realizar retardos de precisión o tareas periódicas


– Semáforos, pasos a nivel, ...
– Generación de señales PWM, ondas cuadradas, control de potencia

? Medir frecuencias/periodos de señales digitales


– Sensores.
– Receptores de señales infrarrojas, radio ...

TEMPORIZADORES Y CONTADORES 5
1 - Introducción

EJEMPLO: Control velocidad motor asignatura Regulación Automática

Motor Encoder

Puente
en H

PWM Pulsos
Modulador PID Frecuencia
PWM analógico Tensión

Referencia

TEMPORIZADORES Y CONTADORES 6
1 - Introducción

EJEMPLO: Control velocidad motor asignatura Regulación Automática

Motor Encoder

Puente
en H

PWM Microcontrolador Pulsos


PID
digital

Referencia

TEMPORIZADORES Y CONTADORES 7
1 - Introducción

EJEMPLO:

? El encoder genera una onda cuadrada


con frecuencia proporcional a la velocidad del motor
? Midiendo el ancho del periodo ON (Ton) se podría calcular la velocidad

Encoder

Toff = “0” Ton = “1”

Pulsos

TEMPORIZADORES Y CONTADORES 8
1 - Introducción

Medir ancho de un pulso Encoder

Pulsos P1.0 µC
Cuenta=0

SI
Nivel
0?
“0” “1”

Incrementa
cuenta
...
SI MOV DPTR,#0
Nivel es_0: JNB P1.0,es_0
1? es_1: INC DPTR
JB P1.0,es_1
...
TEMPORIZADORES Y CONTADORES 9
1 - Introducción

Medir ancho de un pulso Encoder

Pulsos P1.0 µC
Cuenta=0

SI
Nivel
0?
“0” “1”

Incrementa
cuenta
unsigned int contador=0;
SI while (!P1.0) {}
Nivel while (P1.0)
1? {
contador++;
}

TEMPORIZADORES Y CONTADORES 10
1 - Introducción

? Problemas al resolverlo por software.


– Hay que saber cuánto tardan en ejecutarse las instrucciones.
– No se puede trabajar con frecuencias altas.
– Si hay interrupciones es imposible lograr precisión.
– La CPU desperdicia su tiempo y no puede hacer otras cosas.

? Solución: Emplear contadores y/o temporizadores (T/C).

? Los microcontroladores integran temporizadores/contadores (T/C).


– No necesitan circuitos adicionales (integración).
– Sin sobrecargar a la CPU (funcionamiento en paralelo con la CPU).
– Programación sencilla y transparente.

TEMPORIZADORES Y CONTADORES 11
1 - Introducción

? Cada generación de microcontroladores añade más capacidad.


– Intel 8051 -> 2 T/C: T/C0, T/C1
– Intel 8052 -> 3 T/C: T/C0, T/C1, T/C2
– Siemens SAB80C517 -> 3 T/C: T/C0, T/C1, T/C2 , unidad comparación/captura
– Motorola MPC555 (32 bits) -> 2 Time Processor Unit 3 (TPU3)
– Atmel T89C51CC01 -> 3 T/C: T/C0, T/C1, T/C2 , unidad comparación/captura

? Los T/C tienen innumerables aplicaciones.


– Contabilización de eventos.
• Encoders, contadores de objetos, ...
– Generación de señales digitales. PWM.
• Control de potencia, motores de continua, motores AC, motores P. a P., ...
• Generación de señales para transmisión/recepción de datos.
– Medición de señales digitales.
• Sensores de humedad, de distancia, de luminosidad...
– Temporizaciones.
• Retardos, tareas periódicas, planificación de tareas, ...

TEMPORIZADORES Y CONTADORES 12
2 – Los Temporizadores/Contadores 0 y 1
T/C 0 y T/C 1 en la familia MCS-51

TEMPORIZADORES Y CONTADORES 13
2 - T/C 0 y T/C 1 en la familia MCS-51
Características básicas

? Dos temporizadores/contadores “casi” idénticos: T/C0 y T/C1

? Registro de cuenta de hasta 16 bits


– Cuenta tiempo: TEMPORIZADOR

– Cuenta eventos: CONTADOR

? Contabilización ascendente (cuenta = cuenta+1).

? El desborde se usa para detectar el fin de cuenta/temporización.

? Dispone de hardware/software para arrancar y parar la cuenta.

TEMPORIZADORES Y CONTADORES 14
2 - T/C 0 y T/C 1 en la familia MCS-51
2.1 Características básicas

? A OTRO SITIO

1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0
Valor cuenta = 9746h = 38726

TEMPORIZADORES Y CONTADORES 15
2 - T/C 0 y T/C 1 en la familia MCS-51
2.2 Hardware involucrado

TEMPORIZADOR/CONTADOR 0 (T/C 0)
– Registros (zona SFR):
• TMOD (modo operación) (dir. 89h por máscara).
• TCON (control operación) (dir. 88h bit a bit).
• TL0, TH0 (registros cuenta) (dir. 8Ah y 8Ch).
– Terminales (Pines):
• T0 (P3.4) (entrada de pulsos).
• /INT0 (P3.2) (control de puerta).

TEMPORIZADOR/CONTADOR 1 (T/C 1)
– Registros (zona SFR):
• TMOD (modo operación) (dir. 89h por máscara).
• TCON (control operación) (dir. 88h bit a bit).
• TL1, TH1 (registros cuenta) (dir. 8Bh y 8Dh).
– Terminales (Pines):
• T1 (P3.5) (entrada de pulsos).
• /INT1 (P3.3) (control de puerta).

TEMPORIZADORES Y CONTADORES 16
2 - T/C 0 y T/C 1 en la familia MCS-51
2.3 Diagrama de bloques

Generación:
- Eventos externos Contador
- Señal reloj interno

Control
de puerta

TEMPORIZADOR/CONTADOR 0 (T/C 0)
– SFR: TMOD (modo operación), TCON (control operación), TL0, TH0 (registros cuenta).
– Pines: T0 (P3.4) (entrada de pulsos), /INT0 (P3.2) (control de puerta).
TEMPORIZADOR/CONTADOR 1 (T/C 1)
– SFR: TMOD (modo operación), TCON (control operación), TL1, TH1 (registros cuenta).
– Pines: T1 (P3.5) (entrada de pulsos), /INT1 (P3.3) (control de puerta).

TEMPORIZADORES Y CONTADORES 17
2 - T/C 0 y T/C 1 en la familia MCS-51
2.3 Diagrama de bloques

OSC 1/12
1 = cerrado
0
C/T Contador
Contador TF0
pin 1
T0
(P3.4)
GATE
pin Control
/INT0
(P3.2)
de puerta
TR0

TEMPORIZADOR/CONTADOR 0 (T/C 0)
– SFR: TMOD (modo operación), TCON (control operación), TL0, TH0 (registros cuenta).
– Pines: T0 (P3.4) (entrada de pulsos), /INT0 (P3.2) (control de puerta).
TEMPORIZADOR/CONTADOR 1 (T/C 1)
– SFR: TMOD (modo operación), TCON (control operación), TL1, TH1 (registros cuenta).
– Pines: T1 (P3.5) (entrada de pulsos), /INT1 (P3.3) (control de puerta).

TEMPORIZADORES Y CONTADORES 18
2 - T/C 0 y T/C 1 en la familia MCS-51
2.3 Diagrama de bloques

OSC 1/12
1 = cerrado
0
C/T Contador
Contador TF0
pin 1
T0
(P3.4)
GATE
pin
/INT0
(P3.2)
TR0

TEMPORIZADOR/CONTADOR 0 (T/C 0)
– SFR: TMOD (modo operación), TCON (control operación), TL0, TH0 (registros cuenta).
– Pines: T0 (P3.4) (entrada de pulsos), /INT0 (P3.2) (control de puerta).
TEMPORIZADOR/CONTADOR 1 (T/C 1)
– SFR: TMOD (modo operación), TCON (control operación), TL1, TH1 (registros cuenta).
– Pines: T1 (P3.5) (entrada de pulsos), /INT1 (P3.3) (control de puerta).

TEMPORIZADORES Y CONTADORES 19
2 - T/C 0 y T/C 1 en la familia MCS-51
2.3 Diagrama de bloques

OSC 1/12
1 = cerrado
0
C/T Contador TF0
pin 1
T0
(P3.4)
GATE
pin
/INT0
(P3.2)
TR0

TEMPORIZADOR/CONTADOR 0 (T/C 0)
– SFR: TMOD (modo operación), TCON (control operación), TL0, TH0 (registros cuenta).
– Pines: T0 (P3.4) (entrada de pulsos), /INT0 (P3.2) (control de puerta).
TEMPORIZADOR/CONTADOR 1 (T/C 1)
– SFR: TMOD (modo operación), TCON (control operación), TL1, TH1 (registros cuenta).
– Pines: T1 (P3.5) (entrada de pulsos), /INT1 (P3.3) (control de puerta).

TEMPORIZADORES Y CONTADORES 20
2 - T/C 0 y T/C 1 en la familia MCS-51
2.3 Diagrama de bloques

OSC 1/12
1 = cerrado
0
C/T Contador TF0
pin 1
T0
Interrupción
(P3.4)
GATE (si está habilitada)
pin
/INT0
(P3.2)
TR0

TEMPORIZADOR/CONTADOR 0 (T/C 0)
– SFR: TMOD (modo operación), TCON (control operación), TL0, TH0 (registros cuenta).
– Pines: T0 (P3.4) (entrada de pulsos), /INT0 (P3.2) (control de puerta).
TEMPORIZADOR/CONTADOR 1 (T/C 1)
– SFR: TMOD (modo operación), TCON (control operación), TL1, TH1 (registros cuenta).
– Pines: T1 (P3.5) (entrada de pulsos), /INT1 (P3.3) (control de puerta).

TEMPORIZADORES Y CONTADORES 21
2 - T/C 0 y T/C 1 en la familia MCS-51

2.3 Diagrama de bloques


T/C 0
OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción
GATE

pin
/INT0
TR0

T/C 1

TEMPORIZADORES Y CONTADORES 22
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción
GATE

pin
/INT0
TR0

T/C 1 T/C 0
b7 TMOD, dir. 89h, por máscara b0
GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 23
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción
GATE

pin
/INT0
TR0

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 24
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0
Bit C/T Interrupción
GATE
Selección modo
pin
-INT0
contador o temporizador.
TR0 0 -> temporizador
1 -> contador
b7 TMOD, dir. 89h, por máscara b0
GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 25
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
1
0
C/T
1
Contador TF0

pin
T0 Interrupción
GATE Pulso muy estrecho:
¡se pierde!
pin
pin
/INT0 T0
TR0

C.M.C.M.
? Operación como temporizador
– Cuentan ciclos de máquina (1 ciclo máquina “0” “1”= 12 ciclos
(C.M.) “0” de
“0”reloj).
? Operación como contador
– Detección de flancos de bajada en el pin T0 (P3.4).
– Muestreo cada CM -> Flanco de bajada = detectar “1” y después “0”.
– Máxima frecuencia detectable será 1/24 frecuencia reloj.

TEMPORIZADORES Y CONTADORES 26
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción
GATE Bit TR0
pin Activación T/C 0.
/INT0 0 -> desactivado
TR0
1 -> activado

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 27
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción
GATE Bit GATE
pin Control de puerta.
/INT0 0 -> interno (software)
TR0
1 -> externo (hardware)

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 28
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción

1
GATE
0 D Bit GATE
Control de puerta.
D/INT0
pin
0 -> interno (software)
TR0
1 -> externo (hardware)

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 29
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción

0
GATE
1 1 Bit GATE
Control de puerta.
D/INT0
pin
0 -> interno (software)
TR0
1 -> externo (hardware)

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 30
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0 Interrupción
Modo
GATE
Modo 0: Contador 13 bits.
pin
/INT0
Modo 1: Contador 16 bits.
TR0
Modo 2: Cont. 8 bit autorrecarga
Modo 3: Desdoble (T/C0)

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 31
2 - T/C 0 y T/C 1 en la familia MCS-51
Interrupción
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T
1
Contador
111...100
000...010
000...001
000...000
111...111
111...110
111...101 1
TF0

pin
T0
ContadorInterrupción
GATE
Registros SFR TH0 y TL0.
pin
/INT0
Ascendente.
TR0
Y cuando desborda ...

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 32
2 - T/C 0 y T/C 1 en la familia MCS-51
2.4 Registros SFR TMOD y TCON

OSC 1/12
1 = cerrado
0
C/T Contador TF0
1
pin
T0
Bit TF0 Interrupción
GATE
Timer flag 0.
pin
/INT0
1 -> desborde
TR0 PERO NO SE DETIENE
EL CONTADOR
b7 TMOD, dir. 89h, por máscara b0
GATE C/ T M1 M0 GATE C/T M1 M0
T/C 1 T/C 0
b7 TCON, dir. 88h, bit a bit b0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 33
2 - T/C 0 y T/C 1 en la familia MCS-51

Ejemplo:
Se desea temporizar un intervalo de 125 ? s. ¿Cuál es el valor a
cargar como cuenta inicial?
Para un valor de fOSC =12MHz:

Duración de 1 Ciclo Máquina:


1
*12=1? s
12MHz
Duración=125? s=1? s*Cuenta
Duración=125? s=1? s*125

Si se utilizan 8 bits: 256-125=131=83H THx=?


THx=? TLx=131
TLx=131

Si se utilizan 16 bits: 65536-125=65411=FF83H THx=255


THx=255 TLx=131
TLx=131

TEMPORIZADORES Y CONTADORES 34
2 - T/C 0 y T/C 1 en la familia MCS-51

Ejemplo:
Se desea temporizar un intervalo de 2s. ¿Cuál es el valor a
cargar como cuenta inicial? (fOSC=12MHz)

Duración=2000000? s=1? s*Cuenta


No
No cabe
cabe en
en
Duración=2000000? s=1? s*2000000 16
16 bits
bits

Solución: Contabilizar desbordes del contador (Con 16 bits cada


desborde equivale a 65536 ? s).

Desbordes = 30 Resto_hasta_completar = 33920


Cuenta = 30*65536+33920 = 2000000

TEMPORIZADORES Y CONTADORES 35
2 - T/C 0 y T/C 1 en la familia MCS-51
2.5 Modos de funcionamiento

M1 M0 Modo
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (los de
0 0 0 menor peso) (13 bits en total). (los 3 bits de mayor peso de TLx son de valor
indeterminado)
0 1 1 Temporizador/contador de 16 bits, con THx y TLx en cascada
Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga
1 0 2
para TLx tras cada desbordamiento
Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits,
1 1 3 controlados con los bits de control de los temporizadores 0 y 1 respectivamente.
Temporizador 1 inactivo.

TEMPORIZADORES Y CONTADORES 36
2 - T/C 0 y T/C 1 en la familia MCS-51
2.5 Modos de funcionamiento

OSC 1/12 LSB MSB


1 = cerrado
0 TL0
C/T 5 bits TH0
Contador TF0
1 de menor 8 bits
pin peso
T0 Interrupción
GATE 13 bits
pin
/INT0
TR0
MODO 0: Contador de 13 bits
M1 M0 Modo
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits
0 0 0
en total).
0 1 1 Temporizador/contador de 16 bits, con THx y TLx en cascada
Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga
1 0 2
para TLx tras cada desbordamiento
Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits,
1 1 3 controlados con los bits de control de los temporizadores 0 y 1 respectivamente.
Temporizador 1 inactivo.

TEMPORIZADORES Y CONTADORES 37
2 - T/C 0 y T/C 1 en la familia MCS-51
2.5 Modos de funcionamiento

OSC 1/12 LSB MSB


1 = cerrado
0
C/T
TL0 TH0
Contador TF0
1 8 bits 8 bits
pin
T0 Interrupción
GATE 16 bits
pin
/INT0
TR0
MODO 1: Contador de 16 bits
M1 M0 Modo
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits
0 0 0
en total).
0 1 1 Temporizador/contador de 16 bits, con THx y TLx en cascada
Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga
1 0 2
para TLx tras cada desbordamiento
Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits,
1 1 3 controlados con los bits de control de los temporizadores 0 y 1 respectivamente.
Temporizador 1 inactivo.

TEMPORIZADORES Y CONTADORES 38
2 - T/C 0 y T/C 1 en la familia MCS-51
2.5 Modos de funcionamiento

OSC 1/12
1 = cerrado
0
C/T
TL0
Contador TF0
1 8 bits
pin
T0 Interrupción
Recarga
GATE
TH0
pin 8 bits
/INT0
TR0
MODO 2: Contador de 8 bits con autorrecarga
M1 M0 Modo
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits
0 0 0
en total).
0 1 1 Temporizador/contador de 16 bits, con THx y TLx en cascada
Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga
1 0 2
para TLx tras cada desbordamiento
Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits,
1 1 3 controlados con los bits de control de los temporizadores 0 y 1 respectivamente.
Temporizador 1 inactivo.

TEMPORIZADORES Y CONTADORES 39
2 - T/C 0 y T/C 1 en la familia MCS-51
2.5 Modos de funcionamiento
TR1

TH0
TH0
Intr
OSC 1/12 ??????
TF1
8 bits

0
C/T TL0
TL0 TF0 Intr
??????
1 8 bits
pin T0

GATE

pin INT0

TR0
MODO 3: Desdoble T/C 0
M1 M0 Modo
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits
0 0 0
en total).
0 1 1 Temporizador/contador de 16 bits, con THx y TLx en cascada
Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga
1 0 2
para TLx tras cada desbordamiento
Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits,
1 1 3 controlados con los bits de control de los temporizadores 0 y 1 respectivamente.
Temporizador 1 inactivo.

TEMPORIZADORES Y CONTADORES 40
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un contador
Se desea contabilizar los vehículos que circulan por una carretera.
NO excederán de 30.000.

? PASO 1: ¿Contador o temporizador?


– Contador.
? PASO 2: ¿Control puerta externo o interno? (GATE)
– Interno.
? PASO 3: Modo 0 (13 bits), Modo 1 (16 bits) o Modo 2 (8 bits rec.)
– Modo 1. En principio podemos contar hasta 65535.
? PASO 4: ¿Valor inicial del contador? Cuenta
– 0. T0 µC 0
2
1

TEMPORIZADORES Y CONTADORES 41
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un contador
Se desea contabilizar los vehículos que circulan por una carretera.
NO excederán de 30.000.
– Contador.
– Interno
– Modo 1. En principio podemos contar hasta 65535.
– 0.

TH0=0x00; TL0=0x00;

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T
T/C 1
M1 M0
0
GATE C / T
1T/C 0 M10 1
M0

b7 TCON, dir. 88h, bit a bit b0


TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 42
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un contador
Se desea contabilizar los vehículos que circulan por una carretera. NO excederán de 30.000.
TH0=0x00; TL0=0x00;

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T
T/C 1
M1 M0
0
GATE C / T
1T/C 0 M10 1
M0

b7 TCON, dir. 88h, bit a bit b0


TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A;
sbit TF0=TCON^5, TR0=TCON^4;
void main(void)
{
int vehiculos;/* Para contabilizar vehículos */
TMOD = 0x05; /* 0101(b => T/C 0, control sw, contador, modo 1 */
TH0=0x00;
TL0=0x00;
/* sigue ... */
}

TEMPORIZADORES Y CONTADORES 43
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un contador
Se desea contabilizar los vehículos que circulan por una carretera.
NO excederán de 30.000.
sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A;
sbit TF0=TCON^5, TR0=TCON^4;
void main(void)
{

int vehiculos;

TMOD = 0x05; /* T/C 0, modo 1, soft, contador */


TH0=0x00; vehiculos = TH0;
TL0=0x00;
TR0=1; /* arrancar timer */ vehiculos = vehiculos << 8;
while(1) { vehiculos = vehiculos | TL0;
/* hacer otras cosas */
TR0=0; /* evitar condiciones de carrera */
vehiculos = TH0*256 + TL0;
TR0=1;
}
}

TEMPORIZADORES Y CONTADORES 44
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un contador (ampliación)
Se desea contabilizar los vehículos que circulan por una carretera.
Mejora, 4.000 millones de vehículos.
sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A;
sbit TF0=TCON^5, TR0=TCON^4;
void main(void)
{

unsigned long vehiculos, desbordes=0;

TMOD = 0x05; /* timer 0, modo 1, soft. */


TH0=0x00; TL0=0x00;
TF0=0;
TR0=1; /* arrancar timer */
while(1) {
/* hacer otras cosas */
if (TF0==1) {
TF0=0; desbordes++;
}
TR0=0; /* evitar condiciones de carrera */
vehiculos = desbordes*65536 + TH0*256 + TL0;
TR0=1;
}}

TEMPORIZADORES Y CONTADORES 45
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un temporizador
Se desea realizar un retardo de 10 ms. Reloj del ? C de 12 Mhz

? PASO 1: ¿Contador o temporizador?


– Temporizador.
? PASO 2: ¿Control puerta externo o interno? (GATE)
– Interno.

12 Mhz
1Ciclo Máquina ? ?1? S
12 períodos de reloj
10 mS ? 10.000 ? S ? 10.000 cuentas hasta desborde

? PASO 3: Modo 0 (13 bits), Modo 1 (16 bits) o Modo 2 (8 bits rec.)
– Modo 1.
? PASO 4: ¿Valor inicial del contador?
216 ? cuenta ? 65.536 ? 10.000 ? 55.536 ? D8 F 0h

TEMPORIZADORES Y CONTADORES 46
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un temporizador
Se desea realizar un retardo de 10 ms. Reloj del ? C de 12 Mhz
– Temporizador.
– Interno
– Modo 1.
– 55.536 (D8F0h)

TH0=0xD8; TL0=0xF0;

b7 TMOD, dir. 89h, por máscara b0


GATE C/ T
T/C 1
M1 M0
0
GATE C / T
0T/C 0 M10 1
M0

b7 TCON, dir. 88h, bit a bit b0


TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 47
2 - T/C 0 y T/C 1 en la familia MCS-51
2.6 Ejemplo de un temporizador
Se desea realizar un retardo de 10 ms. Reloj del ? C de 12 Mhz

sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A;
sbit TF0=TCON^5, TR0=TCON4;

void main(void)
{
/* ... */
TMOD |= 0x01; /* timer 0, modo 1, soft. */
TMOD &= 0xF1;
TH0=0xD8; TL0=0xF0;
TF0=0;
TR0=1; /* arrancar timer */
while(!TF0); /* esperar desborde */
/* ... */
}

TEMPORIZADORES Y CONTADORES 48
2 - T/C 0 y T/C 1 en la familia MCS-51
Actividad
Se desea disponer de una función en lenguaje C para realizar
retardos de precisión del orden de milisegundos. Reloj del ? C de 12
Mhz.

? AYUDA:

– Prototipo función: void delay_ms(unsigned int ms);


– Calcular ciclos de máquina a esperar y usar un timer para contabilizarlos
– Emplear mecanismo de desborde para realizar temporizaciones grandes

Solución

TEMPORIZADORES Y CONTADORES 49
3 – Interrupciones asociadas a los
contadores/temporizadores

TEMPORIZADORES Y CONTADORES 50
3 – Interrupciones asociadas a los T/C

? Permite sacar mayor partido al sistema.


? Liberan a la CPU de tener que encuestar flag de desborde.

Flag hab. Flag act. Núm


Descripción Nombre Vector Borrado
(IEN0) (TCON) Interrup
Cont./Temp. 0 T/C0 ET0 TF0 000Bh Hw 1
Cont./Temp.1 T/C1 ET1 TF1 001Bh Hw 3

OSC 1/12
1 = cerrado
0
C/T
1
Contador TF0
pin
T0 Interrupción
GATE
pin
/INT0
TR0
Bit ET0
Habilitación de
interrupción.

TEMPORIZADORES Y CONTADORES 51
3 – Interrupciones asociadas a los T/C

? Permite sacar el máximo partido Borrado automático


? Liberan a la CPU de tener que al vectorizarse.
encuestar flag de desborde (puesta a 0)

Flag hab. Flag act. Núm


Descripción Nombre Vector Borrado
(IEN0) (TCON) Interrup
Cont./Temp. 0 T/C0 ET0 TF0 000Bh Hw 1
Cont./Temp.1 T/C1 ET1 TF1 001Bh Hw 3

OSC 1/12
1 = cerrado
0
C/T
1
Contador TF0
pin
T0 Interrupción
GATE
pin
/INT0
TR0 Bit TF0
Activación petición
interrupción.
(a 1)
TEMPORIZADORES Y CONTADORES 52
3 – Interrupciones asociadas a los T/C

? Permite sacar el máximo partido


? Liberan a la CPU de tener que encuestar flag de desborde

Flag hab. Flag act. Núm


Descripción Nombre Vector Borrado
(IEN0) (TCON) Interrup
Cont./Temp. 0 T/C0 ET0 TF0 000Bh Hw 1
Cont./Temp.1 T/C1 ET1 TF1 001Bh Hw 3

OSC 1/12
1 = cerrado
0
C/T
1
Contador TF0
pin
T0 Interrupción
GATE
pin
-INT0
TR0

void servicio (void)interrupt 1


Dirección de {
/* codigo */
rutina interrupción. }
TEMPORIZADORES Y CONTADORES 53
3 – Interrupciones asociadas a los T/C

? Permite sacar el máximo partido


? Liberan a la CPU de tener que encuestar flag de desborde

Flag hab. Flag act. Núm


Descripción Nombre Vector Borrado
(IEN0) (TCON) Interrup
Cont./Temp. 0 T/C0 ET0 TF0 000Bh Hw 1
Cont./Temp.1 T/C1 ET1 TF1 001Bh Hw 3

OSC 1/12
1 = cerrado
0
C/T
1
Contador TF0
pin
T0 Interrupción
GATE
pin
/INT0
TR0
Se puede combinar
el T/C y la
interrupción externa.

TEMPORIZADORES Y CONTADORES 54
3 – Interrupciones asociadas a los T/C
Ejemplo generación onda cuadrada
– Se trata de un ejemplo típico de tarea
periódica. P1.0
– Interesa tener desocupada la CPU para
otros menesteres.
– Se propone que el T/C genere una
interrupción transcurrido cada semiperiodo
y que la rutina de servicio modifique el valor
del pin.

10 Khz

Generar onda cuadrada de 10 Khz por el pin P1.0. Reloj del ? C de 12 Mhz

TEMPORIZADORES Y CONTADORES 55
3 – Interrupciones asociadas a los T/C
Ejemplo generación onda cuadrada
Generar onda cuadrada de 10 Khz por el pin P1.0. Reloj del ? C de 12 Mhz

? PASO 1: ¿Contador o temporizador?


– Temporizador
? PASO 2: ¿Control puerta externo o interno? (GATE)
– Interno
? PASO 3: Modo 0 (13 bits), Modo 1 (16 bits) o Modo 2 (8 bits rec.)
– Modo 2. 8 bits con autorrecarga
? Hacer números

1 Ciclo Máquina ? 1 ? S
1
T? ? 0,1mS ? 100 ? S ? Semiperiodo ? 50 ? S (CM )
10 Khz

TEMPORIZADORES Y CONTADORES 56
3 – Interrupciones asociadas a los T/C
Ejemplo generación onda cuadrada
Generar onda cuadrada de 10 Khz por el pin P1.0. Reloj del ? C de 12 Mhz

? PASO 1: ¿Contador o temporizador?


– Temporizador
? PASO 2: ¿Control puerta externo o interno? (GATE)
– Interno
? PASO 3: Modo 0 (13 bits), Modo 1 (16 bits) o Modo 2 (8 bits rec.)
– Modo 2. 8 bits con autorrecarga
? PASO 4: ¿Valor inicial del contador?
28 ? cuenta ? 256 ? 50 ? 206

TEMPORIZADORES Y CONTADORES 57
3 – Interrupciones asociadas a los T/C
Ejemplo generación onda cuadrada
Generar onda cuadrada de 10 Khz por el pin P1.0. Reloj del ? C de 12 Mhz

– Temporizador
– Interno
– Modo 2
– 206

TH0=TL0=206;

b7 TMOD, dir. 89h, por máscara b0


GATE C/T M1
TIMER 1
M0
0
GATE C/T
0 M1
TIMER 0
1 0
M0

b7 TCON, dir. 88h, bit a bit b0


TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TEMPORIZADORES Y CONTADORES 58
3 – Interrupciones asociadas a los T/C
Ejemplo generación onda cuadrada
Generar onda cuadrada de 10 Khz por el pin P1.0. Reloj del ? C de 12 Mhz

sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A;
sfr IEN0=0xA8, P1=0x90;
sbit ET0=IEN0^1, EAL=IEN0^7, TR0=TCON^4;

void main(void) {
EAL = 0;
TMOD = 0x02;
TH0 = 206; TL0 = 206;
ET0 = 1; /* habilitar int. timer 0 */
EAL = 1; /* habilitar interrupciones */
TR0 = 1; /* a correr */
while (1)
{ /* otras cosas */ }
}

void T0 (void)interrupt 1
{
P1.0 = ~P1.0;
}

TEMPORIZADORES Y CONTADORES 59
3 – Interrupciones asociadas a los T/C
Actividad

Generar onda cuadrada de 50 Hz por el pin P1.0. Reloj del ? C de 12 Mhz.

? AYUDA:
– DOS CAMINOS
– a) Las recargas del temporizador/contador se pueden hacer por software.
– b) Cada N interrupciones realizar la acción.

Solución

TEMPORIZADORES Y CONTADORES 60
3 - T/C 0 y T/C 1 en el 805x7
Actividad

En la actividad anterior, conseguir que el tiempo que la señal está a


nivel alto y a nivel bajo sean distintos.

Solución

TEMPORIZADORES Y CONTADORES 61
4 - Ejemplos de aplicación

TEMPORIZADORES Y CONTADORES 62
4 - Ejemplos de aplicación
4.1 Medir el ancho de un pulso positivo

– Para introducir el pulso se emplea la entrada de interrupción externa /INT0.


Se emplea el T/C 0 como temporizador en modo control hardware.
– Si se desea medir el nivel bajo de esta manera es necesario emplear un
inversor externo.
?

?C

?
INT0

TEMPORIZADORES Y CONTADORES 63
4 - Ejemplos de aplicación
4.1 Medir el ancho de un pulso positivo

Control externo,

OSC= 1 1/12
bit GATE
1 = cerrado
0
C/T
1
Contador TF0

pin
T0 Interrupción
? 1 GATE 0 0
pin
/INT0 0
TR0
¡No
cuenta!

TEMPORIZADORES Y CONTADORES 64
4 - Ejemplos de aplicación
4.1 Medir el ancho de un pulso positivo

OSC 1/12
1 = cerrado
0
C/T
1
Contador TF0

pin
T0
1 Interrupción
? 1 GATE 0 1
pin
/INT0 1
TR0
¡Si
1 cuenta!

TEMPORIZADORES Y CONTADORES 65
4 - Ejemplos de aplicación
4.1 Medir el ancho de un pulso positivo

Aprovechar flanco
? de bajada para generar
una interrupción externa
y leer valor cuenta

TR0 = 1 Termina de contar

Control por HW:


Comienza a contar

TEMPORIZADORES Y CONTADORES 66
4 - Ejemplos de aplicación
4.1 Medir el ancho de un pulso positivo

sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A, IEN0=0xA8;


sbit TR0=TCON^4, IT0=TCON^0, EX0=IEN0^0, EAL=IEN0^7;

unsigned int ancho_pulso;

void main(void) {
EAL = 0; /* deshabilitar interrupciones */
TMOD = 0x09; /* control hard., timer, modo 1 */
TH0 = 0x00; TL0 = 0x00;
IT0 = 1; /* disparo interrupción externa por flanco bajada*/
EX0 = 1; /* habilitar int. externa 0 */
EAL = 1; /* habilitar interrupciones */
TR0 = 1; /* a correr */
while (1)
{ /* otras cosas */ }
}

void Externa0_INT0 (void) interrupt 0


{
TR0 = 0; /* para timer */
ancho_periodo = TH0*256+TL0; /* recoger medida */
TH0 = TL0 = 0; /*reiniciar cuenta timer */
TR0 = 1;
}

TEMPORIZADORES Y CONTADORES 67
4 - Ejemplos de aplicación
4.2 Medir el periodo de una señal

– La señal se introduce al microcontrolador mediante la entrada de interrupción


externa /INT0.

?C

INT0

TEMPORIZADORES Y CONTADORES 68
4 - Ejemplos de aplicación
4.2 Medir el periodo de una señal

Control por software. Bit GATE =0

Flanco bajada Flanco bajada Flanco bajada


generar petición generar petición generar petición
Interrupción externa: Interrupción externa: Interrupción externa:

Comenzar cuenta Parar cuenta Comenzar cuenta


y procesar cuenta

– El método puede suponer algo de perdida de precisión debido a las variaciones de


latencia de la interrupción.

TEMPORIZADORES Y CONTADORES 69
4 - Ejemplos de aplicación
4.2 Medir el periodo de una señal
sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A, IEN0=0xA8;
sbit TR0=TCON^4, IT0=TCON^0, EX0=IEN0^0, EAL=IEN0^7;
unsigned int periodo;

void main(void) {
EAL = 0; /* deshabilitar interrupciones */
TMOD = 0x01; /* control soft., timer, modo 1 */
TH0 = 0x00; TL0 = 0x00;
IT0 = 1; /* disparo int. externa. 0 por flanco bajada */
EX0 = 1; /* habilitar int. externa 0 *7
EAL = 1; /* habilitar interrupciones */
TR0 = 1; /* a correr */
while (1)
{ /* otras cosas */ }
}
void Externa0_INT0 (void) interrupt 0
{
/* arranca y para el timer en */
/* interrupciones alternadas */
TR0 = ~TR0; /* complementar.
if (TR0==1)
return; /* salir si timer corriendo */
periodo = TH0*256+TL0; /* recoger medida */
TH0 = 0; TL0 = 0; /*reiniciar cuenta timer */
}
TEMPORIZADORES Y CONTADORES 70
4 - Ejemplos de aplicación
4.3 Generar un pulso
– Se utiliza un pin de un puerto (P2.0) para generar el pulso
– La precisión del método depende de la latencia de la interrupción del
temporizador.

temporizador

?C

P2.0

TEMPORIZADORES Y CONTADORES 71
4 - Ejemplos de aplicación
4.3 Generar un pulso
– Control por software. Bit GATE = 0
– P2.0 = 1
– Habilitar interrupción del T/C 0
– Arrancar el temporizador inicializando la cuenta en función del ancho del pulso
– Cuando rebose, se generará una interrupción procedente del T/C cuyo
manejador pondrá P2.0 = 0 dado que se ha alcanzado la duración del pulso
temporizador

P2.0 = 1
Inicializar El manejador de la interrupción
temporizador y del T/C 0, dará por finalizado
comenzar cuenta el pulso P2.0 = 0

TEMPORIZADORES Y CONTADORES 72
4 - Ejemplos de aplicación
4.3 Generar un pulso
sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A, IEN0=0xA8 P2=0xA0;
sbit TR0=TCON^4, ET0=IEN0^1, EAL=IEN07;
#define HITime ???
#define LoTime ???
void main (void){
EAL = 0; /* deshabilitar interrupciones */
ET0 = 1; /* habilitar int. del T/C 0 *7
TCON = 0x00; /* Asegurarse que el temporizador está parado. */
TMOD =0x01; /* Temporizador en modo 1, soft. */
TH0 = HiTime; /* Cargar T/C 0 con la cuenta para la duración del pulso. */
TL0 = LoTime;
TR0 = 1; /* Arrancar temporizador. */
P2.0 = 1; /* Comenienzo pulso. */
EAL = 1; /* habilitar interrupciones */ }
void Timer0_int (void) interrupt 1
{
TR0 = 0; /* Parar temporizador */
P2.0 = 0; /* Final del pulso */
}
TEMPORIZADORES Y CONTADORES 73
4 - Ejemplos de aplicación
4.3 Generar un pulso

Inicio: MOV TCON,#$00 ;Asegurarse que el temporizador está parado.


MOV TMOD,#$01 ;Temporizador en modo 1.
MOV TH0,#HiTime ;Cargar T/C 0 con la cuenta para la
; duración del pulso.
MOV TL0,#LoTime
SETB TR0 ;Arrancar temporizador.
SETB P2.0 ;Comenienzo pulso.

;Manejador interrupción del T/C 0.


TC0INT: CLR P2.0 ;Final del pulso.
CLR TR0 ;Parar temporizador.
RETI

TEMPORIZADORES Y CONTADORES 74
4 - Ejemplos de aplicación
4.4 Generar una señal PWM
– La precisión de este método depende de la latencia de las interrupciones
del temporizador.
– Para generar señales de mayor frecuencia usar modo 2.

Arrancar tempo. Arrancar tempo. Repetir


Valor “0” Valor “1”

TEMPORIZADORES Y CONTADORES 75
4 - Ejemplos de aplicación
4.4 Generar una señal PWM

T0INT: CLR TR0 ;Parar el temporizador.


CPL P2.0 ;Complementar valor pin.
JB P2.0,SetPWMHigh ;Está a valor “1” ó “0”?
MOV TH0,PWMLowH ;Poner PWM a “0”.
MOV TL0,PWMLowL
SJMP T0EX

SetPWMHigh: MOV TH0,PWMHighH ;Poner PWM a “1”.


MOV TL0,PWMHighL

T0EX: SETB TR0 ;Reinicializar temporizador.


RETI

TEMPORIZADORES Y CONTADORES 76
4 - Ejemplos de aplicación
4.5 Leer un timer “al vuelo”

ReadTimer: MOV ValH,TH0 ;Leer parte alta y baja.


MOV ValL,TL0
MOV A,TH0 ;Leer nuevamente parte alta.
CJNE A,ValH,ChkHigh ;Ha cambiado?
SJMP RTEX ;Si no, la primera lectura es válida.

ChkHigh: JB ValL.7,RTEX ;Otro caso, verificar parte baja para ver


; si ha cambiado despúes de leer la parte
; alta original.
MOV ValH,A ;Si ha cambiado, usar la segunda lectura
; de la parte alta
RTEX: RET

TEMPORIZADORES Y CONTADORES 77
Solución actividad
Generar onda cuadrada de 50 Hz por el pin P1.0. Reloj de 12 Mhz.
– 50 Hz = 20000 µS periodo = 10000 µS semiperiodo
– Usar temporizador y modo 1 (16 bits). Recargar por programa el timer en interrupción.
– Recarga: 10000 µS -> 65536 -10000 = 55536 = D8F0h
sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A;
sfr IEN0=0xA8, P1=0x90;
sbit ET0=IEN0^1, EAL=IEN0^7, TR0=TCON^4;

void main(void) {
TMOD = 0x01;
TH0 = 0xD8; TL0 = 0xF0;
EAL = 0; ET0 = 1; EAL = 1; TR0 = 1; /* a correr */
while (1)
{ /* otras cosas */ }
}

void T0 (void)interrupt 1
{
P1.0 = ~P1.0;
TR0 = 0;
TH0 = 0xD8; TL0 = 0xF0;
TR0 = 1;
}

TEMPORIZADORES Y CONTADORES 78
Solución actividad
Se desea disponer de una función C para realizar retardos de
precisión del orden de milisegundos. Reloj del ? C de 12 Mhz.
void delay_ms(unsigned int mseg)
{
long l;
unsigned int desbordes, resto;

l = 1000L * mseg; /* ciclos máquina en us */


desbordes = (l / 65536) + 1; /*incluye desborde del resto*/
resto = 65536 - (l % 65536);
TR0=TF0=0; /*garantizar condiciones iniciales adecuadas*/
TMOD |= 0x01;
TMOD &= 0xF1; /* modo 1, temporizador, control soft. */
TL0 = resto & 0x00FF;
TH0 = resto >> 8;
TR0 = 1; /* a correr */

while(desbordes)
if (TF0)
{
TF0 = 0;
desbordes--;
}
TR0 = TF0 = 0;
}

TEMPORIZADORES Y CONTADORES 79
Actividad
Conseguir que el tiempo a nivel alto y a nivel bajo sean distintos.
sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A, IEN0=0xA8;
sbit TR0=TCON^4, IT0=TCON^0, ET0=IEN0^1, EAL=IEN0^7;

#define T_ON 1000


#define T_OFF 2000
#define P_OUT P1.0

unsigned char t_on_h, t_on_l, t_off_h, t_off_l;

void main(void) {
t_on_h = T_ON / 256; t_on_l = T_ON % 256;
t_off_h = T_OFF / 256; t_off_l = T_OFF % 256;
TMOD = 0x01;
TH0 = t_on_h; TL0 = t_on_l;
P_OUT = 1;
ET0 = 1; EAL = 1; TR0 = 1; /* a correr */
while (1)
{ /* otras cosas */ }
}

void T0 (void) interrupt 1


{
TR0=0;
P_OUT++; /* complementar salida */
if (P_OUT) {
TH0 = t_on_h; TL0 = t_on_l;
} else {
TH0 = t_off_h; TL0 = t_off_l;
}
TR0=1;
}

TEMPORIZADORES Y CONTADORES 80
? EJERCICIO:
– Realizar un programa en lenguaje C, que configure el TEMPORIZADOR-0
en modo 2 (Temporizador/Contador de 8 bits con autorrecarga), de forma
que genere una interrupción con cada overflow. El manejador de
interrupción tendrá como única misión invertir el valor de P3.5

SOLUCIÓN:
7 6 5 4 3 2 1 0

IEN0 1 0 0 0 0 0 1 0 = $82

EAL WDT ET2 ES0 ET1 EX1 ET0 EX0

7 6 5 4 3 2 1 0

TMOD 0 0 0 0 0 0 1 0 = $02

GATE C/T M1 M0 GATE C/T M1 M0

TIMER-0

TEMPORIZADORES Y CONTADORES 81
sfr TMOD=0x89,TCON=0x88,TH0=0x8C,TL0=0x8A, IEN0=0xA8, P3=0xB0;
sbit TR0=TCON^4;

void T0_int (void) interrupt 1; /* Rutina Timer-0 */

void main (void)


{
/* Inicialización de registros */
IEN0 = 0x82; /* Habilitación Interrupciones */
TMOD = 0x02; /* Configuración Timer-0 */
TH0 = 0x05; /* Valor inicial en TH0 */
TL0 = 0x05; /* Valor inicial en TL0 */
TR0 = 1; /* Arranque del Timer-0 */
while (1) {}
}

void T0_int (void) interrupt 1


{
P3.5 = ~P3.5; /* Invertir salida */
}

TEMPORIZADORES Y CONTADORES 82
Bibliografía

[Domíng2001] C. Domínguez, J.M. Martínez, A. Perles, J. Albaladejo, H.


Hassan. “Curso de Informática Industrial: Aplicación con el
microcontrolador”. Ed. Universidad Politécnica de Valencia,
2001.

[Campelo1998] J. C. Campelo, A. Perles, F. Rodríguez. “Microcontroladores


Intel MCS-51. Arquitectura y programación”. Ed. Universidad
Politécnica de Valencia, 1.998.

[Martínez2001] J.M. Martínez, C. Domínguez, A. Perles, H. Hassan, J.


Albaladejo. “Problemas de microcontroladores de la familia
MCS-51”. Ed. Universidad Politécnica de Valencia, 2001.

[Intel1994] MCS-51 Microcontroller Family User´s Manual.

TEMPORIZADORES Y CONTADORES 83

También podría gustarte