# Consulta de OSCCAL en PIC12F629



## kenoby (Mar 17, 2011)

Buenas que tal...
me estoy involucrando con el pic 12f629... y tengo dudas con el valor del osccal de fabrica.... entiendo que el valor original hay que guardarlo para que pueda funcionar a 4Mhrz correctamente... pero entonces porque hay programas en hex que necesitan el osc int y lo cambian a por ejemplo 80??? se que hay que ponerlo que no lo cambie cuando pregunta... pero porque en el programa le da la instruccion de cambiarlo? 
otra cosa mas... se puede recuperar? creo haber leido por ahi que hay una especie de circuito con un socalo para el pic para configurarlo nuevamente a un valor de la pos 0x03ff al valor que tenia correspondiente a su funcionamiento en 4 mhrz... puede ser?
desde ya gracias!


----------



## chapin (Mar 17, 2011)

para recuperarlo pickit2 te lo regenera


----------



## kenoby (Mar 18, 2011)

ok , gracias!

ya estuve averiguando... y logicamente cuanto mas sé, mas dudas me surgen.
por ejemplo el MCLR si no lo activo (OFF) no puedo regrabar el micro... correcto?
pero si lo activo solo puedo usar el puerto GP3 como interrupcion y no como entrada de datos común... no es cierto???

por cierto... cual seria un buen código en ensamblador para calibrar el OSC INT??? porque lei unos cuantos y no se cual me es mejor... 
desde ya gracias!!!


----------



## fdesergio (Mar 18, 2011)

kenoby dijo:


> por cierto... cual seria un buen código en ensamblador para calibrar el OSC INT??? porque lei unos cuantos y no se cual me es mejor...
> desde ya gracias!!!



Yo creeria que el suministrado por Microchip, aca te lo subo, personalmente no lo probe, chauuuuuuu


----------



## kenoby (Mar 18, 2011)

Ese datasheet no lo tenia Gracias!
igualmente por lo que leo es para RE-calibrar el pic... yo quiero dejarlo a la frecuencia normal de 4Mhrz con el valor de 0x3FF.
creo que es algo como:

```
bsf              STATUS,RP0           ;ir al banco 1
call             3FFh                      ;toma el valor de osc por defecto en el pic
movwf         OSCCAL                  ;lo calibra en el registro OSCCAL
bcf              STATUS,RP0           ;vuelve al banco 0
```


hasta acá creo que esta bien (según el datasheet) pero tambien creo que antes de finalizar el programa se tiene que poner unas instrucciones mas... puede ser???


IGUALMENTE sigo con la duda del MCLRE si lo desactivo puedo usar el GP3 como entrada común... si lo activo como interrupcion pero si no lo activo no puedo reescribir el PIC... no es cierto???
o sea que mi única alternativa es usarlo como interrupcion si luego quisiera reusar el PIC


----------



## electroconico (Mar 19, 2011)

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*

```
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
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++//
```


----------



## kenoby (Mar 19, 2011)

electroconico dijo:


> 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.
> 
> ...



gracias por tu respuesta... pero y si no dispongo de un pickit2??? solo tengo un programador JDM.... 
en fin.... igualmente me estoy dando por vencido con este tema despues de haber arruinado 2 pics de ellos... (ya que me daba error al reprogramarlos)
Saludos!!!



			
				kenoby dijo:
			
		

> gracias por tu respuesta... pero y si no dispongo de un pickit2??? solo tengo un programador JDM....
> en fin.... igualmente me estoy dando por vencido con este tema despues de haber arruinado 2 pics de ellos... (ya que me daba error al reprogramarlos)
> Saludos!!!




```
ERROR -> De escritura en direccion 0x002007
   Escrito : 03194   Leído : 0x0004
```
me tira ese error

lee todo "0000"
sin embargo todavía lee el OSC a 3424  en 03fff


----------



## duile (Abr 15, 2013)

Puedo recuperar el OSCCAL del pic12f629 desde mi programador 
pickit 2 clone??? u otro programador usb????


----------



## D@rkbytes (Abr 15, 2013)

duile dijo:


> Puedo recuperar el OSCCAL del pic12f629 desde mi programador
> pickit 2 clone??? u otro programador usb????


No, cuando se pierde el valor de calibración de fábrica, es porque se ha sobre escrito la dirección. 0x3FF
Por eso es recomendable guardar ese valor antes de grabar el PIC,
y no permitir que esa dirección sea escrita, reservando esa locación de memoria.

Existen varias formas para recuperar el valor de OSCCAL.
Una sencilla que es la que yo utilizo, es hacer un programa que incremente el valor de OSCCAL de 10 en 10.
Y mandar alguna frase por RS-232 a 2400bps, conteniendo el valor actual de OSCCAL.
Cuando en el Hyperterminal se puedan leer tres de los envíos, tomas el valor central.
Ese será el valor que debes usar para calibrar el oscilador interno.

Suerte.


----------



## duile (Abr 15, 2013)

Que diagrama armo y que software ...

Disculpa las preguntas
necesito los pasos! .... quiero rescatar 6 pics para 
armar un proyectos de eficiencia energética!!

Gracias!


----------



## fdesergio (Abr 15, 2013)

Se puede recuperar asi, siguiendo la info de microchip, chauuuuuuuuuuu


----------



## chapin (Abr 15, 2013)

Lo puedes recuperar incluso con el clone de pickit.

Saludos


----------



## fdesergio (Abr 15, 2013)

chapin dijo:


> Lo puedes recuperar incluso con el clone de pickit.
> 
> Saludos



mmmm      interesante, como se hace con el clon del Pickit????


----------



## D@rkbytes (Abr 15, 2013)

duile dijo:


> Que diagrama armo y que software ...
> 
> Disculpa las preguntas
> necesito los pasos! .... quiero rescatar 6 pics para
> ...


OK. Adjunto el programa con el que recupero el valor de OSCCAL.
Dentro del archivo vienen también esquema, archivos hex, e instrucciones.

Cualquier duda, puedes preguntar.

Saludos.


----------



## fdesergio (Abr 23, 2013)

Aca otra forma mas "bonita"

http://www.electronics-lab.com/projects/mcu/017/index.html


----------



## duile (Jul 22, 2013)

D@rkbytes dijo:


> OK. Adjunto el programa con el que recupero el valor de OSCCAL.
> Dentro del archivo vienen también esquema, archivos hex, e instrucciones.
> 
> Cualquier duda, puedes preguntar.
> ...



Muchas gracias!
Esa Información es la mas concreta que he visto
Te felicito buena labor en el Foro!


----------



## josejavier400 (Ene 3, 2015)

Hola Darkbytes.He probado el recuperador pero no se si lo estoy haciendo bien, ya que cuando le doy a convertir se me iluminan los pines , pero cuando lo coloco en el programador no sale el valor osccal en la linea correspondiente.Que estoy haciendo mal? Gracias


----------



## D@rkbytes (Ene 3, 2015)

josejavier400 dijo:


> Hola D@rkbytes. He probado el recuperador pero no sé si lo estoy haciendo bien, ya que cuando le doy a convertir se me iluminan los pines, pero cuando lo coloco en el programador no sale el valor osccal en la línea correspondiente. ¿Qué estoy haciendo mal? Gracias.


En el post #14 dentro del archivo adjunto, se encuentran las instrucciones.
Si haces todo tal cual se indica ahí, no debes tener ningún problema.


----------



## josejavier400 (Ene 4, 2015)

Ok, probare de nuevo. Es que a mi me salen 5 ó 6 lineas correctas, cual es la que corresponde entonces.


----------



## D@rkbytes (Ene 4, 2015)

josejavier400 dijo:


> Ok, probare de nuevo. Es que a mi me salen 5 ó 6 líneas correctas.
> *¿Cual es la que corresponde entonces?*


Utiliza alguno de los resultados que se encuentra en medio de las lecturas.
Puede ser uno abajo o uno arriba, y el que selecciones debe darte un buen funcionamiento.


----------



## josejavier400 (Ene 5, 2015)

Ok, gracias. Esta herramienta podría servir para win 7


----------



## D@rkbytes (Ene 5, 2015)

josejavier400 dijo:


> Ok, gracias. Esta herramienta podría servir para win 7


Si es pregunta, posiblemente, no uso Windows 7 y por lo tanto no lo he probado en ese sistema.
Pero haz la prueba para saber si funciona en ese sistema.


----------



## jotana240 (Abr 7, 2021)

D@rkbytes dijo:


> OK. Adjunto el programa con el que recupero el valor de OSCCAL.
> Dentro del archivo vienen también esquema, archivos hex, e instrucciones.
> 
> Cualquier duda, puedes preguntar.
> ...


*H*ola*,* tengo el mismo problema*,* que perd*í* la calibraci*ó*n de fabrica del PIC12F675 *, *pero uso el WinPic800

.





*Y* estoy usando el puerto paralelo*,* como hago para volver a calibrar lo ?


D@rkbytes dijo:


> OK. Adjunto el programa con el que recupero el valor de OSCCAL.
> Dentro del archivo vienen también esquema, archivos hex, e instrucciones.
> 
> Cualquier duda, puedes preguntar.
> ...



*P*odrias agregar le los puertos paralelo por favor  *?*


----------



## switchxxi (Abr 7, 2021)

jotana240 dijo:


> hola tengo el mismo problema que perdi la calibracion de fabrica del PIC12F675



Según las fotos, o bien el winpic (hardware) esta andando mal o esta mal conectado el PIC o la alimentación o directamente el PIC murió.

Si lees el error dice que no puede escribir en el PIC o, mejor dicho, graba un valor y lee otro siendo 3xFFF el valor que aparece cuando el PIC no responde o hay algún problema.

Prueba otro PIC a ver si el problema esta en el programador o en el PIC.



Si es que por error se borro el valor OSCCAL y posees otro PIC12F629/675 *con el OSCALL intacto (calibrado de fabrica)* puedes intentar hacer este circuito: Recuperar OSCALL. No necesita ni siquiera PC, solo un puñado de componentes y un *PIC enano que tenga la calibración de fabrica*.

Debería actualizarlo, que ya había pensado algunas modificaciones pero "_es que quiero evitar la fatiga_". (Esta en la pila de los 1000 y un proyectos que quiero hacer, de echo debería subir al foro el sistema. ).


----------



## jotana240 (Abr 7, 2021)

switchxxi dijo:


> Según las fotos, o bien el winpic (hardware) esta andando mal o esta mal conectado el PIC o la alimentación o directamente el PIC murió.
> 
> Si lees el error dice que no puede escribir en el PIC o, mejor dicho, graba un valor y lee otro siendo 3xFFF el valor que aparece cuando el PIC no responde o hay algún problema.
> 
> ...



*S*i *, *se perdió el osccal del pic por que le paso una programacion en blanco y si la recibe



switchxxi dijo:


> Según las fotos, o bien el winpic (hardware) esta andando mal o esta mal conectado el PIC o la alimentación o directamente el PIC murió.
> 
> Si lees el error dice que no puede escribir en el PIC o, mejor dicho, graba un valor y lee otro siendo 3xFFF el valor que aparece cuando el PIC no responde o hay algún problema.
> 
> ...



*P*odr*í*as abrir algún tema que explique como usar el Winpic800 paso a paso *? Có*mo hago para que no me pase otra vez el error de del osccal ? *Por favor* es que no encuentro documentaci*ó*n ninguna en la web y se encuentra es inentendible para mi.


----------



## switchxxi (Abr 7, 2021)

jotana240 dijo:


> podrias abrir algun tema que explique como usar el Winpic800 paso a paso como hago para que no me pase otra vez el error de del osccal ? plizz es que no encuentro documentacion ninguna en la web y se encuentra es inentendible para mi


Lamentablemente no lo use nunca al winpic800, pero de seguro que hay muchos en el foro que si y te podrán dar una mano.

Lo ideal, pero tedioso, es leer primero el PIC y anotar el valor del OSCCAL (En un papel por ejemplo) antes de grabar en el así si se pierde puedes recuperarlo sin problemas. El grabador que uso yo me tiene prohibido modificar el OSCCAL salvo que yo le diga que quiero hacerlo explícitamente por lo que es casi imposible borrarlo accidentalmente.

Este método es curioso y sirve, pero tendrás que leerlo primeramente con el grabador.

Recuerda que el OSCCAL no paraliza al microcontrolador, funcionar funciona siempre pero sin la frecuencia correcta por lo que si no necesitas tiempos precisos puedes obviarlo y en vez de usar el CALL 0x3FF (Que si esta borrado el valor te cuelga el programa) usas un MOVLW 0xFC y MOVWF OSCCAL (Si mal no recuerdo los bits 0 y 1 los obvia) y ya tienes el micro funcionando a la máxima velocidad que da el oscilador RC interno (no recuerdo bien pero creo que eran unos 100Khz mas, osea en vez de tener 1Mhz se va a 1.1Mhz -valor ya dividido por 4-). También puedes borrar las instrucciones de calibración del OSCCAL y todo "funcionara", pero como dije, no sabrás a que frecuencia solo que estará en algún punto entre unos extremos (deberás ver el datasheet cuales son el mínimo y máximo).


----------



## jotana240 (Abr 8, 2021)

switchxxi dijo:


> Lamentablemente no lo use nunca al winpic800, pero de seguro que hay muchos en el foro que si y te podrán dar una mano.
> 
> Lo ideal, pero tedioso, es leer primero el PIC y anotar el valor del OSCCAL (En un papel por ejemplo) antes de grabar en el así si se pierde puedes recuperarlo sin problemas. El grabador que uso yo me tiene prohibido modificar el OSCCAL salvo que yo le diga que quiero hacerlo explícitamente por lo que es casi imposible borrarlo accidentalmente.
> 
> ...



*Q*ue circuito y que software me recomiendas para programar pics puedo usar ? *U*so windows 7 x86


----------



## switchxxi (Abr 8, 2021)

Yo uso este pero no veo porque comprar otro -mas estando en Venezuela- si ya tienes el winpic800. Busca en internet tutoriales y si no lo entiendes porque están en ingles usa Google translate, solo copias la dirección en el cuadro a traducir y te aparece en el otro cuadra la dirección a la misma pagina pero traducida por Google al español.


----------



## FALKON707 (Nov 5, 2021)

Saludos... amigo D@rkbytes, en el archivo adjunto que publicaste el esquema de circuito recuperador de OSSCAL para *PIC12F6xx* solo hay una conexión y es del PIC a la base de un transistor, y no hay niguna que lleve datos al PIC. Esa esla unica conexión o el esquema es otro ?? Gracias !!


----------



## D@rkbytes (Nov 5, 2021)

Así está bien, El PIC que perdió valor de OSCCAL solo transmite a la PC.
El proyecto del post #14 tiene un instructivo de uso.


----------

