mikrocontroller.net

Forum: Compiler & IDEs DMX senden und einstellungen


Autor: Janko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// ********************* Definitionen *********************
uint16_t     gDmxChannel;        
uint8_t        gDmxState;

enum {BREAK, STARTB, DATA};

#define F_OSC        (20000)       //oszi 20 MHz
#define IBG           (10)        // 10 µs pause

volatile uint8_t     DmxField[50];        //array DMX 
extern void init_DMX(void);


int main(void)
{
init_DMX();

DmxField[1]= 1;                //Ausgaben
DmxField[2]= 20;        
DmxField[3]= 30;
DmxField[4]= 0;
DmxField[5]= 40;
DmxField[6]= 0;
DmxField[7]= 50;
DmxField[8]= 0;
DmxField[9]= 60;
DmxField[10]=0;


sei();
while(1);
}


void init_DMX(void)
{
//Ports zum senden TXEN
DDRD |= (1<<PD3);
PORTD |= (1<<PD3);                //Senden einschalten

//USART 250kbaud
UBRR1H  = 9;
UBRR1L  = 4;                    

//asynchron wenn UMSEL Bits = 0 
//USBS = STOP bit
//UCSZ10 8 Datenbits
UCSR1C = (1<<USBS1)|(3<<UCSZ10);                                            
UCSR1B |= (1<<TXEN1)|(1<<TXCIE1);        //TXCIE interrupt 
UDR1    = 0;

gDmxState= BREAK;                            //start USART
}

// ****************** DMX Transmission ISR ********************

ISR(USART1_TX_vect)
{
uint8_t DmxState= gDmxState;

if (DmxState == BREAK)
    {
    UBRR1H  = 0;
    UBRR1L  = (F_OSC/1600);                    //90.9kbaud    
    
    UDR1    = 0;                                //break senden
    gDmxState= STARTB;
    }

else if (DmxState == STARTB)
    {
    ////250kbaud, für erneutes Start bit
    UBRR1H  = 9;
    UBRR1L  = 4;            


    UDR1    = 0;            //start byte senden
    gDmxState= DATA;
    gDmxChannel= 0;
    }

else
    {
    _delay_us(IBG);
    uint16_t DmxChannel= gDmxChannel;
    UDR1 = DmxField[DmxChannel++];                //data senden
    if (DmxChannel == sizeof(DmxField)) gDmxState= BREAK; //neuer break wenn alle daten gesendet sind
    else gDmxChannel= DmxChannel;
    }
}

Autor: Simon H. (der_hier)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Besserwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber DMX512 läuft eben mit 512kBit/s

Falsch! - Richtig ist 250 kBit/s

(DMX512 besitzt maximal 512 Kanäle)

Autor: Janko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.