# Programa pic 12f629



## INGIVAN87 (Oct 26, 2012)

Buenas tardes, soy nuevo en este foro y este es mi primer tema. Alguien me podrÍa dar informaciÓn de configuraciÓn o un programa sencillo de manejo de puertos para este micro controlador en ccs?. Gracias


----------



## ilcapo (Dic 1, 2012)

me sumo al pedido, alquien conoce de algun mini tutorial para comenzar con el manejo de este pic en C ?  recien investigango un poco por san google encontre puro assembler ! gracias 




main()
{
if (think) 
exist;
}


----------



## ByAxel (Dic 1, 2012)

ilcapo dijo:


> me sumo al pedido, alquien conoce de algun mini tutorial para comenzar con el manejo de este pic en C ?  recien investigango un poco por san google encontre puro assembler ! gracias



Hola.
Bueno, la ayuda más directa biene de la misma hoja de datos, sin embargo se debe de tener en cuenta que antes de grabar cualquier cosa en el PIC, se debe de leer la memoria y guardar el valor que se encuentra en la última hubicación, ya que este valor viene de fábrica para configurar el oscilador correctamente.

El resto de configuraciónes depende del compilador que estés usando... (PICC de CCS o PICC de Hi-Tech o el XC8 de microchip). Pero igual si ya conoces el C del compilador que utilices, ya sabes que cualquier configuración tiene un nombre ya declarado y que generalmente está en el archivo de cabecera *.h.

- No olvides de agregar el código de configuración antes leido a tu código en C o en todo caso, escribir manualmente el código cada véz que vas a grabar el PIC.

Saludos.


----------



## ilcapo (Dic 1, 2012)

ByAxel dijo:


> Hola.
> Bueno, la ayuda más directa biene de la misma hoja de datos, sin embargo se debe de tener en cuenta que antes de grabar cualquier cosa en el PIC, se debe de leer la memoria y guardar el valor que se encuentra en la última hubicación, ya que este valor viene de fábrica para configurar el oscilador correctamente.
> .




gracias Axel, tendras un ejemplo bien basico ( como apagar y encender un led) ? para ver como es el tema este de la configuracion del oscilador interno?  yo ahora voy a ponerme a estudiar este pic y trato de hacer programas en CCS y los envio a ver si podemos ir armando un tutorial basico para el 12f629/675  en compilador CCS, estuve buscando en internet pero no encontre nada asi que calculo que puede llegar a ser de utilidad para el foro, porque muchos usan el CCS 

saludos !


----------



## ByAxel (Dic 1, 2012)

Hola.
Tengo este código:


```
#include <12F629.h>

#FUSES NOWDT                    // No Watch Dog Timer
#FUSES INTRC_IO                 // >>> Oscilador interno, no CLKOUT
#FUSES PUT                      // Power Up Timer
#FUSES NOMCLR                   // Master Clear pin used for I/O
#FUSES BROWNOUT                 // Reset when brownout detected
#FUSES NOPROTECT                // Code not protected from reading
#FUSES NOCPD                    // No EE protection

#use delay(int=4000000) // Especifica al compilador que hace uso del OSC interno

void main()
{
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0);             // Todo como salidas
   
   while(TRUE){               // Bucle
      output_high(PIN_A0);    // PIN_A0 ó GPIO0 = '1'
      delay_ms(500);          // Espera de 1/2 segundo
      output_low(PIN_A0);     // PIN_A0 ó GPIO0 = '0'
      delay_ms(500);
   }
}

// El valor obtenido de la dirección 0x03FF debe de ir en la misma
// dirección para que el ajuste del oscilador no se afecte.

// Este valor se obtiene al leer por primera vez el PIC.

// > DataSheet. 
// The Bandgap Calibration bits are factory programmed and must be read and saved 
// prior to erasing the device.

#RESERVE 0x03FF         // Evita que el compilador genere código para esta dirección.
#ROM 0x03FF = {0x344C}  // Escribe el valor del ajuste.
```
- Lo del oscilador lo explica en la hoja de datos ya que de este depende el ajuste apropiado para el oscilador.
- Incluso el Proteus hace énfasis cuando detecta que la posición 0x03FF de la memoria ha sido escrita manualmente.



Saludos.


----------



## ilcapo (Dic 1, 2012)

paso el programa (encender y apagar un led) en CCS y simulado en proteus pero con oscilador externo XT 

ByAxel: de donde sacaste las lineas de configuracion: 

#RESERVE 0x03FF         // Evita que el compilador genere código para esta dirección.
#ROM 0x03FF = {0x344C}  // Escribe el valor del ajuste.  

van al final del programa ?? 

me maté todo el dia buscando ! jaja !!  y ademas es siempre 0x344C ??' porque lei algo de que cada pic tiene un valor distinto y hay que leerlo y despues guardarlo ,,,algo asi ,,


----------



## ByAxel (Dic 1, 2012)

Tengo entendido que en C puedo declarar posiciones de memoria para uso personal, de ese modo el compilador no los toca y bueno, busque intrucciones que hagan algo así en el CCS y es lo que encontré. 


ilcapo dijo:


> #RESERVE 0x03FF         // Evita que el compilador genere código para esta dirección.
> #ROM 0x03FF = {0x344C}  // Escribe el valor del ajuste.


No es necesario que vaya al final, puede ir en la configuración, igual compila.

Con lo del valor si tienen razón ya que este llega a variar. Ahún no se si es crítico pero si una aplicación no requiere tanta presición supongo que se puede obviar ese ajuste. Ya no seria por ejemplo 4Mhz, si no unos 3.14Mhz +- .


----------



## ilcapo (Dic 1, 2012)

ah genial ! bueno lo que no entiendo es: 
 si con esta instruccion:
 #RESERVE 0x03FF         // Evita que el compilador genere código para esta dirección
estamos reservando esta direccion para que no se escriba nada y se pierda la configuracion que "trae de fabrica" el clock interno "clavadito" en 4Mhz ,,,, 

porque hace falta esta otra instruccion: 
#ROM 0x03FF = {0x344C}  // Escribe el valor del ajuste.

ahi estariamos modificando lo que no queremos modificar ?? o que pasa ?? perdon que tarde en entender! jaja XD!


----------



## ByAxel (Dic 1, 2012)

En realidad solo basta con:
#ROM 0x03FF = {0x344C}... Es como declarar una constante de valor 0x344C en la dirección 0x03FF.

#RESERVE 0x03FF... si por algún motivo el programa llega a genera código hasta la última dirección, cosa que creo que en la mayoria de casos no sucede. Solo evita que al compilar no escriba nada en ésta dirección.


----------



## ilcapo (Dic 1, 2012)

bien gracias ya lo voy a ir madurando con el tiempo asi lo entiendo mejor ya fue suficiente por ser mi primer dia con el 12f629, ya voy a ir subiendo programas mas avanzaditos en ccs  ( si me funcionan) 

ah pero una duda mas ja  

el RESET BROWN OUT?  no lo habia escuchado nunca,, para que sirve ? 
#FUSES BROWNOUT                 // Reset when brownout detected 

y estos fuses que pusiste son necesarios para utilizar el clock interno?  o puede funcionar sin ellos ? 

#FUSES NOWDT                    // No Watch Dog Timer
#FUSES INTRC_IO                 // >>> Oscilador interno, no CLKOUT
#FUSES PUT                      // Power Up Timer
#FUSES BROWNOUT                 // Reset when brownout detected

bueno con eso creo que ya me puedo lanzar solo gracias!


----------



## Nuyel (Dic 1, 2012)

Oh, interesante, entonces supongo que con un 12F675 esta igual la cosa, lo de leer la dirección para no perder la calibración. En el datasheet acabo de leer:


> Herramientas de desarrollo de Microchip mantienen todos los bits de calibración a valores de fábrica.


El asunto es que uso Mac y el MPLAB X ¿eso significa que no debo preocuparme si lo programo con el compilador ese de HI-TECH PICC que trae? (bueno, se supone instale el XC8 pero igual me lo marca con ese nombre).


----------



## ByAxel (Dic 1, 2012)

ilcapo dijo:


> el RESET BROWN OUT?  no lo habia escuchado nunca,, para que sirve ?
> #FUSES BROWNOUT                 // Reset when brownout detected
> 
> y estos fuses que pusiste son necesarios para utilizar el clock interno?  o puede funcionar sin ellos ?
> ...



BROWNOUT Resetea al PIC cuando detecta una baja de tensión, está determinado por cierto umbral.
 El resto de fuses son otras caracteristicas que puedes dejar sin declar pero tomando en cuanta cual es su valor por defecto.


----------



## ilcapo (Dic 1, 2012)

Nuyel dijo:


> Oh, interesante, entonces supongo que con un 12F675 esta igual la cosa, lo de leer la dirección para no perder la calibración.
> 
> 
> 
> ...


----------



## ByAxel (Dic 1, 2012)

Nuyel dijo:


> El asunto es que uso Mac y el MPLAB X ¿eso significa que no debo preocuparme si lo programo con el compilador ese de HI-TECH PICC que trae? (bueno, se supone instale el XC8 pero igual me lo marca con ese nombre).



No hay problema, solo debes tomar en cuenta que las declaraciones son algo distintas, como para los fuses por ejemplo.

__CONFIG(FOSC_XT & ...);

o 

#pragma config WDT=ON ...


----------



## ilcapo (Dic 2, 2012)

hola ! : 
analizando con mas detalle el programa que envio ByAxel tengo una duda: 
no habria que cambiar: 

setup_comparator(NC_NC);   // Todo digital

por: setup_adc_ports(NO_ANALOGS); //todo digital 

no encontre por ningun lado el detalle de la funcion setup_comparator();  para saber como esta "trabajando" , osea que registros del pic esta modificando etc.... el detalle de las funciones del CCS estan en alguna parte ? saludos !


----------



## ByAxel (Dic 4, 2012)

Hola.
Usé el Wizard para hacer el ejemplo, asi que por defecto me puso esa línea.
Las palabras NC_NC o NO_ANALOGS se encuentran declaradas en el archivo de cabecera del PIC, para eso ve a la carpeta de instalación y busca el archivo 12F629.h, lo abres y vas a ver todas las deficiniones que usa este PIC... seguro que está NC_NC y otros.
Te daras cuenta que NO_ANALOGS puede que no esté declarado en todos los archivos *.h para cada PIC, no se el motivo pero hay diferencias y al compilar simplemente te dara error ya que no exise dicha palabra.

Encuentras como usar setup_comparator(); en la ayuda del CCS.

- Para más detalle puedes revisar el archivo *.lst que genera al compilar pero ya es otro trabajo jeje...

Saludos


----------



## ilcapo (Dic 4, 2012)

Bueno en definitiva mi conclusion seria que si no sabemos con claridad que registros estan modificando las funciones del CCS ( porque como usuarios del CCS no tenemos opcion de ver el codigo de las funciones  ) .....lo mejor seria no utilizar las funciones aunque te simplifican la existencia tambien te pueden generar errores en programas mas extensos si modifican justo algun bit que no tiene que ser modificado para utilizar algun periferico por ejemplo  y analizar eso seria un trabajo espantoso, a lo mejor tendrias que comenzar todo el programa de nuevo! 

entonces aca paso el programa sin usar funciones del CCS: es un poco mas largo pero nos aseguramos que sabemos con exactitud que se esta modificando en los registros, ademas hice la programacion del timer interno en assembler como se muestra en la hoja de datos del pic, en Proteus funciona OK 

// blinking led para pic 12f675 sin funciones del CCS 

#include <12F675.h>

#FUSES NOWDT                 
#FUSES INTRC_IO               
#FUSES PUT                      
#FUSES NOMCLR                   
#FUSES BROWNOUT                  
#FUSES NOPROTECT                
#FUSES NOCPD                    
                                // este pic no tiene POWER ON RESET??? (POR) que raro! 

#byte STATUS  = 0X03           //registros usados para calibrar el clock interno
#byte OSCCAL  = 0X90

#byte GPIO  = 0X05             // registros  usados para inicializar GPIO
#byte CMCON  = 0X19          
#byte ANSEL  = 0x9F 

#use delay(internal=4000000) // Especifica al compilador que hace uso del OSC interno


#RESERVE 0x03FF         // Evita que el compilador genere código para esta dirección.

void main()
{ 
 #asm                 
   bsf   STATUS,5    
   call  0x3FF         
   movwf OSCCAL         
   bcf   STATUS,5    
  #endasm            

GPIO =0x00;           //inicializo GPIO 
CMCON = 0x07;      // apaga los comparadores 
ANSEL = 0x00;       // GPIO pins en modo digital 
set_tris_a(0);        // Todo como salidas


   while(TRUE)         // Bucle infinito
  {              
      output_high(PIN_A0);    // PIN_A0 ó GPIO0 = '1'  ("enciendo led")
      delay_ms(1000);          // Espera de 1 segundo
      output_low(PIN_A0);     // PIN_A0 ó GPIO0 = '0' ("apago led")
      delay_ms(1000);         //Espera 1 segundo
   }
}


PD : como se sube el codigo para que salga como lo hizo ByAxel  #5 ??  saludos !


----------



## ByAxel (Dic 7, 2012)

Hola:
Si funciona...
Incluye la explicación del código asm ya que a la primera no queda claro que lo que hay en la dirección 0x3FF es una instrucción de retorno con el respectivo valor para el OSCCON. Solo que hace falta el #ROM 0x03FF = {0x344C} ya que el código compilado no genera nada en esa posición, es decir... que no encuentra la instrucción "retlw"... por este lado digo que funciona pero con una frecuencia inexacta o es posible que no funcione en uno real. Verifica esto ya que no tengo ese PIC a la mano.



ilcapo dijo:


> PD : como se sube el codigo para que salga como lo hizo ByAxel  #5 ??  saludos !


Utiliza el botón '#' (numeral) y pega el texto dentro de las etiquetas CODE.

Saludos


----------



## ilcapo (Dic 8, 2012)

OK, durante la semana lo pruebo bien y subo las conclusiones que obtenga 

otra cosa: estaba viendo que este "picsito" no tiene modulo PWM !! 
tenes algun programa en CCS que haga un PWM ? o algo parecido ? asi pruebo esto tambien ? 
que mal!! me decepciono la falta de este modulo, se les escapo la tortuga!


----------



## D@rkbytes (Dic 8, 2012)

ilcapo dijo:


> #FUSES NOWDT
> #FUSES INTRC_IO
> #FUSES* PUT                      *
> #FUSES NOMCLR
> ...


Si tiene, y de hecho lo tienes declarado pero con diferente nombre. (Power Up Timer)


ilcapo dijo:


> tenes algun programa en CCS que haga un PWM ? o algo parecido ? así pruebo esto también ?


Lee este tema, te parecerá interesante. Mezclador de luz RGB

Saludos.


----------



## ilcapo (Dic 11, 2012)

gracias de nuevo ! 
estuve tratando de analizar el programa de PWM pero soy muy nuevo en C, pude entender que con el pulsador de entrada incrementa una variable y usa esta variable para modificar dutycicle del PWM, pero lo que no entendi son las  funciones del archivo.h como trabajan con los datos que reciben ? sobre todo la funcion del TMR0 quedé en blanco  ! 

if (program C)
   {clrf cerebro;
     return foro;
    }


----------



## ByAxel (Dic 11, 2012)

ilcapo dijo:


> gracias de nuevo !
> estuve tratando de analizar el programa de PWM pero soy muy nuevo en C, pude entender que con el pulsador de entrada incrementa una variable y usa esta variable para modificar dutycicle del PWM, pero lo que no entendi son las  funciones del archivo.h como trabajan con los datos que reciben ? sobre todo la funcion del TMR0 quedé en blanco  !
> 
> if (program C)
> ...



No se acostumbra poner funciones en un archivo *.h pero bueno, el CCS no se queja .

Cuando utiliza *#int_* seguido de un nombre que puedes encontrar en la ayuda del programa, lo que está haciendo es declarar la funcion que sigue como interrupción, es decir que *void timer0_isr()* es la función de interrupción para el Timer0 *#int_timer0*. Esto solo lo encuentras en el CCS, en otro compilador no existe este método.

Parece un técnica que usa contadores desfasados para realizar el PWM, un contador lo usa para establecer los lapsos del DutyCicle y el otro para establecer el periodo (Timer0). 

Saludos.


----------



## D@rkbytes (Dic 11, 2012)

Me quede con la duda de poder trabajar con las librerías PWM .h de @dinoelectro del tema *Mezclador de luz RGB*
Así que realice dos programas, uno para el 12F629 con pulsadores, y otro para el 12F675 con potenciómetros.
Con la primer librería que dinoelectro subió, no tuve problemas, pero con la más reciente no funciono. 

Aquí adjunto los programas.

Saludos.
https://www.forosdeelectronica.com/f24/aporte-mezclador-luz-rgb-65055/


----------

