mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arm lpc2294 keil phytec GRUNDLAGEN hello world


Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum!

Ich habe hier einen Phytec-Kit(lpc2294 auf HD200) und habe ein Problem
beim empfangen der Botschaft Hello World aus dem Gleichnamiegen bsp.

#include <stdio.h>                          /* I/O Functions */
#include <LPC22XX.H>                        /* LPC22XX Peripheral 
Registers */

extern void init_serial (void);

void delay (void)  {                        /* Delay Function */
  unsigned long x;

  for (x = 0; x < 400000; x++);
}

int main (void) {

  init_serial();                            /* Initialize Serial 
Interface */

  IODIR0 = 0x00000100;                      /* P0.8 defined as Output */

  while (1) {                               /* Loop forever */
    IOCLR0 = 0x00000100;                    /* Turn LED On  (P0.8 = 0) 
*/
    printf ("Hello World\n");               /* Print "Hello World" */
    IOSET0 = 0x00000100;                    /* Turn LED Off (P0.8 = 1) 
*/
    delay();                                /* Delay */
  }
}

Das blinken der LED ist zu beobachten, aber kein "Hello Nerd" im 
Hyperterminal(br:9600,d.bits:8,parity:none,stopp:1,flussteuerung:keine,e 
mulation:atum.).

Des weiteren habe ich Verständnissproblem mit ausdrücken wie:

IODIR0 = 0x00000100;
IOSET0 = 0x00000100;

Aus initialisierung des seriellen interfaces:

  PINSEL0 = 0x00050000;                  /* Enable RxD1 and TxD1 
*/
  U1LCR = 0x83;                          /* 8 bits, no Parity, 1 Stop 
bit     */
  U1DLL = 97;                            /* 9600 Baud Rate @ 15MHz VPB 
Clock  */
  U1LCR = 0x03;                          /* DLAB = 0

Wo finde ich mal eine auflösung der codierung, eine liste in der steht 
welche variablen es gibt und welche bedeutung der ihnen zugewiesene 
HEX-code hat?

verzweifelte grüße...

Autor: J. Huebler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Sachen wie IODIRx und PINSELx ... sind Register des Controllers.
Deren Definition (Adressen) sind in einem Headerfile zu finden.
Die Namen der Ports im Headerfile stimmen üblicherweise mit denen im 
Usermanual überein.
Die Zuordnungen der Bits der Register zu Pins und dgl. sind im 
Usermanual zu finden.

Wenn das alles klar ist, dann nachsehen:
- Mit welchem Takt läuft der Rechnerkern Das müßte man aus dem 
Startupfile entnehmen können?
- Ist die UART eingeschaltet (Register PCONP) ?
- Welchen Takt hat die UART ( Register PCLKSELx) ?
- schreibt printf auf die UART ?


MfG

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen dank ersteinmal für die schnelle reaktion!

Der rechner arbeitet mit 10mhz.
ist die uart eingeschaltet? (auszüge aus der headerdateilpc22xx):

#define PCONP          (*((volatile unsigned long *) 0xE01FC0C4))

tackt der uart:

ein register pckselx ist nicht in der  headerdatei lpc22xx vorhanden.
U1DLL = 97;             /* 9600 Baud Rate @ 15MHz VPB
U1DLL ist bei /* Universal Asynchronous Receiver Transmitter 1 (UART1) 
*/
in der headerdatei dabei.

Wohin printf schreibt weis ich nicht.

zuordnung von bits und adressen sind nicht im manual zu 
finden...register zu pins sind vorhanden.

hier nochmal der volle bsp.code:

#include <stdio.h>                          /* I/O Functions */
#include <LPC22XX.H>                        /* LPC22XX Peripheral 
Registers */

extern void init_serial (void);

void delay (void)  {                        /* Delay Function */
  unsigned long x;

  for (x = 0; x < 400000; x++);
}

int main (void) {

  init_serial();                            /* Initialize Serial 
Interface */

  IODIR0 = 0x00000100;                      /* P0.8 defined as Output */

  while (1) {                               /* Loop forever */
    IOCLR0 = 0x00000100;                    /* Turn LED On  (P0.8 = 0) 
*/
    printf ("Hello World\n");               /* Print "Hello World" */
    IOSET0 = 0x00000100;                    /* Turn LED Off (P0.8 = 1) 
*/
    delay();                                /* Delay */
  }
}
______________________________________________________________________ 
_
init_serial:

#include <LPC21xx.H>                     /* LPC21xx definitions 
*/

#define CR     0x0D


void init_serial (void)  {               /* Initialize Serial Interface 
*/
  PINSEL0 = 0x00050000;                  /* Enable RxD1 and TxD1 
*/
  U1LCR = 0x83;                          /* 8 bits, no Parity, 1 Stop 
bit     */
  U1DLL = 97;                            /* 9600 Baud Rate @ 15MHz VPB 
Clock  */
  U1LCR = 0x03;                          /* DLAB = 0 
*/
}


/* implementation of putchar (also used by printf function to output 
data)    */
int sendchar (int ch)  {                 /* Write character to Serial 
Port    */

  if (ch == '\n')  {
    while (!(U1LSR & 0x20));
    U1THR = CR;                          /* output CR */
  }
  while (!(U1LSR & 0x20));
  return (U1THR = ch);
}


int getkey (void)  {                     /* Read character from Serial 
Port   */

  while (!(U1LSR & 0x01));

  return (U1RBR);
}


beste grüße!

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

AN  Thorsten Heimberg
hat der Code so wie du ihn eingegeben hast nun Funktioniert? konntest du 
das Problem lösen?
viele Grüße

Sebastian

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten morgen sebastian,

nein leider hat der code so nicht funktioniert, siehe meinen neuen 
beitrag im forum. es scheint probleme mit der baudrate zu geben sicher 
ist das aber auch noch nicht....

gruß thorsten

Autor: Robert Teufel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist nur aufgefallen, dass diese Zeile in Deinem Code vorkommt:
U1DLL = 97;                            /* 9600 Baud Rate @ 15MHz VPB
das wuerde bedeuten, dass die CPU mit 60 MHz laufen soll, dann laeuft 
VPB standardmaessig mit 15 MHz. Das wiederrum waere 6x schneller als 
angenommen.
Hab die Zahlen jedoch nicht mit dem Manual gecheckt. Die meisten 
Beispiele gehen von 60 MHz CPU-Clock aus, weil das die max. Frequenz 
fuer diesen Chip ist und auch die meisten Anwender erst mal sehen 
moechten, was kann das Ding.

Robert

Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo robert,

das habe ich mittlerweile auch bemerkt, meine cpu frequenz beträgt 10MHZ
und dementsprechend mein U1DLL: 16 bzw 0x10. Dabei kommt man zwar nicht 
GENAU auf 9600bit/s aber das macht nichts, habe die CPU auch schon auf 
9.8304MHZ eingestellt was zu einer baudrate von GENAU 9600 bit/s führen 
sollte und die gleichen Zeichen empfangen...

trotzdem vielen dank für deine Aufmerksamkeit

best! thorsten

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.