CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

flashing on LCD when used float variables

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
hundil
Guest







flashing on LCD when used float variables
PostPosted: Mon Jun 21, 2004 9:04 am     Reply with quote

I use PCM ver 3.048 and 16F877. I can not add float variables cummulatively in the routine below, on the line it is stated.
It is compiling good but, the readings are flashing and some values are incorrectly printed on LCD.
LCD display is Hitachi HD44780 compatible with 16x2 characters.

Note: U may see some unused variables which are defined.
They are for other parts of the program.

thanks much in advance.

hundil


#include<16f877.h>
#include<stdio.h>
#device PIC16F877 *=16 ADC=10
#fuses XT,NOWDT,NOPROTECT, NOBROWNOUT,NOVLP
#use delay(clock= 4000000)

#include"_lcd.c"
float value_o= 0, akim_s ,value_i ,value,swtch, ort;
int
_i,s_swtch,_swtch=1,kk=0,hh=0,bb,SA=1,tx,TS=0,TA=0,OK=0,tmr1=0;
unsigned __swtch,SS_,_SA;
long int sayac=0,ii=0,counter=0;
static short print=false,sss=False;
static short rise_edge=TRUE;

int switch_fonk(void);
void stb_fonk(void);

#ZERO_RAM

#INT_TIMER1
void ornek_fonk()
{
if(rise_edge==FALSE){
++ort;
set_adc_channel(0);
delay_us(20);
value=Read_ADC();
value_i+=value; // the problem is here, cummulative addition is not possible! Is there any bug? (maybe)
value=0;
}

if(sss && rise_edge){
output_d(FALSE);
sss=false;
enable_interrupts(INT_RB);
disable_interrupts(INT_TIMER1);


}



}


#INT_EXT
void pass_fonk()
{

enable_interrupts(INT_TIMER1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

if(rise_edge){

rise_edge=FALSE;

set_timer1(0xFC17);


value_i=0;
ort=0;

ext_int_edge(H_TO_L);
}
else
{

rise_edge=TRUE;


ext_int_edge(L_TO_H);

value_i=(value_i/ort) * 250.0/1023.0;



_i++;
if(_i==50){

if(TS==1 && TA ==1) printf(lcd_putc, "\f***SISTEM OK***");
printf(lcd_putc, "VI:%3ld " ,(long)value_i);


_i=0;

if(bb==1){
stb_fonk();

switch_fonk(); }
}
if(sayac<300) sayac++;

}

enable_interrupts(INT_TIMER1);

if(input(PIN_B0))
rise_edge=FALSE;

enable_interrupts(INT_EXT);


}



void main(void)
{

bb=0;

#asm
bcf 0x03, 6 // RP1
bsf 0x03, 5 // RP0
bcf 0x89, 4 // trise -> 0
#endasm
set_tris_b(0xFF);
//set_tris_c(0x80);
set_tris_d(0x00);

setup_adc(0xC1);
setup_port_a(0x82);


ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
disable_interrupts(INT_TIMER1);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(global);

output_d(FALSE);
output_c(FALSE);

lcd_init();
delay_us(1000);

delay_us(1000);


do{
if(!sss ) ++counter;
delay_us(10);

}while(counter != 500 );





}
hundil
Guest







Re: flashing on LCD when used float variables
PostPosted: Mon Jun 21, 2004 1:43 pm     Reply with quote

hundil wrote:
I use PCM ver 3.048 and 16F877. I can not add float variables cummulatively in the routine below, on the line it is stated.
It is compiling good but, the readings are flashing and some values are incorrectly printed on LCD.

If I use long or integer values, everything is OK on LCD

Please Help , Iam in trouble.

LCD display is Hitachi HD44780 compatible with 16x2 characters

Note: U may see some unused variables which are defined.
They are for other parts of the program.

thanks much in advance.

hundil


#include<16f877.h>
#include<stdio.h>
#device PIC16F877 *=16 ADC=10
#fuses XT,NOWDT,NOPROTECT, NOBROWNOUT,NOVLP
#use delay(clock= 4000000)

#include"_lcd.c"
float value_o= 0, akim_s ,value_i ,value,swtch, ort;
int
_i,s_swtch,_swtch=1,kk=0,hh=0,bb,SA=1,tx,TS=0,TA=0,OK=0,tmr1=0;
unsigned __swtch,SS_,_SA;
long int sayac=0,ii=0,counter=0;
static short print=false,sss=False;
static short rise_edge=TRUE;

int switch_fonk(void);
void stb_fonk(void);

#ZERO_RAM

#INT_TIMER1
void ornek_fonk()
{
if(rise_edge==FALSE){
++ort;
set_adc_channel(0);
delay_us(20);
value=Read_ADC();
value_i+=value; // the problem is here, cummulative addition is not possible! Is there any bug? (maybe)
value=0;
}

if(sss && rise_edge){
output_d(FALSE);
sss=false;
enable_interrupts(INT_RB);
disable_interrupts(INT_TIMER1);


}



}


#INT_EXT
void pass_fonk()
{

enable_interrupts(INT_TIMER1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

if(rise_edge){

rise_edge=FALSE;

set_timer1(0xFC17);


value_i=0;
ort=0;

ext_int_edge(H_TO_L);
}
else
{

rise_edge=TRUE;


ext_int_edge(L_TO_H);

value_i=(value_i/ort) * 250.0/1023.0;



_i++;
if(_i==50){

if(TS==1 && TA ==1) printf(lcd_putc, "\f***SISTEM OK***");
printf(lcd_putc, "VI:%3ld " ,(long)value_i);


_i=0;

if(bb==1){
stb_fonk();

switch_fonk(); }
}
if(sayac<300) sayac++;

}

enable_interrupts(INT_TIMER1);

if(input(PIN_B0))
rise_edge=FALSE;

enable_interrupts(INT_EXT);


}



void main(void)
{

bb=0;

#asm
bcf 0x03, 6 // RP1
bsf 0x03, 5 // RP0
bcf 0x89, 4 // trise -> 0
#endasm
set_tris_b(0xFF);
//set_tris_c(0x80);
set_tris_d(0x00);

setup_adc(0xC1);
setup_port_a(0x82);


ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
disable_interrupts(INT_TIMER1);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(global);

output_d(FALSE);
output_c(FALSE);

lcd_init();
delay_us(1000);

delay_us(1000);


do{
if(!sss ) ++counter;
delay_us(10);

}while(counter != 500 );





}
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Jun 21, 2004 1:56 pm     Reply with quote

Are you trying to get people to notice your post ?
The reason I didn't respond (and probably others, too)
is because your variable declarations are a total mess.
Things you are doing wrong:
1. You have 10+ variables on one line.
2. You have tacked underscore characters onto your
variable names all over the place.
3. There are tons of variables with cryptic 2-character names.

I'm not trying to be mean-spirited, but your coding style
is so error-prone, that most people would just take a glance
at it, and immediately give up on trying to help you.

They were being polite, and so they didn't tell you this.
dyeatman



Joined: 06 Sep 2003
Posts: 1934
Location: Norman, OK

View user's profile Send private message

PostPosted: Mon Jun 21, 2004 5:00 pm     Reply with quote

The first thing I am wondering is how you get this to compile. There are two device definitions and that would keep it from compiling for me. That is in addition to the other things PCM pointed out
hundil
Guest







flashing on LCD with different readings
PostPosted: Tue Jun 22, 2004 6:35 am     Reply with quote

dyeatman wrote:
The first thing I am wondering is how you get this to compile. There are two device definitions and that would keep it from compiling for me. That is in addition to the other things PCM pointed out


DEAR DYEATMAN

Thank you very much for your polite reply.

As I wrote before my code, It was a part of the whole code.

The problem is that : When I use float variables (for 'value_i' AND 'value' variables) in the line of

value_i+=value;

this command is not adding correctly.

But in case of long OR integer definition , There is no problem with the above command. Every thing is OK in my program.

(I think )The other probability is :
There is something wrong with my printf command.

And I am sure that there is no two device definition in my code.

So you don't need to compile my partial code.

I am new at CCS programming and trying to write a long code unfortunately.

Please Help

sincerely

hundil
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Tue Jun 22, 2004 6:49 am     Reply with quote

Try paring your code down to the smallest example that still exhibits the problem. It will then be easier for you and others to see what is going wrong. Often I look at the generated assembly code in the .lst file. The shorter the program the easier it is to understand the .lst file.
_________________
The search for better is endless. Instead simply find very good and get the job done.
Douglas Kennedy



Joined: 07 Sep 2003
Posts: 755
Location: Florida

View user's profile Send private message AIM Address

PostPosted: Tue Jun 22, 2004 9:31 am     Reply with quote

PCM programmer is very experienced and most appreciate the opportunity to learn from him. I have learned much from him I am very grateful.
As to the issue you have to be aware that the PIC lives on CPU cycles.
Certain things Printf and float calculations especially float division consume large numbers of these cycles. All effort must be made to avoid consuming large numbers of cycles in an interrupt routine.
Float produces accurate answers within its 23 bit precision however when these numbers are converted to a different representation such as the decimal notation of everyday use some get surprised when a number like 0.1 displays as 0.099999. It is not an error it is an intrinsic property of number systems. even the decimal system notation has this issue EX 1/3 can't be written with total accuracy as 0.3333333.
As to coding style it is like handwriting if you want others to read your handwriting you have to try and make it neat and readable.
It is not much different when it comes to code.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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