Recepción serie por soft usando el Timer
User Rating: / 6
PoorBest 
Tuesday, 17 November 2009 18:17

USART por softwareA 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

Last Updated on Monday, 08 February 2010 10:41