¿Cómo enviar correctamente los datos que recibí a través de I2C a través de UART?

1

Estoy usando un atmega328p y escribiendo firmware para mostrar los datos que recibo a través de i2c en masilla.

Leí los datos que recibo de la siguiente manera:

/* Receive data from slave. */                                                                                      
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);                                                                          
while(!(TWCR & (1<<TWINT)));                                                                                        

libuart_send((char*)TWDR,1);

donde:

 void libuart_send(unsigned char *data, int data_size)                                                               
 {                                                                                                                       
    for(int i = 0; i < data_size; i++)                                                                                
    {                                                                                                                   
        /* Wait for empty transmit buffer */                                                                             
        while ( !( UCSR0A & (1<<UDRE0)) );                                                                              

        /* Put data into buffer, sends the data */                                                                      
        UDR0 = data[i];                                                                                               
    }                                                                                                                   
 } 

Puedo ver con mi analizador lógico que recibo 0x00:

Sinembargo,cuandotratodeverlosdatoscorrespondientesconmasilla,soloobtengounsímboloextrañocomosiloestuvieraemitiendoincorrectamente:

He estado tratando de averiguar cómo se define el registro TWDR para tratar de entender si estoy emitiendo algo incorrectamente, pero no encontré la información que estaba buscando. Tenga en cuenta que mi función libuart_send funciona perfectamente bien cuando hago algo como esto libuart_send('A', 1); , pero no cuando reemplazo el primer argumento por TWDR. En otras palabras, la velocidad en baudios está perfectamente bien.

¿Alguien sabe por qué estoy viendo este personaje extraño en lugar del número 0 en masilla?

Gracias

    
pregunta traducerad

2 respuestas

0

Creo que lo estás echando mal. Lo más probable es que lea el valor 0x00 en TWDR y lo emita como un puntero desde donde leer el carácter imprimible.

Prueba esto:

unsigned char tempval;
tempval = TWDR;
libuart_send(&tempval, 1);

Pero si el valor del carácter recibido es 0, esto imprimirá el carácter NULO, no imprimirá el número o el carácter "0" que es lo que puede desear.

char tempstring[6];
tempstring[0]='0'+(tempval/100);
tempval=tempval%100;
tempstring[1]='0'+(tempval/10);
tempval=tempval%10;
tempstring[2]='0'+tempval;
tempstring[3]=0x0d;
tempstring[4]=0x0a;
tempstring[5]=0x00;
libuart_send(&tempstring, 6);
    
respondido por el Justme
4

Está enviando un cero, el problema es que desea ver una representación de imprimible de 0, que es código de carácter 0x30, no valor bruto 0x00.

Necesitarás un programa de terminal que pueda mostrar valores brutos como un volcado hexadecimal o escribir código en el lado de Atmega que expande cada byte en una representación hexadecimal de dos caracteres o una decimal de hasta tres caracteres.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas