Hallo,
ich versuche einen DMX-Sender zu bauen.
Das Problem ist, dass der Empfänger das Signal nicht richtig erkennt.
Nun meine Frage, ob ich ein Fehler im Denkweg habe, oder ob ich das
einfach falsch umsetze.
Globale Variablen, bzw. Definitionen
1 | #define WAIT_FLAG while(!flag)
|
2 |
|
3 | volatile char flag = 1;
|
4 | volatile char tmp = 1;
|
5 | volatile char daten[256];
|
Hier sind die Timereinstellungen: 250kHz bei 16MHz Takt
1 | TCCR0 = (1<<CS01) | (1<<CS00); // Prescaler 66
|
2 | TCNT0 = 256-1; //1 Zählschritt bis zum Überlauf
|
3 |
|
4 | // Interrupt Timer0
|
5 | TIMSK |= (1<<TOIE0);
|
6 | sei();
|
Hier ist der Code für das Frame.
1 | int x, y;
|
2 | //----------------------------------------------
|
3 | //---------Start des DMX Sendevorgangs----------
|
4 |
|
5 | tmp = 0;
|
6 | for(x = 0; x < 22; x++)
|
7 | {
|
8 | flag = 0;
|
9 | WAIT_FLAG;
|
10 | }
|
11 | //----------------------------------------------
|
12 |
|
13 | //----------------------------------------------
|
14 | //------------------DMX-Mark--------------------
|
15 |
|
16 | tmp = 1;
|
17 | for(x = 0; x < 2; x++)
|
18 | {
|
19 | flag = 0;
|
20 | WAIT_FLAG;
|
21 | }
|
22 | //----------------------------------------------
|
23 |
|
24 | //----------------------------------------------
|
25 | //----------------Startbyte---------------------
|
26 |
|
27 | tmp = 0;
|
28 | for( x = 0; x < 9; x++)
|
29 | {
|
30 | flag = 0;
|
31 | WAIT_FLAG;
|
32 | }
|
33 | tmp = 1;
|
34 | for( x = 0; x < 2; x++)
|
35 | {
|
36 | flag = 0;
|
37 | WAIT_FLAG;
|
38 | }
|
39 | //----------------------------------------------
|
40 |
|
41 | //----------------------------------------------
|
42 | //-------------------Bytes----------------------
|
43 |
|
44 | // for(x = 0; x < 256; x++);
|
45 | {
|
46 | tmp = 0;
|
47 | flag = 0;
|
48 | WAIT_FLAG;
|
49 | for(y = 0; y < 8; y++)
|
50 | {
|
51 | tmp = 1;//((daten[x]>>x) & 1);
|
52 | flag = 0;
|
53 | WAIT_FLAG;
|
54 | }
|
55 | for(y = 0; y < 2; y++)
|
56 | {
|
57 | tmp = 1;
|
58 | flag = 0;
|
59 | WAIT_FLAG;
|
60 | }
|
61 | }
|
62 | //----------------------------------------------
|
Und hier die Interrupt Routine:
1 | ISR (TIMER0_OVF_vect)
|
2 | {
|
3 |
|
4 | PORTB = (tmp << PB0);
|
5 | flag = 1;
|
6 |
|
7 | }
|
Vielen Dank,
Florian