Me gustaría saber si una tasa de baudios de 9600 es tan rápida para una MCU 8051 usando un cristal de 11.0952Mhz. ¿Por qué? He observado cierta inconsistencia en el comportamiento de mi MCU, ya que cuando envío un conjunto de caracteres en busca de un carácter en particular para realizar ciertas operaciones, descubro que mi MCU no realiza la operación requerida. Lo que significa que hubo un extravío a lo largo de la línea durante la recepción. Luego hice una rutina en serie. Envié un "ABC" desde la terminal a la MCU, que debería transmitir a la terminal un incremento de cada carácter enviado, por lo tanto, debería dar "BCD". Pero esto es lo que obtuve constantemente: "BD" falta "C". Lo que significa que la MCU se perdió "B". También envío otro conjunto de personajes y descubrí que la MCU no detecta algunos personajes. Cuál podría ser la causa de esto. ¿Podría ser la tasa de baudios 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!
¿Cómo se obtienen los caracteres del registro del búfer del puerto serie? Si simplemente los lee en un bucle como
void main() {
char c;
while (1) {
c=SBUF;
do_something(c);
}
}
Entonces perderá caracteres una vez que el tiempo de ejecución de do_something() se alargue. Tenga en cuenta que esto incluye el tiempo dedicado a las interrupciones. El puerto serie 8051 no tiene fifos de hardware, un carácter será sobrescrito por el siguiente si no fue leído a tiempo.
Nuestra solución fue leer los caracteres en un Ringbuffer durante la interrupción en serie y usar el FIFO en el bucle principal. Funciona (con interrupción de alta prioridad) para 460800 Baud con cristal de 7,3728 MHz en un Silabs 80C51FXXX.
Como ahora vemos el código fuente, el error ahora está claro: esperas en el bucle principal a que se envíe tu personaje. Pero eso significa que espera un "tiempo de carácter" completo sin poder leer su búfer de carácter de interrupción, y otros pocos ciclos para detectar y leer el siguiente. Esto es demasiado largo si el remitente envía los caracteres rápido, como lo hace una PC.
Con un cristal de 11,0952 MHz, la tasa de bits máxima para el 8051 es de 57600 bps, por lo que ese no debería ser el problema. Además, parece que recibes bien algunos caracteres. Es posible que desee verificar las respuestas a su otra pregunta nuevamente si no está seguro acerca de la tasa de bits.
toby jaffey
pablo a
toby jaffey
pablo a