|
|
View previous topic :: View next topic |
Author |
Message |
Homer Guest
|
LEDS |
Posted: Thu Apr 28, 2005 7:27 am |
|
|
Hello,
i wanted to know how i could do if i wanted to select the pin i want to switch on.
I know that i could do it simply but it is just a test to do something more so
How to have a pin as a variable ?
Code: |
void test(byte const x)
{
output_high(x);
}
void main(void)
{
while(1)
{
test(LED_1);
test(LED_2);
}
}
|
Thanks for your help |
|
|
JohnKennedy
Joined: 12 May 2004 Posts: 38
|
|
Posted: Thu Apr 28, 2005 8:27 am |
|
|
I use the define statement as below - works well
Code: | #define ledred (Pin_B4) |
Hope this helps
JFK |
|
|
JohnKennedy
Joined: 12 May 2004 Posts: 38
|
|
Posted: Thu Apr 28, 2005 8:28 am |
|
|
I use the define statement as below - works well
Code: | #define ledred (Pin_B4) |
You can the use the output_high or output_low statements to turn on or off
Hope this helps
JFK |
|
|
Homer Guest
|
|
Posted: Thu Apr 28, 2005 8:40 am |
|
|
i think you didn't understand my question ...
How do i have to set a function to have a pin as a variable ?
function(pin_1);
function(pin_2); |
|
|
Ttelmah Guest
|
|
Posted: Thu Apr 28, 2005 8:48 am |
|
|
The answer in part depends on whether the pins are on the same port. The 'easiest' way if they are, is simply to develop a bit mask. The problem is that the pin values, and the internal input and output functions, translate directly to individual bit set/reset functions, which use a different instruction for each bit, which means these can't use a variable to control the access. Using a variable requires a different approach.
Something like:
Code: |
void bit_set_A(int8 bit_num) {
int8 mask;
mask=1<<bit_num;
output_B(input_B() | mask);
}
|
Best Wishes |
|
|
Homer Guest
|
|
Posted: Thu Apr 28, 2005 8:56 am |
|
|
I am not sure to understand ...
I just want to use different functions that i have that i should use for other components in the programm.
The PIC has different components on its pins and the use for example 1 wire interface, so functions used are exactly the same, excepts for the pins that are considered .
How to ue one function for 2 differents pins ? |
|
|
Ttelmah Guest
|
|
Posted: Thu Apr 28, 2005 9:25 am |
|
|
These functions, are just like the input and output ones, internal to the compiler. Hence the compiler can just substitute the operations needed at compile time. You can to some extent get the same effect, by using the macro ability, and tests. The 'key' with this, is that only the code for the required pin, is actually implemented when the code is compiled. Arithmetically, the low three bits of the pin number correspond to the bit to be used inside an address, and the rest of the number (/8), is the memory address to be used. So you have to decompose the pin number into these two values, and then define a byte based on the code for the instruction, combined with these values, to give the final code.
Generally, it is easier to just test for the byte required, and use a mask as shown.
Best Wishes |
|
|
Homer Guest
|
|
Posted: Thu Apr 28, 2005 9:58 am |
|
|
Something else to add, please ?
Because it doesn't really help me.
Any suggestion ?
Thanks you all anyway ! |
|
|
Ttelmah Guest
|
|
Posted: Thu Apr 28, 2005 10:16 am |
|
|
If you said what you actually needed to do, somebody could probably help more. If you just need to make a decision as to which pin to use, then if you define 'LED_1' and 'LED_2', as numbers (<255) then in the test routine, something like:
Code: |
void test(int8 LEDnum) {
switch (LEDnum) {
case LED_1 :
//Do what you want for LED_1 here
break;
case LED_2 :
//Do what you want for LED_2 here
break;
}
}
|
These are all dead basic 'C' techniques...
Best Wishes |
|
|
Homer Guest
|
|
Posted: Fri Apr 29, 2005 1:52 am |
|
|
Thank you very much but nearly what i needed !
Ifi want for example to do in the "Do what you want for LED_1 or LED_2 here" the same function but for each different LED ?
Like this :
Code: |
void test(int8 LEDnum) {
switch (LEDnum) {
case LED_1 :
function(LED_1);//Do what you want for LED_1 here
break;
case LED_2 :
function(LED_2);//Do what you want for LED_2 here
break;
}
}
|
It should be a way for me to write function() only once !
Thank you ! |
|
|
Ttelmah Guest
|
|
Posted: Fri Apr 29, 2005 2:19 am |
|
|
Yes.
You just use exactly the same switch inside the function.
Understand, that you cannot use the same _code_ for the two pins, unless you use a mask and read the whole port, then select the required bit (as I have already described). The switch allows you to select which I/O bits to use.
As an example of doing it 'generically', if (for instance), both pins are on portA, as bits 1, and 2:
Code: |
#define LED_1 (2) //bit mask for bit 1
#define LED_2 (4) //bit mask for bit 2
int8 dosomething(int8 LEDreqd) {
int8 temp;
temp=input_A();
temp=temp | LEDreqd; //This will turn on the selected LED
output_A(temp);
//Now check the LED is 'on' - allow a moment for the pin to
//settle.
delay_us(4);
//Return the state of the pin
return (input_A() & LEDregd);
}
|
So you have the two choices, of using the pin number to select which code to use inside the function, or of selecting the pin with a mask.
Best Wishes |
|
|
RobM
Joined: 29 Apr 2005 Posts: 13 Location: Santa Cruz, CA
|
|
Posted: Sun May 01, 2005 6:26 pm |
|
|
Homer wrote: | i think you didn't understand my question ...
How do i have to set a function to have a pin as a variable ?
function(pin_1);
function(pin_2); |
I read your discussion, it is interesting. I have a bunch of assembler experience, and zero c experience. I assembler, I would use a table for this problem.
This is a bar graph,
enter with the Bar Graph State Number in the W reg
Code: | bcf STATUS, RP0
movwf LedIndex
movlw LEDMASK
iorwf PORTA ; LED off
movlw high ($+4)
movwf PCLATH
bcf STATUS, C ; multiply by 2
rlf LedIndex, w ; and put in w
addwf PCL
incf countFlash ; state 0
goto thrash_flash
bcf LED_RED ; state 1
goto endLED
incf countFlash ; state 2
goto flash
bcf LED_YEL ; state 3
goto endLED
bcf LED_GR ; state 4
goto endLED
|
In C, I guess this is a case statement. Why can't we make the Pin numbers enumerated types and then just use a case statement to steer the output?
These types of problems are why we design TOP DOWN and attempt to encapsulate the interface between objects. If a driver (for example) is written in that manner, then when it needs to be modified to work in run time with multiple set of hardware, only part of the code must be re-written. It is a sad fact that sometimes we have to duplicate blocks of code. Everything can't be done with switches if the code is to be readable
Regards
Rob _________________ Rob
_______ |
|
|
|
|
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
|