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
> 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!
Hallo Thomas, das habe ich mir auch schon gedacht. Aber wie buchstabiert man "Hans"? ;-) Vielen Dank
>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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.