|
|
View previous topic :: View next topic |
Author |
Message |
z3ngew
Joined: 20 Apr 2013 Posts: 50
|
output_high(PIN1, PIN2); |
Posted: Sun Jun 02, 2013 3:28 am |
|
|
Hello everyone,
How can i output high 2 pins at the same time without using the weight method, this method should call its name not its weight for example (PIN_C0 - PIN_C1), etc
the function should be like this
Code: | output_high(int16 PIN1, int16 PIN2)
{
//need help
} |
Thanks in advance,
z3ngew |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Sun Jun 02, 2013 4:23 am |
|
|
Please explain EXACTLY what you mean.
1) Do you want to create a function which does the work for you?
2) Will both pins be on the same port?
3) Can the pins go high one after the other?
4) Do you want the actual action to be both pins go high in one machine cycle?
5) ............Anything else
Mike |
|
|
z3ngew
Joined: 20 Apr 2013 Posts: 50
|
|
Posted: Sun Jun 02, 2013 4:28 am |
|
|
1-both pins will be in the same port
2- i want the actual action to be both go high in one machine cycle
3- the parameter of the function should be(int16 PIN1, int16 PIN2)
Thanks,
z3ngew |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Sun Jun 02, 2013 5:24 am |
|
|
quick reply not tested...
One method is to create your own function and use the
CCS function ...output_x( )
inside it.
You'll have to read the port first,then mask that data with your 'pins to set high',then write to the port the new data.
//pseudo code..NOT tested...
my_new_function(int8 pin1,int8 pin2)
old_data=input_b();
my_pin_data= ??code to parse pin1,pin2 into correct format
new_data=old_data | my_pin_data;
output_b(new_data);
//
You'll have to fill in 'my_pin_data' as required.
Depending on the devices attached to the pins, even a simple bit_set() function may work for you, but will take a couple more machine cycles to turn on the pins BUT overall would be much faster.
hth
jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19520
|
|
Posted: Sun Jun 02, 2013 7:38 am |
|
|
Unfortunately, to do this using pin names, is going to take longer than using the two separate outputs.
Key is first that the pin number, is the memory address of the physical port, *8, plus the bit number for the pin.
So:
Code: |
output_high_two(int16 PIN1, int16 PIN2)
{
int8 * port_address;
int8 mask=0;
port_address=PIN1/8;
bit_set(mask,(PIN1 & 7));
bit_set(mask,(PIN2 & 7));
*port_address=*port_address | mask;
}
|
However this is terribly inefficient. Multiple problems/reasons. If you use the 'output_high' function, with a single fixed pin number, the compiler does the solution to what port it is, and the bit number involved _at compile time_. The chip has a 'bit_set' function that can set a single bit in one instruction. This is then used by the compiler, allowing two successive output_high instructions, to take just two machine cycles.
Using the two pin numbers involves first having to work out the address (three 16bit rotations to give /8). Then set the two bits required (build a mask, rotate it - another dozen instructions typically). Do this twice, then read the port, apply the mask, and write the result back. So though the final output is done in just one instruction, it takes an age....
Alternative (much better), is to just #define masks for the bits.
So:
Code: |
#define BIT0 1
#define BIT1 2
#define BIT2 4
#define BIT3 8
#define BIT4 16
#define BIT5 32
#define BIT6 64
#define BIT7 128
//demo on port B
#define set_bitsonportB_high(x) output_b(input_b() | x)
#define set_bitsonportB_low(x) output_b(input_b() & (~(x)))
//Then to use:
set_bitsonportB_high(BIT2 | BIT5);
|
This will set bit 2 and bit 5 on port B high at the same time.
Obviously change the port involved to suit.
Now key here is that again 90% is done 'in advance'. The symbolic bit 'names' already represent the masks needed. You can use as few or as many bits as you want (you could set four bits at once, just as easily as one). The compiler just has to read the port, do the masking operation and write the result back.
I've also included the complementary function, to turn multiple bits low.
Best Wishes |
|
|
z3ngew
Joined: 20 Apr 2013 Posts: 50
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|