Forum: Compiler & IDEs USART - Senden möglich aber kein Empfangen


von NoName (Gast)


Lesenswert?

Hallo
ich will die USART Schnittstelle nutzen.
Senden klappt auch schon.
Leider das Empfangen noch nicht.

Habe den Atmega32 mit einem Takt von 16MHz
und will eine Baudrate von 4800 1 Stopbit und keinem Paritätsbit(8N1)

Hier mal mein Programm:
(es soll eigentlich nur die Leds ausmachen, wenn ein Zeichen empfangen 
wurde)
1
//----------------------
2
#include <avr/io.h>
3
#include <stdint.h>
4
//----------------------
5
int main (void)
6
{
7
  char zeichen;
8
9
  UBRRH = 0;
10
  UBRRL = 207; //Baudrate von 4800
11
12
  UCSRB |= (1<<RXEN) | (1<<TXEN);
13
  UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
14
15
  DDRA = 0xff;
16
  PORTA = 0xff;
17
18
  while(1)
19
  {  
20
     while (!(UCSRA & (1<<RXC)))
21
     {
22
     }
23
    
24
     zeichen = UDR;
25
     PORTA = 0x00;
26
   }
27
  return(0);    
28
}

Ich sende die Zeichen mit dem HyperTerminal von WindowsXP.
Das komische dabei ist, sobald ich die Verbindung mit Hyperterminal 
schließe, gehn die Leds aus.

An was kann das liegen?

von Falk B. (falk)


Lesenswert?


von Flo (Gast)


Lesenswert?

Du schaltest deinen PORTA unabhämgig von seriellen Daten aus!

von NoName (Gast)


Lesenswert?

hallo,
@ falk
die habe ich schon durchgemacht und habe keinen fehler gefunden

@ flo
wieso sollte ich PORTA unabhängig schalten?
der bleibt ja solange in der while schleife bis einmal ein zeichen 
angekommen ist

von magnetus (Gast)


Angehängte Dateien:

Lesenswert?

NoName schrieb:
> Das komische dabei ist, sobald ich die Verbindung mit Hyperterminal
> schließe, gehn die Leds aus.

Prüfe auf der PC-Seite mal folgende Punkte:

- die Flussteuerung des COM Ports sollte auf "Keine" stehen
- deaktiviere vorsichtshalber den FIFO des COM Ports

Gruß,
Magnetus

von Karl H. (kbuchegg)


Lesenswert?

NoName schrieb:
> hallo,
> @ falk
> die habe ich schon durchgemacht und habe keinen fehler gefunden
>
> @ flo
> wieso sollte ich PORTA unabhängig schalten?
> der bleibt ja solange in der while schleife bis einmal ein zeichen
> angekommen ist


Wenn du am Port A mehrere Led (zb 8) hängen hast, lass dir mal das 
Zeichen ausgeben.

Oder schalte die LED nach einer kurzen Verzögerungszeit wieder ein.

1
#define F_CPU 16000000
2
3
//----------------------
4
#include <avr/io.h>
5
#include <stdint.h>
6
#include <util/delay.h>
7
8
//----------------------
9
int main (void)
10
{
11
  char zeichen;
12
13
  UBRRH = 0;
14
  UBRRL = 207; //Baudrate von 4800
15
16
  UCSRB |= (1<<RXEN) | (1<<TXEN);
17
  UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
18
19
  DDRA = 0xff;
20
  PORTA = 0xff;
21
22
  while(1)
23
  {  
24
     while (!(UCSRA & (1<<RXC)))
25
     {
26
     }
27
    
28
     zeichen = UDR;
29
     PORTA = 0x00;
30
31
     _delay_ms( 1000 );
32
     PORTA = 0xff;
33
   }
34
  return(0);    
35
}

Wenns jetzt am Anfang 1 mal blinkt und danach nur bei jedem Tastendruck, 
dann hast du dir beim Hochfahren des Mega irgendein Störzeichen auf der 
UART eingehandelt.

Drück auch im Hyperterminal mehrere Tasten und auch Return. Nicht dass 
da irgendwo noch ein Buffer dazwischen sitzt, der auf das Zeilenende für 
die Übertragung wartet.

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.