www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik lpc2148 pin adressen


Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich versuche gerade zu verstehen, wie ich beim LPC2148 die Ports 
ansteuern kann. Aber leider werde ich aus dem Manual nicht wirklich 
schlau. Dort ist z.B.  folgendes Beispiel angegeben:

IO0DIR = 0x0000 0080 ;pin P0.7 configured
IO0CLR = 0x0000 0080 ;P0.7 goes LOW
IO0SET = 0x0000 0080 ;P0.7 goes HIGH
IO0CLR = 0x0000 0080 ;P0.7 goes LOW

Aber woher weiß ich denn jetzt, dass 0x00000080 P0.7 ist? Und wie kann 
ich die anderen Adressen errechnen?

Vielen Dank für euere Hilfe!

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P0.7 ist der Pin Nummer 7 und hat innerbalb des Maschinenwortes den Wert 
128 bzw. 0x80.

2^7 = 2*2*2*2*2*2*2 = 128 = 0x00000080
2^6 = 2*2*2*2*2*2   =  64 = 0x00000040
...
2^2 = 2*2           =   4 = 0x00000004
2^1^= 2             =   2 = 0x00000002
2^0 = 2/2           =   1 = 0x00000001

Das mit dem "2^0 = 2/2" ist zwar mathematisch nicht korrekt, aber eine 
gute Eselsbrücke.

Und was für Adressen willst du berechnen? Die Adressen für P1 etc. 
stehen alle im Manual bzw. in den Header Files. Hier hilft nur "RTFM".

Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Erklärung. Ich bin derzeit auf der Suche nach den Adressen 
der Ports P1.25-31. Das Manual habe ich schon durchgesucht, da war habe 
ich keine Adressen der Pins gefunden und auch die Header Files von Keil 
<LPC21xx.H> haben keine Adressen drinn. Wo finde ich die denn jetzt?

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google: LPC2148 --> Erster Treffer: Keil --> LPC2148.h

und dort drin steht z.B.
#define IO0PIN          (*((volatile unsigned long *) 0xE0028000))
#define IO0SET          (*((volatile unsigned long *) 0xE0028004))
#define IO0DIR          (*((volatile unsigned long *) 0xE0028008))
#define IO0CLR          (*((volatile unsigned long *) 0xE002800C))
#define IO1PIN          (*((volatile unsigned long *) 0xE0028010))
#define IO1SET          (*((volatile unsigned long *) 0xE0028014))
#define IO1DIR          (*((volatile unsigned long *) 0xE0028018))
#define IO1CLR          (*((volatile unsigned long *) 0xE002801C))

Stehen doch die Adressen für beide Ports drin. IO0(null)... und IO1...

Oder willst du die Bitmasken für P1.25 - P1.31 wissen?

Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ARM-Fan wrote:
>
>
> #define IO0PIN          (*((volatile unsigned long *) 0xE0028000))
> #define IO0SET          (*((volatile unsigned long *) 0xE0028004))
> #define IO0DIR          (*((volatile unsigned long *) 0xE0028008))
> #define IO0CLR          (*((volatile unsigned long *) 0xE002800C))
> #define IO1PIN          (*((volatile unsigned long *) 0xE0028010))
> #define IO1SET          (*((volatile unsigned long *) 0xE0028014))
> #define IO1DIR          (*((volatile unsigned long *) 0xE0028018))
> #define IO1CLR          (*((volatile unsigned long *) 0xE002801C))
> 
>
> Stehen doch die Adressen für beide Ports drin. IO0(null)... und IO1...


Ja, das ist klar, das habe ich auch sowohl im Manual, als auch im Header 
File gefunden, aber wie leite ich jetzt daraus:

2^7 = 2*2*2*2*2*2*2 = 128 = 0x00000080
2^6 = 2*2*2*2*2*2   =  64 = 0x00000040
...
2^2 = 2*2           =   4 = 0x00000004
2^1^= 2             =   2 = 0x00000002
2^0 = 2/2           =   1 = 0x00000001

ab? Besonders für P1.25-31

Autor: Dominic R. (dominic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heh, also wenn jetzt keiner lästert hast du mal richtig Glück 
gehabt... ;)

2^15 = 2*2*2*2*2*2*2*2*2*2*2*2*2*2*2 = 32768 = 0x8000
2^16 = 2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2 = 65536 = 0x10000
...
2^25 = 2*2*2*2*... = 0x2000000
2^26 = 0x4000000
2^27 = 0x8000000
2^28 = 0x10000000
2^29 = 0x20000000
2^30 = 0x40000000
2^31 = 0x80000000

also z.B.:
IO1SET = 0x02000000 ;P1.25 goes HIGH

Gruss,

Dominic

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube diese ganze Hex-Geschichte ist hier wenig hilfreich.
Jedes Bit steht für einen Pin. Um P1.25-P1.31 als Ausgang
zu definieren könntest du schreiben:

IO1DIR = (1<<25)|(1<<26)|(1<<27)|(1<<28)|(1<<29)|(1<<30)|(1<<31);

bzw.

IO1DIR = _BV(25)|_BV(26)|_BV(27)|_BV(28)|_BV(29)|_BV(30)|_BV(31);

Oder mit den Generator Makros:
IO1DIR = B32(11111110, 00000000, 00000000, 00000000);

Ich mache es allerdings ganz anders:
#define OUT1 (1, 25)
#define OUT2 (1, 26)
#define IN1  (1, 27)

SET_DDR_OPT_OUT(OUT1);
SET_DDR_OPT_OUT(OUT2);
SET_DDR_OPT_IN(IN1);

SETPIN(OUT1);
CLRPIN(OUT2);
a = GETPIN(IN1);

Die SET_DDR_OPT... Anweisungen werden vom GCC zu einer einzigen
zusammengefaßt. Der Code stammt im wesentlichen von den
AVR-Freaks. Ich habe ihn lediglich portiert. Falls es jemanden
interessiert, will ich den wohl hochladen. Vorher müßte ich
den aber noch etwas aufräumen ;).

Man sieht an den Beispielen für die ARMe das die AVR-Gemeinde
mit ihrer Software scheinbar doch um einiges weiter ist.

 - Michael

Autor: Dominic R. (dominic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest ausserdem darauf achten, dass P1.26-P1.31 für das JTAG 
Interface benötigt werden, d.h. wenn du diese Pins als GPIO benutzen 
willst steht dir kein JTAG Debugging mehr zur Verfügung.

Gruss,

Dominic

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich will nicht überheblich oder böswillig klingen...

Aber 'nen ARM programmieren wollen und von 2^7 nicht bis 2^31
weiterzudenken bzw. die einfachsten Bitschiebereien nicht hinzubekommen,
finde ich bedenklich bis abenteuerlich...

Ist das ein Umstieg von 8-bit auf 32-bit Maschine oder ein kompletter
Neuanfang?

Autor: Mathias Braun (dedi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ARM-Fan wrote:
> Ist das ein Umstieg von 8-bit auf 32-bit Maschine oder ein kompletter
> Neuanfang?

Bis vor etwa 2 Jahren habe ich mit 8051er Mikrocontrollern mit ASM 
gearbeitet. Die letzten 2 Jahre hatte ich mit Mikrocontrollern kaum 
etwas zutun und wollte jetzt wieder etwas machen. Deshalb habe ich mir 
nun ein LPC2148er Board mit USB Anschluss besorgt.

Aber ich glaube, dass es hier hauptsächlich ein Verständnisfehler war. 
Ich habe anfangs das Prinzip nicht ganz verstanden.

2^31 = 0x80000000 = pin31
und
IO1SET = ... => Port1
IO0SET = ... => Port0

Richtig?

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig :-)
Man muß sich hier und da beim Umstieg halt dran gewöhnen, dass
man mit einem Zugriff nicht nur ein Byte sondern gleich 32bit auf einmal
anspricht/ansprechen kann.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.