Mplab Xc8 Getting Started Guide Mplab XC8 Getting Started Guide
Mplab Xc8 Getting Started Guide Mplab XC8 Getting Started Guide
Mplab Xc8 Getting Started Guide Mplab XC8 Getting Started Guide
This document provides a starting point for programmers who are just starting out with the MPLAB XC8 C Compiler, particularly those who are unfamiliar with embedded programming or Microchip devices. The following headings are linked to sections in this guide: Creation of a Project in MPLAB X IDE Foundation Code Compilation Specifying Device Configuration Bits Accessing Device Registers Disabling Peripherals that Share Port Pins Downloading and Running Your Code Implementing a Main Loop Using Interrupts Conclusion While the MPLAB XC8 C Compiler can target hundreds of 8-bit PIC devices, this guide uses the PIC18F87J11 microcontroller (MCU) with a PICDEM PIC18 Explorer Board. However, the information presented in this document can be used in conjunction with the XC8 C Compiler to create and compile equivalent code for almost any 8-bit MCU and hardware. This guide describes using the compiler from the MPLAB X Integrated Development Environment (IDE); however, you can use it from the command-line, as well. If you have a development board, you can download and run code on your device. You can also use the simulator in MPLAB X IDE to confirm the operation of your code. To demonstrate getting started with the MPLAB XC8 C Compiler, you will be guided through the creation of a project that you can build and run. The project flashes an LED that is connected to a port pin. To accomplish this, the following actions, presented here in summary, are performed. They are expanded and described in more detail as you progress through the pages of this guide. Include <xc.h> in your source file(s). Set the device Configuration bits using the config pragma. Disable any peripheral that uses the pin(s) used by the port. Initialize the ports data direction register, and write values to the port latch. Use a delay to ensure you can see the changes in state.
The guide assumes that you have MPLAB X IDE and MPLAB XC8 C compiler installed and activated (if applicable) before you commence. You could also use an evaluation version of the compiler, or the compiler operating in Free mode. For assistance installing or activating the compiler, refer to Installing and Licensing MPLAB XC C Compilers (DS50002059). The document can be downloaded from the Microchip Technology web site, wwww.microchip.com.
DS50002173A-page 1
DS50002173A-page 2
DS50002173A-page 3
DS50002173A-page 4
Step 4 selects the tool to run the project code. If you have a debugger and wish to use it with your hardware, select it from the list; otherwise, select Simulator. Figure 1-4 shows MPLAB REAL ICE selected as the programmer/debugger to run the generated code. FIGURE 1-4: TOOL SELECTION DIALOG
DS50002173A-page 5
Step 6 selects the tool to compile the source code. As shown in the Select Compiler window in Figure 1-6, several versions of the MPLAB XC8 compiler might be listed under the XC8 disclosure widget. Select the most recent version. You will be able to change this selection during development. FIGURE 1-6: COMPILER SELECTION DIALOG
DS50002173A-page 6
DS50002173A-page 7
1. You may need to select Windows>Projects if this pane is not visible by default.
DS50002173A-page 8
DS50002173A-page 9
This will open the New C Source File window, as shown in Figure 1-10. FIGURE 1-10: NEW C SOURCE FILE WINDOW
DS50002173A-page 10
This initial code can be used to start every project built with MPLAB XC8. C. Every C program must have one, and only one, function called main(); however, the exact prototype for this function can vary from compiler to compiler. For all MPLAB XC compilers, you may use the prototype shown above. Since main() returns an int, there must be a return statement with a return value specified. The value 0 indicates that main() returned successfully. The inclusion of the header file, <xc.h>, allows code in this source file to access compiler- or device-specific features. Since such access is commonplace, you will need to include it into virtually all of your source files. Step 4 saves your work. Select File>Save to ensure that your work is saved. If you are not using MPLAB X IDE, you may enter the above program into a file using any editor, as long as it is saved as plain text and the file uses the .c extension.
DS50002173A-page 11
Project properties
There are several ways to execute the compiler. There are buttons on the toolbar to enable quick access to the different build operations, but you can also access these from the Run and Debug menus. Some operations only build your code; others build and then execute your code. Both the build and run steps can be made in either a release or debug mode. Debug mode operations enable the debug executive on your device. This allows access to debugging features like breakpoints. For the debug executive to be active, it must utilize some of the devices memory that normally would be available for your code. Debug builds ensure that this memory is reserved for the debug executive. Release mode operations do not allow any debug features to be used, but all the device memory is available for your project. This is the build mode you would use to produce a production image suitable for products you intend to release.
DS50002173A-page 12
Build project Build & Run project Clean & Build project Build & Debug project
From left to right, the identified buttons perform the following functions: Build (release) any project source files modified since the last build, then link Build (release) all project source files, then link Build (release) any project source files modified since the last build, link, then download and run your code Build (debug) any project source files modified since the last build, link, then download and run your code with the debug executive enabled For the purposes of this demonstration, click Build, or Clean and Build.
DS50002173A-page 13
Note that there are several warnings relating to missing configuration settings1, but these have not stopped the compilation process and the BUILD SUCCESSFUL message at the lower part of the window indicates that the code was built. The red error, at the bottom of the Output window, indicates a mismatch in the code compiled and the target device. The next section explains how to configure the device, which will resolve these warnings and the error. If you are building from a terminal, use the following command line.
xc8 --chip=18f87j11 main.c
Adjust the device and source file name, as appropriate. If the compiler is not in the search path, you should use its full path, in addition to the application name, xc8.
1. If you are compiling for a device other than the PIC18F87J11, you may see more or fewer of these warnings
DS50002173A-page 14
DS50002173A-page 15
The Name and Field columns will help you to find the equivalent settings in the device data sheet. The Category column describes what the setting controls. The Setting column shows the current state of that setting. Step 2 reviews every setting. Pay particular note to the following settings, which will almost certainly cause runtime failure if not they are not specified correctly: Oscillator section This must match that of your hardwares oscillator circuitry. If this is not correct, the device clock may not run. If you are using the simulator as a debug tool, this setting can be ignored. Typically, development boards use high-speed crystal oscillators. Watchdog timer It is recommended that you disable this timer, until it is required. This prevents unexpected Resets. Code protection Turn off code protection, until it is required. This ensures that the device is fully accessible. Extended instruction set This PIC18 setting must be disabled. The MPLAB XC8 C Compiler does not support this instruction set. Change the settings by clicking on the relevant line in the Settings column and choosing from the appropriate setting in the pull-down list. Step 3 generates the pragmas that can implement the settings you have chosen. Click the Generate Source Code to Output button. The generated code will appear in the Config Bits Source window, as shown in Figure 1-15.
DS50002173A-page 16
Step 4 copies the code from this window to a source file of your choosing. It is not executable code and should be placed outside of function definitions. The code has been copied to the main.c file (comments omitted for clarity), as shown below1.
#include <xc.h> // CONFIG1 #pragma config #pragma config #pragma config #pragma config // CONFIG2 #pragma config #pragma config #pragma config #pragma config // CONFIG3 #pragma config #pragma config #pragma config #pragma config #pragma config #pragma config #pragma config #pragma config int main(void) { return 0; }
EASHFT = ON MODE = XM16 BW = 16 WAIT = OFF CCP2MX = DEFAULT ECCPMX = DEFAULT PMPMX = DEFAULT MSSPMSK = MSK7
1. This code is specific to a PIC18F87J11 device and the PICDEM PIC18 Explorer board. You must use configuration settings that are specific to your device and hardware.
DS50002173A-page 17
DS50002173A-page 18
In this code, special identifiers are used to represent the SFRs. These identifiers are associated with variables that are defined by the inclusion of <xc.h>. They can be used like any other C variable, but they are each assigned an address that maps them over the register they represent. Note that writing to these variables writes to the register, and consequently could change the state of the device. Simply the act of reading these variables could, on occasion, affect the device. The identifiers mentioned above are the same as the names of the registers they represent, as specified by the device data sheet. However, that may not always be the case, particularly with the identifiers that represent bits within SFRs. To learn which names to use when accessing SFRs on the device, follow these steps to find the register names used for any device. Step 1 creates a source file that includes <xc.h>. Step 2 verifies appropriateness of the device, builds the code, and checks for errors. Step 3 looks into the preprocessed file that was produced by the compiler in step 2.
1. Some devices do not have a latch register associated with a port and you will need to write to the port directly, for example the PORTD register. Check your device data sheet.
DS50002173A-page 19
The content of this preprocessed file for the PIC18F87J11 is also shown in Figure 1-17. It appears on the right, opened in the editor. It contains the C definitions for all the variables that represent the SFRs. In Figure 1-17, you can see that the variable TRISD is defined as an unsigned char and is placed at the address 0xF95. If you check the data sheet for the PIC18F87J11, it will confirm that this is, indeed, the address of the TRISD register. Note also that there is an alias for this variable, DDRD. You can also see the bits defined inside this register, so for example, you can use the structure bit-field TRISDbits.TRISD7, or its alias, TRISDbits.RD7, to access the MSb of the port direction register. Use the addresses of registers to find the corresponding names in the file if you cannot find them otherwise. It is important to note that this preprocessed file is an intermediate file, any changes you make to it will be lost the next time you build.
1. The production directory is used to hold intermediate files for a release (production) build; the debug directory holds the same files for a debug build, see Compilation.
DS50002173A-page 20
DS50002173A-page 21
DS50002173A-page 22
For the PICDEM PIC18 Explorer Board used in this guide, LEDs are connected to port D. (Check the users guide for your development board connections, if required.) The pins used by port D are labeled RD0, RD1, RD2, etc. You will notice from the figure that these pin labels also include other references, for example RD0/AD0/PMD0. The table indicates that port D, the external memory bus and the parallel master port all share the same pins. The other pins used by port D (not shown in the Figure 1-18) are also shared with the SPI peripherals. Step 2 focuses on the first alternate peripheral listed in the table. Find the section in the device data sheet that is relevant to that peripheral and look for the SFRs that control the peripheral.
DS50002173A-page 23
Following a similar process for the parallel master port, we see that this port is controlled by the PMPEN bit. It has a POR value of 0, which implies this peripheral is already disabled after POR. Thus, no additional code is required in our program for this peripheral.1 Step 4 repeats this process for any other peripheral listed in the table from step 1. Through repetition of these steps, the test program for the PIC18F87J11 can now be expanded as follows2.
#include <xc.h> // your configuration bit settings go here // configuration code (indicated earlier) omitted for brevity int main(void) { // intialization code for your device replaces the following WDTCONbits.ADSHR = 1; // enable alternate access to MEMCON MEMCONbits.EBDIS = 1; // turn off external memory bus // code to access your port replaces the following TRISD = 0x0; // set all port D bits to be output LATD = 0x55; // write a value to the port latch return 0; }
1. There is no harm in explicitly disabling this peripheral. If your program performs a soft Reset, then the value of this bit may no longer be 0. 2. The ADSHR bit must be set to access the MEMCON register on this device.
DS50002173A-page 24
With your code running, you should see the LEDs illuminate as you have specified in your code, or be able to measure the voltage on the pins assigned to the port you are using. A value of 0x55 assigned to the port will illuminate every second LED connected to the ports pins. However, if you are using the simulator, you should stop execution of your code and confirm the value contained in the port. And, that will only prove that you are correctly writing to the port, not that the port would be connected to the pins on an actual device. Consult the MPLAB X IDE documentation if you wish to explore stepping, breakpoints or other debug features.
DS50002173A-page 25
Build and run this code. If you are using hardware, ensure the LEDs connected to the port count up the binary values from 0 to 0xFF. Note that the port itself was not incremented. Using a port register in such expressions may trigger read-modify-write issues. Always use a variable to hold the value you want the port to assume. Modify this variable as required, then assign the value of this variable to the port or port latch. The delay routine used here (note the leading underscore character) is actually a compiler built-in function, but you can find help for this and compiler library functions in the appendixes of the MPLAB XC8 C Compiler Users Guide. Without the delay, the LEDs would flash so fast that they would appear to be just dimly lit. You may need to adjust the delay length to suit your devices clock frequency.
DS50002173A-page 26
void interrupt myIsr(void) { // only process timer-triggered interrupts if(INTCONbits.TMR0IE && INTCONbits.TMR0IF) { portValue++; INTCONbits.TMR0IF = 0; // clear this interrupt condition } } int main(void) { WDTCONbits.ADSHR = 1; MEMCONbits.EBDIS = 1; TRISD = 0x0; T0CON = 0b10001000; INTCONbits.TMR0IE = 1; ei(); while(1) { LATD = portValue; } return 0; } // // // // enable the timer as 16 bit... internal clock, no prescaler enable interrupts for timer 0 enable all interrupts
After building and running this code, you should see the LEDs toggle as they did in the previous section. To adjust the LEDs rate of change, you can, for example, enable the timers prescaler to slow its clock. Notice that the interrupt specifier was used to turn the function myIsr() into an interrupt function. As this one interrupt function may have to deal with multiple interrupt sources, code was added to ensure that the counter is only incremented if it was the timer that generated the interrupt. It is good practice to place as little code as possible inside the interrupt function. In main(), note that a binary constant (using the 0b prefix) is used so that the bits within T0CON can be seen easily. Remember that if you are using a different device, you need to consult the data sheet for the device to find the register names and bits within those registers that must be set for correct timer operation. The compiler macro, ei(), was used to enable the interrupts, but you can explicitly set the GIE bit in the INTCON register, if you prefer.
DS50002173A-page 27
DS50002173A-page 28
Code protection is constantly evolving. We at Microchip are committed to continuously improving the code protection features of our products. Attempts to break Microchips code protection feature may be a violation of the Digital Millennium Copyright Act. If such acts allow unauthorized access to your software or other copyrighted work, you may have a right to sue for relief under that Act.
Information contained in this publication regarding device applications and the like is provided only for your convenience and may be superseded by updates. It is your responsibility to ensure that your application meets with your specifications. MICROCHIP MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND WHETHER EXPRESS OR IMPLIED, WRITTEN OR ORAL, STATUTORY OR OTHERWISE, RELATED TO THE INFORMATION, INCLUDING BUT NOT LIMITED TO ITS CONDITION, QUALITY, PERFORMANCE, MERCHANTABILITY OR FITNESS FOR PURPOSE. Microchip disclaims all liability arising from this information and its use. Use of Microchip devices in life support and/or safety applications is entirely at the buyers risk, and the buyer agrees to defend, indemnify and hold harmless Microchip from any and all damages, claims, suits, or expenses resulting from such use. No licenses are conveyed, implicitly or otherwise, under any Microchip intellectual property rights.
Trademarks The Microchip name and logo, the Microchip logo, dsPIC, FlashFlex, KEELOQ, KEELOQ logo, MPLAB, PIC, PICmicro, PICSTART, PIC32 logo, rfPIC, SST, SST Logo, SuperFlash and UNI/O are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. FilterLab, Hampshire, HI-TECH C, Linear Active Thermistor, MTP, SEEVAL and The Embedded Control Solutions Company are registered trademarks of Microchip Technology Incorporated in the U.S.A. Silicon Storage Technology is a registered trademark of Microchip Technology Inc. in other countries. Analog-for-the-Digital Age, Application Maestro, BodyCom, chipKIT, chipKIT logo, CodeGuard, dsPICDEM, dsPICDEM.net, dsPICworks, dsSPEAK, ECAN, ECONOMONITOR, FanSense, HI-TIDE, In-Circuit Serial Programming, ICSP, Mindi, MiWi, MPASM, MPF, MPLAB Certified logo, MPLIB, MPLINK, mTouch, Omniscient Code Generation, PICC, PICC-18, PICDEM, PICDEM.net, PICkit, PICtail, REAL ICE, rfLAB, Select Mode, SQI, Serial Quad I/O, Total Endurance, TSHARC, UniWinDriver, WiperLock, ZENA and Z-Scale are trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. SQTP is a service mark of Microchip Technology Incorporated in the U.S.A. GestIC and ULPP are registered trademarks of Microchip Technology Germany II GmbH & Co. KG, a subsidiary of Microchip Technology Inc., in other countries. All other trademarks mentioned herein are property of their respective companies. 2013, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved. Printed on recycled paper. ISBN: 978-1-62077-271-3
== ISO/TS 16949 ==
2013 Microchip Technology Inc.
Microchip received ISO/TS-16949:2009 certification for its worldwide headquarters, design and wafer fabrication facilities in Chandler and Tempe, Arizona; Gresham, Oregon and design centers in California and India. The Companys quality system processes and procedures are for its PIC MCUs and dsPIC DSCs, KEELOQ code hopping devices, Serial EEPROMs, microperipherals, nonvolatile memory and analog products. In addition, Microchips quality system for the design and manufacture of development systems is ISO 9001:2000 certified.
DS50002173A-page 29
ASIA/PACIFIC
Asia Pacific Office Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel: 852-2401-1200 Fax: 852-2401-3431 Australia - Sydney Tel: 61-2-9868-6733 Fax: 61-2-9868-6755 China - Beijing Tel: 86-10-8569-7000 Fax: 86-10-8528-2104 China - Chengdu Tel: 86-28-8665-5511 Fax: 86-28-8665-7889 China - Chongqing Tel: 86-23-8980-9588 Fax: 86-23-8980-9500 China - Hangzhou Tel: 86-571-2819-3187 Fax: 86-571-2819-3189 China - Hong Kong SAR Tel: 852-2943-5100 Fax: 852-2401-3431 China - Nanjing Tel: 86-25-8473-2460 Fax: 86-25-8473-2470 China - Qingdao Tel: 86-532-8502-7355 Fax: 86-532-8502-7205 China - Shanghai Tel: 86-21-5407-5533 Fax: 86-21-5407-5066 China - Shenyang Tel: 86-24-2334-2829 Fax: 86-24-2334-2393 China - Shenzhen Tel: 86-755-8864-2200 Fax: 86-755-8203-1760 China - Wuhan Tel: 86-27-5980-5300 Fax: 86-27-5980-5118 China - Xian Tel: 86-29-8833-7252 Fax: 86-29-8833-7256 China - Xiamen Tel: 86-592-2388138 Fax: 86-592-2388130 China - Zhuhai Tel: 86-756-3210040 Fax: 86-756-3210049
ASIA/PACIFIC
India - Bangalore Tel: 91-80-3090-4444 Fax: 91-80-3090-4123 India - New Delhi Tel: 91-11-4160-8631 Fax: 91-11-4160-8632 India - Pune Tel: 91-20-2566-1512 Fax: 91-20-2566-1513 Japan - Osaka Tel: 81-6-6152-7160 Fax: 81-6-6152-9310 Japan - Tokyo Tel: 81-3-6880- 3770 Fax: 81-3-6880-3771 Korea - Daegu Tel: 82-53-744-4301 Fax: 82-53-744-4302 Korea - Seoul Tel: 82-2-554-7200 Fax: 82-2-558-5932 or 82-2-558-5934 Malaysia - Kuala Lumpur Tel: 60-3-6201-9857 Fax: 60-3-6201-9859 Malaysia - Penang Tel: 60-4-227-8870 Fax: 60-4-227-4068 Philippines - Manila Tel: 63-2-634-9065 Fax: 63-2-634-9069 Singapore Tel: 65-6334-8870 Fax: 65-6334-8850 Taiwan - Hsin Chu Tel: 886-3-5778-366 Fax: 886-3-5770-955 Taiwan - Kaohsiung Tel: 886-7-213-7828 Fax: 886-7-330-9305 Taiwan - Taipei Tel: 886-2-2508-8600 Fax: 886-2-2508-0102 Thailand - Bangkok Tel: 66-2-694-1351 Fax: 66-2-694-1350
EUROPE
Austria - Wels Tel: 43-7242-2244-39 Fax: 43-7242-2244-393 Denmark - Copenhagen Tel: 45-4450-2828 Fax: 45-4485-2829 France - Paris Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79 Germany - Munich Tel: 49-89-627-144-0 Fax: 49-89-627-144-44 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781 Netherlands - Drunen Tel: 31-416-690399 Fax: 31-416-690340 Spain - Madrid Tel: 34-91-708-08-90 Fax: 34-91-708-08-91 UK - Wokingham Tel: 44-118-921-5869 Fax: 44-118-921-5820
11/29/12
DS50002173A-page 30