|
|
View previous topic :: View next topic |
Author |
Message |
wangine
Joined: 07 Jul 2009 Posts: 98 Location: Curtea de Arges, Romania
|
change pins with const map without affect port state[SOLVED] |
Posted: Thu Oct 22, 2015 11:44 am |
|
|
First of all, i read here https://www.ccsinfo.com/forum/viewtopic.php?t=54447
http://www.ccsinfo.com/forum/viewtopic.php?t=18949
http://www.ccsinfo.com/forum/viewtopic.php?t=20182
and many other topic, but without success.
I want to change a multiple pins, 2-6 mapped as constant without affect port state. Very simply example:
Code: | BYTE const POSITIONS[4] = {0b01, //01
0b11, //11
0b10, //10
0b00};//00
void test_step(int8 steps)
{
static BYTE stepper_state = 0;
stepper_state = get_state();
output_a( POSITIONS[ stepper_state ]);
}
|
or
Code: | void test_step(int8 steps)
{
output_a( POSITIONS[ steps ]);
} |
Above code will change the rest of port pins.
Other solution is
Code: | void test_step()
{
static BYTE stepper_state = 0;
switch (stepper_state){
case 0: output_low(pin_a0);
output_high(pin_a1);
break;
case 1: output_high(pin_a0);
output_high(pin_a1);
break;
case 2: output_high(pin_a0);
output_low(pin_a1);
break;
case 3: output_low(pin_a0);
output_low(pin_a1);
break;
}
stepper_state=(stepper_state+1)&(sizeof(POSITIONS)-1);
} |
This code work without change other pins, but i don't want to use, i can't post entire code because is based on PICC example code EX_STEP.C.
But the idea is if i can set a const function just for pin are used avoid output_x() function.
Last edited by wangine on Thu Oct 22, 2015 6:35 pm; edited 1 time in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Thu Oct 22, 2015 1:01 pm |
|
|
You do realise, that if you set #use fast_io on your ports, the compiler will _not_ change the port state. It then just becomes a matter of you setting the tris, whenever a state needs to change. output_low(pin_a1), will then code as a single byte instruction.... |
|
|
wangine
Joined: 07 Jul 2009 Posts: 98 Location: Curtea de Arges, Romania
|
|
Posted: Thu Oct 22, 2015 2:30 pm |
|
|
yes but the fast_io don't matter if i set individual pin as single byte instruction, the rest of pins will don't change anyway. What i want is to make a constant byte as 01 or 0110 or 010101 like a constant map to access like a function. I made that along time ago but i just don't remember, also i can't find in all my projects. Something like that:
Code: |
#define test (PORTA.ra0,1 & PORTA.ra1,1) // same as porta = 3
byte const [1] = {test};
|
and because test is not a constant and it cant use or compile. Is difficult to explain, my english is poor, but i think you understand. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19546
|
|
Posted: Thu Oct 22, 2015 3:01 pm |
|
|
The rest of the pins _will_ change.
There are two instructions, to talk to the ports. A _byte_ wide one, that updates all eight pins, and a _bit_ one, that updates just one.
If you use the byte instruction, you set all eight pins.
What you can do, is read the port, 'or' this with the bits you want to set, and write the byte back. All eight will though be written. |
|
|
wangine
Joined: 07 Jul 2009 Posts: 98 Location: Curtea de Arges, Romania
|
|
Posted: Thu Oct 22, 2015 3:17 pm |
|
|
yes i know, it is a solution to read port and use a mask and resend data, is more instructions like than simply set each byte separately. I think i will use a 74HC595 to make that more simply. Thanks for your time. |
|
|
wangine
Joined: 07 Jul 2009 Posts: 98 Location: Curtea de Arges, Romania
|
|
Posted: Thu Oct 22, 2015 6:33 pm |
|
|
i found in my old projects the solution, but now looks like empiric but working without affect port state. Function its simple with 2 variable, numbers of pins to be writen and data (variable , constant , define dont matter)
Code: |
#define pin_1 pin_a0
#define pin_2 pin_a1
#define pin_3 pin_a2
#define pin_4 pin_a3
BYTE const xPOSITIONS[4] = {0b01, //01
0b11, //11
0b10, //10
0b00};//00
void write_port(int8 pins_to_write, int8 data)
{
unsigned int8 i = 0;
for(i = 0; i < pins_to_write; i++)
{
switch (i){
case 0:
if(data & pins_to_write)
output_high(pin_1);
else
output_low(pin_1);
break;
case 1:
if(data & pins_to_write)
output_high(pin_2);
else
output_low(pin_2);
break;
case 2:
if(data & pins_to_write)
output_high(pin_3);
else
output_low(pin_3);
break;
case 3:
if(data & pins_to_write)
output_high(pin_4);
else
output_low(pin_4);
break;
}
data <<= 1; //next to MSB
}
}
|
and acces like that
Code: | write_port(2, xPOSITIONS[ stepper_state ]);
|
Function work for maxim 4 pins , can made more but without exced 7 , otherwise no point ,output_x(), is enouth for entire port.
If someone have beter ideea, opinions, are always wellcome, i will move in code library , so many simply and insignifiant functions are lost here and for some reasons when search entire forum its imposible to find or takes to long |
|
|
|
|
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
|