Dmx senden mit einem mega16

OP #601135
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)
1
int main(void){
2
        cli();
3
        MCUCSR |= (1<<JTD);
4
        MCUCSR |= (1<<JTD);
5
        lcd_init(LCD_DISP_ON);
6
        lcd_puts("test 123\nfoo bar");
7

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

11
        init_DMX();
12

13
        sei();
14
        lcd_clrscr();
15
        lcd_puts("Interrupts\naktiviert");
16
        for(;;){
17
                
18
        }
19
        return 0;
20
}
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
1
void init_DMX(void)
2
{
3
DDRD  |= (1<<PD2)|(1<<PD1);
4
PORTD |= (1<<PD2);
5
UBRRH  = 0;
6
UBRRL  = ((F_OSC/4000)-1);     //250kbaud, 8N2^M
7
UCSRC  = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);
8
UCSRB |= (1<<TXEN)|(1<<UDRIE);
9
UDR    = 0;
10

11

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

16
// ****************** DMX Transmission ISR ********************
17
ISR (UART_UDRE_vect)
18
{
19
if (CurDmxCh == DMX_CHANNELS)                           //all ch sent?
20
        {
21
        UCSRB &= ~(1<<UDRIE);          
22
       //disable Data empty irq
23
        UCSRB |=  (1<<TXCIE);
24
       //enable transmission complete irq
25
        }
26
else;                                   
27
        {
28
        UDR= DmxField[CurDmxCh++];                             
29
       //transmit byte
30
        }
31
}
32

33

34
// *************** Break generation ******************
35
ISR (UART_TX_vect)
36
{
37
UCSRB &= ~(1<<TXEN);                                           
38
//disable USART
39
UCSRB &= ~(1<<TXCIE);
40
PORTD &= ~(1<<PD1);
41
TCNT0  = ~(F_OSC/700);                                          //end time
42
TIFR   = (1<<TOV0);                                                     //clear flag
43
TIMSK |= (1<<TOIE0);                                            //enable overflow irq (indicates break end)
44
}
45

46

47
// **************** MARK generation ******************
48
ISR (TIMER0_OVF_vect)
49
{
50
PORTD |= (1<<PD1);                                                      //start MAB     
51
TIMSK &= ~(1<<TOIE0);                                           //disable this routine
52
CurDmxCh= 0;
53
_delay_us(7);
54
UCSRB |= (1<<TXEN);                                                    //enable USART^M
55
UCSRB |= (1<<UDRIE);                                                 
56
UDR= 0;                                                                         //send start byte
57
}

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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.