Forum: Mikrocontroller und Digitale Elektronik ARM LPC11U68 GPIO-Problem


von Uli (Gast)


Lesenswert?

Hallo ins Forum,

ich bin etwas ratlos: Ich nutze einen LPC11U68JBD48 für ein Projekt. Es 
gelingt mir nicht, einige bestimmte Ports als Ausgang zu schalten und zu 
setzen bzw. zu clearen. Diese besagten Ports bleiben IMMER high. Dachte 
zu erst daran, dass hier ein Hardwarefehler (Lötbrücke oder so) 
vorliegt. Aber das ist nachgewiesener Weise nicht der Fall. 
Beispielcode, mit dem sich das Problem darstellen läßt:
1
int main(void) {
2
  
3
  int j = 0;
4
  
5
  LPC_SYSCON->SYSAHBCLKCTRL |= ((uint32_t)1<<16); // GPIO clocks an
6
  
7
  LPC_GPIO_PORT->DIR[1] |= ((uint32_t)1 << 20); // LED blau
8
  
9
        // 4 Pins testweise als Ausgang
10
  LPC_GPIO_PORT->DIR[0] |= (1 << 2);
11
  LPC_GPIO_PORT->DIR[0] |= ((uint32_t)1 << 12);
12
  LPC_GPIO_PORT->DIR[0] |= ((uint32_t)1 << 13);
13
  LPC_GPIO_PORT->DIR[0] |= ((uint32_t)1 << 20);
14
15
        // Diese 4 Pins auf low
16
  LPC_GPIO_PORT->CLR[0] |= (1 << 2);
17
  LPC_GPIO_PORT->CLR[0] |= ((uint32_t)1 << 12);
18
  LPC_GPIO_PORT->CLR[0] |= ((uint32_t)1 << 13);
19
  LPC_GPIO_PORT->CLR[0] |= ((uint32_t)1 << 20);
20
  
21
  while(1) {
22
    // Die LED und die 4 pins toggeln...
23
    LPC_GPIO_PORT->NOT[1] |= ((uint32_t)1 << 20);  // LED blau blinkt --> korrekt
24
    LPC_GPIO_PORT->NOT[0] |= (1 << 2); // Pin toggelt --> korrekt
25
    LPC_GPIO_PORT->NOT[0] |= ((uint32_t)1 << 12); // Pin bleibt auf high --> falsch
26
    LPC_GPIO_PORT->NOT[0] |= ((uint32_t)1 << 13); // Pin bleibt auf high --> falsch
27
    LPC_GPIO_PORT->NOT[0] |= ((uint32_t)1 << 20); // Pin bleibt auf high --> falsch
28
    
29
    for(j = 0; j < 400000; j++);
30
  }
31
  
32
  return 0;
33
}

Hatte schon gedacht, es hat was mit den Bitmanipulationen bei 32bit 
Registern zu tun. Aber die LED blinkt. Also funktioniert das soweit. Hat 
jemand eine Idee?

Gruß Uli

von Johannes S. (Gast)


Lesenswert?

PIO0_12 und _13 sind JTAG Pins, evtl. musst du die erst im IOCON 
Register auf GPIO umstellen. PIO0_20 müsste aber bei Reset als GPIO 
arbeiten und ok sein.
Die Bitkonstanten kannst du einfacher so schreiben: (1L << x)

von Jim M. (turboj)


Lesenswert?

Bei der Pinkonfiguration nachschauen, ob da per default eine 
Hardwarefunktion (Debugger, Uart, ...) drauf liegt. Das würde die GPIO 
Output Steuerung abklemmen.

Die ganzen |= erzeugen jeweils eine Read-Modify-Write Sequenz, was bei 
den CLR und NOT Registern überflüssig sein dürfte (bei den restlichen 
allerdings notwendig ist).

von Jim M. (turboj)


Lesenswert?

Johannes S. schrieb:
> Die Bitkonstanten kannst du einfacher so schreiben: (1L << x)

Falsch. Muss (1U << x) sein, da 1L vorzeichenbehaftet und das schieben 
ins sign Bit nicht definiert ist für x == 31.

von Johannes S. (Gast)


Lesenswert?

eine weitere Falle: P0_4 und P0_5 sind Open Drain Pins, die haben keinen 
internen PullUp. Fällt man auch gerne drauf rein.

von Johannes S. (Gast)


Lesenswert?

Jim M. schrieb:
> Falsch. Muss (1U << x) sein, da 1L vorzeichenbehaftet und das schieben
> ins sign Bit nicht definiert ist für x == 31.

ah, ok. Habe das 1L in unzähligen Beispielen gesehen, aber da war x zum 
Glück wohl immer kleiner 31.

von Uli (Gast)


Lesenswert?

Danke in die Runde,

Johannes hat mit PIN0_13 und PIN0_14 Recht gehabt. Diese werden nach 
Reset als JTAG-Pins konfiguriert. Handbuch half weiter.
ABER: Bei PIN0_20 habe ich das Problem immer noch. Keine Chance, als GPO 
auf low zu ziehen.... Ich verzweifel, weil ich diesen PIN im Layout 
benötige. Ein Bug auf dem Chip??? Elektrisch ist alles OK, kein Schluß 
zu anderen Pins oder so... Irgendetwas ist anders bei diesem Pin.

Uli

von Johannes S. (Gast)


Lesenswert?

Uli schrieb:
> Elektrisch ist alles OK, kein Schluß zu anderen Pins oder so

Auch den Widerstand gegen VCC gemessen? Oder mal mit Amperemeter gegen 
GND kurzschließen und sehen wieviel Strom da fließt.
Ist der Pin schon beschaltet?

von Uli (Gast)


Lesenswert?

Hallo Johannes,

Pin war bereits beschaltet, da auf einer Prototypen-Platine. Habe 
vorsichtig eine Trennung in die Leiterbahn gefräst um ihn "solo" zu 
haben. Werde jetzt mal messen. Spannung ist 3,20V, zum Vergleich: VCC 
ist 3,32V. Kein weiteres Bauteil. Melde mich, wenn ich Widerstand und 
Spannung gemessen habe.

von Uli (Gast)


Lesenswert?

Hallo Johannes,

sieht nach einem defekten Pin (Ausgangsstufe) aus: R gegen VCC: 1,7 Ohm, 
R gegen Masse: ca. 96 Ohm. :-(

Wüßte allerdings nicht, wie ich das geschafft haben soll, das Teil 
defekt zu kriegen...

von Johannes S. (Gast)


Lesenswert?

eigentlich sind die sehr robust. Kriegst du den Pin abgelötet und etwas 
hochgebogen? Ich hätte ja immer noch die Platine im Verdacht.

von Uli (Gast)


Lesenswert?

Danke für die Hilfe Johannes,

ich teste das morgen mal und schmeiße den Lötkolben an. Ist so ziemlich 
fummelig. Melde mich morgen vormittag nochmal dazu.

PS: Warum sollte eine Platine so krumme Widerstandswerte fabrizieren?

Zur Info: Ist 4-lagig mit durchgehendem GND-Layer. Aber VCC ist 
eigenltich nicht in der Nähe geführt...

Gruß Uli

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.