Forum: Mikrocontroller und Digitale Elektronik Dmx senden mit einem mega16


von Ralf R. (rralf)


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!

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.