|
|
View previous topic :: View next topic |
Author |
Message |
Alejandro
Joined: 25 Mar 2011 Posts: 7
|
Problem with printf and Float |
Posted: Fri Mar 25, 2011 7:22 pm |
|
|
Hi, I'm having trouble with this code, when I simulated using the Proteus, everything works OK and I can see in the hyperterminal of Proteus, which prints the correct values, but when I progam the PIC with the code, I can only receive all-zero in the HyperTerminal of the PC, , anyone can tell me what my error?
Code: | #include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOSTVREN
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, ERRORS)// RS232 Estándar
#use standard_io(b)
#use standard_io(d)
#include <stdlib.h>
#include <input.c>
int32 pulsos_LH ;
float Mostrar;
int32 Indice;
#INT_TIMER0
void Tiempo_Demo() {
set_timer0(22464);
Indice++;
}
void main(){
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_timer0(22464);
pulsos_LH = 56;
while (TRUE){
Mostrar = (pulsos_LH*3600*0.036)/((Indice)*2.25);
printf("Consumo = %8.4f L/H\r\n",Mostrar);
}
} |
|
|
|
Jerson
Joined: 31 Jul 2009 Posts: 125 Location: Bombay, India
|
|
Posted: Fri Mar 25, 2011 7:30 pm |
|
|
You can do this
Mostrar = ((float)pulsos_LH*3600*0.036)/((float)Indice*2.25);
OR
change the definitions for pulsos and Indice to float type. In your case, this may not be ideal considering what they mean.
If it starts to work, you can figure it out. _________________ Regards
Jerson Fernandes |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19481
|
|
Posted: Sat Mar 26, 2011 3:21 am |
|
|
Shouldn't actually need the cast. Since two of the constants are float values, and one is present on both sides of the equation, casting should be automatic.
However some little comments.
There potentially is a problem in using an int32 value, that is incremented in an interrupt, in a sum outside the interrupt. Problem is that the interrupt may occur half way 'through' the sum, and then the result would be invalid...
Though the compiler should automatically do it, 'pre-solve' things like 3600*0.036, to make sure that extra work is not involved. In fact pre-solve all the constant terms. So:
Code: |
void main(void){
int32 local_value;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_timer0(22464);
pulsos_LH = 56;
while (TRUE){
disable_interrupts(GLOBAL);
local_value=Indice;
enable_interrupts(GLOBAL); //Make a local copy of the value with
//Interrupt momentarily 'off'.
Mostrar = (pulsos_LH*57.6)/(float)Local_value;
//3600*0.036/2.25 = 57.6
printf("Consumo = %8.4f L/H\r\n",Mostrar);
}
}
|
The compiler should automatically cast pulsos_LH to a float, since it is being multiplied by a float value, and then the float result will be used for a float division. However casting the local value, makes sure.
As written, it is going to print about 200times, before the number will change. Perhaps consider waiting till Indice does change, before actually printing?.
Best Wishes |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9218 Location: Greensville,Ontario
|
|
Posted: Sat Mar 26, 2011 5:54 am |
|
|
Does the real hardware include a MAX232 chip between the PIC and the PC , with the correct wiring?
I ask since you say it works fine in Proteus( correct numbers).
Maybe have a simple print ' hello world 1 2 3 4 ' to verify the hardware is correct ? |
|
|
|
|
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
|