Attiny2313 Problem mit DMX

Gast #1990386
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.
Gast #1993059
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
Gast #1993853
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?
Gast #1994056
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.
(Firma: TravelRec.) Persönliche Seite #1994163
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.
Gast #1994677
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.
Gast #6187678
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

.
Angehängte Dateien:
Gast #6187728
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

.
Angehängte Dateien:
Gast #6187735
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren