Attiny2313 Problem mit DMX

Gast #1990386
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
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.
Gast
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
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.
Gast
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
>>/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.
Gast
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.
Gast
>>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
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
> 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.
Gast
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
> 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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.