Forum: Mikrocontroller und Digitale Elektronik uart interrupt enable Problem


von Matthias L. (Gast)


Lesenswert?

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
1
UDR1 = 0x01;
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

von Hannes L. (hannes)


Lesenswert?

RX ist aber nicht Senden, sondern Empfangen.

...

von Matthias L. (Gast)


Lesenswert?

>RX ist aber nicht Senden, sondern Empfangen.

Ja, darum geht es ja:

>>Ich habe folgendes Problem:
>>Ich will den uart-reception-complete interrupt aktivieren.

von Johannes M. (johnny-m)


Lesenswert?

Welcher AVR? Sicher, dass der Vektor "USART1_RX_vect" heißt und nicht 
"USART1_RXC_vect"?

von Matthias L. (Gast)


Lesenswert?

Sorry, ist ein mega128. Die 103C-Fuse ist auch abgeschaltet.

Der Vektorname ist direkt aus der iom128.h herauskopiert:
(Auszug)
1
/* USART1, Rx Complete */
2
#define USART1_RX_vect      _VECTOR(30)
3
#define SIG_USART1_RECV      _VECTOR(30)
4
#define SIG_UART1_RECV      _VECTOR(30)

Ich denke mal, wenn der Vektor falsch zeigt, dann würde er wohl 
abstürzen, aber andere INTs arbeiten

von Stefan E. (sternst)


Lesenswert?

Hast du Interrupts auch global enabled?

von Matthias L. (Gast)


Lesenswert?

Ja, hab ich:
>Andere ISRs arbeiten zuverlässig.

von Stefan E. (sternst)


Lesenswert?

Ja, manchmal muss man nicht nur doppelt, sondern gleich 3-mal hingucken. 
;-)
1
UCSR1B |=  (1<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);

(1<RXCIE1)  ->  (1<<RXCIE1)

von Matthias L. (Gast)


Lesenswert?

@ Stefan Ernst (sternst):

Ich würde sagen, du hast dir ein Bierchen verdient:

Es geht nääääääämlich jetzt....

PS:
Was macht eigentlich (1<RXCIE1) ??

von Johannes M. (johnny-m)


Lesenswert?

> (1<RXCIE1)  ->  (1<<RXCIE1)
AAAAAAARRRGGHHHH!!!

Matthias Lipinsky wrote:
> Was macht eigentlich (1<RXCIE1) ??
Das ist ein logischer Ausdruck, der 1 ist, wenn die Zahl 1 kleiner als 
RXCIE1 ist, andernfalls 0...

von Matthias L. (Gast)


Lesenswert?

>Das ist ein logischer Ausdruck, der 1 ist, wenn die Zahl 1 kleiner als
>RXCIE1 ist, andernfalls 0...

Jetzt sehe ichs auch..

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
Noch kein Account? Hier anmelden.