View previous topic :: View next topic |
Author |
Message |
matheusmestres28
Joined: 30 Apr 2013 Posts: 20
|
Float to String conversion |
Posted: Tue Apr 30, 2013 1:35 pm |
|
|
Code: |
#include <12F675.h>
#include <string.h>
#device adc=10
#FUSES NOWDT
#FUSES XT
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_A2)
float vx,ax;
char str1[10];
void main() {
set_tris_a(0b00100000);
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
while(TRUE){
set_adc_channel(0);
delay_us(10);
vx = read_adc();
vx = vx*0.0048875855327468;
ax = (vx-1.65)*12.25;
str1 = ax.c_str();
puts("The acceleration, in the x-axis, is: \n\r");
puts(str1);
}
}
|
I'm trying to convert the variable ax into a string (str1) to use as a parameter of puts function.
I'm not using printf because it demands more ROM memory.
I'm not used to deal with CCS and I'm a terrible programmer, but in Borland C++ Builder I used the .c_str() function (or FloatToStr()). I tried to use it in this code, but the compiler says there is an error.
Someone can help me??
I'm sorry if I made any mistakes while posting the code, it's my first post here. |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Apr 30, 2013 1:55 pm |
|
|
Quote: | I'm not using printf because it demands more ROM memory. |
Your current program uses 70% of the PIC's ROM space. This leaves
only about 300 ROM words for a float to ASCII routine. My advice is
to use a larger PIC, or re-arrange your math so it doesn't use floating point. |
|
![](templates/subSilver/images/spacer.gif) |
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Apr 30, 2013 2:12 pm |
|
|
listen to PCM and redo your code, perhaps to scale your data *100
2 hints for instance:
if scaled *100
* 12.25 is no different than
( *1225 ) /10000; or (*2007)/163384
16384 requires no division - just a shift
-------------
0.0048875855327468;
is appx 1 part in 205
and is the same ratio to .08% error
as (*80)/16384
scaling this to the an error contribution you can stand
with the same approach as example #1 could save a lot of code space
and cycles
----------------
long integer mult math math, with SHIFTS for division will shrink code space and improve speed at the same time. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19359
|
|
Posted: Tue Apr 30, 2013 2:32 pm |
|
|
If you did have enough memory space, the routine to do the conversion is printf, or sprintf (latter to a string, former directly to the output).
However you do need to think again.
Also be aware that CCS has a built in ability in printf/sprintf, to output an integer as if it is a scaled float, with %w.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
matheusmestres28
Joined: 30 Apr 2013 Posts: 20
|
|
Posted: Tue Apr 30, 2013 2:32 pm |
|
|
yeah, I agree, I thought there were some way to do this, and my teacher told me to try it, but that's not the whole code. I have to set 2 other pins for the adc and do the same thing with them. I think I'll use pic18f1320. |
|
![](templates/subSilver/images/spacer.gif) |
|