mostrando binario sobre AVR UART

0

Estoy intentando interconectar un IC controlador de Ethernet ENC28J60 con un ATmega16 µC. Para depurar mi código, construí un circuito UART, escribí el código apropiado y puedo mostrar cualquier cadena o carácter a través de él en mi PC.

Pero no puedo mostrar el contenido del registro de ENC28J60 a través de UART ya que los contenidos están en formato binario. Busqué en Google pero no encontré una forma de mostrar datos binarios a través de UART. Cualquier ayuda, orientación o comentario es bienvenido.

Mi código SPI para acceder a los registros ENC28J60.

uint8_t ENC_readControlRegister()
{
 //pull PC5(chip select) pin low.
 PORTC = (0<<5);
 //put the command corresponding to ECON1 register into SPDR register.
 SPDR = 0x1F;
 //wait until transmission is complete.
 while(!(SPSR)&(1<<SPIF)) {};
 //make PC5(chip select) pin high to signify completion of sending command.
 PORTC = (1<<5);

 //read the received data.
 return(SPDR);
}   

ahora, ¿cómo imprimir los datos uint8_t recibidos de esta función en formato binario?

    
pregunta Horrible Guy

3 respuestas

2

itoa() le permitirá convertir un int en una representación de cadena en cualquier radix del 2 al 36. Recomiendo seguir con 2, 8 o 16 para mostrar datos binarios.

    
respondido por el Ignacio Vazquez-Abrams
0

¿Tienes un printf disponible? Para un controlador pequeño, probablemente deba configurarlo primero, pero luego simplemente podría

#include "stdio.h" 

y debería estar bien para mostrar cualquier variable que desee de la forma que desee sin demasiada manipulación manual ...

Para tu caso puedes usar:

printf("0x%08x", var);

donde var es la variable de 32 bits que desea mostrar

    
respondido por el Tom L.
0

Personalmente prefiero convertir a hexadecimal. A continuación se muestra el código que uso en la plataforma ARM de Stellaris para imprimir enteros de 64 bits en formato hexadecimal. Debe ser razonablemente fácil de portar a AVR y 8 bits. Simplemente cambie de 64 bits a 8 bits y reduzca la longitud del búfer para contener 1 carácter por cada 4 bits en su número más un byte NULO que marca el final de la cadena.

void printUint64HexToUart( uint64_t number ) { 
        char message[ 18 ];

        int8_t i = 17; 
        message[ i-- ] = 0;

        // Convert each 4 bits into a single character.
        do {
                uint8_t nibble = number & 0x0f;
                if ( nibble <= 9 ) { 
                        message[ i-- ] = ( number & 0x0f ) + '0';
                } else {
                        message[ i-- ] = ( number & 0x0f ) + 'a' - 10; 
                }   
                number >>= 4;
        //} while ( number );   // Suppress leading zeroes.
        } while ( i >= 0 );     // Print leading zeroes.

        i++;

        // Output the string to UART.
        while ( message[ i ] != 0 ) { 
        do { } while ( ROM_UARTBusy( UART0_BASE ) );            // Wait for room in UART output buffer
                ROM_UARTCharPut( UART0_BASE , message[ i++ ] ); // Output a single character to UART.
        }   
}
    
respondido por el jippie

Lea otras preguntas en las etiquetas