View previous topic :: View next topic |
Author |
Message |
prisim
Joined: 07 Nov 2013 Posts: 6
|
get_timer0 output in float |
Posted: Tue Aug 22, 2017 12:30 am |
|
|
Hello,
Can I get float value of get_timer0 function ?
Is there any way to edit this function?
Code: |
void main() {
lcd_init();
delay_ms(5); //
lcd_putc("\f");
lcd_cursor_on(0);
set_timer0(0);
setup_timer_0(T0_EXT_L_TO_H|T0_DIV_256);
while(1) {
set_timer0(0);
delay_ms(1000);
f=get_timer0();
//f= f * 256 ;
lcd_putc("\f");
printf(lcd_putc,"%f",f);
}
}
|
Code: |
Out put is
1000 /256 = 3.00
but i want
1000 / 256 = 3.90625
|
Is there any way to get correct float output ! |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Tue Aug 22, 2017 12:45 am |
|
|
PIC defaults to integer operations if both var are integer irrespective of the type it is assigned to.
So you have to force one of the variables to float to get the compiler to do float operations.
Eg.
Code: | f = (float)get_timer0() / 257;
|
or
Code: | f = get_timer0() / 257.0;
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Tue Aug 22, 2017 2:39 am |
|
|
The timer value _is_ an integer. So printing it as a float, won't change anything.....
Now as prisim says you can do some maths to generate a float result, by either casting the value (this is the technical name for the (float) declaration he shows), or by using a float value for the other variable in the maths.
However 'caveat'. This involves a huge amount of time. Floats are something in general that should be treated as if they carried a horrible infection, when dealing with a micro-controller like the PIC. You can generate a sensible output, much faster _and more accurately_ by using integers.
So:
Code: |
void main(void)
{
int32 f;
lcd_init();
delay_ms(5); //
lcd_putc("\f");
lcd_cursor_on(0);
set_timer0(0);
setup_timer_0(T0_EXT_L_TO_H|T0_DIV_256);
while(1) {
set_timer0(0);
delay_ms(1000);
f=get_timer0()*100000;
lcd_putc("\f");
printf(lcd_putc,"%7.5W",f/256);
}
}
|
This generates an integer count of 'hundredthousandths', that is then displayed with a decimal point as if it was a float value. |
|
|
prisim
Joined: 07 Nov 2013 Posts: 6
|
|
Posted: Tue Aug 22, 2017 6:12 am |
|
|
Hello dear,
Thanks for the suggestion, but having the same issue !
Getting the output as
1000/256 = 3.00 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Tue Aug 22, 2017 7:24 am |
|
|
Are you sure you have got 'f' declared as an int32 as I show?. And the %7.5W?. You can't get 3.00 with the 7.5 it should be giving you 5 decimals. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 22, 2017 9:58 am |
|
|
Quote: | thanks for the suggestion , but having the same issue !
Getting the output as
1000/256 = 3.00 |
Alan told you exactly what to do. Just re-read his post and do it ! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Tue Aug 22, 2017 10:47 am |
|
|
He has also not shown the actual code he is using. He talks about a division, but no sign of it in the code.
Makes it very hard to second guess what he is doing....
What I posted will run, and does display 3.90625 for a signal giving 1000 pulses in the 1 second sampling time. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 22, 2017 11:13 am |
|
|
I know yours will run, but I thought if he just writes 300.0 instead of 300
then he will get what he wants. I was thinking of the easiest way. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Tue Aug 22, 2017 12:45 pm |
|
|
Yes. The point I was making, is he doesn't show the actual maths he is using, or the data declaration for the variable. Now the compiler should complain if 'f' is not a float with the printf specifier he is giving, but if 'f' is float the cast should not be necessary. As it stands the number is an integer, and will only print the integer, since there are no decimals. Need to see what he is actually doing. |
|
|
prisim
Joined: 07 Nov 2013 Posts: 6
|
|
Posted: Wed Aug 23, 2017 8:14 am |
|
|
Ttelmah wrote: | He has also not shown the actual code he is using. He talks about a division, but no sign of it in the code.
Makes it very hard to second guess what he is doing....
What I posted will run, and does display 3.90625 for a signal giving 1000 pulses in the 1 second sampling time. |
Hello dear its my full main code, i just want to make a frequency counter, this code is fetched from web.
I just pasted the code as it is, but the result is invalid, if you don't mind can you share your whole c file, that you used and getting the results correctly ? |
|
|
|