Hallo allerseits, ich habe ein Problem mit dem GPIO beim LPC2129. Ich habe mal einen Screenshot vom Memoryfenster angehängt. Mein Problem ist, das wenn ich an den Ausgängen die spannung messe, diese nicht den Pegel haben den sie haben sollten, beispielsweise ist Pin 0.0 auf HIGH. Das ändert sich auch nicht, wenn ich die Register IOCLR0 oder IOSET0 schreibe. Das Problem scheint aber nur bei den unteren Pins zu bestehen, da ich die LED auf dem Board blinken lassen kann. Ich habe übrigens das Olimex LPC2129 Board hier aus dem Shop. MFG Matthias Fromme
Einige Pins an diesem Controller habe keine "push-pull"-Ausgänge sondern lediglich "open-drain". Ist aber in der Pinbeschreibung im Manual auch erläutert. Das sind inbesonderen die Pins, die auch für I2C genutzt werden können. Man kann diese lediglich von "high-z" auf "output low" schalten. "output high" gibt es also nicht wirklich. Abhilfe: externer Pull-Up-Widerstand zum "Hochziehen" auf high. Martin Thomas
Ich habe mich vielleicht nicht ganz eindeutig ausgedrück. Das mit den open-drain Ausgängen ist soweit schon klar, das eigentliche Problem ist, das ich am Ausgang "HIGH" messe, obwohl das Das Bit im Register 0 ist. Das es ein open-drain Ausgängen kommt ja nur zum tragen wenn ich ein HIGH-Signal erwarten würde, wenn ich das richtig sehe. Matthias Fromme
Manchmal stolpert man auch über die grundlegendsten Dinge: Sind IODIR und IOPIN richtig gesetzt? Dietmar
Ja, sollten sie sein. IODIR ist bis auf die JTAG-Pins als Output gesetzt, und IOPIN ist wenn ich es richtig sehe read-only.
Sorry, sollte IODIR und PINSEL heißen, nichts mit IOPIN. Wieso ist IOPIN readonly? Ach ja, diese Geschichte. Druckfehler im User Manual. 2 Seiten weiter ist ein Beispiel, wie man die I/O mit IOPIN ansteuert anstatt mit IOSET und IOCLR. Dietmar
Tatsächlich ein Druckfehler, hatte ich gar nicht bekerkt :-). Also am PINSEL habe ich nichts verändert, das sollte für meinen Pinbereich in Ordnung sein, da diese per default auf GPIO eingestellt sind (benutze momentan nur die unteren 11 Pins). Matthias
Bei mir gehts:
1 | while (1) |
2 | {// Loop forever |
3 | PINSEL0 &= 0xFFFFFFFC; // P0.0 ist GPIO |
4 | IODIR0 |= 0x01; // P0.0 ist Ausgang |
5 | IOSET0 = 0x01; // P0.0 bekommt High-Pegel |
6 | IOCLR0 = 0x01; // P0.0 bekommt Low-Pegel |
7 | IOPIN0 ^= 0x01; // P0.0 bekommt High-Pegel |
8 | IOPIN0 ^= 0x01; // P0.0 bekommt Low-Pegel |
9 | } // while(1) |
Mit Oszi an P0.0, sehe ich schön, wie der Pin sowohl sauber auf High als auch auf Low geht. Dietmar
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.