EmbeddedRelated.com
Forums

Combining Ports?

Started by EdV December 20, 2004
I am using the P18F8720's many io pins to write usart data to a 32K
NVRAM. I don't have room for an address data latch so I am assigning:

Address(0..7) to PortD
Address(8..15)to PortJ
Data(0..8) to PortE
WE/ to PortB.0
OE/ to PortB.1

At least that is what I thought I wanted to do before I started to
write the code. Is there some way to combine PortD and PortJ to make a
16 bit register? Or some way to move values from the upper byte of
Address to PortJ and the lower byte to PortD?

I could use a chain of conditionals to move Address bytes to Ports but
it seems clunkier than necessary.

Thanks much,
           Ed V.

> Address(0..7) to PortD > Address(8..15)to PortJ > Data(0..8) to PortE > WE/ to PortB.0 > OE/ to PortB.1 > > At least that is what I thought I wanted to do before I started to > write the code. Is there some way to combine PortD and PortJ to make a > 16 bit register? Or some way to move values from the upper byte of > Address to PortJ and the lower byte to PortD? > >
This chip appears to do all data operations as byte anyways, so it should be a simple matter to transfer the high and low bytes to the respective ports. The question makes me think that you are perhaps using C, in which case there should be a way to get a pointer to the "two byte int" or something like that, then you just get one and then the next byte out of it like this : int reg16; byte * x; x = & reg16; PortJ = *x++; PortD = *x; I am just guessing about the C part, since the question appears to be moot by virtue of the chip operation. T.
Thanks.

I found a C language refrence and ended up using right shift and it
worked just fine.

I will look into your pointer suggestion as I need to use that part of
my brain more often.

Ed V.


Anthony Marchini wrote:
> > Address(0..7) to PortD > > Address(8..15)to PortJ > > Data(0..8) to PortE > > WE/ to PortB.0 > > OE/ to PortB.1 > > > > At least that is what I thought I wanted to do before I started to > > write the code. Is there some way to combine PortD and PortJ to
make a
> > 16 bit register? Or some way to move values from the upper byte of > > Address to PortJ and the lower byte to PortD? > > > > > > This chip appears to do all data operations as byte anyways, so it > should be a simple matter to transfer the high and low bytes to the > respective ports. > The question makes me think that you are perhaps using C, in which
case
> there should be a way to get a pointer to the "two byte int" or > something like that, then you just get one and then the next byte out
of
> it like this : > > int reg16; > byte * x; > x = & reg16; > PortJ = *x++; > PortD = *x; > > I am just guessing about the C part, since the question appears to be > moot by virtue of the chip operation. > T.
EdV wrote:
> Thanks. > > I found a C language refrence and ended up using right shift and it > worked just fine. > > I will look into your pointer suggestion as I need to use that part of > my brain more often. > > Ed V. >
The nice thing about pointing to the register is that it doesn't destroy the original as shifting will do. You won't have to make a copy before shifting it 8 bits and loading it out. T.