Forum: Compiler & IDEs UART Problem - Programmablauf bricht ab


von Markus (Gast)


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

: Bearbeitet durch User
von Karl H. (kbuchegg)


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.

von Markus (Gast)


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

von Markus (Gast)


Lesenswert?

Ach fast vergessen, ich nutze einen ATMEGA128

von Peter II (Gast)


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.

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Markus schrieb:
> Laut Datenblatt gibt es diesen Vector jedoch

Nö.  USART0_RX_vect, siehe Kopie aus dem Datenblatt.

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Jörg Wunsch schrieb:
> Markus schrieb:
>> Laut Datenblatt gibt es diesen Vector jedoch
>
> Nö.  USART0_RX_vect, siehe Kopie aus dem Datenblatt.

Hallo, es funktioniert nun, jedoch ist das Datenblatt etwas inkosequent 
wie man auf dem Foto sieht

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Markus schrieb:
> jedoch ist das Datenblatt etwas inkosequent wie man auf dem Foto sieht

Ja, das kann man wohl sagen. :-(

von Peter II (Gast)


Lesenswert?

Markus schrieb:
> Hallo, es funktioniert nun, jedoch ist das Datenblatt etwas inkosequent

das ist doch nur ein Bespiel für ASM, da kann man die Sprungmarken 
nennen wie man will.

von Karl H. (kbuchegg)


Lesenswert?

Ist letzten Endes auch egal. Entscheidend ist, wie Atmel den Vector im 
Header File genannt hat.
Dort kann man nachsehen. Ist ja schliesslich auch nur ein Textfile

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.