Add ICSP programming guide

Documents the 6-pin ICSP header for bootloader forcing (jumper
method) and direct PICkit programming. Includes pinout table,
PICkit connection mapping, MPLAB X/IPECMD instructions, and
notes on the PIC18F46J11 vs PIC18F45K22 discrepancy between
schematics and manual.
This commit is contained in:
Ryan Malloy 2026-01-28 18:05:55 -07:00
parent 5d268022d8
commit 5d468cd86a
2 changed files with 188 additions and 0 deletions

View File

@ -40,6 +40,7 @@ export default defineConfig({
{ label: 'Beacon Operation', slug: 'guides/beacon-operation' }, { label: 'Beacon Operation', slug: 'guides/beacon-operation' },
{ label: 'Repeater & Satellite', slug: 'guides/repeater-satellite' }, { label: 'Repeater & Satellite', slug: 'guides/repeater-satellite' },
{ label: 'Firmware Upgrade', slug: 'guides/firmware-upgrade' }, { label: 'Firmware Upgrade', slug: 'guides/firmware-upgrade' },
{ label: 'ICSP Programming', slug: 'guides/icsp-programming' },
], ],
}, },
{ {

View File

@ -0,0 +1,187 @@
---
title: ICSP Programming
description: Programming the RS-UV3A microcontroller via the ICSP header
---
The RS-UV3A includes a 6-pin In-Circuit Serial Programming (ICSP) header for programming the PIC microcontroller. This header serves two purposes:
1. **Bootloader forcing** — Jumper pins to force bootloader mode on startup (for firmware updates when the board is unresponsive)
2. **Direct ICSP programming** — Connect a PICkit or similar programmer to flash firmware directly
For routine firmware updates using the bootloader, see the [Firmware Upgrade](/guides/firmware-upgrade/) guide.
## ICSP Header Location
The ICSP header is a 6-pin (3×2) header located near the PIC microcontroller (U2) on the left side of the board. The pins are **staggered** — offset from the standard 0.1" grid — to allow a programming clip or individual test probes to make contact without soldering a header.
:::tip[Staggered Pins]
The staggered design means you can press a standard 2×3 pin header into the holes and it will friction-fit for programming. No soldering required.
:::
## ICSP Header Pinout
Viewed from the top of the board:
```
1 2
● ●
3 4
● ●
5 6
● ●
```
| Pin | Signal | Description |
|:---:|--------|-------------|
| 1 | Boot Select A | Jumper to pin 2 forces USB/JP1 bootloader on startup |
| 2 | VDD (+3.3V) | PIC supply voltage |
| 3 | PGD | Programming data (PIC RB7, pin 17) |
| 4 | PGC | Programming clock (PIC RB6, pin 16) |
| 5 | GND | Ground |
| 6 | Boot Select B | Jumper to pin 5 forces DB-9 bootloader on startup |
## Method 1: Bootloader Forcing (Jumper)
If your RS-UV3A is unresponsive (bad firmware upload, corrupted flash), you can force it into bootloader mode on power-up:
### USB / JP1 Serial Upload
1. Power off the RS-UV3A
2. Place a jumper across **pins 12**
3. Power on — the board enters bootloader mode on USB/JP1
4. Upload firmware using mikroBootloader at 115200 baud
5. Power off and **remove the jumper**
6. Power on — normal operation resumes
### DB-9 Serial Upload
1. Power off the RS-UV3A
2. Place a jumper across **pins 56** (or 45, verify against your board revision)
3. Power on — the board enters bootloader mode on DB-9
4. Upload firmware using mikroBootloader at 115200 baud
5. Power off and **remove the jumper**
6. Power on — normal operation resumes
:::caution[Remove the Jumper]
Always remove the bootloader jumper after programming. If left in place, the RS-UV3A will enter bootloader mode every time it powers on instead of running normally.
:::
For the full bootloader upload process, see [Firmware Upgrade](/guides/firmware-upgrade/).
## Method 2: Direct ICSP Programming (PICkit)
For advanced users who need to flash the PIC microcontroller directly — for example, to restore a corrupted bootloader or flash custom firmware.
### What You Need
| Item | Notes |
|------|-------|
| **PICkit 3, 4, or 5** | Microchip in-circuit programmer/debugger |
| **MPLAB X IDE** | Free download from [microchip.com](https://www.microchip.com/mplab/mplab-x-ide) |
| **Firmware .HEX file** | From HobbyPCB or compiled from source |
| **2×3 pin header** (optional) | Press-fit into staggered ICSP holes |
### PICkit Connection
The PICkit programmer needs five signals. Connect to the ICSP header as follows:
| PICkit Pin | Signal | ICSP Header |
|:----------:|--------|:-----------:|
| 1 | MCLR/VPP | See note below |
| 2 | VDD | Pin 2 |
| 3 | VSS (GND) | Pin 5 |
| 4 | PGD (ICSPDAT) | Pin 3 |
| 5 | PGC (ICSPCLK) | Pin 4 |
:::warning[MCLR Connection]
The ICSP header may not break out the ~MCLR signal (PIC pin 18) directly. Check your board revision's schematic on the [Schematics](/reference/schematics/) page. If MCLR is not on the header, you may need to connect the PICkit's MCLR line directly to PIC pin 18 or the ~MCLR trace on the board.
:::
### MPLAB X Configuration
1. Open MPLAB X IDE
2. Create a standalone project or open the firmware project
3. Select the target device: **PIC18F46J11**
4. Select the programmer tool: **PICkit 3** (or 4/5)
5. Under Project Properties → PICkit:
- Set **Power** to *not* supply voltage from PICkit (the RS-UV3A has its own 3.3V regulator)
- Set **Voltage Level** to **3.3V** if powering from PICkit
:::danger[Voltage Warning]
The PIC18F46J11 is a **3.3V device**. Never apply 5V to the programming pins. If using the PICkit to supply power, ensure it is set to 3.3V output. Applying 5V will damage the microcontroller.
:::
### Programming Steps
1. Connect the PICkit to the ICSP header
2. Power the RS-UV3A (or enable PICkit power at 3.3V)
3. In MPLAB X, click **Make and Program Device** (or use `ipecmd` for command-line)
4. Verify the programming completed successfully
5. Disconnect the PICkit
6. Power cycle the RS-UV3A
### Command-Line Programming (IPECMD)
For automated or headless programming using Microchip's IPECMD:
```bash
ipecmd -P18F46J11 -TPPK4 -M -F"RS_UV3_FIRMWARE.HEX" -OL
```
| Flag | Meaning |
|------|---------|
| `-P18F46J11` | Target PIC device |
| `-TPPK4` | Tool: PICkit 4 (use `-TPPK3` for PICkit 3) |
| `-M` | Program device |
| `-F"..."` | Firmware .HEX file path |
| `-OL` | Release from reset after programming |
## Microcontroller Details
From the schematics, the RS-UV3A uses:
| Parameter | Value |
|-----------|-------|
| **MCU** | PIC18F46J11-I/PT (U2) |
| **Package** | TQFP-44 |
| **Flash** | 64 KB |
| **VDD** | 3.3V |
| **PGD** | RB7 (pin 17) |
| **PGC** | RB6 (pin 16) |
| **MCLR** | Pin 18 |
:::note[PIC18F45K22 Reference in Manual]
The HobbyPCB manual references the PIC18F45K22 when describing the mikroBootloader setup. However, the schematics for Rev A and Rev C both show a **PIC18F46J11-I/PT**. The bootloader selection in mikroBootloader may use the PIC18 family setting generically. When using MPLAB X or IPECMD for direct programming, select **PIC18F46J11**.
:::
## When to Use Each Method
| Scenario | Method |
|----------|--------|
| Routine firmware update | [Bootloader (BL command)](/guides/firmware-upgrade/) |
| Board won't respond to commands | Bootloader forcing (ICSP jumper) |
| Corrupted bootloader | Direct ICSP (PICkit) |
| Custom firmware development | Direct ICSP (PICkit) |
| Factory programming | Direct ICSP (PICkit) |
## Troubleshooting
### PICkit Can't Connect
- Verify PGD, PGC, VDD, GND connections
- Check that MCLR is accessible to the PICkit
- Ensure the RS-UV3A is powered at 3.3V
- Try reducing PICkit programming speed in MPLAB X
### Programming Succeeds but Board Won't Boot
- Verify the correct .HEX file was used
- Check that the bootloader region was preserved (if applicable)
- Try the bootloader jumper method as a fallback
- Ensure configuration bits are correct for the PIC18F46J11
### Staggered Pins Won't Hold Contact
- Use a press-fit 2×3 header and apply light finger pressure
- Solder a header if you program frequently
- Use a spring-loaded pogo pin adapter (e.g., Tag-Connect TC2030)