PIC microcontrollers are great little devices — reliable, fairly powerful, reasonably easy to use, generally available in DIP form factor, and very inexpensive. Sometimes, though, an overlooked configuration setting or a missed connection can cause a PIC-powered project to refuse to execute code.

Here is a generic version of the troubleshooting process that I usually go through (more or less in this order) if a PIC-based project doesn’t start up after having been programmed. Going through this checklist should cover most of the common problems that will keep a PIC from running. Double-check everything — even the “obvious” things like making sure power and ground are connected.

First, make a visual inspection of the circuit:

Is power connected to all Vcc pins?

Is Ground connected to all Vss pins?

Is this the correct type of PIC for your code?

Is the PIC seated correctly, especially if breadboarded?

Is the PIC in the correct orientation in the PCB or breadboard?

Are any of the PIC’s pins bent or otherwise not making contact?

Next, inspect the chip configuration in MPLab:

Is the correct type of PIC selected in MPLab?

Is the oscillator configuration set correctly?

Is the watchdog timer either disabled (or handled in code)?

Is the PWRON timer set? (This isn’t strictly necessary, but this helps ensure reliable startup)

Is the brownout reset configuration correctly set? (This may not be strictly necessary)

Check for correct programming procedure:

If connected to the programmer/debugger, is ~MCLR high?

Was the chip successfully programmed? (Check the output messages.)

Was it the correct program?

Next, look over the code for common mistakes:

Is the PIC actually executing code, but all TRIS registers are set to input?

Did you disable all unused peripherals which share the ports you’re using?

Did you enable all peripherals which you are using?

Are you using the correct definition file for this PIC?

Is your code going off into the weeds?

If your program reaches the end of the code, is this handled with a loop or a SLEEP instruction?

Is PCLATH set correctly when executing CALLs and GOTOs to other program pages?

Is PCLATH set correctly when returning from routines in other program pages?

Does your code execute a RETURN without a corresponding CALL?

Does your code execute too many (> 7) nested CALLs (including an infinite series of them)?

Next, inspect the signals and voltages at the chip pins:

Is the power at the correct voltage wrt Ground, on all power pins?

Is ~MCLR at Vcc (not floating, grounded, or at Vpp)?

Is the power clean? (try a decoupling cap or two near the PIC power inputs)

Using a ‘scope or at least a logic probe, check all inputs to the PIC (right where the pins enter the chip body). Are these signals what you would expect to see going into the chip?

Finally, try active debugging techniques: