UART Problem - Programmablauf bricht ab

Gast #4048629
Lesenswert?

Hallo allerseits,

ich stehe vor dem Problem dass ich Zeichen mittels UART empfangen und 
auswerten möchte.
Nachdem nun nichts funktioniert hatte und ich nicht mehr weiter wusste 
habe ich ein kurzes Test-Programm geschrieben, das nichts anderes tun 
soll als einen Zähler hoch zu zählen sobald ein Zeichen kommt. Doch 
leider geht das Programm einfach nicht in die ISR rein.
Laut Debugger ist das Receive Complete bit gesetzt und das global 
interrupt enable Bit im SREG wird gelöscht.

Nachdem ein Zeichen kam springt er immer zum Programmbeginn und hängt 
sich auf.

Mein Quelltext sieht wie folgt aus:
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#define F_CPU 14745600
4
#define BAUD 9600
5
#include <util/setbaud.h>
6
#include <string.h>
7
#include <inttypes.h>
8
#include <math.h>
9
#include <avr/interrupt.h>
10
#include <util/delay.h>
11

12
void uart_init(void);
13

14
volatile char counter=0;
15

16
int main (void){
17
  DDRA=0xff;
18
  sei();
19
  uart_init();
20
  while(1){
21
    PORTA=counter;
22
    _delay_ms(500);
23
  }
24
  return 0;
25
};
26

27
ISR(USART0_RXC_vect){
28
  cli();
29
  counter++;
30
  sei();
31
}
32

33

34
void uart_init(void){
35
  UBRR0H = UBRRH_VALUE;
36
     UBRR0L = UBRRL_VALUE;
37

38
     // Asynchron 8N1
39
     UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
40
     // UART RX und RX-Interrupt einschalten
41
     UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);
42
}
Vielen Dank schonmal...
#4048648
Lesenswert?

Du musst in der ISR das UDR Register auslesen.

Dieser Interrupt ist anders als die anderen. Andere Interrupt 
Anforderungen werden mit dem Aufruf der ISR gelöscht. Die Receive 
Complete Interrupt Anforderung wird erst mit dem auslesen von UDR 
gelöscht.


Welcher µC ist das?
Hast du eine Warnung vom Compiler, dass der Interrupt Name scheinbar 
nicht stimmt? Die Namen der ISR sind leider bei unetrschiedlichen AVR 
auch unterschiedlich. Und wenn der Name nicht stimmt, dann hast du den 
Fall, dass du einen Interrupt freigegeben hast, für den es keine 
passende ISR gibt. Den Fall erkennt man daran, dass der C-Code dann 
einen Neustart des Programms veranlasst.
Gast #4048661
Lesenswert?

Leider komme ich erst garnicht dorthin, dass ich UDR auslesen kann. 
Werde ich aber natürlich tun sobald die ISR funktioniert.

Zu Punkt 2 ist zu sagen dass ich eine folgende Warnung bekomme:
../UART2.c:29: warning: 'USART0_RXC_vect' appears to be a misspelled 
signal handler

Laut Datenblatt gibt es diesen Vector jedoch
Gast #4048668
Lesenswert?

Markus schrieb:
> Zu Punkt 2 ist zu sagen dass ich eine folgende Warnung bekomme:
> ../UART2.c:29: warning: 'USART0_RXC_vect' appears to be a misspelled
> signal handler
>
> Laut Datenblatt gibt es diesen Vector jedoch

scheinbar nicht, schau mal ins Header-File.
1
  cli();
2
  counter++;
3
  sei();

lass bitte das cli und sie weg, damit handelst du dir nur Probleme ein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren