ARM LPC11U68 GPIO-Problem

Gast #4749906
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
Gast #4749932
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)
#4749933
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).
Gast #4749945
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.
Gast #4750328
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
Gast #4750405
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?
Gast #4750427
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.
Gast #4750443
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...
Gast #4750532
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.