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


von Markus E. (opc)


Angehängte Dateien:

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?
1
/*
2
 * test_loeschen.c
3
 *
4
 * Created: 11.09.2019 22:29:37
5
 *
6
 */ 
7
8
#define F_CPU 1000000UL
9
#include <avr/io.h>
10
#include <avr/interrupt.h>
11
#include <util/delay.h>
12
13
void uart_putc( unsigned char data )
14
{
15
  while ( !( UCSRA & (1<<UDRE)) )
16
  ;
17
  UDR = data;
18
}
19
20
int main(void)
21
{
22
  #define BAUD 9600
23
  unsigned int ubbr =  F_CPU/8/BAUD-1; 
24
25
  UBRRH = (unsigned char)(ubbr>>8);
26
  UBRRL = (unsigned char)ubbr;
27
  UCSRB |= (1<<RXEN)|(1<<TXEN);
28
  UCSRB |= (1<<RXCIE);
29
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
30
  UCSRA |= (1<<U2X);
31
  
32
  sei();
33
  
34
    /* Replace with your application code */
35
    while (1) 
36
    {
37
    uart_putc(5);      
38
    }
39
}

von . . (Gast)


Lesenswert?

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

von Markus E. (opc)


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:
1
ISR(USART_RXC_vect)
2
{
3
  data = UDR;
4
}

hat das Problem gelöst.

von fop (Gast)


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."

von Markus E. (opc)


Lesenswert?

Ok interessant, danke für den Hinweis!

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.