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


von Thorsten H. (imonkey)


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...

von J. Huebler (Gast)


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

von Thorsten H. (imonkey)


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!

von Sebastian (Gast)


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

von Thorsten H. (imonkey)


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

von Robert Teufel (Gast)


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

von Thorsten H. (imonkey)


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

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.