| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| cvargcal 
 
 
 Joined: 17 Feb 2015
 Posts: 134
 
 
 
			    
 
 | 
			
				| Operations with bits |  
				|  Posted: Fri Apr 14, 2017 8:11 am |   |  
				| 
 |  
				| Hi, I have this problem, I read the 8 bits from a port: 
 var=A7 A6 A5 A4 A3 A2 A1 A0
 I want get this        A0 A1 A2 A3 A4 A5 A6 A7
 and after,               0   0   0   0    A0 A1 A2 A3
 
 so,  the result is invert and move.
 
 I know its possible with
 
  	  | Code: |  	  | temp = input_a(); if (bit_test(temp,0)) bit_set(var,7)
 ...
 | 
 but, this take on many time, and this steep running at the interruption ext
 someone idea? thanks
 |  | 
	
		|  | 
	
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 |  | 
	
		|  | 
	
		| cvargcal 
 
 
 Joined: 17 Feb 2015
 Posts: 134
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Apr 14, 2017 10:42 am |   |  
				| 
 |  
				| thanks
 
 I use this, but I see is similar
 
 
  	  | Code: |  	  | DTMF_CMD = 0x0; Temp = input_b();
 if (bit_test(Temp,1)) bit_set(DTMF_CMD,3);  // Leer bit 1 (B1) de Temp y guardar en el bit 3 DTMF_CMD   3---
 if (bit_test(Temp,2)) bit_set(DTMF_CMD,2);  // Leer bit 2 (B2) de Temp y guardar en el bit 2 DTMF_CMD   -2--
 if (bit_test(Temp,3)) bit_set(DTMF_CMD,1);  // Leer bit 3 (B3) de Temp y guardar en el bit 1 DTMF_CMD   --1-
 if (bit_test(Temp,4)) bit_set(DTMF_CMD,0);  // Leer bit 4 (B4) de Temp y guardar en el bit 0 DTMF_CMD   ---0
 
 
 | 
 But this take many time
   
 Its similar to:
 
 } 	  | Code: |  	  | int8 reverse( int8 backwards )
 {
 int8 result=0;
 int8 x;
 
 x = 8;
 do
 {
 if (bit_test(backwards,7))
 bit_set(result,0);
 
 rotate_left( &backwards,1);
 rotate_right( &result, 1);
 } while (--x);
 
 return result;
 
 | 
 
 Well, I thought this was more easy... jejeje
 Thanks
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Apr 14, 2017 11:11 am |   |  
				| 
 |  
				| the version like this: 
  	  | Code: |  	  | DTMF_CMD = 0x0;
 Temp = input_b();
 if (bit_test(Temp,1)) bit_set(DTMF_CMD,3);  // Leer bit 1 (B1) de Temp y guardar en el bit 3 DTMF_CMD   3---
 if (bit_test(Temp,2)) bit_set(DTMF_CMD,2);  // Leer bit 2 (B2) de Temp y guardar en el bit 2 DTMF_CMD   -2--
 if (bit_test(Temp,3)) bit_set(DTMF_CMD,1);  // Leer bit 3 (B3) de Temp y guardar en el bit 1 DTMF_CMD   --1-
 if (bit_test(Temp,4)) bit_set(DTMF_CMD,0);  // Leer bit 4 (B4) de Temp y guardar en el bit 0 DTMF_CMD   ---0
 
 | 
 Will execute much faster.
 
 You need to look at the actual execution time, rather than the code size.
 The 'looped' version gives a very similar size, but takes several times as long to execute....
 |  | 
	
		|  | 
	
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9588
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Apr 14, 2017 1:40 pm |   |  
				| 
 |  
				| OK, a possible hardware solution... Since I see 'DTMF', is it possible to rewire the peripherals attached to the PIC to get the bits 'right way round'??
 
 Jay
 |  | 
	
		|  | 
	
		| newguy 
 
 
 Joined: 24 Jun 2004
 Posts: 1924
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Apr 14, 2017 1:56 pm |   |  
				| 
 |  
				|  	  | temtronic wrote: |  	  | OK, a possible hardware solution... Since I see 'DTMF', is it possible to rewire the peripherals attached to the PIC to get the bits 'right way round'??
 
 Jay
 | 
 
 I was going to suggest the same thing.  If this is such an issue, it may be worth a revised PCB.
 |  | 
	
		|  | 
	
		| cvargcal 
 
 
 Joined: 17 Feb 2015
 Posts: 134
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Apr 14, 2017 9:46 pm |   |  
				| 
 |  
				|  	  | newguy wrote: |  	  |  	  | temtronic wrote: |  	  | OK, a possible hardware solution... Since I see 'DTMF', is it possible to rewire the peripherals attached to the PIC to get the bits 'right way round'??
 
 Jay
 | 
 
 I was going to suggest the same thing.  If this is such an issue, it may be worth a revised PCB.
 | 
 
 Yes, the better option is fixed the PCB... :( I no wanted do... but read the bits this way is not good.
 
 Thanks
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Apr 14, 2017 11:44 pm |   |  
				| 
 |  
				| A lot also depends on what chip is involved. The fastest solution is the 256 entry lookup table already mentioned.
 Now on any of the larger chips this is not a terrible cost, and honestly in an interrupt handler is probably the only solution to consider.....
 |  | 
	
		|  | 
	
		|  |