|
|
View previous topic :: View next topic |
Author |
Message |
MicroManiac
Joined: 21 Aug 2008 Posts: 34
|
Weird Float and USART Problem |
Posted: Tue Feb 17, 2009 8:42 am |
|
|
Hello, i am using PIC18F4620 and the compiler version of 4.085
and trying to execute the following code
Code: |
#include <18F4620.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV21 //Brownout reset at 2.1V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast=400000,sda=PIN_D1,scl=PIN_D0, FORCE_SW)
#include "C:\Documents and Settings\Bernard Kazour\My Documents\Course Finder\Java Website\C code\main.h"
#include <stdlib.h>
#include <input.c>
#include <math.h>
void ComputeFormCD();
void crsdist();
//int signlat1,signlat2,signlon1,signlon2,dc
float degLat1,degLat2,degLon1=0,degLon2=0;
float lat1,lat2,lon1,lon2;
float d,crs12,crs21;
float argacos;
float a,invf;
void main()
{
setup_oscillator(OSC_8MHZ|OSC_TIMER1|OSC_IDLE_MODE|OSC_31250|OSC_PLL_OFF);
delay_cycles(4);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
// while (1)
{
degLat1 = 31.3;
printf ("%f",degLat1);
printf ("\n\r");
degLon1=12.26;
printf ("%f",deglon1);
printf ("\n\r");
degLat2=21.4225;
degLon2=39.8261;
ComputeFormCD()
crsdist();
crs12 =crs12*(180/PI);
printf ("The course from 1 to 2 is: %f",crs12);
}
}
void ComputeFormCD()
{
lat1=degLat1*PI/180.0;
printf("Lat1: %f",lat1);
printf ("\n\r");
lat2=degLat2*(PI/180.0);
printf("Lat2: %f",lat2);
printf ("\n\r");
lon1=degLon1*(PI/180.0);
printf("Lon1: %f",lon1);
printf ("\n\r");
lon2=degLon2*(PI/180.0);
printf("Lon2: %f",lon2);
printf ("\n\r");
}
void crsdist() // radian args
/* compute course and distance (spherical) */
{
//! float a1;
//! float a2;
//! float b1;
//! float b2;
//! float b3;
//!
//! a1=sin(lat1);
//! a2=sin(lat2);
//! b1=cos(lat1);
//! b2=cos(lat2);
//! b3=cos(lon1-lon2);
d=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2));
printf("d: %f",d);
printf ("\n\r");
}
|
When I try to execute it like this, all the printing on the USART are
successful, but the "d" calculation is always returning 0.
But when I remove the comments of the following lines:
Code: |
//! float a1;
//! float a2;
//! float b1;
//! float b2;
//! float b3;
//!
//! a1=sin(lat1);
//! a2=sin(lat2);
//! b1=cos(lat1);
//! b2=cos(lat2);
//! b3=cos(lon1-lon2);
|
These lines are used to divide the calculation of the "d" variable" because I thought that this calculation is failing because it is done directly at once, all the printing are returning 0.
Does anyone have an idea why this is happening, and how can solve this problem?
Thanks _________________ "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."
Albert Einstein |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Feb 17, 2009 10:50 pm |
|
|
Quote: | but the "d" calculation is always returning 0. |
I get the following results in MPLAB simulator. Is your complaint
about the last line, shown in bold ?
Quote: |
31.30
12.26
Lat1: 0.54
Lat2: 0.37
Lon1: 0.21
Lon2: 0.69
d: 0.46
The course from 1 to 2 is: 0.0
|
It's computed and displayed by these lines:
Quote: | crs12 =crs12*(180/PI);
printf ("The course from 1 to 2 is: %f",crs12); |
But 'crs12' is never initialized anywhere in your program.
It happens to be 0 upon power-up (at least in the simulator).
That's why the result is always 0. |
|
|
MicroManiac
Joined: 21 Aug 2008 Posts: 34
|
|
Posted: Wed Feb 18, 2009 1:14 am |
|
|
well, when i am using the USART, the "d" is always returning 0.
i am surprised that it is returning a result in the MPLAB simulator. the other values are the same.
i didn't post my whole code, the calculation of the "crs12" is based on "d".
i thought there was a problem in "d" and there is no need to post everything.
Why do you think when i send "d" over the USART it is returning 0? _________________ "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."
Albert Einstein |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Feb 18, 2009 1:20 am |
|
|
Quote: | Why do you think when i send "d" over the USART it is returning 0? |
If possible, post a short test program that demonstrates this problem.
(The program should be much shorter than the program you already
posted).
Also, post the name of the terminal program that runs on your PC. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Feb 18, 2009 1:31 am |
|
|
I only see, that crs12 is never set to a value in your code, so it can be expected zero. Is this the problem? |
|
|
MicroManiac
Joined: 21 Aug 2008 Posts: 34
|
|
Posted: Thu Feb 19, 2009 1:26 am |
|
|
Well that is not the problem
i created a new project and recompiled everything and it worked smoothly
dunno what was happening before
thank you all for your help _________________ "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."
Albert Einstein |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Feb 19, 2009 3:46 am |
|
|
Quote: | Well that is not the problem | In other words, your previously posted code has been meaningless or misleading. |
|
|
MicroManiac
Joined: 21 Aug 2008 Posts: 34
|
|
Posted: Fri Feb 20, 2009 3:18 am |
|
|
FvM wrote: | In other words, your previously posted code has been meaningless or misleading. |
Actually Not,
i've taken that exact code, recompiled it in a new project and it worked fine.
My problem was in the "d" variable not the "crs12" variable, but it was solved now and i dunno what was the problem _________________ "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction."
Albert Einstein |
|
|
|
|
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
|