| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| thanhhavdt 
 
 
 Joined: 09 Oct 2006
 Posts: 12
 Location: hoangsam
 
 
			          
 
 | 
			
				| Help me: Why functions not return exactly value? |  
				|  Posted: Wed Nov 15, 2023 11:11 am |   |  
				| 
 |  
				| 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: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Nov 15, 2023 11:31 am |   |  
				| 
 |  
				| 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: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Nov 15, 2023 11:47 am |   |  
				| 
 |  
				| 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
 
 
			          
 
 | 
			
				|  |  
				|  Posted: Thu Nov 16, 2023 6:29 am |   |  
				| 
 |  
				| Thanks for support!!!! |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Nov 16, 2023 8:13 am |   |  
				| 
 |  
				| 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
 
 
			          
 
 | 
			
				|  |  
				|  Posted: Fri Nov 17, 2023 10:41 am |   |  
				| 
 |  
				| 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
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Dec 13, 2023 10:54 am |   |  
				| 
 |  
				| 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: 1617
 Location: Central Illinois, USA
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Dec 18, 2023 11:54 am |   |  
				| 
 |  
				| 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
 |  | 
	
		|  | 
	
		|  |