www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART RX interrupt löst nicht aus


Autor: Ephraim Hahn (ephi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin hier am Verzweifeln mit dem DMX empfangsteil meines DMX 
Demultiplexers. Und zwar löst der einfach nicht aus. Die Hardware des 
Empfangsteils hab ich mal angehängt. Hab die schaltung schon einige male 
überprüft, auch mal einen anderen 75176 eingesetzt, hilft alles nichts. 
Auch ohne die galvanische trennung (75176 direkt an RXD) brachte keinen 
erfolg.

Ich vermute softwareseitig irgend ein Problem, kann aber nichts finden.

Im Anhang ist der komplette code, hier mal noch die relevanten Auszüge:
// init DMX interface
void init_dmx(int ch)
{
  LED_DDR |= (1<<LED);            // status LED
  LED_PORT |= (1<<LED);
  
  DmxAddress = ch;              // set start address
  
  unsigned int ubrr = 1;            // 250kBaud
  UBRRH = (unsigned char)(ubrr>>8);
  UBRRL = (unsigned char)ubrr;

  UCSRC = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);  // 8n2
  UCSRB = (1<<RXEN)|(1<<RXCIE);
  
  gDmxState = IDLE;
}

// DMX reception interrupt
ISR(USART_RXC_vect)
{
  LED_PORT ^= (1<<LED);
  static uint16_t DmxCount;
  uint8_t USARTstate = UCSRA;        // get state before data!
  uint8_t DmxByte = UDR;          // get data
  uint8_t DmxState = gDmxState;      // just load once from SRAM to increase speed
  
  if(USARTstate & (1<<FE))        // check for break
  {
    UCSRA &= ~(1<<FE);          // reset flag (necessary for simulation in AVR Studio)
    DmxCount = DmxAddress;        // reset channel counter (count channels before start address)
    gDmxState = BREAK;
  }
  else if(DmxState == BREAK)
  {
    if(DmxByte == 0)
      gDmxState = STARTB;        // normal start code detected
    else
      gDmxState = IDLE;
  }
  else if(DmxState == STARTB)
  {
    if(--DmxCount == 0)          // start address reached?
    {
      DmxCount = 1;          // set up counter for required channels
      DmxRxField[0] = DmxByte;    // get 1st DMX channel of device
      gDmxState = STARTADR;
    }
    //LED_PORT ^= (1<<LED);
  }
  else if(DmxState == STARTADR)
  {
    DmxRxField[DmxCount++] = DmxByte;  // get channel
    if(DmxCount >= sizeof(DmxRxField))   // all ch received?
      gDmxState = IDLE;        // wait for next break
  }        
}

und die main.c
#include "main.h"
#include "dmx.h"
#include "dac.h"

int main(void)
{
  int i=0;
  
  CHDATA out;
  
    init_dac();    // init dac
  init_dmx(1);  // init dmx
    
  sei();      // enable interrupts
  
  while(1)
  {
    out.data[0] = DmxRxField[0];
    out.bit.adc = out.bit.adc << 2;
    dac_output(1, out);
    if(i == 7)
      i = 0;
  }
  
    return 0;  
}

Die DAC Ausgabe funktioniert einwandfrei (manuell werte ausgeben tut),
nur an meiner Status LED tut sich nix (auch schon seperat erfolgreich 
getestet).

Die DMX Daten kommen übrigens von einem weiteren Controller + 75176, der 
aber definitiv funktioniert (Einen angeschlossenen PAR56 LED 
Scheinwerfer kann ich damit problemlos steuern).

Ich hab auch schon die beiden DMX Adern vertauscht, ohne erfolg...

Wäre super wenn mir jemand weiterhelfen kann!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der 6N137 keinen Strom kriegt, wie soll er dann funktionieren? VCC 
auf 8,7 bleibt offen. Hoffentlich ist an RX weiter links ein 
Pullup-Widerstand. Ausserdem kommt dein RX invertiert an, denn der 137 
liefert 0 wenn's leuchtet.

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kommst du darauf, dass er keinen Strom kriegen sollte?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, dein seltsames IC-Schema hatte mich irritiert. Aber mit VCC auf 
Pin 7 hast du jedenfalls den Ausgang des Detektors kurzgeschlussen.

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und die Eingangsschaltung ist 1:1 von hier übernommen:
http://www.digital-enlightenment.de/demux.htm

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pin 7 ist laut Datenblatt bei der single channel version ein Enable 
eingang, die Zeichnung des IC inneren ist etwas verwirrend, bzw falsch.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat der RX(/Pin6 am 6n137) noch irgendwo einen Pullup?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ephraim Hahn schrieb:

> und die Eingangsschaltung ist 1:1 von hier übernommen:
> http://www.digital-enlightenment.de/demux.htm

Geht's etwas direkter? Hab keine Lust, den ganzen Webserver zu 
durchsuchen.

Jedenfalls ist üblicherweise Pin 7 offen und an den Ausgang gehört ein 
Pullup. Eingezeichnet ist bei dir keiner, aber was links davon ist beibt 
ja unsichtbar.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ephraim Hahn schrieb:

> Pin 7 ist laut Datenblatt bei der single channel version ein Enable
> eingang, die Zeichnung des IC inneren ist etwas verwirrend, bzw falsch.

Hast Recht, weiter hinten wird's klar. Ist also egal ob offen oder VCC.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jedenfalls ist der Ausgang vom 6N137 genau dann 0, wenn die LED 
leuchtet, und das tut sie bei RX=1. Das passt nur dann, wenn DMX 
gegenüber RS485 invertiert definiert sein sollte oder die A/B-Inputs 
verdreht wurden.

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
viel direkter gehts nicht, ist alles in einem packet downloadbar:
http://www.digital-enlightenment.de/prdemux.php3

vermutlich sind A und B einfach verdreht, aber es tut ja bei beiden 
polungen nicht. In der schaltung ist auch kein pullup eingezeichnet, der 
geht direkt an RXD.

Ich werds gleich mal mit pullup versuchen.

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also, es lag wohl wirklich am fehlenden pull-up. Ich hab jetzt einfach 
mal den internen aktiviert. Zumindest wird die ISR jetzt ausgelöst. Ich 
bekomm zwar noch keine brauchbaren DMX Daten, aber das muss ich dann 
nochmal nach schauen...

Autor: Ephraim Hahn (ephi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gut, jetzt tut soweit alles, hatte nochn paar kleine fehler drin, z.B. 
hab ich vergessen i in der Hauptschleife hochzuzählen.

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.