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


von Ephraim H. (ephi)


Angehängte Dateien:

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:
1
// init DMX interface
2
void init_dmx(int ch)
3
{
4
  LED_DDR |= (1<<LED);            // status LED
5
  LED_PORT |= (1<<LED);
6
  
7
  DmxAddress = ch;              // set start address
8
  
9
  unsigned int ubrr = 1;            // 250kBaud
10
  UBRRH = (unsigned char)(ubrr>>8);
11
  UBRRL = (unsigned char)ubrr;
12
13
  UCSRC = (1<<URSEL)|(3<<UCSZ0)|(1<<USBS);  // 8n2
14
  UCSRB = (1<<RXEN)|(1<<RXCIE);
15
  
16
  gDmxState = IDLE;
17
}
18
19
// DMX reception interrupt
20
ISR(USART_RXC_vect)
21
{
22
  LED_PORT ^= (1<<LED);
23
  static uint16_t DmxCount;
24
  uint8_t USARTstate = UCSRA;        // get state before data!
25
  uint8_t DmxByte = UDR;          // get data
26
  uint8_t DmxState = gDmxState;      // just load once from SRAM to increase speed
27
  
28
  if(USARTstate & (1<<FE))        // check for break
29
  {
30
    UCSRA &= ~(1<<FE);          // reset flag (necessary for simulation in AVR Studio)
31
    DmxCount = DmxAddress;        // reset channel counter (count channels before start address)
32
    gDmxState = BREAK;
33
  }
34
  else if(DmxState == BREAK)
35
  {
36
    if(DmxByte == 0)
37
      gDmxState = STARTB;        // normal start code detected
38
    else
39
      gDmxState = IDLE;
40
  }
41
  else if(DmxState == STARTB)
42
  {
43
    if(--DmxCount == 0)          // start address reached?
44
    {
45
      DmxCount = 1;          // set up counter for required channels
46
      DmxRxField[0] = DmxByte;    // get 1st DMX channel of device
47
      gDmxState = STARTADR;
48
    }
49
    //LED_PORT ^= (1<<LED);
50
  }
51
  else if(DmxState == STARTADR)
52
  {
53
    DmxRxField[DmxCount++] = DmxByte;  // get channel
54
    if(DmxCount >= sizeof(DmxRxField))   // all ch received?
55
      gDmxState = IDLE;        // wait for next break
56
  }        
57
}

und die main.c
1
#include "main.h"
2
#include "dmx.h"
3
#include "dac.h"
4
5
int main(void)
6
{
7
  int i=0;
8
  
9
  CHDATA out;
10
  
11
    init_dac();    // init dac
12
  init_dmx(1);  // init dmx
13
    
14
  sei();      // enable interrupts
15
  
16
  while(1)
17
  {
18
    out.data[0] = DmxRxField[0];
19
    out.bit.adc = out.bit.adc << 2;
20
    dac_output(1, out);
21
    if(i == 7)
22
      i = 0;
23
  }
24
  
25
    return 0;  
26
}

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!

von (prx) A. K. (prx)


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.

von Ephraim H. (ephi)


Lesenswert?

Wie kommst du darauf, dass er keinen Strom kriegen sollte?

von (prx) A. K. (prx)


Lesenswert?

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

von Ephraim H. (ephi)


Lesenswert?

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

von Ephraim H. (ephi)


Lesenswert?

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

von g457 (Gast)


Lesenswert?

Hat der RX(/Pin6 am 6n137) noch irgendwo einen Pullup?

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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.

von Ephraim H. (ephi)


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.

von Ephraim H. (ephi)


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

von Ephraim H. (ephi)


Lesenswert?

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

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.