UART RX interrupt löst nicht aus

OP #1595685
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:
#1595707
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.
OP #1595811
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.