Forum: Mikrocontroller und Digitale Elektronik ARM LPC11U68 GPIO-Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Uli (Gast)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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?

: Bearbeitet durch User
von Uli (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.