MPLAB Va Lap Trinh C
MPLAB Va Lap Trinh C
MPLAB Va Lap Trinh C
Information contained in this publication regarding device applications and the like is intended by way of suggestion only. No representation or warranty is given and no liability is assumed by Microchip Technology Incorporated with respect to the accuracy or use of such information. Use of Microchips products as critical components in life support systems is not authorized except with express written approval by Microchip. 2000 Microchip Technology Incorporated. All rights reserved. The Microchip logo, name, MPLAB, PIC, PICSTART, PRO MATE, and PICmicro are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. Microsoft, the Microsoft Internet Explorer, Windows, and MS-DOS are registered trademarks of Microsoft Corporation in the United States and/or other countries. Netscape is a registered trademark of Netscape Corporation in the United States and/or other countries. Microwire is a registered trademark of National Semiconductor Corporation. I2C is a trademark of Philips Corporation. SPI is a registered trademark of Motorola Corporation All product/company trademarks mentioned herein are the property of their respective companies.
2000 Microchip Technology Inc. DS51217B
DS51217B
DS51217B-page i
Chapter 2.
MPLAB-CXX Installation
2.1 Introduction .................................................................................15 2.2 Highlights ....................................................................................15 2.3 Host Computer System Requirements .......................................15 2.4 Compiler Versions ......................................................................15 2.5 Installation ..................................................................................16
Chapter 3.
MPLAB-CXX Overview
3.1 Introduction .................................................................................19 3.2 Highlights ....................................................................................19 3.3 Overview of Compilers ...............................................................19 3.4 Compiler Input/Output Files ........................................................21 3.5 Compiler Resource Requirements .............................................22
Chapter 4.
DS51217B-page ii
Table Of Contents
Chapter 5. Using MPLAB-CXX with MPLAB IDE
5.1 Introduction ................................................................................ 37 5.2 Highlights ................................................................................... 37 5.3 MPLAB-CXX MPLAB Projects Overview ................................ 37 5.4 Using MPLAB-C17 with MPLAB IDE A Tutorial ...................... 40 5.5 Using MPLAB-C18 with MPLAB IDE A Tutorial ...................... 54 5.6 Going Forward ........................................................................... 68
DS51217B-page iii
Chapter 7.
MPLAB-CXX Fundamentals
7.1 Introduction .................................................................................75 7.2 Highlights ....................................................................................75 7.3 Preprocessor Directives .............................................................76 7.4 Comments ..................................................................................85 7.5 Constants ...................................................................................86 7.6 Variables .....................................................................................88 7.7 Functions ....................................................................................96 7.8 Operators ....................................................................................99 7.9 Program Control Statements ....................................................106 7.10 Arrays and Strings ....................................................................112 7.11 Pointers ....................................................................................115 7.12 Structures and Unions ..............................................................118
Chapter 8.
DS51217B-page iv
Table Of Contents
Chapter 9. Mixing Assembly Language and C Modules
9.1 Introduction .............................................................................. 139 9.2 Highlights ................................................................................. 139 9.3 Calling Conventions ................................................................. 139 9.4 Mixing Assembly Language and C Variables and Functions ... 140 9.5 Calling an Assembly Function in C MPLAB-C17 .................. 141 9.6 Using the File Selection Registers (FSRs) .............................. 142
DS51217B-page v
Appendix F. References
F.1 Introduction ...............................................................................185 F.2 Highlights ..................................................................................185 F.3 C Standards Information ...........................................................185 F.4 General C Information ..............................................................185
DS51217B-page vi
Table Of Contents
Glossary ..................................................................................................187
Introduction ...................................................................................... 187 Highlights ......................................................................................... 187 Terms .............................................................................................. 187
DS51217B-page vii
DS51217B-page viii
Highlights
The information you will garner from this chapter: About this Guide Recommended Reading Warranty Registration Troubleshooting The Microchip Internet Web Site Development Systems Customer Notification Service Customer Support
DS51217B-page 1
DS51217B-page 2
General Information
General Information
Curly brackets and Choice of mutually exclusive pipe character: { | } arguments An OR selection Lower case charac- Type of data ters in quotes Ellipses... Used to imply (but not show) additional text that is not relevant to the example A hexadecimal number where n is a hexadecimal digit
A variable argument; it can be char isascii either a type of data (in lower (char, ch); case characters) or a specific example (in uppercase characters).
Interface (Helvetica font): Underlined, italic A menu selection from the text with right arrow menu bar Bold characters A window or dialog button to click
Characters in angle A key on the keyboard brackets < > Documents (Helvetica font): Italic characters Referenced books
Updates
All documentation becomes dated, and this users guide is no exception. Since MPLAB IDE, MPLAB-C17, MPLAB-C18 and other Microchip tools are constantly evolving to meet customer needs, some MPLAB IDE dialogs and/ or tool descriptions may differ from those in this document. Please refer to our web site to obtain the latest documentation available.
DS51217B-page 3
Recommended Reading
This users guide describes how to use MPLAB-C17 and MPLAB-C18. For more information on included libraries and precompiled object files for the compilers, the operation of MPLAB IDE and the use of other tools, the following are recommended reading. MPLAB-CXX Reference Guide Libraries and Precompiled Object Files (DS51224) Reference guide for MPLAB-CXX libraries and precompiled object files. Lists all library functions with a detailed description of their use. README.C17, README.C18 For the latest information on using MPLAB-C17 or MPLAB-C18, read the README.C17 or README.C18 file (ASCII text) included with the software. These README files contain update information that may not be included in this document. README.XXX For the latest information on other Microchip tools (MPLAB, MPLINK, etc.), read the associated README files (ASCII text file) included with the MPLAB IDE software. MPLAB IDE Users Guide (DS51025) Comprehensive guide that describes installation and features of Microchips MPLAB Integrated Development Environment (IDE), as well as the editor and simulator functions in the MPLAB IDE environment. MPASM Users Guide with MPLINK and MPLIB (DS33014) This users guide describes how to use the Microchip PICmicro MCU assembler (MPASM), the linker (MPLINK) and the librarian (MPLIB). Technical Library CD-ROM (DS00161) This CD-ROM contains comprehensive application notes, data sheets, and technical briefs for all Microchip products. To obtain this CD-ROM, contact the nearest Microchip Sales and Service location (see back page).
DS51217B-page 4
General Information
General Information
Microchip Web Site Our web site (http://www.microchip.com) contains a wealth of documentation. Individual data sheets, application notes, tutorials and users guides are all available for easy download. All documentation is in Adobe Acrobat (pdf) format. Microsoft Windows Manuals This manual assumes that users are familiar with the Microsoft Windows operating system. Many excellent references exist for this software program, and should be consulted for general operation of Windows.
Troubleshooting
See the README files for information on common problems not addressed in this users guide.
DS51217B-page 5
DS51217B-page 6
General Information
General Information
Compilers
The latest information on Microchip C compilers, Linkers and Assemblers. These include MPLAB-C17, MPLAB-C18, MPLINK, MPASM as well as the Librarian, MPLIB for MPLINK. To SUBSCRIBE to this list, send a message to: listserv@mail.microchip.com with the following as the body: subscribe compilers yourname
DS51217B-page 7
Programmers
The latest information on Microchip PICmicro MCU device programmers. These include PRO MATE II and PICSTART Plus. To SUBSCRIBE to this list, send a message to: listserv@mail.microchip.com with the following as the body: subscribe programmers yourname
MPLAB IDE
The latest information on Microchip MPLAB IDE, the Windows Integrated Development Environment for development systems tools. This list is focused on MPLAB IDE, MPLAB-SIM, MPLAB Project Manager and general editing and debugging features. For specific information on MPLAB IDE compilers, linkers and assemblers, subscribe to the COMPILERS list. For specific information on MPLAB IDE emulators, subscribe to the EMULATORS list. For specific information on MPLAB IDE device programmers, please subscribe to the PROGRAMMERS list. To SUBSCRIBE to this list, send a message to: listserv@mail.microchip.com with the following as the body: subscribe mplab yourname
DS51217B-page 8
General Information
General Information
Customer Support
Users of Microchip products can receive assistance through several channels: Distributor or Representative Local Sales Office Field Application Engineer (FAE) Corporate Applications Engineer (CAE) Hot line Customers should call their distributor, representative, or field application engineer (FAE) for support. Local sales offices are also available to help customers. See the back cover for a listing of sales offices and locations. Corporate applications engineers (CAEs) may be contacted at (480) 786-7627. In addition, there is a Systems Information and Upgrade Line. This line provides system users a listing of the latest versions of all of Microchip's development systems software products. Plus, this line provides information on how customers can receive any currently available upgrade kits. The Hot Line Numbers are: 1-800-755-2345 for U.S. and most of Canada, and 1-480-786-7302 for the rest of the world.
DS51217B-page 9
DS51217B-page 10
DS51217B-page 11
DS51217B-page 12
MPLAB-CXX COMPILER USERS GUIDE Chapter 1. MPLAB-CXX Preview 1.1 1.2 Introduction
This chapter will give you a preview of MPLAB-C17 and MPLAB-C18.
Highlights
This chapter covers the following topics: What MPLAB-CXX Is What MPLAB-CXX Does ANSI Compatibility Tool Compatibility
1.3
What MPLAB-CXX Is
MPLAB-CXX is a term used to refer to both the MPLAB-C17 and MPLAB-C18 compilers. The MPLAB-C17 and MPLAB-C18 compilers are full-featured ANSI C compilers for the Microchip Technology PIC17CXXX and PIC18CXXX PICmicro 8-bit microcontrollers, respectively. The compilers are fully compatible with Microchips MPLAB Integrated Development Environment (IDE), allowing source-level debugging with both the MPLAB-ICE in-circuit emulator and the MPLAB-SIM simulator. MPLAB IDE provides a convenient, project-oriented development environment that reduces development time. MPLAB-C17 and MPLAB-C18 have implemented extensions to the C language to provide specific support for Microchips PICmicro MCU peripherals. The C libraries include: A/D converter, Input Capture, Interrupt Support Macros, SPI, Timers, USART, I2C, I/O Port, Pulse Width Modulation, Reset, External LCD, Software SPI, Software I2C, Software USART, Character Classification, Relay, Memory/String Manipulation, and Number/Text Conversion.
DS51217B-page 13
1.5
ANSI Compatibility
MPLAB-C17 and MPLAB-C18 are free-standing ANSI C implementations except where specifically noted in this users guide. These compilers deviate from the ANSI standard only where the standard conflicts with efficient PICmicro MCU support. See Chapter 10 and the README files for details.
1.6
Tool Compatibility
MPLAB-C17 and MPLAB-C18 are compatible with all Microchip development systems currently in production. This includes MPLAB-SIM (PICmicro MCU discrete-event simulator), MPLAB-ICE (PICmicro MCU Universal In-Circuit Emulator), PRO MATE II (the Microchip Universal Programmer), and PICSTART Plus (the Microchip low-cost development programmer).
DS51217B-page 14
2.2
Highlights
This chapter includes: Host Computer System Requirements Compiler Versions Installation
2.3
2.4
Compiler Versions
There are two versions of MPLAB-C17: a DOS-extended version, mcc17d.exe a Windows 32-bit version (Windows 9x/NT native), mcc17.exe and one version of MPLAB-C18: a Windows 32-bit version (Windows 9x/NT native), mcc18.exe All compilers are command line programs. mcc17d.exe is used with DOS or Windows 3.x. mcc17.exe and mcc18.exe are used with Windows 95/98 or Windows NT. You can use all versions with MPLAB IDE, though the Windows 9x/Windows NT native versions are recommended.
DS51217B-page 15
Figure 2.1: Choose Destination Location The next dialog is Select Components. It is recommended that you install all components. Not doing so may cause certain MPLAB-C17 items not to function properly. Once you are more familiar with the compiler, you may go back and re-install it with fewer components, but for people new to MPLAB-C17, it is best to have all components installed. Click Next to proceed.
DS51217B-page 16
MPLAB-CXX Installation
Figure 2.2: Select Components The Select Program Manager dialog should now be visible. Choose the default group of Microchip MPLAB-C17 or pick another group from the list. Click Next to continue.
Figure 2.3: Select Program Manager Group The next dialog is the Start Installation dialog. To complete the installation, click Next. To quit the installation at this point, click Cancel.
DS51217B-page 17
In addition, MPLAB-C17 install will create an environment variable, MCC_INCLUDE, in your AUTOEXEC.BAT file. The MCC_INCLUDE environment variable specifies the directories to search for included files. For more information, refer to the #include directive. The install program will also add the compiler bin directory to your PATH so you can run the compiler from any other directory.
DS51217B-page 18
MPLAB-CXX COMPILER USERS GUIDE Chapter 3. MPLAB-CXX Overview 3.1 3.2 Introduction
This chapter presents an overview of the compiler operation.
Highlights
This chapter includes: Overview of Compilers Compiler Input/Output Files Compiler Resource Requirements
3.3
Overview of Compilers
MPLAB-C17 and MPLAB-C18 generate object code from C source code. This object code is then input into Microchips MPLINK linker to form the final executable code. A single C source file may be compiled into a single executable as shown in Figure 3.1, or it can be linked with other separately assembled or compiled modules as shown in Figure 3.2. Related modules can also be grouped and stored together in a library using Microchips MPLIB Librarian (Figure 3.3). Required libraries can be specified at link time, and only the modules which are needed will be included in the final executable. For more information on MPLINK and MPLIB operation, please refer to the MPASM Users Guide with MPLINK and MPLIB (DS33014).
MAIN.C
MPLINK MPLAB-CXX
MAIN.HEX
Programmer
MCU
MAIN.O
DS51217B-page 19
UNITS.LIB
MAIN.C
MPLINK MPLAB-CXX
MAIN.HEX
Programmer
MCU
MAIN.O
MORE.C
MPLAB-CXX
MORE.O
UNIT1.C
MPLIB MPLAB-CXX
UNIT1.O
UNIT2.C
MPLIB MPLAB-CXX
UNITS.LIB
UNIT2.O
UNIT3.C
MPLIB MPLAB-CXX
UNIT3.O
DS51217B-page 20
3.4.1
3.4.2
3.4.3
DS51217B-page 21
DS51217B-page 22
MPLAB-CXX COMPILER USERS GUIDE Chapter 4. Using MPLAB-CXX without MPLAB IDE 4.1 Introduction
This chapter discusses how to use MPLAB-CXX from the command line (without MPLAB IDE).
4.2
Highlights
This chapter includes: MPLAB-CXX Command Line Overview Using MPLAB-C17 on the Command Line Using MPLAB-C18 on the Command Line Going Forward
4.3
DS51217B-page 23
MPLAB-CXX
MPASM
main.o
prog.o
object files
math.lib
device.lkr
MPLINK
LINKER
prog.out
prog.cod
prog.hex
prog.lst
prog.map
output files
PROGRAMMERS
DS51217B-page 24
DS51217B-page 25
MPLAB-CXX Compiler Users Guide 4.4 Using MPLAB-C17 on the Command Line
In this section, the following is discussed: Command Line Interface How to Compile a Single File on the Command Line How to Compile Multiple Files on the Command Line
4.4.1
Description
-Or[+|-]
Enabled
DS51217B-page 26
Description
When this optimization is on, the default storage class for local variables and function parameters is static. When this optimization in on, far pointers to RAM are assumed to not point to SFRs. This simplifies setting the bank for access. Select the memory model (see Section 8.3.1). s: small model (near ram, near rom) m: medium model (near ram, far rom) c: compact model (far ram, near rom) l: large model (far ram, far rom) Select to compile for the designated processor. Define a macro. Equivalent to placing the following at the head of the file: #define macro text Set compiler message level. 1 display errors only 2 display errors and warnings 3 display errors, warnings, and messages Suppress message number #. Error messages cannot be suppressed. Suppress the sign-on banner (Quiet mode).
-Op[+|-]
Disable
-m{s|m|c|l}
-p=processor
17C44
-dmacro[=text]
-w{1|2|3}
-nw# -q
4.4.2
Example Files There are a number of examples in the folder c:\mcc\examples. Execution of the batch file should compile each example after MPLAB-C17 is set up. You can use these files as cookbooks to begin development of your application.
DS51217B-page 27
DS51217B-page 28
DS51217B-page 29
2. To compile these two files, the command lines would be: mcc17 ex1.c -p=17c756a mcc17 add.c -p=17c756a 3. Then link the resulting object files with the precompiled object files as follows (This should be entered on one line): mplink ex1.o add.o -l c:\mcc\lib c0s17.o p17c756a.o -k c:\mcc\lkr p17c756s.lkr -m exl.map -o exl.out This will produce a hex file and other output files described in the previous section.
DS51217B-page 30
Using MPLAB-CXX without MPLAB IDE 4.5 Using MPLAB-C18 on the Command Line
In this section, the following is discussed: Command Line Interface How to Compile a Single File on the Command Line How to Compile Multiple Files on the Command Line
4.5.1
Description
DS51217B-page 31
Description
Disable/Enable integer promotions. Disable/Enable duplicate string merging. Set banking optimizer level. Select the memory model (see Section 8.3.1). s: small model (near rom) l: large model (far rom) Disable/Enable unreachable code removal Disable/Enable branch optimizations Select to compile for the designated processor or family (PIC18CXX) Define a macro. Equivalent to placing the following at the head of the file: #define macro text Set compiler message level. 1 display errors only 2 display errors and warnings 3 display errors, warnings, and messages Suppress message number #. Error messages cannot be suppressed. Suppress the sign-on banner (Quiet mode). Enables LFSR workaround. Display a list of all diagnostic messages. Display help for all diagnostic messages. Display help on diagnostic number n.
-dmacro [=text]
-w{1|2|3}
DS51217B-page 32
DS51217B-page 33
DS51217B-page 34
2. To compile these two files, the command lines would be: mcc18 ex1.c -p=18c452 mcc18 add.c -p=18c452 3. Then link the resulting object files with the start-up code as follows (This should be entered on one line): mplink ex1.o add.o -l c:\mcc\lib -k c:\mcc\lkr 18c452.lkr -m exl.map -o exl.out This will produce a hex file and other output files described in the previous section.
DS51217B-page 35
DS51217B-page 36
MPLAB-CXX COMPILER USERS GUIDE Chapter 5. Using MPLAB-CXX with MPLAB IDE 5.1 5.2 Introduction
This chapter discusses how to use MPLAB-CXX with MPLAB IDE.
Highlights
This chapter includes: MPLAB-CXX - MPLAB Projects Overview Using MPLAB-C17 with MPLAB A Tutorial Using MPLAB-C18 with MPLAB A Tutorial Going Forward
5.3
DS51217B-page 37
MPLAB Project
source files ASSEMBLER/ COMPILER object files
main.c
prog.asm
MPLAB-CXX
MPASM
main.o
prog.o
precomp.o
math.lib
device.lkr
MPLINK
LINKER
prog.out
prog.cod
prog.hex
prog.lst
prog.map
output files
MPLAB-SIM
MPLAB-ICE PICMASTER
Figure 5.1: An MPLAB Project with MPLAB-CXX Files and Associated Tools
DS51217B-page 38
DS51217B-page 39
MPLAB-CXX Compiler Users Guide 5.4 Using MPLAB-C17 with MPLAB IDE A Tutorial
This section will guide you, step by step, in using MPLAB IDE and MPLAB Projects with MPLAB-C17. In this tutorial, you will learn how to: Create the source file Set the MPLAB IDE development mode Create a new project with Project > New Project Set project Node Properties to MPLINK Add the source file, setting the language tool to MPLAB-C17 Add precompiled nodes (object files) Add a linker script node Build the project
5.4.1
Overview
Figure 5.2 gives a graphical overview of the MPLAB Project using MPLABC17. The source file ex1.c is associated with the compiler (MPLAB-C17) to produce the object file ex1.o. This file and other precompiled object files are linked via MPLINK according to directions in the linker script file (p17c756s.lkr) to produce the main output file, ex1.hex. source file COMPILER object files
p17c756s.lkr
ex1.c
MPLAB-C17
ex1.o
c0s17.o
p17c756a.o
MPLINK
LINKER
ex1.hex
DS51217B-page 40
5.4.3
DS51217B-page 41
Figure 5.4: New Project ex1.pjt After setting the project name, click OK and the Edit Project dialog will be shown.
DS51217B-page 42
DS51217B-page 43
Figure 5.6: Node Properties ex1.hex The Node Properties dialog shows the command line switches for the tool, in this case MPLINK. When you first open this dialog, the checked boxes represent the default values for the tool. For this tutorial, these do not need to be changed. Refer to the MPASM with MPLINK and MPLIB Users Guide (DS33014) for more information on these command line switches. Click OK to set these default values to ex1.hex.
5.4.7
DS51217B-page 44
5.4.8
DS51217B-page 45
DS51217B-page 46
Figure 5.10: Node Properties - ex1.o The Object filename is set to ex1.o automatically. Nothing else needs to be changed in this dialog. Click OK to apply these values to ex1.o.
5.4.9
DS51217B-page 47
Figure 5.11: Add Node Object Files Node Properties can not be set on precompiled object files, as they are already compiled. Although there are no library files used in this tutorial project, a library file (.lib) may be added by following the same procedure as shown above. For more information on libraries and precompiled object files, please refer to the MPLAB-CXX Reference Guide Libraries and Precompiled Object Files.
DS51217B-page 48
DS51217B-page 49
Figure 5.13: Edit Project ex1.hex Press OK on the Edit Project dialog to finish editing the project.
DS51217B-page 50
5.4.13
Troubleshooting
If the build did not complete successfully, check these items: 1. Select Project > Install Language Tool... and check that MPLAB-C17 references the mcc17.exe executable (Figure 5.15). Your executable path may be different from the figure. When using MPLAB IDE in the Windows 3.x environment, the mcc17d.exe executable should be used instead. The Command-line option should be selected.
DS51217B-page 51
Figure 5.15: Install Language Tool MPLAB-C17 2. Select Project > Install Language Tool... and check that MPLINK is pointing to the mplink.exe executable (Figure 5.16). Your executable path may be different from the figure. The Command-line option should be selected.
Figure 5.16: Install Language Tool MPLINK 3. Check the Node Properties for the Project Files ex1.hex and ex1.c. They should be mapped to the Language Tools MPLINK and MPLAB-C17 respectively. 4. Check the names of the files added to the project against the ones listed in Figure 5.13. If any are different, click on them individually, click Delete Node, and then follow the procedure in the relevant previous section for adding the correct node. 5. Check each step of this tutorial to see if you completed it correctly. 6. Compile the project in a DOS window. Cut-and-paste commend-line information into a DOS window to run. Check the autoexec.bat file to ensure that PATH includes the executable directory (c:\mcc\bin) and that MCC_INCLUDE is present and represents the include directory (c:\mcc\h).
DS51217B-page 52
Figure 5.17: Project Window ex1.pjt The project window contains a good deal of useful information about the project. For more information on its contents, see the MPLAB IDE Users Guide.
DS51217B-page 53
MPLAB-CXX Compiler Users Guide 5.5 Using MPLAB-C18 with MPLAB IDE A Tutorial
This section will guide you, step by step, in using MPLAB IDE and MPLAB Projects with MPLAB-C18. In this tutorial, you will learn how to: Create the source file Set the MPLAB IDE development mode Create a new project with Project > New Project Set project Node Properties to MPLINK Add the source file, setting the language tool to MPLAB-C18 Add precompiled nodes and library files Add a linker script node Build the project
5.5.1
Overview
Figure 5.2 gives a graphical overview of the MPLAB Project using MPLABC18. The source file ex1.c is associated with the compiler (MPLAB-C18) to produce the object file ex1.o. This file and other precompiled object files are linked via MPLINK according to directions in the linker script file (18c452.lkr) to produce the main output file, ex1.hex. source file COMPILER object files
18c452.lkr
ex1.c
MPLAB-C18
library files
ex1.o
clib.lib
p18c452.lib
MPLINK
LINKER
ex1.hex
DS51217B-page 54
5.5.3
DS51217B-page 55
Figure 5.20: New Project ex1.pjt After setting the project name, click OK and the Edit Project dialog will be shown.
DS51217B-page 56
DS51217B-page 57
Figure 5.22: Node Properties ex1.hex The Node Properties dialog shows the command line switches for the tool, in this case MPLINK. When you first open this dialog, the checked boxes represent the default values for the tool. For this tutorial, these do not need to be changed. Refer to the MPASM with MPLINK and MPLIB Users Guide (DS33014) for more information on these command line switches. Click OK to set these default values to ex1.hex.
5.5.7
DS51217B-page 58
5.5.8
DS51217B-page 59
DS51217B-page 60
Figure 5.26: Node Properties ex1.o The Object filename is set to ex1.o automatically. Nothing else needs to be changed in this dialog. Click OK to apply these values to ex1.o.
5.5.9
DS51217B-page 61
Figure 5.27: Edit Project Library Path Added Although there are no library files used in this tutorial project, a library file (.lib) may be added by following this procedure: In the Edit Project window, click Add Node. In the Add Node dialog, select the Folder c:\mcc\lib. Select the desired library from the File name list. Make sure List files of type: specifies Libraries (*.lib). Click OK. Library files do not have node properties as they are already compiled. For more information on libraries and precompiled object files, please refer to the MPLAB-CXX Reference Guide Libraries and Precompiled Object Files.
DS51217B-page 62
DS51217B-page 63
Figure 5.29: Edit Project ex1.hex Press OK on the Edit Project dialog to finish editing the project.
DS51217B-page 64
5.5.13
Troubleshooting
If the build did not complete successfully, check these items: 1. Select Project > Install Language Tool... and check that MPLAB-C18 references the mcc18.exe executable (Figure 5.15). Your executable path may be different from the figure. The Command-line option should be selected.
DS51217B-page 65
Figure 5.31: Install Language Tool MPLAB-C18 2. Select Project > Install Language Tool and check that MPLINK is pointing to the mplink.exe executable (Figure 5.32). Your executable path may be different from the figure. The Command-line option should be selected.
Figure 5.32: Install Language Tool MPLINK 3. Check the Node Properties for the Project Files ex1.hex and ex1.c. They should be mapped to the Language Tools MPLINK and MPLABC18 respectively. 4. Check the names of the files added to the project against the ones listed in Figure 5.29. If any are different, click on them individually, click Delete Node, and then follow the procedure in the relevant previous section for adding the correct node. 5. Check each step of this tutorial to see if you completed it correctly. 6. Compile the project in a DOS window. Cut-and-paste commend-line information into a DOS window to run. Check the autoexec.bat file to ensure that PATH includes the executable directory (c:\mcc\bin) and that MCC_INCLUDE is present and represents the include directory (c:\mcc\h).
DS51217B-page 66
Figure 5.33: Project Window ex1.pjt The project window contains a good deal of useful information about the project. For more information on its contents, see the MPLAB IDE Users Guide.
DS51217B-page 67
DS51217B-page 68
Part 2
Using MPLAB-CXX
DS51217B-page 69
DS51217B-page 70
6.2
Highlights
This chapter covers the following topics: MPLAB-CXX vs. C Components of a Basic MPLAB-CXX Program C Keywords
Part 2
6.3
C vs. MPLAB-CXX
Most C programmers have gained their experience programming C on computers where there was an operating system to handle such things as memory management, input/output, interdevice communications, etc. Microcontrollers, by their very nature, do not have the memory overhead for an operating system. Therefore, it is left up to the programmer to determine memory allocation, I/O operation through a peripheral, etc. Libraries and precompiled object files are available with MPLAB-CXX to aid the programmer in this endeavor. An MPLAB-CXX program is a collection of declarations, statements, comments, and preprocessor directives that typically do the following: Declare data structures Allocate data space Evaluate expressions Perform program control operations Control PICmicro MCU peripherals
Using MPLAB-CXX
DS51217B-page 71
6.4
p17cxx.h includes proper processor-specific header file based on the processor selected on the command line.
DS51217B-page 72
Part 2
Using MPLAB-CXX
Section 7.12.2 Section 7.9.6 Section 7.6.5 Section 7.12.3 Section 7.6.1 Section 7.6.1 Section 7.6.3 Section 7.9.4
* double, float and long are not supported by MPLAB-C17. double and float are the same in MPLAB-C18. ** has no effect in MPLAB-CXX
DS51217B-page 73
DS51217B-page 74
7.2
Highlights
This chapter covers the following topics: Preprocessor Directives Comments Constants Variables Functions Operators Program Control Statements Arrays and Strings Pointers Structures and Unions
Part 2
Using MPLAB-CXX
DS51217B-page 75
7.3.1
#define
7.3.1.1 Description
The #define directive defines string constants that are substituted into a source line before the source line is evaluated. These can improve source code readability and maintainability. Common uses are to define constants that are used in many places and provide short cuts to more complex expressions.
7.3.1.2
Syntax
define-directive: #define identifier pp-token-list new-line #define identifier lparen parameter-list ) pp-token-list new-line #define identifier lparen ) pp-token-list new-line
lparen:
(1
1.
DS51217B-page 76
MPLAB-CXX Fundamentals
parameter-list: identifier parameter-list , identifier
7.3.1.3
Example
#define MAX_COUNT 100 #define VERSION "v1.0" #define PERIMETER( x, y ) 2*x + 2*y
7.3.2
#else
7.3.2.1 Description
Refer to #if, #ifdef, and #ifndef for a description of the #else directive.
7.3.3
#elif
7.3.3.1 Description
Refer to #if, #ifdef, and #ifndef for a description of the #elif directive.
7.3.4
#endif
7.3.4.1 Description
Part 2
Refer to #if, #ifdef, and #ifndef for a description of the #endif directive.
Using MPLAB-CXX
7.3.5
#error
7.3.5.1 Description
The #error directive generates a user-defined error message at compile time. One use of #error is to detect cases where the source code generates constants that are out of range. No code is generated as a result of using this directive.
7.3.5.2
Syntax
DS51217B-page 77
#define MAX_COUNT 100 #define ELEMENT_SIZE 3 #if (MAX_COUNT * ELEMENT_SIZE) > 256 #error "Data size too large." #endif
7.3.6
#if
7.3.6.1 Description
The #if directive is useful for conditionally compiling code based on the evaluation of an expression. #if must be terminated by #endif. The #elif is used to test a new expression. The directive #else is also available to provide an alternative compilation. The defined() operator acts similarly to #ifdef when combined with #if.
7.3.6.2
Syntax
7.3.6.3
Example
#define MAX_COUNT 100 #define ELEMENT_SIZE 3 #if defined(MAX_COUNT) && defined(ELEMENT_SIZE) #if (MAX_COUNT * ELEMENT_SIZE) > 256 #error "Data size too large." #else #define DATA_SIZE MAX_COUNT * ELEMENT_SIZE #endif #endif
7.3.7
#ifdef
7.3.7.1 Description
The #ifdef directive is similar to the #if directive, except that instead of evaluating an expression, it checks to see if the specified symbol has been defined. Like the #if directive, #ifdef must be terminated by #endif, and can optionally be used with #else.
7.3.7.2
Syntax
DS51217B-page 78
MPLAB-CXX Fundamentals
7.3.7.3 Example
7.3.8
#ifndef
7.3.8.1 Description
The #ifndef directive is similar to the #ifdef directive, except that it checks to see if the specified symbol has not been defined. Like the #if directive, #ifndef must be terminated by #endif, and can optionally be used with #else.
7.3.8.2
Syntax
7.3.8.3
Example Part 2
Using MPLAB-CXX
7.3.9
#include
7.3.9.1 Description
#include inserts the full text from another file at this point in the source code. The inserted file may contain any number of valid C statements.
7.3.9.2
Syntax
include-directive: #include " filename " new-line #include < filename > new-line #include pp-token-list new-line When filename is used, MPLAB-CXX looks for the file in the current directory and then in the directories specified by the current include search path, which refers to the environment variable MCC_INCLUDE and commandline option -i.
DS51217B-page 79
7.3.9.3
Example
7.3.10
#line
7.3.10.1 Description
The line directive causes the compiler to renumber the source text so that the following line has the specified line number.
7.3.10.2 Syntax
line-directive: #line digit-sequence new-line #line digit-sequence " filename " new-line #line pp-token-list new-line
7.3.10.3 Example
#line 34 /* This line is line 34 */ #line 55 "main.c" /* This line is line 55 of main.c */
7.3.11
7.3.11.2 Syntax
interrupt-directive: #pragma interrupt function-name [section-name] save=symbol-list new-line symbol-list: symbol-name symbol-list , symbol-name
DS51217B-page 80
MPLAB-CXX Fundamentals
7.3.12 #pragma interrupt fname MPLAB-C18 #pragma interruptlow fname MPLAB-C18
7.3.12.1 Description
The interrupt pragma declares a function to be an interrupt function. MPLAB-CXX will save and restore a basic context of W, BSR, and STATUS by default, and the save= clause allows additional arbitrary symbols to be saved and restored by the function. The function will terminate with a RETFIE instruction. Any temporary locations required during the evaluation of expressions in the function will be allocated from a private memory section and will not be overlaid with the temporary locations of any other function, including other interrupt functions. Optionally, a name can be specified for the section into which temporary locations are allocated. Both high and low priority interrupts are supported. The interrupt pragma declares a high priority interrupt, and the interruptlow pragma declares a low priority interrupt. A high priority interrupt uses the shadow registers to save and restore W, BSR, and STATUS, while a low priority interrupt uses the software stack to save and restore W, BSR, and STATUS. As a consequence of this, A high priority interrupt terminates with a fast RETFIE, while a low priority interrupt terminates with a slow RETFIE. Two MOVFF instructions are required for each byte of context to be saved and restored via the software stack; therefore, in order to save and restore the W, BSR, and STATUS registers, a low priority interrupt has an additional 12-word overhead beyond the requirements of a high priority interrupt. MPLAB-CXX does not automatically place an interrupt function at the interrupt vector. An absolute code section may be used to locate the interrupt function. More commonly, a GOTO instruction is placed at the interrupt vector for transferring control to the interrupt function proper.
Part 2
Using MPLAB-CXX
7.3.12.2 Syntax
interrupt-directive: #pragma interrupt function-name [section-name] save=symbol-list new-line #pragma interruptlow function-name [section-name] save=symbol-list new-line symbol-list: symbol-name symbol-list , symbol-name
7.3.12.3 Example
Declare a low-priority interrupt function myInterrupt not located at the interrupt vector. Save several additional symbols of context. void myInterrupt (void);
DS51217B-page 81
7.3.13
7.3.13.2 Syntax
list-directive: #pragma list new-line #pragma nolist new-line
7.3.14
#pragma sectiontype
7.3.14.1 Description
Sections Logical sections are used to specify which of the defined memory regions should be used for a portion of source code. For more on sections, refer to the MPLINK section of the MPASM Users Guide with MPLINK and MPLIB.
The section declaration family of pragmas changes the section into which MPLAB-CXX will allocate data of the associated type. Optionally, the section may be allocated at an absolute address. A section declaration with no name resets the allocation of data of the associated type to the default section for the current module. A data section qualified as shared will be located in a SHAREBANK by the linker. Similarly, a data section qualified as access will be located in an ACCESSBANK by the linker. Specifying a section name which has been previously declared causes MPLAB-CXX to resume allocating data of the associated type into the specified section. The section qualifiers must match the previous declaration. For udata and idata sections in MPLAB-C17, the data section type, SFR or GPR, and a bank number may be optionally specified instead of an absolute address. This is functionally equivalent to specifying a varlocate pragma
DS51217B-page 82
MPLAB-CXX Fundamentals
with the same information for each symbol declared in the section. Like varlocate, this qualifier provides information to the compiler only and is not enforced by the linker; therefore, care should be exercised in its use. For pragma optimization tips, see Section 8.5.7.
7.3.14.2 Syntax
section-directive: #pragma udata [data-qualifier-list] [section-name [location]] new-line #pragma idata [data-qualifier-list] [section-name [location]] new-line #pragma romdata [overlay] [section-name] new-line #pragma code [overlay] [section-name] new-line data-qualifier: access1 shared2 overlay location: = address gpr bank-number2 sfr bank-number2
7.3.14.3 Example
Declare a section for udata allocation at address 0x120. The linker will enforce that the section will be located at address 0x120. #pragma udata myNewDataSection = 0x120 Resume allocation of romdata into the default section. #pragma romdata Declare a new udata section which will be located in access memory (MPLAB-C18 only). #pragma udata access myAccessDataSection Declare a new code section at address 0x8000. #pragma code myExternalCodeSection=0x8000
Part 2
Using MPLAB-CXX
1. 2.
DS51217B-page 83
7.3.15.2 Syntax
variable-locate-directive: #pragma varlocate bank variable-name new-line #pragma varlocate [bank-reg] variable-name new-line
7.3.16
#undef
7.3.16.1 Description
The #undef directive undefines a string constant. After a string constant has been undefined, any reference to it generates an error unless the string constant is redefined.
7.3.16.2 Syntax
undef-directive: #undef identifier new-line
7.3.16.3 Example
#define MAX_COUNT 10 . . . #undef MAX_COUNT #define MAX_COUNT 20
DS51217B-page 84
7.4.2
Syntax
ANSI C comment: /* begins and */ terminates a block comment. C++ comment: // comments to the end of the line.
7.4.3
Example
/* This is a block comment. It can have multiple lines between the comment delimiters. */ // This is a C++ style one-line comment.
Part 2
Using MPLAB-CXX
DS51217B-page 85
7.5.2
Syntax
7.5.2.1 Numeric Constants
By default, literal numbers are evaluated in decimal. Hexadecimal values can be specified by preceding the number by 0x. Octal values can be specified by preceding the number by 0 (zero). Binary values can be specified by preceding the number by 0b.
7.5.2.2
Character Constants
Character constants are denoted by a single character enclosed by single quotes. ANSI C escape sequences, as shown by the following table, are treated as a single character. Table 7.1: ANSI C Escape Sequences Escape Character \a \b \f \n \r \t \v \\ \? \ \" \0OO \xHH Description Bell (alert) character Backspace character Form feed character New line character Carriage return character Horizontal tab character Vertical tab character Backslash Question mark character Single quote (apostrophe) Double quote character Octal number (zero, Octal digit, Octal digit) Hexadecimal number Hex Value 07 08 0C 0A 0D 09 0B 5C 3F 27 22
DS51217B-page 86
MPLAB-CXX Fundamentals
7.5.2.3 String Constants
String constants are denoted by zero or more characters (including ANSI C escape sequences) enclosed in double quotes. A string constant has an implied null (zero) value after the last character.
7.5.3
Example
7.5.3.1 Numeric Constants
Each of the following evaluates to a decimal twelve: 12 0x0C 014 Decimal Hexadecimal Octal
0b1100 Binary
7.5.3.2
Character Constants
Each of the following is a character constant: a Lowercase a \n New Line \0 Zero or null character
Part 2
7.5.3.3
DS51217B-page 87
7.6.1
Basic data types are listed in Table 7.2, and allowed modifiers are shown in Table 7.3. Table 7.4 shows the size and range of common data types as implemented by MPLAB-CXX. C represents all negative numbers in the two's complement format. Integral data types are char, int, and long. Table 7.2: Basic Data Types MPLAB-C17 void char int MPLAB-C18 void char int float double no type single character integer value floating point value floating point value Use
Table 7.3: Data Type Modifiers Modifier auto Applicable Data Type any Use Variable exists only during the execution of the block in which it was defined. Declares data that will not be modified.** Paging/banking of data required Declares data that is allocated elsewhere. MPLAB-C18: Extended accuracy integer value.
DS51217B-page 88
MPLAB-CXX Fundamentals
Table 7.3: Data Type Modifiers (Continued) Modifier near Applicable Data Type any Use MPLAB-C17: No paging/banking of data required. MPLAB-C18: Data Memory (RAM): Denotes access RAM. MPLAB-C18: Program Memory (ROM): Denotes that the object is located at an address < 64K. No effect in MPLAB-CXX Declares a short integer. Declares a signed variable. If the variable is declared outside a function, it can be referenced only within the current file. If the variable is declared inside a function/block, then it can be referenced only within the function/ block. The variable can be initialized only with a constant expression which is evaluted at the start of program execution. Values are retained through function calls, and the default initial value is 0. Declares an unsigned variable. Locate object in program/data memory.
register any short signed static int char, int, long* any
Part 2
unsigned char, int, long* rom, ram any * Not supported by MPLAB-C17 ** Does not imply program memory Table 7.4: Data Type Ranges Type MPLAB-C18 Only: A plain char may be unsigned by default via the -k command line option. void char unsigned char int unsigned int short unsigned short short long* long*
Using MPLAB-CXX
Range
-32,768 to 32,767 0 to 65,535 -32,768 to 32,767 0 to 65,535 -8,388,608 to 8,388,607 0 to 16,777,215 -2,147,483,648 to 2,147,483,647
DS51217B-page 89
7.6.2
Variable Declaration
7.6.2.1 Description
A variable is a name for a specific memory location. In C, all variables must be declared before they are used. A variables declaration defines its storage class. Variables can be declared in two places: at the start of a compound statement or outside all functions. The variables are called local and global, respectively.
7.6.2.2
Syntax
declaration: declaration-specifiers declarator-list ; declarator-list: declarator declarator-list , declarator declaration-specifiers: declaration-specifier declaration-specifiers declaration-specifier declaration-specifier: type-name extern static ram rom const volatile near far type-name: basic-type-name tag-type-name basic-type-name: int short char unsigned
DS51217B-page 90
MPLAB-CXX Fundamentals
long float double tag-type-name: enumerated-type-name struct-or-union-type-name Local variables (declared inside a compound statement) can only be used by statements within the block where they are declared. The value of a local variable cannot be accessed by functions or statements outside of the function. The most important thing to remember about local variables is that they are created upon entry into the block and destroyed when the block is exited. Local variables must be declared before executable statements. Global variables can be used by all of the functions in the program. Global variables must be declared before any functions that use them. Most importantly, global variables are not destroyed until the execution of the program is complete.
7.6.2.3
Example
unsigned char GlobalCount; void f2(void) { unsigned char count; for(count=0;count<10;count++) GlobalCount++; } void f1(void) { unsigned char count; for(count=0;count<10;count++) { unsigned char temp; f2(); temp = count *2; } } void main(void) { GlobalCount = 0; f1(); } This program increments GlobalCount to 100. The operation of the program is not affected adversely by the variable named count located in both functions. The variable temp is allocated inside the for() loop and deallocated once the loop exits.
Part 2
Using MPLAB-CXX
DS51217B-page 91
static and extern behave in the ANSI specified manner. static used with a local variable declaration inside of a block causes the variable to maintain its value between entrances to the block. static used for a global object (variable or function) declaration outside of all functions limits the scope of the object to the file containing the definition. extern does not allocate space for its object. The compiler assumes the definition appears in an external file. This external reference is resolved at link time. A global object has external linkage by default.
7.6.3.2
In file1.c:
Example1
static unsigned char a; unsigned char b; void main(void) { a = 1; b = 2; a = new_function(); return a; } In file2.c: extern int b; int new_function(void) { int c; c = b; /* this will not produce an error, because b is extern by default in file1.c and declared extern in file2.c */ return a; /* this will produce an undefined variable error because a is only valid within file1.c */ }
7.6.3.3
Example2
DS51217B-page 92
MPLAB-CXX Fundamentals
} void main(void) { unsigned char count; for( count = 0; count < 10; count++ ) { unsigned char a; a = hello(); } } /* For each call of the function hello, i will be incremented. i is static and will maintain its value between calls to hello. hello is called 10 times, so i will be 10 after the last call. */
7.6.3.4
volatile
A volatile variable has a value that can be changed by something other than user code. A typical example is an input port or a timer register. These variables must be declared as volatile' so the compiler makes no assumptions on their values while performing optimizations.
7.6.3.5
Example3 Part 2
unsigned char x, y; volatile unsigned char TMR0; x = 0x55; /* Compilers temporary registers contain 0x55 */ y = x; /* and those values can be written to y since x is unchanged. */ TMR0 = 0x00; y = TMR0; /* The compiler must read TMR0 and cannot use the 0x00 in its temporary variables since TMR0 increments with execution. */
Using MPLAB-CXX
7.6.4
Enumeration
7.6.4.1 Description
An enumeration defines a list of named integer constants. The constants defined by an enumeration can be used in the place of any integral value.
7.6.4.2
Syntax
enumerated-type-name: enum identifier new-line enum identifier { enumeration-list } new-line enum { enumeration-list } new-line enumeration-list:
DS51217B-page 93
7.6.4.3
Example1
{ VALUE_1, VALUE_2, VALUE_3 } enum_1; is equal to 0 * is equal to 1 * is equal to 2 */
char char_1; enum_1 = 42; /* this will not produce an error */ char_1 = VALUE_3;/* this will assign char_1 value to 2 */
7.6.4.4
Example2
enum tag_2 { VALUE_3, VALUE_4, VALUE_5 } enum_2; /* this definition will cause an error because VALUE_3 already has a value of 2, and cannot also hold a value of 0 */ enum tag_3 { VALUE_6 =2, VALUE_7, VALUE_8=50, VALUE_9 } enum_3; /* VALUE_6 is equal to 2 * * VALUE_7 is equal to 3 * * VALUE_8 is equal to 50 * * VALUE_9 is equal to 51 */ enum color_type {red,green,yellow} color; The entries in the enumeration list are assigned constant integer values, starting with zero for the first entry. Each entry is one greater than the previous one. Therefore, in the above example, red is 0, green is 1, and yellow is 2. The default integer values assigned to the enumeration list can be overridden by specifying a value for a constant. The following example illustrates specifying a value for a constant. enum color_type {red,green=9,yellow} color; This statement assigns 0 to red, 9 to green, and 10 to yellow. Once an enumeration is defined, the name can be used to create additional variables at other points in the program. For example, the variable mycolor can be created with the color_type enumeration by: enum color_type mycolor;
DS51217B-page 94
MPLAB-CXX Fundamentals
Essentially, enumerations help to document code. Instead of assigning a value to a variable, use an enumeration to clarify the meaning of the value.
7.6.5
typedef
7.6.5.1 Description
The typedef statement creates a new name for an existing type. The new name can then be used to declare variables. Note: Using typedef to Create Portable Programs: When writing portable code, it is important that the data size be consistent. For example, suppose that 16-bit integers are required. Rather than declaring integers as int, declare them as a typedef name, such as myint. Near the top of the program, declare the typedef based on the target machine. When compiling with a tool that uses 16-bit integers, the typedef statement should read: typedef int myint; to make all integers declared as myint 16-bits.
7.6.5.2
Syntax
The typedef keyword may be used anywhere the storage class specifiers extern and static may be used.
Part 2
7.6.5.3
Example
Using MPLAB-CXX
typedef char string; typedef unsigned int uint; void main(void) { string j[10]; uint i; for(i=0;i<10;i++) j[i]=i; } When using a typedef statement, remember these two key points: A typedef does not deactivate the original name or type. Several typedef statements can be used to create many new names for the same original type. The typedef typically has two purposes: Create portable programs Document source code
DS51217B-page 95
7.7.1
Function Declarations
7.7.1.1 Description
Functions must be declared before they are used. The compiler supports the modern ANSI form of function declarations.
7.7.1.2
Syntax
function-definition: function-declarator compound-statement new-line function-declarator: declaration-specifiers identifier ( parameter-list ) parameter-list: parameter parameter parameter-list parameter: type-specifier declarator
7.7.1.3
Example
7.7.2
Function Prototyping
7.7.2.1 Description
A function prototype should be declared before the function is called. A function prototype declares the return type, name, and types of parameters for a function, but no other statements.
DS51217B-page 96
MPLAB-CXX Fundamentals
7.7.2.2 Syntax
7.7.2.3
Example
7.7.3
A function argument is a value that is passed to the function when the function is called. C allows zero or more arguments to be passed to a function. When a function is defined, formal parameters are declared between the parentheses that follow the function name. Function parameters can have storage class auto or static (MPLAB-C17 only). auto parameters are placed on the software stack, enabling reentrancy, and static parameters are allocated globally, enabling direct access and, therefore, smaller code. For MPLAB-C17 only, if the first parameter to a function is static and is 8 bits wide, the argument will be passed to the function in PRODL. If it is static and 16-bits wide, the argument will be passed in PROD. Note: Overhead of Passing Variables: MPLAB-CXX uses a software stack for passing variables into functions and for returning values from functions. This makes it possible to support quite complex functions and allows recursive functions, but there is some overhead in managing the software stack. When compiling, the compiler will examine the function and only include the appropriate level of stack support code.
Part 2
Using MPLAB-CXX
7.7.3.2
Example
The function below calculates the sum of two values that are passed to the function when it is called. When sum() is called, the value of each argument is copied into the corresponding parameter variable. void sum( unsigned char a, unsigned char b ) { int c; c = a+b; } void main(void) { sum(1,10);
DS51217B-page 97
7.7.4
A function in C can return a value to the calling routine by using the return statement. For MPLAB-C17, if the value being returned is 8-bits wide, it is returned in WREG. If it is 16-bits wide, it is returned in the WREG/FSR1 pair. Otherwise, it is returned on the software stack. For MPLAB-C18, the value is always returned on the software stack. On return, FSR0 points to the return value.
7.7.4.2
Syntax
7.7.4.3
Example
unsigned char sum(unsigned char a, unsigned char b) { return(a + b); } void main(void) { unsigned char c; c = sum(1, 10); c = sum(15, 6); c = sum(100, 25); } When a return statement is encountered, the function returns immediately to the calling routine. Any statements after the return are not executed. The return value of a function is not required to be assigned to a variable or to be used in an expression; however, if it is not used, then the value is lost.
DS51217B-page 98
7.8.1
Arithmetic Operators
7.8.1.1 Description Part 2
The C language defines five arithmetic operators: addition, subtraction, multiplication, division, and modulus.
7.8.1.2
arithmetic-expression: postfix-expression arithmetic-expression arithmetic-operator postfix-expression arithmetic-operator: + addition subtraction * multiplication / division % modulus The +, -, *, and / operators may be used with any basic data type. The modulus operator, %, can only be used with integer data types.
7.8.1.3
Example
/* negative b */ /* variable count minus 163 */
-b count - 163
DS51217B-page 99
The relational operators in C compare two values and return 1 or 0 based on the comparison.
7.8.2.2
Syntax
relational-expression: arithmetic-expression relational-expression relational-operator arithmetic-expression relational-operator: > greater than >= greater than or equal to < less than <= less than or equal to == equal to != not equal to
7.8.2.3
Example
7.8.3
Logical Operators
7.8.3.1 Description
The logical operators support the basic logical operations AND, OR, and NOT.
7.8.3.2
Syntax
logical-or-expression: logical-and-expression logical-or-expression || logical-and-expression logical-and-expression: relational-expression logical-and-expression || relational-expression logical-not-expression: ! unary-expression && Logical AND || Logical OR ! Logical NOT
DS51217B-page 100
MPLAB-CXX Fundamentals
7.8.3.3 Example
NotFound && (i <= MAX) !(Value <= LIMIT) ((a <= ch) && (ch <= z)) || ((A <= ch) && (ch <= Z))
7.8.4
Bitwise Operators
7.8.4.1 Description
C contains six special operators which perform bit-by-bit operations on numbers. These bitwise operators can only be used on integral data types. The result of using any of these operators is a bitwise operation of the operands.
7.8.4.2
Syntax
bitwise-expression: postfix-expression bitwise-expression bitwise-operator postfix-expression bitwise-not-expression: ~ unary-expression bitwise-operator: & bitwise AND | bitwise OR ^ bitwise XOR ~ 1s complement >> right shift << left shift
Part 2
Using MPLAB-CXX
7.8.4.3
Example
/* Zero unwanted bits */ /* Flip bits 0, 1, and 2 */ /* Multiply Val by 4 */
7.8.5
Assignment Operators
7.8.5.1 Description
The most common operation in a program is to assign a value to a variable. C also provides shortcut assignment operators for modifying a variable by performing an operation on itself.
DS51217B-page 101
7.8.5.3
Example
a += b + c; /* Same as a = a + b + c; */ a *= b + c; /* Same as a = a * (b + c); */ a *= (b + c); /* Same as a = a * (b + c); */ r /= s; /* Same as r = r / s; */ m *= 5; /* Same as m = m * 5; */ Flags |= SETBITS; /* Set bits in Flags */ Div2 >>= 1; /* Divide Div2 by 2 */
7.8.6
C provides shortcuts for the common operation of incrementing or decrementing a variable. The increment and decrement operators are extremely flexible. They can be used in a statement by themselves, or they can be embedded within a statement with other operators. The position of the operator indicates whether the increment or decrement is to be performed before or after the evaluation of the statement in which it is embedded.
7.8.6.2
Syntax
DS51217B-page 102
MPLAB-CXX Fundamentals
7.8.6.3 Example
7.8.7
Conditional Operator
7.8.7.1 Description
The conditional operator is a shortcut for executing code based on the evaluation of an expression.
7.8.7.2
Syntax
7.8.7.3
Example
Part 2
Using MPLAB-CXX
DS51217B-page 103
The sizeof operator returns the size of the specified item in bytes. The argument to the sizeof operator can be a variable, an array name, the name of a basic data type, the name of a derived data type, or an expression.
7.8.8.2
Syntax
7.8.8.3
Example
/* number of bytes to store an integer value = 2 */ /* number of bytes to store variable v v is int, value = 2 */ /* number of bytes to store all variables of array x x is int, 10 elements, value = 20 */
sizeof (struct data); /* number of bytes to store expression struct has 3 int members, value = 6 */
DS51217B-page 104
MPLAB-CXX Fundamentals
7.8.9 Precedence of Operators
7.8.9.1 Description
Precedence refers to the order in which operators are processed. The C language maintains a precedence for all operators. The following shows the precedence from highest to lowest. Operators at the same level are evaluated from left to right. Precedence Highest | | | | | | | | | | | | | | | | | | | Lowest () [] -> . ! ~ ++ -- - (type cast) * & sizeof * / % + << >> < <= > >= == != & ^ | && || ? = += -= *= /= , Operator
Part 2
Using MPLAB-CXX
7.8.9.2
Example
Expression Result 0 40 0x20 1 8 5 + has higher precedence than << != has higher precedence than | Note * has higher precedence than +
DS51217B-page 105
7.9.1
if Statement
7.9.1.1 Description
The if statement is a conditional statement. The statement associated with the if statement is executed based upon the outcome of a condition. If the condition evaluates to nonzero, the statement is executed. Otherwise, it is skipped.
7.9.1.2
Syntax
7.9.1.3
Example
DS51217B-page 106
MPLAB-CXX Fundamentals
7.9.2 if-else Statements
7.9.2.1 Description
The if-else statement handles conditions where a program requires one statement to be executed if a condition is nonzero and a different statement if the condition is zero.
7.9.2.2
Syntax
7.9.2.3
Example
if(num < 0) { num = 0; Valid = 0; } else Valid = 1; if(num == 1) DoCase1(); else if(num == 2) DoCase2(); else if(num == 3) DoCase3(); else DoInvalid();
Part 2
Using MPLAB-CXX
7.9.3
for Statement
7.9.3.1 Description
One of the three loop statements that C provides is the for loop. The other two are the if and the do-while statements. Use a for loop to repeat a statement or set of statements. In general, the first expression is the initialization expression, the second is the loop condition, and the third is the loop expression.
7.9.3.2
Syntax
DS51217B-page 107
unsigned char i; for(i=0;i<10;i++) DoFunc(); for(num=100;num>0;num=num-1) { . . . } for(count=0;count<50;count+=5) { . . . } /* Find Target */ for(i=0; (i<MAX) && (Array[i]<>Target); i++);
7.9.4
while Statement
7.9.4.1 Description
Another of the loops in C is the while loop. While an expression is nonzero, the while loop repeats a statement or block of code. The value of the expression is checked prior to each execution of the statement.
7.9.4.2
Syntax
7.9.4.3
Example
7.9.5
do-while Statement
7.9.5.1 Description
The final loop in C is the do loop. In the do loop, the statement is always executed before the expression is evaluated. Thus, the do statement always executes at least once. If the while expression evaluates to nonzero, control is transferred back to the beginning of the loop.
7.9.5.2
Syntax
DS51217B-page 108
MPLAB-CXX Fundamentals
7.9.5.3 Example
7.9.6
switch Statement
7.9.6.1 Description
A switch statement is functionally equivalent to multiple if-else statements. The switch statement has two limitations: The switch expression must be an 8-bit integer data type (MPLAB-C17 only). The case labels must be constant values.
7.9.6.2
Syntax Part 2
switch-statement: switch ( expression ) statement new-line case-statement: case constant-expression : statement new-line default-statement: default : statement new-line
The use of the default label is good programming practice. It can catch outof-range data that is not expected.
Using MPLAB-CXX
The switch expression is successively tested against a list of constants. When a match is found, execution continues at the labeled case statement. If no match is found, the statements associated with the default case are executed if a default label exists.
7.9.6.3
Example
switch(i) { case 1: DoCase1(); break; case 2: DoCase2(); break; case 3: DoCase3(); break; case 4:
DS51217B-page 109
7.9.7
break Statement
7.9.7.1 Description
The break statement exits the innermost enclosing control statement (for, while, do, switch) from any point within the body. The break statement bypasses normal termination from an expression. If the break occurs in a nested loop, control returns to the previous nesting level.
7.9.7.2
Syntax
7.9.7.3
Example
/* Get 100 values. Stop immediately if the value is 0. */ unsigned char i; for(i = 0; i < 100; i++) { x = GetValue(); if(x == 0) break; HandleValue(x); }
DS51217B-page 110
MPLAB-CXX Fundamentals
7.9.8 continue Statement
7.9.8.1 Description
The continue statement allows a program to skip to the end of a for, while, or do statement without exiting the loop.
7.9.8.2
Syntax
7.9.8.3
Example
/* Get 100 values. If the value is 0, ignore it and go on. */ unsigned char i; for (i = 0; i < 100; i++) { x = GetValue; if (x == 0) continue; HandleValue(x); }
Part 2
7.9.9
goto Statement
7.9.9.1 Description Using MPLAB-CXX
Execution of a goto causes control to be sent directly to the labeled statement. This statement must be located in the same function as the goto. Use of gotos interrupts the normal sequential flow of a program and thus makes it harder to follow and decipher. For this reason, the use of gotos is not considered good programming style, i.e., it is recommended that you do not use them in your program.
7.9.9.2
Syntax
7.9.9.3
Example
DS51217B-page 111
7.10.1
Arrays
7.10.1.1 Description
An array is a list of elements which are all of the same type and can be referenced through the same name. When an array is declared, C defines the first element to be at an index of 0; therefore, if the array has 50 elements, the last element is at an index of 49. C stores arrays in contiguous memory locations. The first element is at the lowest address.
7.10.1.2 Syntax
declarator: declarator array-declarator array-declarator: [ constant-expression ] array-declarator [ constant-expression ]
7.10.1.3 Example
#define SIZE 10 unsigned char i, num[SIZE]; for(i = 0; i < SIZE; i++) num[i] = i; To copy the contents of one array into another, copy each individual element from the first array into the second array. The following example shows one method of copying the array a[ ] into b[ ] assuming that each array has 10 elements. for(i=0;i<10;i++) b[i] = a[i];
DS51217B-page 112
MPLAB-CXX Fundamentals
7.10.2 Strings
7.10.2.1 Description
A common one-dimensional array is the string. C does not have a built-in string data type. Instead, a string is defined as a null (0) terminated character array. The size of the character array must include the terminating null. All string constants are automatically null terminated.
7.10.2.2 Example
char String[80]; int i; . . . for(i = 0; (i < 80) && String[i]; i++) HandleChar(String[i]);
7.10.3
Initializing Arrays
7.10.3.1 Description
C allows initialization of arrays. Standard data type arrays may be initialized in a straight-forward manor. Initializing arrays using the PICmicro MCU ram and rom qualifiers may require more than a single-line initialization statement.
Part 2
7.10.3.2 Syntax
initialized-declarator: declarator = { value-list } value-list: { value-list } constant-expression-list constant-expression-list: constant-expression constant-expression-list , constant-expression
Using MPLAB-CXX
7.10.3.3 Example1
The following example shows a 5 element integer array initialization. int i[5] = {1,2,3,4,5}; The element i[0] has a value of 1 and the element i[4] has a value of 5. A string (character array) can be initialized in two ways. One method is to make a list of each individual character: char str[4]={a,b,c, 0};
DS51217B-page 113
7.10.3.4 Example2
Because the PICmicro MCU family of microcontrollers uses separate program memory and data memory address busses in their design, MPLAB-CXX requires ANSI extensions to distinguish between data located in ROM and data located in RAM. The ANSI/ISO C standard allows for code and data to be in separate address spaces, but this is not sufficient to locate data in the code space as well. To this purpose, MPLAB-CXX introduces the rom and ram qualifiers. Syntactically, these qualifiers bind to identifiers just as the const and volatile qualifiers do in strict ANSI C. The primary use of ROM data is for static strings. In keeping with this, MPLAB-CXX automatically places all string literals in ROM. This type of a string literal is array of char located in ROM. For example, when using MPLAB-C18, a string table in ROM can be declared as: rom const char table[][20] = { "string 1", "string 2", "string 3", "string 4" }; rom const char *rom table2[] = { "string 1", "string 2", "string 3", "string 4" }; Note: At this time, for MPLAB-C17, you should use manual pointer arithmatic. See the file README.C17 for more information.
The declaration of table declares an array of four strings that are each 20 characters long, and so takes 40 words of program memory. table2 is declared as an array of pointers to ROM. The rom qualifier after the * places the array of pointers in ROM as well. All of the strings in table2 are 9 bytes long, and the array is four elements long, so table2 takes (9*4+4*2)/2 = 22 words of program memory. Accesses to table2 may be less efficient than accesses to table, however, because of the additional level of indirection required by the pointer. An important consequence of the separate ROM and RAM address spaces for MPLAB-CXX is that pointers to data in ROM and pointers to data in RAM are not compatible. That is, two pointer types are not compatible unless they point to objects of compatible types and the objects they point to are located in the same address space. For example, a pointer to a string in ROM and a pointer to a string in RAM are not compatible because they refer to different address spaces. To copy data from ROM to RAM, an explicit copy is required. For simple types, this entails only a simple assignment, but for arrays and other complex data-types it may require more.
DS51217B-page 114
MPLAB-CXX Fundamentals
For example, a function to copy a string from ROM to RAM could be written as follows. void str2ram(static char *dest, static char rom *src) { while( (*dest++ = *src++) != \0 ) ; } /* end str2ram */ As an example, the following code will send a ROM string to USART1 on a PICXXC756 using the PICmicro MCU C libraries. The library function to send a string to the USART, putsUSART1(const char *str), takes a pointer to a string as its argument, but that string must be in RAM. Method 1: Copy the ROM string to a RAM buffer before sending rom char mystring[] = "Send me to the USART"; void foo( void ) { char strbuffer[21]; str2ram( strbuffer, mystring ); putsUSART1( strbuffer ); } Method 2: Modify the library routine to read from a ROM string. /* The only changes required to the library routine is to change the name so the new routine does not conflict with the original routine and to add the rom qualifier to the parameter. */ void putrsUSART1_rom( static const rom char *data ) { do /* Send characters up to the null */ { /* Write a byte to the UASRT */ while(BusyUSART1()); putcUSART1(*data); } while(*data++); } /* end putrsUSART1_rom */
Part 2
Using MPLAB-CXX
7.11 Pointers
This section covers one of the most important and powerful features of C, pointers. A pointer is a variable that contains the location of an object. The topics covered in this section are: Introduction to Pointers Pointers and Arrays Pointer Arithmetic Passing Pointers to Functions
DS51217B-page 115
7.11.1.2 Syntax
declarator: * type-qualifier-list declarator The two special operators that are associated with pointers are the asterisk (*) and the ampersand (&). The address of a variable can be accessed by preceding the variable with the & operator. The * operator returns the value stored at the address pointed to by the variable.
7.11.1.3 Example
void main(void) { unsigned char *Var1, Var2, Var3; Var2 = 6; Var1 = &Var2; Var3 = Var2; /* These two do */ Var3 = *Var1; /* the same thing. */ } The first statement declares three variables: Var1, which is an integer pointer, and Var2 and Var3, which are integers. The next statement assigns the value of 6 to Var2. Then the address of Var2 (&Var2) is assigned to the pointer variable Var1. Finally, the value of Var2 is assigned to Var3 in two ways: first by accessing Var2 directly, then by accessing Var2 through the pointer Var1.
DS51217B-page 116
MPLAB-CXX Fundamentals
7.11.2 Pointer Arithmetic
7.11.2.1 Description
In general, pointers may be treated like other variables. However, there are a few rules and exceptions. In addition to the * and & operators, there are only four other operators that can be applied to pointer variables: +, ++, -, --. An important point to remember when performing pointer arithmetic is that the value of the pointer is adjusted according to the size of the data type it is pointing to. If a pointers data type requires five bytes, incrementing the pointer actually increases the value of the pointer by five. Similarly, adding three to the pointer increases the value of the pointer by fifteen (three times five). Note: ROM and RAM pointers in MPLAB-CXX: Pointer arithmetic is affected by the ROM paging and RAM banking of the PICmicro MCU. Pointers are assumed to be RAM pointers unless declared as ROM. rom int *p; char *q; ram char *r; /* /* /* /* ROM pointer RAM pointer RAM pointer (explicitly */ (default) */ */ declared) */
7.11.2.2 Example
unsigned char *p, *q, r[30] ; . . p = r + 20; /* p points to element 20 of r */ q = p - 5 /* q points to element 15 of r */ p++; /* p points to element 21 of r */ It is possible to increment or decrement either the pointer itself or the object to which it points. Pointers may also be used in relational operations.
Part 2
Using MPLAB-CXX
7.11.3
7.11.3.2 Example
void incby10(unsigned char *n) { *n += 10; }
DS51217B-page 117
7.12.1
Syntax
struct-or-union-type-name: struct-or-union identifier struct-or-union identifier { member-declaration-list } struct-or-union { member-declaration-list } member-declaration-list: member-declaration member-declaration-list member-declaration member-declaration: member-declaration-specifiers declarator-list ; member-declaration-specifiers: member-declaration-specifier member-declaration-specifiers member-declarationspecifier member-declaration-specifier: type-name const volatile near far
DS51217B-page 118
MPLAB-CXX Fundamentals
7.12.2
Structures and Debugging in MPLAB IDE User-defined data constructs are included in the symbolic information file from the linker, but MPLAB IDE doesnt use them in debugging.
Introduction to Structures
Structures and unions allow the storage and manipulation of related data together rather than in separate variables. For MPLAB-C17, structures located in program memory must have all elements word aligned. MPLAB-CXX supports anonymous structures.
7.12.2.1 Description
A structure is a group of related items that can be accessed through a common name. Each item within a structure has its own data type, which can be different from the other data types.
7.12.2.2 Example
The following example is for a card catalog in a library. struct catalog_tag { char author[40]; char title[40]; char pub[40]; unsigned int date; unsigned char rev; } card; In this example, the tag of the structure is catalog. It is not the name of a variable, only the name of the type of structure. The variable card is declared as a structure of type catalog. The following shows what the structure catalog looks like in memory. author title pub date rev 40 bytes 40 bytes 40 bytes 2 bytes 1 byte
Part 2
Using MPLAB-CXX
To access any member of a structure, specify the name of the variable and the name of the member separated by a period. For example, to change the revision member of the structure catalog, use the following: card.rev=a; To access the third character in the title, use the following: ThirdChar = card.title[2];
DS51217B-page 119
7.12.3.2 Syntax
The <union-name> is the tag of the union, and the <variable-list> contains the names of the variables that have a data type of <union-name>. Accessing members of a union is the same as accessing members of a structure.
7.12.3.3 Example
Because an int is two bytes and a char is one byte, the union below is stored in memory as shown: union u_tag { int i; char c[4]; } temp; where: <---------- i ----------> <---c[0]---> location 0 <---c[1]---> location 1 <---c[2]---> location 2 <---c[3]---> location 3
An example of saving space is shown below: struct type_tag { enum { VARIABLE, CONSTANT } type; union { char *variable_name; int constant_value; } value; } variable_or_constant; void function( struct type_tag var_or_const ) { int constant; char *variable;
DS51217B-page 120
MPLAB-CXX Fundamentals
switch( var_or_const.type ) { case VARIABLE: variable = var_or_const.value.variable_name; break; case CONSTANT: constant = var_or_const.value.constant_value; break; } } Based on the type of data stored in struct type_tag, the access of the data is different. A union allows the data for the two types to share space.
7.12.4
Nesting Structures
7.12.4.1 Description
A structure member can have a data type that is another structure. This is referred to as a nested structure.
7.12.4.2 Example1
struct Memory { int RAMSize; int ROMSize; }; struct PIC { char Name[12]; struct Memory MemSizes; }; Members of a structure or union define a separate name space, Meaning that two different structures can have the same names for their members.
Part 2
Using MPLAB-CXX
7.12.4.3 Example2
struct struct_tag_1{ int a; int b; char c; } struct_1; struct struct_tag_2 { char d; int a; int b; } struct_2;
DS51217B-page 121
7.12.5
Bit-fields
7.12.5.1 Description
Bit-fields allow the specification of integer-type members of a struction, which are the specified number of bits in size. Bit-fields cannot cross byte boundaries and, therefore, cannot be greater than 8 bits in size.
7.12.5.2 Syntax
struct <struct_name> { <int type> <member1> : <bit-width>; <int type> <member2> : <bit-width>; : <int type> <membern> : <bit-width>; }
7.12.5.3 Example
See Section 8.4.3.
DS51217B-page 122
8.1
Introduction
This section discusses specific details for programming PICmicro microcontrollers (MCUs) when using MPLAB-C17 and MPLAB-C18.
8.2
Highlights
Items discuss in this chapter are: PICmicro MCU Programming Specifics MPLAB-C17 and PICmicro MCU Programming MPLAB-C18 and PICmicro MCU Programming
8.3
Part 2
Using MPLAB-CXX
8.3.1
Memory Models
Different devices access memory differently. Depending on your selected device, you will need to use different memory model versions of libraries and/ or precompiled object files. See the MPLAB-CXX Reference Guide for a list of libraries and precompiled object files available for different memory models.
8.3.2
DS51217B-page 123
Note: var must be an 8-bit quantity (e.g., char) and not located on the stack. Header files are device (processor) specific, i.e., choose the header file p17c756.h when coding for the PIC17C756. These files are contained in the c:\mcc\h directory, where c:\mcc is the compiler install directory.
8.3.3
DS51217B-page 124
8.3.5
8.3.6
Interrupt Support
Support for interrupts is provided differently for the different compilers. In MPLAB-C17, interrupts are handled by interrupt support macros. In MPLAB-C18, interrupts are handled by the #pragma interrupt directive.
Part 2
Using MPLAB-CXX
DS51217B-page 125
8.4
8.4.1
Memory Models
For PIC17CXXX devices with program memory (ROM) over 8K, the memory is broken up in to pages. For PIC17CXXX devices with data memory (RAM) over 256, the memory is broken up into banks. Table 8.2 spells out the memory models available for these devices via MPLAB-C17. Table 8.2: Memory Model Usage - MPLAB-C17 Memory Model s m c l small medium compact large Device Description near rom - program memory 8K, near ram - data memory 256 far rom - program memory > 8K, near ram - data memory 256 near rom - program memory 8K, far ram - data memory > 256 far rom - program memory > 8K, far ram - data memory > 256
The usage of the keywords near, far, ram and rom is discussed in Chapter 6.
DS51217B-page 126
8.4.3
Part 2
Using MPLAB-CXX
DS51217B-page 127
Bit 0 */
Alternate name for bit 0 */ Alternate name for bit 1 */ pad next 6 locatons */
The first declaration specifies that PORTA is a byte (unsigned char), whereas the second one declares PORTAbits as a union of bit-addressable structures. Since individual bits in a special function register may have more than one function (and hence more than one name), there are multiple structure definitions inside the union all referring to the same register. Respective bits in all structure definitions refer to the same bit in the register. Where a bit has only one function for its position, it is simply padded in other structure definitions. For example, bits 2 through 7 on Port A are simply padded in the second structure definition using the statement unsigned :6. When using a special function register such as Port A, write the following statements: PORTA = 0x34; /* Assigns the value 0x34 to the */ /* whole port */ PORTAbits.INT = 1; /* Sets the INT pin high */ PORTAbits.RA0 = 1; /* Sets the RA0 pin high, same as */ /* above statement */ The extern modifier is needed since the variables are declared in the register definitions file. The volatile modifier tells the compile that it cannot assume that Port A retains values assigned to it. The far modifier specifies that the port needs a bank switching instruction prior to access.
8.4.4
Software Stack
Define a software stack in the linker script for the processor by using a command similar to the following: STACK SIZE = 0x20
DS51217B-page 128
Stack Overflow Avoidance: For MPSIM or MPLAB-ICE 2000, use a break statement at the last location on the stack. If the program breaks, then a stack overflow would have occurred in the next byte.
8.4.5
Part 2
Using MPLAB-CXX
8.4.5.1
The space shown between the two underlines preceding STARTUP() is for illustration and should not be used in actual code (i.e., there should be no space.)
_ _STARTUP()
To execute some code immediately after a device reset but before any other code generated by the compiler is executed, optionally create a function by the name _ _STARTUP(). This will be the first code executed upon a reset. To use a _ _STARTUP() function in a program: 1. Define a _ _STARTUP() function in a C program as follows: void _ _STARTUP(void) { // Initialize some registers to 0 TRISB = 0; TRISC = 0; } 2. In c0l17.asm or c0s17.asm, uncomment the line: #DEFINE USE_STARTUP
DS51217B-page 129
8.4.5.2
When declaring initialized data (such as: int x = 5;), the variable is allocated in data memory but the value is stored in program memory. Before the data is usable in any program, the values must be copied from program memory into the variable in data memory. The size of the MPLAB-C17 initialization code is approximately 50 words. Therefore, to only initialize a few variables, do not use that feature and initialize the variables manually in the code. If initializing many variables (10 or more integers or 20 or more characters) as they are declared, then the initialization code is the better option in terms of code size.
c0s17.asm is assembled with USE_INITDATA undefined by default. c0l17.asm is assembled with USE_INITDATA defined by default.
To use initialized data with c0s17.asm in a MPLAB-C17 program: 1. Uncomment the following line in c0s17.asm: #DEFINE USE_INITDATA 2. Assemble c0s17.asm to produce c0s17.o. 3. Assemble idata17.asm to produce idata17.o, or use idata17.o directly. 4. Link the above files with the C object code. To use initialized data with c0l17.asm in a MPLAB-C17 program: 1. Assemble c0s17.asm to produce c0s17.o, or use c0s17.o directly. 2. Assemble idata17.asm to produce idata17.o, or use idata17.o directly. 3. Link the above files with the C object code.
8.4.5.3
Stack Initialization
The stack initialization simply points the compiler stack pointer to the right location in data memory.
8.4.5.4
Branching to main()
After the startup code optionally calls _ _STARTUP() and/or copies initialized data, and sets up the stack, it calls the main() function of the C program. There are no arguments passed to main(). MPLAB-C17 transfers control to main() via a goto, i.e.; goto main
DS51217B-page 130
Part 2
Startup code supplied with MPLAB-C17 does not support nested interrupts.
Using MPLAB-CXX
Bank 0 0xFB 0xFC 0xFD 0xFE 0xFF <Available> save_WREG save_BSR <Reserved> <Reserved>
The ALUSTA, PCLATH, BSR, and WREG are the registers that absolutely need to be saved before we branch to the interrupt service function. However, there are other registers used by the compiler that are worth saving under certain circumstances. The following is an example that uses the Timer 0 Overflow Interrupt. #include <p17c44.h> unsigned char x; void _ _TMR0() {
DS51217B-page 131
DS51217B-page 132
Part 2
Using MPLAB-CXX
DS51217B-page 133
8.4.7
Optimization Tips
Because of the limited memory on microcontrollers, optimization becomes an issue as code complexity increases. This section discusses some optimization tips for your C code. 1. Choose the correct memory model for your libraries and precompiled object files. Dont just pick the large memory model versions for inclusion in your project. Consult Section 8.4.1 for more information. 2. Use the linker script to group variables that are used together into the same data memory bank to minimize bank switching. Intelligent use of the varlocate pragma and the section directive can yield excellent results. Example 8.3: Minimizing Bank Switching MPLAB-C17 In the linker script: SECTION NAME=coeffs RAM=temperature In the program: #pragma varlocate coeff 3. Use of section pragmas to effectively manage RAM and ROM. Refer to Section 7.3 for information on the pragma directive. For examples of use, see the MPLINK examples found in the MPASM Users Guide with MPLINK and MPLIB.
DS51217B-page 134
MPLAB-CXX and PICmicro MCU Programming 8.5 MPLAB-C18 and PICmicro MCU Programming
This section discusses issues of using MPLAB-C18 for PICmicro MCU programming.
8.5.1
Memory Models
PIC18CXXX devices using more than 32K program memory (ROM), i.e., external ROM or future devices with more ROM, will need to use the large memory model. Table 8.5 spells out the memory models available for these devices via MPLAB-C18. Table 8.5: Memory Model Usage - MPLAB-C18 Memory Model s l small large Device Description near rom program memory 64KB (16-Bit pointer used) far rom program memory > 64KB (24-Bit pointer used)
The usage of the keywords near, far, ram and rom is discussed in Chapter 6.
8.5.2
Part 2
8.5.3
Using MPLAB-CXX
8.5.4
Software Stack
Define a software stack in the linker script for the processor by using a command similar to the following:
Stack Overflow Avoidance: For MPSIM or MPLAB-ICE 2000, use a break statement at the last location on the stack. If the program breaks, then a stack overflow would have occurred in the next byte.
STACK
SIZE = 0x100
This reserves 256 bytes in the general purpose RAM area for the software stack. The size of the software stack required by a program varies with the complexity of the program. The following should be kept in mind: When nesting function calls, all arguments and local variables (auto variables included) of the calling function will remain on the stack. Therefore, the stack must be large enough to accommodate the requirements by all functions in a tree.
DS51217B-page 135
The next instructions add to the stack pointer the number of bytes of local variable storage required by the function which is, in this case, two bytes. 000130 000132 0e02 26e1 MOVLW ADDWF 0x2 0xe1,0x1,0x0 { unsigned char a, b; Heres some code in the middle just so there is a function body. do{ 000134 000136 000138 00013a 00013c cfd9 ffe9 cfda ffea 6aef MOVFF MOVFF CLRF 0xfd9,0xfe9 0xfda,0xfea 0xef,0x0 }while(0); The epilogue code subtracts from the stack pointer the number of bytes which were allocated by the prologue, plus one for the frame pointer. Then it uses INDF1 to retrieve the prior value of the frame pointer back into FSR2. 00013e 000140 000142 000144 000146 0e03 5ee1 cfe7 ffd9 0012 MOVLW SUBWF MOVFF RETURN 0x3 0xe1,0x1,0x0 0xfe7,0xfd9 0x0 } a=0;
8.5.5
DS51217B-page 136
8.5.5.1
Startup Customization
To execute some code immediately after a device reset but before any other code generated by the compiler is executed, edit the desired startup file and add the code before the _entry() function. To customize the startup files: 1. Go to the c:\mcc\src\startup directory, where c:\mcc is the compiler install directory. 2. Edit either c018.asm or c018i.asm to add any customized startup code desired. 3. Compile the updated startup file to generate either c018.o or c018i.o.
8.5.5.2
When declaring initialized data (such as: int x = 5;), the variable is allocated in data memory but the value is stored in program memory. Before the data is usable in any program, the values must be copied from program memory into the variable in data memory. To use initialized data in a MPLAB-C18 program: 1. Use the standard C library clib.lib instead of c_noinit.lib. 2. Link the above file with the C object code.
Part 2
Using MPLAB-CXX
8.5.5.3
Stack Initialization
The stack initialization simply points the compiler stack pointer to the right location in data memory.
8.5.5.4
Branching to main()
After the startup code optionally copies initialized data and sets up the stack, it calls the main() function of the C program. There are no arguments passed to main(). MPLAB-C18 transfers control to main() via a looped call, i.e.; loop: // Call the users main routine main(); goto loop;
DS51217B-page 137
8.5.7
Optimization Tips
Because of the limited memory on microcontrollers, optimization becomes an issue as code complexity increases. This section discusses some optimization tips for your C code. 1. Choose the correct memory model for your libraries and precompiled object files. Dont just pick the large memory model versions for inclusion in your project. Consult Section 8.5.1 for more information.
DS51217B-page 138
MPLAB-CXX COMPILER USERS GUIDE Chapter 9. Mixing Assembly Language and C Modules 9.1 Introduction
This section describes how to use assembly language and C modules together. It gives examples of using C variables and functions in assembly code and examples of using assembly language variables and functions in C.
9.2
Highlights
This chapter covers the following topics: Calling Conventions Mixing Assembly Language and C Variables and Functions Calling an Assembly Function in C MPLAB-C17 Using the File Selection Registers (FSRs)
9.3
Calling Conventions
This section describes the calling conventions of C and assembly routines. Calling Assembly Routines from C: Function declared as extern in C module. Label declared as global in ASM module.
Part 2
Using MPLAB-CXX
Function declaration may return a value and/or contain parameters. Functions are called using standard C function notation. Calling C Routines from Assembly: C functions are inherently global. Function name must be declared as extern symbol in assembly file. call must be used to make function call; RETURN 0x00 implemented at end of C function.
DS51217B-page 139
MPLAB-CXX Compiler Users Guide 9.4 Mixing Assembly Language and C Variables and Functions
The following example shows how to use variables and functions in both assembly language and C regardless of where they were originally defined. These example files may be found in c:\mcc\examples\example2, where c:\mcc is the compiler install directory. The file ex_c.c defines main and c_variable to be used in the assembly language file. The C file also shows how to call an assembly function, asm_function, and how to access the assembly defined variable, asm_variable. The file ex_asm.asm defines asm_function and asm_variable as required to use them in a linked C file. The assembly file also shows how to call a C function, main, and how to access a C defined variable, c_variable. ex_c.c // file: ex_c.c extern unsigned asm_variable; extern near void asm_function( void ); extern void main( void ); unsigned c_variable; void main(void) { asm_function(); // will modify c_variable asm_variable = 0x1234; } ex_asm.asm ; file: ex_asm.asm LIST P=17C44 EXTERN main EXTERN c_variable MYCODE CODE asm_function movlw 0xff movwf c_variable movwf c_variable+1 return GLOBAL asm_function MYDATA UDATA asm_variable RES 2 GLOBAL asm_variable END
; export so linker can see it ; 2 byte variable ; export so linker can see it
DS51217B-page 140
Mixing Assembly Language and C Modules 9.5 Calling an Assembly Function in C MPLAB-C17
The following example shows how to call an assembly function with a parameter. These example files may be found in c:\mcc\examples\example3, where c:\mcc is the compiler install directory. Most of the work is done in the file call_asm.asm where the parameter is taken off of the software stack. call_c.c calls the asm_function with a parameter. call_c.c // File call_c.c unsigned char asm_function( unsigned char a ); unsigned char x; void main( void ) { x = asm_function( 0xff ); } call_asm.asm ; File call_asm.asm LIST P=17C756 EXTERN _stack GLOBAL asm_function MYCODE CODE asm_function banksel _stack ; Get the stack pointer into 0x00 movfp _stack, 0x01 decf 0x01, f ; Point FSR1 at the argument movfp 0x00, 0x0a ; Get the argument decf 0x0a, f ; The convention is that we return ; with FSR0 pointing at the return value. ; Well just reuse the space ; allocated for the argument since were already ; pointed there. movwf return END 0x00 ; Store the return value
Part 2
Using MPLAB-CXX
DS51217B-page 141
MPLAB-CXX Compiler Users Guide 9.6 Using the File Selection Registers (FSRs)
The following is an example of using the file selection registers (FSRs). The code is for the library function strcpy, which copies the source string (pointed to by src) into the destination string (pointed to by dst). See the MPLAB-CXX Reference Guide for more on the strcpy operation. Example 9.1: FSR Usage extern FSR2L, FSR2H, POSTINC1, POSTDEC1, PLUSW1, FSR0L, FSR0H, POSTINC0 extern POSTINC2, INDF0, INDF1, FSR1L, FSR1H global strcpy STRCPY CODE ; char *strcpy (char *dst, const char *src); strcpy ; Well play loose with the stack and frame pointers in this function. ; As long as the values are restored upon exit and the stack pointer ; always points into unallocated stack space, things will be fine, ; even if an interrupt occurs during our processing here. ; ; Save the current FSR2 value on the stack. Well be using it as ; a source index. movff FSR2L, POSTINC1 movff FSR2H, POSTINC1 ; Store the src pointer into FSR2 movlw -6 movff PLUSW1, FSR2L movlw -5 movff PLUSW1, FSR2H ; Store the dst pointer into FSR0 movlw -4 movff PLUSW1, FSR0L movlw -3 movff PLUSW1, FSR0H ; Perform the copy... copyloop: movff POSTINC2, INDF0 ; Was that the \0? tstfsz POSTINC0,0 bra copyloop ; restore FSR2 movf POSTDEC1,1,0 movff POSTDEC1,FSR2H movff INDF1,FSR2L ; The return value is a pointer to the destination movlw -4 addwf FSR1L,0,0
DS51217B-page 142
Part 2
Using MPLAB-CXX
DS51217B-page 143
DS51217B-page 144
MPLAB-CXX COMPILER USERS GUIDE Chapter 10. ANSI Implementation Issues 10.1 Introduction
This section describes the behavior of MPLAB-CXX where the ANSI standard X3.159-1989 describes the behavior as implementation defined. The text below in italic font is taken directly from the ANSI standard with the appropriate section in parentheses.
10.2 Highlights
This chapter covers ANSI-implementation issues for the following categories: Identifiers Characters Integers Floating Point Arrays and Pointers Registers Structures and Unions Bit-Fields Enumerations Switch Statements Preprocessor Directives
Part 2
Using MPLAB-CXX
10.3 Identifiers
The number of significant initial characters (beyond 31) in an identifier without external linkage (3.1.2) The number of significant initial characters (beyond 6) in an identifier with external linkage (3.1.2) Whether case distinctions are significant in an identifier with external linkage (3.1.2)
All MPLAB-CXX identifiers have 31 significant characters. Case distinctions are significant in an identifier with external linkage.
DS51217B-page 145
Whether a plain char has the same range of values as signed char or unsigned char (3.2.1.1)
A plain' char has the same range of values as a signed char. For MPLAB-C18, this may be changed to unsigned char via a command line switch (-k).
10.5 Integers
A char, a short int, or and int bit-field, or their signed or unsigned varieties, or an enumeration type, may be used in an expression wherever an 'int' or 'unsigned int' may be used. If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integral promotions. All other arithmetic types are unchanged by the integral promotions. The integral promotions preserve value including sign. (3.2.1.1)
MPLAB-C18 does not enforce this by default. The -oi option can be used to require the compiler to enforce the ANSI defined behavior.
The result of converting an integer to a shorter signed integer, or the result of converting an unsigned integer to a signed integer of equal length, if the value cannot be represented (3.2.1.2)
When converting from a larger integer type to a smaller integer type, the high order bits of the value are discarded and the remaining bits are interpreted according to the type of the smaller integer type. When converting from an unsigned integer to a signed integer of equal size, the bits of the unsigned integer are simply reinterpreted according to the rules for a signed integer of that size.
DS51217B-page 146
Part 2
Using MPLAB-CXX
DS51217B-page 147
The type of integer required to hold the difference between two pointers to elements of the same array, ptrdiff_t (3.3.6, 4.1.1)
ptrdiff_t is defined as an unsigned int (MPLAB-C17) or unsigned long short (MPLAB-C18).
10.8 Registers
The extent to which objects can actually be placed in registers by use of the register storage class specifier (3.5.1)
The register storage class specifier is ignored.
DS51217B-page 148
10.11 Enumerations
The integer type chosen to represent the values of an enumeration type (3.5.2.2)
signed int is used to represent the values of an enumeration type.
Part 2
Using MPLAB-CXX
The support for quoted names for includable source files (3.8.2)
Includable source files specified via the #include filename mechanism are searched for in the current directory and then in the path specified in the MCC_INCLUDE environment variable. The MCC_INCLUDE environment variable contains a semi-colon delimited list of directories to search.
DS51217B-page 149
DS51217B-page 150
11.2 Highlights
The contents of this chapter are as following: Overview of Example Files Example Details
Part 2
Using MPLAB-CXX
Demo - DEMO Additions, deletions or other changes to this list may have occurred. Check the readme.txt in the examples directory for more information on what examples are available and a brief description of the function of each example.
DS51217B-page 151
DS51217B-page 152
Part 3
Appendicies
DS51217B-page 153
DS51217B-page 154
MPLAB-CXX COMPILER USERS GUIDE Appendix A. ASCII Character Set A.1 A.2 Introduction
This appendix contains the ASCII character set.
Part 3
Appendicies
DS51217B-page 155
DS51217B-page 156
MPLAB-CXX COMPILER USERS GUIDE Appendix B. PIC17CXXX Instruction Set B.1 B.2 Introduction
This appendix gives the instruction set for the PIC17CXXX device family.
Highlights
This appendix presents the following reference information: Key to PICmicro MCU Family Instruction Sets PIC17CXXX Instruction Set
B.3
Field b d
f k W x i p t PH:PL
Register file address (0x00 to 0xFF) Literal field, constant data or label Working register (accumulator) Dont care location Table pointer control; i = 0 Do not change. i = 1 Increment after instruction execution. Peripheral register file address (0x00 to 0x1f) Table byte select; t = 0 Perform operation on lower byte. t = 1 Perform operation on upper byte.
Part 3
Appendicies
DS51217B-page 157
TABLRD t,i,f Read data from table latch into file f, then update table latch with 16-bit contents of memory location addressed by table pointer TABLWT t,i,f Write data from file f to table latch and then write 16-bit table latch to program memory location addressed by table pointer TLRD TLWT t,f Read data from table latch into file f (table latch unchanged) t,f Write data from file f into table latch
acff
a0ff a4ff
Table B.2: 16-Bit Core Arithmetic and Logical Instruction Hex b1kk 0eff 10ff b5kk 0aff 28ff 12ff 2eff Mnemonic ADDLW ADDWF ADDWFC ANDLW ANDWF CLRF COMF DAW f,d Add W to F f,d Add W and Carry to f k AND Literal and W f,d AND W with f f,d Clear f and Clear d f,d Complement f f,d Dec. adjust W, store in f,d Description k Add literal to W Function (W + k) W (W + f) d (W + f + C) d (W .AND. k) W (W .AND. f) d 0x00 f,0x00 d .NOT. f d W adjusted f and d
DS51217B-page 158
Description
22ff
RLNCF
register f 7......0
18ff
RRCF
register f 7......0
20ff
RRNCF
register f 7......0
f,d Set f and Set d k Subtract W from literal f,d Subtract W from f f,d Subtract from f with borrow f,d Swap f k Exclusive OR literal with W f,d Exclusive OR W with f
Part 3
Appendicies
DS51217B-page 159
Table B.4: 16-Bit Core Program Control Instructions Hex ekkk Mnemonic CALL Description k Subroutine call (within 8k page) Function PC+1 TOS,k PC(12:0), k(12:8) PCLATH(4:0), PC(15:13) PCLATH(7:5) f-W, skip if f = W f-W, skip if f > W f-W, skip if f < W (f-1) d, skip if 0 (f-1) d, skip if not 0 k PC(12:0) k(12:8) PCLATH(4:0), PC(15:13) PCLATH(7:5) (f+1) d, skip if 0 (f+1) d, skip if not 0 (PC+1) TOS; k (PCLATH) PCH PCL,
f Compare f/w, skip if f = w f Compare f/w, skip if f > w f Compare f/w, skip if f< w f,d Decrement f, skip if 0 f,d Decrement f, skip if not 0 k Unconditional branch (within 8k)
f,d Increment f, skip if zero f,d Increment f, skip if not zero k Long Call (within 64k) Return from interrupt, enable interrupt k Return with literal in W Return from subroutine f Test f, skip if zero
(PCLATH) PCH:k PCL 0 GLINTD k W, TOS PC, (PCLATH unchanged) TOS PC (PCLATH unchanged) skip if f = 0
DS51217B-page 160
Part 3
Appendicies
DS51217B-page 161
DS51217B-page 162
MPLAB-CXX COMPILER USERS GUIDE Appendix C. PIC18CXXX Instruction Set C.1 C.2 Introduction
This appendix gives the instruction set for the PIC18CXXX device family.
Highlights
This appendix presents the following reference information: Key to Enhanced 16-Bit Core Instruction Sets PIC18CXXX Instruction Set
C.3
Field
File Addresses f fs fd dest Literals kk kb kc kd nn nd ml mm xx Bits b d a s bits 9-11; bit address bit 9; 0=W destination; 1=f destination bit 8; 0=common block; 1=BSR selects bank bit 0 (bit 8 for CALL); 0=no update; 1(fast)=update/save W, STATUS, BSR 8-bit literal value 4-bit literal value bits 8-11 of 12-bit literal value bits 0-7 of 12-bit literal value 8-bit relative offset (signed, 2s complement) 11-bit relative offset (signed, 2s complement) bits 0-7 of 20-bit program memory address bits 8-19 of 20-bit program memory address any 12-bit value 8-bit file register address 12-bit source file register address 12-bit destination file register address W register if d = 0; file register if d = 1
Offsets, Addresses
Part 3
Appendicies
DS51217B-page 163
kk kb
f,kd:kc Load Literal to FSR (second word) kk kk kk kk Move literal to W Multiply literal with W Subtract W from literal Exclusive OR literal with W
Table C.7: Enhanced 16-Bit Core Memory Operations Hex 0008 0009 000A 000B 000C 000D Mnemonic TBLRD * TBLRD *+ TBLRD *TBLRD +* TBLWT * TBLWT *+ Description Table Read (no change to TBLPTR) Table Read (post-increment TBLPTR) Function Prog Mem (TBLPTR) TABLAT Prog Mem (TBLPTR) TABLAT TBLPTR +1 TBLPTR
Table Read (post-decrement TBLPTR) Prog Mem (TBLPTR) TABLAT TBLPTR -1 TBLPTR Table Read (pre-increment TBLPTR) Table Write (no change to TBLPTR) Table Write (post-increment TBLPTR) TBLPTR +1 TBLPTR Prog Mem (TBLPTR) TABLAT TABLAT Prog Mem(TBLPTR) TABLAT Prog Mem(TBLPTR) TBLPTR +1 TBLPTR
DS51217B-page 164
Table C.8: Enhanced 16-Bit Core Control Operations Hex E2nn E6nn E3nn E5nn E1nn E7nn E0nd E4nn E0nn ECml Fmm EFml Fmm 0001 0000 0006 0005 D8nd 00FF 0010 BC BN BNC BNOV BNZ BNN BRA BOV BZ CALL Mnemonic nn nn nn nn nn nn nd nn nn Description Relative Branch if Carry Relative Branch if Negative Function if C=1, PC+2+2*nn PC, else PC+2PC if N=1, PC+2+2*nnPC,else PC+2PC
Relative Branch if Not Carry if C=0, PC+2+2*nnPC, else PC+2PC Relative Branch if Not Over- if OV=0, PC+2+2*nnPC, else PC+2PC flow Relative Branch if Not Zero if Z=0, PC+2+2*nnPC, else PC+2PC Relative Branch if Not Nega- if N=0, PC+2+2*nnPC, else PC+2PC tive Unconditional relative branch Relative Branch if Overflow Relative Branch if Zero PC+2+2*nd PC if OV=1, PC+2+2*nnPC, else PC+2PC if Z=1, PC+2+2*nnPC, else PC+2PC PC+4 TOS, mm:ml PC<20:1>, if s=1, W WS, STATUS STATUSS, BSR BSRS mm:ml PC<20:1> PC=halt No operation TOS-1 TOS PC +2 TOS PC+2 TOS, PC+2+2*ndPC same as MCLR reset TOS PC, 1 GIE/GIEH or PEIE/GIEL, if s=1, WS W, STATUSS STATUS, BSRS BSR, PCLATU/PCLATH unchngd. kk W,
mm:ml,s Absolute Subroutine Call (second word) mm:ml Absolute Branch (second word) Halt processor No Operation Pop Top of return stack Push Top of return stack nd Relative Subroutine Call Generate a Reset (same as MCR reset) s Return from interrupt (and enable interrupts) Return from subroutine, literal in W
Part 3
Appendicies
0Ckk
RETLW
kk
DS51217B-page 165
0003
SLEEP
Table C.9: Enhanced 16-Bit Core Bit Operations Hex 9bf 8bf Bbf Abf 7bf Mnemonic BCF BSF BTFSC BTFSS BTG f,b,a f,b,a f,b,a f,b,a f,b,a Bit Set f Bit test, skip if clear Bit test, skip if set Bit Toggle f Description Bit Clear f 0 f<b> 1 f<b> if f<b>=0, PC+4PC, else PC+2PC if f<b>=1, PC+4PC, else PC+2PC f<b> f<b> Function
Table C.10: Enhanced 16-Bit Core File Register Operations Hex 24f 20f 14f 6Af 1Cf 62f 64f 60f 04f 2Cf 4Cf 28f 3Cf 48f Mnemonic ADDWF ADDWFC ANDWF CLRF COMF CPFSEQ CPFSGT CPFSLT DECF DECFSZ DCFSNZ INCF INCFSZ INFSNZ f,d,a f,d,a f,d,a f,a f,d,a f,a f,a f,a f,d,a f,d,a f,d,a f,d,a f,d,a f,d,a Description ADD W to f ADD W and Carry bit to f AND W with f Clear f Complement f W+f dest W+f+C dest W .AND. f dest 0f f dest Function
Compare f with W, skip if f=W fW, if f=W, PC+4 PC else PC+2 PC Compare f with W, skip if f > W Compare f with W, skip if f < W Decrement f Decrement f, skip if 0 Decrement f, skip if not 0 Increment f Increment f, skip if 0 Increment f, skip if not 0 fW, if f > W, PC+4 PC else PC+2 PC fW, if f < W, PC+4 PC else PC+2 PC f1 dest f1 dest, if dest=0, PC+4 PC else PC+2 PC f1 dest, if dest 0, PC+4 PC else PC+2 PC f+1 dest f+1 dest, if dest=0, PC+4 PC else PC+2 PC f+1 dest, if dest 0, PC+4 PC else PC+2 PC
DS51217B-page 166
Function
W * f PRODH:PRODL f +1 f
register f 7......0
44f
RLNCF
f,d,a
register f 7......0
30f
RRCF
f,d,a
register f 7......0
40f
RRNCF
f,d,a
register f 7......0
Set f Subtract f from W with Borrow Subtract W from f Subtract W from f with Borrow Swap f Test f, skip if 0 Exclusive OR W with f
0xFF f WfC dest fW dest fWC dest f<3:0> dest<7:4>, f<7:4> dest<3:0> PC+4 PC, if f=0, else PC+2 PC W .XOR. f dest
Part 3
Appendicies
DS51217B-page 167
DS51217B-page 168
MPLAB-CXX COMPILER USERS GUIDE Appendix D. MPLAB-C17 Errors D.1 D.2 Introduction
This appendix lists errors generated by the MPLAB-C17 compiler.
Highlights
The following errors apply to MPLAB-C17: Errors Warnings
D.3
Errors
1000: argument count mismatch in function call To call a function, the number of arguments passed must match exactly the number of parameters declared for the function. 1001: type mismatch in argument %d The type of an argument to a function call must be compatible with the declared type of the corresponding parameter 1002: arithmetic type expected in expression The operator requires that its operand be of arithmetic type 1003: arithmetic or pointer to object type required 1004: array must have integral constant size 1005: object of pointer type required for [ ] operator The array access operator, [ ], requires that one operand be a pointer and the other be an integer, that is, for x[y] the expression *(x+y) must be valid. x[y] is functionally equivalent to *(x+y). 1006: > requires pointer to struct or union The member access operator > requires operands of pointer to struct/ union. 1007: call of non-function The operand of the () function call post-fix operator must be of type pointer to function. Most commonly, this is a function identifier. Common causes include missing scope parentheses. 1008: cannot modify const qualified object An object qualified with const is declared to be read-only data and modifications to it are therefore not allowed. 1009: cannot return an object of array type
Part 3
Appendicies
DS51217B-page 169
DS51217B-page 170
MPLAB-C17 Errors
1032: initializer list required for %s 1034: type mismatch in initializer 1035: value expected in initializer 1036: inline assembly must be within a function body 1037: integer constant expected 1038: integer type required Bitwise operators require that both operands be of integer type. Common causes include a missing * or [ ] operator. 1040: invalid character constant 1041: invalid expression in assembly statement 1042: invalid member of structure %s 1043: invalid storage class in parameter %d 1044: lvalue required An expression which designates an object is required. Common causes include missing parentheses and a missing * operator. 1045: argument count mismatch invoking macro %s 1046: identifier expected in macro definition 1047: missing argument %d in macro %s 1048: misplaced break statement A break statement must be inside a while, do, for, or switch statement. Common causes include a misplaced }. 1049: misplaced continue statement A continue statement must be inside a while, do, for, or switch statement. 1050: missing ) in macro invocation on line %d 1051: missing #endif 1052: multiple #else clauses for #if not allowed 1053: cannot use %s twice in same declaration 1054: cannot use type twice in same declaration 1055: must have constant operand for 1-bit quantity 1056: must have constant operand for 3-bit quantity 1057: identifier expected following %s
Part 3
Appendicies
1058: pointer operand required for * operator The * dereference operator requires a pointer to a non-void object as its operand 1059: syntax error: Expecting second parameter
DS51217B-page 171
DS51217B-page 172
MPLAB-C17 Errors
1094: conflicting types specified 1095: type declarator mismatch 1096: type location mismatch 1097: type mismatch The type of the return value is not compatible with the declared return type of the function. Common causes include a missing * or [ ] operator 1098: type mismatch in redeclaration of %s The type of the symbol declared is not compatible with the type of a previous declaration of the same symbol. Common causes include missing qualifiers or misplaced qualifiers. 1099: type qualifier mismatch 1100: type range mismatch 1101: type storage class mismatch 1102: undefined symbol %s A symbol has been referenced before it has been defined. Common causes include a misspelled symbol %s, a missing header file which declares the symbol, and a reference to a symbol valid only in an inner scope. 1103: unexpected input after %s 1104: unknown preprocessor directive %s 1105: unresolved label %s The label has been referenced via a goto statement, but has not been defined in the function. Common causes include a misspelled label identifier and a reference to an out of scope label, i.e., a label defined in another function. 1106: bit field type must be integer 1107: section #pragmas not allowed inside functions
D.4
Warnings
2000: no prototype for %s 2001: shift by zero 2002: shift by more bits than contained in operand 2003: rom and volatile in same declaration 2004: unused symbol block 2005: redefinition of macro %s is not identical
Part 3
Appendicies
DS51217B-page 173
DS51217B-page 174
MPLAB-CXX COMPILER USERS GUIDE Appendix E. MPLAB-C18 Errors E.1 E.2 Introduction
This appendix lists errors generated by the MPLAB-C18 compiler.
Highlights
The following errors apply to MPLAB-C18: Errors Warnings
E.3
Errors
1000: unexpected input following %s 1001: identifier expected following %s 1002: syntax error, %s expected 1003: unknown pre-processor directive %s 1004: missing ) in macro on line %d 1005: missing argument %d invoking macro %s 1006: extra argument(s) invoking macro %s 1007: ( expected invoking macro %s 1008: #else without #if detected 1009: #elif without #if detected 1010: #endif without #if detected 1012: identifier expected in macro definition 1013: error in pragma directive 1014: attribute mismatch in resumption of section %s 1011: missing #endif 1015: missing include path for system header files 1050: section address permitted only at definition 1051: section pragma not allowed inside a function
Part 3
Appendicies
1052: section overlay attribute does not match definition 1053: section share attribute does not match definition 1054: section type does not match definition 1100: syntax error
DS51217B-page 175
DS51217B-page 176
MPLAB-C18 Errors
1111: undefined label %s in %s The label has been referenced via a goto statement, but has not been defined in the function. Common causes include a misspelled label identifier and a reference to an out of scope label, i.e., a label defined in another function. 1112: integer type expected in switch control expression The control expression for a switch statement must be an integer type. Common causes include a missing * operator and a missing [ ] operator. 1113: integer constant expected for case label value The value for a case label must be an integer constant. 1114: case label outside switch statement detected A case label is only valid inside the body of a switch statement. Common causes include a misplaced }. 1115: multiple default labels in switch statement A switch statement can only have a single default label. Common causes include a missing } to close an inner switch. 1116: type mismatch in return statement The type of the return value is not compatible with the declared return type of the function. Common causes include a missing * or [ ] operator 1117: scalar type expected in if statement An if statement control expression must be of scalar type, i.e., an integer or a pointer. 1118: scalar type expected in while statement A while statement control expression must be of scalar type, i.e., an integer or a pointer. 1119: scalar type expected in do..while statement A do..while statement control expression must be of scalar type, i.e., an integer or a pointer. 1120: scalar type expected in for statement A for statement control expression must be of scalar type, i.e., an integer or a pointer. 1120: scalar type expected in ?: expression A ?: operator control expression must be of scalar type, i.e., an integer or a pointer. 1122: scalar operand expected for ! operator The ! operator requires that its operand be of scalar type. 1123: scalar operands expected for || operator The logical OR operator, ||, requires scalar operands.
Part 3
Appendicies
DS51217B-page 177
DS51217B-page 178
MPLAB-C18 Errors
1135: integer operands required for modulus operator The % and %= division operators require that their operands be of integer type. Common causes include a missing * dereference operator or a missing [ ] index operator. 1136: integer operands required for shift operator The bitwise shift operators require that their operands be of integer type. Common causes include a missing * dereference operator or a missing [ ] index operator. 1137: integer types required for bitwise AND operator The & and &= operators require that both operands be of integer type. Common causes include a missing * or [ ] operator 1138: integer types required for bitwise OR operator The | and |= operators require that both operands be of integer type. Common causes include a missing * or [ ] operator 1139: integer types required for bitwise XOR operator The ^ and ^= operators require that both operands be of integer type. Common causes include a missing * or [ ] operator 1139: integer type required for bitwise NOT operator The ~ operator requires that the operand be of integer type. Common causes include a missing * or [ ] operator 1141: integer type expected for pointer addition The addition operator requires that when one operand is of pointer type, the other must be of integer type. Common causes include a missing * or [ ] operator. 1142: type mismatch in + operator The types of the operands of the + operator must be such that one operand is of pointer type and the other is of integer type or both operands are of arithmetic type. 1143: pointer difference requires pointers to compatible types When calculating the difference between two pointers, the pointers must point to objects of compatible type. Common causes include missing parentheses and a missing [ ] operator. 1144: integer type required for pointer subtraction When the left hand operand of the subtraction operator is of pointer type, the right hand operand must be of integer type. Common causes include a missing * or [ ] operator. 1145: arithmetic type expected for subtraction operator When the left hand operand is not of pointer type, the subtraction operator requires that both operands by of arithmetic type.
Part 3
Appendicies
DS51217B-page 179
DS51217B-page 180
MPLAB-C18 Errors
1205: unknown member %s in %s The structure or union tag does not have a member of the name requested. Common causes include a misspelled member name and a missing member access operator for a nested structure. 1206: unknown member %s The structure or union type does not have a member of the name requested. Common causes include a misspelled member name and a missing member access operator for a nested structure. 1208: "#pragma interrupt" detected inside function body The interrupt pragma is only available at file level scope. 1209: unknown function %s in #pragma interrupt The interrupt pragma requires that the function being declared as an interrupt have an active prototype when the pragma is encountered 1210: unknown symbol %s in interrupt save list The interrupt pragma requires that symbols listed in the save list must be declared and of in scope 1211: missing definition for interrupt function %s The function was declared as an interrupt, but was never defined. The function definition of an interrupt function must be in the same module as the pragma declaring the function as an interrupt. 1212: static function %s referenced but not defined The function has been declared as static and has been referenced elsewhere in the module, but there is no definition for the function present. Common causes include a misspelled function name in the function definition. 1300: stack frame too large The size of the stack frame has exceeded the maximum addressable size. Commonly caused by too many local variables allocated as auto storage class in a single function. 1301: parameter frame too large The size of the parameter frame has exceeded the maximum addressable size. Commonly caused by too many parameters being passed to a single function. 1099: %s source code #error directive message
Part 3
Appendicies
DS51217B-page 181
DS51217B-page 182
MPLAB-C18 Errors
The function has been declared as static, but there is no definition for the function present. Common causes include a misspelled function name in the function definition. 2065: static function %s never referenced The static function has been defined, but has not been referenced.
Part 3
Appendicies
DS51217B-page 183
DS51217B-page 184
F.2
Highlights
This appendix lists the following reference types: C Standards Information General C Information
F.3
C Standards Information
American National Standard for Information Systems Programming Language C. American National Standards Institute (ANSI), 11 West 42nd. Street, New York, New York, 10036. This standard specifies the form and establishes the interpretation of programs expressed in the programming language C. Its purpose is to promote portability, reliability, maintainability, and efficient execution of C language programs on a variety of computing systems.
F.4
General C Information
Kernighan, Brian W., and Ritchie, Dennis M. The C Programming Language, Second Edition. Prentice Hall, Englewood Cliffs, New Jersey 07632. Presents a concise exposition of C as defined by the ANSI standard. This book is an excellent reference for C programmers. Kochan, Steven G. Programming In ANSI C, Revised Edition. Hayden Books, Indianapolis, Indiana 46268. Another excellent reference for learning ANSI C, used in colleges and universites. Harbison, Samuel P., and Steele, Guy L., C A Reference Manual, Fourth Edition, Prentice-Hall, Englewood Cliffs, New Jersey 07632. A best selling authoritative reference for the C programming language. Van Sickle, Ted. Programming Microcontrollers in C, First Edition. LLH Technology Publishing, Eagle Rock, Virginia 24085. Although this book focuses on Motorola microcontrollers, the basic principles of programming with C for microcontrollers is useful.
Part 3
Appendicies
DS51217B-page 185
DS51217B-page 186
Highlights
This glossary contains terms and definitions for the following tools: MPLAB IDE, MPLAB-SIM, MPLAB Editor MPASM, MPLINK, MPLIB MPLAB-CXX MPLAB-ICE, PICMASTER Emulators MPLAB-ICD PICSTART Plus, PRO MATE programmer
Terms
Absolute Section A section with a fixed (absolute) address which can not be changed by the linker. Access RAM (PIC18CXXX Devices Only) Special general purpose registers on PIC18CXXX devices that allow access regardless of the setting of the bank select bit (BSR). Alpha Character Alpha characters are those characters, regardless of case, that are letters of the alphabet: (a, b, , z, A, B, , Z). Alphanumeric Alphanumeric characters include alpha characters and numbers: (0,1, , 9). Application A set of software and hardware developed by the user, usually designed to be a product controlled by a PICmicro microcontroller. Assemble What an assembler does. See assembler. Assembler A language tool that translates a users assembly source code (.asm) into machine code. MPASM is Microchips assembler.
DS51217B-page 187
DS51217B-page 188
Glossary
Configuration Bits Unique bits programmed to set PICmicro microcontroller modes of operation. A configuration bit may or may not be preprogrammed. These bits are set in the Options > Development Mode dialog for simulators or emulators and in the _ _ CONFIG MPASM directive for programmers. Control Directives Control directives in MPASM permit sections of conditionally assembled code. Data Directives Data directives are those that control MPASMs allocation of memory and provide a way to refer to data items symbolically; that is, by meaningful names. Data Memory General purpose file registers (GPRs) from RAM on the PICmicro device being emulated. The File Register window displays data memory. Directives Directives provide control of the assemblers operation by telling MPASM how to treat mnemonics, define data, and format the listing file. Directives make coding easier and provide custom output according to specific needs. Download Download is the process of sending data from the PC host to another device, such as an emulator, programmer or target board. EEPROM Electrically Erasable Programmable Read Only Memory. A special type of PROM that can be erased electrically. Data is written or erased one byte at a time. EEPROM retains its contents even when power is turned off. Emulation The process of executing software loaded into emulation memory as if the firmware resided on the microcontroller device under development. Emulation Memory Program memory contained within the emulator. Emulator Hardware that performs emulation. Emulator System The MPLAB-ICE emulator system includes the pod, processor module, device adapter, cables, and MPLAB Software. The PICMASTER emulator system includes the pod, device-specific probe, cables, and MPLAB Software. Event A description of a bus cycle which may include address, data, pass count, external input, cycle type (fetch, R/W), and time stamp. Events are used to describe triggers and break points.
DS51217B-page 189
Extended Microcontroller Mode (PIC17CXXX and PIC18CXXX Devices Only) In extended microcontroller mode, on-chip program memory as well as external memory is available. Execution automatically switches to external if the program memory address is greater than the internal memory space of the PIC17CXXX or PIC18CXXX device. External Input Line (MPLAB-ICE only) An external input signal logic probe line (TRIGIN) for setting an event based upon external signals. External Linkage A function or variable has external linkage if it can be accessed from outside the module in which it is defined. External RAM (PIC17CXXX and PIC18CXXX Devices Only) Off-chip Read/Write memory. External Symbol A symbol for an identifier which has external linkage. External Symbol Definition A symbol for a function or variable defined in the current module. External Symbol Reference A symbol which references a function or variable defined outside the current module. External Symbol Resolution A process performed by the linker in which external symbol definitions from all input modules are collected in an attempt to update all external symbol references. Any external symbol references which do not have a corresponding definition cause a linker error to be reported.
DS51217B-page 190
Glossary
File Registers On-chip general purpose and special function registers. Flash A type of EEPROM where data is written or erased in blocks instead of bytes. FNOP Forced No Operation. A forced NOP cycle is the second cycle of a two-cycle instruction. Since the PICmicro architecture is pipelined, it prefetches the next instruction in the physical address space while it is executing the current instruction. However, if the current instruction changes the program counter, this prefetched instruction is explicitly ignored, causing a forced NOP cycle. GPR See Data Memory. Halt A function that stops the emulator. Executing Halt is the same as stopping at a break point. The program counter stops, and the user can inspect and change register values, and single step through code. Hex Code Executable instructions assembled or compiled from source code into standard hexadecimal format code. Also called executable or machine code. Hex code is contained in a hex file. Hex File An ASCII file containing hexadecimal addresses and values (hex code) suitable for programming a device. This format is readable by a device programmer. High Level Language A language for writing programs that is of a higher level of abstraction from the processor than assembler code. High level languages (such as C) employ a compiler to translate statements into machine instructions that the target processor can execute. ICD In-Circuit Debugger. MPLAB-ICD is Microchips in-circuit debugger for PIC16F87X devices. MPLAB-ICD works with MPLAB IDE. ICE In-Circuit Emulator. MPLAB-ICE is Microchips in-circuit emulator that works with MPLAB IDE. IDE Integrated Development Environment. An application that has multiple functions for firmware development. The MPLAB IDE integrates a compiler, an assembler, a project manager, an editor, a debugger, a simulator, and an
DS51217B-page 191
DS51217B-page 192
Glossary
Local Label A local label is one that is defined inside a macro with the LOCAL directive. These labels are particular to a given instance of a macros instantiation. In other words, the symbols and labels that are declared as local are no longer accessible after the ENDM macro is encountered. Logic Probes Up to 14 logic probes connected to the emulator. The logic probes provide external trace inputs, trigger output signal, +5V, and a common ground. Machine Code Either object or executable code. Macro A collection of assembler instructions that are included in the assembly code when the macro name is encountered in the source code. Macros must be defined before they are used; forward references to macros are not allowed. All statements following a MACRO directive and prior to an ENDM directive are part of the macro definition. Labels used within the macro must be local to the macro so the macro can be called repetitively. Macro Directives Directives that control the execution and data allocation within macro body definitions. Make Project A command that rebuilds an application, re-compiling only those source files that have changed since the last complete compilation. MCU Microcontroller Unit. An abbreviation for microcontroller. Also C. Memory Models Versions of libraries and/or precompiled object files based on a devices memory (RAM/ROM) size and structure. Microcontroller A highly integrated chip that contains all the components comprising a controller. Typically this includes a CPU, RAM, some form of ROM, I/O ports, and timers. Unlike a general-purpose computer, which also includes all of these components, a microcontroller is designed for a very specific task to control a particular system. As a result, the parts can be simplified and reduced, which cuts down on production costs. Microcontroller Mode (PIC17CXXX and PIC18CXXX Devices Only) One of the possible program memory configurations of the PIC17CXXX and PIC18CXXX families of microcontrollers. In microcontroller mode, only internal execution is allowed. Thus, only the on-chip program memory is available in microcontroller mode.
DS51217B-page 193
DS51217B-page 194
Glossary
MPLINK MPLINK is a linker for the Microchip relocatable assembler, MPASM, and the Microchip C compilers, MPLAB-C17 or MPLAB-C18. MPLINK also may be used with the Microchip librarian, MPLIB. MPLINK is designed to be used with MPLAB IDE, though it does not have to be. MPLINK will combine object files and libraries to create a single executable file. MPSIM The DOS version of Microchips simulator. MPLAB-SIM is the newest simulator from Microchip. MRU Most Recently Used. Refers to files and windows available to be selected from MPLAB IDE main pull down menus. Nesting Depth The maximum level to which macros can include other macros. Macros can be nested to 16 levels deep. Non Real-Time Refers to the processor at a break point or executing single step instructions or MPLAB IDE being run in simulator mode. Node MPLAB IDE project component. NOP No Operation. An instruction that has no effect when executed except to advance the program counter. Object Code The intermediate code that is produced from the source code after it is processed by an assembler or compiler. Relocatable code is code produced by MPASM or MPLAB-C17/C18 that can be run through MPLINK to create executable code. Object code is contained in an object file. Object File A module which may contain relocatable code or data and references to external code or data. Typically, multiple object modules are linked to form a single executable output. Special directives are required in the source code when generating an object file. The object file contains object code. Object File Directives Directives that are used only when creating an object file.
DS51217B-page 195
DS51217B-page 196
Glossary
Power-on-Reset Emulation A software randomization process that writes random values in data RAM areas to simulate uninitialized values in RAM upon initial power application. Precedence The concept that some elements of an expression are evaluated before others; i.e., * and / before + and -. In MPASM, operators of the same precedence are evaluated from left to right. Use parentheses to alter the order of evaluation. Program Counter A register that specifies the current execution address. Program Memory The memory area in a PICmicro microcontroller where instructions are stored. Memory in the emulator or simulator containing the downloaded target application firmware. Programmer A device used to program electrically programmable semiconductor devices such as microcontrollers. Project A set of source files and instructions to build the object and executable code for an application. PRO MATE A device programmer from Microchip. Programs all PICmicro microcontrollers and most memory and Keeloq devices. Can be used with MPLAB IDE or stand-alone. Prototype System A term referring to a users target application, or target board. PWM Signals Pulse Width Modulation Signals. Certain PICmicro devices have a PWM peripheral. Qualifier An address or an address range used by the Pass Counter or as an event before another operation in a complex trigger. Radix The number base, hex, or decimal, used in specifying an address and for entering data in the Window > Modify command. RAM Random Access Memory (Data Memory). Raw Data The binary representation of code or data associated with a section.
DS51217B-page 197
DS51217B-page 198
Glossary
Single Step This command steps though code, one instruction at a time. After each instruction, MPLAB IDE updates register windows, watch variables, and status displays so you can analyze and debug instruction execution. You can also single step C compiler source code, but instead of executing single instructions, MPLAB IDE will execute all assembly level instructions generated by the line of the high level C statement. Skew The information associated with the execution of an instruction appears on the processor bus at different times. For example, the executed opcode appears on the bus as a fetch during the execution of the previous instruction, the source data address and value and the destination data address appear when the opcode is actually executed, and the destination data value appears when the next instruction is executed. The trace buffer captures the information that is on the bus at one instance. Therefore, one trace buffer entry will contain execution information for three instructions. The number of captured cycles from one piece of information to another for a single instruction execution is referred to as the skew. Skid When a hardware break point is used to halt the processor, one or more additional instructions may be executed before the processor halts. The number of extra instructions executed after the intended break point is referred to as the skid. Source Code - Assembly Source code consists of PICmicro instructions and MPASM directives and macros that will be translated into machine code by an assembler. Source Code - C A program written in the high level language called C which will be converted into PICmicro machine code by a compiler. Machine code is suitable for use by a PICmicro MCU or Microchip development system product like MPLAB IDE. Source File - Assembly The ASCII text file of PICmicro instructions and MPASM directives and macros (source code) that will be translated into machine code by an assembler. It is an ASCII file that can be created using any ASCII text editor. Source File - C The ASCII text file containing C source code that will be translated into machine code by a compiler. It is an ASCII file that can be created using any ASCII text editor. Special Function Registers Registers that control I/O processor functions, I/O status, timers, or other modes or peripherals.
DS51217B-page 199
DS51217B-page 200
Glossary
System Button The system button is another name for the system window control. Clicking on the system button pops up the system menu. System Window Control The system window control is located in the upper left corner of windows and some dialogs. Clicking on this control usually pops up a menu that has the items Minimize, Maximize, and Close. In some MPLAB IDE windows, additional modes or functions can be found. system window control
Figure G1: System Window Control Menu - Watch Window Target Refers to user hardware. Target Application Firmware residing on the target board. Target Board The circuitry and programmable device that makes up the target application. Target Processor The microcontroller device on the target application board that is being emulated. Template Lines of text that you build for inserting into your files at a later time. The MPLAB Editor stores templates in template files. Tool Bar A row or column of icons that you can click on to execute MPLAB IDE functions.
DS51217B-page 201
DS51217B-page 202
A
Absolute Section ........................................... 187 Access RAM ................................................. 187 Add Project Files ...................................... 44, 58 Address Spaces, ROM and RAM ................. 114 ALUSTA ........................................................ 131 AND (&&) ...................................................... 100 AND, Bitwise (&) ........................................... 101 ANSI Compatibility .................................. 14, 145 Arithmetic Operators ....................................... 99 Arrays ........................................................... 112 ANSI C ................................................... 148 Initialization ............................................ 113 ASCII ............................................................ 155 asm ( _asm ) ........................................... 73, 126 Assembler ..................................................... 187 Assembler, Internal ....................................... 126 Assembly Language, Mixing with C .............. 140 Assigned Section .......................................... 188 Assignment Operators .................................. 101 auto ................................................................. 88 AUTOEXEC.BAT ............................................ 18
B
Banked/Paged Data ............................... 88, 126 Basic Data Types ........................................... 88 bin directory ........................................ 18, 27, 33 Binary ............................................................. 86 Bit-Fields ....................................................... 122 ANSI C ................................................... 149 Bitwise Operators ......................................... 101 Block Comment .............................................. 85 break ............................................................. 110 Break Point, Hardware ................................. 188 Break Point, Software ................................... 188 BSR .............................................................. 131
DS51217B-page 203
E
Edit Project ................................................43, 57 EEPROM .......................................................189 else ................................................................107 Emulator ........................................................189 endasm ( _endasm ) ...............................73, 126 Enumerations ..................................................93 ANSI C ....................................................149 Environment Variable See MCC_INCLUDE equal to (==) ..................................................100 Error File .............................................21, 28, 33 Escape Sequences .........................................86 Example Code ...............................................151 examples directory ..........................................18 Executable Directory .......................................18, 27, 33 Files ............................15, 25, 29, 34, 37, 39 Executable Code ...........................................190 Export ............................................................190 Expressions ...................................................190 Extended Microcontroller Mode ....................190 extern ..............................................................88 External Declaration ..............123, 124, 127, 135 External RAM ................................................190
F
far ........................73, 88, 90, 118, 126, 128, 135 File Listing .....................................................192 float ...........................................................88, 90 Floating Point ANSI C ....................................................147 for ..................................................................107 FSR0, PIC17CXXX Hardware .......................133 FSR1, PIC17CXXX Hardware .......................133 FSR1, PIC18CXXX Software ........................136 FSR2, PIC18CXXX Software ........................136 Functions .........................................................96 Declaration ...............................................96 Funky ........................................................96 Passing Arguments ..................................97
D
Data Memory ................................................ 189 Data Types ..................................................... 89 Decrement Operators ................................... 102 default ........................................................... 109 Development Mode ................................... 41, 55 Directives ...................................................... 189 Control .................................................... 189 Data ........................................................ 189
DS51217B-page 204
Index
Prototyping ............................................... 96 Recursive ................................................. 97 Returning Values ..................................... 98 int ....................................................... 88, 89 Internet Address ............................................... 6 Interrupts Handler Code ......................... 25, 28, 39, 47 Nested .................................................... 131 Saving FSR ............................................ 133 Support - MPLAB-C18 ................... 125, 138 Support Macros - MPLAB-C17 ............... 131
G
global .............................................................. 90 Global variables .............................................. 91 Glossary ....................................................... 187 Going Forward .......................................... 36, 68 goto .............................................................. 111
L
Left Shift (<<) ................................................ 101 lib directory ....................... 18, 27, 33, 47, 61, 62 Librarian ........................................................ 192 Librarian See MPLIB Libraries .......................................................... 13 Library ........................................................... 192 Directory ..................... 18, 27, 33, 47, 61, 62 Files .................................................... 25, 39 Linker ............................................................ 192 Directory ....................................... 18, 27, 33 Script ...................................... 25, 39, 49, 63 Linker Script Files ......................................... 192 Linker See MPLINK list ................................................................... 82 Listing File ........................................ 25, 39, 192 lkr directory ......................................... 18, 27, 33 local ................................................................ 90 Local Label ................................................... 193 Local Variables ............................................... 91 Logic Probes ................................................. 193 Logical Operators ......................................... 100 long ........................................................... 88, 89
H
h directory ............................... 18, 27, 33, 43, 57 Header Directory ...................................... 18, 27, 33 File ..................................................... 28, 33 Header Directory ...................................... 43, 57 Hex Code ..................................................... 191 Hex File ............................ 25, 29, 34, 39, 43, 57 Hexadecimal ................................................... 86
I
ICD ............................................................... 191 ICE ............................................................... 191 IDE ............................................................... 191 Identifiers ANSI C ................................................... 145 if ............................................................ 106, 107 Import ........................................................... 192 Include Current Search Path .................... 43, 57, 79 Directory .................................................. 27 Increment Operators .................................... 102 Initialization Arrays .................................................... 113 Data ....................... 25, 28, 39, 47, 130, 137 Stack .............................................. 130, 137 Initialized Data .............................................. 192 Install _TMR0 ............................................... 132 Install Language Tool ............................... 51, 65 Install_INT .................................................... 127 Install_PIV .................................................... 127 Install_T0CKI ................................................ 127 Install_TMR0 ................................................ 127 Installation Proceedure .............................................. 16 Requirements .......................................... 15 Instruction Sets ..................................... 157, 163 Integers ANSI C ................................................... 146
M
main( ), branching to ............................. 130, 137 Make Project ............................................. 51, 65 Map File ........................................ 25, 29, 34, 39 MCC_INCLUDE ............................ 18, 27, 33, 79 mcc17 ................................................. 15, 26, 37 mcc17d ..................................................... 15, 37 mcc18 ....................................................... 15, 37 MCU ............................................................. 193 Memory Calibration .............................................. 188 Data ........................................................ 189 Models ........................................ 47, 61, 123 Program ................................................. 197 Requirements ........................................... 15 Trace ...................................................... 202 Memory Models ............................................ 193
DS51217B-page 205
P
Paged/Banked Data ................................88, 126 Pass Counter ................................................196 Passing Arguments to Functions ....................97 Passing Pointers to Functions .......................117 Passing Variables ...........................................97 PCLATH ........................................................131 PIC17CXXX Instruction Set ..........................157 PIC18CXXX Instruction Set ..........................163 PICMASTER .................................................196 PICmicro .......................................................199 PICSTART ......................................................14 PICSTART Plus ............................................196 Pointers .........................................................115 ANSI C ....................................................148 Arithmetic ................................................117 Post-decrement (c - -) ...................................102 Post-increment (c++) .....................................102 Precedence ...................................................197 Precedence of Operators ..............................105 Precompiled Object Files ..........................47, 61 Pre-decrement (- - c) .....................................102 Pre-increment (++c) ......................................102 Preprocessor Directives ..................................76 ANSI C ....................................................149 PRO MATE .............................................14, 197 Processor Header File ....................................72 PRODH .................................................132, 133 PRODL ..................................................132, 133 Program Control Statements .........................106 Program Counter ...........................................197 Program Memory ..........................................197 Programmer ..................................................197 Project ...........................................................197 Project Nodes ............................................44, 58 Project Window .........................................53, 67 Project, MPLAB ...............................................37 Prototyping, Functions ....................................96
N
near ............................. 73, 89, 90, 118, 126, 135 Nesting Interrupts ................................................ 131 Structures ............................................... 121 New Project .............................................. 42, 56 Node Properties ........................................44, 58 Nop( ) ............................................................ 124 NOT (!) .......................................................... 100 not equal to (!=) ............................................. 100
O
Object Code .................................................. 195 Object Files ..................................................... 21 Object Files, Precompiled ............. 25, 39, 47, 61 Octal ............................................................... 86 Off-Chip Memory .......................................... 196 Ones complement (~) .................................. 101 Opcodes ....................................................... 196 Operators ................................................ 99, 196 Arithmetic ................................................. 99 Assignment ............................................. 101 Bitwise .................................................... 101 Conditional ............................................. 103 Decrement .............................................. 102 Increment ............................................... 102 Precedence ............................................ 105 Relational ............................................... 100 Smooth ..................................................... 99 Optimization Tips .................................. 134, 138 OR (||) ........................................................... 100 OR, Bitwise (|) ............................................... 101
Q
Qualifier .........................................................197
R
Radix .............................................................197 RAM Address Spaces .....................................114 Pointers ..................................114, 116, 117 ram ...................................73, 113, 126, 135 README File ..............................................4, 14
DS51217B-page 206
Index
Real-Time ..................................................... 198 Recursive Functions ....................................... 97 References ....................................................... 4 register ........................................................... 89 Register Definitions ...................... 25, 28, 39, 47 Register Definitions File ............... 124, 127, 135 Registers ANSI C ................................................... 148 Relational Operators .................................... 100 Relocatable Section ..................................... 198 Reset( ) ......................................................... 124 return .............................................................. 98 Returning Values from Functions ................... 98 Right Shift (>>) ............................................. 101 Rlcf( ) ............................................................ 124 Rlncf( ) .......................................................... 124 ROM Address Spaces ..................................... 114 Pointers .................................. 114, 116, 117 rom ................................... 73, 113, 126, 135 String ..................................................... 115 Rrcf( ) ........................................................... 124 Size ................................................ 128, 135 Start Up Code ....... 25, 28, 39, 47, 125, 129, 136 STARTUP( ) ( _ _STARTUP( ) ) ................... 129 static ............................................................... 89 Static Strings ................................................ 114 Stimulus ........................................................ 200 Stopwatch ..................................................... 200 Storage Class extern ....................................................... 92 static ......................................................... 92 volatile ...................................................... 93 Strings .......................................................... 113 struct ............................................................. 119 Structures ..................................................... 119 ANSI C ................................................... 148 Nested .................................................... 121 Swapf( ) ........................................................ 124 switch ............................................................ 109 switch, ANSI C .............................................. 149 Symbol .......................................................... 200 System Button .............................................. 201 System Requirements, Host Computer .......... 15 System Window Control ............................... 201
S
Section ......................................................... 198 Absolute ................................................. 187 Assigned ................................................ 188 Relocatable ............................................ 198 Shared ................................................... 198 Unassigned ............................................ 202 SFRs ............................................ 124, 127, 135 Shared Section ............................................. 198 short ............................................................... 89 signed ............................................................. 89 Simulator ...................................................... 198 Simulator See MPLAB-SIM Single Step ................................................... 199 Skew ............................................................. 199 Skid .............................................................. 199 Sleep( ) ......................................................... 124 Source Code ...................................... 21, 25, 39 Directory .................................................. 18 Source Code, Assembly ............................... 199 Source Code, C ............................................ 199 Special Function Registers ........... 124, 127, 135 src directory .................................................... 18 Stack, Hardware ........................................... 200 Stack, Software .................... 125, 128, 135, 200 Initialization .................................... 130, 137
T
Target ........................................................... 201 TBLPTR ........................................................ 134 Trace ............................................................ 202 Trace Memory .............................................. 202 Troubleshooting .................................... 5, 51, 65 Tutorial, Using MPLAB-C17 with MPLAB ....... 40 Tutorial, Using MPLAB-C18 with MPLAB ....... 54 typedef ............................................................ 95
U
Unassigned Section ...................................... 202 Uninitialized Data .......................................... 202 Unions .......................................................... 120 ANSI C ................................................... 148 unsigned ......................................................... 89 Updates ............................................................ 3 USE_INITDATA ............................................ 130 USE_STARTUP ........................................... 129
V
Variables ......................................................... 88 Variables, Declaration .................................... 90 void ........................................................... 88, 89 volatile .................................................. 127, 128
DS51217B-page 207
X
XOR, Bitwise (^) ............................................ 101
DS51217B-page 208
Index
NOTES:
DS51217B-page 209
M
WORLDWIDE SALES AND SERVICE
AMERICAS
Corporate Office
2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel: 480-792-7200 Fax: 480-792-7277 Technical Support: 480-792-7627 Web Address: http://www.microchip.com
ASIA/PACIFIC
Australia
Microchip Technology Australia Pty Ltd Suite 22, 41 Rawson Street Epping 2121, NSW Australia Tel: 61-2-9868-6733 Fax: 61-2-9868-6755
Japan
Microchip Technology Japan K.K. Benex S-1 6F 3-18-20, Shinyokohama Kohoku-Ku, Yokohama-shi Kanagawa, 222-0033, Japan Tel: 81-45-471- 6166 Fax: 81-45-471-6122
Rocky Mountain
2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel: 480-792-7966 Fax: 480-792-7456
China - Beijing
Microchip Technology Consulting (Shanghai) Co., Ltd., Beijing Liaison Office Unit 915 Bei Hai Wan Tai Bldg. No. 6 Chaoyangmen Beidajie Beijing, 100027, No. China Tel: 86-10-85282100 Fax: 86-10-85282104
Korea
Microchip Technology Korea 168-1, Youngbo Bldg. 3 Floor Samsung-Dong, Kangnam-Ku Seoul, Korea 135-882 Tel: 82-2-554-7200 Fax: 82-2-558-5934
Atlanta
500 Sugar Mill Road, Suite 200B Atlanta, GA 30350 Tel: 770-640-0034 Fax: 770-640-0307
Singapore
Microchip Technology Singapore Pte Ltd. 200 Middle Road #07-02 Prime Centre Singapore, 188980 Tel: 65-6334-8870 Fax: 65-6334-8850
Boston
2 Lan Drive, Suite 120 Westford, MA 01886 Tel: 978-692-3848 Fax: 978-692-3821
China - Chengdu
Microchip Technology Consulting (Shanghai) Co., Ltd., Chengdu Liaison Office Rm. 2401, 24th Floor, Ming Xing Financial Tower No. 88 TIDU Street Chengdu 610016, China Tel: 86-28-6766200 Fax: 86-28-6766599
Taiwan
Microchip Technology Taiwan 11F-3, No. 207 Tung Hua North Road Taipei, 105, Taiwan Tel: 886-2-2717-7175 Fax: 886-2-2545-0139
Chicago
333 Pierce Road, Suite 180 Itasca, IL 60143 Tel: 630-285-0071 Fax: 630-285-0075
Dallas
4570 Westgrove Drive, Suite 160 Addison, TX 75001 Tel: 972-818-7423 Fax: 972-818-2924
China - Fuzhou
Microchip Technology Consulting (Shanghai) Co., Ltd., Fuzhou Liaison Office Unit 28F, World Trade Plaza No. 71 Wusi Road Fuzhou 350001, China Tel: 86-591-7503506 Fax: 86-591-7503521
EUROPE
Denmark
Microchip Technology Nordic ApS Regus Business Centre Lautrup hoj 1-3 Ballerup DK-2750 Denmark Tel: 45 4420 9895 Fax: 45 4420 9910
Detroit
Tri-Atria Office Building 32255 Northwestern Highway, Suite 190 Farmington Hills, MI 48334 Tel: 248-538-2250 Fax: 248-538-2260
China - Shanghai
Microchip Technology Consulting (Shanghai) Co., Ltd. Room 701, Bldg. B Far East International Plaza No. 317 Xian Xia Road Shanghai, 200051 Tel: 86-21-6275-5700 Fax: 86-21-6275-5060
Kokomo
2767 S. Albright Road Kokomo, Indiana 46902 Tel: 765-864-8360 Fax: 765-864-8387
France
Microchip Technology SARL Parc dActivite du Moulin de Massy 43 Rue du Saule Trapu Batiment A - ler Etage 91300 Massy, France Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79
Los Angeles
18201 Von Karman, Suite 1090 Irvine, CA 92612 Tel: 949-263-1888 Fax: 949-263-1338
China - Shenzhen
Microchip Technology Consulting (Shanghai) Co., Ltd., Shenzhen Liaison Office Rm. 1315, 13/F, Shenzhen Kerry Centre, Renminnan Lu Shenzhen 518001, China Tel: 86-755-2350361 Fax: 86-755-2366086
New York
150 Motor Parkway, Suite 202 Hauppauge, NY 11788 Tel: 631-273-5305 Fax: 631-273-5335
Germany
Microchip Technology GmbH Gustav-Heinemann Ring 125 D-81739 Munich, Germany Tel: 49-89-627-144 0 Fax: 49-89-627-144-44
San Jose
Microchip Technology Inc. 2107 North First Street, Suite 590 San Jose, CA 95131 Tel: 408-436-7950 Fax: 408-436-7955
Hong Kong
Microchip Technology Hongkong Ltd. Unit 901-6, Tower 2, Metroplaza 223 Hing Fong Road Kwai Fong, N.T., Hong Kong Tel: 852-2401-1200 Fax: 852-2401-3431
Italy
Microchip Technology SRL Centro Direzionale Colleoni Palazzo Taurus 1 V. Le Colleoni 1 20041 Agrate Brianza Milan, Italy Tel: 39-039-65791-1 Fax: 39-039-6899883
Toronto
6285 Northam Drive, Suite 108 Mississauga, Ontario L4V 1X5, Canada Tel: 905-673-0699 Fax: 905-673-6509
India
Microchip Technology Inc. India Liaison Office Divyasree Chambers 1 Floor, Wing A (A3/A4) No. 11, OShaugnessey Road Bangalore, 560 025, India Tel: 91-80-2290061 Fax: 91-80-2290062
United Kingdom
Arizona Microchip Technology Ltd. 505 Eskdale Road Winnersh Triangle Wokingham Berkshire, England RG41 5TU Tel: 44 118 921 5869 Fax: 44-118 921-5820
03/01/02