Ccs C Manual PDF
Ccs C Manual PDF
Ccs C Manual PDF
February 2005
Table Of Contents
Overview ................................................................................................................1
PCB, PCM and PCH Overview ..........................................................................1
Technical Support...............................................................................................1
Installation ..........................................................................................................2
Invoking the Command Line Compiler ...............................................................2
MPLAB Integration .............................................................................................4
Directories ..........................................................................................................4
File Formats........................................................................................................5
Direct Device Programming ...............................................................................5
Device Calibration Data......................................................................................5
Utility Programs ..................................................................................................6
PCW IDE ................................................................................................................7
File Menu............................................................................................................7
Project Menu ......................................................................................................8
Edit Menu ...........................................................................................................9
Options Menu ...................................................................................................10
Compile.............................................................................................................13
View Menu........................................................................................................13
Tools Menu.......................................................................................................16
Help Menu ........................................................................................................18
PCW Editor Keys..............................................................................................19
Project Wizard ..................................................................................................21
CCS Debugger.....................................................................................................23
Debugger - Overview........................................................................................23
Debugger - Menu..............................................................................................23
Debugger - Configure .......................................................................................23
Debugger - Control ...........................................................................................24
Debugger- Enable/Disable ...............................................................................24
Debugger - Watches.........................................................................................24
Debugger - Breaks ...........................................................................................25
Debugger - RAM...............................................................................................25
Debugger - ROM ..............................................................................................25
Debugger -Data EEPROM ...............................................................................25
Debugger - Stack..............................................................................................26
Debugger - Eval................................................................................................26
Debugger - Log.................................................................................................26
Debugger - Monitor...........................................................................................26
Debugger - Peripherals ....................................................................................27
Debugger - Snapshot .......................................................................................27
Pre-Processor ......................................................................................................29
i
Table Of Contents
PRE-PROCESSOR ..........................................................................................29
Pre-Processor Directives..................................................................................30
#ASM ................................................................................................................30
#ENDASM ........................................................................................................30
#BIT ..................................................................................................................34
#BUILD .............................................................................................................34
#BYTE ..............................................................................................................35
#CASE ..............................................................................................................36
__DATE__ ........................................................................................................37
#DEFINE ..........................................................................................................37
#DEVICE ..........................................................................................................38
__DEVICE__ ....................................................................................................39
#ERROR...........................................................................................................39
__FILE__ ..........................................................................................................40
#FILL_ROM ......................................................................................................40
#FUSES............................................................................................................41
#ID ....................................................................................................................42
#IF expr.............................................................................................................43
#ELSE...............................................................................................................43
#ELIF ................................................................................................................43
#ENDIF .............................................................................................................43
#IGNORE_WARNINGS....................................................................................44
#IFDEF .............................................................................................................44
#IFNDEF...........................................................................................................44
#ELSE...............................................................................................................44
#ELIF ................................................................................................................44
#ENDIF .............................................................................................................44
#INCLUDE........................................................................................................45
#INLINE ............................................................................................................46
#INT_xxxx.........................................................................................................46
#INT_DEFAULT ...............................................................................................48
#INT_GLOBAL .................................................................................................49
__LINE__..........................................................................................................49
#LIST ................................................................................................................50
#LOCATE .........................................................................................................50
#NOLIST...........................................................................................................51
#OPT ................................................................................................................51
#ORG................................................................................................................52
__PCB__ ..........................................................................................................53
__PCM__..........................................................................................................54
__PCH __ .........................................................................................................54
#PRAGMA ........................................................................................................55
#PRIORITY.......................................................................................................55
ii
Table Of Contents
#RESERVE ......................................................................................................56
#ROM ...............................................................................................................56
#SERIALIZE .....................................................................................................57
#SEPARATE ....................................................................................................59
__TIME __ ........................................................................................................59
#TYPE ..............................................................................................................60
#UNDEF ...........................................................................................................60
#USE DELAY ...................................................................................................61
#USE FAST_IO ................................................................................................61
#USE FIXED_IO...............................................................................................62
#USE I2C..........................................................................................................63
#USE RS232 ...................................................................................................64
#USE STANDARD_IO......................................................................................67
#ZERO_RAM....................................................................................................67
Data Definitions....................................................................................................69
Data Types .......................................................................................................69
Function Definition ...............................................................................................71
Function Definition............................................................................................71
Reference Parameters .....................................................................................72
C Statements And Expressions ...........................................................................73
Program Syntax................................................................................................73
Comment ..........................................................................................................73
STATEMENTS .................................................................................................74
Expressions ......................................................................................................75
Operators..........................................................................................................76
Operator Precedence .......................................................................................77
Trigraph Sequences .........................................................................................77
Built-In Functions .................................................................................................79
ABS() ................................................................................................................82
ACOS() .............................................................................................................82
ASIN() ...............................................................................................................82
ASSERT().........................................................................................................82
ATOF()..............................................................................................................83
ATOI() ...............................................................................................................84
ATOL() ..............................................................................................................84
ATOI32() ...........................................................................................................84
BIT_CLEAR()....................................................................................................85
BIT_SET().........................................................................................................86
BIT_TEST() ......................................................................................................86
CALLOC().........................................................................................................87
CEIL() ...............................................................................................................88
COS()................................................................................................................88
COSH() .............................................................................................................89
iii
Table Of Contents
CLEAR_INTERRUPT().....................................................................................89
DELAY_CYCLES() ...........................................................................................89
DELAY_MS() ....................................................................................................90
DELAY_US() ....................................................................................................91
DISABLE_INTERRUPTS() ...............................................................................92
DIV() .................................................................................................................93
LDIV() ...............................................................................................................93
ENABLE_INTERRUPTS() ................................................................................94
ERASE_PROGRAM_EEPROM().....................................................................94
EXP() ................................................................................................................95
EXT_INT_EDGE() ............................................................................................96
FABS() ..............................................................................................................97
FLOOR() ...........................................................................................................97
FMOD().............................................................................................................98
FREE()..............................................................................................................98
FREXP() ...........................................................................................................99
GET_TIMERx()...............................................................................................100
GETC() ...........................................................................................................101
GETCH().........................................................................................................101
GETCHAR()....................................................................................................101
FGETC() .........................................................................................................101
GETENV() ......................................................................................................102
GETS()............................................................................................................105
FGETS() .........................................................................................................105
GOTO_ADDRESS() .......................................................................................105
I2C_POLL() ....................................................................................................106
I2C_READ()....................................................................................................107
I2C_START()..................................................................................................108
I2C_STOP()....................................................................................................108
I2C_WRITE() ..................................................................................................109
INPUT()...........................................................................................................110
INPUT_STATE().............................................................................................111
INPUT_x().......................................................................................................111
ISALNUM(char) ..............................................................................................112
ISALPHA(char) ...............................................................................................112
ISDIGIT(char) .................................................................................................112
ISLOWER(char)..............................................................................................112
ISSPACE(char)...............................................................................................112
ISUPPER(char) ..............................................................................................112
ISXDIGIT(char)...............................................................................................112
ISCNTRL(x) ....................................................................................................112
ISGRAPH(x) ...................................................................................................112
ISPRINT(x) .....................................................................................................112
iv
Table Of Contents
ISPUNCT(x)....................................................................................................112
ISAMOUNG()..................................................................................................113
KBHIT()...........................................................................................................114
LABEL_ADDRESS().......................................................................................115
LABS() ............................................................................................................116
LCD_LOAD() ..................................................................................................116
LCD_SYMBOL() .............................................................................................117
LDEXP() .........................................................................................................118
LOG()..............................................................................................................119
LOG10()..........................................................................................................120
MAKE8() .........................................................................................................121
MAKE16() .......................................................................................................121
MAKE32() .......................................................................................................122
MALLOC() ......................................................................................................123
MEMCPY() .....................................................................................................123
MEMMOVE() ..................................................................................................123
MEMSET()......................................................................................................124
MODF()...........................................................................................................125
OFFSETOF() ..................................................................................................126
OFFSETOFBIT() ............................................................................................126
OUTPUT_A() ..................................................................................................127
OUTPUT_B() ..................................................................................................127
OUTPUT_C()..................................................................................................127
OUTPUT_D()..................................................................................................127
OUTPUT_E() ..................................................................................................127
OUTPUT_BIT()...............................................................................................127
OUTPUT_FLOAT().........................................................................................128
OUTPUT_HIGH() ...........................................................................................129
OUTPUT_LOW() ............................................................................................130
OUTPUT_TOGGLE() .....................................................................................130
PERROR()......................................................................................................131
PORT_A_PULLUPS() ....................................................................................132
PORT_B_PULLUPS() ....................................................................................132
POW().............................................................................................................133
POWER CONTROL PWM..............................................................................134
PRINTF() ........................................................................................................135
FPRINTF() ......................................................................................................135
PSP_OUTPUT_FULL() ..................................................................................137
PSP_INPUT_FULL() ......................................................................................137
PSP_OVERFLOW() .......................................................................................137
PUTC()............................................................................................................138
PUTCHAR()....................................................................................................138
FPUTC() .........................................................................................................138
v
Table Of Contents
PUTS()............................................................................................................139
FPUTS()..........................................................................................................139
RAND() ...........................................................................................................139
READ_ADC()..................................................................................................140
READ_BANK() ...............................................................................................141
READ_CALIBRATION() .................................................................................142
READ_EEPROM()..........................................................................................143
READ_PROGRAM_EEPROM().....................................................................144
READ_PROGRAM_MEMORY() ....................................................................144
READ_EXTERNAL_MEMORY()....................................................................144
REALLOC() ....................................................................................................145
RESET_CPU()................................................................................................146
RESTART_CAUSE() ......................................................................................147
RESTART_WDT() ..........................................................................................147
ROTATE_LEFT()............................................................................................148
ROTATE_RIGHT() .........................................................................................149
SET_ADC_CHANNEL() .................................................................................150
SET_PWM1_DUTY()......................................................................................151
SET_PWM2_DUTY()......................................................................................151
SET_PWM3_DUTY()......................................................................................151
SET_PWM4_DUTY()......................................................................................151
SET_PWM5_DUTY()......................................................................................151
SET_POWER_PWMX_DUTY() .....................................................................152
SET_POWER_PWM_OVERRIDE()...............................................................152
SET_RTCC() ..................................................................................................153
SET_TIMER0() ...............................................................................................153
SET_TIMER1() ...............................................................................................153
SET_TIMER2() ...............................................................................................153
SET_TIMER3() ...............................................................................................153
SET_TIMER4() ...............................................................................................153
SET_TRIS_A()................................................................................................154
SET_TRIS_B()................................................................................................154
SET_TRIS_C() ...............................................................................................154
SET_TRIS_D() ...............................................................................................154
SET_TRIS_E()................................................................................................154
SET_UART_SPEED() ....................................................................................155
SETUP_ADC(mode).......................................................................................156
SETUP_ADC_PORTS() .................................................................................157
SETUP_CCP1()..............................................................................................158
SETUP_CCP2()..............................................................................................158
SETUP_CCP3()..............................................................................................158
SETUP_CCP4()..............................................................................................158
SETUP_CCP5()..............................................................................................158
vi
Table Of Contents
SETUP_COMPARATOR() .............................................................................159
SETUP_COUNTERS() ...................................................................................160
SETUP_EXTERNAL_MEMORY()..................................................................161
SETUP_LCD() ................................................................................................162
SETUP_OSCILLATOR() ................................................................................162
SETUP_POWER_PWM()...............................................................................164
SETUP_POWER_PWM_PINS() ....................................................................165
SETUP_PSP() ................................................................................................166
SETUP_SPI() .................................................................................................167
SETUP_TIMER_0() ........................................................................................167
SETUP_TIMER_1() ........................................................................................168
SETUP_TIMER_2() ........................................................................................169
SETUP_TIMER_3() ........................................................................................170
SETUP_TIMER_5() ........................................................................................172
SETUP_UART() .............................................................................................172
SETUP_VREF()..............................................................................................173
SETUP_WDT() ...............................................................................................174
SHIFT_LEFT() ................................................................................................175
SHIFT_RIGHT()..............................................................................................176
SIN() ...............................................................................................................177
COS()..............................................................................................................177
TAN() ..............................................................................................................177
ASIN() .............................................................................................................177
ACOS() ...........................................................................................................177
ATAN()............................................................................................................177
SINH().............................................................................................................177
COSH() ...........................................................................................................177
TANH()............................................................................................................177
ATAN2()..........................................................................................................177
SINH().............................................................................................................179
SLEEP()..........................................................................................................179
SPI_DATA_IS_IN().........................................................................................180
SPI_READ() ...................................................................................................180
SPI_WRITE()..................................................................................................181
SPRINTF()......................................................................................................182
SQRT() ...........................................................................................................183
SRAND().........................................................................................................184
STANDARD STRING FUNCTIONS ...............................................................184
MEMCHR() .....................................................................................................184
MEMCMP().....................................................................................................184
STRCAT().......................................................................................................184
STRCHR() ......................................................................................................184
STRCMP() ......................................................................................................184
vii
Table Of Contents
STRCOLL().....................................................................................................184
STRCSPN() ....................................................................................................184
STRICMP() .....................................................................................................184
STRLEN() .......................................................................................................184
STRLWR() ......................................................................................................185
STRNCAT() ....................................................................................................185
STRNCMP() ...................................................................................................185
STRNCPY() ....................................................................................................185
STRPBRK() ....................................................................................................185
STRRCHR()....................................................................................................185
STRSPN().......................................................................................................185
STRSTR().......................................................................................................185
STRXFRM()....................................................................................................185
STRCPY().......................................................................................................187
STRTOD() ......................................................................................................187
STRTOK().......................................................................................................188
STRTOL() .......................................................................................................189
STRTOUL() ....................................................................................................190
SWAP()...........................................................................................................191
TAN() ..............................................................................................................192
TANH()............................................................................................................192
TOLOWER() ...................................................................................................192
TOUPPER()....................................................................................................192
WRITE_BANK()..............................................................................................193
WRITE_EEPROM() ........................................................................................194
WRITE_EXTERNAL_MEMORY() ..................................................................196
WRITE_PROGRAM_EEPROM() ...................................................................197
WRITE_PROGRAM_MEMORY()...................................................................197
Standard C Definitions .......................................................................................199
errno.h ............................................................................................................199
float.h ..............................................................................................................199
limits.h.............................................................................................................201
locale.h ...........................................................................................................201
setjmp.h ..........................................................................................................201
stddef.h ...........................................................................................................202
stdio.h .............................................................................................................202
stdlib.h ............................................................................................................203
Compiler Error Messages ..................................................................................205
Compiler Warning Messages .........................................................................216
Common Questions And Answers .....................................................................219
How does one map a variable to an I/O port?................................................219
Why is the RS-232 not working right? ............................................................221
How can I use two or more RS-232 ports on one PIC®?...............................223
viii
Table Of Contents
ix
Overview
PCB, PCM and PCH Overview
The PCB, PCM and PCH are separate compilers. PCB is for 12 bit opcodes,
PCM is for 14 bit opcodes and PCH is for the 16 and 18 bit PICmicro® MCU.
Since much is in common among the compilers, all three are covered in this
reference manual. Features and limitations that apply to only specific controllers
are indicated within. These compilers are specially designed to meet the unique
needs of the PICmicro® MCU controllers. These tools allow developers to
quickly design application software for these controllers in a highly readable,
high-level language.
Technical Support
http://www.ccsinfo.com/download.shtml
for 30 days after the initial purchase. For one year’s worth of updates, you can
purchase a Maintenance Plan directly from CCS. Also found on our web page
are known bugs, the latest version of the software, and other news about the
compiler.
We strive to ensure that each upgrade provides greater ease of use along with
minimal, if any, problems. However, this is not always possible. To ensure that
all problems that you encounter are corrected in a diligent manner, we suggest
that you email us at support@ccsinfo.com outlining your specific problem along
with an attachment of your file. This will ensure that solutions can be suggested
to correct any problem(s) that may arise. We try to respond in a timely manner
and take pride in our technical support.
1
C Compiler Reference Manual
Overview
Secondly, if we are unable to solve your problem by email, feel free to telephone
us at (262) 797-0455 x 32. Please have all your supporting documentation on-
hand so that your questions can be answered in an efficient manner. Again, we
will make every attempt to solve any problem(s) that you may have. Suggestions
for improving our software are always welcome and appreciated.
Installation
PCW Installation:
Insert CD ROM, select each of the programs you wish to install and follow the
on-screen instructions.
Valid options:
+FB Select PCB (12 bit) -D Do not create debug file
+FM Select PCM (14 bit) +DS Standard .COD format debug file
+FH Select PCH +DM .MAP format debug file
(PIC18XXX)
+FS Select SXC (SX) +DC Expanded .COD format debug
file
+ES Standard error file +EO Old error file format
+T Create call tree (.TRE) -T Do not generate a tree file
+A Create stats file (.STA) -A Do not generate a statistics file
+EW Show warning -EW Suppress warnings (use with
messages +EA)
+EA Show all error -E Only show first error
messages and all
warnings
+Yx Optimization level x (0-9) +DF Enables the ouput of a COFF
debug file.
The xxx in the following are optional. If included it sets the file extension:
2
Overview
+LNxxx Normal list file +O8xxx 8 bit Intel HEX output file
+LSxxx MPASM format +OWxxx 16 bit Intel HEX output file
+LOxxx Old MPASM list file +OBxxx Binary output file
+LYxxx Symbolic list file -O Do not create object file
-L Do not create list file
#xxx="yyy" Set a global #define for id xxx with a value of yyy, example:
#debug="true"
+Gxxx="yyy" Same as #xxx="yyy"
+STDOUT Outputs errors to STDOUT (for use with third party editors)
+SETUP Install CCSC into MPLAB (no compile is done)
+V Show compiler version (no compile is done)
+Q Show all valid devices in database (no compile is done)
3
C Compiler Reference Manual
Overview
If @filename appears on the CCSC command line, command line options will be
read from the specified file. Parameters may appear on multiple lines in the file.
If the file CCSC.INI exists in the same directory as CCSC.EXE, then command
line parameters are read from that file before they are processed on the
command line.
Examples:
CCSC +FM C:\PICSTUFF\TEST.C
CCSC +FM +P +T TEST.C
MPLAB Integration
MPLAB 5:
If MPLAB is installed before the compiler, then integration with MPLAB is
automatic. Otherwise use the following command:
CCSC +SETUP
MPLAB 6:
A plug-in program must be executed on the computer with MPLAB 6 before
MPLAB 6 can use the CCS C compiler. If this plug-in did not come with your
version of MPLAB you should download it from the download page of the CCS
web site.
The specific instructions for compiling and running from MPLAB will vary
depending on the version. In general when creating a project be sure to select
the CCS C Compiler as the tool suite, then follow the normal MPLAB instructions.
Directories
The compiler will search the following directories for Include files.
• Directories listed on the command line
• Directories specified in the .PJT file
• The same directory as the source file
By default, the compiler files are put in C:\Program Files\PICC and the example
programs and all Include files are in C:\Program Files\PICC\EXAMPLES.
4
Overview
The compiler itself is a DLL file. The DLL files are in a DLL directory by default in
C:\Program Files\PICC\DLL. Old compiler versions may be kept by renaming
this directory.
File Formats
The compiler can output 8 bit hex, 16 bit hex, and binary files. Two listing formats
are available. Standard format resembles the Microchip tools and may be
required by some third-party tools. The simple format is easier to read. The
debug file may either be a Microchip .COD file or Advanced Transdata .MAP file.
All file formats and extensions are selected via the Options|File Formats menu
option in the Windows IDE.
The IDE has a program option in the main menu bar. When invoked, the IDE will
issue a command to start the user's device programmer. The commands are
specified in the Options|Debugger/Programer window. The %H is replaced
with the HEX filename and %D is replaced with the device number. Put a ! at the
end of the command line if you would like a pause before returning to IDE. Only
programs that can be invoked by a command will work with this option.
Some devices from Microchip have calibration data programmed into the
program area when shipped from the factory. Each part has its own unique data.
This poses some special problems during development. When an UV erasable
(windowed) part is erased, the calibration data is erased as well. Calibration data
can be forced into the chip during programming by using a #ROM directive with
the appropriate data.
The PCW package includes a utility program to help streamline this process.
When a new chip is purchased, the chip should be read into a hex file. Execute
the Tools|Extract Cal Data Utility and select a name (.C) for this part. The
utility will create an Include File with specified name that will have the correct
#ROM directives for the part. During prototype development add a #Include
directive and change the name before each build to the part # that is about to be
programmed. For production (OTP parts) simply comment out the #Include.
5
C Compiler Reference Manual
Overview
Utility Programs
CCSC +FM +V This will show the current compiler version. Replace
+FM with +FB or +FH for the other compilers.
6
PCW IDE
File Menu
Open Opens a file into the editor. If there are no other files
open then the project name is set to this files name.
Ctrl-O is the shortcut.
Reopen Lists all the recently used files and allows the user to
open them by selecting the appropriate file.
Save Saves the file currently selected for editing. Ctrl-S is the
shortcut.
7
C Compiler Reference Manual
PCW IDE
Close Closes the file currently open for editing. Note that while
a file is open in PCW for editing no other program may
access the file. Shift F11 is the shortcut.
Printer Setup Allows the selection of a printer and the printer settings.
Project Menu
Open A .PJT file is specified and the main source file is loaded.
8
PCW IDE
Open A .PJT file is specified and all files used in the project are
All Files opened. In order for this function to work the program must
have been compiled in order for the include files to become
known.
Reopen Lists all the recently used project files and allows the user to
open them by selecting the appropriate file.
Find Text In Searches all files in a project for a given text string.
Project
Print All Files All files in the project are printed. For this function to work the
program must have been compiled in order for the include files
to become known.
Close Project Closes all files associated with the current project.
Edit Menu
Cut Moves the selected text from the file to the clipboard.
9
C Compiler Reference Manual
PCW IDE
Match Brace Highlights the matching { or ). The editor will start counting the
open and closed braces and highlight the closing or opening
item when they match. Simply place the cursor on one of the
items and the matching one will be highlighted.
Next Window Selects the next open file as the current file for editing.
Previous Selects the previous open file as the current file for editing.
Window
Options Menu
Recall When selected PCW will always start with the same files open
Open Files as were open when it last shut down. When not selected PCW
always starts with no files open.
10
PCW IDE
Editor Options:
Syntax Highlighting
When checked the editor highlights in color C keywords and
comments.
Auto Indent
When selected and the ENTER is pressed the cursor moves to
the next line under the first character in the previous line.
When not selected the ENTER always moves to the beginning
of the next line.
WordStar keys
When selected the editing keys are WordStar style. WordStar
commands will enable additional keystrokes recognized by the
editors. See EDITOR for more information.
TABS:
Tab size
Determines the number of characters between tab positions.
Tabs allow you to set the number of spaces equated by a tab
and whether or not the tabs are converted to spaces or left as
tabs.
Keep Tabs
When selected the editor inserts a tab character (ASCII 9)
when the TAB key is pressed.
Insert Spaces
When selected and the TAB key is pressed, spaces are
inserted up to the next tab position.
Display Margin
Tab: Visible left Margin
When selected the left margin of the editor becomes visible.
11
C Compiler Reference Manual
PCW IDE
Right Margin
Position of the right margin.
Editor Font
Selects the font of the editor.
Font Size:
Size of the editor font.
Font Style
Style of the editor font (Italic/Bold/Underline).
Color Tab: This tab allows the user to select the color for syntax
highlighting.
Customize This option gives a list of icons that can be added to the tool
bar for speedy access of functionalities of the debugger.
12
PCW IDE
Compile
PCW Compile
Compiles the current project (name is in lower right) using the current compiler
(name is on the toolbar).
View Menu
C/ASM Opens the listing file in read only mode. The file must
have been compiled to view the list file. If open, this file
will be updated after each compile. The listing file
shows each C source line and the associated assembly
code generated for the line.
For Example:
……………delay_ms(3);
0F2: MOVLW 05
0F3: MOVWF 08
13
C Compiler Reference Manual
PCW IDE
Symbol Map Opens the symbol file in read only mode. The file must
have been compiled to view the symbol file. If open,
this file will be updated after each compile. The symbol
map shows each register location and what program
variables are saved in each location.
For Example:
08 @SCRATCH
09 @SCRATCH
0A TRIS_A
0B TRIS_B
0C MAIN.SCALE
0D MAIN.TIME
0E GET_SCALE.SCALE
0E PUTHEX.N
0E MAIN.@SCRATCH
Call Tree Opens the tree file in read only mode. The file must
have been compiled to view the tree file. If open, this
file will be updated after each compile. The call tree
shows each function and what functions it calls along
with the ROM and RAM usage for each.
14
PCW IDE
For Example:
Main 0/30
INIT 0/6
WAIT_FOR_HOST 0/23 (Inline)
DELAY_US 0/12
SEND_DATA 0/65
Statistics Opens the stats file in read only mode. The file must
have been compiled to view the stats file. If open, this
file will be updated after each compile. The statistics file
shows each function, the ROM and RAM usage by file,
segment and name.
Data Sheet This tool will bring up Acrobat Reader with the
manufacture data sheet for the selected part. If data
sheets were not copied to disk, then the CCS CD ROM
or a manufacture CD ROM must be inserted.
Binary file Opens a binary file in read only mode. The file is
shown in HEX and ASCII.
COD Debug file Opens a debug file in read only mode. The file is
shown in an interpreted form.
Valid Fuses Shows a list of all valid keywords for the #fuses
directive for this device.
Valid Interrupts Shows a list of all valid keywords for the #int_xxxx
directive and enable/disable _interrupts for this device.
15
C Compiler Reference Manual
PCW IDE
Tools Menu
Device Editor This tool allows the essential characteristics for each
supported processor to be specified. This tool edits a
database used by the compiler to control the
compilation. CCS maintains this database
(Devices.dat) however users may want to add new
devices or change the entries for a device for a special
application. Be aware if the database is changed and
then the software is updated, the changes will be lost.
Save your DEVICES.DAT file during an update to
prevent this.
Disassembler This tool will take as input a HEX file and will output
ASM. The ASM may be in a form that can be used as
inline ASM.
16
PCW IDE
Extract This tool will take as input a HEX file and will extract
Cal Data the calibration data to a C include file. This may be
used to maintain calibration data for a UV erasable
part. By including the include file in a program the
calibration data will be restored after re-burning the
part.
17
C Compiler Reference Manual
PCW IDE
Help Menu
Keyword at cursor Does an index search for the keyword at the cursor
location. Press F1 to use this feature.
18
PCW IDE
Cursor Movement
Left Arrow Move cursor one character to the left
Right Arrow Move cursor one character to the right
Up Arrow Move cursor one line up
Down Arrow Move cursor one line down
Ctrl Left Arrow Move cursor one word to the left
Ctrl Right Arrow Move cursor one word to the right
Home Move cursor to start of line
End Move cursor to end of line
Ctrl PgUp Move cursor to top of window
Ctrl PgDn Move cursor to bottom of window
PgUp Move cursor to previous page
PgDn Move cursor to next page
Ctrl Home Move cursor to beginning of file
Ctrl End Move cursor to end of file
Ctrl S Move cursor one character to the left
Ctrl D Move cursor one character to the right
Ctrl E Move cursor one line up
Ctrl X ** Move cursor one line down
Ctrl A Move cursor one word to the left
Ctrl F Move cursor one word to the right
Ctrl Q S Move cursor to top of window
Ctrl Q D Move cursor to bottom of window
Ctrl R Move cursor to beginning of file
Ctrl C * Move cursor to end of file
Shift ~ Where ~ is any of the above: Extend selected
area as cursor moves
19
C Compiler Reference Manual
PCW IDE
Editing Commands
F4 Select next text with matching() or {}
Ctrl # Goto bookmark # 0-9
Shift Ctrl # Set bookmark # 0-9
Ctrl Q # Goto bookmark # 0-9
Ctrl K # Set bookmark # 0-9
Ctrl W Scroll up
Ctrl Z * Scroll down
Del Delete the following character
BkSp Delete the previous character
Shift BkSp Delete the previous character
Ins Toggle Insert/Overwrite mode
Ctrl Z ** Undo last operation
Shift Ctrl Z Redo last undo
Alt BkSp Restore to original contents
Ctrl Enter Insert new line
Shift Del Cut selected text from file
Ctrl Ins Copy selected text
Shift Ins Paste
Tab Insert tab or spaces
Ctrl Tab Insert tab or spaces
Ctrl P ~ Insert control character ~ in text
Ctrl G Delete the following character
Ctrl T Delete next word
Ctrl H Delete the previous character
Ctrl Y Delete line
Ctrl Q Y Delete to end of line
Ctrl Q L Restore to original contents
Ctrl X ** Cut selected text from file
Ctrl C ** Copy selected text
Ctrl V Paste
Ctrl K R Read file at cursor location
Ctrl K W Write selected text to file
Ctrl-F ** Find text
Ctrl-R ** Replace text
F3 Repeat last find/replace
20
PCW IDE
Project Wizard
After starting the Wizard you are prompted for the name for your new main c file.
This file will be created along with a corresponding .h file.
The tabbed notebook that is displayed allows the selection of various project
parameters. For example:
• General Tab -> Select the device and clock speed
• Communications tab --> Select RS232 ports
• I/O Pins tab --> Select you own names for the various pins
When any tab is selected you may click on the blue square in the lower right and
the wizard will show you what code is generated as a result of your selections in
that screen.
After clicking OK all the code is generated and the files are opened in the PCW
editor
This command will bring up a number of fill-in-the-blank forms about your new
project. RS232 I/O and 12C characteristics, timer options, interrupts used, A/D
options, drivers needed and pin names all may be specified in the forms. When
drivers are selected, the tool will select required pins and pins that can be
combined will be. The user may edit the final pins selections. After all selections
are made an initial .c and .h files are created with #defines, #includes and
initialization commands require for your project. This is a fast way to start a new
project. Once the files are created you cannot return to the menus to make
further changes.
21
CCS Debugger
Debugger - Overview
The PCW IDE comes with a built in debugger. The debugger is started via the
Debug|Enable menu selection. This section contains the following topics:
• Debug Menu
• Configure
• Control
• Watches
• Breaks
• RAM
• ROM
• Data EEPROM
• Stack
• Eval
• Log
• Monitor
• Peripherals
• Snapshot
• Enable/Disable
Debugger - Menu
This menu contains all the debugger options if the ICD is connected to the PC
and the prototype board for debugging the C program.
Debugger - Configure
The configure tab allows a selection of what hardware the debugger connects to.
Other configuration options vary depending on the hardware debugger in use.
The configure tab also allows manually reloading the target with your code.
If the debugger window is open and the “Reload target after every compile” box
is selected every time the program is compiled the program is downloaded into
the target.
23
C Compiler Reference Manual
Debugger
A debugger profile contains all the selections in all the debugger tabs such as the
variables being watched, the debugger window position and size and the
breakpoints set. Profiles may be saved into files and loaded from the configure
tab. The last profile file saved or loaded is also saved in the projects .PJT file for
use the next time the debugger is started for that project.
Debugger - Control
The reset button puts the target into a reset condition. Note that in the source file
windows, Listing window and ROM window the current program counter line is
highlighted in yellow. This is the next line to execute.
The Go button starts the program running. While running none of the debugger
windows are updated with current information. The program stops when a break
condition is reached or the STOP button is clicked.
The STEP button will execute one C line if the source file is the active editor tab
and one assembly line if the list file is the active editor tab. STEP OVER works
like STEP except if the line is a call to another function then the whole function is
executed with one STEP OVER.
THE GO TO button will execute until the line the editor cursor is on is reached.
Debugger- Enable/Disable
This option enables/disables the debugger if it is not already in that state. The
menu option automatically changes to the other one. Shows or hides the PCW
debugger IDE as required.
Debugger - Watches
Click the + icon when the watch tab is selected to enter a new expression to
watch. The helper window that pops up will allow you to find identifiers in your
program to watch. Normal C expressions may be watched like:
X
X+Y
BUFFER[X]
24
CCS Debugger
BUUFER[X].NAME
Note that where the editor cursor is in the source file at the time you enter the
watch will affect how the expression is evaluated. For example consider you
have two functions F1 and F2 and you simply enter I as a watch expression. The
I that you get will depend on what function the cursor is in. You can proceed any
variable with a function name and period to exactly specify the variable (like:
F1.I).
Debugger - Breaks
To set a breakpoint move the editor cursor to a source or list file line. Then
select the break tab in the debugger and click the + icon.
Note that the breaks work differently for different hardware units. For example on
a PIC16 using an ICD, you can only have one breakpoint and the processor
executes the line (assembly line) the break is set on before stopping.
Debugger - RAM
The debugger RAM tab shows the target RAM. Red numbers indicate locations
that changed since the last time the program stopped. Some locations are
blacked out that either do not represent a physical register or are not available
during debugging. To change a RAM location double click the value to change.
All numbers are in hex.
Debugger - ROM
The ROM tab shows the contents of the target program memory both in hex and
disassembled. This data is initially from the HEX file and is not refreshed from
the target unless the user requests it. To reload from the target right click in the
window.
The debugger Data EEPROM tab shows the target Data EEPROM. Red
numbers indicate locations that changed since the last time the program
stopped. To change a Data EEPROM location double click the value to change.
All numbers are in hex.
25
C Compiler Reference Manual
Debugger
Debugger - Stack
This tab shows the current stack. The last function called and all it’s parameters
are shown at the top of the list.
Note that the PIC16 ICD cannot read the stack. To view the stack, a #DEVICE
CCSICD=TRUE line must appear in your source file. The compiler then
generates extra code to allow the stack to be seen by the debugger.
Debugger - Eval
The evaluation also allows calling a C function in the target. In this case you
must provide all the parameters. The result of the function is shown in the result
window. This capability is not available on all debugger platforms.
Debugger - Log
The log capability is a combination of the break, watch and snapshot. You
specify a break number and an expression to evaluate each time the break is
reached. The program is restarted after the expression is evaluated and the
result is logged in the log window. Separate multiple expressions with semi-
colons. The log window may be saved to a file. Each expression result in the file
is separated with a tab making it suitable for importing into a spreadsheet
program.
Debugger - Monitor
The monitor window shows data from the target and allows entry of data to be
sent to the target. This is done on the target like this:
#use RS232(DEBUGGER)
...
printf(“Test to run? “);
test=getc();
For the PIC16 ICD the B3 pin is used on the target to implement this capability.
The normal ICD cable is already set up correctly for this.
26
CCS Debugger
Debugger - Peripherals
This tab shows the state of the targets special function registers. This data is
organized by function. Select a function from the drop down list and the registers
associated with that function are shown. Below the registers is a listing of each
field in the registers with an interpretation of what the bit pattern means.
Debugger - Snapshot
Click on the camera icon to bring up the snapshot window. The snapshot
function allows the recording of the contents of part or all of the various debugger
windows. On the right hand side you may select what items you need to record.
The top right is a selection of where to record the data. The options are:
• Printer
• A new file
• Append to an existing file
Furthermore you can click on the APPEND COMMENT button to add a comment
to be inserted into the file.
27
Pre-Processor
PRE-PROCESSOR
29
C Compiler Reference Manual
Pre-Processor
Pre-Processor Directives
#ASM
#ENDASM
Syntax: #asm
or
#asm ASIS
code
#endasm
Purpose: The lines between the #ASM and #ENDASM are treated
as assembly code to be inserted. These may be used
anywhere an expression is allowed. The syntax is
described on the following page. The predefined
variable _RETURN_ may be used to assign a return
value to a function from the assembly code. Be aware
that any C code after the #ENDASM and before the end
of the function may corrupt the value.
30
Pre-Processor
int count;
#asm
movlw 0x8
movwf count
movlw 0
loop:
xorwf data,w
rrf data,f
decfsz count,f
goto loop
movwf _return_
#endasm
}
31
C Compiler Reference Manual
Pre-Processor
32
Pre-Processor
PIC 18
ADDWF f,d ADDWFC f,d ANDWF f,d
CLRF f COMF f,d CPFSEQ f
CPFSGT f CPFSLT f DECF f,d
DECFSZ f,d DCFSNZ f,d INCF f,d
INFSNZ f,d IORWF f,d MOVF f,d
MOVFF fs, fd MOVWF f MULWF f
NEGF f RLCF f,d RLNCF f,d
RRCF f,d RRNCF f,d SETF f
SUBFWB f,d SUBWF f,d SUBWFB f,d
SWAPF f,d TSTFSZ f XORWF f,d
BCF f,b BSF f,b BTFSC f,b
BTFSS f,b BTG f,d BC n
BN n BNC n BNN n
BNOV n BNZ n BOV n
BRA n BZ n CALL n,s
CLRWDT - DAW - GOTO n
NOP - NOP - POP -
PUSH - RCALL n RESET -
RETFIE s RETLW k RETURN s
SLEEP - ADDLW k ANDLW k
IORLW k LFSRf ,k MOVLB k
MOVLW k MULLW k RETLW k
SUBLW k XORLW k TBLRD *
TBLRD*+ TBLRD *- TBLRD +*
TBLWT* TBLWT *+ TBLWT *-
TBLWT +*
The compiler will set the access bit depending on the value of the file register.
33
C Compiler Reference Manual
Pre-Processor
#BIT
int result;
#bit result_odd = result.0
...
if (result_odd)
#BUILD
34
Pre-Processor
Start is the first ROM location and end is the last ROM
location to be used.
Examples: #build(memory=0x20000:0x2FFFF)
//Assigns memory space
#build(reset=0x200,interrupt=0x208)
//Assigns start location of
//reset and interrupt vectors
#build(reset=0x200:0x207,
interrupt=0x208:0x2ff)
//Assign limited space for
//reset and interrupt vectors.
#BYTE
Syntax: #byte id = x
35
C Compiler Reference Manual
Pre-Processor
struct {
short int r_w;
short int c_d;
int unused : 2;
int data : 4; } a_port;
#byte a_port = 5
...
a_port.c_d = 1;
#CASE
Syntax: #case
Elements: None
Examples: #case
int STATUS;
void func() {
int status;
...
STATUS = status; // Copy local status to
//global
}
Example Files: ex_cust.c
36
Pre-Processor
__DATE__
Syntax: __date__
Elements: None
#DEFINE
37
C Compiler Reference Manual
Pre-Processor
#DEVICE
38
Pre-Processor
__DEVICE__
Syntax: __device __
Elements: None
#ERROR
39
C Compiler Reference Manual
Pre-Processor
__FILE__
Syntax: __file__
Elements: None
Examples: if(index>MAX_ENTRIES)
printf("Too many entries, source file: "
__FILE__" at line " __LINE__"\r\n");
#FILL_ROM
40
Pre-Processor
#FUSES
41
C Compiler Reference Manual
Pre-Processor
#ID
The first syntax will take a 16-bit number and put one
nibble in each of the four ID words in the traditional
manner. The second syntax specifies the exact value
to be used in each of the four ID words.
42
Pre-Processor
#IF expr
#ELSE
#ELIF
#ENDIF
43
C Compiler Reference Manual
Pre-Processor
#IGNORE_WARNINGS
#IFDEF
#IFNDEF
#ELSE
#ELIF
#ENDIF
Syntax: #ifdef id
code
#elif
code
#else
code
#endif
#ifndef id
code
#elif
code
44
Pre-Processor
#else
code
#endif
Purpose: This directive acts much like the #IF except that the
preprocessor simply checks to see if the specified ID is
known to the preprocessor (created with a #DEFINE).
#IFDEF checks to see if defined and #IFNDEF checks
to see if it is not defined.
...
#ifdef DEBUG
printf("debug point a");
#endif
#INCLUDE
Purpose: Text from the specified file is used at this point of the
compilation. If a full path is not specified the compiler
will use the list of directories specified for the project to
search for the file. If the filename is in "" then the
directory with the main source file is searched first. If
the filename is in <> then the directory with the main
source file is searched last.
45
C Compiler Reference Manual
Pre-Processor
#include<C:\INCLUDES\COMLIB\MYRS232.C>
#INLINE
Syntax: #inline
Elements: None
Examples: #inline
swapbyte(int &a, int &b) {
int t;
t=a;
a=b;
b=t;
}
#INT_xxxx
46
Pre-Processor
Elements: None
47
C Compiler Reference Manual
Pre-Processor
Examples: #int_ad
adc_handler() {
adc_active=FALSE;
}
#int_rtcc noclear
isr() {
...
}
Example Files: See ex_sisr.c and ex_stwt.c for full example programs.
#INT_DEFAULT
Syntax: #int_default
Elements: None
Examples: #int_default
default_isr() {
printf("Unexplained interrupt\r\n");
}
48
Pre-Processor
#INT_GLOBAL
Syntax: #int_global
Elements: None
Examples: #int_global
isr() { // Will be located at location 4
#asm
bsf isr_flag
retfie
#endasm
}
__LINE__
Syntax: __line__
Elements: None
Examples: if(index>MAX_ENTRIES)
printf("Too many entries, source file: "
__FILE__" at line " __LINE__"\r\n");
49
C Compiler Reference Manual
Pre-Processor
#LIST
Syntax: #list
Elements: None
#LOCATE
Elements: id is a C variable,
x is a constant memory address
50
Pre-Processor
#NOLIST
Syntax: #nolist
Elements: None
Purpose: Stops inserting source lines into the .LST file (until a
#LIST)
#OPT
Syntax: #OPT n
Examples: #opt 5
51
C Compiler Reference Manual
Pre-Processor
#ORG
52
Pre-Processor
#ORG 0x1E00
Anotherfunc(){
// This will be somewhere 1E00-1F00
}
__PCB__
Syntax: __pcb __
Elements: None
53
C Compiler Reference Manual
Pre-Processor
__PCM__
Syntax: __pcm __
Elements: None
__PCH __
Syntax: __pch __
Elements: None
54
Pre-Processor
#PRAGMA
#PRIORITY
55
C Compiler Reference Manual
Pre-Processor
#RESERVE
#ROM
56
Pre-Processor
#SERIALIZE
57
C Compiler Reference Manual
Pre-Processor
then delete that line from the file. next=”x” The serial
number X is used for the first load, then the hex file is
updated to increment x by one.
58
Pre-Processor
#SEPARATE
Syntax: #separate
Elements: None
Examples: #separate
swapbyte (int *a, int *b) {
int t;
t=*a;
*a=*b;
*b=t;
}
__TIME __
Syntax: __time__
Elements: None
59
C Compiler Reference Manual
Pre-Processor
#TYPE
#UNDEF
Syntax: #undef id
60
Pre-Processor
#USE DELAY
#USE FAST_IO
61
C Compiler Reference Manual
Pre-Processor
Purpose: Affects how the compiler will generate code for input
and output instructions that follow. This directive takes
effect until another #use xxxx_IO directive is
encountered. The fast method of doing I/O will cause
the compiler to perform I/O without programming of the
direction register. The user must ensure the direction
register is set correctly via set_tris_X().
#USE FIXED_IO
62
Pre-Processor
#USE I2C
#use I2C(slave,sda=PIN_C4,scl=PIN_C3
address=0xa0,FORCE_HW)
63
C Compiler Reference Manual
Pre-Processor
#USE RS232
64
Pre-Processor
65
C Compiler Reference Manual
Pre-Processor
When using parts with built-in SCI and the SCI pins are
specified, the SCI will be used. If a baud rate cannot be
achieved within 3% of the desired value using the current
clock rate, an error will be generated.
No UART:
• Bit 7 is 9th bit for 9 bit data mode (get and put).
• Bit 6 set to one indicates a put failed in float high mode.
With a UART:
• Used only by get:
• Copy of RCSTA register except:
• Bit 0 is used to indicate a parity error.
66
Pre-Processor
#USE STANDARD_IO
#ZERO_RAM
Syntax: #zero_ram
Elements: None
Purpose: This directive zero's out all of the internal registers that
may be used to hold variables before program execution
begins.
Examples: #zero_ram
void main() {
67
C Compiler Reference Manual
Pre-Processor
68
Data Definitions
Data Types
The following tables show the syntax for data definitions. If the keyword
TYPEDEF is used before the definition then the identifier does not allocate space
but rather may be used as a type specifier in other data definitions. If the
keyword CONST is used before the identifier, the identifier is treated as a
constant. Constants must have an initializer and may not be changed at run-
time. Pointers to constants are not permitted.
SHORT is a special type used to generate very efficient code for bit operations
and I/O. Arrays of SHORT and pointers to SHORT are not permitted. Note: [ ]
in the following tables indicates an optional item.
Data Declarations
[type-qualifier] [type-specifier] [declarator];
enum [id] { [ id [ = cexpr]] }
Type Qualifier
static Variable is globally active and initialized to 0
auto Variable exists only while the procedure is active
This is the default and AUTO need not be used.
double Is a reserved word but is not a supported data type.
extern Is allowed as a qualifier however, has no effect.
register Is allowed as a qualifier however, has no effect.
69
C Compiler Reference Manual
Data Definitions
Type-Specifier
int1 Defines a 1 bit number
int8 Defines an 8 bit number
int16 Defines a 16 bit number
int32 Defines a 32 bit number
char Defines a 8 bit character
float Defines a 32 bit floating point number
short By default the same as int1
Int By default the same as int8
long By default the same as int16
void Indicates no specific type
The id after ENUM is created as a type large enough to the largest constant in
the list. The ids in the list are each created as a constant. By default the first id
is set to zero and they increment by one. If a =cexpr follows an id that id will
have the value of the constant expression and the following list will increment by
one.
The :cexpr after an id specifies in a struct or union the number of bits to use for
the id. This number may be 1-8. Multiple [] may be used for multiple dimension
arrays. Structures and unions may be nested. The id after STRUCT may be
used in another STRUCT and the {} is not used to reuse the same structure form
again.
Examples:
int a,b,c,d;
typedef int byte;
typedef short bit;
bit e,f;
byte g[3][2];
char *h;
enum boolean {false, true};
boolean j;
byte k = 5;
byte const WEEKS = 52;
byte const FACTORS [4] =
{8, 16, 64, 128};
struct data_record {
byte a [2];
byte b : 2; /*2 bits */
byte c : 3; /*3 bits*/
int d;
}
70
Function Definition
Function Definition
The format of a function definition is as follows:
qualifier id ( [ type-specifier id ] ) { [ stmt ] }
↑ ↑ ↑
Optional See Below Zero or more Zero or more Semi-
comma separated. See colon separated. See
Data Types Statements.
When one of the above are used and the function has a prototype (forward
declaration of the function before it is defined) you must include the qualifier on
both the prototype and function definition.
A (non-standard) feature has been added to the compiler to help get around the
problems created by the fact that pointers cannot be created to constant strings.
A function that has one CHAR parameter will accept a constant string where it is
called. The compiler will generate a loop that will call the function once for each
character in the string.
Example:
void lcd_putc(char c ) {
...
}
71
C Compiler Reference Manual
Function Definition
Reference Parameters
The compiler has limited support for reference parameters. This increases the
readability of code and the efficiency of some inline procedures. The following
two procedures are the same. The one with reference parameters will be
implemented with greater efficiency when it is inline.
funct_a(int*x,int*y){
/*Traditional*/
if(*x!=5)
*y=*x+3;
}
funct_a(&a,&b);
funct_b(int&x,int&y){
/*Reference params*/
if(x!=5)
y=x+3;
}
funct_b(a,b);
72
C Statements And Expressions
Program Syntax
A program is made up of the following four elements in a file. These are covered
in more detail in the following paragraphs.
• Comment
• Pre-Processor Directive
• Data Definition
• Function Definition
Comment
A comment may appear anywhere within a file except within a quoted string.
Characters between the /* and */ are ignored. Characters after a // up to the end
of a line are also ignored.
73
C Compiler Reference Manual
C Statements and Expressions
STATEMENTS
STATEMENT EXAMPLE
if (expr) stmt; [else stmt;] if (x==25)
x=1;
else
x=x+1;
while (expr) stmt; while(get_rtcc()!=0)
putc(‘n’);
do stmt while (expr); do {
putc(c=getc());
} while (c!=0);
for (expr1;expr2;expr3) stmt; for(i=1;i<=10;++i)
printf(“%u\r\n”,i);
switch (expr) { switch (cmd) {
case 0:printf(“cmd 0”);
case cexpr: stmt; //one or more break;
case [default:stmt] case 1:printf(“cmd 1”);
... } break;
default:printf(“bad cmd”);
break; }
return [expr]; return (5);
goto label; goto loop;
label: stmt; loop: I++;
break; break;
continue; continue;
expr; i=1;
; ;
{[stmt]} {a=1;
↑ b=1;}
Zero or more
Note: Items in [ ] are optional
74
C Statements and Expressions
Expressions
Constants:
123 Decimal
0123 Octal
0x123 Hex
0b010010 Binary
'x' Character
'\010' Octal Character
'\xA5’ Hex Character
'\c' Special Character. Where c is one of:
\n Line Feed- Same as \x0a
\r Return Feed - Same as \x0d
\t TAB- Same as \x09
\b Backspace- Same as \x08
\f Form Feed- Same as x0c
\a Bell- Same as \x07
\v Vertical Space- Same as \x0b
\? Question Mark- Same as \x3f
\’ Single Quote- Same as \x60
\” Double Quote- Same as \x22
\\ A Single Backslash- Same as \x5c
"abcdef" String (null is added to the end)
Identifiers:
ABCDE Up to 32 characters beginning with a non-numeric. Valid
characters are A-Z, 0-9 and _ (underscore).
ID[X] Single Subscript
ID[X][X] Multiple Subscripts
ID.ID Structure or union reference
ID->ID Structure or union reference
75
C Compiler Reference Manual
C Statements and Expressions
Operators
+ Addition Operator
+= Addition assignment operator, x+=y, is the same as x=x+y
&= Bitwise and assignment operator, x&=y, is the same as x=x&y
& Address operator
& Bitwise and operator
^= Bitwise exclusive or assignment operator, x^=y, is the same as
x=x^y
^ Bitwise exclusive or operator
l= Bitwise inclusive or assignment operator, xl=y, is the same as
x=xly
l Bitwise inclusive or operator
?: Conditional Expression operator
-- Decrement
/= Division assignment operator, x\=y, is the same as x=x/y
/ Division operator
== Equality
> Greater than operator
>= Greater than or equal to operator
++ Increment
* Indirection operator
!= Inequality
<<= Left shift assignment operator, x<<=y, is the same as x=x<<y
< Less than operator
<< Left Shift operator
<= Less than or equal to operator
&& Logical AND operator
! Logical negation operator
ll Logical OR operator
%= Modules assignment operator x%=y, is the same as x=x%y
% Modules operator
*= Multiplication assignment operator, x*=y, is the same as x=x*y
* Multiplication operator
~ One's complement operator
>>= Right shift assignment, x>>=y, is the same as x=x>>y
>> Right shift operator
-> Structure Pointer operation
-= Subtraction assignment operator
- Subtraction operator
sizeof Determines size in bytes of operand
76
C Statements and Expressions
Operator Precedence
In descending precedence
(expr)
!expr ~expr ++expr expr++ - -expr expr- -
(type)expr *expr &value sizeof(type)
expr*expr expr/expr expr%expr
expr+expr expr-expr
expr<<expr expr>>expr
expr<expr expr<=expr expr>expr expr>=expr
expr==expr expr!=expr
expr&expr
expr^expr
expr | expr
expr&& expr
expr || expr
!value ? expr: expr
value = expr value+=expr value-=expr
value*=expr value/=expr value%=expr
value>>=expr value<<=expr value&=expr
value^=expr value|=expr expr, expr
Trigraph Sequences
The compiler accepts three character sequences instead of some special
characters not available on all keyboards as follows:
Sequence Same as
??= #
??( [
??/ \
??) ]
??' ^
??< {
??! |
??> }
??- ~
77
78
Built-In Functions
Built-In Function List By Category
RS232 I/O Parallel Slave I/O
getc() p.101 setup_psp() p.166
putc() p.138 psp_input_full() p.137
fgetc() p.138 psp_output_full() p.137
gets() p.105 psp_overflow() p.137
puts() p.139 I2C I/O
fgets() p.139 i2c_start() p.108
fputc() p.138 i2c_stop() p.108
fputs() p.139 i2C_read p.107
printf() p.135 i2c_write() p.109
kbhit() p.114 i2c_poll() p.106
fprintf() p.135 Processor Controls
set_uart_speed() p.155 sleep() p.179
perror() p.131 reset_cpu() p.146
assert() p.82 restart_cause() p.147
getchar() p.101 disable_interrupts() p.92
putchar() p.138 enable_interrupts() p.94
setup_uart() p.172 ext_int_edge() p.96
SPI two wire I/O read_bank() p.141
setup_spi() p.167 write_bank() p.193
spi_read() p.180 label_address() p.115
spi_write() p.181 goto_address() p.105
spi_data_is_in() p.180 getenv() p.102
Discrete I/O clear_interrupts() p.89
output_low() p.130 setup_oscillator() p.162
output_high() p.129 Bit/Byte Manipulation
output_float() p.128 shift_right() p.176
output_bit() p.127 shift_left() p.175
input() p.110 rotate_right() p.149
output_X() p.127 rotate_left() p.148
output_toggle() p.130 bit_clear() p.85
input_state() p.111 bit_set() p.86
input_X() p.111 bit_test() p.86
port_b_pullups() p.132 swap() p.191
set_tris_X() p.154 make8() p.121
make16() p.121
make32() p.122
79
C Compiler Reference Manual
Built-in Functions
80
Built-in Functions
81
C Compiler Reference Manual
Built-in Functions
ABS()
ACOS()
See: SIN()
ASIN()
See: SIN()
ASSERT()
Returns: Nothing
82
Built-in Functions
ATOF()
83
C Compiler Reference Manual
Built-in Functions
ATOI()
ATOL()
ATOI32()
84
Built-in Functions
strcpy(string,"123");
x = atoi(string);
// x is now 123
BIT_CLEAR()
Returns: undefined
Function: Simply clears the specified bit (0-7, 0-15 or 0-31) in the
given variable. The least significant bit is 0. This
function is the same as: var &= ~(1<<bit);
Requires None
Examples: int x;
x=5;
bit_clear(x,2);
// x is now 1
85
C Compiler Reference Manual
Built-in Functions
BIT_SET()
Returns: undefined
Function: Sets the specified bit (0-7, 0-15 or 0-31) in the given
variable. The least significant bit is 0. This function is
the same as: var |= (1<<bit);
Requires Nothing
Examples: int x;
x=5;
bit_set(x,3);
// x is now 13
BIT_TEST()
Returns: 0 or 1
86
Built-in Functions
Requires Nothing
if(data!=0)
for(i=31;!bit_test(data, i);i--) ;
// i now has the most significant bit in data
// that is set to a 1
CALLOC()
87
C Compiler Reference Manual
Built-in Functions
CEIL()
Returns: A float
COS()
See: SIN()
88
Built-in Functions
COSH()
See: SIN()
CLEAR_INTERRUPT()
Syntax: clear_interrupt(level)
Returns: undefined
Function: Clears the interrupt flag for the given level. This function
is designed for use with a specific interrupt, thus
eliminating the GLOBAL level as a possible parameter.
Requires Nothing
Examples: clear_interrupt(int_timer1);
DELAY_CYCLES()
Returns: undefined
89
C Compiler Reference Manual
Built-in Functions
Requires Nothing
DELAY_MS()
Returns: undefined
90
Built-in Functions
delay_ms( 2 );
void delay_seconds(int n) {
for (;n!=0; n- -)
delay_ms( 1000 );
}
DELAY_US()
Returns: undefined
do {
output_high(PIN_B0);
91
C Compiler Reference Manual
Built-in Functions
delay_us(duty);
output_low(PIN_B0);
delay_us(period-duty);
} while(TRUE);
DISABLE_INTERRUPTS()
Returns: undefined
enable_interrupts(ADC_DONE);
enable_interrupts(RB_CHANGE);
// these enable the interrupts
// but since the GLOBAL is disabled they
// are not activated until the following
// statement:
enable_interrupts(GLOBAL);
92
Built-in Functions
DIV()
LDIV()
Function: The div and ldiv function computes the quotient and
remainder of the division of the numerator by the
denominator. If the division is inexact, the resulting
quotient is the integer or long of lesser magnitude that is
the nearest to the algebraic quotient. If the result cannot
be represented, the behavior is undefined; otherwise
quot*denom(ldenom)+rem shall equal num(lnum).
93
C Compiler Reference Manual
Built-in Functions
lidiv=ldiv(300,250);
//lidiv will contain quot=1 and rem=50
ENABLE_INTERRUPTS()
Returns: undefined
Examples: enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
ERASE_PROGRAM_EEPROM()
94
Built-in Functions
Returns: undefined
Requires Nothing
Examples: for(i=0x1000;i<=0x1fff;i+=getenv("FLASH_ERASE_SIZE"))
erase_program_memory(i);
EXP()
Returns: A float
95
C Compiler Reference Manual
Built-in Functions
EXT_INT_EDGE()
Returns: undefined
96
Built-in Functions
FABS()
FLOOR()
97
C Compiler Reference Manual
Built-in Functions
FMOD()
FREE()
Syntax: free(ptr)
98
Built-in Functions
Returns: No value
Function: The free function causes the space pointed to by the ptr
to be deallocated, which is made available for further
allocation. If ptr is a null pointer, no action occurs. If the
ptr does not match a pointer earlier returned by the
calloc, malloc or realloc, or if the space has been
deallocated by a call to free or realloc function, the
behavior is undefined.
FREXP()
99
C Compiler Reference Manual
Built-in Functions
GET_TIMERx()
Parameters: None
Requires Nothing
100
Built-in Functions
Examples: set_timer0(0);
while ( get_timer0() < 200 ) ;
GETC()
GETCH()
GETCHAR()
FGETC()
101
C Compiler Reference Manual
Built-in Functions
#use rs232(baud=9600,xmit=pin_c6,
rcv=pin_c7,stream=HOSTPC)
#use rs232(baud=1200,xmit=pin_b1,
rcv=pin_b0,stream=GPS)
#use rs232(baud=9600,xmit=pin_b3,
stream=DEBUG)
...
while(TRUE) {
c=fgetc(GPS);
fputc(c,HOSTPC);
if(c==13)
fprintf(DEBUG,"Got a CR\r\n");
}
GETENV()
102
Built-in Functions
103
C Compiler Reference Manual
Built-in Functions
comparator
VREF Returns a 1 if the
device has a voltage
reference
LCD Returns a 1 if the
device has direct LCD
H/W
UART Returns the number
of H/W UARTs
CCPx Returns a 1 if the
device has CCP
number x
TIMERx Returns a 1 if the
device has TIMER
number x
FLASH_WRITE_SIZE Smallest number of
bytes that can be
written to FLASH
FLASH_ERASE_SIZE Smallest number of
bytes that can be
erased in FLASH
BYTES_PER_ADDRESS Returns the number
of bytes at an
address location
BITS_PER_INSTRUCTION Returns the size of an
instruction in bits
Availability: All devices
Requires Nothing
for(i=0;i<getenv("DATA_EEPROM");i++)
write_eeprom(i,0);
#IF getenv("FUSE_VALID:BROWNOUT")
#FUSE BROWNOUT
#ENDIF
104
Built-in Functions
GETS()
FGETS()
Returns: undefined
printf("Password: ");
gets(string);
if(strcmp(string, password))
printf("OK");
GOTO_ADDRESS()
Syntax: goto_address(location);
105
C Compiler Reference Manual
Built-in Functions
Returns: Nothing
Requires Nothing
if(input(LOAD_REQUEST))
goto_address(LOADER);
I2C_POLL()
Syntax: i2c_poll()
Parameters: None
106
Built-in Functions
I2C_READ()
Examples: i2c_start();
i2c_write(0xa1);
data1 = i2c_read();
data2 = i2c_read();
107
C Compiler Reference Manual
Built-in Functions
i2c_stop();
I2C_START()
Syntax: i2c_start()
Parameters: None
Returns: undefined
Examples: i2c_start();
i2c_write(0xa0); // Device address
i2c_write(address); // Data to device
i2c_start(); // Restart
i2c_write(0xa1); // to change data direction
data=i2c_read(0); // Now read from slave
i2c_stop();
I2C_STOP()
108
Built-in Functions
Syntax: i2c_stop()
Parameters: None
Returns: undefined
I2C_WRITE()
109
C Compiler Reference Manual
Built-in Functions
INPUT()
Parameters: Pin to read. Pins are defined in the devices .h file. The
actual value is a bit address. For example, port a (byte
5) bit 3 would have a value of 5*8+3 or 43. This is
defined as follows: #define PIN_A3 43
Function: This function returns the state of the indicated pin. The
method of I/O is dependent on the last USE *_IO
directive. By default with standard I/O before the input
is done the data direction is set to input.
if( input(PIN_A0) )
printf("A0 is now high\r\n");
110
Built-in Functions
INPUT_STATE()
Parameters: pin to read. Pins are defined in the devices .h file. The
actual value is a bit address. For example, port A (byte
5) bit 3 would have a value of 5*8+3 or 43. This is
defined as follows: #define PIN_A3 43.
Requires Nothing
INPUT_x()
111
C Compiler Reference Manual
Built-in Functions
Parameters: None
Requires Nothing
ISALNUM(char)
ISALPHA(char)
ISDIGIT(char)
ISLOWER(char)
ISSPACE(char)
ISUPPER(char)
ISXDIGIT(char)
ISCNTRL(x)
ISGRAPH(x)
ISPRINT(x)
ISPUNCT(x)
112
Built-in Functions
Returns: 0 (or FALSE) if datac dose not match the criteria, 1 (or
TRUE) if datac does match the criteria.
Requires ctype.h
ISAMOUNG()
113
C Compiler Reference Manual
Built-in Functions
Requires Nothing
Examples: char x;
...
if( isamoung (x,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") )
printf("The character is valid");
KBHIT()
114
Built-in Functions
long timeout;
timeout_error=FALSE;
timeout=0;
while(!kbhit()&&(++timeout<50000)) // 1/2
// second
delay_us(10);
if(kbhit())
return(getc());
else {
timeout_error=TRUE;
return(0);
}
}
LABEL_ADDRESS()
115
C Compiler Reference Manual
Built-in Functions
Requires Nothing
Examples: start:
a = (b+c)<<2;
end:
printf("It takes %lu ROM locations.\r\n",
label_address(end)-label_address(start));
LABS()
LCD_LOAD()
116
Built-in Functions
Returns: undefined
LCD_SYMBOL()
Returns: undefined
Function: Loads 8 bits into the segment data area for the LCD with
each bit address specified. If bit 7 in symbol is set the
segment at B7_addr is set, otherwise it is cleared. The
same is true of all other bits in symbol. The B7_addr is a
117
C Compiler Reference Manual
Built-in Functions
#define DIGIT_1_CONFIG
COM0+2,COM0+4,COM05,COM2+4,COM2+1,
COM1+4,COM1+5
LDEXP()
118
Built-in Functions
LOG()
Returns: A float
119
C Compiler Reference Manual
Built-in Functions
LOG10()
Returns: A float
120
Built-in Functions
MAKE8()
Function: Extracts the byte at offset from var. Same as: i8 = (((var
>> (offset*8)) & 0xff) except it is done with a single byte
move.
Requires Nothing
Examples: int32 x;
int y;
MAKE16()
121
C Compiler Reference Manual
Built-in Functions
Requires Nothing
Examples: long x;
int hi,lo;
x = make16(hi,lo);
MAKE32()
Requires Nothing
Examples: int32 x;
int y;
long z;
x = make32(1,2,3,4); // x is 0x01020304
y=0x12;
z=0x4321;
x = make32(y,z); // x is 0x00124321
122
Built-in Functions
x = make32(y,y,z); // x is 0x12124321
MALLOC()
Syntax: ptr=malloc(size)
MEMCPY()
MEMMOVE()
123
C Compiler Reference Manual
Built-in Functions
Returns: undefined
Requires Nothing
char a[20]="hello";
memmove(a,a+2,5);
// a is now "llo"MEMMOVE()
MEMSET()
124
Built-in Functions
Returns: undefined
Requires Nothing
MODF()
125
C Compiler Reference Manual
Built-in Functions
OFFSETOF()
OFFSETOFBIT()
Requires stddef.h
x = offsetof(time_structure, sec);
// x will be 2
x = offsetofbit(time_structure, sec);
// x will be 16
x = offsetof (time_structure,
daylight_savings);
// x will be 3
x = offsetofbit(time_structure,
daylight_savings);
// x will be 28
126
Built-in Functions
OUTPUT_A()
OUTPUT_B()
OUTPUT_C()
OUTPUT_D()
OUTPUT_E()
Returns: undefined
Availability: All devices, however not all devices have all ports (A-E)
Requires Nothing
Examples: OUTPUT_B(0xf0);
OUTPUT_BIT()
127
C Compiler Reference Manual
Built-in Functions
Parameters: Pins are defined in the devices .h file. The actual number
is a bit address. For example, port a (byte 5) bit 3 would
have a value of 5*8+3 or 43. This is defined as follows:
#define PIN_A3 43. Value is a 1 or a 0.
Returns: undefined
output_bit( PIN_B0,
shift_left(&data,1,input(PIN_B1)));
// Output the MSB of data to
// B0 and at the same time
// shift B1 into the LSB of data
OUTPUT_FLOAT()
Parameters: Pins are defined in the devices .h file. The actual value is
a bit address. For example, port a (byte 5) bit 3 would
have a value of 5*8+3 or 43. This is defined as follows:
#define PIN_A3 43
128
Built-in Functions
Returns: undefined
Function: Sets the specified pin to the input mode. This will allow
the pin to float high to represent a high on an open
collector type of connection.
OUTPUT_HIGH()
Parameters: Pin to read. Pins are defined in the devices .h file. The
actual value is a bit address. For example, port a (byte
5) bit 3 would have a value of 5*8+3 or 43. This is
defined as follows: #define PIN_A3 43
Returns: undefined
Function: Sets a given pin to the high state. The method of I/O
used is dependent on the last USE *_IO directive.
Examples: output_high(PIN_A0);
129
C Compiler Reference Manual
Built-in Functions
OUTPUT_LOW()
Parameters: Pins are defined in the devices .h file. The actual value
is a bit address. For example, port a (byte 5) bit 3 would
have a value of 5*8+3 or 43. This is defined as follows:
#define PIN_A3 43
Returns: undefined
Function: Sets a given pin to the ground state. The method of I/O
used is dependent on the last USE *_IO directive.
Examples: output_low(PIN_A0);
OUTPUT_TOGGLE()
Syntax: output_toggle(pin)
Parameters: Pins are defined in the devices .h file. The actual value
is a bit address. For example, port a (byte 5) bit 3 would
have a value of 5*8+3 or 43. This is a defined as
130
Built-in Functions
Returns: undefined
Examples: output_toggle(PIN_B4);
PERROR()
Syntax: perror(string);
Returns: Nothing
Examples: x = sin(y);
if(errno!=0)
perror("Problem in find_area");
131
C Compiler Reference Manual
Built-in Functions
PORT_A_PULLUPS()
Returns: undefined
Function: Sets the port A input pullups. TRUE will activate, and a
FALSE will deactivate.
Availability: Only 14 and 16 bit devices (PCM and PCH). (Note: use
SETUP_COUNTERS on PCB parts).
Requires Nothing
Examples: port_a_pullups(FALSE);
PORT_B_PULLUPS()
Returns: undefined
Function: Sets the port B input pullups. TRUE will activate, and a
132
Built-in Functions
Availability: Only 14 and 16 bit devices (PCM and PCH). (Note: use
SETUP_COUNTERS on PCB parts).
Requires Nothing
Examples: port_b_pullups(FALSE);
POW()
Returns: A float
133
C Compiler Reference Manual
Built-in Functions
Syntax: setup_power_pwm(modes,postscale,time_base,period,compare,
compare_postscale,dead_time)
PWM_OFF
PWM_FREE_RUN
PWM_SINGLE_SHOT
PWM_UP_DOWN
PWM_UP_DOWN_INT
PWM_OVERRIDE_SYNC
PWM_UP_TRIGGER
PWM_DOWN_TRIGGER
PWM_UPDATE_DISABLE
PWM_UPDATE_ENABLE
PWM_DEAD_CLOCK_DIV_2
PWM_DEAD_CLOCK_DIV_4
PWM_DEAD_CLOCK_DIV_8
PWM_DEAD_CLOCK_DIV_16
Returns: A float
134
Built-in Functions
Example None
Files:
Also See: None
PRINTF()
FPRINTF()
Returns: undefined
135
C Compiler Reference Manual
Built-in Functions
Format:
The format takes the generic form %wt where w is
optional and may be 1-9 to specify how many characters
are to be outputted, or 01-09 to indicate leading zeros or
1.1 to 9.9 for floating point. t is the type and may be one
of the following:
C Character
S String or character
U Unsigned int
x Hex int (lower case output)
X Hex int (upper case output)
D Signed int
e Float in exp format
f Float
Lx Hex long int (lower case)
LX Hex long int (upper case)
lu unsigned decimal long
ld signed decimal long
% Just a %
Example formats:
Specifier Value=0x12 Value=0xfe
%03u 018 254
%u 18 254
%2u 18 *
%5 18 254
%d 18 -2
%x 12 Fe
%X 12 FE
%4X 0012 00FE
* Result is undefined - Assume garbage.
136
Built-in Functions
PSP_OUTPUT_FULL()
PSP_INPUT_FULL()
PSP_OVERFLOW()
Parameters: None
Function: These functions check the Parallel Slave Port (PSP) for
the indicated conditions and return TRUE or FALSE.
Requires Nothing
137
C Compiler Reference Manual
Built-in Functions
PUTC()
PUTCHAR()
FPUTC()
Returns: undefined
Examples: putc('*');
for(i=0; i<10; i++)
putc(buffer[i]);
putc(13);
138
Built-in Functions
PUTS()
FPUTS()
Returns: undefined
Function: Sends each character in the string out the RS232 pin
using PUTC(). After the string is sent a RETURN (13)
and LINE-FEED (10) are sent. In general printf() is
more useful than puts().
RAND()
Syntax: re=rand()
Parameters: None
139
C Compiler Reference Manual
Built-in Functions
Examples: int I;
I=rand();
READ_ADC()
140
Built-in Functions
Function: This function will read the digital value from the analog
to digital converter. Calls to setup_adc(),
setup_adc_ports() and set_adc_channel() should be
made sometime before this function is called. The
range of the return value depends on number of bits in
the chips A/D converter and the setting in the #DEVICE
ADC= directive as follows:
#DEVICE 8 bit 10 bit 11 bit 16 bit
ADC=8 00-FF 00-FF 00-FF 00-FF
ADC=10 x 0-3FF x x
ADC=11 x x 0-7FF x
ADC=16 0-FF00 0-FFC0 0-FFEO 0-FFFF
Note: x is not defined
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
READ_BANK()
141
C Compiler Reference Manual
Built-in Functions
device), offset is the offset into user RAM for that bank
(starts at 0),
Function: Read a data byte from the user RAM area of the
specified memory bank. This function may be used on
some devices where full RAM access by auto variables
is not efficient. For example on the PIC16C57 chip
setting the pointer size to 5 bits will generate the most
efficient ROM code however auto variables can not be
above 1Fh. Instead of going to 8 bit pointers you can
save ROM by using this function to write to the hard to
reach banks. In this case the bank may be 1-3 and the
offset may be 0-15.
Availability: All devices but only useful on PCB parts with memory
over 1Fh and PCM parts with memory over FFh.
Requires Nothing
READ_CALIBRATION()
142
Built-in Functions
Requires Nothing
READ_EEPROM()
Requires Nothing
143
C Compiler Reference Manual
Built-in Functions
READ_PROGRAM_EEPROM()
Returns: 16 bits
Requires Nothing
Examples: checksum = 0;
for(i=0;i<8196;i++)
checksum^=read_program_eeprom(i);
printf("Checksum is %2X\r\n",checksum);
READ_PROGRAM_MEMORY()
READ_EXTERNAL_MEMORY()
Returns: undefined
144
Built-in Functions
Requires Nothing
REALLOC()
145
C Compiler Reference Manual
Built-in Functions
RESET_CPU()
Syntax: reset_cpu()
Parameters: None
Requires Nothing
Examples: if(checksum!=0)
reset_cpu();
146
Built-in Functions
RESTART_CAUSE()
Parameters: None
RESTART_WDT()
Syntax: restart_wdt()
Parameters: None
Returns: undefined
147
C Compiler Reference Manual
Built-in Functions
Requires #fuses
ROTATE_LEFT()
Returns: undefined
148
Built-in Functions
Requires Nothing
Examples: x = 0x86;
rotate_left( &x, 1);
// x is now 0x0d
ROTATE_RIGHT()
Returns: undefined
Requires Nothing
Examples: struct {
int cell_1 : 4;
int cell_2 : 4;
int cell_3 : 4;
int cell_4 : 4; } cells;
rotate_right( &cells, 2);
149
C Compiler Reference Manual
Built-in Functions
SET_ADC_CHANNEL()
Returns: undefined
Requires Nothing
Examples: set_adc_channel(2);
delay_us(10);
value = read_adc();
150
Built-in Functions
SET_PWM1_DUTY()
SET_PWM2_DUTY()
SET_PWM3_DUTY()
SET_PWM4_DUTY()
SET_PWM5_DUTY()
Returns: undefined
Function: Writes the 10-bit value to the PWM to set the duty. An
8-bit value may be used if the least significant bits are
not required. If value is an 8 bit item it is shifted up with
two zero bits in the lsb positions to get 10 bits. The 10
bit value is then used to determine the amount of time
the PWM signal is high during each cycle as follows:
• value*(1/clock)*t2div
Requires Nothing
long duty;
151
C Compiler Reference Manual
Built-in Functions
SET_POWER_PWMX_DUTY()
Syntax: set_power_pwmX_duty(duty)
Parameters: X is 0, 2, 4, or 6
Duty is an integer between 0 and 16383.
Returns: undefined
Requires None
Examples: set_power_pwm0_duty(4000);
SET_POWER_PWM_OVERRIDE()
Returns: undefined
152
Built-in Functions
Requires None
SET_RTCC()
SET_TIMER0()
SET_TIMER1()
SET_TIMER2()
SET_TIMER3()
SET_TIMER4()
153
C Compiler Reference Manual
Built-in Functions
Returns: undefined
Requires Nothing
set_timer0(81); // 256-(.000035/(4/20000000))
SET_TRIS_A()
SET_TRIS_B()
SET_TRIS_C()
SET_TRIS_D()
SET_TRIS_E()
154
Built-in Functions
Returns: undefined
Availability: All devices (however not all devices have all I/O ports)
Requires Nothing
SET_UART_SPEED()
Returns: undefined
155
C Compiler Reference Manual
Built-in Functions
SETUP_ADC(mode)
Returns: undefined
156
Built-in Functions
value = read_adc();
setup_adc( ADC_OFF );
SETUP_ADC_PORTS()
Returns: undefined
setup_adc_ports( ALL_ANALOG );
157
C Compiler Reference Manual
Built-in Functions
SETUP_CCP1()
SETUP_CCP2()
SETUP_CCP3()
SETUP_CCP4()
SETUP_CCP5()
158
Built-in Functions
Examples: setup_ccp1(CCP_CAPTURE_RE);
SETUP_COMPARATOR()
Returns: undefined
159
C Compiler Reference Manual
Built-in Functions
SETUP_COUNTERS()
Returns: undefined
160
Built-in Functions
SETUP_EXTERNAL_MEMORY()
Returns: undefined
Examples: setup_external_memory(EXTMEM_WORD_WRITE
|EXTMEM_WAIT_0 );
setup_external_memory(EXTMEM_DISABLE);
161
C Compiler Reference Manual
Built-in Functions
SETUP_LCD()
Returns: undefined
Examples: setup_lcd(LCD_MUX14|STOP_ON_SLEEP,2,
ALL_LCD_PINS);
SETUP_OSCILLATOR()
162
Built-in Functions
163
C Compiler Reference Manual
Built-in Functions
SETUP_POWER_PWM()
PWM_OVERRIDE_SYNC
PWM_UP_TRIGGER, PWM_DOWN_TRIGGER
PWM_UPDATE_DISABLE, PWM_UPDATE_ENABLE
PWM_DEAD_CLOCK_DIV_2,
PWM_DEAD_CLOCK_DIV_4,
PWM_DEAD_CLOCK_DIV_8,
PWM_DEAD_CLOCK_DIV_16
164
Built-in Functions
Returns: undefined
Requires None
SETUP_POWER_PWM_PINS()
Syntax: setup_power_pwm_pins(module0,module1,module2,mo
dule3)
Returns: undefined
Requires None
165
C Compiler Reference Manual
Built-in Functions
SETUP_PSP()
Returns: undefined
Examples: setup_psp(PSP_ENABLED);
166
Built-in Functions
SETUP_SPI()
Returns: undefined
SETUP_TIMER_0()
167
C Compiler Reference Manual
Built-in Functions
RTCC_DIV_128, RTCC_DIV_256
Returns: undefined
SETUP_TIMER_1()
Returns: undefined
168
Built-in Functions
SETUP_TIMER_2()
Returns: undefined
169
C Compiler Reference Manual
Built-in Functions
hardware.
SETUP_TIMER_3()
Returns: undefined
170
Built-in Functions
SETUP_TIMER_4()
Returns: undefined
171
C Compiler Reference Manual
Built-in Functions
SETUP_TIMER_5()
T5_ONE_SHOT, T5_DISABLE_SE_RESET, or
T5_ENABLE_DURING_SLEEP
Returns: undefined
SETUP_UART()
172
Built-in Functions
identifier.
Returns: undefined
Examples: setup_uart(9600);
setup_uart(9600, rsOut);
SETUP_VREF()
173
C Compiler Reference Manual
Built-in Functions
Returns: undefined
SETUP_WDT()
Returns: undefined
174
Built-in Functions
SHIFT_LEFT()
175
C Compiler Reference Manual
Built-in Functions
Requires Nothing
SHIFT_RIGHT()
176
Built-in Functions
Requires Nothing
SIN()
COS()
TAN()
ASIN()
ACOS()
ATAN()
SINH()
COSH()
TANH()
ATAN2()
177
C Compiler Reference Manual
Built-in Functions
result=cosh(value)
result=tanh(value)
178
Built-in Functions
SINH()
See: SIN()
SLEEP()
Syntax: sleep()
Parameters: None
Returns: Undefined
179
C Compiler Reference Manual
Built-in Functions
statement in main().
Requires Nothing
Examples: SLEEP();
SPI_DATA_IS_IN()
Parameters: None
Function: Returns TRUE if data has been received over the SPI.
Requires Nothing
SPI_READ()
180
Built-in Functions
Requires Nothing
SPI_WRITE()
Returns: Nothing
181
C Compiler Reference Manual
Built-in Functions
Function: Sends a byte out the SPI interface. This will cause 8
clocks to be generated. This function will write the value
out to the SPI.
Requires Nothing
SPRINTF()
Returns: Nothing
Function: This function operates like printf except that the output is
placed into the specified string. The output string will be
terminated with a null. No checking is done to ensure
the string is large enough for the data. See printf() for
details on formatting.
Requires Nothing
182
Built-in Functions
mylong=1234;
sprintf(mystring,"<%lu>",mylong);
// mystring now has:
// < 1 2 3 4 > \0
SQRT()
Returns: A float
183
C Compiler Reference Manual
Built-in Functions
SRAND()
Syntax: srand(n)
Returns: No value.
Examples: srand(10);
I=rand();
184
Built-in Functions
STRLWR()
STRNCAT()
STRNCMP()
STRNCPY()
STRPBRK()
STRRCHR()
STRSPN()
STRSTR()
STRXFRM()
185
C Compiler Reference Manual
Built-in Functions
c is a 8 bit character
strcpy(string1,"hi ");
strcpy(string2,"there");
strcat(string1,string2);
186
Built-in Functions
STRCPY()
Returns: undefined
Requires Nothing
strcpy(string2,string);
STRTOD()
187
C Compiler Reference Manual
Built-in Functions
STRTOK()
188
Built-in Functions
strcpy(string,"one,two,three;");
strcpy(term,",;");
STRTOL()
189
C Compiler Reference Manual
Built-in Functions
STRTOUL()
190
Built-in Functions
SWAP()
Function: Swaps the upper nibble with the lower nibble of the
specified byte. This is the same as:
byte = (byte << 4) | (byte >> 4);
Requires Nothing
191
C Compiler Reference Manual
Built-in Functions
Examples: x=0x45;
swap(x);
//x now is 0x54
TAN()
See: SIN()
TANH()
See: SIN()
TOLOWER()
TOUPPER()
Requires Nothing
192
Built-in Functions
WRITE_BANK()
Returns: undefined
Function: Write a data byte to the user RAM area of the specified
memory bank. This function may be used on some
devices where full RAM access by auto variables is not
efficient. For example on the PIC16C57 chip setting
the pointer size to 5 bits will generate the most efficient
ROM code however auto variables can not be above
1Fh. Instead of going to 8 bit pointers you can save
ROM by using this function to write to the hard to reach
banks. In this case the bank may be 1-3 and the offset
may be 0-15.
Availability: All devices but only useful on PCB parts with memory
over 1Fh and PCM parts with memory over FFh.
Requires Nothing
193
C Compiler Reference Manual
Built-in Functions
Also See: See the "Common Questions and Answers" section for
more information.
WRITE_EEPROM()
Returns: undefined
Requires Nothing
volume++;
write_eeprom(LAST_VOLUME,volume);
194
Built-in Functions
195
C Compiler Reference Manual
Built-in Functions
WRITE_EXTERNAL_MEMORY()
Returns: undefined
Requires Nothing
Examples: for(i=0x1000;i<=0x1fff;i++) {
value=read_adc();
write_external_memory(i, value, 2);
delay_ms(1000);
}
196
Built-in Functions
WRITE_PROGRAM_EEPROM()
Returns: undefined
Requires Nothing
Examples: write_program_eeprom(0,0x2800);
//disables program
WRITE_PROGRAM_MEMORY()
Returns: undefined
197
C Compiler Reference Manual
Built-in Functions
Requires Nothing
Examples: for(i=0x1000;i<=0x1fff;i++) {
value=read_adc();
write_program_memory(i, value, 2);
delay_ms(1000);
}
198
Standard C Definitions
errno.h
errno.h
EDOM Domain error value
ERANGE Range error value
errno error value
float.h
float.h
FLT_RADIX: Radix of the exponent representation
FLT_MANT_DIG: Number of base digits in the floating point significant
FLT_DIG: Number of decimal digits, q, such that any floating
point number with q decimal digits can be rounded into
a floating point number with p radix b digits and back
again without change to the q decimal digits.
FLT_MIN_EXP: Minimum negative integer such that FLT_RADIX
raised to that power minus 1 is a normalized floating-
point number.
FLT_MIN_10_EXP: Minimum negative integer such that 10 raised to that
power is in the range of normalized floating-point
numbers.
FLT_MAX_EXP: Maximum negative integer such that FLT_RADIX
raised to that power minus 1 is a representable finite
floating-point number.
FLT_MAX_10_EXP: Maximum negative integer such that 10 raised to that
power is in the range representable finite floating-point
numbers.
FLT_MAX: Maximum representable finite floating point number.
FLT_EPSILON: The difference between 1 and the least value greater
than 1 that is representable in the given floating point
type.
FLT_MIN: Minimum normalized positive floating point number.
DBL_MANT_DIG: Number of base digits in the floating point significant
DBL_DIG: Number of decimal digits, q, such that any floating
point number with q decimal digits can be rounded into
a floating point number with p radix b digits and back
again without change to the q decimal digits.
199
C Compiler Reference Manual
Standard C Definitions
200
Standard C Definitions
limits.h
limits.h
CHAR_BIT: Number of bits for the smallest object that is not a bit_field.
SCHAR_MIN: Minimum value for an object of type signed char
SCHAR_MAX: Maximum value for an object of type signed char
UCHAR_MAX: Maximum value for an object of type unsigned char
CHAR_MIN: Minimum value for an object of type char(unsigned)
CHAR_MAX: Maximum value for an object of type char(unsigned)
MB_LEN_MAX: Maximum number of bytes in a multibyte character.
SHRT_MIN: Minimum value for an object of type short int
SHRT_MAX: Maximum value for an object of type short int
USHRT_MAX: Maximum value for an object of type unsigned short int
INT_MIN: Minimum value for an object of type signed int
INT_MAX: Maximum value for an object of type signed int
UINT_MAX: Maximum value for an object of type unsigned int
LONG_MIN: Minimum value for an object of type signed long int
LONG_MAX: Maximum value for an object of type signed long int
ULONG_MAX: Maximum value for an object of type unsigned long int
locale.h
locale.h
locale.h (Localization not supported)
lconv localization structure
SETLOCALE() returns null
LOCALCONV() returns clocale
setjmp.h
setjmp.h
jmp_buf: An array used by the following functions
setjmp: Marks a return point for the next longjmp
longjmp: Jumps to the last marked point
201
C Compiler Reference Manual
Standard C Definitions
stddef.h
stddef.h
ptrdiff_t: The basic type of a pointer
size_t: The type of the sizeof operator (int)
wchar_t The type of the largest character set supported (char) (8 bits)
NULL A null pointer (0)
stdio.h
stdio.h
stderr The standard error stream (USE RS232 specified as stream or the
first USE RS232)
stdout The standard output stream (USE RS232 specified as stream last
USE RS232)
stdin The standard input stream (USE RS232 specified as stream last
USE RS232)
202
Standard C Definitions
stdlib.h
203
Compiler Error Messages
#ENDIF with no corresponding #IF
Compiler found a #ENDIF directive without a corresponding #IF.
#ERROR
205
C Compiler Reference Manual
Compiler Error Messages
Divide by zero
An attempt was made to divide by zero at compile time using constants.
Duplicate #define
The identifier in the #define has already been used in a previous #define. To
redefine an identifier use #UNDEF first. To prevent defines that may be included
from multiple source do something like:
206
Compiler Error Messages
· #ifndef ID
· #define ID text
· #endif
Duplicate function
A function has already been defined with this name. Remember that the
compiler is not case sensitive unless a #CASE is used.
Duplicate USE
Some USE libraries may only be invoked once since they apply to the entire
program such as #USE DELAY. These may not be changed throughout the
program.
Expect ;
Expect }
Expect comma
Expect WHILE
Expecting :
Expecting =
Expecting a (
Expecting a , or )
Expecting a , or }
Expecting a .
207
C Compiler Reference Manual
Compiler Error Messages
Expecting a ; or ,
Expecting a ; or {
Expecting a close paren
Expecting a declaration
Expecting a structure/union
Expecting a variable
Expecting a ]
Expecting a {
Expecting an =
Expecting an array
Expecting an identifier
Expecting function name
Expecting an opcode mnemonic
This must be a Microchip mnemonic such as MOVLW or BTFSC.
Too many assembly lines are being generated for a single C statement. Contact
CCS to increase the internal limits.
208
Compiler Error Messages
209
C Compiler Reference Manual
Compiler Error Messages
In the meantime if the error was on a particular line, look for another way to
perform the same operation. The error was probably caused by the syntax of the
identified statement. If the error was the last line of the code, the problem was in
linking. Look at the call tree for something out of the ordinary.
210
Compiler Error Messages
LVALUE required
This error will occur when a constant is used where a variable should be. For
example 4=5; will give this error.
Missing #ENDIF
A #IF was found without a corresponding #ENDIF.
211
C Compiler Reference Manual
Compiler Error Messages
No errors
The program has successfully compiled and all requested output files have been
created.
For example, a function A may perform a series of operations and have 20 local
variables declared. Upon analysis, it may be determined that there are two main
parts to the calculations and many variables are not shared between the parts. A
function B may be defined with 7 local variables and a function C may be defined
with 7 local variables. Function A now calls B and C and combines the results
and now may only need 6 variables. The savings are accomplished because B
and C are not executing at the same time and the same real memory locations
will be used for their 6 variables (just not at the same time). The compiler will
allocate only 13 locations for the group of functions A, B, C where 20 were
required before to perform the same operation.
212
Compiler Error Messages
213
C Compiler Reference Manual
Compiler Error Messages
214
Compiler Error Messages
Undefined identifier
The specified identifier is being used but has never been defined. Check the
spelling.
215
C Compiler Reference Manual
Compiler Error Messages
Unknown type
The specified type is used but not defined in the program. Check the spelling.
216
Compiler Error Messages
Unreachable code
Code included in the program is never executed. For example:
if(n==5)
goto do5;
goto exit;
if(n==20) // No way to get to this line
217
C Compiler Reference Manual
Compiler Error Messages
return;
218
Common Questions And Answers
How does one map a variable to an I/O port?
Two methods are as follows:
#byte PORTB = 6
#define ALL_OUT 0
#define ALL_IN 0xff
main() {
int i;
set_tris_b(ALL_OUT);
PORTB = 0;// Set all pins low
for(i=0;i<=127;++i) // Quickly count from 0
to 127
PORTB=i; // on the I/O port pin
set_tris_b(ALL_IN);
i = PORTB; // i now contains the portb value.
}
Remember when using the #BYTE, the created variable is treated like memory.
You must maintain the tri-state control registers yourself via the SET_TRIS_X
function. Following is an example of placing a structure on an I/O port:
struct port_b_layout
{int data : 4;
int rw : 1;
int cd : 1;
int enable : 1;
int reset : 1; };
struct port_b_layout port_b;
#byte port_b = 6
struct port_b_layout const INIT_1 = {0, 1,1,1,1};
struct port_b_layout const INIT_2 = {3, 1,1,1,0};
struct port_b_layout const INIT_3 = {0, 0,0,0,0};
struct port_b_layout const FOR_SEND = {0,0,0,0,0};
// All outputs
struct port_b_layout const FOR_READ =
{15,0,0,0,0};
// Data is an input
main() {
int x;
set_tris_b((int)FOR_SEND); // The constant
// structure is
219
C Compiler Reference Manual
Common Questions and Answers
// treated like
// a byte and
// is used to
// set the data
// direction
port_b = INIT_1;
delay_us(25);
set_tris_b((int)FOR_READ);
port_b.rw=0;
// Here the individual
port_b.cd=1; // fields are accessed
port_b.enable=0; // independently.
x = port_b.data;
port_b.enable=0
}
220
Common Questions And Answers
A. Check the clock on the target for accuracy. Crystals are usually not a
problem but RC oscillators can cause trouble with RS-232. Make sure the
#USE DELAY matches the actual clock frequency.
B. Make sure the PC (or other host) has the correct baud and parity setting.
D. Remember that PUTC(6) will send an ASCII 6 to the PC and this may not
be a visible character. PUTC('A') will output a visible character A.
A. Make sure that the tri-state registers are correct. The mode (standard,
fast, fixed) used will be whatever the mode is when the #USE RS232 is
encountered. Staying with the default STANDARD mode is safest.
main() {
while(TRUE)
putc('U');
}
Check the XMIT pin for activity with a logic probe, scope or whatever you
can. If you can look at it with a scope, check the bit time (it should be
1/BAUD). Check again after the level converter.
First be sure the PIC® can send data. Use the following main() for testing:
main() {
221
C Compiler Reference Manual
Common Questions and Answers
printf("start");
while(TRUE)
putc( getc()+1 );
}
5. The PIC® is always receiving data via RS-232 even when none is being sent.
A. Check that the INVERT option in the USE RS232 is right for your level
converter. If the RCV pin is HIGH when no data is being sent, you should
NOT use INVERT. If the pin is low when no data is being sent, you need to
use INVERT.
B. Check that the pin is stable at HIGH or LOW in accordance with A above
when no data is being sent.
A. When using a software RS232 (no built-in UART), the clock cannot be
really slow when fast baud rates are used and cannot be really fast with slow
baud rates. Experiment with the clock/baud rate values to find your limits.
B. When using the built-in UART, the requested baud rate must be within
3% of a rate that can be achieved for no error to occur. Some parts have
internal bugs with BRGH set to 1 and the compiler will not use this unless
you specify BRGH1OK in the #USE RS232 directive.
222
Common Questions And Answers
The #USE RS232 is not an executable line. It works much like a #DEFINE.
The following is an example program to read from one RS-232 port (A) and echo
the data to both the first RS-232 port (A) and a second RS-232 port (B).
main() {
char c;
fprintf(COM_A,"Online\n\r");
fprintf(COM_B,"Online\n\r");
while(TRUE) {
c = fgetc(COM_A);
223
C Compiler Reference Manual
Common Questions and Answers
fputc(c, COM_A);
fputc(c, COM_B);
}
}
224
Common Questions And Answers
The compiler makes every effort to optimize usage of RAM. Understanding the
RAM allocation can be a help in designing the program structure. The best re-
use of RAM is accomplished when local variables are used with lots of functions.
RAM is re-used between functions not active at the same time. See the NOT
ENOUGH RAM error message in this manual for a more detailed example.
RAM is also used for expression evaluation when the expression is complex.
The more complex the expression, the more scratch RAM locations the compiler
will need to allocate to that expression. The RAM allocated is reserved during
the execution of the entire function but may be re-used between expressions
within the function. The total RAM required for a function is the sum of the
parameters, the local variables and the largest number of scratch locations
required for any expression within the function. The RAM required for a function
is shown in the call tree after the RAM=. The RAM stays used when the function
calls another function and new RAM is allocated for the new function. However
when a function RETURNS the RAM may be re-used by another function called
by the parent. Sequential calls to functions each with their own local variables is
very efficient use of RAM as opposed to a large function with local variables
declared for the entire process at once.
Be sure to use SHORT INT (1 bit) variables whenever possible for flags and
other boolean variables. The compiler can pack eight such variables into one
byte location. The compiler does this automatically whenever you use SHORT
INT. The code size and ROM size will be smaller.
Finally, consider an external memory device to hold data not required frequently.
An external 8 pin EEPROM or SRAM can be connected to the PIC® with just 2
wires and provide a great deal of additional storage capability. The compiler
package includes example drivers for these devices. The primary drawback is a
slower access time to read and write the data. The SRAM will have fast read
and write with memory being lost when power fails. The EEPROM will have a
very long write cycle, but can retain the data when power is lost.
225
C Compiler Reference Manual
Common Questions and Answers
1. Stray code near the top of the program is sometimes under what looks like a
non-executable source line.
Some of the code generated by the compiler does not correspond to any
particular source line. The compiler will put this code either near the top of the
program or sometimes under a #USE that caused subroutines to be generated.
The compiler will create the .LST file in the order of the C source code. The
linker has re-arranged the code to properly fit the functions into the best code
pages and the best half of a code page. The resulting code is not in source
order. Whenever the compiler has a discontinuity in the .LST file, it will put a *
line in the file. This is most often seen between functions and in places where
INLINE functions are called. In the case of an INLINE function, the addresses
will continue in order up where the source for the INLINE function is located.
3. The compiler has gone insane and generated the same instruction over and
over.
For example:
...........A=0;
03F: CLRF 15
*
46:CLRF 15
*
051: CLRF 15
*
113: CLRF 15
This effect is seen when the function is an INLINE function and is called from
more than one place. In the above case, the A=0 line is in an INLINE function
called in four places. Each place it is called from gets a new copy of the code.
Each instance of the code is shown along with the original source line, and the
result may look unusual until the addresses and the * are noticed.
226
Common Questions And Answers
For example:
For example:
bytevar = (x>y)*4;
if( x>y )
bytevar=4;
else
bytevar=0;
SHORT INTs (bit variables) are treated the same as relational expressions.
They evaluate to 0 or 1.
For example:
bytevar = 54;
bitvar = bytevar; //bitvar will be 1 (bytevar ! =
O)
227
C Compiler Reference Manual
Common Questions and Answers
CCS makes every attempt to add new devices and device revisions as the data
and errata sheets become available.
PCW users can edit the device database. If the use of TRIS is a concern, simply
change the database entry for your part and the compiler will not use it.
228
Common Questions And Answers
The call 0 is actually 800H since Bit 11 of the address (Bit 3 of PCLATH, Reg 0A)
has been set.
229
C Compiler Reference Manual
Common Questions and Answers
BSF 3,5
MOVFW 20
Note that the BSF may not be immediately before the access since the compiler
optimizes out the redundant bank switches.
230
Common Questions And Answers
The compiler has a large set of built-in functions that will allow one to perform the
most common tasks with C function calls. When possible, it is best to use the
built-in functions rather than directly write to registers. Register locations change
between chips and some register operations require a specific algorithm to be
performed when a register value is changed. The compiler also takes into
account known chip errata in the implementation of the built-in functions. For
example, it is better to do set_tris_A(0); rather than *0x85=0;
231
C Compiler Reference Manual
Common Questions and Answers
BUT NOT
ptr = &TABLE [i];
Similar constructs using CONST may be used with any data type including
structures, longs and floats.
Note that in the implementation of the above table, a function call is made when
a table is accessed with a subscript that cannot be evaluated at compile time.
232
Common Questions And Answers
The delay=ms (100) is a quick and dirty debounce. In general, you will not want
to sit in an ISR for 100 MS to allow the switch to debounce. A more elegant
solution is to set a timer on the first interrupt and wait until the timer overflows.
Don’t process further changes on the pin.
233
C Compiler Reference Manual
Common Questions and Answers
Example Number
0 00 00 00 00
1 7F 00 00 00
-1 7F 80 00 00
10 82 20 00 00
100 85 48 00 00
123.45 85 76 E6 66
123.45E20 C8 27 4E 53
123.45 E-20 43 36 2E 17
234
Common Questions And Answers
Why does the compiler show less RAM than there really is?
Some devices make part of the RAM much more ineffective to access than the
standard RAM. In particular, the 509, 57, 66, 67,76 and 77 devices have this
problem.
By default, the compiler will not automatically allocate variables to the problem
RAM and, therefore, the RAM available will show a number smaller than
expected.
Example:
#BYTE counter=0x30
2. Use Read_Bank and Write_Bank to access the RAM like an array. This works
well if you need to allocate an array in this RAM.
Example:
For(i=0;i<15;i++)
Write_Bank(1,i,getc());
For(i=0;i<=15;i++)
PUTC(Read_Bank(1,i));
3. You can switch to larger pointers for full RAM access (this takes more ROM).
In PCB add *=8 to the #device and in PCM/PCH add *=16 to the #device.
Example:
#DEVICE PIC16C77 *=16
or
#include <16C77.h>
#device *=16
235
C Compiler Reference Manual
Common Questions and Answers
236
Common Questions And Answers
return(data);
}
237
C Compiler Reference Manual
Common Questions and Answers
The following is an example of how to time out of waiting for an RS232 character.
Note that without a hardware UART the delay_us should be less than a tenth of a
bit time (10 us at 9600 baud). With hardware you can make it up to 10 times the
bit time. (1000 us at 9600 baud). Use two counters if you need a timeout value
larger than 65535.
short timeout_error;
char timed_getc() {
long timeout;
timeout_error=FALSE;
timeout=0;
while(!kbhit&&(++timeout<50000)) // 1/2 second
delay_us(10);
if(kbhit())
return(getc());
else {
timeout_error=TRUE;
return(0);
}
}
238
Common Questions And Answers
If your application needs to use a few different pins not known at compile time
consider:
switch(pin_to_use) {
case PIN_B3 : output_high(PIN_B3); break;
case PIN_B4 : output_high(PIN_B4); break;
case PIN_B5 : output_high(PIN_B5); break;
case PIN_A1 : output_high(PIN_A1); break;
}
#byte portb = 6
#byte portb_tris = 0x86 // **
*(pin_to_use/8) |= (1<<(pin_to_use&7));
** These lines are only required if you need to change the direction register
(TRIS).
239
C Compiler Reference Manual
Common Questions and Answers
For example:
#INCLUDE <16F877.h>
#DEVICE ICD=TRUE
240
Common Questions And Answers
run_task(tasks task_to_run) {
switch(task_to_run) {
case taskA : taskA_main(); break;
case taskB : taskB_main(); break;
case taskC : taskC_main(); break;
}
241
C Compiler Reference Manual
Common Questions and Answers
Unsigned 8 bit operations are quite fast and floating point is very slow. If
possible consider fixed point instead of floating point. For example instead of
"float cost_in_dollars;" do "long cost_in_cents;". For trig formulas consider a
lookup table instead of real time calculations (see EX_SINE.C for an example).
The following are some rough times on a 20 mhz, 14 bit PIC®. Note times will
vary depending on memory banks used.
242
Common Questions And Answers
Assigning a smaller signed expression to a larger signed variable will result in the
sign being maintained. For example, a signed 8 bit int that is -1 when assigned
to a 16 bit signed variable is still -1.
Signed numbers that are negative when assigned to a unsigned number will
cause the 2's complement value to be assigned. For example, assigning -1 to a
int8 will result in the int8 being 255. In this case the sign bit is not extended
(conversion to unsigned is done before conversion to more bits). This means the
-1 assigned to a 16 bit unsigned is still 255.
When a binary operator has operands of differing types then the lower order
operand is converted (using the above rules) to the higher. The order is as
follows:
• Float
• Signed 32 bit
• Unsigned 32 bit
• Signed 16 bit
• Unsigned 16 bit
• Signed 8 bit
• Unsigned 8 bit
• 1 bit
The result is then the same as the operands. Each operator in an expression is
evaluated independently. For example:
243
C Compiler Reference Manual
Common Questions and Answers
The + operator is 8 bit, the result is converted to 16 bit after the addition and the -
is 16 bit, that result is converted to 32 bit and the assignment is done. Note that
if i8 is 200 and i16 is 400 then the result in i32 is 256. (200 plus 200 is 144 with a
8 bit +)
Explicit conversion may be done at any point with (type) inserted before the
expression to be converted. For example in the above the perhaps desired effect
may be achieved by doing:
In this case the first i8 is converted to 16 bit, then the add is a 16 bit add and the
second i8 is forced to 16 bit.
i16 = i8 * 100;
Remember that with unsigned ints (the default for this compiler) the values are
never negative. For example 2-4 is 254 (in 8 bit). This means the following is an
endless loop since i is never less than 0:
int i;
for( i=100; i>=0; i--)
244
Example Programs
EXAMPLE PROGRAMS
A large number of example programs are included with the software. The
following is a list of many of the programs and some of the key programs are re-
printed on the following pages. Most programs will work with any chip by just
changing the #INCLUDE line that includes the device information. All of the
following programs have wiring instructions at the beginning of the code in a
comment header. The SIOW.EXE program included in the program directory
may be used to demonstrate the example programs. This program will use a PC
COM port to communicate with the target.
Generic header files are included for the standard PIC® parts. These files are in
the DEVICES directory. The pins of the chip are defined in these files in the form
PIN_B2. It is recommended that for a given project, the file is copied to a project
header file and the PIN_xx defines be changed to match the actual hardware.
For example; LCDRW (matching the mnemonic on the schematic). Use the
generic include files by placing the following in your main .C file:
#include <16C74.H>
EX_14KAD.C
An analog to digital program with calibration for the PIC14000
EX_1920.C
Uses a Dallas DS1920 button to read temperature
EX_8PIN.C
Demonstrates the use of 8 pin PICs with their special I/O requirements
EX_92LCD.C
Uses a PIC16C92x chip to directly drive LCD glass
EX_AD12.C
Shows how to use an external 12 bit A/D converter
EX_ADMM.C
A/D Conversion example showing min and max analog readings
EX_CCP1S.C
Generates a precision pulse using the PIC CCP module
245
C Compiler Reference Manual
Example Programs
EX_CCPMP.C
Uses the PIC CCP module to measure a pulse width
EX_COMP.C
Uses the analog comparator and voltage reference available on some PICs
EX_CRC.C
Calculates CRC on a message showing the fast and powerful bit operations
EX_CUST.C
Change the nature of the compiler using special preprocessor directives
EX_FIXED.C
Shows fixed point numbers
EX_DNSLOOKUP.C
Example to perform a DNS lookup on the internet
EX_DPOT.C
Controls an external digital POT
EX_DTMF.C
Generates DTMF tones
EX_EMAIL.C
Program will send e-mail
EX_ENCOD.C
Interfaces to an optical encoder to determine direction and speed
EX_EXPIO.C
Uses simple logic chips to add I/O ports to the PIC
EX_EXSIO.C
Shows how to use a multi-port external UART chip
EX_EXTEE.C
Reads and writes to an external EEPROM
EX_FLOAT.C
Shows how to use basic floating point
246
Example Programs
EX_FREQC.C
A 50 mhz frequency counter
EX_GLINT.C
Shows how to define a custom global interrupt handler for fast interrupts
EX_ICD.C
Shows a simple program for use with Microchips ICD debugger
EX_INTEE.C
Reads and writes to the PIC internal EEPROM
EX_LCDKB.C
Displays data to an LCD module and reads data for keypad
EX_LCDTH.C
Shows current, min and max temperature on an LCD
EX_LED.C
Drives a two digit 7 segment LED
EX_LOAD.C
Serial boot loader program for chips like the 16F877
EX_LOGGER.C
A simple temperature data logger, uses the flash program memory for saving
data
EX_MACRO.C
Shows how powerful advanced macros can be in C
EX_MOUSE.C
Shows how to implement a standard PC mouse on a PIC
EX_MXRAM.C
Shows how to use all the RAM on parts will problem memory allocation
EX_PATG.C
Generates 8 square waves of different frequencies
EX_PBUSM.C
Generic PIC to PIC message transfer program over one wire
247
C Compiler Reference Manual
Example Programs
EX_PBUSR.C
Implements a PIC to PIC shared RAM over one wire
EX_PBUTT.C
Shows how to use the B port change interrupt to detect pushbuttons
EX_PGEN.C
Generates pulses with period and duty switch selectable
EX_PLL.C
Interfaces to an external frequency synthesizer to tune a radio
EX_PSP.C
Uses the PIC PSP to implement a printer parallel to serial converter
EX_PULSE.C
Measures a pulse width using timer0
EX_PWM.C
Uses the PIC CCP module to generate a pulse stream
EX_REACT.C
Times the reaction time of a relay closing using the CCP module
EX_RMSDB.C
Calculates the RMS voltage and dB level of an AC signal
EX_RTC.C
Sets and reads an external Real Time Clock using RS232
EX_RTCLK.C
Sets and reads an external Real Time Clock using an LCD and keypad
EX_SINE.C
Generates a sine wave using a D/A converter
EX_SISR.C
Shows how to do RS232 serial interrupts
EX_STISR.C
Shows how to do RS232 transmit buffering with interrupts
248
Example Programs
EX_SLAVE.C
Simulates an I2C serial EEPROM showing the PIC slave mode
EX_SPEED.C
Calculates the speed of an external object like a model car
EX_SPI.C
Communicates with a serial EEPROM using the H/W SPI module
EX_SQW.C
Simple Square wave generator
EX_SRAM.C
Reads and writes to an external serial RAM
EX_STEP.C
Drives a stepper motor via RS232 commands and an analog input
EX_STR.C
Shows how to use basic C string handling functions
EX_STWT.C
A stop Watch program that shows how to user a timer interrupt
EX_TANK.C
Uses trig functions to calculate the liquid in a odd shaped tank
EX_TEMP.C
Displays (via RS232) the temperature from a digital sensor
EX_TGETC.C
Demonstrates how to timeout of waiting for RS232 data
EX_TONES.C
Shows how to generate tones by playing "Happy Birthday"
EX_TOUCH.C
Reads the serial number from a Dallas touch device
EX_USB_HID.C
Implements a USB HID device on the PIC16C765 or an external USB chip
249
C Compiler Reference Manual
Example Programs
EX_USB_SCOPE.C
Implements a USB bulk mode transfer for a simple oscilloscope on an ext USB
chip
EX_VOICE.C
Self learning text to voice program
EX_WAKUP.C
Shows how to put a chip into sleep mode and wake it up
EX_WDT.C
Shows how to use the PIC watch dog timer
EX_WDT18.C
Shows how to use the PIC18 watch dog timer
EX_WEBSV.C
Shows how to implement a simple web server
EX_X10.C
Communicates with a TW523 unit to read and send power line X10 codes
14KCAL.C
Calibration functions for the PIC14000 A/D converter
2401.C
Serial EEPROM functions
2402.C
Serial EEPROM functions
2404.C
Serial EEPROM functions
2408.C
Serial EEPROM functions
24128.C
Serial EEPROM functions
250
Example Programs
2416.C
Serial EEPROM functions
24256.C
Serial EEPROM functions
2432.C
Serial EEPROM functions
2465.C
Serial EEPROM functions
25160.C
Serial EEPROM functions
25320.C
Serial EEPROM functions
25640.C
Serial EEPROM functions
25C080.C
Serial EEPROM functions
68HC68R1
C Serial RAM functions
68HC68R2.C
Serial RAM functions
74165.C
Expanded input functions
74595.C
Expanded output functions
9346.C
Serial EEPROM functions
9356.C
Serial EEPROM functions
251
C Compiler Reference Manual
Example Programs
9356SPI.C
Serial EEPROM functions (uses H/W SPI)
9366.C
Serial EEPROM functions
AD7705.C
A/D Converter functions
AD7715.C
A/D Converter functions
AD8400.C
Digital POT functions
ADS8320.C
A/D Converter functions
ASSERT.H
Standard C error reporting
AT25256.C
Serial EEPROM functions
AT29C1024.C
Flash drivers for an external memory chip
CRC.C
CRC calculation functions
CE51X.C
Functions to access the 12CE51x EEPROM
CE62X.C
Functions to access the 12CE62x EEPROM
CE67X.C
Functions to access the 12CE67x EEPROM
CTYPE.H
Definitions for various character handling functions
252
Example Programs
DNS.C
Functions used to perform a DNS lookup on the internet
DS1302.C
Real time clock functions
DS1621.C
Temperature functions
DS1621M.C
Temperature functions for multiple DS1621 devices on the same bus
DS1631.C
Temperature functions
DS1624.C
Temperature functions
DS1868.C
Digital POT functions
ERRNO.H
Standard C error handling for math errors
FLOAT.H
Standard C float constants
FLOATEE.C
Functions to read/write floats to an EEPROM
INPUT.C
Functions to read strings and numbers via RS232
ISD4003.C
Functions for the ISD4003 voice record/playback chip
KBD.C
Functions to read a keypad
LCD.C
LCD module functions
253
C Compiler Reference Manual
Example Programs
LIMITS.H
Standard C definitions for numeric limits
LMX2326.C
PLL functions
LOADER.C
A simple RS232 program loader
LOCALE.H
Standard C functions for local language support
LTC1298.C
12 Bit A/D converter functions
MATH.H
Various standard trig functions
MAX517.C
D/A converter functions
MCP3208.C
A/D converter functions
NJU6355.C
Real time clock functions
PCF8570.C
Serial RAM functions
PIC_USB.H
Hardware layer for built-in PIC USB
RS485.C
Driver for a RS485 protocol implementation
S7600.H
Driver for Seiko S7600 TCP/IP chip
SC28L19X.C
Driver for the Phillips external UART (4 or 8 port)
SETJMP.H
254
Example Programs
SMTP.H
e-mail functions
STDDEF.H
Standard C definitions
STDIO.H
Not much here - Provided for standard C compatibility
STDLIB.H
String to number functions
STDLIBM.H
Standard C memory management functions
STRING.H
Various standard string functions
TONES.C
Functions to generate tones
TOUCH.C
Functions to read/write to Dallas touch devices
USB.H
Standard USB request and token handler code
USBN960X.C
Functions to interface to Nationals USBN960x USB chips
USB.C
USB token and request handler code, also includes usb_desc.h and usb.h
X10.C
Functions to read/write X10 codes
255
C Compiler Reference Manual
Example Programs
/////////////////////////////////////////////////////////////////
/// EX_SQW.C ///
///This program displays a message over the RS-232 and ///
/// waits for any keypress to continue. The program ///
///will then begin a 1khz square wave over I/O pin B0. ///
/// Change both delay_us to delay_ms to make the ///
/// frequency 1 hz. This will be more visible on ///
/// a LED. Configure the CCS prototype card as ///
/// follows: insert jumpers from 11 to 17, 12 to 18, ///
/// and 42 to 47. ///
/////////////////////////////////////////////////////////////////
#ifdef __PCB__
#include <16C56.H>
#else
#include <16C84.H>
#endif
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)
main() {
printf("Press any key to begin\n\r");
getc();
printf("1 khz signal activated\n\r");
while (TRUE) {
output_high (PIN_B0);
delay_us(500);
output_low(PIN_B0);
delay_us(500);
}
}
256
Example Programs
///////////////////////////////////////////////////////////////
/// EX_STWT.C ///
/// This program uses the RTCC (timer0) and ///
/// interrupts to keep a real time seconds counter. ///
/// A simple stop watch function is then implemented. ///
///Configure the CCS prototype card as follows, insert ///
/// jumpers from: 11 to 17 and 12 to 18. ///
///////////////////////////////////////////////////////////////
#include <16C84.H>
#use delay (clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2_
#define INTS_PER_SECOND 76 //(20000000/(4*256*256))
byte seconds; //Number of interrupts left
//before a second has elapsed
if(--int_count==0) {
++seconds;
int_count=INTS_PER_SECOND;
}
}
main() {
byte start;
int_count=INTS_PER_SECOND;
set_rtcc(0);
setup_counters (RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts (INT_RTCC);
enable_interrupts(GLOBAL)
do {
printf ("Press any key to begin. \n\r");
getc();
start=seconds;
printf("Press any key to stop. \n\r");
getc();
printf ("%u seconds. \n\r", seconds-start);
} while (TRUE);
}
257
C Compiler Reference Manual
Example Programs
////////////////////////////////////////////////////////
/// EX_INTEE.C ///
///This program will read and write to the ’83 or ’84 ///
/// internal EEPROM. Configure the CCS prototype ///
///card as follows: insert jumpers from 11 to 17 and ///
/// 12 to 18. ///
////////////////////////////////////////////////////////
#include <16C84.H>
#use delay(clock-100000000)
#use rs232 (baud=9600, xmit=PIN_A3, rv+PIN_A2)
#include <HEX.C>
main() {
byte i,j,address, value;
do {
printf("\r\n\nEEPROM: \r\n") //Displays contents
for(i=0; i<3; ++i) { //entire EEPROM
for (j=0; j<=15; ++j) { //in hex
printf("%2x", read_eeprom(i+16+j));
}
printf("\n\r");
}
printf ("\r\nlocation to change: ");
address= gethex();
printf ("\r\nNew value: ");
value=gethex();
258
Example Programs
///////////////////////////////////////////////////////////////
///Library for a Microchip 93C56 configured for a x8 ///
/// ///
/// org init_ext_eeprom(); Call before the other ///
/// functions are used ///
/// ///
/// write_ext_eeprom(a,d); Write the byte d to ///
/// the address a ///
/// ///
/// d=read_ext_eeprom (a); Read the byte d from ///
/// the address a. ///
/// The main program may define eeprom_select, ///
/// eeprom_di, eeprom_do and eeprom_clk to override ///
/// the defaults below. ///
///////////////////////////////////////////////////////////////
#ifndef EEPROM_SELECT
#endif
void init_ext_eeprom() {
byte cmd[2];
byte i;
output_low(EEPROM_DI);
output_low(EEPROM_CLK);
output_low(EEPROM_SELECT);
cmd[0]=0x80;
cmd[1]=0x9;
259
C Compiler Reference Manual
Example Programs
cmd[0]=data;
cmd[1]=address;
cmd[2]=0xa;
for(i=1;i<=4;++i)
shift_left(cmd,3,0);
output_high(EEPROM_SELECT);
for(i=1;i<=20;++i) {
output_bit (EEPROM_DI, shift_left (cmd,3,0));
output_high (EEPROM_CLK);
output_low(EEPROM_CLK);
}
output_low (EEPROM_DI);
output_low (EEPROM_SELECT);
delay_ms(11);
}
cmd[0]=0;
cmd[1]=address;
cmd[2]=0xc;
for(i=1;i<=4;++i)
shift_left(cmd,3,0);
output_high(EEPROM_SELECT);
for(i=1;i<=20;++i) {
output_bit (EEPROM_DI, shift_left (cmd,3,0));
output_high (EEPROM_CLK);
output_low(EEPROM_CLK);
if (i>12)
shift_left (&data, 1, input (EEPROM_DO));
}
output_low (EEPROM_SELECT);
return(data);
}
260
SOFTWARE LICENSE AGREEMENT
By opening the software diskette package, you agree to abide by the following
provisions. If you choose not to agree with these provisions promptly return the
unopened package for a refund.
1. License- Custom Computer Services ("CCS") grants you a license to use the
software program ("Licensed Materials") on a single-user computer. Use of the
Licensed Materials on a network requires payment of additional fees.
3. Warranty- CCS warrants the media to be free from defects in material and
workmanship and that the software will substantially conform to the related
documentation for a period of thirty (30) days after the date of your purchase.
CCS does not warrant that the Licensed Materials will be free from error or will
meet your specific requirements.
Neither CCS nor any applicable licensor will be liable for an incidental or
consequential damages, including but not limited to lost profits.
261