Einsteigerproblem LPC1227

Gast #3957222
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();
  }
}
Gast #3957280
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++){
>        };
>     };
> }
Gast #3957295
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 :-)
}
Gast #3957298
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.
Gast #3957302
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren