Hallo Leute.
Ich habe folgendes Problem:
Ich will den uart-reception-complete interrupt aktivieren.
Aber irgendwie klappt das nicht.
VIelleicht sehe ich ja auch den Wald vor lauter Bäumen nicht.
Die Initialisierung:
1 | void init_comm ( void )
|
2 | {
|
3 | //-- hardware initialisation ----------
|
4 | DDRD |= (1<<PD3)|(0<<PD2);
|
5 | UBRR1H = 0;
|
6 | UBRR1L = 25; //38,4kBaud@16MHz
|
7 | UCSR1B |= (1<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
|
8 | UDR1 = 0x12; // <= DAS KOMMT IM TERMINAL AN
|
Mit
kann ich senden. Das empfange ich im Terminal => Baudrate ok.
Die ISR wird nie angesprungen, weil PB5 nicht toggelt. (PB ist Ausgang)
Andere ISRs arbeiten zuverlässig.
1 | ISR ( USART1_RX_vect )
|
2 | {
|
3 | UDR1 = UDR1;
|
4 | PORTB ^= (1<<PB5);
|
5 | ..
|
6 | }
|
Schreibe ich allerdings in die main, in das while(1) folgendes, und
lasse das (1<RXCIE1) weg, funktioniert es jedenfalls: (Was ich sende,
empfange ich wieder über das Terminal)
1 | while(1)
|
2 | {
|
3 | if ( UCSR1A & (1<<RXC1) )
|
4 | {
|
5 | UDR1 = UDR1;
|
6 | PORTB ^= (1<<PB5);
|
7 | }
|
8 | ...
|
Aber warum geht der INT nicht?? Es kommt mir so vor, als ob der nicht
freigeschaltet wird. Aber was mace ich falsch...?
DIe Zeile
1 | UCSR1B |= (1<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
|
ist doch korrekt, oder??
Hat jemand eine Idee?
PS: Codeschnipsel sind herein kopiert