mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Attiny2313 Problem mit DMX


Autor: J.Hebeler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"
#define F_CPU 16000000

#define dmx_size 2      // number of used DMX channels

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define BAUD 250000L    // DMX512          
 
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) 
 
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif
 
// global variables

volatile uint8_t DmxArray[dmx_size];    // DMX data
volatile uint8_t flag;        // new data available
  

int main(void) 
{
  DDRB = 0xff;
  PORTB |= (1 << PB3) | (1 << PB4);
  //PWM config
  TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10);
  TCCR1B = (1 << CS10) | (1 << CS11)| (1 << WGM12);

  OCR1AL = 255;
  OCR1BL = 255;
// UART config
 
    UBRRH = 0;
    UBRRL = 3;
    UCSRB = (1<<RXCIE) | (1<<RXEN);

  DmxArray[0] = 255;
  DmxArray[1] = 255;

  sei();   

// main loop

  while (1) {
    if (!flag) {
      set_sleep_mode(SLEEP_MODE_IDLE);
      sleep_mode();
    }
    else {
      flag=0;
      OCR1AL = DmxArray[0];
      OCR1BL = DmxArray[1];
      if(OCR1AL == 255)
      {
        TCCR1A &= ~(1 << COM1A1);
        PORTB |= (1 << PB3);
      }
      else if(OCR1AL == 0)
      {
        TCCR1A &= ~(1 << COM1A1);
        PORTB &= ~(1 << PB3);
      }
      else
      {
        TCCR1A |= (1 << COM1A1);
      }
      if(OCR1BL == 255)
      {
        TCCR1B &= ~(1 << COM1B1);
        PORTB |= (1 << PB4);
      }
      else if(OCR1BL == 0)
      {
        TCCR1B &= ~(1 << COM1B1);
        PORTB &= ~(1 << PB4);
      }
      else
      {
        TCCR1A |= (1 << COM1B1);
      }
    }
  }
}

// UART RX complete interrupt

ISR(USART_RX_vect) {
    static uint16_t dmx_channel=0, dmx_base=1;
    uint8_t status, data;
  int16_t index;
 
    // read UART data, also clears interrupt flag            
    status = UCSRA;
  data = UDR;

  if (status & (1<<FE)) {          // frame error
    if (data==0) {            // break -> DMX Reset
      dmx_channel=0;
      dmx_base = 8;
      flag=1;              // trigger update
    }
    else                // rx error
      dmx_channel++;
  }
  else {
    index = dmx_channel-dmx_base;
    if (index>=0 && index<dmx_size)
      DmxArray[index]=data;
    dmx_channel++;
  }
}

Ich hoffe ihr könnt mir helfen und allen noch schöne restliche 
Feiertagsstunden.

Autor: J.Hebeler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: J.Hebeler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Weiter hab ich noch nicht draufgeschaut.

Gruss,
T.

Autor: J.Hebeler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: J.Hebeler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/RE und DE richtig beschaltet?

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: J.Hebeler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: J.Hebeler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.