Velocidad de transmisión para el microcontrolador 8051

4

Me gustaría saber si una velocidad de transmisión de 9600 es tan rápida para una MCU 8051 que utiliza un cristal de 11.0952 MHz. ¿Por qué? He observado cierta incoherencia en el comportamiento de mi MCU, ya que cuando envío un conjunto de caracteres en busca de un personaje en particular para realizar ciertas operaciones, descubro que mi MCU no realiza la operación requerida. Lo que significa que hubo un mal lugar a lo largo de la línea durante la recepción. Entonces hice alguna rutina en serie. Envié un "ABC" desde el terminal a la MCU, que debería transmitir al terminal un incremento de cada carácter enviado, por lo tanto, debería dar "BCD". Pero esto es lo que obtuve consistentemente - "BD" falta "C". Lo que significa que la MCU perdió "B". También envié otro conjunto de caracteres y descubrí que la MCU pierde algunos caracteres. Cuál podría ser la causa de esto. ¿Podría ser la velocidad de transmisión o en mi código. ¿Cómo puedo rectificar esto?

Aquí está el código.

void initUART()
{
  SCON = 0x50;
  TMOD = 0x20;
  TH1 = TL1 =-3;
  TR1 = 1;
}

void sendCHAR()
{
  SBUF = uartBUFF[s];
  while(!TI);
  TI=0;
}

void serial_isr(void) interrupt 4  
{
  if (RI)
  {
    RI = 0;
    tmpBUFF = SBUF;
    charFLAG=1;
  }
}

main()
{
  IE= 0x91;
  initUART();
  while (1)
  {
    if(charFLAG)
    {
      SBUF = (tmpBUFF+1);
      while(!TI);
      TI=0;
      charFLAG = 0;
    }
  }
}

¡Gracias!

    
pregunta Paul A.

2 respuestas

3

¿Cómo se obtienen los caracteres del registro del búfer del puerto serie? Si simplemente los lees en un bucle como

void main() {       
  char c;
  while (1) {
    c=SBUF;
    do_something(c);
  }
}

Entonces perderás caracteres una vez que el tiempo de ejecución de do_something () se haga más largo. Tenga en cuenta que esto incluye el tiempo gastado en intterrupts. El puerto serie 8051 no tiene hardware, se sobrescribirá un carácter por el siguiente si no se leyó a tiempo.

Nuestra solución fue leer los caracteres en un Ringbuffer durante el Intterupt serial, y usar el FIFO en el bucle principal. Funciona (con interrupción de alta prioridad) para 460800 baudios con 7,3728 MHz de cristal en un Silabs 80C51FXXX.

Actualizar

Como ahora vemos la fuente, el error está claro: esperas en el bucle principal para que se envíe tu personaje. Pero eso significa que esperas todo un "tiempo de caracteres" sin poder leer tu búfer de caracteres de interrupción, y otros pocos ciclos para detectar y leer el siguiente. Esto es demasiado largo si el remitente envía caracteres rápidamente, como lo hace una PC.

    
respondido por el Turbo J
3

Con un cristal de 11.0952 MHz, la tasa de bits máxima para el 8051 es de 57600 bps, por lo que no debería ser el problema. Además, parece que recibes algunos caracteres OK. Es posible que desee revisar las respuestas a su otra pregunta nuevamente si no está seguro acerca de la tasa de bits.

    
respondido por el stevenvh

Lea otras preguntas en las etiquetas