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
volatileuint8_tDmxArray[dmx_size];// DMX data
22
volatileuint8_tflag;// new data available
23
24
25
intmain(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
elseif(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
elseif(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
staticuint16_tdmx_channel=0,dmx_base=1;
93
uint8_tstatus,data;
94
int16_tindex;
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.
Update:
Habe mal die TCCR1B durch TCCR1A ausgetauscht.
Habe die Initialisierung der UBBRH und UBBRL wieder auf das Originale
zurückgestellt.
Gebracht hat es noch nichts.
Noch etwas pushen hier.
Problem besteht immer noch.
Bin mit meinem Latein am ende.
Habe am RxD Pin des Tinys 0V gemessen, MAX485 wurde ausgewechselt, hat
aber keinen Effekt gehabt.
Habe die Verbindungen grob überprüft und es schien alles in Ordnung zu
sein.
Keine Kurzschlüsse und alles nach Schaltplan, bzw Datenblatt.
Danke für etwaige Hilfe.
MfG J.Hebeler
Nein, außer avr-gcc setzt die Variablen automatisch auf 0.
Was mich wundert ist die Tatsache, dass ein ähnliches Programm auf einen
Mega8(anderes Gerät) problemlos läuft.
Hallo,
kann der Tiny2313 auch sicher mit dem USART-Interrupt aus dem Sleep-Mode
aufgeweckt werden?
Lass doch mal den Sleep Mode raus und probier es so!
Gruss
Funktioniert auch noch nicht so recht.
Aber wenn ich mit dem Finger auf die Kontakte beim Max485 drücke
reagiert der Tiny auf das DMX signal und regelt nach.
Kann es sein, das der Max485 noch gegen Vcc/Gnd gezogen werden muss an
ieinem Datenpin?
>>/RE und DE richtig beschaltet?
Egt ja, bzw so wie ich es bisher bei 2 anderen, Funktionierenden
Schaltungen auch schon beschaltet habe.
Re und De zusammen an Int0 um den Tiny(AVR) aus dem Sleepmode zu wecken)
Verbindung ist da und auch richtig, zumindest das was ich Durchgepiept
habe.
>>hast du mal nen oszi an den RX pin gehalten und geschaut was ankommt ?
Noch nicht, mach ich noch, aber das DMX Signal ist vom Sender(uDMX)
sauber und wird auch von meinen anderen DMX-Empfängern angenommen und
ausgewertet, auch mit dem in dieser Schaltung verwendeten Max485, also
kann er nicht kaputt sein.
Danke für die Hilfe, werde mal weiter suchen.
J.Hebeler schrieb:> Re und De zusammen an Int0 um den Tiny(AVR) aus dem Sleepmode zu wecken)
Was soll das bringen? /RE und DE sind Eingänge am MAX485 und müssen mit
definiertem Pegel 0: Receiver enable oder 1: Driver enable beschaltet
werden.
RX am Tiny kann also nur bedient werden, wenn /RE=0 ist. DE sollte in
dem Fall auch 0 sein.
Und wenn die Schaltung nicht geändert werden kann oder soll den Int0 als
Ausgang definieren und fest auf low (0V) setzten.
Kannst du auch mal einfach testen. Dann sollte am Ausgang vom MAX485
auch ein Signal erscheinen.
>>Ausgang definieren und fest auf low (0V) setzten.
Das hat geholfen danke.
Der Tiny hat INT0 an einem anderen Port als RxD, beim Mega sind das aber
die gleichen.
Deswegen funktionierte das auch nicht so recht.
Hallo Zusammen,
ich bin zwar nicht ganz neu beim AVR, aber trotzdem stehe ich gerade
ziemlich auf dem Schlauch und komme nicht weiter...
Ich versuche ein DMX Relais zu bauen, mit nur einem Kanal. Ich habe mir
viele Sachen dazu im Netz angesehen und mir auch den Code von Herr Radig
angeschaut und habe darauf hin etwas zusammengebaut und programmiert.
Leider scheint er das Serielle Signal nicht zu erkennen. Ich weiss
tatsächlich nicht warum. Ich habe in einem Schaltbild gesehen, das am
besten noch ein 120 Ohm Widerstand zwischen A und B der Eingangsleitung
kommt. Den habe ich mal parallel mit in die Klemme gemacht, trotzdem
scheint er kein gültiges Signal auswerten zu können.
Fällt Euch etwas auf?
Viele Grüße
Stefan
.
> Fällt Euch etwas auf?
Dass nach neun Jahren ein eigener Thread angebracht wäre.
> ich bin zwar nicht ganz neu beim AVR ...
Ich auch nicht, finde aber die Stelle nicht, an der USART initialisiert
wird.
Sorry, in anderen Foren heisst es immer die alten Threads weiter zu
benutzen...
Du hast Recht. Das ist mir bei den Testversionen untergegangen. Jetzt
kommt er zumindest schon mal bis zu dem "dmx_valid = 0"... Das heisst
die LED flackert. Also erkennt er das Signal nicht als richtig?
Vielen Dank
.
> in anderen Foren ...
Im Gegensatz zu hier, deshalb unten der rote Hinweis.
Ist das jetzt gezeigte noch das alte Programm? Wo ist die
USART-Initialisierung?
Nur am Rande: mit DMX kenne ich mich eigentlich nicht aus, vielleicht
liest ja gerade ein Kompetenterer mit.