Lo de que si lo lees te aparece 0000 es por que lo grabáis con la opción de seguridad activada así no se puede leer, los PIC cuando se graban, puedes activarles o desactivarles una serie de opciones llamadas fusibles. Uno de ellos es el de protección, el cual si se activa, nunca ni nadie podrá leer el contenido de este.
En las opciones del icprog, tienes una que dice: "verificar después de programar" y otra que dice "verificar durante la programación".
Pues bien, si tienes la primera activada, siempre te va a dar error 000h al programar, por que después de programar intenta verificarlo leyéndolo, pero al tener la protección activada, pues no puede leerlo y te da ese error, para evitar esto y poder verificar la programación, se debe activar la segunda opción, es decir la opción "verificar DURANTE la programación". Así al mismo tiempo que graba, lo lee y no te da el error 000h.
También decir que cuando da el error 000h, no quiere decir que el PIC este mal, ya que lo único que dice es que por lo que sea no lo a podido leer, y en este caso es por el fusible de protección.
Espero que esto aclare dudas y solo decir que todo esto y mas esta en la ayuda del icprog... pero es muy cómodo no leer y decir que esta todo mal.
Un saludo.
edito:
P.D. También deberíais de leerle al PIC virgen el valor de calibración y ponerlo en el hex a grabar una ves abierto. Todos los PIC tienen un valor de calibración único y diferente entre ellos, el cual como bien dice su nombre, es para calibrar la programación.
Suena complicado, pero es simple, solo copiar y pegar.
Más información en
http://www.google.es
Edito otra ves para corregir fallo de confucion al leer el datasheet del 12c509 en ves del 12f629.