DMX 512 Empfänger -->> läuft
Hallo zusammen,
ich habe hier das MINI-USB-DMX-Interface von DMX4ALL, benutzte die DMXControl Software, einen ATmega8 mit 16MHz Quarz und einen MAX485. Der 120 Ohm Abschluss Widerstand ist auch drin.
Versuche jetzt einen Empfänger zu bauen. Ich habe darauf geachtet, das in DMXControl, im C Quelltext und im Gerätemanager die selben Baudraten und Anzahlen an Stopbits stehen.
In der ISR des UART, wenn ein Frame ansteht, wird auf Fehlererkennung getestet und wenn kein Fehler anliegt, UDR ausgelesen und auf PORT D gegeben, wo LED´s angeschlossen sind.
Dies ist mein Code, für den ich mich an anderen orientiert habe, die ich gefunden habe:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#define FOSC 16000000// Clock Speed
#define BAUD 38400
#define MYUBRR FOSC/16/BAUD-1
volatile unsigned int byte_counter = 0;
volatile unsigned char befehl [4] = {0};
volatile unsigned int time;
volatile unsigned char tmp;
volatile unsigned int tmp2;
void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1<<RXCIE)|(1<<RXEN);//|(1<<TXEN)
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);//(1<<USBS)|
}
SIGNAL (SIG_UART_RECV)//Frame Recieve Interrupt
{
unsigned char dummy;
byte_counter++;
if((UCSRA & 0b00010000)== 16)//Frame Error?
{//JA/////////////
byte_counter = 0;
dummy = UDR;
}
else
{ //NEIN/////////////
tmp = UDR;
if (byte_counter == 3) PORTD = tmp;//Kanal 3 auslesen
}
}
int main (void)
{
USART_Init(MYUBRR);
DDRD = 0b11111110;
sei();
main2:
goto main2;
return 0;
}
Eingestellt ist Kanal drei. Allersings reagiert der Empfänger auch auf andere Kanäle weshalb ich vermute, dass die Starterkennung über den Framefehler nicht funktioniert. Außerdem wird auch nicht der Wert angezeigt, den ich am PC für den Kanal einstelle.
Erkennt hier jemand einen Fehler?
mfg,
The Man