# PIC12F675 Internal CLOCK



## j0r (Oct 29, 2010)

HOla !
Antes que todo un cordial saludo a todos los que hacen posible este foro .
Tengo el siguiente problema espero y alguien me pueda acesorar .
Quiero hacer un sensor de temperatura con el PIC 12F675 enviar los datos a
la PC por medio del protocolo RS232 .
Quiero usar el OSCILADOR INTERNO .
He encontrado un par de programas de ejemplo en la red los cuales los puedo 
simular en PROTEUS ,pero al momento de grabarlos en el PIC y probarlos 
fisicamente  en el proto no hace nada  =(
Dejo el codigo que he estado usando  .
#include <E:\CCS\PICC\Devices\12F675.h>
//////////////////////////////////////////////////////////////////////////////////////////////
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT
#use delay(clock = 4000000)

main()
{
　　　　set_tris_a(0);

　　　　while(1){
　　　　　　　　output_high(PIN_A0);
　　　　　　　　delay_ms(1000);
　　　　　　　　output_low(PIN_A0);
　　　　　　　　delay_ms(1000);
　　　　}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
El PIC funciona en el proto cuando cambio "INTRC_IO" por "XT" .
Cual es mi error ?? 
Saludos desde Guadalajara MEX =D .


----------



## electroconico (Oct 29, 2010)

Puede que se halla descalibrado el oscilador interno y por eso no funcione.O solo no has definido correctamente el oscilador.

Para lo primero basta con grabar en la ultima posicion de memoria el valor del oscilador.
Lee el datasheet sobre ese asunto,viene bien explicado 


```
#include <12F675.h>
#FUSES INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,NOPROTECT,NOCPD
#use delay(internal=4MHZ)

void main(){
  // Programa
}
```

Saludos


----------



## pepechip (Oct 29, 2010)

Hola
Cuando trabajes con el 12f629 o el 12f675 y pìenses utilizar el oscilador interno, lo primero que tienes que hacer es leer en el pic el dato que hay en la posicion 3FF. Este dato varia de un pic a otro. Al inicio de tu programa tienes que introducir  una pequeña rutina para que lea el valor de la posicion 3FF y la introduzca en el OSSCAL. De esta forma el oscilador tendra un error maximo de +- 1%. Si no haces esto cualquiera sabe la frecuencia que tendras. Asegurate que cuando procedas a grabarlo se mantenga el valor original de esa posicion. Dependiendo del programador que utilices te dara la obcion de mantener el valor original o de meter un nuevo valor.


----------



## j0r (Oct 29, 2010)

Gracias a todos por su pronta respuesta .
Ya encontre la solucion este es el codigo 
////////////////////////////////////////////////////
#include <E:\CCS\PICC\Devices\12F675.h>
//****************************************************
#device ADC=10 
#fuses INTRC_IO,NOWDT,NOPUT,NOPROTECT,NOCPD,NOMCLR 
#use delay(internal=4000000) 
#define GP0 PIN_A0 
#define GP1 PIN_A1 
#define GP2 PIN_A2 
#define GP3 PIN_A3 
#define GP4 PIN_A4 
#define GP5 PIN_A5 
#byte OSCCAL = 0x90 

void init() 
{ 
              OSCCAL = 0x80; // set internal oscillator to mid frequency 
              set_tris_a( 0b11111101 ); // set GP1 output, all other inputs 
              setup_comparator( NC_NC_NC_NC ); // disable comparators 
              setup_adc_ports( NO_ANALOGS ); // disable analog inputs 
              setup_adc( ADC_OFF ); // disable A2D 
} 
main() 
{ 
init(); 
while ( TRUE ) // blink LED 
{ 
              output_high( GP1 ); // turn LED on 
              delay_ms( 250 ); // wait 250ms 
              output_low( GP1 ); // turn LED off 
              delay_ms( 250 ); // wait 250ms 
} 
}///////////////////////////

Tambien funciona remplazando "OSCCAL = 0x80;" por :
	  #asm
		bsf 	STATUS, 5 		        //Bank 1
		call 	0x03ff 			//Get the cal value
		movwf 	OSCCAL      	//Calibrate
		bcf 	STATUS, 5	 	       //Bank 0
	#endasm 
y definientso la direccion "STATUS"   asi : "#byte STATUS = 0x03 "
De hecho esas son las instrucciones que estan en el datasheet .
Solo que ahora tengo otro problema y esto es muy raro .
Susede lo siguiente :
Al alimentar con 5v el PIC aveces no empiza a parpadear GP1 si no que 
tengo que estarlo alimentando varias veces es decir encenderlo y apagarlo 
hasta que GP1 empieze a parpadear =S
Eso no es nada bueno es como si la calibracion aveces no funcionara .
Alguna idea ??


----------



## shala (Mar 30, 2011)

yo también estoy trabajando con el mismo pic y quiero hacer algo parecido, pero la verdad no se por cual pin mando la info... cuál es el TX??   eso lo necesito solo para saber si está funcionando porque la verdad la idea es mostrar el valor de la temperatura en 2 displays 7-seg... aunque la verdad no recuerdo muy bien el código, estoy trabajando en eso...

gracias


----------



## shala (Mar 31, 2011)

estuve buscando y encontre la respuesta... a2=tx   y a3=rx... sigo trabajando en lo otro

si alguien sabe como, podria colaborarme

suerte


----------



## electroconico (Mar 31, 2011)

Pero trabajando en que Shala??

Aqui ni se habla de TX y RX.

Postea tu duda completa y da más detalles.


Saludos!


----------



## shala (Mar 31, 2011)

mirá lo que había escrito antes, solo me estaba respondiendo a mi mismo por si tal vez alguien tiene la misma duda... lo que dice de lo otro, es usar los 7 segmentos con 74LS47 para mostrar la temperatura sensada... lo haría sin ese integrado pero el 12F675 solo tiene 6 pines de los cuales ya he usado 2, entonces me quedan 4 perfecto para el 74LS47... electroconico, si queda claro??


----------



## electroconico (Mar 31, 2011)

Pues siguete respondiendo solo. 

¿quedó claro? (^^)

Saludos


----------



## chronos682 (Nov 26, 2015)

Buen día a todos. Tengo un PIC12F675 al cual le leí el valor de la posición 0x03FF antes de grabarlo, y era 342C

He intentado con estos códigos en PIC C de CCS:

```
#asm
bsf STATUS, 5 //Bank 1
call 0x03ff //Get the cal value
movwf OSCCAL //Calibrate
bcf STATUS, 5    //Bank 0
#endasm
```
Con el código anterior no compila el archivo hex, me dice que no se ha definido STATUS, pero no sé como definirlo.

Y con esto:

```
#RESERVE 0x03FF
#ROM 0x03FF = {0x342C}
```
Cuando yo cargo en el programador de PICs (K150) el archivo hex y miro en la dirección 0x03FF, veo el 342C pero al dar clic en el botón Programar PIC y luego vuelvo a leer el PIC, me aparece 34FF en la última dirección de la ROM en vez de 342C.

Luego uso un código básico de mantener encendido un LED por 5 segundos y contabilizo el tiempo que dura encendido y veo que no dura sino 3.5 segundos, como si el oscilador interno no estuviera bien calibrado.

He intentado modificar directamente desde el programador de PICs la dirección 0x03FF pero no funciona.
Ya no sé cómo devolver el valor a su estado original y no quiero utilizar un cristal oscilador externo porque necesito todos los pines del PIC.

Agradezco cualquier ayuda.


----------



## D@rkbytes (Nov 27, 2015)

Cuando usas PIC C Compiler, ya no es necesario que escribas las instrucciones para calibrar el oscilador interno.
El mismo compilador se encarga de ese procedimiento automáticamente.

Para verificar lo que te menciono, puedes abrir el archivo .LST que se genera al compilar y ver las instrucciones en ensamblador.
Debes encontrar algo así:
*CALL 3FF* y a continuación un cambio de banco:* BSF 03.5

*Para definir cualquier registro y evitar buscar la dirección en la hoja de datos, lo puedes hacer de esta forma:
*#byte STATUS = getenv("SFR:STATUS")
*Y si conoces la dirección del registro STATUS, entonces lo puedes definir de forma más sencilla:
*#byte STATUS = 0x03

*Pero como te mencioné, no es necesario que incluyas la rutina de calibración.
Estableciendo el valor conocido de OSCCAL eso te puede servir para restablecer el valor de fábrica cuando se ha perdido, pero el programa únicamente servirá para ese PIC y no para otros, a menos que de fábrica tengan el mismo valor para OSCCAL.

Respecto a la pregunta sobre leer el valor de OSCCAL con el K150, mira el siguiente post:
_*Drivers y soft programador K150*_

PD:
Aunque en ese post se habla del PIC12F629, se usa el mismo procedimiento de calibración.


----------

