avr-chat
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [avr-chat] Array access to ports


From: Ron Kreymborg
Subject: RE: [avr-chat] Array access to ports
Date: Tue, 30 Oct 2007 21:56:25 +1100


> -----Original Message-----
> From: address@hidden 
> [mailto:address@hidden On 
> Behalf Of David Brown
> Sent: Monday, 29 October 2007 7:25 PM
> To: address@hidden
> Subject: Re: [avr-chat] Array access to ports
> 
> 
> Ron Kreymborg wrote:
> > I am addressing a dozen or so LEDs on a number of different ports, 
> > turning them on and off. I would like to address them 
> through an array 
> > structure that stores the relevant port and mask. For example:
> > 
> > typedef enum
> > {
> >     T_LED_OFF,
> >     T_LED_ON
> > } LED_STATE_TYPE;
> > 
> > typedef struct
> > {
> >     MYPORT    port;
> >     uint8     mask;
> > } LED_TYPE;
> > 
> > I could designate the respective LEDs with names. For example:
> > 
> > typedef enum
> > {
> >    LEDOUT,
> >    etc
> > } LED;
> > 
> > I had hoped to be able to preload the array something like:
> > 
> > static LED_TYPE LedList[] = {
> >     {PORTB, 0x20},                // LEDOUT
> >     {etc}
> > };
> > 
> > Where the 0x20 is the mask for pin5 of PORTB for the LEDOUT led. I 
> > could then use a simple function to address all leds. For example, 
> > turning the LEDOUT led on (high) would look like:
> > 
> >    ChangeLedState(LEDOUT, T_LED_ON);
> > 
> > And the partial function:
> > 
> > void ChangeLedState(LED index, LED_STATE_TYPE state)
> > {
> >    if (state == T_LED_ON)
> >       LedList[index].port |= LedList[index].mask;
> >    .
> >    .
> > 
> > The snag of course is that PORTB is not a constant but an SFR. Can 
> > anyone suggest whether assigning a port like this is possible, and 
> > what would be the definition of MYPORT?
> > 
> > Cheers
> > Ron
> > 
> 
> You can't store an array of SFR's like this - but you can 
> store an array 
> of pointers to them:
> 
> typedef volatile uint8_t vuint8_t;
> typedef vuint8_t pvuint8_t;
> 
> typedef struct { pvuint8_t pPort; uint8_t mask; } ledType;
> 
> static ledType ledList[] = { { &PORTB, 0x20 }, { &PORTC, 0x10 } };
> 
> Then you can write:
>       *(ledList[index].pPort) |= ledList[index].mask;
>
-----------------------------------------------------------------
Thanks for the clue David. In fact it is even simpler than that:

typedef struct {uint8* pPort; uint8 mask;} LedType;

static LedType LedList[] = {{&PORTB, 0x20},{etc...}};

   *LedList[index].pPort |= ledList[index].mask;

This uses 13 instructions (OPT=s) - overhead I can live with.

Thanks again
Ron





reply via email to

[Prev in Thread] Current Thread [Next in Thread]