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
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.