problema al recibir el protocolo DMX512 sobre ATmega88 USART

2

Estoy intentando 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 código siguiente fue 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 verifica la suma de comprobación en el mensaje y se moverá a processing_queue_message o devolverá un error.
processing_queue_message analiza los códigos de inicio para determinar si se trata de un mensaje RDM o DMX.

Estoy usando un módulo RDM DMXter 4 para probar este código, tratando de transmitir un cambio de nivel a un solo canal, pero recibo información que está muy lejos de la base.

  1. Si en realidad envío datos, el programa sigue funcionando.
  2. Si no hago clic en enviar, el programa está saltando constantemente a la parte Error de marco.
  3. Si subo por encima de 128/255 para el nivel a transmitir, el programa entrará en la parte g_break_received

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

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

    
pregunta user4756

1 respuesta

1

No creo que sea una buena idea llamar muchas funciones desde su controlador de interrupciones. Intente cambiarlo para que solo lea los datos en un búfer y elimine 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 pizarra?

    
respondido por el pedrokiefer

Lea otras preguntas en las etiquetas