Forum: Compiler & IDEs UART Problem - Programmablauf bricht ab


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.
von Markus (Gast)


Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <stdlib.h>
#define F_CPU 14745600
#define BAUD 9600
#include <util/setbaud.h>
#include <string.h>
#include <inttypes.h>
#include <math.h>
#include <avr/interrupt.h>
#include <util/delay.h>

void uart_init(void);

volatile char counter=0;

int main (void){
  DDRA=0xff;
  sei();
  uart_init();
  while(1){
    PORTA=counter;
    _delay_ms(500);
  }
  return 0;
};

ISR(USART0_RXC_vect){
  cli();
  counter++;
  sei();
}


void uart_init(void){
  UBRR0H = UBRRH_VALUE;
     UBRR0L = UBRRL_VALUE;

     // Asynchron 8N1
     UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
     // UART RX und RX-Interrupt einschalten
     UCSR0B |= (1<<RXEN0)|(1<<RXCIE0);
}
Vielen Dank schonmal...

: Bearbeitet durch Moderator
von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ach fast vergessen, ich nutze einen ATMEGA128

von Peter II (Gast)


Bewertung
0 lesenswert
nicht 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.
  cli();
  counter++;
  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:

Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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) (Moderator)


Bewertung
0 lesenswert
nicht 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

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

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