L'In-System Programming (in acronimo ISP) è una funzionalità di alcuni dispositivi elettronici programmabili (come MCU, PLC, PLD e simili) che ne permette la programmazione mentre sono installati in un sistema completo, invece di aver bisogno di programmare il chip prima di installarlo nel sistema.
Il principale vantaggio di questa caratteristica è che permette al fabbricante di dispositivi elettronici di integrare programmazione e fase di test in una singola fase di produzione, invece di richiedere una distinta fase di programmazione prima di assemblare il sistema.[1] Questo potrebbe permettere ai produttori di programmare i chip all'interno delle loro linee di produzione invece di comprare chip preprogrammati da un fabbricante o distributore, rendendo fattibile l'invio del codice o cambi di progetto nel mezzo di una produzione avviata.
Tipicamente i chip che supportano ISP hanno una circuiteria interna in grado di generare tutte le necessarie tensioni di programmazione a partire dalla normale tensione di alimentazione, e comunicare con il programmatore attraverso un protocollo seriale.
La maggior parte dei dispositivi programmabili usa una variante del protocollo JTAG per ISP, allo scopo di favorire una più semplice integrazione con le procedure automatizzate di test. Altri dispositivi solitamente usano protocolli proprietari o protocolli definiti da standard più vecchi. In sistemi abbastanza complessi da richiedere una quantità moderatamente elevata di glue logic, i progettisti potrebbero implementare un sottosistema di programmazione controllato via JTAG per i dispositivi non-JTAG come flash memory e microcontrollori, permettendo di effettuare l'intera procedura di programmazione e test sotto il controllo di un singolo protocollo.
Un esempio di dispositivo che utilizza ISP è la linea AVR di microcontrollori prodotti da Atmel come la serie Atmega.[2]