Forum: Compiler & IDEs DMX senden und einstellungen


von Janko (Gast)


Lesenswert?

Ich versuche gerade ein Programm zum senden über DMX zu schreiben. 
Hierzu habe ich versucht den Quellcode von 
http://www.hoelscher-hi.de/hendrik/light/ressources.htm meinen 
Controller anzupassen.

Ich benutze einen ATMega 644P mit einem externen 20Mhz Oszillator.

Jedoch funktioniert das Programm noch nicht so ganz und ich weis nicht 
genau woran es liegt. Die Daten werden irgendwie noch nicht richtig 
gesendet. Wäre super wen jemand eine lösung hat.
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
// ********************* Definitionen *********************
7
uint16_t     gDmxChannel;        
8
uint8_t        gDmxState;
9
10
enum {BREAK, STARTB, DATA};
11
12
#define F_OSC        (20000)       //oszi 20 MHz
13
#define IBG           (10)        // 10 µs pause
14
15
volatile uint8_t     DmxField[50];        //array DMX 
16
extern void init_DMX(void);
17
18
19
int main(void)
20
{
21
init_DMX();
22
23
DmxField[1]= 1;                //Ausgaben
24
DmxField[2]= 20;        
25
DmxField[3]= 30;
26
DmxField[4]= 0;
27
DmxField[5]= 40;
28
DmxField[6]= 0;
29
DmxField[7]= 50;
30
DmxField[8]= 0;
31
DmxField[9]= 60;
32
DmxField[10]=0;
33
34
35
sei();
36
while(1);
37
}
38
39
40
void init_DMX(void)
41
{
42
//Ports zum senden TXEN
43
DDRD |= (1<<PD3);
44
PORTD |= (1<<PD3);                //Senden einschalten
45
46
//USART 250kbaud
47
UBRR1H  = 9;
48
UBRR1L  = 4;                    
49
50
//asynchron wenn UMSEL Bits = 0 
51
//USBS = STOP bit
52
//UCSZ10 8 Datenbits
53
UCSR1C = (1<<USBS1)|(3<<UCSZ10);                                            
54
UCSR1B |= (1<<TXEN1)|(1<<TXCIE1);        //TXCIE interrupt 
55
UDR1    = 0;
56
57
gDmxState= BREAK;                            //start USART
58
}
59
60
// ****************** DMX Transmission ISR ********************
61
62
ISR(USART1_TX_vect)
63
{
64
uint8_t DmxState= gDmxState;
65
66
if (DmxState == BREAK)
67
    {
68
    UBRR1H  = 0;
69
    UBRR1L  = (F_OSC/1600);                    //90.9kbaud    
70
    
71
    UDR1    = 0;                                //break senden
72
    gDmxState= STARTB;
73
    }
74
75
else if (DmxState == STARTB)
76
    {
77
    ////250kbaud, für erneutes Start bit
78
    UBRR1H  = 9;
79
    UBRR1L  = 4;            
80
81
82
    UDR1    = 0;            //start byte senden
83
    gDmxState= DATA;
84
    gDmxChannel= 0;
85
    }
86
87
else
88
    {
89
    _delay_us(IBG);
90
    uint16_t DmxChannel= gDmxChannel;
91
    UDR1 = DmxField[DmxChannel++];                //data senden
92
    if (DmxChannel == sizeof(DmxField)) gDmxState= BREAK; //neuer break wenn alle daten gesendet sind
93
    else gDmxChannel= DmxChannel;
94
    }
95
}

von Simon H. (der_hier)


Lesenswert?

Ich hoffe ich lehne mich nicht zuweit aus dem Fenster da ich doch auch 
noch Anfänger bin, aber
a) brauch delay.h nicht F_CPU (kann sein das F_OSC auch geht, weiß ich 
nicht Klärung wäre nett )Also bei mir kommt ne warnung wenn ich mit 
F_OSC Compiliere. Außerdem sollte F_CPU vor der delay.h definiert werden 
(sonst meckert mein compiler immernoch)

b) 20MHZ = 20000000Hz nicht 20000Hz(das sind 20KHz)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Simon H. schrieb:
> kann sein das F_OSC auch geht
Das geht schon, wenn man die Baudratenberechnung selber macht...

Aber DMX512 läuft eben mit 512kBit/s und nicht mit
>>> //90.9kbaud
Nimm mal ein Oszi und kontrollier dein Timing anhand der Zeichnung hier:
http://www.mikrocontroller.com/de/dmx512.php

von Besserwisser (Gast)


Lesenswert?

> Aber DMX512 läuft eben mit 512kBit/s

Falsch! - Richtig ist 250 kBit/s

(DMX512 besitzt maximal 512 Kanäle)

von Janko (Gast)


Lesenswert?

F_OSC ist nur der externe Oszillator, den CPU takt habe ich im AVR 
Studio bereits eingetragen.

Ich glaube das die baudberechnung beim UBRR noch falsch ist, ich muss da 
nochma nachschauen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.