|
|
View previous topic :: View next topic |
Author |
Message |
codewiz
Joined: 03 Feb 2009 Posts: 8
|
Learning CCS C coding Help! |
Posted: Wed Oct 07, 2009 7:04 am |
|
|
I'm always delighted anytime I come to this forum. I always want to use CCS C to code for my projects but some doubt and inability to use certain features makes me tilt to using my other compilers. For example, I don't know how to use CCS C to program 16X2 LCD without having the R/W pin connected to the PIC port, But is easily done with mikroC, Basic etc.
However, I still prefer CCS C. Therefore, I want to learn and understand all that will keep me on this highly supported compiler.
First Question:
How can I code for 16 X 2 or 20 X 2 LCD without connecting the R/W pin to PIC port.
Thanks. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Wed Oct 07, 2009 8:20 am |
|
|
Look at the code library at the flex_lcd driver.
You will include this file.
Make adjustments to port as required.
Then notice the note about what to do if not using R/W pin.
Compile and load. Done. |
|
|
codewiz
Joined: 03 Feb 2009 Posts: 8
|
Code explanation |
Posted: Thu Oct 08, 2009 2:09 am |
|
|
Code: |
setup_adc_ports(ALL_ANALOG); // init the ADC;
setup_adc(ADC_CLOCK_DIV_32); // Tad=1.6us;
set_adc_channel(acc_chan);
delay_us(10);
for(i=0; i<32; i++) {
acc_v=read_adc();
acc_v_temp+=acc_v;
if(i==31) {
acc_v_avg=acc_v_temp>>5;
if(acc_v_avg<=acc_min_l) low_acc=1;
if(acc_v_avg>=acc_max_h) high_acc=1;
acc_v_temp=0;
acc_v_avg=0;
|
|
|
|
codewiz
Joined: 03 Feb 2009 Posts: 8
|
|
Posted: Thu Oct 08, 2009 2:44 am |
|
|
Code: |
#define acc_chan 1
int acc_v , acc_v_avg ;
long int acc_v_temp ;
acc_min_l = 60 ;
acc_max_h = 98;
|
I really want to understand what this does "acc_v_temp+=acc_v; " because it is adding an 8-bit register ( acc_v) to 16-bit register (acc_v_temp) and storing the value in the 16bit register. Since the 16bit register was zero before the addition, does it mean that the result is a 16 bit value equivalent to the 8-bit value?
Then " acc_v_avg=acc_v_temp>>5; " Please, can somebody help me break this down. This is what I understand : acc_v_temp is divided by 32 (>>5) and the result stored in an 8bit register?
why is ">>" often used with ADC? Please clarify me.
thank you treitmey for the LCD reply. |
|
|
Ttelmah Guest
|
|
Posted: Thu Oct 08, 2009 7:50 am |
|
|
This line is standard C.
When performing arithmetic, C always 'promotes' lower types to higher types, if two numeric types are involved. So, if you add a 16bit value, and a 8bit value, the 8bit type will be promoted to a 16bit value, and the arithmetic will be performed using 16bit maths. So if you had an 8bit value (say255), and you performed this sum, the first time, the 16bit value will become 255, then the second time, it'll become 510, etc..
In the case you give, yes, it'll become the 16bit version of the 8bit value _the first time through_, but obviously, if the code was repeated, you would get the 16bit 'sum'.
Shifts are quicker than divisions. Generally a division when using the ADC, is being used as a way of giving some averaging, so speed may matter. CCS, is 'smart' in this regard, and if you code "val/=32", it'll realise that division by 32, can be performed using >>5, and will do the later anyway.
You only give 'parts' of the code, but it sounds like a standard averaging algorithm.
Best Wishes |
|
|
codewiz
Joined: 03 Feb 2009 Posts: 8
|
|
Posted: Thu Oct 08, 2009 12:35 pm |
|
|
Thanks Ttelmah.
You have cleared my doubt.
It means >> 1 is the same as divide by 2 and << 1 means multiply by 2.
Thanks for bringing up the average issue. You are right. |
|
|
|
|
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
|