Forum: Mikrocontroller und Digitale Elektronik LPC11Cxx: Pin 1_10 und 1_11 auslesen funktioniert nicht


von Alram L. (alram)


Angehängte Dateien:

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

von J. S. (jojos)


Lesenswert?

Die beiden sind afaik für I2C und open drain, die sind anders als die 
anderen Inputs.
Üblicherweise schließt man die gegen GND an und die beiden brauchen dann 
einen externen pull up.

von Alram L. (alram)


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

: Bearbeitet durch User
von Peter D. (peda)


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.

: Bearbeitet durch User
von Alram L. (alram)


Angehängte Dateien:

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

von J. S. (jojos)


Lesenswert?

Alram L. schrieb:
> Klar GPIO => ist Funktion 0.

Kann man sich auch nicht immer drauf verlassen, aber im DaBla ist es 
zumindest bei NXP/STM so das der erste Teil der Bezeichnung auch die 
default Funktion ist.

von Alram L. (alram)


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

: Bearbeitet durch User
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.