Forum: Mikrocontroller und Digitale Elektronik Problem mit UART und Interrupt


von Martin (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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.

von Heiko (Gast)


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

von Martin (Gast)


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

von Martin (Gast)


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

von Hc Z. (mizch)


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.

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.