mikrocontroller.net

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


Autor: Hans D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Hans D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

das habe ich mir auch schon gedacht.

Aber wie buchstabiert man "Hans"?  ;-)


Vielen Dank

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber wie buchstabiert man "Hans"?  ;-)
Das Datenblatt sagt folgendes
 8 0x0007 USART0, RX     USART0, Rx Complete
 9 0x0008 USART0, UDRE  USART0 Data Register Empty
10 0x0009 USART0, TX     USART0, Tx Complete
          ^^^^^^^^^^
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hans D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Henne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann schau doch im Simulator, wie weit Du kommst.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.