Hallo zusammen,
zu Lernen, AVR-Controller zu programmieren möchte ich mir gerne einen
DMX-Empfänger bauen. Da habe ich nun folgendes Problem:
Mein Code muss irgendeinen Fehler haben, sodass der Controller nicht in
die ISR springt. Dies habe ich getestet, inden ich in der ISR einen Pin
anschalten wollte. Ich verwende einen ATMega8 mit AVRStudio und GCC.
Hier meine Röutine um den USART zu initialisieren:
1 | void USART_init(void)
|
2 | {
|
3 | UBRRL = BAUD_RATE; //setze auf 250 kBaud
|
4 | UBRRH = 0;
|
5 | UCSRA = 0; //lösche flags, schalte U2X aus
|
6 | UCSRB = (1<<RXCIE)|(1<<RXEN); //RXComplete Interrupt anschalten
|
7 | //Receiver anschalten
|
8 | UCSRC = (3<<UCSZ0);//8 Daten Bits, 1 Stop Bit, asynchron
|
9 | UDR = 0; //Daten-Register initialisieren
|
10 | }
|
und die ISR sieht so aus:
1 | ISR(USART_RXC_vect){
|
2 | if(i > 100)
|
3 | {
|
4 | PORTB |= (1<<PB2);
|
5 | i = 90;
|
6 | }
|
7 | else
|
8 | {
|
9 | PORTB &= ~(1<<PB2);
|
10 | i = 110;
|
11 | }
|
12 | }
|
i ist hier eine Testvariable, die in der main initialisiert wird. Ich
dachte mir das dann so: Wenn ein gültiges Byte empfangen wird wird der
Zustand von PB2 invertiert.
Lasse ich den Code der ISR in einer Endlosschleife des Hauptprogramms
laufen, funktionierts, in der ISR nicht. Die DMX Daten bekomm ich von
dem Interface von Digital Enlightenment, von dem ich weiß, dass es
funktioniert.
Könnt ihr mir helfen?
Grüße,
Stefan