mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART, einfaches Zeichen senden


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define F_CPU 7372800;

#include <avr/io.h>

int main( void ) {

   UCSR0B |= (1<<TXEN0) | (1<<UCSZ02);
   UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00);
   UBRRH = 23 >> 8;
   UBRRL = 23 & 0xFF;
   
   while (!(UCSR0A & (1<<UDRE0)))  // Warten bis Senden moeglich           
       {
       }

   UDR0 = 'X';  //Ein- Ausgaberegister (R/W)

   return(0);
}

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

Danke schonmal,

Jan

Autor: 6641 (Gast)
Datum:

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

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das macht keinen Unterschied. Gleiches Ergebnis wie oben beschrieben.

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

Jan

Autor: 6641 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn du mit den Oszilloskop schaust ? Kommt nichts raus ?

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 6641 (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Jan (Gast)
Datum:
Angehängte Dateien:
  • preview image for HT.PNG
    HT.PNG
    12,9 KB, 196 Downloads

Bewertung
0 lesenswert
nicht 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

Autor: Jan (Gast)
Datum:
Angehängte Dateien:
  • preview image for ST.PNG
    ST.PNG
    7,38 KB, 190 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Und nochmal eines mit einem anderem Terminal (ShamCom).

Jan

Autor: Udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

versuch es mal hiermit:
#define F_CPU 7372800

void uart0_init(int BaudRate)
{
  int ubrr0 = (F_CPU / 16 / BaudRate - 1);          // Baudrate UART0 einstellen  
  UBRR0H = (unsigned char)(ubrr0>>8);
  UBRR0L = (unsigned char)ubrr0;
         
  UCSR0C = (1<<URSEL0)|(3<<UCSZ00);              // UART0 Frame Format einstellen: 8data, 1 Stop-bit, keine Parity 
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);        // UART0 Receiver und Transmitter einschalten
}

int main()                  

{

uart0_init(19200);

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

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.