Problema al recibir el protocolo DMX512 a través de ATmega88 USART

Estoy tratando de enviar el protocolo DMX512 y RDM a un Atmel ATmega88PA con muy pocos resultados últimamente. El USART recibirá los datos entrantes, pero el procesamiento no se realiza correctamente.

La idea detrás del siguiente código era verificar el exceso de datos, la interrupción y luego los datos reales en el ISR y algunas funciones secundarias.

ISR(USART_RX_vect){
//hw_wdt_enable();  
long data;
int temp;
while ( ! ( UCSR0A & ( 1 << RXC0 ) ) )
    ;

if ( UCSR0A & (1 << DOR0 ) ) 
{   // check for data over run
    data = UDR0; 
    temp = UCSR0A;
}
else if( UCSR0A & ( 1 << FE0 ) ) 
{   //some form of break detection
    data = UDR0; 
    temp = UCSR0A;
    rs485_break_received( data );
}   
else if( g_break_received )
{   //if we have a break msg is next
    g_break_received = 0;
    data = UDR0; 
    temp = UCSR0A;
    g_checksum = rs485_data_received ( data );
}
if ( g_checksum != 0 )
{
    g_error_count++;
}  }

void rs485_break_received ( uint8_t data ){ 
if ( 0 != s_slotNext )
{   // 2nd break, it's a DMX message
    // the whole message was received   
    s_pBuffer[s_slotNext] = data;
    uint8_t* pLast = s_pBuffer + s_slotNext;
    processing_queue_message ( s_pBuffer, pLast );
}
g_break_received = 1;
rs485_prepare_next_buffer ();  }

rs485_data_received comprueba la suma de comprobación del mensaje y pasará a processing_queue_message o devolverá un error.
processing_queue_message analiza los códigos de inicio para determinar si es un mensaje RDM o DMX.

Estoy usando un módulo DMXter 4 RDM para probar este código, tratando de transmitir un cambio de nivel a un solo canal, pero estoy obteniendo información que está muy fuera de lugar.

  1. Si realmente envío datos, el programa sigue funcionando.
  2. Si no hago clic en enviar, el programa salta constantemente a la parte de error de encuadre.
  3. Si voy por encima de 128/255 para que el nivel se transmita, el programa entrará en la parte g_break_received

2 y 3 suceden incluso antes de que haga clic en transmitir.

Creo que hay un problema al borrar el bit de error de trama en USCR0A, pero no estoy seguro de cómo corregirlo, ya que la hoja de datos solo dice leer el registro. ¿Hay alguna parte del estándar DMX que me falta? o tal vez otra forma de borrar el error de encuadre?

Respuestas (1)

No creo que sea una buena idea llamar a muchas funciones desde su controlador de interrupciones. Intente cambiarlo para que solo lea los datos en un búfer y borre cualquier posible error. Luego, tenga en su bucle principal una función para verificar los datos recibidos y procesarlos en consecuencia. Ese sería un primer paso para depurar su problema.

En una nota al margen, ¿ha intentado enviar otros tipos de datos, por ejemplo, caracteres ASCII a través de RS485 y ver si llegan a su placa?