Code übersetzen von ATmega8515 auf ATtiny2313

Gast #1213938
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
#1213974
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
#1213977
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.
Gast #1221064
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.
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