Forum: Mikrocontroller und Digitale Elektronik Einsteigerproblem LPC1227


von Andreas (Gast)


Lesenswert?

Hallo zusammen,

habe ein LPC_P1227 Board von Olimex und will damit die 2 LED´s auf dem 
Board zum Blinken bringen. Habe mir schon einige Beispiele angeschaut, 
aber aus vermutlich trivialem Grunde läufts bei mir einfach nicht...


#include <nxp/iolpc1224.h>

#define LED1_DIR    GPIO1DIR  |=   ( 1<<5 )
#define LED1_CLR    GPIO1CLR   =   ( 1<<5 )
#define LED1_SET    GPIO1SET   =   ( 1<<5 )

#define LED2_DIR    GPIO1DIR  |=   ( 1<<4 )
#define LED2_CLR    GPIO1CLR   =   ( 1<<4 )
#define LED2_SET    GPIO1SET   =   ( 1<<4 )


void init(void){

  LED1_DIR;
  LED2_DIR;

}

void Delay(void){
    for(int i=0;i<1000;i++){
       for(int j=0;j<1000;j++){
       };
    };
}

int main(void){
  init();
  while(1){

      LED1_SET;
      LED2_CLR;
      Delay();
      LED1_CLR;
      LED2_SET;
      Delay();
  }
}

von Christian J. (Gast)


Lesenswert?

Andreas schrieb:

Wenn das alles ist läuft es auch nicht. Da fehlt der Startup Code, Takt 
Inittialisierung usw. Und die Delay Schleife dürfte komplett vom 
Kompiler weg optimiert werden weil da kein volatile steht. Der sieht 
nur, dass sich nichts ändert und löscht es und du siehst nichts, bzw. 
alles an oder aus.

NIEMALS Delays mit solchen Konstrukten, die wurden und werden immer über 
Timer gemacht. (Hat selbst Arduino verstanden....)

> }
>
> void Delay(void){
>     for(int i=0;i<1000;i++){
>        for(int j=0;j<1000;j++){
>        };
>     };
> }

von Uwe (Gast)


Lesenswert?

Zum beschnuppern reicht es erstmal...Er schrieb doch das er Anfänger 
ist.


Schaumal..Du mußt unbedingt volatile setzen



#define LED1PIN    15
#define LED2PIN    16
#define LED3PIN    17
#define LED4PIN    18

static void delay(void )
{
  volatile int i,j;

  for (i=0;i<100;i++)
    for (j=0;j<2000;j++);
}

int main(void)
{
  int i;

  MAMCR = 2;

  IODIR0 |= (1<<LED1PIN)|(1<<LED2PIN)|(1<<LED3PIN)|(1<<LED4PIN);
  IOSET0 = (1<<LED1PIN)|(1<<LED2PIN)|(1<<LED3PIN)|(1<<LED4PIN);



  while (1)
  {

    IOSET0 = (1<<LED1PIN);
    IOCLR0 = (1<<LED2PIN);
    IOCLR0 = (1<<LED3PIN);
    IOCLR0 = (1<<LED4PIN);



    delay();

    IOCLR0 = (1<<LED1PIN);
    IOSET0 = (1<<LED2PIN);
    IOCLR0 = (1<<LED3PIN);
    IOCLR0 = (1<<LED4PIN);

    delay();

    IOCLR0 = (1<<LED1PIN);
    IOCLR0 = (1<<LED2PIN);
    IOSET0 = (1<<LED3PIN);
    IOCLR0 = (1<<LED4PIN);

    delay();

    IOCLR0 = (1<<LED1PIN);
    IOCLR0 = (1<<LED2PIN);
    IOCLR0 = (1<<LED3PIN);
    IOSET0 = (1<<LED4PIN);

    delay();

    IOCLR0 = (1<<LED1PIN);
    IOCLR0 = (1<<LED2PIN);
    IOSET0 = (1<<LED3PIN);
    IOCLR0 = (1<<LED4PIN);

    delay();

    IOCLR0 = (1<<LED1PIN);
    IOSET0 = (1<<LED2PIN);
    IOCLR0 = (1<<LED3PIN);
    IOCLR0 = (1<<LED4PIN);

    delay();





  }

  return 0; // die arme sau wird hier nieeeee ankommen :-)
}

von LPC (Gast)


Lesenswert?

Christian J. schrieb:
> Wenn das alles ist läuft es auch nicht. Da fehlt der Startup Code, Takt
> Inittialisierung usw.

Braucht es alles nicht, der LPC1227 startet mit einer 
Default-Konfiguration (interner Oszillator 12 MHz, alle Pins Input). Die 
Ursache ist vermutlich nur das Delay an der falschen Stelle:

LED1_SET;
Delay();
LED1_CLR;
Delay();

Christian J. schrieb:
> Und die Delay Schleife dürfte komplett vom
> Kompiler weg optimiert werden weil da kein volatile steht.

Die meisten Compiler erkennen die "Absicht" auch ohne volatile, es ist 
aber besser, es zu verwenden.

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Ich papp dir mal meine Inits eines Olimex LPC 2138 hier dran, da ist 
einiges drin was du brauchen wirst, wir zb timer Ints und ADC Wandler 
Kapselung.... dürfte bei dem LPC 1.. anders sein aber irgendwo auch 
ähnlich.... da ist auch LED Blinki mit Interrupts drin und fester 
Zeitbasis.

Der ARM7v6 ist ne geile Maschine, meine Lieblings CPU. Schnell, 
ordentlich Hubraum (RAM, ROM), gut verständlich, einfach klasse :-)

Meine LEDS wurden so geinitted:

// LEDs als Output deklarieren (=0)
IO0DIR |= (1<<LED_ROT_BIT) | (1<<LED_GRN_BIT);
// LEDS abschalten (=1)
 IO0SET |= (1<<LED_ROT_BIT) | (1<<LED_GRN_BIT);


PS:

Mit MAMTIM werden die Waitstates beim Flashspeicherzugriff eingestellt, 
das Datenblatt empfiehlt:

    1 - bei unter 20 Mhz,  2 - bei 20-40 Mhz ,  3 - bei über 40 Mhz
    */
    MAMTIM = 3;    // 3 Wait States für > 40 Mhz
    MAMCR  = 2;    // Memory Manager voll aktivieren

von Andreas (Gast)


Lesenswert?

Sie blinken :) danke für die Hilfe!

von Christian J. (Gast)


Lesenswert?

Andreas schrieb:

> Sie blinken :) danke für die Hilfe!

Glaubichnicht! Zeigen !

Und jetzt das Ganze im Interrupt! Zackzack!

von LPC (Gast)


Lesenswert?

Christian J. schrieb:
> Ich papp dir mal meine Inits eines Olimex LPC 2138 hier dran

Hat nur mit LPC_P1227 Board von Olimex rein gar nichts zu tun, komplett 
andere PLL, andere Register, etc.

Andreas schrieb:
> Sie blinken :) danke für die Hilfe!

Wohl doch nur das Delay an der falschen Stelle :-)

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.