mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART überträgt nach Interrupt=enable nichts mehr


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Markus E. (opc)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

auf einem ATMega8, der mit 1 Mhz internem Clock läuft, habe ich einen 
UART konfiguriert, welcher soweit sogut läuft bis ich das RX-Interrupt 
Bit setze:
UCSRB |= (1<<RXCIE);

Sobald dies gesetzt ist, erfasse ich in hterm keinerlei Lebenszeichen 
mehr vom UART. Kommentiere ich die o.g. Registerbeschreibung für den 
Interrupt aus, so läuft alles wunderbar.

Hier mein VOLLSTÄNDIGES Test-Programm:

Ich kann mir das Verhalten nicht erklären, hat jemand einen 
Lösungsansatz für mich?
/*
 * test_loeschen.c
 *
 * Created: 11.09.2019 22:29:37
 *
 */ 

#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

void uart_putc( unsigned char data )
{
  while ( !( UCSRA & (1<<UDRE)) )
  ;
  UDR = data;
}

int main(void)
{
  #define BAUD 9600
  unsigned int ubbr =  F_CPU/8/BAUD-1; 

  UBRRH = (unsigned char)(ubbr>>8);
  UBRRL = (unsigned char)ubbr;
  UCSRB |= (1<<RXEN)|(1<<TXEN);
  UCSRB |= (1<<RXCIE);
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
  UCSRA |= (1<<U2X);
  
  sei();
  
    /* Replace with your application code */
    while (1) 
    {
    uart_putc(5);      
    }
}


Autor: . . (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme mal an, der RX Interrupt wird endlos aufgreufen, weil Du die 
Daten nicht abholst.

Autor: Markus E. (opc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.                                                . schrieb im Beitrag 
#5969748:
> Ich nehme mal an, der RX Interrupt wird endlos aufgreufen, weil Du die
> Daten nicht abholst.


Danke, du hast recht.

Ein einfaches:
ISR(USART_RXC_vect)
{
  data = UDR;
}

hat das Problem gelöst.

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War wohl eher die völlig fehlende Interruptroutine.
Der Compiler schreibt auf alle Interruptvektoren, für die Du keine 
Funktion bereit stellst die Adresse einer Verlegenheitsfunktion. Die 
bewirkt einen Neustart.

Siehe Doku interrupt.h :
"If an unexpected interrupt occurs (interrupt is enabled and no handler 
is installed, which usually indicates a bug), then the default action is 
to reset the device by jumping to the reset vector."

Autor: Markus E. (opc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok interessant, danke für den Hinweis!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.