CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

output_x(n) question

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
KamPutty
Guest







output_x(n) question
PostPosted: Wed Jan 04, 2006 10:16 pm     Reply with quote

Hi all,

In the output_high/low method, how do I pass a variable instead of a constant? I want to make lets say pin D0 ~ D7 high or low etc., and I do not want to hardcode the pin but would rather use a variable.

The pins will not all be high or low, but a mixed.

I'm multiplexing my 8 7-seg led, and would like to not have constants but a formula etc...

Any thoughts?...

~Kam (^8*
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Jan 04, 2006 10:23 pm     Reply with quote

http://www.ccsinfo.com/forum/viewtopic.php?t=25501&highlight=dopinio
nailuy



Joined: 21 Sep 2010
Posts: 159

View user's profile Send private message

PostPosted: Sun Mar 11, 2012 11:07 am     Reply with quote

Why is so hard to put an example.
I try to read/understand and nothing.
My code is:

Code:
int8 A=0;
set_adc_channel(0); 
delay_us(10);
A=read_adc();
OUTPUT_D=(A);


I want to put in channel D digital value read on ADC ch 0.
can someone put example code like:
OUTPUT_D=A; //of course this is not working.

regards
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Sun Mar 11, 2012 11:14 am     Reply with quote

The problem is that the compiler fundamentally does not allow this. It expects to know the pin number at compile time. You have to use some sort of trick to get what you want. The simplest is a select/case statement, but there are other ways people have devised to do this too.
_________________
The search for better is endless. Instead simply find very good and get the job done.
dyeatman



Joined: 06 Sep 2003
Posts: 1924
Location: Norman, OK

View user's profile Send private message

PostPosted: Sun Mar 11, 2012 11:33 am     Reply with quote

It would help for you to read the manual. If I understand what you
are trying to do, the following will simply take the value you get from
the ADC and output the value on the D port pins as individual bits (to
light 8 LEDs connected to Port D for example).

Code:
nt8 A=0;
set_adc_channel(0);
delay_us(10);
A=read_adc();
OUTPUT_D(A);


If you want to send the bits serially that's a bit different but can be
done pretty easily.
_________________
Google and Forum Search are some of your best tools!!!!
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

Output to PIN(x)
PostPosted: Sun Mar 11, 2012 12:29 pm     Reply with quote

Quote:

In the output_high/low method, how do I pass a variable instead of a constant? I want to make lets say pin D0 ~ D7 high or low etc., and I do not want to hardcode the pin but would rather use a variable.

The pins will not all be high or low, but a mixed.

I'm multiplexing my 8 7-seg led, and would like to not have constants but a formula etc...

To manipulate PIN(x) of PORT_Y:

(1) Create int8 variables which you use as a mask, and copy_of_y.
(2) Make the mask either ALL 1's and a 0 in bit x, or ALL 0's and a 1 in bit x.
(3) Read the current state of PORT_Y into copy_of_y.
(4) Either AND or OR copy_of_y with the mask into copy_of_y.
(5) Write copy_of_y to PORT_Y.

Choose options in (2) and (4) depending on whether your trying to set or clear the bit.
When you get really clever you can do all of the above as a single 'C' construct without the intermediate variables.

Mike
nailuy



Joined: 21 Sep 2010
Posts: 159

View user's profile Send private message

PostPosted: Sun Jul 01, 2012 2:06 am     Reply with quote

Look at this example:
Code:
int port_b_image;
.........................
if(bit_test(port_b_image,i))        // and set pin as needed
            bit_clear(port_b_image,i);
         else
            bit_set(port_b_image,i);
.........................
output_b(port_b_image);

why this is work?
Is a piece from "ex_patg.c"
I use the same instruction to work my code, but is not working.
Regrds
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Sun Jul 01, 2012 3:24 am     Reply with quote

Quote:
Look at this example:
Code:
int port_b_image;
.........................
if(bit_test(port_b_image,i)) // and set pin as needed
bit_clear(port_b_image,i);
else
bit_set(port_b_image,i);
.........................
output_b(port_b_image);

why this is work?
Is a piece from "ex_patg.c"
I use the same instruction to work my code, but is not working.
Regrds
You're confusing me.

What is/isn't working?
What is/isn't happening that should/shouldn't?
Which PIC / compiler version etc. are you using?

Mike
Ttelmah



Joined: 11 Mar 2010
Posts: 19368

View user's profile Send private message

PostPosted: Sun Jul 01, 2012 3:26 am     Reply with quote

Two parts:
1) Age of compiler.

Using a variable to access a port _pin_, is supported in the V4 compilers, but not in the V3 compilers. The original question you have attached this to, was posted before the V4 compilers.
The 'do_pin_io' function in the thread pointed to by PCM_programmer adds this ability for 16 PIC's, and the V3 compilers. It can be modified to suit 18 PIC's, by simply changing the addresses used.

To output an entire _byte_, the compilers have always supported this, and that is just a matter of getting the syntax right:
Code:

OUTPUT_D=(A); //No

output_d(a);
//Functions in C, expect to receive the variables they work on in brackets
//after the function name. Not using an equals sign (this is how you pass
//values to _variables_.

Best Wishes
nailuy



Joined: 21 Sep 2010
Posts: 159

View user's profile Send private message

PostPosted: Sun Jul 01, 2012 4:25 am     Reply with quote

Yes Ttelmah this was the problem...
OUTPUT_D(A); //is working
OUTPUT_D=(A); //is not good
dyeatman was first showed, but my eye's don't see the difference.
Thank you again guys.
Best regards.
Ttelmah



Joined: 11 Mar 2010
Posts: 19368

View user's profile Send private message

PostPosted: Sun Jul 01, 2012 9:23 am     Reply with quote

What I found funny/confusing, is you used the correct syntax, in the title for the thread!. Very Happy
Going mad occasionally is essential when working with computers.

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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