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!