Recepción serie por soft usando el Timer

A veces tenemos que utilizar más de una USART y nuestro micro no tiene más que una.
La emulación software de una USART que trae CCS nos ha sacado a todos de más de un apuro pero tiene un inconveniente importante: mientras envías o recibes un byte pierdes el control del micro, y tu programa se queda esperando a que la rutina de envío o recepción finalice.


En mi caso estoy trabajando con un 18F a 12MIPS y he necesitado implementar una recepción serie por software a 1200 baudios. Esto quiere decir que mientras mi micro recibe un byte, tiene que esperar:
1200 baudios -> cada bit dura 833us -> cada byte tiene 1 bit start + 8 bits datos + 1 bit stop = 10 bits -> total espera 8330 us = 8.3ms

En ese tiempo el micro a 12MIPS habría podido ejecutar 100.000 instrucciones, y en según que aplicaciones no te puedes permitir ese derroche de recursos.

Para no tener esa pérdida de tiempo, y puesto que tenía un Timer libre, he escrito esta pequeña rutina que recibe un byte usando cualquier pin. Lógicamente se podría modificar para que la recepción la hiciera sobre un buffer y para distintas velocidades de transmisión pero no era mi propósito hacer una rutina tan compleja:

#int_timer1
void RecibeByte() {
static int8 Capturando,Dato,BitsLeidos;
set_timer1(55535);   // Esta precarga está calculada para 1200 baudios = 833us
if (Capturando) {    // Ya estábamos capturando el byte
if (++BitsLeidos==9) {   // Si hemos capturado el último bit
Capturando=0;       // ya no capturamos más
ByteRecibido=Dato; // Cargamos el dato sobre una variable global.
// Aquí se podría almacenar sobre buffer
} else {
Dato=Dato*2+input(PIN_D3);  // acumulamos el bit recibido en el pin D3
}
} else {
if (!input(PIN_D3)) {    // He leído un cero, que es el bit de Start
BitsLeidos=0;  // Inicializamos las variables
Dato=0;
Capturando=1;
}
}
}

Como he dicho antes, la rutina se puede mejorar para hacerla más flexible a otras circunstancias, y también se puede escribir una análoga para hacer la transmisión con el Timer, pero esa tarea la dejaré para quien esté interesado en hacerla.

Espero que sirva de ayuda

Share