|
|
View previous topic :: View next topic |
Author |
Message |
jonfs2000
Joined: 19 Aug 2020 Posts: 4
|
Register definitions, SFR |
Posted: Wed Aug 19, 2020 2:47 am |
|
|
Hi,
I'm new to CCS. Sorry, if this question has been answered already somewhere in the forum.
I want to write to the register but I cannot find the definitions on the header file.
For example on TIMER2, I would like to
or something like this by setting/clearing each bit
Code: |
t2con = 0;
// Pre 16
t2con.T2CKPS0 = 1;
t2con.T2CKPS1 = 1;
// Post 5
t2con.T2OUTPS0 = 1;
t2con.T2OUTPS1 = 0;
t2con.T2OUTPS2 = 0;
t2con.T2OUTPS3 = 1;
pr2 = 99;
t2con.TMR2ON = 1; |
I would like to do this for all the modules I need by writing directly to the SFR rather than using the library functions provided.
On my previous compiler, the header file for the device contains all the registers and bits definitions so I can simply write like this.
Code: | ssp1con1.SSPEN=0; //SPI OFF |
Many thanks
John |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Aug 19, 2020 3:02 am |
|
|
Do you have the command line compiler, or the IDE?.
If you have the IDE, then select:
Tools
Device Editor
Then on the top bar select 'Registers'
Then select 'Make include file'.
This will then create an include file, giving names for every register and bit.
However before doing this, _STOP_. CCS does not require this. It is almost
never necessary to directly access a register in CCS.
The internal functions do pretty much everything, and the key is much more
portably.
So timer2, will have a set of definitions in the processor include file,
something like:
Code: |
////////////////////////////////////////////////////////////////// Timer 2
// Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2
// Timer 2 Prototypes:
_bif void setup_timer_2(int8 mode, int8 period, int8 postscale);
_bif int8 get_timer2(void);
_bif void set_timer2(int8 value);
// Constants used for SETUP_TIMER_2() are:
#define T2_DISABLED 0
#define T2_DIV_BY_1 4
#define T2_DIV_BY_4 5
#define T2_DIV_BY_16 6
#define T2_DIV_BY_64 7
|
and you can setup timer 2, for (say) a /4 prescaler, and a /6
postscaler, with simply:
setup_timer2(T2_DIV_BY_4, 127,6);
Far easier, and much plainer than what you are doing.
Think one thousand times before doing direct accesses. This is not how
to work in CCS.... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Wed Aug 19, 2020 4:38 am |
|
|
As others have pointed out , it's a lot easier and safer to use the CCS functions or 'way' of accessing the SFRs.
However if you really,really want or need to directly 'diddle bits', I suggest go the next step and learn PIC assembler ! Only 30-35 instructions (less than number of fuses) and you're talking to the PIC directly.
When I bought PCM 2.534, 2+ decades ago, I had to self-teach myself 'C' as I'd only programmed PICs in Assembler. I quickly appreciated CCS for creating the 'functions' to setup/control the SFRs as well as the 100s of examples !
You should take advantage of what they've done. If you manually set the wrong bit in an SFR, you could spend hours if not days, trying to figure it out ! BTDT.... still do on occasion.....sigh.
Jay |
|
|
jonfs2000
Joined: 19 Aug 2020 Posts: 4
|
|
Posted: Wed Aug 19, 2020 6:22 am |
|
|
Thank you all for your reply.
I'm pretty old styled and got used to writing directly to registers(specially during debugging) for nearly 19yrs now. I have done the same for PIC, ARM Cortex, MSP420 etc. Though I use the library functions provided, sometimes I need to directly to write to registers.
I read the datasheet and I set/clear the bits accordingly. And it gives me a satisfactions that I have done as per datasheet..
I still need to read/write to registers directly while I'm getting used to new compiler and using CCS library functions. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Aug 19, 2020 7:50 am |
|
|
Personally, for the small number of registers it is worth talking to directly, the
'SFR' and 'BIT' abilities of the compiler are by far the most friendly way of
working.
For T1CON (assuming a PIC18):
Code: |
#BIT RD16=getenv("BIT:RD16")
#BIT T1RUN=getenv("BIT:T1RUN")
#BIT T1CKPS1=getenv("BIT:T1CKPS1")
#BIT T1CKPS0=getenv("BIT:T1CKPS0")
#BIT T1OSCEN=getenv("BIT:T1OSCEN")
#BIT T1SYNC=getenv("BIT:T1SYNC")
#BIT TMR1CS=getenv("BIT:TMR1CS")
#BIT TMR1ON=getenv("BIT:TMR1ON")
#byte T1CON=getenv("SFR:T1CON")
|
This then gives you one bit variables corresponding exactly to the data
sheet names, and a byte variable corresponding to the entire register. |
|
|
jonfs2000
Joined: 19 Aug 2020 Posts: 4
|
|
Posted: Sat Aug 22, 2020 3:06 pm |
|
|
Thank you Ttelmah, it worked! 👍
Ttelmah wrote: | Do you have the command line compiler, or the IDE?.
If you have the IDE, then select:
Tools
Device Editor
Then on the top bar select 'Registers'
Then select 'Make include file'.
This will then create an include file, giving names for every register and bit.
However before doing this, _STOP_. CCS does not require this. It is almost
never necessary to directly access a register in CCS.
The internal functions do pretty much everything, and the key is much more
portably.
So timer2, will have a set of definitions in the processor include file,
something like:
Code: |
////////////////////////////////////////////////////////////////// Timer 2
// Timer 2 Functions: SETUP_TIMER_2, GET_TIMER2, SET_TIMER2
// Timer 2 Prototypes:
_bif void setup_timer_2(int8 mode, int8 period, int8 postscale);
_bif int8 get_timer2(void);
_bif void set_timer2(int8 value);
// Constants used for SETUP_TIMER_2() are:
#define T2_DISABLED 0
#define T2_DIV_BY_1 4
#define T2_DIV_BY_4 5
#define T2_DIV_BY_16 6
#define T2_DIV_BY_64 7
|
and you can setup timer 2, for (say) a /4 prescaler, and a /6
postscaler, with simply:
setup_timer2(T2_DIV_BY_4, 127,6);
Far easier, and much plainer than what you are doing.
Think one thousand times before doing direct accesses. This is not how
to work in CCS.... |
|
|
|
|
|
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
|