Forum: Mikrocontroller und Digitale Elektronik lpc2148 pin adressen


von Mathias B. (dedi)


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!

von Werner B. (Gast)


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".

von Mathias B. (dedi)


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?

von ARM-Fan (Gast)


Lesenswert?

Google: LPC2148 --> Erster Treffer: Keil --> LPC2148.h

und dort drin steht z.B.
1
#define IO0PIN          (*((volatile unsigned long *) 0xE0028000))
2
#define IO0SET          (*((volatile unsigned long *) 0xE0028004))
3
#define IO0DIR          (*((volatile unsigned long *) 0xE0028008))
4
#define IO0CLR          (*((volatile unsigned long *) 0xE002800C))
5
#define IO1PIN          (*((volatile unsigned long *) 0xE0028010))
6
#define IO1SET          (*((volatile unsigned long *) 0xE0028014))
7
#define IO1DIR          (*((volatile unsigned long *) 0xE0028018))
8
#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?

von Mathias B. (dedi)


Lesenswert?

ARM-Fan wrote:
>
>
1
> #define IO0PIN          (*((volatile unsigned long *) 0xE0028000))
2
> #define IO0SET          (*((volatile unsigned long *) 0xE0028004))
3
> #define IO0DIR          (*((volatile unsigned long *) 0xE0028008))
4
> #define IO0CLR          (*((volatile unsigned long *) 0xE002800C))
5
> #define IO1PIN          (*((volatile unsigned long *) 0xE0028010))
6
> #define IO1SET          (*((volatile unsigned long *) 0xE0028014))
7
> #define IO1DIR          (*((volatile unsigned long *) 0xE0028018))
8
> #define IO1CLR          (*((volatile unsigned long *) 0xE002801C))
9
>
>
> 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

von Dominic R. (dominic)


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

von let (Gast)


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

von Dominic R. (dominic)


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

von ARM-Fan (Gast)


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?

von Mathias B. (dedi)


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?

von ARM-Fan (Gast)


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.

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.