Problema al programar 12F675

Hola a todos los foreros.

estoy haciendo un pequeño circuito para mostrar todos los colores basicos de un led RGB y ponerlo en mi bici.

es la primera vez que uso el pic 12F675 y cuando intento programarlo el soft me envia un error con el osccal, por lo que lei es la calibracion del reloj interno.

he tratado de buscar alguna solucion por la red pero no encuentro algo concreto.

no se programar en asm, en la universidad me enseñaron solo C, y programo con el PIC C Compiler.

el codigo que estoy usando es este(es solo para empezar):

Código:
#include <12F675.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Reloj Interno
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //No se usa el pin del master clear
#FUSES NOCPD                    //No EE protection
#use delay(internal=4MHz)

int i;
#byte osccal=0x90
#bit R=0x05.0
#bit G=0x05.1
#bit B=0x05.4


void main(int){   //Programa principal
set_tris_a(0x00);
OUTPUT_A(0X00);    //todos apagados
delay_ms(10);
while(true){      //Ciclo Infinito
R=1;//ROJO
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
G=1;//ROJO Y VERDE
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
R=0;//VERDE
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
B=1;//AZUL Y VERDE
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
G=0;//AZUL
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
R=1;//AZUL Y ROJO
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
G=1;//AZUL ROJO Y VERDE
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
OUTPUT_A(0x00);
delay_ms(1000);      //---------------lapso de tiempo de 1 SEGUNDO
}
}

si alguien puede porfavor ayudarme con el codigo y explicarme que se debe hacer para programar este pic, le quedare muy agradecido.
 
Saludos Ericktronik
Espero que esta información te sea de ayuda.

Mira, lo que tienes que hacer es leer el PIC12F675 con tu programador.
Y te vas hasta el final del código, a la última posición.

Entonces veras algo como esto si es que no se ha perdido el valor de calibración de fabrica.
RETLW OSCCAL.gif
Nota: Yo use el programador WinPIC800 para leer el PIC de este ejemplo.

El 34 es un RETLW y el 30 es el valor de fabrica del oscilador interno. En mi caso 0x30
En lenguaje ensamblador para asignar este valor se hace de esta manera.
Código:
    call    0x3FF           ; Ir a la dir. 3FF y retornar con el valor en W
    bsf     STATUS,RP0      ; Ir al banco 1 
    movwf   OSCCAL          ; Actualizar el registro con el valor de fabrica
Ahora, para hacer esto en PIC C tendrás que declararlo de esta manera.

#ROM 0x3FF = {0x3430} // 0x34 > RETLW > 0x30 Valor de calibración del oscilador interno.

Ahora solo te queda leer tu PIC, asignar el valor que encuentres y nos cuentas que tal.

Suerte.
 
hola.
yo uso un clon del pickit2 que hize yo mismo y nunca me ha fallado.
el problema es que cuando intento leer el pic, ni siquiera reconoce el que lo tengo conectado al quemador...

intento usar la opcion de "autoregenerar el valor del osccal" que tiene el pickit2, pero dice que la operacion es fallida.

Tendre que conseguir(o armar) un programador serial para poder arreglarlo?
si tengo que hacerlo con el programador serial, puedo usar un conversor RS-232 a USB?(mi pc es una Laptop)
 
deberia funcionar con el adaptador de usb a rs232. mira esta pagina que tiene un programador serial de pic, y soporta el 12f675 : http://www.oshonsoft.com/picprogserial.html
yo use el programador paralelo que esta en esa pagina y funciono sin problemas, esta incluido el software para usarlo, aunque deberia funcionar con otros software que manejen el puerto serial.
 
No se puede (o por lo menos, no por el momento), ya que no hay forma de generar el voltaje de programación (13V normalmente), ya que uno de los pines del puerto serie (no recuerdo cual), es el que se encarga de generar ese voltaje, ademas el conversor trabaja con menos voltaje que el puerto serie real, por eso no hay circuitos específicos hechos con el conversor USB-SERIE.

Si consiguen hacerlo funcionar, avisen, porque tengo un cable USB-SERIE que lo tengo guardado hasta encontrar la manera de hacerlo funcionar.

--------------------------

Prueba programar otro PIC, haber si el problema viene del quemador, o de otro lado.

Saludos

PD: En la definición del reloj, ¿está bien 4MHz, o tiene que ser 4000000?, nunca vi 4MHz en esa configuración...
 
hola.
yo uso un clon del pickit2 que hize yo mismo y nunca me ha fallado.
el problema es que cuando intento leer el pic, ni siquiera reconoce el que lo tengo conectado al quemador...

intento usar la opcion de "autoregenerar el valor del osccal" que tiene el pickit2, pero dice que la operacion es fallida.

Tendre que conseguir(o armar) un programador serial para poder arreglarlo?
si tengo que hacerlo con el programador serial, puedo usar un conversor RS-232 a USB?(mi pc es una Laptop)

Hace algún tiempo me sucedió lo mismo pero con un PIC12F508, no sabía eso del valor del OSCCAL y lo porgramé así como cualquier otro. La 2da vez que lo intenté reprogramar ya no pude, el programador tampoco me reconocía el PIC. Igualemente utilizo un clon del Pickit 2, tampoco me sirvió, la opción de regenerar el código del OSCCAL
 
Buenas. Estoy empezando con los PIC y tengo un problema a la hora de probar un programa en ensamblador.
El programa en concreto es de encender y apagar un LED repetidamente.
El problema es que a la hora de conectarlo no hace lo que tiene que hacer, hasta que toco con un dedo la resistencia de polarización del LED.

He pensado que podría ser porque se le mete demasiada corriente al LED, pero eso en todo caso haría que alumbrase más, y en teoría debería de realizar el programa.

Dejo por aquí el programa por si es un error del software. Gracias de antemano.
PHP:
;Programa que enciende un led si presionamos un pulsador, situado en el bit 1 de GPIO
LIST P=PIC12F675
#include <p12f675.inc>
__CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _BOREN_OFF & _CP_OFF & _CPD_OFF
CONTADOR1 EQU 20h
CONTADOR2 EQU 21h
ORG 0x00
GOTO INICIO
ORG 0x05
;DECLARAMOS LAS ENTRADAS Y SALIDAS DE GPIO 
INICIO
    BCF STATUS,RP0 ;Banco de memoria 0
    CLRF GPIO ;Inicializa GPIO
    MOVLW B'00000111' ;Desactiva el comparador y lo pone al nivel minimo de energia.
    MOVWF CMCON
    BSF STATUS,RP0 ;Banco de memoria 1
    MOVLW B'11111111'
    MOVWF OSCCAL
    MOVLW B'00000000' ;Habilitamos las resistencias de pullup
    MOVWF OPTION_REG
    CLRF ANSEL ;Elimina la posibilidad de que alguna patilla pudiese ser tomada como patilla analógica
    MOVLW B'00000010' ;Pone el bit 1 de GPIO como entrada digital
    MOVWF TRISIO
    MOVLW B'00000010' ;Seteamos la resistencia de pull up de la patilla GP1
    MOVWF WPU
    BCF STATUS,RP0
;PROGRAMA
BUCLE
    BSF GPIO,GPIO0
    CALL PAUSA
    BCF GPIO,GPIO0
    CALL PAUSA
    GOTO BUCLE
    
PAUSA
    CLRF CONTADOR1
    CLRF CONTADOR2
CONT1
    DECFSZ CONTADOR1,1
    GOTO CONT1
    DECFSZ CONTADOR2,1
    GOTO CONT1
    RETURN

    END
 
No se usa pero debe estar en un nivel alto para que el micro ejecute el programa, de lo contrario estaría en reset siempre y sus salidas desactivadas provocando, quizá, lo que comentas de acercar el dedo


 
Pues sí era eso! Era a causa del pin GPIO3, que lo tenía configurado para que funcionase como patilla MCLR. En los bits de configuración lo he desactivado y ya funciona. Gracias! :):)
 
Atrás
Arriba