View previous topic :: View next topic |
Author |
Message |
tstein
Joined: 02 Aug 2005 Posts: 8
|
Passing a #BIT in c possible? |
Posted: Thu Feb 18, 2010 2:00 pm |
|
|
Is it possible to pass something defined with #BIT to a c function? Here is an example of what I'd like to do:
Code: |
unsigned char ucOption;
#BIT bOption = ucOption.7
void SetBit(unsigned char data)
{
data = 1;
}
void main()
{
SetBit(bOption);
}
|
Obviously this doesn't work, but how would I go about doing this? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 18, 2010 3:17 pm |
|
|
How doesn't it work ? I made a little test program and passed
parameters of 1 and 0 to the SetBit() function several times.
I displayed the value of the 'data' parameter inside the function
with a printf statement, and I get this, which is correct:
Quote: |
data = 01
data = 00
data = 01
data = 00
|
This was tested with compiler vs. 4.104 in the MPLAB simulator.
Code: |
#include <18F452.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
unsigned char ucOption;
#BIT bOption = ucOption.7
void SetBit(unsigned char data)
{
printf("data = %x\r", data);
}
//==============================
void main()
{
bOption = 1;
SetBit(bOption);
bOption = 0;
SetBit(bOption);
bOption = 1;
SetBit(bOption);
bOption = 0;
SetBit(bOption);
while(1);
}
|
|
|
|
tstein
Joined: 02 Aug 2005 Posts: 8
|
|
Posted: Thu Feb 18, 2010 3:25 pm |
|
|
I think most of my problem has to do with passing a value instead of a pointer. But I can't seem to figure it out.
I'm wanting to directly write the bit passed from within the function.
I think the reason yours works is because your dumping the value and not modifying the bit variable.
Any ideas how I can modify the passed #BIT variable? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 18, 2010 3:36 pm |
|
|
I'm not sure why you want to do this, because you can just set or clear
a bit variable with a line of code. But if you want to use a pseudo
function, you can do it with a macro. I've created the SetBit() macro
below. The results of the test are:
Quote: |
bOption = 00
bOption = 01
|
Code: |
#include <18F452.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
unsigned char ucOption;
#BIT bOption = ucOption.7
#define SetBit(x) x = 1
//==============================
void main()
{
bOption = 0;
printf("bOption = %x\r", bOption);
SetBit(bOption);
printf("bOption = %x\r", bOption);
while(1);
}
|
|
|
|
tstein
Joined: 02 Aug 2005 Posts: 8
|
|
Posted: Thu Feb 18, 2010 3:47 pm |
|
|
The reason why I would need to do it in a function is because I have a ton of #BIT variables defined already. So there is a desire to create one function to pass a #BIT type by reference and modify it from within the function. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 18, 2010 3:50 pm |
|
|
What's wrong with the macro ?
If you look at the .LST file, the macro creates a "one liner" to set the bit:
Code: |
.... SetBit(bOption);
00CA: BSF 05.7
|
|
|
|
tstein
Joined: 02 Aug 2005 Posts: 8
|
|
Posted: Thu Feb 18, 2010 3:57 pm |
|
|
My apology in advance for not thoroughly describing my problem from the start, but I appreciate your help greatly! My example was a poor one unfortunately.
The reason why I need a function is because I have more going on in my SetBit function than just setting the bit. I need to evaluate the location of the bit, and perform other activites within the function depending on what location it falls in.
The reality is that I need to not only have the value, set the value, but also know the address location. Would a function with #BIT variable passed by reference be what I am after? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Feb 18, 2010 4:42 pm |
|
|
The CCS manual says this:
Quote: |
Basic and Special types --
Pointers to bits are not permitted.
|
|
|
|
Ttelmah Guest
|
|
Posted: Fri Feb 19, 2010 5:02 am |
|
|
The 'obvious' solution, is to apply the same cheat, that used to be used for accessing the CCS bit numbers, before variable accesses were allowed. Declaring your own 'pointer', with the address of the byte concerned, *8, plus the bit number required, and accessing this through normal bit operations.
So, something like:
Code: |
void setbit(int16 locn) {
int8 *b;
int8 mask=0;
bit_set(mask,locn&7);
b=(int8 *)(locn/8);
*b=*b|mask; //set the bit
}
main() {
int8 val;
int16 valptr;
//Your initialisation
valptr=((&val)*8)+7; //for bit 7
val=0;
setbit(valptr);
//Here bit 7 of 'val' has been set
valptr--;
setbit(valptr);
//Now bit 6 has been set as well
while(TRUE);
}
|
Obviously, the routine, can read the bit, as easily as it writes it.
For up to 8K of RAM, this can access any location in memory.
Best Wishes |
|
|
tstein
Joined: 02 Aug 2005 Posts: 8
|
|
Posted: Fri Feb 19, 2010 7:30 am |
|
|
Thanks for the suggestions and help. Consider this problem resolved! |
|
|
|