LPC11Cxx: Pin 1_10 und 1_11 auslesen funktioniert nicht

OP #7596558
Lesenswert?

Hallo,

Seit geraumer Zeit kämpfe ich mit einer eigentlich sehr einfachen Aufgabe: An einem LPC11C14 hab ich an Port 1 Pin 9, 10 und 11 je einen Taster angeschlossen. Taster offen => pin floatet; taster gedrückt: mit 1K nach Vcc geschlossen.

Mein Problem ist: ich schaffe es nicht den Tastendruck von Pin 1/10 und 1/11 (richtig) auszuwerten. Auch bei gedrückter Taste, lese ich immer eine 0 aus. Pin 1/9 funktioniert einwandfrei.

Da auf den betroffenen Pin's als Alternativfunktion den ADC gibt, hab ich daher auf diesen umgeschaltet. Jede Sekunde werte ich beide Varianten aus. siehe Code:

1
// ADC input
2
Chip_IOCON_PinMuxSet(LPC_IOCON, IOCON_PIO1_10, (IOCON_FUNC1 | IOCON_MODE_INACT));
3
Chip_GPIO_SetPinDIRInput(LPC_GPIO, 1, 10);
4
uint16_t adresult;
5
ADC_CLOCK_SETUP_T ADCSetup;
6
Chip_ADC_Init(LPC_ADC, &ADCSetup);
7
Chip_ADC_EnableChannel(LPC_ADC, ADC_CH6, ENABLE);
8
Chip_ADC_SetStartMode(LPC_ADC, ADC_START_NOW, ADC_TRIGGERMODE_RISING);
9
while (Chip_ADC_ReadStatus(LPC_ADC, ADC_CH6, ADC_DR_DONE_STAT) != SET) {}
10
Chip_ADC_ReadValue(LPC_ADC, ADC_CH6, &adresult);
11
DEBUGOUT("ADC value 0x%x\r\n", adresult);
12

13
// digital input
14
Chip_IOCON_PinMuxSet(LPC_IOCON, IOCON_PIO1_10, (IOCON_FUNC0 | IOCON_MODE_INACT));
15
Chip_GPIO_SetPinDIRInput(LPC_GPIO, 1, 10);
16
DEBUGOUT("Digital value 0x%x\r\n", Chip_GPIO_GetPinState(LPC_GPIO, 1, 10));

Das Ergebnis ist eigentlich recht eindeutig:

Taster offen (erwartetes Ergebnis):

1
ADC value 0x174
2
Digital value 0x0
3
ADC value 0x137
4
Digital value 0x0
5
ADC value 0x1c3
6
Digital value 0x0
7
ADC value 0x2b3
8
Digital value 0x0
9
ADC value 0x259
10
Digital value 0x0

Taster geschlossen (ADC Ergebnis erwartet, Digital bleibt immer 0):

1
ADC value 0x3ff
2
Digital value 0x0
3
ADC value 0x3ff
4
Digital value 0x0
5
ADC value 0x3ff
6
Digital value 0x0
7
ADC value 0x3ff
8
Digital value 0x0

Wenn ich den obigen Code noch dahingehend verändere, dass der interne Pull-down aktiv ist, dann ist auch das ADC Ergebnis im floating Zustand immer schön 0 - wie man es erwartet.

Ich stell mir grad die Frage ob ...

  • ich beim einlöten den µC zu viel gebraten habe oder anderweitig die digitalen Ports 1/10 und 1/11 zerstört habe? (zugegeben: jedes mal, wenn ich an einen Hardwarefehler gedacht habe, war es dann doch immer noch meine eigene Schuld ...)
  • oder ob es bei genau diesen beiden Pins etwas spezielles zu beachten gibt? Pin 1/9 funktioniert ja. Aber genau 10/11 haben ja als Alternativfunktion den ADC - vielleicht ist da noch etwas spezielles zu beachten, was ich im Datenblatt noch nicht gefunden habe ...

Hat jemand Erfahrung mit den LPC11xxx und hat nen Tipp für mich?

danke!

vG Alram

Angehängte Dateien:
OP #7596564
Lesenswert?

J. S. schrieb:

Die beiden sind afaik für I2C und open drain

danke für den Hint - aber: Da bin ich mit meiner aktuellen Platine auch schon rein gefallen. Für I2C sind die Ports 0/4 und 0/5 vorgesehen (da musste ich schon nachträglich ein paar pull-up's nachlöten).

für die Pins 1/10 und 1/11 muss noch etwas anders sein - oder eben ich hab den beiden Pins gekillt.

edit: Vielleicht hätte ich noch erwähnen sollen, dass die internen Pull-ups auch funktionieren (bei den I2C Pins sind die ja nicht vorhanden). Bei aktiven Pull-up sieht die sache so aus:

ADC => mißt dann zwar nicht immer 0x3ff aber 0x3dc-0x3de. also knapp an Vcc. Digital port => immer 0. Obwohl Multimeter am Pin 3,3V anzeigt

#7596701
Lesenswert?

Alram L. schrieb:

Taster offen => pin floatet; taster gedrückt: mit 1K nach Vcc geschlossen.

Einen floatenden Pin kann man nicht feststellen. Floatend heißt, jeder Pegel ist möglich, eben auf was die Pinkapazität gerade aufgeladen ist oder von anderen Signalen einkoppelt. Typisch schaltet man daher den Pullup ein und die Taste legt GND an.

Ich würde im Usermanual die Pinkonfiguration überprüfen. Die LPC sind da ja recht kompliziert. Die Bitnummer im Port kann auch eine andere im Inputregister sein. Und als Interrupt dann wieder eine andere. Und für Input muß es auch nicht immer Funktion 0 sein. Ist alles ein ganz schönes Durcheinander bei den LPC.

ADC und digital Input dürfte nicht gleichzeitig gehen.

OP #7597352
Lesenswert?

Peter D. schrieb:

Einen floatenden Pin kann man nicht feststellen.

Ja - das ist klar. Vielleicht hab ich das falsch formuliert - aber das war nicht das Ziel. Damit wollte ich nur sicherstellen, dass ich die richtigen Pins konfiguriere und das eine schlechte Lötstelle ausgeschlossen werden kann.

Peter D. schrieb:

Ich würde im Usermanual die Pinkonfiguration überprüfen. Die LPC sind da ja recht kompliziert. Die Bitnummer im Port kann auch eine andere im Inputregister sein. Und als Interrupt dann wieder eine andere. Und für Input muß es auch nicht immer Funktion 0 sein. Ist alles ein ganz schönes Durcheinander bei den LPC.

Da kann ich dir voll zustimmen. Das ist tlw. wirklich etwas schräg, das manchmal Funktion 0 GPIO ist und manchmal etwas anderes und manchmal auch Funktion 0 reserviert ist .. aber hier kommen wir meiner Frage schon näher: Kennt jemand eine versteckte Fehlkonfiguration für diese beiden Pins?

Das Datenblatt https://www.nxp.com/docs/en/data-sheet/LPC11CX2_CX4.pdf sagt Klar GPIO => ist Funktion 0. Wie dem Code oben zu entehmen ist, konfiguriere ich auf Funktion 0 im digital mode als Input. Entweder reicht das nicht, der µC ist wirklich defekt ...

vG Alram

Angehängte Dateien:
OP #7597380
Lesenswert?

Soeben mit neuem Anlauf konnte ich das Problem lösen: Da alle Pins per default auf Input (mit pull up) konfiguriert sind, hab ich einfach diese Konfiguration nicht verändert. Und siehe da: dann lese ich eine 1 für den Port 1_10 aus.

Dann genau rein geschaut, was die Chip_IOCON_PinMuxSet wohl so macht und dann auf diese Spezialfunktion in der Chip library gestossen:

1
#define IOCON_DIGMODE_EN        (0x1 << 7)    /*!< Enables digital function (analog pins only) */

und wenn man diese aktiviert, dann funktioniert es auch:

1
Chip_IOCON_PinMuxSet(LPC_IOCON, IOCON_PIO1_10, (IOCON_FUNC0 | IOCON_MODE_PULLDOWN | IOCON_DIGMODE_EN));

muss man also bei AD Pins die Digitalfunktion explizit einschalten ...

und wieder mal bestätigt: Wenn man an defekte Hardware denkt, sitzt das Problem doch wieder mal vorm PC :)

und wenn man weiß wonach man suchen soll, findet man auch die Richtige Stelle in Datenblatt ...

thx Alram

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