Forum: Mikrocontroller und Digitale Elektronik Code übersetzen von ATmega8515 auf ATtiny2313


von Hans D. (Gast)


Lesenswert?

Guten Tag allerseits,

ich möchte auf einem ATtiny2313 die DMX-Empfangsroutine von Hendrik 
Hölscher (danke übrigens) zum Laufen bringen. Allerdings noch ohne 
Erfolg.

Folgender Code:

//DMX-Empfangsroutine
ISR (UART_RX_vect)
{
  uint8_t USARTstate= UCSRA;            //get state
  uint8_t DmxByte= UDR;              //get data
  uint8_t DmxState= gDmxState;          //just get once from SRAM!!!


  if (USARTstate &(1<<FE))            //check for break
  {
    UCSRA &= ~(1<<FE);              //reset flag
    DmxCount= DmxAddress;            //reset frame counter
    gDmxState= BREAK;
  }

  else if (DmxState == BREAK)
  {
    if (DmxByte == 0)
    {
      gDmxState= STARTB;            //normal start code detected
      gDmxPnt= ((uint8_t*)DmxField +1);
    }
    else gDmxState= IDLE;
  }

  else if (DmxState == STARTB)
  {
    if (--DmxCount == 0)            //start address reached?
    {
      gDmxState= STARTADR;
      DmxField[0]= DmxByte;
    }
  }

  else if (DmxState == STARTADR)
  {
    uint8_t *DmxPnt;
    DmxPnt= gDmxPnt;
    *DmxPnt= DmxByte;
    if (++DmxPnt >= (DmxField +DMX_CHANNELS))   //all ch received?
    {
      gDmxState= IDLE;
    }
    else gDmxPnt= DmxPnt;
  }
}
//********************************************************************** 
*********************


//DMX Reception Initialisation
void init_DMX(void)
{
UBRRH  = 0;
UBRRL  = ((F_OSC/4000)-1);            //250kbaud, 8N2
UCSRC |= (3<<UCSZ0)|(1<<USBS);
UCSRB |= (1<<RXEN)|(1<<RXCIE);
gDmxState= IDLE;

uint8_t i;
for (i=0; i<DMX_CHANNELS; i++)
  {
  DmxField[i]= 0;
  }
}


Ich habe nur die Interruptroutine und die Funktion zur Initialisierung 
angehängt.

Der Compiler spuckt nun immer die Warnung aus "../dmx_splitter_2.c:36: 
warning: 'UART_RX_vect' appears to be a misspelled signal handler".

Wo könnten meine Fehler liegen? Es werden keine DIP-Schalter zur 
Adresseingabe ausgelesen (diese bleibt immer auf 1).

Was muss ich noch alles ändern? Wo habe ich Fehler? HIILLFEEEE!!

Danke

von Thomas R. (Gast)


Lesenswert?

> warning: 'UART_RX_vect' appears to be a misspelled signal handler".

Dort liegt Dein Fehler, der erste zu mindestens.

Er heißt Hans, aber Du nennst ihn Klaus!

von Hans D. (Gast)


Lesenswert?

Hallo Thomas,

das habe ich mir auch schon gedacht.

Aber wie buchstabiert man "Hans"?  ;-)


Vielen Dank

von Jörg G. (joergderxte)


Lesenswert?

>Aber wie buchstabiert man "Hans"?  ;-)
Das Datenblatt sagt folgendes
1
 8 0x0007 USART0, RX     USART0, Rx Complete
2
 9 0x0008 USART0, UDRE  USART0 Data Register Empty
3
10 0x0009 USART0, TX     USART0, Tx Complete
4
          ^^^^^^^^^^
Also würde ich raten, dass es "ISR(USART0_RX_vect)" heißt 
(wahrscheinlich hat einer bei Atmel die Namen irgendwo kopiert ;) )
hth, Jörg

von Karl H. (kbuchegg)


Lesenswert?

Hans D. wrote:
> Hallo Thomas,
>
> das habe ich mir auch schon gedacht.
>
> Aber wie buchstabiert man "Hans"?  ;-)

Wenn man es nicht auswendig weiß, sieht man in einem Wörterbuch nach. 
Dein Wörterbuch heißt Dataenblatt.

Wenn alle Stricke reißen, kann man immer noch im inclue File für den 
Tiny nachsehen, was so ähnlich heisst.
Hinweis: Hat ein AVR mehere UART, dann heist der eine zb UART0_RX_vect 
und der andere UART1_RX_vect.

Sieh im Include File nach. Du wirst die Stelle schon finden. Einfach mal 
nach UART suchen und schon solltest du das rausgefunden haben.

von Hans D. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

leider hatte ich einige Tage keine Zeit um weiter zu machen. Im Anhang 
findet Ihr den C-Code, der mir die Probleme bereitet.

Meine neuen Erkenntnisse:

Ich habe in der Interruptroutine zu Testzwecken einen Ausgang des µC 
Anfangs gesetzt und dann wieder gelöscht. Die LED an diesem Ausgang 
leuchtet (Mittlerweile auskommentiert).

Dies heißt doch dann für mich, dass der µC in die Interruptroutine 
springt. Heißt das gleichzeitig, dass auch die Initialisierung richtig 
ist? Die Frage deshalb, weil die If-Anweisung im Hauptprogramm nicht 
ausgeführt wird, also keine Datenbytes übergeben/verarbeitet werden.

Wäre super, wenn jemand von Euch einen Tip für mich hat.

Die Anwendung soll nichts anderes machen, als einen Ausgang zu setzen, 
wenn DMX i. O. oder einen zweiten Ausgang, wenn DMX n.i.O.

Vielen Dank.

von Henne (Gast)


Lesenswert?

Dann schau doch im Simulator, wie weit Du kommst.

Oder setze die LED bei versch. States (Break erkannt, SC erkannt,...)

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.