www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Baudrate des UART0 im LPC2214


Autor: Herbert Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche mit hilfe dieses Codes:
http://www.mikrocontroller.net/articles/ARM-elf-GC...
den UART0 im LPC2214 zu verwenden, um einzelne Zeichen an einen PC zu
senden und im Terminalfenster darzustellen. Dabei erscheinen statt der
gewünschten Zeichen meist 'x' oder selten Hieroglyphen.

Die Oszillatorfrequenz ist 12 MHz (als "#define FOSC  12000000"
angepaßt), die Baudrate sollte 9600 betragen. Allerdings lese ich am
Oszilloskop eine tatsächliche Baudrate von ca. einem Viertel der
gewünschten 9600 Baud ab.

Dies erklärt sich wohl dadurch, dass der PCLK defaultmäßig PCLK=CCLK/4
beträgt. Aber auch PCLK=CCLK zu setzen (mit "SCB_VPBDIV = 1;") oder
den Faktor 4 im divisor latch register zu berücksichtigen:
  // Untere 8 bit des Teilers
  UART0_DLL = (CCLK / (4*baud*16)) & 0xFF;
  // Obere 8 bit des Teilers
  UART0_DLM = ((CCLK / (4*baud*16)) & 0xFF00)>>8;
ändert die Baudrate nicht.

Was mache ich falsch?
Ist es möglich, dass 9600 Baud für gewisse Kombinationen von
CCLK/PCLK/FCCO nicht erreicht werden können, so dass der Wert im
UART0_DLx nicht akzeptiert wird?
Spielen die UART Interrupts eine Rolle (sollten defaultmäßig disabled
sein)?

Herbert

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein nein, das geht sehr gut mit 12 MHz Quarz. Verwende das Keil
MCB2100, ebenfalls 12 MHz.

Aber, wo ist in deiner Beschreibung eigentlich der PLL Multiplier?

Gruß

Dietmar

Autor: Herbert Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut User Manual ist die PLL nach dem Reset disabled, und daran ändere
ich auch nichts.

Selbst wenn ich mit dem PLL etwas falsch mache, sollten doch die
Änderungen in SCB_VPBDIV oder UART0_DLL die Baudrate um den Faktor 4
erhöhen, aber es ändert sich gar nichts?

Hast du ein komplettes (möglichst kurzes) Codebeispiel, das den UART0
erfolgreich benutzt?

Gerade sehe ich, dass sämtliche UART0 Register in der Headerdatei als
REG32, also 4-Byte-Register definiert sind, z.B.
#define U0THR       (*(REG32 (0xE000C000)))
obwohl sie laut Manual nur 8 Bit enthalten. Immerhin starten sie
jeweils an 4-Byte-Grenzen, so dass keine Überschreibungen stattfinden
sollten.

Herbert

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An deiner Initialisierung kann ich sonst weiter nichts unstimmiges
finden, das scheint OK.

Hier ein ganz einfaches Beispiel, daß ich gerade auf meinem Keil
MCB2100 mit LPC2129 und Quarz 12MHz und Windows HyperTerminal getestet
habe. Die PLL darf nicht initialisiert sein. An der Tastatur
eingegebene Zeichen werden vom Controller zurück gesendet und im
HyperTerminal Fenster ausgegeben.

Es funktioniert einwandfrei.

Kopiere den Teil unterhalb der Trennlinie in ein leeres File und nenne
es Main.c.

Gruß

Dietmar

-------------------------------------------

// RS232 Kommunikation
#define CR 0x0D
#include <LPC21xx.H>

void init_serial (void);
int putchar (int ch);
int getchar (void);

// Hauptprogramm
int main (void)
{
  VPBDIV = 0x01;
  init_serial();

  while(1)
  {
    putchar(getchar());  // Echo
  }
}

// Initialisierung
void init_serial (void)
{
  PINSEL0 |= 0x00000005; // P0.0, P0.1 = TxD0, RxD0 von UART0
  U0LCR    = 0x00000083; // DLAB = 1, 8 bit, no Parity, 1 Stop bit
  U0DLL    = 78;         // 9600 Baud bei 12MHz VPB Clock
  U0DLM    = 0;          // 9600 Baud bei 12MHz VPB Clock
  U0LCR    = 0x00000003; // DLAB = 0
}

// sende Zeichen
int putchar (int ch)
{
  if (ch == '\n')
  {
    while (!(U0LSR & 0x20));
    U0THR = CR;          // gebe CR aus
  }
  while (!(U0LSR & 0x20));
  return (U0THR = ch);
}

// lese Zeichen von Tastatur
int getchar (void)
{
  while (!(U0LSR & 0x01)); // warte auf Zeichen
  return (U0RBR);
}

Autor: Herbert Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank! Mit hilfe deines Programms konnte ich den Fehler aufspüren.
Letztlich war es eine Zeile in der Mitte meines Programms, die einige
der Initialisierungen wieder aufhob! Blöd, sowas...

Herbert

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.