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 CCS Technical Support

program speed

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



Joined: 20 Mar 2010
Posts: 193
Location: Auckland NZ

View user's profile Send private message

program speed
PostPosted: Fri Sep 17, 2010 7:36 am     Reply with quote

Hi,
I have a small question.
I have noticed that execution of simple if( a==b) {} is faster than if this is not true. It the function does not return true I can see significant delay in program processing. Anyone know anything about such thing?
Code:

   if (server_mode == 1) {
      if (bus_mode == 1) {
         fprintf(eth,"\n>CPU: Server mode can't operate when Bus mode is ON!");
         server_mode = 0;
      } //*
      else {
         if (general_tasks >= general_task_delay) {
            tasks();
            ping();
         } //*
      } //*
   } //*

This creates such delay if true that I can see it...very strange...
It affects ram operation too (overrides data).
I initiate vars in globals like this:

Code:
long int general_task_delay = 2000;
long int general_tasks = 0;
short bus_mode = 0;
short server_mode = 0;

I wonder if it is "short" responsible for my troubles...

Thank you
_________________
Help "d" others and then you shell receive some help from "d" others.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Fri Sep 17, 2010 10:17 am     Reply with quote

You talk about a function returning true, but there is no function shown in your code doing this.
If the test 'a==b', is true, then there is going to be a significant delay. Not from the test, but from the code called. If 'bus_mode' is true as well, you are going to take a huge time printing a message - if the serial is running at 9600bps, then something over 50mSec, going the other way, if the next test on 'general_tasks' is true, you have all the time involved in 'tasks', and 'ping'.
The total time for a bit mode test on a short variable, is normally just a couple of machine cycles. About the quickest test possible (slightly longer if a bank switch is needed).
You have something else wrong, probably in one of the subroutines involved, or the code you are using to test the performance.

As a comment, remember the 'non zero', is inherently true, so you could write:

if (server_mode)

Also easier to understand if you use the boolean defines, so:

server_mode=FALSE;

These won't save anything though, the compiler does this for you.

Best Wishes
Linuxbuilders



Joined: 20 Mar 2010
Posts: 193
Location: Auckland NZ

View user's profile Send private message

PostPosted: Fri Sep 17, 2010 6:47 pm     Reply with quote

thank you
_________________
Help "d" others and then you shell receive some help from "d" others.
Linuxbuilders



Joined: 20 Mar 2010
Posts: 193
Location: Auckland NZ

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 12:48 am     Reply with quote

I have found a problem, PCH 4.107 is initiating PLL wrong on the chip.

I am using 10Mhz external crystal and want it to clock mpu with 40MHz.

according to datasheet:

HSPLL High-Speed Crystal/Resonator mode,
PLL can be enabled or disabled in
software, crystal/resonator connected
between RA6 and RA7.

However fuses for this chip does not have such option.
Code:

//////// Fuses: HS,EC,DEBUG,NODEBUG,XINST,NOXINST,STVREN,NOSTVREN,WDT,NOWDT
//////// Fuses: PROTECT,NOPROTECT,WDT1,WDT2,WDT4,WDT8,WDT16,WDT32,WDT64
//////// Fuses: WDT128,WDT256,WDT512,WDT1024,WDT2048,WDT4096,WDT8192
//////// Fuses: WDT16384,WDT32768,FCMEN,NOFCMEN,IESO,NOIESO,IOL1WAY
//////// Fuses: NOIOL1WAY,INTRC,WPCFG,NOWPCFG,WPBEG,WPEND,WPDIS,NOWPDIS
//////// Fuses: LPT1OSC,NOLPT1OSC,T1DIG,NOT1DIG,MSSPMSK5,MSSPMSK7,INTRC_PLL
//////// Fuses: INTRC_PLL_IO,INTRC,DSWDT2,DSWDT8,DSWDT32,DSWDT128,DSWDT512
//////// Fuses: DSWDT2048,DSWDT8192,DSWDT32768,DSWDT131072,DSWDT524288
//////// Fuses: DSWDT2097152,DSWDT8388608,DSWDT33554432,DSWDT134217728
//////// Fuses: DSWDT536870912,DSWDT2147483648,DSWDT,NODSWDT,DSBOR,NODSBOR
//////// Fuses: RTCOSC_INT,RTCOSC_T1,DSWDTOSC_INT,DSWDTOSC_T1,WPFP,NOWPFP


What I had in my code was H4_SW and this was compiled by 4.107. After upgrade to 4.110 compiler didn't agree with this option. When I have done everything as per 18F45j11.h then whole thing went to heaven and is very happy since.

Any idea how to get HSPLL working on this chip?

This is my setup:
Code:

#FUSES WDT                       //No Watch Dog Timer
#FUSES WDT2048                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NOPROTECT                //Code not protected from reading
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES IOL1WAY                  //Allows only one reconfiguration of peripheral pins
#FUSES NOWPCFG               
#FUSES WPEND                 
#FUSES WPDIS                 
#FUSES NOLPT1OSC                //Timer1 configured for higher power operation
#FUSES NOT1DIG               
#FUSES MSSPMSK7             
#FUSES DSWDT2048             
#FUSES NODSWDT               
#FUSES NODSBOR               
#FUSES RTCOSC_INT           
#FUSES DSWDTOSC_INT         
#FUSES WPFP                 
#use delay(clock=10M,RESTART_WDT)


thnx
_________________
Help "d" others and then you shell receive some help from "d" others.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 2:00 am     Reply with quote

clock=10M, is never going to be 'right' for a 40MHz system....

clock=40M,crystal=10M

Best Wishes
Linuxbuilders



Joined: 20 Mar 2010
Posts: 193
Location: Auckland NZ

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 2:04 am     Reply with quote

this gives an error - NO PLL
_________________
Help "d" others and then you shell receive some help from "d" others.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 2:33 am     Reply with quote

So what chip is this?.
You talk about having done everything 'as per 18F45j11.h', but don't tell us what chip you actually have.

Best Wishes
Linuxbuilders



Joined: 20 Mar 2010
Posts: 193
Location: Auckland NZ

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 2:39 am     Reply with quote

that is the chip thnx, if I tell it to be 40mhz then I get rubbish from serial port, if I do it as you suggest (what is correct) then I get an error. so it must be set for 10Mhz and somehow I need to tell it to be PLL but the only way I can see it is by setup_oscillator(OSC_NORMAL, OSC_PLL_ON); which I do not think is intended for this purpose. I think CCS has missed this bit (H4) in .h file.

my setup is here:

Quote:

#FUSES WDT
#FUSES WDT2048
#FUSES HS
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES IOL1WAY //Allows only one reconfiguration of peripheral pins
#FUSES NOWPCFG
#FUSES WPEND
#FUSES WPDIS
#FUSES NOLPT1OSC //Timer1 configured for higher power operation
#FUSES NOT1DIG
#FUSES MSSPMSK7
#FUSES DSWDT2048
#FUSES NODSWDT
#FUSES NODSBOR
#FUSES RTCOSC_INT
#FUSES DSWDTOSC_INT
#FUSES WPFP
#use delay(clock=10M,RESTART_WDT)

_________________
Help "d" others and then you shell receive some help from "d" others.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 2:55 am     Reply with quote

4.107, for the 18F45J11, lists E4_SW as a legitimate fuse. Though I don't normally use the Wizard, selecting 40MHz, with PLL, gives the following fuses:
Code:

#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES E4_SW   

Which compiles happily, with the clock line posted, and seems to be operating at 40Mhz in MPLAB.

Best Wishes
Linuxbuilders



Joined: 20 Mar 2010
Posts: 193
Location: Auckland NZ

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 3:07 am     Reply with quote

hmm...that is what I get from 4.110

Quote:

//////// Standard Header file for the PIC18F45J11 device ////////////////
#device PIC18F45J11
#nolist
//////// Program memory: 16380x16 Data RAM: 3840 Stack: 31
//////// I/O: 34 Analog Pins: 13
//////// C Scratch area: 00 ID Location: 0000
//////// Fuses: HS,EC,DEBUG,NODEBUG,XINST,NOXINST,STVREN,NOSTVREN,WDT,NOWDT
//////// Fuses: PROTECT,NOPROTECT,WDT1,WDT2,WDT4,WDT8,WDT16,WDT32,WDT64
//////// Fuses: WDT128,WDT256,WDT512,WDT1024,WDT2048,WDT4096,WDT8192
//////// Fuses: WDT16384,WDT32768,FCMEN,NOFCMEN,IESO,NOIESO,IOL1WAY
//////// Fuses: NOIOL1WAY,INTRC,WPCFG,NOWPCFG,WPBEG,WPEND,WPDIS,NOWPDIS
//////// Fuses: LPT1OSC,NOLPT1OSC,T1DIG,NOT1DIG,MSSPMSK5,MSSPMSK7,INTRC_PLL
//////// Fuses: INTRC_PLL_IO,INTRC,DSWDT2,DSWDT8,DSWDT32,DSWDT128,DSWDT512
//////// Fuses: DSWDT2048,DSWDT8192,DSWDT32768,DSWDT131072,DSWDT524288
//////// Fuses: DSWDT2097152,DSWDT8388608,DSWDT33554432,DSWDT134217728
//////// Fuses: DSWDT536870912,DSWDT2147483648,DSWDT,NODSWDT,DSBOR,NODSBOR
//////// Fuses: RTCOSC_INT,RTCOSC_T1,DSWDTOSC_INT,DSWDTOSC_T1,WPFP,NOWPFP
////////
////////////////////////////////////////////////////////////////// I/O
// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
// PORT_x_PULLUPS(), INPUT(),
// OUTPUT_LOW(), OUTPUT_HIGH(),
// OUTPUT_FLOAT(), OUTPUT_BIT()
// Constants used to identify pins in the above are:



it does not recognize H4,E4, and _SW... Where is "fuses" setup nested? I think it will be simple mistake and may be easily corrected by adding proper bits into config file...


When I go to chipedit then I see no data for HSPLL, There is only HS mask 0007 and value 0004 CW 2.

thnx
_________________
Help "d" others and then you shell receive some help from "d" others.
Ttelmah



Joined: 11 Mar 2010
Posts: 19552

View user's profile Send private message

PostPosted: Sat Sep 18, 2010 8:10 am     Reply with quote

It is worth saying, that the fuse 'listing' at the top of the header file, means _nothing_. It is not used by the compiler, and does not always relate to the real fuses available. It was there as an 'aide memoire' with the early compilers, but now is so often wrong that using it is pointless...
If you have the ICD, then the 'valid fuses' pull down, does give a list that normally seems to agree with the real fuses.
Now, it appears that 4.107, had 'lost' the actual 'enable PLL in the fuses' fuse setting, and this is back in the later compilers as HSPLL.
4.110, had a lot of bugs (look at the posts here).

Best Wishes
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