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 si stema de contadores/temporizadores.
?
Sintetizar manejadores de interrupción para los contadores/temporizadores.
TEMPORIZADORES Y CONTADORES
2
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 si stema de contadores/temporizadores.
?
Sintetizar manejadores de interrupción para los contadores/temporizadores.
TEMPORIZADORES Y CONTADORES
2
Resumen de contenidos
1 Introd Introducci ucción. ón. 2 Los Temporiz Temporizadore adores/Con s/Contado tadores res 0 y 1. 2. 1 2. 2 2. 3 2. 4 2. 5 2. 6
Características básicas. Hardware involucrado. Diagrama de bloques. Registros SFR TMOD y TCON. Modos de funcionamiento. Ejemplos.
3 Interrupciones asociadas asociadas a los contadores/temporizadores. contadores/temporizadores. 4 Ejemplos Ejemplos de aplicación aplicación.. 4.1 4.1 4.2 4. 3 4. 4
Medic edició ión n del del anch ancho o de de un un pul pulso so positi sitivo vo.. Medición de del pe período de de un una se señal. Generación de un pulso. Generación de de un una se señal PW 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 PWM
PID analógico
Frecuencia 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
Nivel 0?
SI “0”
Incrementa cuenta Nivel 1?
SI
es_0: es_1:
“1”
... MOV DPTR,#0 JNB P1.0,es_0 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
Nivel 0?
SI “0”
Incrementa cuenta Nivel 1?
SI
“1”
unsigned int contador=0; while (!P1.0) {} while (P1.0) { 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 0
1 = cerrado
Contador Contador
C/T 1
pin T0 (P3.4)
GATE
pin /INT0 (P3.2)
TF0
Control 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 0
1 = cerrado
Contador Contador
C/T 1
pin T0 (P3.4)
TF0
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 0
1 = cerrado
Contador
C/T 1
pin T0 (P3.4)
TF0
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 0
1 = cerrado
Contador
C/T 1
pin T0 (P3.4)
TF0
Interrupción 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 0 C/T 1
pin T0
1 = cerrado
Contador
TF0
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 1/12
OSC
0
1 = cerrado
Contador
C/T 1 pin T0
TF0
Interrupción GATE
pin /INT0 TR0
T/C 1 TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7
GATE
C/T
T/C 1 b7
TF1
T/C 0
TR1
b0
M1
M0
T/C 0
TCON, dir. 88h, bit a bit TF0 TR0 IE1 IT1
b0
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 1/12
OSC
0
1 = cerrado
Contador
C/T 1 pin T0
TF0
Interrupción GATE
pin /INT0 TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7
GATE
C/T
T/C 1 b7
TF1
TR1
b0
M1
M0
T/C 0
TCON, dir. 88h, bit a bit TF0 TR0 IE1 IT1
b0
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 1/12
OSC
0
1 = cerrado
Contador
C/T 1 pin T0
Bit C/T GATE
TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7 C/T
T/C 1 b7
TF1
Interrupción
Selección modo contador o temporizador. 0 -> temporizador 1 -> contador
pin -INT0
GATE
TF0
TR1
b0
M1
M0
T/C 0
TCON, dir. 88h, bit a bit TF0 TR0 IE1 IT1
b0
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 0
0
1 = cerrado
Contador
C/T
1
pin T0 GATE
pin T0
pin /INT0
TF0
Interrupción Pulso muy estrecho: ¡se pierde!
TR0
C.M.C.M. ?
Operación como temporizador “1”= 12 ciclos “0” de “0”reloj). – Cuentan ciclos de máquina (1 ciclo máquina “0” (C.M.)
?
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 1/12
OSC
1 = cerrado
0
Contador
C/T 1 pin T0
Bit TR0
GATE
TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7 C/T
T/C 1
b0
M1
M0
T/C 0
b7
TF1
Interrupción
Activación T/C 0. 0 -> desactivado 1 -> activado
pin /INT0
GATE
TF0
TCON, dir. 88h, bit a bit
TR1
TF0
TR0
IE1
b0
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 1/12
OSC
1 = cerrado
0
Contador
C/T 1 pin T0
TF0
Interrupción
Bit GATE
GATE
Control de puerta. 0 -> interno (software) 1 -> externo (hardware)
pin /INT0 TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7
GATE
C/T
T/C 1
M0
T/C 0
b7
TF1
b0
M1
TCON, dir. 88h, bit a bit
TR 1
TF0
TR 0
IE1
b0
IT1
I E0
I T0
TEMPORIZADORES Y CONTADORES
28
2 - T/C 0 y T/C 1 en la familia MCS-51 2.4 Registros SFR TMOD y TCON 1/12
OSC
1 = cerrado
0
Contador
C/T 1 pin T0
0
1
GATE
Interrupción
D
Bit GATE
Control de puerta. 0 -> interno (software) 1 -> externo (hardware)
pin D/INT0 TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7
GATE
C/T
T/C 1
b0
M1
M0
T/C 0
b7
TF1
TCON, dir. 88h, bit a bit
TR 1
TF0
TF0
TR 0
IE1
b0
IT1
I E0
I T0
TEMPORIZADORES Y CONTADORES
29
2 - T/C 0 y T/C 1 en la familia MCS-51 2.4 Registros SFR TMOD y TCON 1/12
OSC
1 = cerrado
0
Contador
C/T 1 pin T0
1
0
GATE
Interrupción
1
Bit GATE
Control de puerta. 0 -> interno (software) 1 -> externo (hardware)
pin D/INT0 TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7
GATE
C/T
T/C 1
b0
M1
M0
T/C 0
b7
TF1
TCON, dir. 88h, bit a bit
TR 1
TF0
TF0
TR 0
IE1
b0
IT1
I E0
I T0
TEMPORIZADORES Y CONTADORES
30
2 - T/C 0 y T/C 1 en la familia MCS-51 2.4 Registros SFR TMOD y TCON 1/12
OSC
1 = cerrado
0
Contador
C/T 1 pin T0
GATE
TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7 C/T
T/C 1
b0
M1
M0
T/C 0
b7
TF1
Interrupción
Modo 0: Contador 13 bits. Modo 1: Contador 16 bits. Modo 2: Cont. 8 bit autorrecarga Modo 3: Desdoble (T/C0)
pin /INT0
GATE
Modo
TF0
TCON, dir. 88h, bit a bit
TR 1
TF0
TR 0
IE1
b0
IT1
I E0
I T0
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 1/12
OSC
1 = cerrado
0
1
000...010 000...001 000...000 111...111 111...110 111...101 111...100 Contador
C/T 1 pin T0
TF0
Interrupción
Contador
GATE
Registros SFR TH0 y TL0. Ascendente.
pin /INT0
Y cuando desborda ...
TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7
GATE
C/T
T/C 1
M0
T/C 0
b7
TF1
b0
M1
TCON, dir. 88h, bit a bit
TR1
TF0
TR0
IE1
b0
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 1/12
OSC
1 = cerrado
0
Contador
C/T 1 pin T0
Bit TF0 GATE
PERO NO SE DETIENE EL CONTADOR
TR0
TMOD, dir. 89h, por máscara M1 M0 GATE C / T
b7 C/T
T/C 1
b0
M1
M0
T/C 0
b7
TF1
Interrupción
Timer flag 0. 1 -> desborde
pin /INT0
GATE
TF0
TCON, dir. 88h, bit a bit
TR1
TF0
TR0
IE1
b0
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 f OSC =12MHz:
Duración de 1 Ciclo Máquina: 1 12MHz
*12=1? s
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? (f OSC=12MHz) Duración=2000000? s=1? s*Cuenta Duración=2000000? s=1? s*2000000
No No cabe cabe en en 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
0
0
0
0
1
1
1
0
2
1
1
3
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (los de menor peso) (13 bits en total). (los 3 bits de mayor peso de TLx son d e valor indeterminado) Tem pori zador/ cont ador de 16 bit s, con TH x y TL x en cascad a Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga para TLx tras c ada desbor dam ien to Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits, 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 0
1 = cerrado
C/T
MSB
TL0 TH0 5 bits Contador 8 bits
TF0
de menor peso
1 pin T0
Interrupción
13 bits
GATE pin /INT0 TR0
M1
M0
MODO 0: Contador de 13 bits Modo
0
0
0
0
1
1
1
0
2
1
1
3
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits en total). Temporizador/contador de 16 bits, con THx y TLx en cascad a Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga para TLx tras cada desbordamiento Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits, 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 0
MSB
1 = cerrado
TL0 TH0 Contador 8 bits 8 bits
C/T 1 pin T0
TF0
Interrupción
16 bits
GATE pin /INT0 TR0
M1
M0
MODO 1: Contador de 16 bits Modo
0
0
0
0
1
1
1
0
2
1
1
3
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits en total). Temporizador/contador de 16 bits, con THx y TLx en cascad a Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga para TLx tras cada desbordamiento Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits, 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 0
1 = cerrado
TL0 Contador 8 bits
C/T 1 pin T0
Recarga
GATE
TF0
Interrupción
TH0
pin /INT0
8 bits TR0
M1
M0
MODO 2: Contador de 8 bits con autorrecarga Modo
0
0
0
0
1
1
1
0
2
1
1
3
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits en total). Temporizador/contador de 16 bits, con THx y TLx en cascad a Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga para TLx tras cada desbordamiento Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits, 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
OSC
TH0 TH0
1/12
8 bits
??????
0 C/T 1
TL0 TL0
TF1
Intr
TF0
Intr
??????
8 bits
pin T0 GATE pin INT0
MODO 3: Desdoble T/C 0
TR0
M1
M0
Modo
0
0
0
0
1
1
1
0
2
1
1
3
Temporizador/contador de 8 bits con THx. TLx actúa como preescala de 5 bits (13 bits en total). Temporizador/contador de 16 bits, con THx y TLx en cascad a Temporizador/contador de 8 bits con autorrecarga. THx contiene el valor de recarga para TLx tras cada desbordamiento Para el temporizador 0, TL0 y TH0 son dos temporizadores/contadores de 8 bits, 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? – 0.
Cuenta T0
µC
TEMPORIZADORES Y CONTADORES
0 2 1
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 GATE
TMOD, dir. 89h, por máscara M1 M0 GATE C/T
C/T
0
T/C 1 b7
TF1
1T/C 0 0 M1
TCON, dir. 88h, bit a bit
TR1
TF0
TR0
IE1
b0 M0
1 b0
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 GATE
TMOD, dir. 89h, por máscara M1 M0 GATE C/T
C/T
0
T/C 1 b7
TF1
1T/C 0 0 M1
TCON, dir. 88h, bit a bit
TR1
TF0
TR0
IE1
b0 M0
1 b0
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; vehiculos = vehiculos << 8; TR0=1; /* arrancar timer */ vehiculos = vehiculos | TL0; while(1) { /* 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.
1Ciclo Máquina ?
12 Mhz 12 períodos de reloj
? 1 ? S
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? 16
2
?
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 GATE
TMOD, dir. 89h, por máscara M1 M0 GATE C/T
C/T
0
T/C 1 b7
TF1
0T/C 0 0 M1
TCON, dir. 88h, bit a bit
TR1
TF0
TR0
IE1
b0 M0
1 b0
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. ?
Descripción
Nombre
Cont./Temp. 0 Cont./Temp.1
T/C0 T/C1
Flag hab. Flag act. Núm Vector Borrado (IEN0) (TCON) Interrup ET0 TF0 000Bh Hw 1 ET1 TF1 001Bh Hw 3
OSC 1/12 C/T pin T0 pin /INT0
0 1
1 = cerrado
Contador
TF0
Interrupción GATE
TR0
Bit ET0
Habilitación de interrupción. TEMPORIZADORES Y CONTADORES
51
3 – Interrupciones asociadas a los T/C ? ?
Borrado automático al vectorizarse. (puesta a 0)
Permite sacar el máximo partido Liberan a la CPU de tener que encuestar flag de desborde Descripción
Nombre
Cont./Temp. 0 Cont./Temp.1
T/C0 T/C1
Flag hab. Flag act. Núm Vector Borrado (IEN0) (TCON) Interrup ET0 TF0 000Bh Hw 1 ET1 TF1 001Bh Hw 3
OSC 1/12 C/T pin T0 pin /INT0
0 1
1 = cerrado
Contador
TF0
Interrupción GATE
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 Descripción
Nombre
Cont./Temp. 0 Cont./Temp.1
T/C0 T/C1
Flag hab. Flag act. Núm Vector Borrado (IEN0) (TCON) Interrup ET0 TF0 000Bh Hw 1 ET1 TF1 001Bh Hw 3
OSC 1/12 C/T pin T0 pin -INT0
0 1
1 = cerrado
Contador
TF0
Interrupción GATE
TR0
Dirección de rutina interrupción.
void servicio (void)interrupt 1 { /* codigo */ } 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 Descripción
Nombre
Cont./Temp. 0 Cont./Temp.1
T/C0 T/C1
Flag hab. Flag act. (IEN0) (TCON) ET0 TF0 ET1 TF1
OSC 1/12 C/T pin T0 pin /INT0
0 1
Vector Borrado
Núm Interrup
000Bh
Hw
1
001Bh
Hw
3
1 = cerrado
Contador
TF0
Interrupción GATE
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. 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.
P1.0
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 T ?
1 10 Khz
?
0,1mS ? 100 ? S ? Semiperiod o ? 50 ? S (CM )
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 GATE
TMOD, dir. 89h, por máscara M1 M0 GATE M1 C/T C/T TIMER 1 TIMER 0
0
b7
TF1
0
1
TCON, dir. 88h, bit a bit
TR1
TF0
TR0
IE1
b0 M0
0 b0
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
?
pin T0
1
GATE
pin /INT0 TR0
0 0
Contador
1
TF0 Interrupción
0 ¡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
?
pin T0
1
GATE
pin /INT0 TR0
1
0 1
Contador
1
1
TF0 Interrupción
1 ¡Si 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 generar petición Interrupción externa:
Flanco bajada generar petición Interrupción externa:
Flanco bajada generar petición Interrupción externa:
Comenzar cuenta
Parar cuenta y procesar cuenta
Comenzar 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 temporizador y comenzar cuenta
El manejador de la interrupción del T/C 0, dará por finalizado 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; P2.0 = 1;
/* Arrancar temporizador. */ /* Comenienzo pulso. */
EAL = 1; /* habilitar interrupciones */ } void Timer0_int (void) interrupt 1 { TR0 = 0; P2.0 = 0; }
/* Parar temporizador */ /* Final del pulso */
TEMPORIZADORES Y CONTADORES
73
4 - Ejemplos de aplicación 4.3 Generar un pulso
Inicio:
MOV MOV
TCON,#$00 TMOD,#$01
;Asegurarse que el temporizador está parado. ;Temporizador en modo 1.
MOV
TH0,#HiTime
;Cargar T/C 0 con la cuenta para la ; duración del pulso.
MOV SETB
TL0,#LoTime TR0
;Arrancar temporizador.
SETB
P2.0
;Comenienzo pulso.
;Manejador interrupción del T/C 0. TC0INT: CLR P2.0 CLR RETI
TR0
;Final del pulso. ;Parar temporizador.
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. Valor “0” Valor “1”
Repetir
TEMPORIZADORES Y CONTADORES
75
4 - Ejemplos de aplicación 4.4 Generar una señal PWM
T0INT:
SetPWMHigh:
T0EX:
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
MOV
TH0,PWMHighH
MOV
TL0,PWMHighL
SETB
TR0
;Poner PWM a “1”.
;Reinicializar temporizador.
RETI
TEMPORIZADORES Y CONTADORES
76
4 - Ejemplos de aplicación 4.5 Leer un timer “al vuelo”
ReadTimer: MOV MOV MOV CJNE SJMP
ValH,TH0 ValL,TL0 A,TH0 A,ValH,ChkHigh RTEX
;Leer parte alta y baja.
ChkHigh:
ValL.7,RTEX
;Otro caso, verificar parte baja para ver ; si ha cambiado despúes de leer la parte ; alta original. ;Si ha cambiado, usar la segunda lectura ; de la parte alta
JB
MOV RTEX:
ValH,A
;Leer nuevamente parte alta. ;Ha cambiado? ;Si no, la primera lectura es válida.
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; while (1) { /* otras cosas */ } }
/* a correr */
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 #define T_OFF #define P_OUT
1000 2000 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 IEN0
1 EAL
TMOD
6
5
4
3
2
1
0
0
0
0
0
0
1
0
ET2
ES0
ET1
EX1
ET0
EX0
WDT
7
6
5
4
3
2
1
0
0
0
0
0
0
0
1
0
M1
M0
M1
M0
GATE
C/T
GATE
C/T
= $82
= $02
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; void main (void) { /* Inicialización de registros */ IEN0 = 0x82; TMOD = 0x02; TH0 = 0x05; TL0 = 0x05; TR0 = 1; while (1) {} } void T0_int (void) interrupt 1 { P3.5 = ~P3.5; }
/* Rutina Timer-0 */
/* Habilitación Interrupciones */ /* Configuración Timer-0 */ /* Valor inicial en TH0 */ /* Valor inicial en TL0 */ /* Arranque del Timer-0 */
/* Invertir salida */
TEMPORIZADORES Y CONTADORES
82