Ich habe ein 2-Kanal PWM Dimmer auf Basis eines Attiny2313, Max485 und 2 Mosfets gebaut. Die Mosfets funktionieren und das PWM hat gezeigt, das es auch Funktioniert. Nur die DMX-Anbindung will nicht so recht. Es hat mal kurz Sporadisch funktioniert, Flakert ab jetzt nur noch ab und zu. Das DMX Signal ist einwandfrei, da es an anderen Geräten Funktioniert. Hier ist der Source Code, es ist eine Abwandlung aus diesem Hier: Beitrag "DMX512 Empfänger mit Relaisansteuerung für 20 Kanäle"
1 | #define F_CPU 16000000
|
2 | |
3 | #define dmx_size 2 // number of used DMX channels
|
4 | |
5 | #include <avr/io.h> |
6 | #include <avr/interrupt.h> |
7 | #include <avr/sleep.h> |
8 | |
9 | #define BAUD 250000L // DMX512
|
10 | |
11 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
12 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
13 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)
|
14 | |
15 | #if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
|
16 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
17 | #endif
|
18 | |
19 | // global variables
|
20 | |
21 | volatile uint8_t DmxArray[dmx_size]; // DMX data |
22 | volatile uint8_t flag; // new data available |
23 | |
24 | |
25 | int main(void) |
26 | {
|
27 | DDRB = 0xff; |
28 | PORTB |= (1 << PB3) | (1 << PB4); |
29 | //PWM config
|
30 | TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10); |
31 | TCCR1B = (1 << CS10) | (1 << CS11)| (1 << WGM12); |
32 | |
33 | OCR1AL = 255; |
34 | OCR1BL = 255; |
35 | // UART config
|
36 | |
37 | UBRRH = 0; |
38 | UBRRL = 3; |
39 | UCSRB = (1<<RXCIE) | (1<<RXEN); |
40 | |
41 | DmxArray[0] = 255; |
42 | DmxArray[1] = 255; |
43 | |
44 | sei(); |
45 | |
46 | // main loop
|
47 | |
48 | while (1) { |
49 | if (!flag) { |
50 | set_sleep_mode(SLEEP_MODE_IDLE); |
51 | sleep_mode(); |
52 | }
|
53 | else { |
54 | flag=0; |
55 | OCR1AL = DmxArray[0]; |
56 | OCR1BL = DmxArray[1]; |
57 | if(OCR1AL == 255) |
58 | {
|
59 | TCCR1A &= ~(1 << COM1A1); |
60 | PORTB |= (1 << PB3); |
61 | }
|
62 | else if(OCR1AL == 0) |
63 | {
|
64 | TCCR1A &= ~(1 << COM1A1); |
65 | PORTB &= ~(1 << PB3); |
66 | }
|
67 | else
|
68 | {
|
69 | TCCR1A |= (1 << COM1A1); |
70 | }
|
71 | if(OCR1BL == 255) |
72 | {
|
73 | TCCR1B &= ~(1 << COM1B1); |
74 | PORTB |= (1 << PB4); |
75 | }
|
76 | else if(OCR1BL == 0) |
77 | {
|
78 | TCCR1B &= ~(1 << COM1B1); |
79 | PORTB &= ~(1 << PB4); |
80 | }
|
81 | else
|
82 | {
|
83 | TCCR1A |= (1 << COM1B1); |
84 | }
|
85 | }
|
86 | }
|
87 | }
|
88 | |
89 | // UART RX complete interrupt
|
90 | |
91 | ISR(USART_RX_vect) { |
92 | static uint16_t dmx_channel=0, dmx_base=1; |
93 | uint8_t status, data; |
94 | int16_t index; |
95 | |
96 | // read UART data, also clears interrupt flag
|
97 | status = UCSRA; |
98 | data = UDR; |
99 | |
100 | if (status & (1<<FE)) { // frame error |
101 | if (data==0) { // break -> DMX Reset |
102 | dmx_channel=0; |
103 | dmx_base = 8; |
104 | flag=1; // trigger update |
105 | }
|
106 | else // rx error |
107 | dmx_channel++; |
108 | }
|
109 | else { |
110 | index = dmx_channel-dmx_base; |
111 | if (index>=0 && index<dmx_size) |
112 | DmxArray[index]=data; |
113 | dmx_channel++; |
114 | }
|
115 | }
|
Ich hoffe ihr könnt mir helfen und allen noch schöne restliche Feiertagsstunden.