That article's a little out of date. I'm not sure if MPLABX handles it in quite the same way as MPLAB does, but the MPLAB IDE handles setting the DEBUG config setting automatically for you, so you never specify that in your source code.
MPLAB only lets you select one tool at a time, so when you have the Debugger tool selected it sets DEBUG on, and if you have a Programmer selected it turns it off before it actually programs the device.
Here's how I handle it. Since there's no linker in SF, I have a debugger module and a #option to control it's usage.
The #option MPLAB_ICD defaults to false in mplabicd.bas, and if so it doesn't do anything. Setting the option = true reserves the req'd resources.
Code: Select all
//
//------------------------------------------------------------------------------
// Name : mplabicd.bas
// Author : Jerry Messina
// Date : 10/4/2014
// Version : 1.3
// Notes :
// MPLAB ICD settings
// ver 1.1
// - correct entries for 18F13K22, 18F14K22, 18F13K50, 18F14K50
// ver 1.2
// - add new K50 and 18FxxJ94 family
// - device list from MPLAB 8.92
// ver 1.3
// - correct WDTEN list (devices were missing)
//------------------------------------------------------------------------------
//
module mplabicd
//
// to use ICD, set '#option MPLAB_ICD = true' in the main program module
// before you include this file
//
// set default (ICD not used)
#option MPLAB_ICD = false
#if IsOption(MPLAB_ICD) and (MPLAB_ICD = true)
//
// By default, high priority interrupts use the hardware shadow registers for
// context saving the WREG, STATUS, and BSR registers, and low priority interrupts
// save them using software. The hardware shadow registers can get corrupted when
// placing a breakpoint inside an ISR.
// You can force the compiler to perform software context saving in software for both
// high and low interrupts rather than using hardware shadow registers by using the
// ISR_SHADOW option:
// #option ISR_SHADOW = false
// This disables all hardware shadow register context saving and lets you use
// breakpoints in an ISR
// NOTE: since this changes the way isr's work, it is up to the user to set this option
//
'#option ISR_SHADOW = false
#if IsOption(ISR_SHADOW) and (ISR_SHADOW = false)
#warning "disabling hardware shadow registers"
#endif
//
// ICD resources (device dependant)
// most devices require program memory space to hold a debug executive
// pretty much all devices require 12 bytes of ram at the top of memory, so we'll just
// set it as a default. devices that don't require any ram can set it to 0
//
#variable ICD_RAM = $0c
// device list from MPLAB 8.92 (240 devices)
// standard 18F devices (108 devices)
#if _device in (18F242, 18F248, 18F252, 18F258, 18F442, 18F448, 18F452, 18F458)
#define ICD_ROM = $240
#elseif _device in (18F1220, 18F1230, 18F1320, 18F1330)
#define ICD_ROM = $1c0
#elseif _device in (18F2220, 18F2221, 18F2320, 18F2321, 18F2331, 18F2410, 18F2420, 18F2423)
#define ICD_ROM = $240
#elseif _device in (18F2431, 18F2439, 18F2450, 18F2455, 18F2458, 18F2480, 18F2510, 18F2520)
#define ICD_ROM = $240
#elseif _device in (18F2523, 18F2539, 18F2550, 18F2553, 18F2580)
#define ICD_ROM = $240
#elseif _device in (18F2515, 18F2525, 18F2585, 18F2610, 18F2620, 18F2680, 18F2682, 18F2685)
#define ICD_ROM = $280
#elseif _device in (18F4220, 18F4221, 18F4320, 18F4321, 18F4331, 18F4410, 18F4420, 18F4423)
#define ICD_ROM = $240
#elseif _device in (18F4431, 18F4439, 18F4450, 18F4455, 18F4458, 18F4480, 18F4510, 18F4520)
#define ICD_ROM = $240
#elseif _device in (18F4523, 18F4539, 18F4550, 18F4553, 18F4580)
#define ICD_ROM = $240
#elseif _device in (18F4515, 18F4525, 18F4585, 18F4610, 18F4620, 18F4680, 18F4682, 18F4685)
#define ICD_ROM = $280
#elseif _device in (18F6310, 18F6390, 18F6393, 18F6410, 18F6490, 18F6493)
#define ICD_ROM = $240
#elseif _device in (18F6520, 18F6525, 18F6527, 18F6585, 18F6620, 18F6621, 18F6622, 18F6627)
#define ICD_ROM = $280
#elseif _device in (18F6628, 18F6680, 18F6720, 18F6722, 18F6723)
#define ICD_ROM = $280
#elseif _device in (18F8310, 18F8390, 18F8393, 18F8410, 18F8490, 18F8493)
#define ICD_ROM = $240
#elseif _device in (18F8520, 18F8525, 18F8527, 18F8585, 18F8620, 18F8621, 18F8622, 18F8627)
#define ICD_ROM = $280
#elseif _device in (18F8628, 18F8680, 18F8720, 18F8722, 18F8723)
#define ICD_ROM = $280
// J series devices (91 devices)
// these require no program memory, but some of them use ram
#elseif _device in (18F24J10, 18F25J10, 18F44J10, 18F45J10)
#define ICD_ROM = 0
#elseif _device in (18F24J11, 18F24J50, 18F25J11, 18F25J50, 18F26J11, 18F26J13, 18F26J50, 18F26J53, 18F27J13, 18F27J53)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F44J11, 18F44J50, 18F45J11, 18F45J50, 18F46J11, 18F46J13, 18F46J50, 18F46J53, 18F47J13, 18F47J53)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F63J11, 18F63J90, 18F64J11, 18F64J90, 18F65J10, 18F65J11, 18F65J15, 18F65J50)
#define ICD_ROM = 0
#elseif _device in (18F65J90, 18F66J10, 18F66J11, 18F66J15, 18F66J16, 18F66J50, 18F66J55, 18F66J60)
#define ICD_ROM = 0
#elseif _device in (18F66J65, 18F67J10, 18F67J11, 18F67J50, 18F67J60)
#define ICD_ROM = 0
#elseif _device in (18F66J90, 18F66J93, 18F67J90, 18F67J93)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F83J11, 18F83J90, 18F84J11, 18F84J90, 18F85J10, 18F85J11, 18F85J15, 18F85J50)
#define ICD_ROM = 0
#elseif _device in (18F85J90, 18F86J10, 18F86J11, 18F86J15, 18F86J16, 18F86J50, 18F86J55, 18F86J60)
#define ICD_ROM = 0
#elseif _device in (18F86J65, 18F87J10, 18F87J11, 18F87J50, 18F87J60)
#define ICD_ROM = 0
#elseif _device in (18F86J72, 18F86J90, 18F86J93, 18F87J72, 18F87J90, 18F87J93)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F96J60, 18F96J65, 18F97J60)
#define ICD_ROM = 0
#elseif _device in (18F65J94, 18F85J94, 18F95J94, 18F66J94, 18F86J94, 18F96J94, 18F67J94, 18F87J94, 18F97J94)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F66J99, 18F86J99, 18F96J99)
#warning "support marked preliminary in 892"
#define ICD_ROM = 0
#variable ICD_RAM = 0
// K series devices (41 devices)
// many of these require no program memory or ram
#elseif _device in (18F13K22, 18F14K22, 18F13K50, 18F14K50)
#define ICD_ROM = $200
#variable ICD_RAM = 0
#elseif _device in (18F23K20, 18F24K20, 18F25K20, 18F43K20, 18F44K20, 18F45K20)
#define ICD_ROM = $240
#elseif _device in (18F26K20, 18F46K20)
#define ICD_ROM = $280
#elseif _device in (18F23K22, 18F24K22, 18F25K22, 18F26K22, 18F25K80, 18F26K80, 18F43K22, 18F44K22, 18F45K22, 18F46K22)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F45K80, 18F46K80, 18F65K22, 18F65K80, 18F65K90, 18F66K22, 18F66K80, 18F66K90, 18F67K22, 18F67K90)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F85K22, 18F85K90, 18F86K22, 18F86K90, 18F87K22, 18F87K90)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#elseif _device in (18F24K50, 18F25K50, 18F45K50)
#define ICD_ROM = 0
#variable ICD_RAM = 0
#else
#error "unsupported ICD device"
#endif
// constrain ROM and RAM so they are not used by SF
#variable _maxrom = _maxrom - ICD_ROM
#variable _maxram = _maxram - ICD_RAM
//
// wdt must be off for icd
//
// these 127 devices use WDTEN instead of WDT
#if _device in( _
18F13K22, 18F13K50, 18F14K22, 18F14K50, 18F2331, 18F23K20, 18F23K22, 18F2431, _
18F24J10, 18F24J11, 18F24J50, 18F24K20, 18F24K22, 18F24K50, 18F25J10, 18F25J11, _
18F25J50, 18F25K20, 18F25K22, 18F25K50, 18F25K80, 18F26J11, 18F26J13, 18F26J50, _
18F26J53, 18F26K20, 18F26K22, 18F26K80, 18F27J13, 18F27J53, 18F4331, 18F43K20, _
18F43K22, 18F4431, 18F44J10, 18F44J11, 18F44J50, 18F44K20, 18F44K22, 18F45J10, _
18F45J11, 18F45J50, 18F45K20, 18F45K22, 18F45K50, 18F45K80, 18F46J11, 18F46J13, _
18F46J50, 18F46J53, 18F46K20, 18F46K22, 18F46K80, 18F47J13, 18F47J53, 18F63J11, _
18F63J90, 18F64J11, 18F64J90, 18F65J10, 18F65J11, 18F65J15, 18F65J50, 18F65J90, _
18F65J94, 18F65K22, 18F65K80, 18F65K90, 18F66J10, 18F66J11, 18F66J15, 18F66J16, _
18F66J50, 18F66J55, 18F66J90, 18F66J93, 18F66J94, 18F66J99, 18F66K22, 18F66K80, _
18F66K90, 18F67J10, 18F67J11, 18F67J50, 18F67J90, 18F67J93, 18F67J94, 18F67K22, _
18F67K90, 18F83J11, 18F83J90, 18F84J11, 18F84J90, 18F85J10, 18F85J11, 18F85J15, _
18F85J50, 18F85J90, 18F85J94, 18F85K22, 18F85K90, 18F86J10, 18F86J11, 18F86J15, _
18F86J16, 18F86J50, 18F86J55, 18F86J72, 18F86J90, 18F86J93, 18F86J94, 18F86J99, _
18F86K22, 18F86K90, 18F87J10, 18F87J11, 18F87J50, 18F87J72, 18F87J90, 18F87J93, _
18F87J94, 18F87K22, 18F87K90, 18F95J94, 18F96J94, 18F96J99, 18F97J94 _
)
config WDTEN = off
#else // assume standard WDT
config WDT = off
#endif // _device
// enable debug (not required... this is controlled by mplab)
'config DEBUG = ON
#endif // MPLAB_ICD = true
end module
Have the #option also lets you add special code when you're in debug mode vs a production build. That comes in very handy sometimes... there are times when you need to know which environment you're running under.
I don't know of any good way for the IDE to control all of this since you can't set an #option externally from the command line, so I think you'd have to actually edit the program file to change MPLAB_IDE option. If that's the case, I'd rather leave it up to the user to do manually.