Programa pic 12f629

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
 
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;
}
 
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.
 
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 ! :)
 
Hola.
Tengo este código:

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.

sim.png

Saludos.
 
Última edición:
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. :aplauso:

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

Adjuntos

  • blinking led.rar
    19.6 KB · Visitas: 281
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é. :)
#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 +- :D.
 
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!
 
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.
 
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 :p

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! :)
 
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).
 
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

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.

config.png
 
Oh, interesante, entonces supongo que con un 12F675 esta igual la cosa, lo de leer la dirección para no perder la calibración.
hasta aca te puedo responder yo,,, ja

Si, es lo mismo para el 12f675, la unica diferencia entre estos 2 pics es que el 12f675 tiene entradas analogicas y el 12f629 no, por la otra pregunta creo que por las dudas deberias configurar el timer interno como dijo ByAxel, saludos !
 
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 ...
 
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 !
 
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
 
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 (y)

// 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! :unsure:

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

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
 
OK, durante la semana lo pruebo bien y subo las conclusiones que obtenga (y)

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! :(
 
Atrás
Arriba