Problem mit UART und Interrupt

Gast #1814285
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
Angehängte Dateien:
#1814476
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.
1
ISR(USART_RXC_vect)
2
{
3
  unsigned char buffer;
4
 
5
  // Daten aus dem Puffer lesen
6
  buffer = UDR;
7
  uart_putc( buffer );
8

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

Du kannst auch noch mehrere Ausgaben in die ISr rein machen und dir zb 
den Counter anzeigen lassen, bzw den Status deiner Complete Flags.
Gast #1814796
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
Gast #1815609
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.
1
ISR(USART_RXC_vect)
2
{
3
    unsigned char buffer;
4
    uart_puts("da kommt was");
5
    // Daten aus dem Puffer lesen
6
    buffer = UDR;
7
  uart_putc(buffer);
8
  if ( uart_str_complete==0 ){  // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
9
    // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
10
      if (buffer!='\n' && buffer!='\r' && uart_str_count<uart_maxstrlen-1){
11
      uart_string[uart_str_count]=buffer;
12
      uart_str_count++;
13
    } else {
14
      uart_string[uart_str_count]='\0';
15
      uart_str_count=0;
16
      uart_str_complete=1;
17
    }
18
  }
19
}

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

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

Aber der ganze Quellcode steht ja auch im ersten Beitrag.

Danke für die Hilfe
Martin
Gast #1815620
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
#1815634
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
1
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

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