USART, einfaches Zeichen senden

Gast #814473
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
Gast #815127
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
Gast #815172
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

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