UART Interrupt mit Mega8

OP #632035
Lesenswert?
• ▲
▼
Hallo,

ich versuche den UART Interrupt des Mega 8 zu aktivieren,
aber ich bekommen es nicht auf die Reihe.

Gesetzt habe ich:

UCSRB = (1<<RXCIE);
sei(); // Globaler Interrupt aktiviert.

Sobald nun in UCSRA das RXC gesetzt wird, sollte er doch in die
Interrupt Routine springen:

ISR(USART_RXC_vect)  // Daten Empfangen, Rx Complete
{

}

Das macht er aber nicht, habe ich was übersehen ??
Das Datenblatt habe ich schon rauf und runter gelesen....

Danke
Torsten
OP #632047
Lesenswert?
• ▲
▼
Naja, also die Interrupts sind aktiev, habe ja geschrieben sei().
Den (1<<RXEN) hatte ich auch gesetzt, aber das hat auch nichts geholfen.
Was meinst Du mit dem kompletten Code, ich habe im Interrupt eine LED 
aktiviert, aber die tut es eben nicht.

Hier nochmal alle Register, wenns denn hilft..

DDRC |=  _BV(PC0) |_BV(PC1) | _BV(PC2)| _BV(PC3) | _BV(PC4);   // Teile 
von PortC als Ausgang
  DDRC &=~ _BV(PC5);                   // Teile von PortC als Eingang



  DDRD |=  _BV(PD2) | _BV(PD5) | _BV(PD6) | _BV(PD7);  // Teile von 
PortD als Ausgang
  DDRD &=~ _BV(PD3) | _BV(PD4);               // Teile von PortD als 
Eingang
  PORTD |= _BV(PD3) | _BV(PD4);               // Teile von PortD PullUp


  DDRB |= _BV(PB0) | _BV(PB1) |  _BV(PB2) | _BV(PB3) | _BV(PB4) | 
_BV(PB5);    // Teile von PortB als Ausgang
  DDRB &=~  _BV(PB6) | _BV(PB7);              // Teile von PortB als 
Eingang
  PORTB |=  _BV(PB6) | _BV(PB7);              // Teile von PortB PullUp


  OSCCAL = eeprom_read_byte((uint8_t*)0xFF);



  TIFR = (1<<TOV0)|(1<<TOV1);
  TCCR0 = (1<<CS00)|(1<<CS01);
  TCCR1B = (1<<CS12)|(1<<CS10);


  UCSRB = (1<<RXCIE) | (1<<RXEN);



  TIMSK = (1<<TOIE0)|(1<<TOIE1);
OP #632550
Lesenswert?
• ▲
▼
naja, der USART funktioniert ja, denn wenn ich den  (UCSRA & (1<<RXC))
polle, bekomme ich Daten rein, kein Problem.

Aber gerne hier meine Init, genau nach Datasheet:

void USART_Init(void)
{
   UBRRH = (F_CPU/(UART_BAUD_RATE1*16l)-1) >> 8;
   UBRRL = (F_CPU/(UART_BAUD_RATE1*16l)-1);

// Enable Receiver and transmitter
   UCSRB = (1<<RXEN)|(1<<TXEN);
// Set frame format: 8data, 2stop bit
   UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

Ich habe auch gefunden woran es liegt, denn nur

UCSRB = _BV(RXCIE) |_BV(RXEN);

reicht nicht, es muß noch

 _BV(UDRIE)  mit dazu, und wenn ich das Datenblatt richtig verstehe muß 
auch noch in UCSRA einer gesetzt werden. Insgesamt sieht es dann so aus:

UCSRA = _BV(UDRE);
UCSRB = _BV(RXCIE) | _BV(UDRIE) | _BV(RXEN);

Dann springt er auch prima in den Interrupt.
Leider wird nun der Timer0 irgendwie beeinflusst, auch wenn der nicht in 
den Interrupt der Seriellen springt, scheint der Timer0 langsamer zu 
werden.

Mal sehen, ob ich das noch finde.

Gruß
Torsten
OP #632966
Lesenswert?
• ▲
▼
Ich habe den Eindruck das da irgendetwas mit dem Compiler nicht stimmt !

Wenn ich den
ISR(USART_RXC_vect)
benutze, springt er nur in den Interrupt wenn auch UDRIE gesetzt ist.
Aber er durchläuft dann nicht mehr das Hauptprogramm und verhält sich 
auch sonst "merkwürdig", als ob er überlastet ist.

Benutze ich hingegen den alten Ausdruck,
SIGNAL(SIG_UART_RECV)
dann scheint alles normal zu funktionieren und es muß auch nicht der 
UDRIE gesetzt sein.

Hat denn schonmal jemand den RX Interrupt mit dem Mega 8 benutzt ?

Gruß
Torsten
Gast #632979
Lesenswert?
• ▲
▼
Ja, hier z.B.:

// Setup USART
UBRRH = (byte)(BAUDVAL >> 8);
UBRRL = (byte)(BAUDVAL & 0xFF);
UCSRC = (1<<URSEL) | (3<<UCSZ0);
UCSRA = (1<<U2X);
UCSRB = (1<<RXEN) | (1<<RXCIE);

// Interrupt
SIGNAL(SIG_UART_RECV)
{
    // Read UDR and put it into the revceive buffer
    BUF_PUT(HostRX,UDR)
}

Was moderneres benutze ich auch nicht.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.