Más o menos voy viendo por dónde van los tiros. Con el código siguiente primero le mando 0x0000 para que la salida de ponga a 0,80V (4mA) y luego le mando 0xFFFF para que se ponga a 4,0V (20mA). Lo que físicamente observo es que la salida empieza a 0,80V, luego mando el 0xFFFF y la salida pasa a la mitad del rango (2,4V) y la siguiente vez si que se pone a los 4,0V.
Parece como si entre medio hubiese algo que no lo entiende.
#include <16F818.h> //PIC a utilizar
#fuses XT //configuracion de fusibles
#fuses NOWDT
#fuses PROTECT
#fuses PUT
#fuses NOBROWNOUT
#fuses MCLR
#fuses NOLVP
#fuses CPD
#fuses NOWRT
#fuses NODEBUG
#use delay (clock=4000000)
#use fast_io(a)
#define LED PIN_A1 //LED de funcionamiento
#define AD420_LATCH PIN_B3
void main(void)
{
int16 val=0;
disable_interrupts(GLOBAL); //deshabilitar interrupciones
disable_interrupts(INT_EEPROM); //deshabilitar interrupcion EEPROM
disable_interrupts(INT_RB); //deshabilitar interrupcion portb
disable_interrupts(INT_TIMER0); //deshabilitar interrupcion del timer0
disable_interrupts(INT_TIMER1); //deshabilitar interrupcion timer1
disable_interrupts(INT_TIMER2); //deshabilitar interrupcion timer2
disable_interrupts(INT_CCP1); //deshabilitar interrupcion CCP1
disable_interrupts(INT_SSP); //deshabilitar interrupcion I2C / SPI
disable_interrupts(INT_AD); //deshabilitar interrupcion ADC
disable_interrupts(INT_EXT); //deshabilitar interrupcion RB0
setup_TIMER_0(RTCC_INTERNAL | RTCC_DIV_1); //preescaler=1
setup_TIMER_1(T1_DISABLED); //desactivar timer1
setup_TIMER_2(T2_DIV_BY_1,255,16); //preescaler=16
setup_CCP1(CCP_OFF); //desactivar modulo captura
setup_SPI(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
setup_ADC_PORTS(AN0); //entradas analogicas
setup_ADC(ADC_CLOCK_INTERNAL); //activar modulo ADC
set_tris_a(0b00000000); //porta todo como salida
set_tris_b(0b00000010);
ext_int_edge(H_TO_L); //interrupcion externa en flanco de bajada
port_b_pullups(TRUE); //pullups portb activadas
enable_interrupts(GLOBAL); //interrupciones activadas
delay_ms(1000);
output_low(LED);
do
{
output_toggle(LED);
output_low(AD420_LATCH);
spi_write(val >> 8); // Send msb
spi_write(val & 0xFF); // Send lsb
output_high(AD420_LATCH);
val=65535;
delay_ms(8000);
}while(TRUE);
}