Forum: Mikrocontroller und Digitale Elektronik Cortex_Anfänger


von Mike_D (Gast)


Lesenswert?

Hallo Zusammen,

ich hab mir das LPCXpresso board 1769 mit einem Starterkit besorgt.
So zum selber zusammen löten und so. Hab auch schon das aller erste 
Programm geschrieben. Aber etwas ist nicht für mich ganz plausibel, und 
zwar bei GPIO's, wenn ich eine LED ausschalten möchte (den pin mit 
LPC_GPIO0->FIOCLR) runter ziehen möchte klappt es nicht. es zeigt mir im 
Debuger 0 an und die LED leuchtet immer noch. Hier mein Code:

#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

int main(void)
{
  unsigned int i;

  LPC_GPIO0->FIODIR |= (1<<17); //Pin 17 bei Port 0 als Ausgang.
                                      //Die leuchtet weil Pin sofort 
High   //ist, Na gut ok.
  LPC_GPIO0->FIOCLR |= (1<<17); //Aber Hier wenn man FIOCLR auf 1 
//setzt sollte die LED doch aus gehen, tut es aber nicht!!

  while(1)
  {
//So ab hier funktioniert das blinken zwar problemlos aber
//LPC_GPIO0->FIOCLR - Wert ist im Debuger immer auf 0. ich würde es 
gerne //verstehen warum das so ist.

    LPC_GPIO0->FIOSET |= (1<<17);
    for(i=0; i<10000000; i++);

    LPC_GPIO0->FIOCLR |= (1<<17);
    for(i=0; i<10000000; i++);
  }

  return 0 ;

}
Was stimmt mit meinem Blinky-Programm nicht??
Vielleicht kennt auch jemand echte LPCxpresso-Beispielcodes, also welche 
die nicht für Keil_Borad geschrieben sind aber mit xpresso angeblich 
problemlos funktionieren. Das tun Sie jedenfeils bei mir nicht.

von Karl K. (leluno)


Lesenswert?

Du dürftest über das FIOxSet-Register zugreifen, wird im Manual auf 
Seite 124 erklärt. Du kannst die Ports aber auch direkt ansteuern.

von Arne Maximilian R. (arnemaximilian_r)


Lesenswert?

Moin,

Als erstes verwende bitte in Zukunft die Code Formatierung. Das macht es 
dann wesentlich leichter deinen Code zu lesen.

Wenn du die LPCXpresso IDE installierst sollten mehrere Codebeispiele 
für das Board vorhanden sein (wenn ich mich jetzt nicht komplett 
täusche). Dort sollte dann auch ein Beispiel für ein blinkendes Licht 
sein.

(Die IDE hat ein Limit von 256 Kb und ist damit sehr gut für den Hobby 
Bereich geeignet.)

von Mike_D (Gast)


Lesenswert?

@Arne,
ich habe tatsächlich die Code-Formatierung verwendet, hab dann hier aber 
nochmal einige stellen nachträglich weg editiert damit das ganze nicht 
zu Lang wird.
Es gibt Beispiele für LPCXpresso, die sind aber nicht ohne weiteres 
sofort coplier-und ausführbar. wenn man z.B das Projekt "GPIO" aus der 
mitgelieferte zip Datei "NXP_LPCXpresso1769_MCB1700_2011-02-11" in die 
IDE importiert und compliert kommt die Meldug: fatal error: lpc17xx.h: 
No such file or directory. Muss also ersmtal irgendwelche Einstellungen 
vornehmen.(weis noch nicht welche und wo)

Es geht mir nur um die Frage Warum geht die LED am Port-Pin an der 
besgte Stelle im Code nicht aus obwohl ich den Clear-Register FIOCLR mit 
eins gesetzt habe.

Danke, dass Du mein Code gelesen hast.

@Karl_k,
ja, das weis ich. Es geht mir wie schon gesagt um das Verhalten des MCs 
beim FIOCLR. Nicht FIOSET.

von Erwin R. (erwin_r54)


Lesenswert?

FIOCLR ist ein Write-Only Register, das kann also nicht gehen:
LPC_GPIO0->FIOCLR |= (1<<17);

So sollte es funtkionieren:
LPC_GPIO0->FIOCLR = (1<<17);

von Mike_D (Gast)


Lesenswert?

@Erwin
danke, man kann sehr wohl LPC_GPIO0->FIOCLR |= (1<<17); schreiben. ich 
hab deinen Vorschlag ohne nach zudenken trotz dem ausprobiert. Hat nix 
gebracht.  wohl gemerkt: Das blinken funktioniert in der while-Schleife 
einwandfrei. Aber meine Erwartung ist etwas anderes, nähmlich:

1- wenn ich mit dem Debuger am LPC_GPIO0->FIOSET |= (1<<17)ankomme, 
sollte der LED (da PIN high ist)an gehen und an bleiben bis nächste 
Clear-Anweisung oder Programmende. Das findet nich statt.
2- bei der erste LPC_GPIO0->FIOCLR |= (1<<17);-Anweisung sollte doch die 
LED wieder aus gehen da man mit dieser Anweisung den Pin low macht. auch 
das findet nicht statt.
hier nochmal mein code, zum Debugen und durchstepen, wenn einer möchte:

#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

// TODO: insert other include files here

// TODO: insert other definitions and declarations here

int main(void)
{

  // TODO: insert code here

  unsigned int i;

  LPC_GPIO0->FIODIR |= (1<<17);

        //wenn ich hier drüber Steppe ist die LED immer noch an.komisch!
        LPC_GPIO0->FIOCLR |= (1<<17);

        //wenn ich hier drüber Steppe geht die LED aus. warum?
        LPC_GPIO0->FIOSET |= (1<<17);


  // Enter an infinite loop, just incrementing a counter
  while(1)
  {
    LPC_GPIO0->FIOSET |= (1<<17);
    for(i=0; i<10000000; i++);

    LPC_GPIO0->FIOCLR = (1<<17);
    for(i=0; i<10000000; i++);
  }

  return 0 ;
}

von leluno (Gast)


Lesenswert?

Um den i/o-Pin zu initialisieren, müssen mehrere Schritte durchgeführt 
werden:
1
void out_pin_init(char port,char pin){
2
  pinSEL(port,pin,0);
3
  pinMODE(port,pin,2);//0_pullup 1_repeater 2_no 3_pulldown
4
  pinOPD(port,pin,0);//0_normal 1_opendrain
5
  pinDIRout(port,pin);
6
  pinSET(port,pin);
7
}
8
#define out1_on pinSET(port_out1,pin_out1);
9
#define out1_off pinCLR(port_out1,pin_out1);

neben dir musst du zumindest den pullup abstellen. Ansonsten leuchtet 
die led mglw. über den pullup.

von Dr. Sommer (Gast)


Lesenswert?

leluno schrieb:
> #define out1_on pinSET(port_out1,pin_out1);
> #define out1_off pinCLR(port_out1,pin_out1);
Hier ist das Makro wirklich unnötig, eine Funktion ist wesentlich 
sauberer:
1
inline void out1_on () { pinSET(port_out1,pin_out1); }
2
inline void out1_off () { pinCLR(port_out1,pin_out1); }

von Karl K. (leluno)


Lesenswert?

1
#ifdef __USE_CMSIS
2
#include "LPC17xx.h"
3
#endif
"LPC17xx.h" befindet sich in der Bibliothek CMSIS. Wenn du die 
LPCxpresso-Beispiele ausprobieren willst, musst du auch CMSIS in das 
Projekt einbinden.

von Pipeline (Gast)


Lesenswert?

Mike_D schrieb:
> danke, man kann sehr wohl LPC_GPIO0->FIOCLR |= (1<<17);

Das entspricht aber nicht der Denkweise beim ARM. Du veränderst nicht 
ein Port-Statusregister, sondern hast zwei getrennte Register zum Setzen 
und Löschen. Dabei sprichst du nur die Bits an, die du verändern 
möchtest. Alle anderen (in denen eine 0 steht) bleiben unverändert.

Für dein Beispiel:
LPC_GPIO0->FIOCLR = (1<<17);
oder
LPC_GPIO0->FIOCLR = BIT17;

Der Vorteil liegt in der Verarbeitungsgeschwindigkeit, denn du benötigst 
keinen Lesebefehl und bremst die Pipeline nicht aus.

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.