Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[PIC] problem with displaying floating on lcd for pic18f458

Status
Not open for further replies.

mohsin152

Newbie level 1
Joined
Jun 26, 2016
Messages
1
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
17
Hi every one,
I am new to pic and have recently started to study its basics.I am making a simple project of displaying temperature via LM35. I am having a problem with displaying values of ADC conversion on lcd with PIC 18F458. i am using floatTostr to convert values into character stings. But when i try to display, if the value is greater than 1 (such as 1.2) it gets displayed correctly but for values less than 1 such as .5 it is displayed as 5 which means it gets multiplied by 10 automatically and even if the value to be displayed is .005 still lcd shows 5. My code is following

Code:
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB0_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D4 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

char temp[] = "Temp(C')";             // to be displayed on lcd 
void main()
{
  float x=0;
  unsigned char temparray[5];        
  TRISA.F1=1;        // make RA1 an input pin for ADC analog signal
  ADC_Init();
  Lcd_Init();                        // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
  Lcd_Out(1,1,temp);                 // Write text in first row
                 
  while (1)
  {
   ADCON0=0X81;   
   ADCON1=0X84;                 // right justified result,vref+=VDD,vref-=VSS
   Delay_ms(20);
   x= ADC_Read(1);               // temperature sensor output connected at AN1
   x=(x*4.89)/1000;              // 4.89mV is the step size
   floatTostr (x,temparray);
   Lcd_Out(1,12,temparray);
   }
}
 
Last edited by a moderator:

Only a guess - I do not have a computer with me at the moment:

Try making 'temparray' bigger. At the moment it can only hold 4 characters plus the zero terminator, you probably need more space to hold the full floating point number.

It would be worth experimenting with the conversion factor as well, dividing the result of the voltage by 1000 is likely to cause a loss of accuracy. You might find that multiplying by 0.0489 is more accurate.

Brian.
 

I presume you're using the MikroC libraries, with which I'm not familiar. Anyway, just to check if there is happening any issue with unexpected casting with the variables ( which I doubt ), you could try replace the following calculation
Code:
x= ADC_Read(1);               // temperature sensor output connected at AN1
x=(x*4.89)/1000;              // 4.89mV is the step size
floatTostr (x,temparray);

by
Code:
int y ;
...
...
y= ADC_Read(1);               // temperature sensor output connected at AN1
y=(y*501)>>10;               // performs the above calculation, without using float
IntToString(y,temparray);

which would lose some accuracy ( less than 1% ) but you could avoid intermediate calculation with float numbers. As said, I'm unsure that this could be the reason, but at least we could eliminate this possibility.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top