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.
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.)
@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.
@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 ;
}
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:
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.