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

BzKaBrC2eO64AAAAAElFTkSuQmCC

fwCvkvsLvm3wJ4vtb7+HdWuQkRP4PD+L2YYJWSz4AAAAASUVORK5CYII=

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 cont es menor que duty.
  • 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:

  1. Se borra el flag RI.
  2. Se comprueba que el valor recibido sea igual o menor que 100.
  3. 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 239
  • TH0 = 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

Entradas relacionadas: