|
|
View previous topic :: View next topic |
Author |
Message |
RamEtrics
Joined: 19 Mar 2014 Posts: 4
|
Problem with FLOAT & IF-ELSE LOOP |
Posted: Mon Mar 24, 2014 9:11 am |
|
|
Hi everybody, I am using PIC16F877A to drive an AC motor based on the input voltage to the motor. But my coding is not working correctly.
Please help me.
Code: |
#if defined(__PCM__)
#include <16F877a.H>
#device adc=10
#fuses NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=16000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define LCD_EN PIN_E0
#define LCD_RS PIN_E1
#define LCD_RW PIN_E2
//LCD->R/S R/W EN D0 D1 D2 D3 D4 D5 D6 D7
//PIN->RE0 RE1 RE2 RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7
void lcd_write(char data);
void lcd_init();
void lcd_newline();
void clr_lcd();
void main()
{
float voltsCurrentVal = 0.0, voltsPreviousVal = 0.0;
int i;
delay_ms(10);
output_bit(LCD_RW,0);
delay_ms(100);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
lcd_init();
delay_us(20);
while(1)
{
voltsCurrentVal = read_adc();
if(voltsPreviousVal!=voltaCurrentVal)
{ voltsCurrentVal = (voltsCurrentVal * 5.0) / 1023.0;
clr_lcd();
printf(lcd_write,"\fVoltage = %3.2f", voltsCurrentVal);
if(voltsCurrentVal==5)
{
for(i=0;i<10000;i++)
{
output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(20);
output_bit(pin_b2,1);
output_bit(pin_b1,0);
delay_ms(20);
}
}
else if(4.87<=voltsCurrentVal<5.00)
{
for(i=0;i<10000;i++)
{
output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(20.5);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(20.5);
}
}
else if(4.87>voltsCurrentVal>=4.67)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(21);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(21);
}}
else if(4.67>voltsCurrentVal>=4.46)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(21.5);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(21.5);
}}
else if(4.46>voltsCurrentVal>=4.35)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(23);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(23);
}}
else if(4.35>voltsCurrentVal>=4.25)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(23.5);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(23.5);
}}
else if(4.25>voltsCurrentVal>=4.14)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(24);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(24);
}}
else if(4.14>voltsCurrentVal>=3.93)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(24.5);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(24.5);
}}
else if(3.93>voltsCurrentVal>=3.83)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(26.04);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(26.04);
}}
else if(3.83>voltsCurrentVal>=3.72)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(26.7);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(26.7);
}}
else if(3.72>voltsCurrentVal>=3.62)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(27.5);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(27.5);
}}
else if(3.62>voltsCurrentVal>=3.52)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(28.4);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(28.4);
}}
else if(3.52>voltsCurrentVal>=3.41)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(29.14);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(29.14);
}}
else if(3.41>voltsCurrentVal>=3.31)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(30);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(30);
}}
else if(3.31>voltsCurrentVal>=3.20)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(30.9);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(30.9);
}}
else if(3.20>voltsCurrentVal>=3.10)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(32.33);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(32.33);
}}
else if(3.10>voltsCurrentVal>=3)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(33.33);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(33.33);
}}
else if(3>voltsCurrentVal>=2.89)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(34.5);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(34.5);
}}
else if(2.89>voltsCurrentVal>=2.79)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(35.77);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(35.77);
}}
else if(2.79>voltsCurrentVal>=2.68)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(36.97);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(36.97);
}}
else if(2.68>voltsCurrentVal>=2.58)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(38.61);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(38.61);
}}
else if(2.58>voltsCurrentVal>=1.45)
{
for(i=0;i<=10000;i++)
{output_bit(pin_b1,1);
output_bit(pin_b2,0);
delay_ms(40);
output_bit(pin_b1,0);
output_bit(pin_b2,1);
delay_ms(40);
}}
else
{
output_bit(pin_b1,0);
output_bit(pin_b2,0);
}
}
delay_ms(1000);
output_bit(LCD_RW,0);
}
}
void lcd_init()
{
output_bit(LCD_RS,0);
delay_ms(10);
lcd_write(0x01);
lcd_write(0x38);
lcd_write(0x06);
lcd_write(0x0f);
lcd_write(0x80);
delay_ms(100);
output_bit(LCD_RS,1);
}
void clr_lcd()
{
output_bit(LCD_RS,0);
delay_ms(10);
lcd_write(0x01);
output_bit(LCD_RS,1);
delay_ms(1);
}
void lcd_newline()
{
output_bit(LCD_RS,0);
delay_ms(10);
lcd_write(0xc0);
output_bit(LCD_RS,1);
delay_ms(1);
}
void lcd_write(char data)
{
output_d(data);
delay_ms(1);
output_bit(LCD_EN,1);
delay_ms(1);
output_bit(LCD_EN,0);
delay_ms(1);
} |
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Mon Mar 24, 2014 9:39 am |
|
|
here's one possible reason....
if(voltsPreviousVal!=voltaCurrentVal)
pretty sure you meant =voltsCurrentVal
I didn't look anymore after that...
change code/compile/report back
hth
jay |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Mar 24, 2014 9:48 am |
|
|
Quote: | int i;
for(i=0;i<10000;i++) |
Learn CCS data types for your compiler.
Download the manual for the PCM compiler:
https://www.ccsinfo.com/downloads/ccs_c_manual.pdf
Read the section titled: Basic and Special types
What does it say is the size of an 'int' ? Then look at your code above.
Also read this line in that section:
Quote: | unsigned -
Data is always positive. This is the default data type if not specified. |
These comments are for the PCB, PCM and PCH compiler. PCD is different. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Mar 24, 2014 9:50 am |
|
|
Again, read the manual. Don't code anymore until you read the CCS
manual for every function that you're going to use. Currently, you're
not reading the manual then doing what's called "debugging by forum".
Hint: We get impatient with this, especially if you don't read the manual. |
|
|
Battery David
Joined: 01 Feb 2010 Posts: 25
|
|
Posted: Tue Mar 25, 2014 10:58 am |
|
|
There's also a MISRA rule that you should never use '==' with floats. If you want to check if it's 5.0, use:
Code: | if(( voltsPreviousVal > 4.95 ) && (voltsPreviousVal < 5.05))
{
// Do some really cool things
}
|
|
|
|
|
|
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
|