PDA

View Full Version : Bits, Bytes Words and Arrays


Melanie
- 12th July 2004, 19:08
1. How can I reference a BIT in a BYTE?
2. How can I reference a BIT in a WORD?
3. How can I reference a BIT in a BYTE ARRAY?
4. How can I reference a BIT in a WORD ARRAY?
5. How can I reference a BYTE in a WORD ARRAY?

We all know there’s eight Bits in a Byte, and sixteen Bits in a Word. Sometimes however we need to access a Bit in a Byte, or a Word, or in an Array by using an intermediate VARIABLE rather than a constant.


1. How can I reference a BIT in a BYTE?

We know that MyByte.0 references Bit 0 of MyByte, all the way up to MyByte.7 referencing Bit 7 of MyByte… but there’s another way of accessing the bits in a Byte (MyVar is a BYTE variable)…

MyByte.0(MyVar)

When MyVar is in the range 0-7, it will access Bits 0-7 of MyByte.

Example to display all eight BITS of a BYTE sequentially, Bit at a time…

For MyVar=0 to 7
MyBit=MyByte.0(MyVar)
LCDOut $FE,1,"Bit ",#MyVar,"=",#MyBit
Pause 2000
Next MyVar


2. How can I reference a BIT in a WORD?

We know that Myword.0 references Bit 0 of Myword, all the way up to MyWord.15 referencing Bit 15 of MyWord… but there’s another way of accessing the bits in a word (MyVar is a BYTE variable)…

MyWord.0(MyVar)

When MyVar is in the range 0-15, it will access Bits 0-15 of MyWord.

Example to display all sixteen BITS of a WORD sequentially, Bit at a time…

For MyVar=0 to 15
MyBit=MyWord.0(MyVar)
LCDOut $FE,1,"Bit ",#MyVar,"=",MyBit
Pause 2000
Next MyVar


3. How can I reference a BIT in a BYTE ARRAY?

Arrays are arranged in memory in BIT ORDER from the LEAST SIGNIFICANT BIT of the first Byte at the bottom end, to the MOST SIGNIFICANT BIT of the last Byte at the top end. Consider this…

MyByteArray var BYTE [40]

There are 40 Bytes in this array (0-39), each with eight Bits. That means this array has a total of 320 Bits (numbered 0-319 sequentially). All the Bits in this Byte Array can be referenced individually like so…

MyByteArray.0(MyVar)

Where MyVar in this instance is a WORD (because there’s more than 256 Bits in the array). When…

MyVar=0 it references Bit 0 of MyByteArray(0)
MyVar=7 it references Bit 7 of MyByteArray(0)
MyVar=8 it references Bit 0 of MyByteArray(1)
MyVar=15 it references Bit 7 of MyByteArray(1)
All the way, when…
MyVar=312 it references Bit 0 of MyByteArray(39)
MyVar=319 it references Bit 7 of MyByteArray(39)

If MyVar was a BYTE rather than a WORD, you will only be able to access Bits 0-255.


4. How can I reference a BIT in a WORD ARRAY?

Just like the Byte Arrays, Word Arrays are arranged in memory in BIT ORDER from the LEAST SIGNIFICANT BIT of the first Word at the bottom end, to the MOST SIGNIFICANT BIT of the last Word at the top end. Consider this…

MyWordArray var WORD [25]

There are 25 WORDS in this array (0-24), each with sixteen Bits. That means this array has a total of 400 Bits (numbered 0-399 sequentially). All the Bits in this Byte Array can be referenced individually like so…

MyWordArray.0(MyVar)

Where MyVar in this instance is a WORD (because there’s more than 256 Bits in the array). When…

MyVar=0 it references Bit 0 of MyWordArray(0)
MyVar=15 it references Bit 15 of MyWordArray(0)
MyVar=16 it references Bit 0 of MyWordArray(1)
MyVar=31 it references Bit 15 of MyWordArray(1)
All the way, when…
MyVar=384 it references Bit 0 of MyWordArray(24)
MyVar=399 it references Bit 15 of MyWordArray(24)

If MyVar was a BYTE rather than a WORD, you will only be able to access Bits 0-255.


5. How can I reference a BYTE in a WORD ARRAY?

As can be previously seen, all the bits in an array are stored sequentially in memory. It follows that the BYTES in a WORD ARRAY also follow sequentially. This means we can easily extract any BYTE we want to out of a WORD Array in a similar manner. Consider again…

MyWordArray var WORD [25]

There are actually 50 Bytes in this array (0-49). The first byte (0) being the LOWBYTE of MywordArray(0), and the last byte (49) being the HIGHBYTE of MyWordArray(24). Using a similar manner to Bit access, we can access all fifty Bytes of this Word array like so…

MyWordArray.Lowbyte(MyVar)

Where MyVar is in the range 0-49 for my previously defined example Array of 25 Words.

This is really handy, because we can use this method of loading or unloading Word Arrays from EEPROM for example very easily.

Note that HIGHBYTE cannot be used in this instance, because it cannot access the LowByte of the first array element… ie..

MyWordArray.HighByte(0)=MywordArray.LowByte(1)
all the way to…
MyWordArray.HighByte(48)=MywordArray.LowByte(49)

More dangerously, MyWordArray.HighByte(49) will actually perform an unauthorised access on an unknown byte OUTSIDE the MyWordArray structure.

Melanie

anj
- 13th July 2004, 23:34
Gday Melanie
I just read this post and found it quite interesting.
On 6mar2004 i posted on the Picbasic Pro forum, re Accessing the PICs ports in subroutines.
Particularly the ability to access ports not covered by the std 0..15 references.
I never found anything on this in the manual, but it meant i could put direct port addressing into subroutines, by always addressing the required port relative to porta.0 .
Maybe you could modify this post to include access to ports by the referential aliasing method as well?
Just a thought.
Andrew

khoog
- 14th November 2006, 20:44
Found this interesting bit of ancient history. It covers all the options except the one I'm looking for. I need to put some words into a byte array.

settings VAR byte[1]

counter1.byte1 VAR settings[0]
counter1.byte0 VAR settings[1]

-does not appear to work

Klaus

Darrel Taylor
- 14th November 2006, 22:06
6. How can I reference a WORD in a BYTE ARRAY?

Let's say that you have a WORD located at bytes 3 and 4 of a BYTE array, and Byte 3 is the LowByte. You can use the EXT (external) modifier to assign it to a WORD variable.


MyByteArray VAR BYTE[10]

MyWord VAR WORD EXT
@MyWord = _MyByteArray + 3
<br>

khoog
- 14th November 2006, 23:22
Thanks Darrel,

Your example will put the low byte into the array. How do I get the high byte in?

MyByteArray VAR BYTE[10]
MyWord.byte0 VAR MyByteArray[3]

or

MyByteArray VAR BYTE[10]
MyWord.byte1 VAR MyByteArray[3]

will work as well.

I can read in either the high or low byte, but not both of them.

Darrel Taylor
- 14th November 2006, 23:31
It creates an Aliased WORD variable, inside the BYTE array.

When you assign a value to the WORD variable, it puts both BYTEs in the array in a single operation.

MyWord = $1234

will make MyByteArray look like this

[00, 00, 00, 34, 12, 00, 00, 00, 00, 00]

HTH

khoog
- 14th November 2006, 23:43
Thanks again Darrel. That's almost too slick to be true. When you start throwing around those "@" signs it becomes a little mystical for me.

I will try it and let you know.

shahidali55
- 31st January 2010, 07:24
After searching the whole forum for an hour or so i stumbled upon this page.
Finally i can dynamically access bits of a variable. This has really helped me a lot.
Thank you Melanie .

mtripoli
- 1st February 2010, 06:24
Isn't this information in the PicBasic Pro Compiler doc's... something like "Variables", "Aliases", "Arrays" and so forth...?

Mike Tripoli

Joe S.
- 1st February 2010, 06:55
Isn't this information in the PicBasic Pro Compiler doc's... something like "Variables", "Aliases", "Arrays" and so forth...?

Mike Tripoli Probably most of it, Manuals and Data sheets are written by engineers, FOR engineers, and some of us NON engineers have a little trouble getting our heads around them, SO an experienced Advisor / Professor / Engineer / Guru / or even Lay person who knows, lending guidance is appreciated, and welcomed even if some of see it as too basic. You are new here, Welcome, Your statement tells me you might be really knowledgeable. I hope so, we can always use more people who are. I am not, but I help when I can. I learn something here nearly every time I come in. Every newbie can figure out a different way to "stall out" and I have seen some pretty unusual new ideas (that often do not work ) but they challenge me to think, and learn.
Again Welcome Mike Tripoli.

mtripoli
- 1st February 2010, 19:29
I'm not "new" here; I just don't get into every little thing that's posted.

Data sheets and manuals are not written "by engineers for engineers"; that's nonsense. They are written for those knowledgeable in the discipline. If you have not taken the time to make yourself knowledgeable then it's on you. If you don't understand the information in the manual then get a basic book on electronics and educate yourself. There is nothing in the manual that anyone with a basic understanding of electronics wouldn't understand.

Contrary to what (it appears) many people on this forum think, electronics and microcontroller programming isn't some "plug 'n play" hobby. It requires a great deal of time to gain the knowledge to succeed. Yes, I am knowledgeable in the field. This didn't happen by accident; I've spent a great deal of time reading books, manuals and data sheets. I began with the fundamentals and worked up from there. Once you spend the time you'll begin to see that the "unusual new ideas" are neither "unusual" or "new" and are in fact rubbish from people that haven't spent the time up front to know what they are talking about.

I feel so sorry for tech support guys; I really do.

Mike Tripoli

P.S. Your little "quote" about Communism is complete crap.

mackrackit
- 1st February 2010, 20:15
I'm not "new" here; I just don't get into every little thing that's posted.

Data sheets and manuals are not written "by engineers for engineers"; that's nonsense. They are written for those knowledgeable in the discipline. If you have not taken the time to make yourself knowledgeable then it's on you. If you don't understand the information in the manual then get a basic book on electronics and educate yourself. There is nothing in the manual that anyone with a basic understanding of electronics wouldn't understand.

Contrary to what (it appears) many people on this forum think, electronics and microcontroller programming isn't some "plug 'n play" hobby. It requires a great deal of time to gain the knowledge to succeed. Yes, I am knowledgeable in the field. This didn't happen by accident; I've spent a great deal of time reading books, manuals and data sheets. I began with the fundamentals and worked up from there. Once you spend the time you'll begin to see that the "unusual new ideas" are neither "unusual" or "new" and are in fact rubbish from people that haven't spent the time up front to know what they are talking about.

I feel so sorry for tech support guys; I really do.

Mike Tripoli

P.S. Your little "quote" about Communism is complete crap.

OOOO!!!!!!
An attitude!!!

This forum is about helping people. Maybe you have never needed help in understanding or have never ask a question???

Yes, there are many who come here looking for a copy/paste solution. They get "weeded".
There are many who do not have the years behind them to have learned.
There are many that come from another language or discipline also. Are they to be ridiculed?

IF
you think the people truly trying to learn are beneath you
THEN
BUZZ OFF!!!!
ELSE
never mind
just
BUZZ OFF...

Joe S.
- 2nd February 2010, 01:03
Hi Mike,
Opinions are what makes for horse races. Everyone starts out as a newbie, and people learn at different rates. Those are Facts, added to my opinion above. You have a great day! I choose not to argue.
JS
Edit: Melanie did this forum a service with this and nearly all of her posts, I say nearly, because Nobody is ever always or never.