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

Faster simulated port ??

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



Joined: 06 Dec 2006
Posts: 102
Location: Montreal , Canada

View user's profile Send private message

Faster simulated port ??
PostPosted: Mon Mar 15, 2010 10:21 am     Reply with quote

Hi guys , just fooling around a bit , and would like to know if there a faster way to do it ? I'm using a macro to create an 8 bit port, but to transfer data to that port takes 96.5 uSec. Any faster way ??
Code:

#include <16F684.h>

//#device adc=10
#fuses NOWDT,INTRC_IO,BROWNOUT,NOMCLR
#use delay(clock=8000000)

const unsigned char sine_table[256] = {127,130,133,136,139,
143,146,149,152,155,158,161,164,167,
170,173,176,178,181,184,187,190,192,195,198,200,203,205,
208,210,212,215,217,219,221,223,225,227,229,231,233,234,
236,238,239,240,242,243,244,245,247,248,249,249,250,251,
252,252,253,253,253,254,254,254,254,254,254,254,253,253,
253,252,252,251,250,249,249,248,247,245,244,243,242,240,
239,238,236,234,233,231,229,227,225,223,221,219,217,215,
212,210,208,205,203,200,198,195,192,190,187,184,181,178,
176,173,170,167,164,161,158,155,152,149,146,143,139,136,
133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,
87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,
37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,
5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,
11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,
46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,
99,102,105,108,111,115,118,121,124};

// spare pins
#bit RC0 = 7.0
#bit RC1 = 7.1
#bit RC2 = 7.2
#bit RC3 = 7.3
#bit RC4 = 7.4
#bit RC5 = 7.5
#bit RA1 = 5.1
#bit RA2 = 5.2

// MACRO
// DAC_PORT from spare pins

#define DAC_PORT(x)\
RA1 = x & 1;\
RA2 = (x>>1)& 1;\
RC0 = (x>>2)& 1;\
RC1 = (x>>3)& 1;\
RC2 = (x>>4)& 1;\
RC3 = (x>>5)& 1;\
RC4 = (x>>6)& 1;\
RC5 = (x>>7)& 1;\

BYTE sine_index;


//=============================================
// main
//=============================================
void main()
{


   set_tris_c(0b00000000);
    set_tris_a(0b00000000);
   sine_index=0;
   while(1)
   {
       DAC_PORT(sine_table[sine_index]);   // takes 96.5 usec
         if(++sine_index==256)
       sine_index=0;
   }
}

If you have a better subject name for this topic lmk !!!
dezso



Joined: 04 Mar 2010
Posts: 102

View user's profile Send private message

PostPosted: Mon Mar 15, 2010 11:54 am     Reply with quote

I'm not expert in CCS
You should try to use a bigger pic, where you have a full 8 bit port.
Check your disassembly list, I'm sure the port translation take a few cycle. I find C is best for complex programs, ASM for speed and code space saving.
Try to write a segment in ASM and optimize it.
This 18F code in ASM will change the port in .600 us if you run 40Mhz or 1.2 us at 20 Mhz and 3 us at 8 Mhz



Code:
;******************************************************************************
;Start of main program

Main:   ;********************
   banksel   trisb
   movlw   0x00
   movwf   trisb
   banksel   portb
   clrf   portb
         ;********************
   movlw   high(sin_table)
   movwf   tblptrh
   movlw   low(sin_table)
   movwf   tblptrl
send_sin:   
        ;********************
   tblrd*+                  * 0.00 us
   movf   tablat,w
   movwf  portb
   goto   send_sin          * 0.400 us + 200 ns to return
        ;********************

sin_table:
db .27,.130,.133,.136,.139
db .143,.146,.149,.152,.155,.158,.161,.164,.167
db .170,.173,.176,.178,.181,.184,.187,.190,.192,.195,.198,.200,.203,.205
db .208,.210,.212,.215,.217,.219,.221,.223,.225,.227,.229,.231,.233,.234
db .236,.238,.239,.240,.242,.243,.244,.245,.247,.248,.249,.249,.250,.251
db .252,.252,.253,.253,.253,.254,.254,.254,.254,.254,.254,.254,.253,.253
db .253,.252,.252,.251,.250,.249,.249,.248,.247,.245,.244,.243,.242,.240
db .239,.238,.236,.234,.233,.231,.229,.227,.225,.223,.221,.219,.217,.215
db .212,.210,.208,.205,.203,.200,.198,.195,.192,.190,.187,.184,.181,.178
db .176,.173,.170,.167,.164,.161,.158,.155,.152,.149,.146,.143,.139,.136
db .133,.130,.127,.124,.121,.118,.115,.111,.108,.105,.102,.99,.96,.93,.90
db .87,.84,.81,.78,.76,.73,.70,.67,.64,.62,.59,.56,.54,.51,.49,.46,.44,.42,.39
db .37,.35,.33,.31,.29,.27,.25,.23,.21,.20,.18,.16,.15,.14,.12,.11,.10,.9,.7,.6
db .5,.5,.4,.3,.2,.2,.1,.1,.1,.0,.0,.0,.0,.0,.0,.0,.1,.1,.1,.2,.2,.3,.4,.5,.5,.6,.7,.9,.10
db .11,.12,.14,.15,.16,.18,.20,.21,.23,.25,.27,.29,.31,.33,.35,.37,.39,.42,.44
db .46,.49,.51,.54,.56,.59,.62,.64,.67,.70,.73,.76,.78,.81,.84,.87,.90,.93,.96
db .99,.102,.105,.108,.111,.115,.118,.121,.124
END
mindstorm88



Joined: 06 Dec 2006
Posts: 102
Location: Montreal , Canada

View user's profile Send private message

PostPosted: Mon Mar 15, 2010 1:21 pm     Reply with quote

dezso wrote:
You should try to use a bigger pic, where you have a full 8 bit port.


I agree %100 with you Very Happy , but just want to know if there a way to improve with this pic !! Wink
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Mar 15, 2010 1:35 pm     Reply with quote

Use #fast_io to get rid of the TRIS in the ASM code. This reduces the
instruction count. You can see this by looking at the .LST file.
Then notice that most of your bits are in PortC. So use output_c()to do
them all at once. Do the two remaining bits with output_bit(). Example:
Code:

#use fast_io(A)
#use fast_io(C)

void main()
{
int8 temp;

set_tris_c(0b00000000);
set_tris_a(0b00000000);
sine_index=0;

while(1)
  {
    temp = sine_table[sine_index];

    output_c(temp >> 2);  // Bits 7-2
    output_bit(PIN_A2, bit_test(temp, 1));  // Bit 1
    output_bit(PIN_A1, bit_test(temp, 0));  // Bit 0



The .LST file shows the result:
Code:

....................     output_c(temp >> 2);  // Bits 7-2
0125:  RRF    25,W
0126:  MOVWF  26
0127:  RRF    26,F
0128:  MOVLW  3F
0129:  ANDWF  26,F
012A:  MOVF   26,W
012B:  MOVWF  07
....................     output_bit(PIN_A2, bit_test(temp, 1));  // Bit 1
012C:  BTFSC  25.1
012D:  GOTO   130
012E:  BCF    05.2
012F:  GOTO   131
0130:  BSF    05.2
....................     output_bit(PIN_A1, bit_test(temp, 0));  // Bit 0
0131:  BTFSC  25.0
0132:  GOTO   135
0133:  BCF    05.1
0134:  GOTO   136
0135:  BSF    05.1
John P



Joined: 17 Sep 2003
Posts: 331

View user's profile Send private message

PostPosted: Mon Mar 15, 2010 1:48 pm     Reply with quote

You could save a little time by setting the two pins in port A like this:

Code:

  output_bit(PIN_A2, 0);
  if (bit_test(temp, 1))
    output_bit(PIN_A2, 1);


That's if it's OK to set them low, then high again whenever a 1 gets sent out.

But really, the best thing would be to put all 8 outputs on the same port. It would be faster, and all the bits would change at one time.
dezso



Joined: 04 Mar 2010
Posts: 102

View user's profile Send private message

PostPosted: Mon Mar 15, 2010 8:01 pm     Reply with quote

I was just thinking, the write to the designated port will occur in 2 or more write cycle, your sine wave will be very choppy since the portc update before porta or vice verse.
Like .233 will output to 0b11101001, portc 0b111010 will set your R2R to a specific voltage than in a few us later porta add 0b01 to the final voltage.
mindstorm88



Joined: 06 Dec 2006
Posts: 102
Location: Montreal , Canada

View user's profile Send private message

PostPosted: Tue Mar 16, 2010 4:58 am     Reply with quote

PCM way reduce from 96 uSec to 18 uSec , this give a very crude wave that could be cleaned by a good filter !!! Thanks guys all this is a very good learning experience !!!
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