Forum: Mikrocontroller und Digitale Elektronik USART, einfaches Zeichen senden


von Jan (Gast)


Lesenswert?

Hallo Forum,

heute habe ich versucht eine USART Verbindung zwischen meinem Controller 
und PC aufzubauen. Allerdings kommt nicht immer etwas an, es wird ein 
einfaches "X" gesendet. Manchmal kommt ein "X" an, manchmal ein 
Leerzeichen. Also muss wohl irgendwas noch nicht in Ordnung sein. Hier 
meine Überlegungen:

Controller: Mega88
Frequenz: 7.3728MHz Quarz

19.200 Baudrate, 8 Datenbits, keine Parität, 1 Stoppbit, keine 
Flußsteuerung

======================================================================== 
===
Initialisieren des USART:

UCSR0B:
 TXEN0 => 1  auf Empfang
 UCSZ02 => 0  8Datenbits

UCSR0C:
 UMSEL01 => 0  Asynchronous Mode
 UMSEL00 => 0

 UPM01 => 0  Keine Parität
 UPM00 => 0

 USBS0 => 1  1Stoppbit

 UCSZ01 => 1  8Datenbits
 UCSZ00 => 1

 UCPOL0 => 0 nur bei Synchron Mode

UCSR0A:
 U2X0 => 0 Double Speed Mode OFF

UBRR0 = 23 // Wert aus dem Datenblatt für 19.200Baud bei 7.3728MHz
        und U2X0 = 0
======================================================================== 
===

Code:
1
#define F_CPU 7372800;
2
3
#include <avr/io.h>
4
5
int main( void ) {
6
7
   UCSR0B |= (1<<TXEN0) | (1<<UCSZ02);
8
   UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00);
9
   UBRRH = 23 >> 8;
10
   UBRRL = 23 & 0xFF;
11
   
12
   while (!(UCSR0A & (1<<UDRE0)))  // Warten bis Senden moeglich           
13
       {
14
       }
15
16
   UDR0 = 'X';  //Ein- Ausgaberegister (R/W)
17
18
   return(0);
19
}

Erstmal sind meine Überlegungen richtig?
Habe ich den Code dazu richtig geschrieben?

Danke schonmal,

Jan

von 6641 (Gast)


Lesenswert?

Ja, kommt etw hin. Ich wuerd mal nicht warten bis das UART bereit ist. 
Denn fuer das erste mal ist es bereit.

von Jan (Gast)


Lesenswert?

Hi,

das macht keinen Unterschied. Gleiches Ergebnis wie oben beschrieben.

Hab oben in der Init noch die Stoppbits vergessen:
1
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) | (1<<USBS0);

Jan

von 6641 (Gast)


Lesenswert?

Und wenn du mit den Oszilloskop schaust ? Kommt nichts raus ?

von Jan (Gast)


Lesenswert?

Hab leider kein Oszi.

Die "senden" LED an meinem RS232->USB Wandler leuchtet kurz auf. Also 
geht wohl aufjedenfall was raus. Kommt ja auch immer was an im Terminal. 
Nur eben nicht immer ein X :-)

Jan

von 6641 (Gast)


Lesenswert?

Hmmm. Mit einem Oszi koennte man nun schauen, ob das Timing nicht 
stimmt, ein Wechselspannung drauf ist, oder sonst was....

von Karl H. (kbuchegg)


Lesenswert?

Als allererstes solltest du mal ein einer Schleife ständig senden.
Dann kann man auch etwas besser messen.

von Jan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Karl Heinz,

ich hab mal einen Timer eingbaut der jede Sekunde ein "UDR0 = "X";" 
ausführt.
Das Ergebnis siehst du im Anhang. Manchmal kommt auch garnichts an.

Jan

von Jan (Gast)


Angehängte Dateien:

Lesenswert?

Und nochmal eines mit einem anderem Terminal (ShamCom).

Jan

von Udo (Gast)


Lesenswert?

Hallo,

versuch es mal hiermit:
1
#define F_CPU 7372800
2
3
void uart0_init(int BaudRate)
4
{
5
  int ubrr0 = (F_CPU / 16 / BaudRate - 1);          // Baudrate UART0 einstellen  
6
  UBRR0H = (unsigned char)(ubrr0>>8);
7
  UBRR0L = (unsigned char)ubrr0;
8
         
9
  UCSR0C = (1<<URSEL0)|(3<<UCSZ00);              // UART0 Frame Format einstellen: 8data, 1 Stop-bit, keine Parity 
10
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);        // UART0 Receiver und Transmitter einschalten
11
}
12
13
int main()                  
14
15
{
16
17
uart0_init(19200);
18
19
mach was....

ggf. musst du bei den Registern die "0" wegnehmen, da mein 162 2 USART's 
hat, wurden die beiden so unterschieden.

Gruß
Udo

von Jan (Gast)


Lesenswert?

Hi,

danke für die Mühen an alle. Es lag an meinem RS232->USB Wandler. Hab 
die Möglichkeit einfach noch ausschließen wollen....und Tatsache. In dem 
Ding ist ein FTDI verbaut, mit dem ich eigentlich nur gute Erfahrungen 
gemacht habe. Andere Programme laufen auch damit, allerdings auch auf 
anderer Baud.

Nochmals Danke, Jan

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.