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

How to transfer 8bit integer to a single pin bit by bit...

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



Joined: 18 Dec 2014
Posts: 12

View user's profile Send private message

How to transfer 8bit integer to a single pin bit by bit...
PostPosted: Wed Apr 08, 2015 4:28 am     Reply with quote

Well, i have a question that i can't figure out... I have an 8bit integer for example:
int8 a = 10;
i want that integer to transfer to a PIN_B7 using output function bit by bit
So if my integer a is 1010'b i want to use cycle to output 0,1,0,1 to PIN_B7 for example.
I just can't figure how to do it, any suggestions?
rikotech8



Joined: 10 Dec 2011
Posts: 376
Location: Sofiq,Bulgariq

View user's profile Send private message

PostPosted: Wed Apr 08, 2015 4:45 am     Reply with quote

Code:
void serial_data_on_pin(int8 a)
{
   int i;
   for(i = 0; i < 8; i++)
   {
      output_bit(PIN_B7, (a & 1));
      a >>= 1;
   }
}

_________________
A person who never made a mistake never tried anything new.
temtronic



Joined: 01 Jul 2010
Posts: 9205
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Apr 08, 2015 5:12 am     Reply with quote

you want to 'convert byte to binary', so try googling that...
also you'll need a delay_ms(100) after you output the bit information onto the I/O pin other wise you'll never see it !


hth
jay
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Wed Apr 08, 2015 7:16 am     Reply with quote

Quote:

transfer to a PIN_B7


you may not realize it yet - but this implies a function of PIN_STATE versus TIME.......
and hence MORE than just the state of the pin you toggle changing.

the high/low condition of the pin must be RELATIVE to some time function - either
ABSOLUTE or relative to ANOTHER pin that is providing the CLOCK reference for the states you wish to output.

without a timebase - (absolute or relative- pick one) - the state changes
will convey nothing.
Ask yourself how a receiving device will handle a run of all zeros or all ones coming from your pin as you conceive of it?

Unless you create an NRZ type of code ( self clocking ) -your idea will never work.

here is a link to a page with a typical diagram

http://www.ni.com/tutorial/6221/en/
Ttelmah



Joined: 11 Mar 2010
Posts: 19457

View user's profile Send private message

PostPosted: Wed Apr 08, 2015 7:24 am     Reply with quote

And (of course), using relative timings from a 'time reference' when you first toggle the pin, is the basis of asynchronous serial comms (which is what #use RS232 generates for you automatically), while using timings from a second pin reference (a 'clock' pin), is what #use spi can also generate for you....
Mike Walne



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

View user's profile Send private message

PostPosted: Wed Apr 08, 2015 7:41 am     Reply with quote

What's wrong with RS232?

Mike
Somor



Joined: 18 Dec 2014
Posts: 12

View user's profile Send private message

PostPosted: Wed Apr 08, 2015 9:22 am     Reply with quote

The idea is if I'm using shift register, like 74hc4049 using D input of shift register for input 0 or 1 and clock input for the new bit... i want to collect whole byte before I enable the Strobe, so i can output the whole number..
Something like:
I have
Code:
int8 a = 10 // (which is 1010'b)


  for(i = 0; i < 8; i++)
   {
      output_bit(PIN_B7, (a & 1));
      a >>= 1;
   output_high(PIN_B0, 1)  //clock bit of shift register
   delay_us(30);
   output_LOW(PIN_B0,0)
   }
   output(PIN_B1,1);   // strobe of shift register enabled
   delay_ms(10);     
   output(PIN_B1,0); // strobe disabled
 

Thank you rikotech8!
Ttelmah



Joined: 11 Mar 2010
Posts: 19457

View user's profile Send private message

PostPosted: Wed Apr 08, 2015 10:52 am     Reply with quote

OK.

For a shift register, you are sending the data bit, and a shift clock.

The compiler can do this totally for use, with #use SPI!...

SPI, is effectively a shift register interface. Normally more complex than you need, supporting shifting the data both in and out at the same time, and with the ability to use hardware to do it really fast, but the CCS library happily supports doing this in one direction only, using any pins. Smile

Code:

#use spi(DO=PIN_B7, CLK=PIN_B0, BAUD=1MHz, LOAD=PIN_B1, STREAM=HC4049)

//Then send the byte with

    int8 a=10;

    spi_xfer(HC4049,a,8); //clock out 8 bits


This will strobe B1 after the byte is sent. (This is what the 'load' pin does).

This will send the data MSB first, if you want LSB first, then specify this in the #use SPI (look at the manual).
Somor



Joined: 18 Dec 2014
Posts: 12

View user's profile Send private message

PostPosted: Wed Apr 08, 2015 1:41 pm     Reply with quote

Thank you very much!
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