mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dmx senden mit einem mega16


Autor: Ralf Ramsauer (rralf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich weis hier wurde das schonmal durchgekaut, bin aber nicht schlau 
geworden.
Ich will mir ein kleines DMX Testgerät bauen, um fehler in Leitungen zu 
finden. Dazu muss ich auf dem DMX-Protokoll senden können. Ich hab an 
dem Gerät ein hd44780 display, im moment noch von der fleury library 
angesteuert. Meine main() routine schaut so aus:
(ich verwende einen atmega16)
int main(void){
        cli();
        MCUCSR |= (1<<JTD);
        MCUCSR |= (1<<JTD);
        lcd_init(LCD_DISP_ON);
        lcd_puts("test 123\nfoo bar");

        for(unsigned char counter=0;counter<DMX_CHANNELS;counter++) 
              DmxField[counter]=123; // Als Testwert

        init_DMX();

        sei();
        lcd_clrscr();
        lcd_puts("Interrupts\naktiviert");
        for(;;){
                
        }
        return 0;
}
Normalerweise sollte man doch meinen, das das display jetzt
"Interrupts
aktiviert"
anzeigt? Tut es aber nicht. Der Controller schmiert mir direkt nach dem 
sei() ab und macht anscheinend nen reset oder so, kA was da genau 
vorgeht.

Den Code fuers DMX-senden hab ich aus folgendem Projekt:
http://www.hoelscher-hi.de/hendrik/light/dmxdimmer.htm
http://www.hoelscher-hi.de/hendrik/light/ressources/txd.zip

So schaut der DMX-Code aus
void init_DMX(void)
{
DDRD  |= (1<<PD2)|(1<<PD1);
PORTD |= (1<<PD2);
UBRRH  = 0;
UBRRL  = ((F_OSC/4000)-1);     //250kbaud, 8N2^M
UCSRC  = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);
UCSRB |= (1<<TXEN)|(1<<UDRIE);
UDR    = 0;


TIMSK  = 0;
TCCR0  = (1<<CS01)|(1<<CS00);               //set T0 @clck/64
}

// ****************** DMX Transmission ISR ********************
ISR (UART_UDRE_vect)
{
if (CurDmxCh == DMX_CHANNELS)                           //all ch sent?
        {
        UCSRB &= ~(1<<UDRIE);          
       //disable Data empty irq
        UCSRB |=  (1<<TXCIE);
       //enable transmission complete irq
        }
else;                                   
        {
        UDR= DmxField[CurDmxCh++];                             
       //transmit byte
        }
}


// *************** Break generation ******************
ISR (UART_TX_vect)
{
UCSRB &= ~(1<<TXEN);                                           
//disable USART
UCSRB &= ~(1<<TXCIE);
PORTD &= ~(1<<PD1);
TCNT0  = ~(F_OSC/700);                                          //end time
TIFR   = (1<<TOV0);                                                     //clear flag
TIMSK |= (1<<TOIE0);                                            //enable overflow irq (indicates break end)
}


// **************** MARK generation ******************
ISR (TIMER0_OVF_vect)
{
PORTD |= (1<<PD1);                                                      //start MAB     
TIMSK &= ~(1<<TOIE0);                                           //disable this routine
CurDmxCh= 0;
_delay_us(7);
UCSRB |= (1<<TXEN);                                                    //enable USART^M
UCSRB |= (1<<UDRIE);                                                 
UDR= 0;                                                                         //send start byte
}

Die Vektoren und init_dmx hab ich direkt aus dem anderen o.g. Projekt 
übernommen ( INTO und RXD von atmega8515, der chip aus dem anderen 
Projekt  sind pinkompatibel zu meinen mega16 ).

Aber warum schmiert er mir ab? Es kann doch eigentlich nur an den ISR 
Routinen liegen, oder?

Vielen dank!

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.