Hallo,
ich bin hier am Verzweifeln mit dem DMX empfangsteil meines DMX
Demultiplexers. Und zwar löst der einfach nicht aus. Die Hardware des
Empfangsteils hab ich mal angehängt. Hab die schaltung schon einige male
überprüft, auch mal einen anderen 75176 eingesetzt, hilft alles nichts.
Auch ohne die galvanische trennung (75176 direkt an RXD) brachte keinen
erfolg.
Ich vermute softwareseitig irgend ein Problem, kann aber nichts finden.
Im Anhang ist der komplette code, hier mal noch die relevanten Auszüge:
1 | // init DMX interface
|
2 | void init_dmx(int ch)
|
3 | {
|
4 | LED_DDR |= (1<<LED); // status LED
|
5 | LED_PORT |= (1<<LED);
|
6 |
|
7 | DmxAddress = ch; // set start address
|
8 |
|
9 | unsigned int ubrr = 1; // 250kBaud
|
10 | UBRRH = (unsigned char)(ubrr>>8);
|
11 | UBRRL = (unsigned char)ubrr;
|
12 |
|
13 | UCSRC = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS); // 8n2
|
14 | UCSRB = (1<<RXEN)|(1<<RXCIE);
|
15 |
|
16 | gDmxState = IDLE;
|
17 | }
|
18 |
|
19 | // DMX reception interrupt
|
20 | ISR(USART_RXC_vect)
|
21 | {
|
22 | LED_PORT ^= (1<<LED);
|
23 | static uint16_t DmxCount;
|
24 | uint8_t USARTstate = UCSRA; // get state before data!
|
25 | uint8_t DmxByte = UDR; // get data
|
26 | uint8_t DmxState = gDmxState; // just load once from SRAM to increase speed
|
27 |
|
28 | if(USARTstate & (1<<FE)) // check for break
|
29 | {
|
30 | UCSRA &= ~(1<<FE); // reset flag (necessary for simulation in AVR Studio)
|
31 | DmxCount = DmxAddress; // reset channel counter (count channels before start address)
|
32 | gDmxState = BREAK;
|
33 | }
|
34 | else if(DmxState == BREAK)
|
35 | {
|
36 | if(DmxByte == 0)
|
37 | gDmxState = STARTB; // normal start code detected
|
38 | else
|
39 | gDmxState = IDLE;
|
40 | }
|
41 | else if(DmxState == STARTB)
|
42 | {
|
43 | if(--DmxCount == 0) // start address reached?
|
44 | {
|
45 | DmxCount = 1; // set up counter for required channels
|
46 | DmxRxField[0] = DmxByte; // get 1st DMX channel of device
|
47 | gDmxState = STARTADR;
|
48 | }
|
49 | //LED_PORT ^= (1<<LED);
|
50 | }
|
51 | else if(DmxState == STARTADR)
|
52 | {
|
53 | DmxRxField[DmxCount++] = DmxByte; // get channel
|
54 | if(DmxCount >= sizeof(DmxRxField)) // all ch received?
|
55 | gDmxState = IDLE; // wait for next break
|
56 | }
|
57 | }
|
und die main.c
1 | #include "main.h"
|
2 | #include "dmx.h"
|
3 | #include "dac.h"
|
4 |
|
5 | int main(void)
|
6 | {
|
7 | int i=0;
|
8 |
|
9 | CHDATA out;
|
10 |
|
11 | init_dac(); // init dac
|
12 | init_dmx(1); // init dmx
|
13 |
|
14 | sei(); // enable interrupts
|
15 |
|
16 | while(1)
|
17 | {
|
18 | out.data[0] = DmxRxField[0];
|
19 | out.bit.adc = out.bit.adc << 2;
|
20 | dac_output(1, out);
|
21 | if(i == 7)
|
22 | i = 0;
|
23 | }
|
24 |
|
25 | return 0;
|
26 | }
|
Die DAC Ausgabe funktioniert einwandfrei (manuell werte ausgeben tut),
nur an meiner Status LED tut sich nix (auch schon seperat erfolgreich
getestet).
Die DMX Daten kommen übrigens von einem weiteren Controller + 75176, der
aber definitiv funktioniert (Einen angeschlossenen PAR56 LED
Scheinwerfer kann ich damit problemlos steuern).
Ich hab auch schon die beiden DMX Adern vertauscht, ohne erfolg...
Wäre super wenn mir jemand weiterhelfen kann!