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!
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".
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?
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?
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
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
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
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
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?
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.