View previous topic :: View next topic |
Author |
Message |
ressas
Joined: 15 Nov 2019 Posts: 135
|
Assign pin names to an array |
Posted: Fri May 29, 2020 2:06 pm |
|
|
Selamün Aleyküm (Hello)
There's a question I'm dealing with.
I name the pins as seen in the code.
AND I am throwing these names into a series.
However, I did not get any results.
If I solve this problem, I get rid of writing a 1000 line code. (Really 1000 lines. I tried)
How can I do it ?
Thank you
Code: |
#DEFINE p1 pin_d7
#DEFINE p2 pin_d6
#DEFINE p3 pin_d5
#DEFINE p4 pin_d4
#DEFINE p5 pin_c1
#DEFINE p6 pin_c0
#DEFINE p7 pin_a6
#DEFINE p8 pin_a7
int1 array_p[8]={p1,p2,p3,p4,p5,p6,p7,p8};
for(int i=0;i<9;i++)
{
output_high(array_p[i]);
delay_ms(100);
}
|
|
|
|
gaugeguy
Joined: 05 Apr 2011 Posts: 303
|
|
Posted: Fri May 29, 2020 2:25 pm |
|
|
Your loop is trying to access 0-8 but your array only has 0-7, so that is a problem.
Here would be my solution to what you post, untested so it could have an error:
Code: |
#DEFINE p1 pin_d7
#DEFINE p2 pin_d6
#DEFINE p3 pin_d5
#DEFINE p4 pin_d4
#DEFINE p5 pin_c1
#DEFINE p6 pin_c0
#DEFINE p7 pin_a6
#DEFINE p8 pin_a7
void PinHigh(int8 offset)
{
if(offset < 8)
{
switch(offset)
{
case 0:
output_high(p1);
break;
case 1:
output_high(p2);
break;
case 2:
output_high(p3);
break;
case 3:
output_high(p4);
break;
case 4:
output_high(p5);
break;
case 5:
output_high(p6);
break;
case 6:
output_high(p7);
break;
case 7:
output_high(p8);
break;
}
}
}
main()
{
while(TRUE)
{
for(int8 i=0;i<8;i++)
{
PinHigh(i);
delay_ms(100);
}
}
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri May 29, 2020 2:47 pm |
|
|
What's your PIC ? It makes a difference here. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Sat May 30, 2020 12:15 am |
|
|
As PCM_Programmer says chip type matters. Pin names are always bigger
than an int1. If you look at the prototypes in the device header you will
see the size needed. So for example:
_bif void output_low(int16 pin);
So the pin name here needs an int16. Most chips do (all?). A few of the
smaller PIC10/12/16's can get away with an int8, but only a very few....
So:
Code: |
#DEFINE p1 pin_d7
#DEFINE p2 pin_d6
#DEFINE p3 pin_d5
#DEFINE p4 pin_d4
#DEFINE p5 pin_c1
#DEFINE p6 pin_c0
#DEFINE p7 pin_a6
#DEFINE p8 pin_a7
const int16 array_p[8]={p1,p2,p3,p4,p5,p6,p7,p8};
//Note int16. Also unless you are changing them at run time
//why not use const?
for(int i=0;i<8;i++) //0...7 not 0...8
{
output_high(array_p[i]);
delay_ms(100);
}
|
|
|
|
ressas
Joined: 15 Nov 2019 Posts: 135
|
|
Posted: Sat May 30, 2020 1:23 pm |
|
|
Thank you gaugeguy, PCM programmer, Ttelmah.
Firstly, the proposal of 'gaugeguy' is correct. It must be for (i = 0; i <8; i ++). i wrote <9 by mistake.
However, I will develop this application in 32 pins. Therefore, the switch / case will extend the process. I have to do it with an array.
Secondly I use pic18F46k22.
Finally, using int16 instead of int1 solved the problem. Thank you.
Problem solved before 24 hours Elhandülillah.
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Sun May 31, 2020 2:03 am |
|
|
Good.
If you think about it the variable has to hold the 'address' of the pin
(the actual number is 8* the physical register address, plus a 3bit 'bit
number'), not the 'bit' being returned from that pin. It then makes sense
that it has to be a lot bigger than an int1... |
|
|
ressas
Joined: 15 Nov 2019 Posts: 135
|
|
Posted: Sun May 31, 2020 4:12 am |
|
|
Yes. You are right. As I learn about them, the desire to do more projects is awakening. |
|
|
|