Forum: Mikrocontroller und Digitale Elektronik Attiny2313 Problem mit DMX


von J.Hebeler (Gast)


Lesenswert?

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.

von J.Hebeler (Gast)


Lesenswert?

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.

von J.Hebeler (Gast)


Lesenswert?

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

von T.O. (Gast)


Lesenswert?

Hallo,

wird "flag" vor dem ersten Abfragen mit Sicherheit(!) auf einen
definierten Wert gesetzt ?

Weiter hab ich noch nicht draufgeschaut.

Gruss,
T.

von J.Hebeler (Gast)


Lesenswert?

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.

von Christoph S. (mixer) Benutzerseite


Lesenswert?

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

von J.Hebeler (Gast)


Lesenswert?

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?

von Dietmar (Gast)


Lesenswert?

/RE und DE richtig beschaltet?

von TestX .. (xaos)


Lesenswert?

hast du mal nen oszi an den RX pin gehalten und geschaut was ankommt ? 
evtl ist dein dmx signal fehelrhaft.
ansonsten hier mal ein 4kanal pwm dmx dimmer auf basis eines 2313 von 
mir, funktioniert definitiv
Beitrag "DMX Receiver - 4Channel PWM (2*8bit lin, 2*16bit exp) - AtTiny2313"

von J.Hebeler (Gast)


Lesenswert?

>>/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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Dietmar (Gast)


Lesenswert?

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.

von J.Hebeler (Gast)


Lesenswert?

>>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.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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

.

von S. Landolt (Gast)


Lesenswert?

> 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.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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

.

von S. Landolt (Gast)


Lesenswert?

> 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.

von Stefan (Gast)


Lesenswert?

Dann mache ich mal gerade ein neuen Beitrag auf. Mit der richtigen 
Datei.
Sorry...

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.