From: <Hel...@pr...> - 2008-01-29 11:00:25
|
>> Is there a indexable way to access the SFRs? >> >> like: value = PxIN(5); >> which should do the same like value = P5IN; [ From: amx <amx@me...> - 2008-01-29 06:43 ] > Try this macro: > #define PxIN(a) P##a##IN .. is a nice usage of the ## operator, but it does not work for me because my 'a' is defined much later in a function call at runtime: n = 5; printf( "PxIN(1)=%d.\n", PxIN(1) ); printf( "PxIN(n)=%d.\n", PxIN(n) ); leads to: main.c:189: `PnIN' undeclared (first use in this function) But good old '?' operator seems to do what i expect from him: printf( "PxIN(1)=%d.\n", PxIN(1) ); 12d6: 5f 42 20 00 mov.b &0x0020,r15 ;0x0020 12da: 7f f3 and.b #-1, r15 ;r3 As==11 12dc: 0f 12 push r15 ; 12de: 30 12 0c 12 push #4620 ;#0x120c 12e2: 30 12 7e 22 push #8830 ;#0x227e 12e6: b0 12 b6 70 call #28854 ;#0x70b6 printf( "PxIN(5)=%d.\n", PxIN(5) ); 12ea: 5f 42 30 00 mov.b &0x0030,r15 ;0x0030 12ee: 7f f3 and.b #-1, r15 ;r3 As==11 12f0: 0f 12 push r15 ; 12f2: 30 12 19 12 push #4633 ;#0x1219 12f6: 30 12 7e 22 push #8830 ;#0x227e 12fa: b0 12 b6 70 call #28854 ;#0x70b6 n = 3; printf( "PxIN(n)=%d.\n", PxIN(n) ); 12fe: 5f 42 18 00 mov.b &0x0018,r15 ;0x0018 1302: 7f f3 and.b #-1, r15 ;r3 As==11 1304: 0f 12 push r15 ; 1306: 30 12 26 12 push #4646 ;#0x1226 130a: 30 12 7e 22 push #8830 ;#0x227e 130e: b0 12 b6 70 call #28854 ;#0x70b6 with PxIN(x) made like this: #define PxIN(x) ( (x) == 1 ? (P1IN) : \ (x) == 2 ? (P2IN) : \ (x) == 3 ? (P3IN) : \ (x) == 4 ? (P4IN) : \ (x) == 5 ? (P5IN) : \ (x) == 6 ? (P6IN) : 0 ) Haven't figured out a general solution for the default part '0' esp. when it comes to PxOUT(x) stuff etc. Ciao, Helmut PS: why? wanted to have a single function to perform N pulses on any MSP430 portpin. void Impulse( byte portnr, byte pbit, word cnt ) { ... } plus a #define BLINK40(x) (Impulse(4,0,x)) to have Port 4.0 pulse out some message with: BLINK40(5); BLINK33(2); etc. |