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.
Du dürftest über das FIOxSet-Register zugreifen, wird im Manual auf Seite 124 erklärt. Du kannst die Ports aber auch direkt ansteuern.
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.
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);
@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 ; }
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.
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); } |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.