8

Today I started to use MPLAB X to program my PICs, and found a code template, with multiple files and spots to fill in code. Before I have had a single file with my code in it. In this template, where I am supposed to put my Configuration bits, there is following text:

/* TODO Fill in your config bits here.  Remove #if 0 to embed config words.   */

#if 0

/* General syntax for configuration word 1 - Check your device .h file
for an up to date listing of available macros.*/
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF);

/* If the device has multiple configuration words, the second macro defines
the second configuration word.  Again check your device .h file
for an up to date listing of available macros. */
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_19 & LVP_OFF);

#endif

I dont really understand what the "Remove #if 0 to embed config words." means... This is propably something really simple. I tried googling, and searching the compilers manual, but didnt get any good results. From what I can understand, the code in between #if 0 and #endif never gets compiled. What does this embed mean? Does it have something to do with setting the config-bits in code vs. afterwards?

varesa
  • 639
  • 1
  • 7
  • 26

3 Answers3

17

To expand a bit on #if 0:
It's essentially a hack to allow for multi-line comments. The preprocessor, which runs before the compiler does, will remove everything between #if 0 and the matching #endif.

One reason it's used instead of /* */ style comments is that you can enable the entire block simply by changing it to "#if 1".

exscape
  • 1,172
  • 2
  • 12
  • 20
  • 9
    In particular, `/* */` doesn't nest, so if you surround a large block of code with `/* */` that already has a `/* */` comment inside of it, the whole thing won't comment out correctly. A cleaner approach though, for this library, would have been to use `#if defined EMBED_CONFIG_WORDS` instead of `#if 0` and then (possibly in a separate config-file or something) have a line like `//#define EMBED_CONFIG_WORDS` with a comment saying *"uncomment this line to enable embedding of config-words."* – BlueRaja - Danny Pflughoeft Mar 03 '12 at 16:57
5

From what I can understand, the code in between #if 0 and #endif never gets compiled.

Yes.

What does this embed mean? Does it have something to do with setting the config-bits in code vs. afterwards?

Config bits are a special programmed register in the PIC that determines operation of oscillator, brown-out detection, + other things. From one of the reference manuals: (the __CONFIG macro in C maps to the corresponding directive in assembly)

MPASM’s CONFIG Directive

Microchip’s assembler, MPASM, has a nice feature that allows you to specify, in the source code file, the selected states of the configuration bits for this program. This ensures that when pro- gramming a device for an application the required configuration is also programmed. This mini- mizes the risk of programming the wrong device configuration, and wondering why it no longer works in the application.

Jason S
  • 13,950
  • 3
  • 41
  • 68
3

Your exactly right, the code in between the #if 0/#endif is never compiled. It's another way of commenting out a block of code.

Removing the #if 0/#endif will include the __CONFIG macros which will enable those bits in the PIC's configuration bits.

Jim A
  • 128
  • 3