| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| fetk52 
 
 
 Joined: 18 Dec 2014
 Posts: 1
 
 
 
			    
 
 | 
			
				| How to fix code ADC + dsPic30f + 7-segment 4 digits |  
				|  Posted: Tue May 26, 2020 3:15 am |   |  
				| 
 |  
				| I have a problem about READING ADC TO DISPLAY TO 7-SEG 4 DIGITS LED using DSPIC30F3013. 
 CONNECTION: B0->B7 (connected to a->h); PIN_F4, F5, C13, C14 (connected to B-pin of 2N3906 transistor).
 
 PROBLEM: I used to convert ADC value to R by function "R2=217.1-1.1*value" but in real, the number display in LED don't clear, overlap.
 
 Please send me some recommendation! Thanks.
 
 
  	  | Code: |  	  | // 4-Digit digital R using dsPIC
 // Common anode 7-segment display
 // https://eee.humg.edu.vn
 
 #include <30F3013.h>
 #device ADC=8
 
 #FUSES NOWDT                //No Watch Dog Timer
 #FUSES HS                       //High Speed
 #FUSES NOBROWNOUT      //No brownout reset
 #FUSES NOPROTECT
 
 #use delay(clock=20M)
 
 unsigned int dvi, chuc;
 int16 R1,R2;
 
 void seg(unsigned int num) {
 switch (num) {
 case 0 : //output_b(0xC0);
 {
 output_low(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_low(PIN_B3);
 output_low(PIN_B4);
 output_low(PIN_B5);
 output_high(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 1 : // output_b(0xF9);
 {
 output_high(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_high(PIN_B3);
 output_high(PIN_B4);
 output_high(PIN_B5);
 output_high(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 2 : // output_b(0xB4);
 {
 output_low(PIN_B0);
 output_low(PIN_B1);
 output_high(PIN_B2);
 output_low(PIN_B3);
 output_low(PIN_B4);
 output_high(PIN_B5);
 output_low(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 3 : // output_b(0xB0);
 {
 output_low(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_low(PIN_B3);
 output_high(PIN_B4);
 output_high(PIN_B5);
 output_low(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 4 : // output_b(0x99); //s4
 {
 output_high(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_high(PIN_B3);
 output_high(PIN_B4);
 output_low(PIN_B5);
 output_low(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 5 : // output_b(0x92);
 {
 output_low(PIN_B0);
 output_high(PIN_B1);
 output_low(PIN_B2);
 output_low(PIN_B3);
 output_high(PIN_B4);
 output_low(PIN_B5);
 output_low(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 6 : // output_b(0x82);
 {
 output_low(PIN_B0);
 output_high(PIN_B1);
 output_low(PIN_B2);
 output_low(PIN_B3);
 output_low(PIN_B4);
 output_low(PIN_B5);
 output_low(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 7 : // output_b(0xF8);
 {
 output_low(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_high(PIN_B3);
 output_high(PIN_B4);
 output_high(PIN_B5);
 output_high(PIN_B6);  // 1100 0111
 output_high(PIN_B7);
 break;
 }
 case 8 : // output_b(0x80);
 {
 output_low(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_low(PIN_B3);
 output_low(PIN_B4);
 output_low(PIN_B5);
 output_low(PIN_B6);  // 1100 0111
 output_high(PIN_B7);
 break;
 }
 case 9 : // output_b(0x90);
 {
 output_low(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_low(PIN_B3);
 output_high(PIN_B4);
 output_low(PIN_B5);
 output_low(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 10 : // output_b(0xC7); // 11000111   L
 {
 output_high(PIN_B0);
 output_high(PIN_B1);
 output_high(PIN_B2);
 output_low(PIN_B3);
 output_low(PIN_B4);
 output_low(PIN_B5);
 output_high(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 case 11 : // output_b(0x98);  //  H
 {
 output_high(PIN_B0);
 output_low(PIN_B1);
 output_low(PIN_B2);
 output_high(PIN_B3);
 output_low(PIN_B4);
 output_low(PIN_B5);
 output_low(PIN_B6);
 output_high(PIN_B7);
 break;
 }
 }
 }
 
 
 void convert(int a)
 {
 chuc=a/10;
 dvi=a%10;
 }
 
 
 void hienthi(){
 
 output_high(PIN_F4);
 output_high(PIN_C14);
 output_high(PIN_C13);
 output_high(PIN_F5);
 delay_ms(1);
 
 output_low(PIN_F5);      // Bat LED don vi
 seg(dvi);                // Hien chu so hang don vi
 delay_ms(2);
 output_high(PIN_F5);       //Tat LED don vi
 
 output_low(PIN_C14);      // Bat LED chuc
 seg(chuc);                // Hien chu so hang chuc
 delay_ms(2);
 output_high(PIN_F4);
 
 }
 
 
 void main(){
 
 float value;
 int R1,R2;
 int min=138, max=180;
 
 setup_adc_ports(sAN8);
 setup_adc(ADC_CLOCK_INTERNAL);
 
 while (TRUE)
 {
 set_adc_channel(8);
 value = read_adc();
 delay_us(20);
 
 if(value<134)
 {
 output_high(PIN_F4);
 output_high(PIN_C14);
 output_high(PIN_F5);
 output_low(PIN_C13);
 seg(11);             // Hien thi chu H (High Resistance)
 
 }
 else if((value>=138)&&(value<=179))
 {
 
 R2=217.1-1.1*value; // Dien tro tu 66k 3 pha den 20k 3 pha
 convert(R2);
 delay_ms(1);
 hienthi();
 
 }
 else if(value>182)
 {
 
 output_high(PIN_C13);
 output_high(PIN_C14);
 output_high(PIN_F5);
 output_low(PIN_F4);      // Tat tat ca cac LED
 seg(10);             // Hien thi chu L (Low Resistance)
 }
 }
 
 }
 | 
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue May 26, 2020 1:04 pm |   |  
				| 
 |  
				| Problem is there are only a tiny number of comments to explain what lines are used for, and no details of how the hardware is wired.
 
 Now 'why' are you outputting the bit patterns bit by bit?.
 Much easier to output the bytes. Even better these can come from an
 array of values. In your case you are using a 16bit processor, so the
 'output_b' function will output all 16bits, but you can make a byte
 wide version by just writing directly to the LAT.
 So:
 
  	  | Code: |  	  | #byte LATB=getenv("SFR:LATB")
 
 set_tris_c(0xFF00);
 LATB=0xC0;
 
 | 
 Outputs the whole byte.
 
 Then I'm puzzled by your accesses here:
 
  	  | Code: |  	  | output_low(PIN_F5);      // Bat LED don vi
 seg(dvi);                // Hien chu so hang don vi
 delay_ms(2);
 output_high(PIN_F5);       //Tat LED don vi
 
 output_low(PIN_C14);      // Bat LED chuc
 seg(chuc);                // Hien chu so hang chuc
 delay_ms(2);
 output_high(PIN_F4);
 
 | 
 Assuming F5, is the common select for one digit, what is happening
 with C14 and F4?. If C14 is the select for the next digit, it goes on,
 and you don't then turn it off.
 The sequence has to be output bit pattern, select on, wait, select off.
 It'd honestly be much better to have this being done by a timer
 interrupt.
 First tick second select off, output pattern for first digit turn first select
 on.
 Next tick, first select off, output pattern for second digit, second select
 on.
 Repeat.
 This way the display will be steady while other code is being run.
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue May 26, 2020 1:59 pm |   |  
				| 
 |  
				| The other 'debugging' technique is to use KNOWN values and display them. Say 0000, 1234,5678,9999 in a loop with a 1/2 second delay. 
 Do this BEFORE trying to read/send ADC data to the display.
 
 Jay
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |