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 support@ccsinfo.com

Help me: Why functions not return exactly value?

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



Joined: 09 Oct 2006
Posts: 12
Location: hoangsam

View user's profile Send private message AIM Address Yahoo Messenger ICQ Number

Help me: Why functions not return exactly value?
PostPosted: Wed Nov 15, 2023 11:11 am     Reply with quote

Help me!!! Why funtions: read_5bit_tram_chuc_MHz_DKX();
read_4bit_donvi_MHz_DKX();
read_4bit_tram_kHz_DKX();
read_2bit_chuc_kHz_DKX(); not return exactly value in convert_data_DKX() function?
#include <16f887.h>
#device *=16
#device adc=10
#fuses nowdt,xt,noput,protect,nodebug,nobrownout,nolvp
#use delay(clock=4000000)
#include <internal_eeprom.c>
#bit ResetRom = 0x05.5 //RA5 (PIN 7)
#byte PORTA = 0x05
#byte PORTB = 0x06
#byte PORTC = 0x07
#byte PORTD = 0x08
#byte PORTE = 0x09
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte TRISC = 0x87
#byte TRISD = 0x88
#byte TRISE = 0x89

/* Dinh nghia cac chan cua IC74HC595 */
#define SHCP_PIN PIN_C0
#define DS_PIN PIN_C1
#define STCP_PIN PIN_C2
/* Dinh nghia cac chan cua ICMAX7219 */

byte Lo_Data_DKX ;
byte Hi_Data_DKX ;
int8 a;
int8 b;
int8 c;
int8 d;
int16 Data_DKX = 0;

void read_5bit_tram_chuc_MHz_DKX() //10-39
{
if(!(input(pin_b7)) &&(input(pin_b6)) && (input(pin_b5)) && (input(pin_b4))&& (input(pin_b3))&& (!input(pin_b2))) {a =10;break;} //10
else if(!(input(pin_b7)) &&(input(pin_b6)) && (input(pin_b5)) && (input(pin_b4))&& (!input(pin_b3))&& (input(pin_b2))) {a = 11;break;} //11
else if(!(input(pin_b7)) &&(input(pin_b6)) && (input(pin_b5)) && (input(pin_b4))&& (!input(pin_b3))&& (!input(pin_b2))) {a = 12;break;} //12
else if(!(input(pin_b7)) &&(input(pin_b6)) && (input(pin_b5)) && (!input(pin_b4))&& (input(pin_b3))&& (input(pin_b2))) {a = 13;break;} //13
else if(!(input(pin_b7)) &&(input(pin_b6)) && (input(pin_b5)) && (!input(pin_b4))&& (input(pin_b3))&& (!input(pin_b2))) {a = 14;break;} //14
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (input(pin_b5)) && (!input(pin_b4))&& (!input(pin_b3))&& (!input(pin_b2))) {a = 22;break;} //22
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (input(pin_b3))&& (input(pin_b2))) {a = 23;break;} //23
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (input(pin_b3))&& (!input(pin_b2))) {a = 24;break;} //24
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (!input(pin_b3))&& (input(pin_b2))) {a = 25;break;} //25
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (!input(pin_b3))&& (!input(pin_b2))) {a = 26;break;} //26
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (!input(pin_b5)) && (!input(pin_b4))&& (input(pin_b3))&& (input(pin_b2))) {a = 27;break;} //27
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (!input(pin_b5)) && (!input(pin_b4))&& (input(pin_b3))&& (!input(pin_b2))) {a = 28;break;} //28
else if(!(input(pin_b7)) &&(!input(pin_b6)) && (!input(pin_b5)) && (!input(pin_b4))&& (!input(pin_b3))&& (input(pin_b2))) {a = 29;break;} //29
else if(!(input(pin_b7)) &&(input(pin_b6)) && (input(pin_b5)) && (!input(pin_b4))&& (!input(pin_b3))&& (input(pin_b2))) {a = 30;break;} //30
else if(!(input(pin_b7)) &&(input(pin_b6)) && (input(pin_b5)) && (!input(pin_b4))&& (!input(pin_b3))&& (!input(pin_b2))) {a = 31;break;} //31
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (input(pin_b3))&& (input(pin_b2))) {a = 32;break;} //32
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (input(pin_b3))&& (!input(pin_b2))) {a = 33;break;} //33
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (!input(pin_b3))&& (input(pin_b2))) {a = 34;break;} //34
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (input(pin_b4))&& (!input(pin_b3))&& (!input(pin_b2))) {a = 35;break;} //35
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (!input(pin_b4))&& (input(pin_b3))&& (input(pin_b2))) {a = 36;break;} //36
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (!input(pin_b4))&& (input(pin_b3))&& (!input(pin_b2))) {a = 37;break;} //37
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (!input(pin_b4))&& (!input(pin_b3))&& (input(pin_b2))) {a = 38;break;} //38
else if(!(input(pin_b7)) &&(input(pin_b6)) && (!input(pin_b5)) && (!input(pin_b4))&& (!input(pin_b3))&& (!input(pin_b2))) {a = 39;break;} //39
else {a = 0;}

}
void read_4bit_donvi_MHz_DKX()
{
if((input(pin_b1)) && (input(pin_b0)) && (input(pin_d7))&& (input(pin_d6))) {b = 0;break;} //0
else if((input(pin_b1)) && (input(pin_b0)) && (input(pin_d7))&& (!input(pin_d6))) {b = 1;break;} //1
else if((input(pin_b1)) && (input(pin_b0)) && (!input(pin_d7))&& (input(pin_d6))) {b = 2;break;} //2
else if((input(pin_b1)) && (input(pin_b0)) && (!input(pin_d7))&& (!input(pin_d6))) {b = 3;break;} //3
else if((input(pin_b1)) && (!input(pin_b0)) && (input(pin_d7))&& (input(pin_d6))) {b = 4;break;} //4
else if((input(pin_b1)) && (!input(pin_b0)) && (input(pin_d7))&& (!input(pin_d6))) {b = 5;break;} //5
else if((input(pin_b1)) && (!input(pin_b0)) && (!input(pin_d7))&& (input(pin_d6))) {b = 6;break;} //6
else if((input(pin_b1)) && (!input(pin_b0)) && (!input(pin_d7))&& (!input(pin_d6))) {b = 7;break;} //7
else if((!input(pin_b1)) && (input(pin_b0)) && (input(pin_d7))&& (input(pin_d6))) {b = 8;break;} //8
else if((!input(pin_b1)) && (input(pin_b0)) && (input(pin_d7))&& (!input(pin_d6))) {b = 9;break;} //9
else {b = 0;}

}
void read_4bit_tram_kHz_DKX()
{
if((input(pin_d5)) && (input(pin_d4)) && (input(pin_d3))&& (input(pin_d2))) {c = 0;break;} //0
else if((input(pin_d5)) && (input(pin_d4)) && (input(pin_d3))&& (!input(pin_d2))) {c = 1;break;} //1
else if((input(pin_d5)) && (input(pin_d4)) && (!input(pin_d3))&& (input(pin_d2))) {c = 2;break;} //2
else if((input(pin_d5)) && (input(pin_d4)) && (!input(pin_d3))&& (!input(pin_d2))) {c = 3;break;} //3
else if((input(pin_d5)) && (!input(pin_d4)) && (input(pin_d3))&& (input(pin_d2))) {c = 4;break;} //4
else if((input(pin_d5)) && (!input(pin_d4)) && (input(pin_d3))&& (!input(pin_d2))) {c = 5;break;} //5
else if((input(pin_d5)) && (!input(pin_d4)) && (!input(pin_d3))&& (input(pin_d2))) {c = 6;break;} //6
else if((input(pin_d5)) && (!input(pin_d4)) && (!input(pin_d3))&& (!input(pin_d2))) {c = 7;break;} //7
else if((!input(pin_d5)) && (input(pin_d4)) && (input(pin_d3))&& (input(pin_d2))) {c = 8;break;} //8
else if((!input(pin_d5)) && (input(pin_d4)) && (input(pin_d3))&& (!input(pin_d2))) {c = 9;break;} //9
else {c = 0;}

}
void read_2bit_chuc_kHz_DKX()
{
if((input(pin_d1)) && (input(pin_d0))) {d = 0;break;} //00
else if((input(pin_d1)) && (!input(pin_d0))) {d = 25;break;} //25
else if((!input(pin_d1)) && (input(pin_d0))) {d = 50;break;} //50
else if((!input(pin_d1)) && (!input(pin_d0))) {d = 75;break;} //75
else {d = 0;}

}
void convert_data_DKX()
{
read_5bit_tram_chuc_MHz_DKX();
read_4bit_donvi_MHz_DKX();
read_4bit_tram_kHz_DKX();
read_2bit_chuc_kHz_DKX();
//a=10; b=0;c=0; d=0;

Data_DKX = ((10000*a)+(1000*(b+25))+(100*c)+d)/12.5;
// Data_DKX = 10000;
Hi_Data_DKX = (unsigned char) (Data_DKX / 256);
Lo_Data_DKX = (unsigned char) (Data_DKX % 256);

}


void IC_74hc595(int data)
{
int i;
output_low(SHCP_PIN);
for(i=0;i<=7;i++)
{

if((data & 0x80)==0)
{output_low(DS_PIN);
delay_us(50);}
else
output_high(DS_PIN);
data=data<<1;
output_high(SHCP_PIN);
output_low(SHCP_PIN);
}
}
void IC_74HC595_Output()
{
output_low(STCP_PIN);
delay_ms(50);
output_high(STCP_PIN);
output_low(STCP_PIN);
}
void write_to_595 (byte Lo_Data_DKX, Hi_Data_DKX)
{
IC_74hc595(Hi_Data_DKX);
IC_74hc595(Lo_Data_DKX);
IC_74HC595_Output();
}
void send_data_DKX()
{
convert_data_DKX();
write_to_595(Lo_Data_DKX, Hi_Data_DKX);
}


void main(void)
{
TRISA=0x00; //PortA as OUTPUT, RA5 as INPUT
TRISB=0xFF; //PortB as OUTPUT
TRISC=0x00; //PortC as OUTPUT
TRISD=0xFF; //PortD as OUTPUT
TRISE=0x00; //PortE as INPUT
PORTE=0x00; //

while(true)
{

send_data_DKX();



}


}
temtronic



Joined: 01 Jul 2010
Posts: 9117
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Nov 15, 2023 11:31 am     Reply with quote

My head hurts just looking at the code.....
Please simply just read the entire portB and use a 'mask' to compare to your test values.
You'll have clear, easy to read code, even for a 'dinosaur' like me !
Ttelmah



Joined: 11 Mar 2010
Posts: 19231

View user's profile Send private message

PostPosted: Wed Nov 15, 2023 11:47 am     Reply with quote

Agreed it is awful code.
However there is a very fundamental problem with this maths:

Data_DKX = ((10000*a)+(1000*(b+25))+(100*c)+d)/12.5;

The very first part of this returns values up to 39. You multiply this by
10000 using 16bit arithmetic (since 10000 is a 16bit value). 39*10000 =
390000. Largest value that can fit in an int16 is 65535. Instant overflow.
b should work, but then c, will be using int8 arithmetic (since 100 is an int8,
and c is an int8). Again overflow.

Fundamentally flawed maths.
thanhhavdt



Joined: 09 Oct 2006
Posts: 12
Location: hoangsam

View user's profile Send private message AIM Address Yahoo Messenger ICQ Number

PostPosted: Thu Nov 16, 2023 6:29 am     Reply with quote

Thanks for support!!!!
Ttelmah



Joined: 11 Mar 2010
Posts: 19231

View user's profile Send private message

PostPosted: Thu Nov 16, 2023 8:13 am     Reply with quote

As a comment to this. Consider:
Code:

void read_4bit_tram_kHz_DKX()
{
   int val;
   val=(input_d() & 0b111100)>>2; //mid four bits from port D
   //Masked and Moved to the bottom
   val^= 0b1111; //inverted
   c=val;
}


Honestly also would be better to have the functions return the values
rather than using global values.

Same applies to each of the other functions
thanhhavdt



Joined: 09 Oct 2006
Posts: 12
Location: hoangsam

View user's profile Send private message AIM Address Yahoo Messenger ICQ Number

PostPosted: Fri Nov 17, 2023 10:41 am     Reply with quote

Thanks for Ttelmah. I'm newbie, my code is awful. Can you help me rewrite the functions: read_5bit_tram_chuc_MHz_DKX();
read_4bit_donvi_MHz_DKX();
Thanks for support!!!
Humberto



Joined: 08 Sep 2003
Posts: 1215
Location: Buenos Aires, La Reina del Plata

View user's profile Send private message

PostPosted: Wed Dec 13, 2023 10:54 am     Reply with quote

I don't think someone will write your code upon request, generally the help provided in this forum
is of an excellent level, while the consultation warrants it. If you are a newbie, I suggest you
take a look and learn how manages the data handler, that shift register logic circuit, file 74595.c
located in the CCS compiler Drivers folder.

best wishes
_________________
Humber
bkamen



Joined: 07 Jan 2004
Posts: 1611
Location: Central Illinois, USA

View user's profile Send private message

PostPosted: Mon Dec 18, 2023 11:54 am     Reply with quote

Oh lordy.

Always remember when you're coding:

* If it's hard to read, it's hard to debug.
* If you had to look at this code 10yrs from now, how quickly would you be able to make sense of it?

* Compilers can have bugs. All kinds of bugs. Keep the code in manageable chunks because the error/issue you might be running into might not be the code, but some bug of the compiler -- and then look back at the first rule item I listed.
_________________
Dazed and confused? I don't think so. Just "plain lost" will do. :D
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