UART RX interrupt löst nicht aus

OP #1595685
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!
Angehängte Dateien:

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