mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit UART und Interrupt


Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe folgendes Problem: ich kann ohne Probleme vom Atmega32 zeichen 
an den PC schicken. Nun wollte ich mal das Tutorial ausprobieren und mit 
einem Interrupt-Handler zeichen empfangen (steht in mc_uart.h) und 
gegebenenfalls "test" (main.c) zurückschicken. Das hat leider nicht 
funktioniert. Es kommen wie gewollt immer 'x'se an aber nach dem 
Zeichenempfang geht es nicht mehr weiter. Dann habe ich mal die 
Antwort-Zeile auskommentiert und habe immer noch das selbe Problem. Ich 
komme scheinbar in die Interrupt Routine nur wird die nie beendet.
Bei HTerm habe ich schon ausprobiert am Schluss ein CR oder LF oder die 
kombination zu schicken, sowie einen solangen String, dass die Routine 
wegen maximaler Zeichenlänge beendet wird, aber ich komme nie aus der 
ISR raus.

Danke für eure Hilfe!

Martin

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach dir mal in die Empfangs-ISR ein direktes Echo rein (und nimm den 
uart_putc aus der Hauptschleife raus), um zu sehen, was du da eigentlich 
empfängst.
ISR(USART_RXC_vect)
{
  unsigned char buffer;
 
  // Daten aus dem Puffer lesen
  buffer = UDR;
  uart_putc( buffer );

  if ( uart_str_complete==0 ){  // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
    // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
    if (buffer!='\n' && buffer!='\r' && uart_str_count<uart_maxstrlen-1){
      uart_string[uart_str_count]=buffer;
      uart_str_count++;
    } else {
      uart_string[uart_str_count]='\0';
      uart_str_count=0;
      uart_str_complete=1;
    }
  }
}

Du kannst auch noch mehrere Ausgaben in die ISr rein machen und dir zb 
den Counter anzeigen lassen, bzw den Status deiner Complete Flags.

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein bei mir recht häufiger Fehler: Die Flow Control-Einstellung im 
Terminalprogramm. Die sollte unbedingt auf aus/none stehen, sonst klappt 
das nicht mit dem Empfangen, weil der PC die Daten nie sendet.

Senden kann trotzdem klappen, wenn der PC dauerhaft "bereit" ist und der 
Controller das gar nicht abfragt, sondern einfach so sendet.

MfG, Heiko

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Leider ist das Problem noch nicht aus der Welt. Flow Control ist aus. 
Ich sehe auch anhand einer LED, dass was kommt. Ich hab jetzt mal den 
Interruptbetrieb weggelassen und schicke einfach nur die empfangenen 
Zeichen wieder zurück. Das klappt auch. Also die RS232 Kommunikation 
funktioniert auch bidirektional. Nur leider scheitert es bei der 
Interrupt-Routine. Immer wenn er die eigentlich aufrufen möchte. Ich 
habe euren Rat befolgt und sende ganz am anfang der Routine eine Meldung 
die aber auch schon nicht ankommt.
ISR(USART_RXC_vect)
{
    unsigned char buffer;
    uart_puts("da kommt was");
    // Daten aus dem Puffer lesen
    buffer = UDR;
  uart_putc(buffer);
  if ( uart_str_complete==0 ){  // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
    // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
      if (buffer!='\n' && buffer!='\r' && uart_str_count<uart_maxstrlen-1){
      uart_string[uart_str_count]=buffer;
      uart_str_count++;
    } else {
      uart_string[uart_str_count]='\0';
      uart_str_count=0;
      uart_str_complete=1;
    }
  }
}

In der main rufe ich auch sei(); auf. So schaut die Initalisierung aus 
(auch mit RXCIE)
oid UART_Init(void)
{
  UCSRC |= (1<<URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
  UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);

  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
}

Aber der ganze Quellcode steht ja auch im ersten Beitrag.

Danke für die Hilfe
Martin

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bins nochmal. Es hat sich erledigt. Ich habe zwar in main.c 
interrupt.h eingebungen, aber nicht in meiner mc_uart.h. es gab zwar 
keine Compilerfehler aber funtkioniert hat es nicht.

Jetzt geht aber alles.


Nochmals Danke!
Martin

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Ich habe zwar in main.c
> interrupt.h eingebungen, aber nicht in meiner mc_uart.h. es gab zwar
> keine Compilerfehler aber funtkioniert hat es nicht.

Da muss doch schon allein wegen
ISR(USART_RXC_vect)
eine Warning gekommen sein?  Oder hast Du die Warnings etwa nicht 
eingeschaltet?  Dann hättest Du Dir die Extra-Arbeit wohl verdient.

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.