Implementación de PWM y Comunicación UART mediante Interrupciones en Microcontroladores
Clasificado en Informática
Escrito el en
español con un tamaño de 83,42 KB
Funcionamiento de la Rutina de Interrupción del Temporizador T0
Esta es la rutina de atención a la interrupción (ISR) del temporizador T0, el cual está configurado en el Modo 2 (8 bits con auto-recarga). Cuando se vectoriza la interrupción, se incrementa la variable cont; al alcanzar el valor 100, esta se inicializa a cero y se sigue incrementando en sucesivas vectorizaciones.
Antes de retornar de la ISR, se actualiza el bit 6 del puerto P1 (salida):
- Se establece en 1 si el valor de
contes menor queduty. - Se establece en 0 en el resto de los casos.
Gestión de la Interrupción de la UART
La rutina de atención a la interrupción de la UART se encarga de comprobar si se ha finalizado una recepción. En caso afirmativo, se procede con los siguientes pasos:
- Se borra el flag RI.
- Se comprueba que el valor recibido sea igual o menor que 100.
- Se copia dicho valor en la variable
duty.
Configuración Técnica del Temporizador T0
El temporizador T0 se ha configurado en Modo 2 (8 bits con auto-recarga) mediante la instrucción TMOD |= 0x02; y su gestión se realiza por interrupción: void ISR_T0(void) interrupt 1.
El periodo que temporiza viene definido por el valor de TH0, que se copia en TL0 cuando se sobrepasa el registro contador, considerando una frecuencia del oscilador de 2 MHz:
#define PRECAR_T0 239TH0 = TL0 = PRECAR_T0;
El cálculo del tiempo es el siguiente:
T = (12 / 2 MHz) * (256 – 239) = 6 µs * 17 = 102 µs
Cálculo del Ciclo de Trabajo y Lógica de la ISR
La rutina de atención a la interrupción del temporizador T0 incrementa la variable en cada vectorización y verifica si ha llegado al valor 100, en cuyo caso se reinicia a 0. Por lo tanto, entre dos inicializaciones a 0 consecutivas, la interrupción se ha vectorizado 100 veces.
Dado que entre dos interrupciones seguidas transcurren 102 µs, el tiempo total entre dos inicializaciones de cont es:
T = 100 * 102 µs = 10,2 ms
Código de la ISR T0:
void ISR_T0(void) interrupt 1
{
cont++;
if(cont == 100) cont = 0;
salida = cont < duty;
}Configuración de la UART y Tasa de Transferencia
La UART se ha configurado en el Modo 1 (8 bits con velocidad variable) utilizando el temporizador T1 y gestionado por interrupción:
void ini_UART(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = TL1 = PRECAR_T1;
PCON |= 0x80;
TR1 = 1;
IE |= 0x90;
}La tasa de transferencia (baudios) se determina según el valor del bit SMOD, la precarga de T1 y la frecuencia del oscilador:
Baudios = (2¹ / 32) * (fosc / (12 * (256 – 255))) = 10416,66 bd