Mira , el pin MCLR lo puedes usar como entrada,solo como entrada.
Si desactivas MCLR no pasa nada al querer reprogramar , solo tienes que enviar VPP primero antes que VCC al pic para que no se haga el loco.
Por eso en el pickit2 trae la opción de VPP first Entry.
También te comento que yo tengo configurado el pin MCLR como entrada y tiene la función de RX junto con la interru´pción por cambio de estado.
Te adjunto un fragmento de una minicontroladora de servos.
El pic recibe los comandos seriales por RA3 osea MCLR. Hecho en C con CCS
Mira esta línea
enable_interrupts(INT_RA3); //Habilitamos interrupcion por cambio de estado
//en pin RA3
Código:
void main(){
setup_comparator(NC_NC_NC_NC); //Comparador deshabilitado
output_A(0x00); //Latch
set_tris_A(0B001000); //MCLR=A3= RX input Int_RA3 on Change
enable_interrupts(GLOBAL); //Interrupciones Habilitadas
enable_interrupts(INT_TIMER1); //Habilitamos interrupcion desborde TMR1
SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(INT_RA3); //Habilitamos interrupcion por cambio de estado
//en pin RA3
//--------- PROGRAMA PRINCIPAL -----------------------------\\\\
while(1){
for(indice=0;indice<n_servos;indice++){ //Toma valor de n servos
aux=T_Servo[indice];
aux=65091-(aux*8);
SET_TIMER1(aux);
switch(indice){ //1 Lógico a servo correspondiente
case 0:output_high(Servo_1);break;
case 1:output_high(Servo_2);break;
case 2:output_high(Servo_3);break;
case 3:output_high(Servo_4);break;
case 4:output_high(Servo_5);break;
}//switch
while(flag_timer1==FALSE){} //Loop Mientras no desborde TMR1
flag_timer1=FALSE;
switch(indice){ //0 lógico a servo correspondiente
case 0:output_low(Servo_1);break;
case 1:output_low(Servo_2);break;
case 2:output_low(Servo_3);break;
case 3:output_low(Servo_4);break;
case 4:output_low(Servo_5);break;
}//switch
}// for
//++++++++++++ ACTUALIZACION DE LOS SERVOMOTORES +++++++//
if(flag_rx==TRUE){
if(dato_recibido>=251){ //Si es mayor a 250 es Servo,si Flag=TRUE es posicion
indice_rx=(0xFF-dato_recibido); //operacion lógica AND solo servos de 0-5
flag_Supdate=TRUE; // YA se puede actualizar el valor del servo
if(aux2==2)aux2=0; //corrigiendo posible error de recepcion
}
if(dato_recibido<=250&&flag_Supdate==TRUE){
T_Servo[indice_rx]=dato_recibido; //Actualizando valor del servo
flag_Supdate=FALSE; //Reiniciamos varibles
dato_recibido=0; //Tarea completada
}
flag_rx=FALSE;
}//if--rx
//+++++++++++++++++++Pausa de 10 ms +++++++++++++++++++//
SET_TIMER1(55536); //10ms
while(flag_timer1==FALSE){} //Loop Mientras no desborde TMR1
flag_timer1=FALSE;
}//loop end while
}//end main
//+++++++++++++++ INTERRUPCIONES +++++++++++++++++++//
#INT_TIMER1
void desborde_TMR1(){ //Interrupcion por desborde de timer
flag_timer1=TRUE;
} // interrupcion TMR1
#INT_RA
void recepcion(){ //Interrupcion por cambio de estado en pines
if(!input(PIN_A3)){ // Bit de inicio ???
dato_recibido=getc(); //Recibir dato
flag_rx=TRUE; //Dato recibido
}//if
} //int_ra3
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++//