La llamada existente a sprintf
parece ser la forma correcta de hacer el formateo del número, ya que parece que stdio.h está disponible. El búfer buf
debe contener "0", "1", "2", etc. Pero no está claro si eso está sucediendo o no ...
Un buen primer diagnóstico es agregar un mensaje de banner, para probar si el enlace serial 8051 está funcionando. Tal vez el puerto serie no estaba siendo inicializado? Tal vez el software del terminal está configurado a la velocidad de transmisión incorrecta? ¿O tal vez el cable serial es defectuoso?
Como segundo diagnóstico, intente imprimir un valor numérico constante y conocido. Código sugerido edita abajo:
char[] szBannerMessage = "\r\n""Hello from 8051""\r\n"; // [MarkU] test message
/* main function */
void main()
{
initialize(); // [MarkU] -- looks like initialize() wan't being called?
// [MarkU] -- test serial port by sending a string message
p = szBannerMessage; puts_p();
// [MarkU] -- test sprintf decimal number formatting
sprintf(buf, "%d\n", 231);
p = buf; puts_p();
IE = 0x81;
EX0 = 1;
EA = 1;
while (1)
{
}
}
// [MarkU] -- put string. @pre global char* p points to null-terminated C string.
// encapsulated d-coder's existing code
void puts_p(void)
{
while(*p)
{
P2 = *p; // diagnostic: also send character to port P2.7..P2.0
putc1(*p++);
}
}
Con estas ediciones, cada vez que se reinicie el 8051, su firmware debería enviar:
Hello from 8051
231
Si no ves aparecer ninguna de estas dos líneas en la ventana de tu terminal, hay un problema con el enlace serial.
- reinicia el 8051 pero manténlo encendido. Tal vez el reloj no sea estable cuando se enciende por primera vez?
- ¿el software del terminal está configurado a la velocidad de transmisión incorrecta?
- ¿El cable serie está defectuoso?
Si solo ve la primera línea pero no el 231
, entonces el puerto serie está funcionando, pero por alguna razón, el sprintf(buf, "%d", c)
no está formateando el número.
- verifique el listado, ¿se ha declarado buf [] en el espacio de dirección de memoria correcto?
Otros diagnósticos: vea si su compilador de C genera una lista de ensamblaje de las instrucciones reales de 8051, y un archivo de mapa que muestra dónde están todas las funciones y variables. El 8051 tiene varios espacios de direcciones, por lo que los compiladores de C que tienen como destino 8051 tienen extensiones para indicar a qué espacio de direcciones pertenece cada variable. Además, verifique si el enlazador está apuntando a la variante de 8051 correcta. Esta arquitectura de microcontrolador ha existido durante décadas, y hay muchas variaciones. Si el compilador está creando código para un chip de 65K y está colocando datos en una memoria externa (xram), pero el chip de destino es un chip de 2k más pequeño sin xram, eso no va a funcionar.
Sobre el controlador de interrupciones. A largo plazo, sería una mejor práctica evitar el envío de cadenas de puerto serie dentro del controlador de interrupción, ya que las rutinas de servicio de interrupción generalmente tienen la intención de responder rápidamente a una condición de hardware y regresar a la tarea de primer plano lo más rápido posible. Enviar un personaje a través del puerto serie es relativamente lento, por lo que el 8051 pasará mucho tiempo en la interrupción. Es bastante común que una rutina de interrupción simplemente capture los registros de hardware y establezca una marca global, para que el bucle while principal se ocupe de ello más adelante. Además, las rutinas de puerto serie a veces se implementan utilizando interrupciones, por lo que en ese tipo de sistema es importante evitar usar el puerto serie desde otro controlador de interrupciones, ya que el procesador ya está manejando una interrupción y no puede administrar otra hasta la primera. Vuelve y el 8051 sale del modo de interrupción. Pero como la tarea principal es un bucle vacío y la rutina en serie no usa interrupciones, no debería haber conflicto en este caso.