Valor OSCCAL del PIC12F508

El procedimiento para recuperar el valor de fábrica de OSCCAL es igual al que se trató por aquí: Consulta de osccal del 12f629

Solo que en los 12F508 se encuentra en la dirección 0x1FF y en el 12F509 en la dirección 0x3FF
También existe una locación reservada para un backup de los bits de OSCCAL: 12F508 = 0x204 y 12F509 = 0x404
El programador no borra esas direcciones, pero se pueden borrar por accidente.
Cuando eso sucede, se puede leer esa dirección y obtener el valor de fábrica el cual deberá ser escrito nuevamente en la última dirección de memoria RAM del PIC.

En los PIC12F6XX lo que se encuentra en la última dirección es un RETLW 0xXX
Dónde 0xXX es el valor de calibración para el registro OSCCAL.
Al leer esa dirección se mira algo como esto 3430 (34 = RETLW y 30 el valor para OSCCAL)

En los PIC12F508/509 la lectura encontrada es un MOVLW 0xXX
Aquí se verá algo así por ejemplo: 0C30 (0C = MOVLW y 30 el valor para OSCCAL)

Dirección de Backup de OSCCAL en PIC12F508
Backup OSCCAL.jpg

Lectura de un PIC12F508 en la dirección 0x1FF
Lectura OSCCAL.jpg

Esta herramienta que yo escribí puede recuperar un valor muy cercano al valor de fábrica para OSCCAL
OSCCAL Recovery Tool

Sin embargo no escribí el programa para un PIC12F508, el cual adjunto aquí en este post.
Este programa funciona a través del puerto serial, pero también se puede hacer uso de un conversor de USB a puerto serial RS-232 como lo es el chip FT232RL

Conexión con FT232RL
FT232RL.jpg

Usando el programa para recuperar el valor de fábrica para el oscilador.
OSCCALRT 12F508.jpg

Así es como obtengo el valor de fábrica para OSCCAL y es el que se vuelve a escribir en la dirección 0x1FF

Nota: aquí se mira un RETLW ya que el programa fue escrito para los PIC12F6XX, pero lo que importa es el valor encontrado, en este caso la lectura correcta de en medio (48 = 0x30)

Suerte.
 

Adjuntos

  • 12F508_REC.rar
    707 bytes · Visitas: 24
Última edición:
aaa ok ahora entiendo :D

entonces seria asi:
Código:
LIST P=12F508, r=hex
include <P12F508.INC>


OUT7 EQU 0 ;GP0 QUE ES LA PATA 7

ORG 0

CALL 1FFH  
MOVWF OSCCAL 

CLRWDT
MOVLW b'11000000'
OPTION
MOVLW b'00001000'
TRIS GPIO
BCF GPIO,OUT7 ;BORRO LA SALIDA


INICIO

BSF GPIO,OUT7 ; ENCIENDE EL LED
BCF GPIO,OUT7 ; AGAPA EL LED

GOTO INICIO
END

andaba caliente,caliente :LOL:
 
Última edición:
wow el tema creció bastante...
Respecto al mensaje ( SE2-USB no tiene Sistema Operativo ), indica que al PIC del grabador se le ha estropeado el firmware... ( motivos = ni idea ) pero se soluciona desde el PicKit con la opción ( Tools > Download Operating System ), es neceario un archivo *.hex que seguramente está en la carpeta de instalación, cargan el archivo y se va a restaurar el grabador.
 
aaa ok ahora entiendo :D
andaba caliente, caliente :LOL:
Yo diría que tibio, tibio. :)

Así sería el código para recuperar el valor de OSCCAL y hacer parpadear un LED con el PIC12F508
Código:
    list    p=12f508
    include    p12f508.inc
    __config    _IntRC_OSC & _WDT_OFF & _MCLRE_OFF

    cblock    0x07
    cnt1,cnt2,cnt3
    endc

    org    0x1FF                ; Vector de reset
    org    0x00                ; Inicio del código

inicio
    movwf    OSCCAL            ; Recuperar el valor de OSCCAL
    movlw    b'11111110'        ; GP0 como salida
    tris    GPIO            


programa
    bsf        GPIO,0            ; Enciende LED
    call    retardo_500ms    ; Retardo de 500ms
    bcf        GPIO,0            ; Apaga LED
    call    retardo_500ms    ; Retardo de 500ms
    goto    programa        ; Bucle infinito a programa

retardo_500ms
;499994 ciclos
    movlw    0x03
    movwf    cnt1
    movlw    0x18
    movwf    cnt2
    movlw    0x02
    movwf    cnt3
retardo_500ms_0
    decfsz    cnt1,f
    goto    $+2
    decfsz    cnt2,f
    goto    $+2
    decfsz    cnt3,f
    goto    retardo_500ms_0
;2 ciclos
    goto    $+1
;4 cicles (incluyendo call)
    retlw    0x00
    end
Si te fijas, la forma de leer el valor de OSCCAL es diferente para este PIC.

Saludos.
 
Última edición:
porque esto:

Código:
 org    0x1FF                ; Vector de reset
    goto    inicio
    org    0x00
    goto    config_port

inicio
    movwf    OSCCAL            ; Recuperar el valor de OSCCAL

config_port
    movlw    b'11111110'        ; GP0 como salida
    tris    GPIO

no puede ser asi:
Código:
     org    0x1FF                ; Vector de reset
      movwf    OSCCAL            ; Recuperar el valor de OSCCAL
      org    0x00
      movlw    b'11111110'        ; GP0 como salida
      tris    GPIO
 
¿No puede ser asi?:
Código:
     org    0x1FF                ; Vector de reset
      movwf    OSCCAL            ; Recuperar el valor de OSCCAL
      org    0x00
      movlw    b'11111110'        ; GP0 como salida
      tris    GPIO
Actualicé el código mientras escribías porque equivoqué los vectores de inicialización.
No he probado de la forma que mencionas, pero haré una prueba.

En este documento se explican con más detalle datos sobre OSCCAL: Memory Programming Specification
También se puede encontrar parte del código que puse en el archivo 12F508TEMP.ASM
Este archivo se encuentra en la carpeta Code dentro de las carpetas de instalación de MPLAB
Por ejemplo: C:\Archivos de programa\Microchip\MPASM Suite\Template\Code



Ya realicé la prueba y no funciona de esa forma.
Se escribe por código la dirección 0x1FF con 0x0025
Entonces cuando el programador (WinPic800 el que uso) lee esa dirección, pregunta si se desea sobre escribir el valor 0xXXXX de OSCCAL por el valor 0x0025
Obviamente eso no es lo que queremos, por lo tanto queda descartado y se realiza como mencioné anteriormente.

Saludos.
 
Última edición:
Ok amigos durante el fin de semana resolvi el problema del Sistema operativo, tal cual como dice ByAxel, y el problema del error con el valor OSCCAL era que la fuente de alimentacion no era suficiente debido a que el Jumper para pasar la informacion a los pines del ZIP estaba mal colocado, le di la vuelta y empezo a funcionar, lo malo es que ahora que ya pude pasar la informacion al PIC cuando lo monto en el protoboard no hace nada, temo que sea por que se halla perdido el valor de OSCCAL, probare con esos que me dicen!

Por otro lado en PROTEUS me esta dando este error:

eso me paso luego de tratar de corregir el porque en el protoboard no hacia nada!

anteriormente estaba funcionando normal, pero ahora no me deja probar el codigo que tenia para el encendido del LED, ya reinicie, cree otra vez el codigo, cree otra vez un nuevo diseño en proteus y nada, no puedo ver la simulacion!
 

Adjuntos

  • Sin título.jpg
    Sin título.jpg
    97.5 KB · Visitas: 22
Los problemas para este PIC no han parado para mi.

Al momento de grabar el PIC con el programa PICkit2 hago el procedimiento debido, pero cuando lo monto en el tablero de prueba no tiene nada.

Al parecer tengo un problema al momento de crear el archivo .hex, en efecto.
Verifiqué que cuando estuviera compilando lo estuviera haciendo con la librería correcta correspondiente al PIC12F508 y todo está bien, porque realmente cuando paso el código a Proteus tengo que variar las características del PIC porque en Proteus no tengo la librería de ese PIC, lo cambio por el 12C508A que me dijeron que es el mismo, pero lo cómico de todo es que ahí funciona perfecto, hace todo lo que realmente quiero hacer.

Pero vuelvo a MPLAB cambio la librería y exporto el archivo hex y creo que ahí todo se disuelve, no he podido grabar bien y PIC que funcione!
 
Última edición por un moderador:
:unsure:
mira compila y graba el codigo de darkbytes.

osea este:
Código:
    list    p=12f508
    include    p12f508.inc
    __config    _IntRC_OSC & _WDT_OFF & _MCLRE_OFF

    cblock    0x07
    cnt1,cnt2,cnt3
    endc

    org    0x1FF                ; Vector de reset
    org    0x00                ; Inicio del código

inicio
    movwf    OSCCAL            ; Recuperar el valor de OSCCAL
    movlw    b'11111110'        ; GP0 como salida
    tris    GPIO            


programa
    bsf        GPIO,0            ; Enciende LED
    call    retardo_500ms    ; Retardo de 500ms
    bcf        GPIO,0            ; Apaga LED
    call    retardo_500ms    ; Retardo de 500ms
    goto    programa        ; Bucle infinito a programa

retardo_500ms
;499994 ciclos
    movlw    0x03
    movwf    cnt1
    movlw    0x18
    movwf    cnt2
    movlw    0x02
    movwf    cnt3
retardo_500ms_0
    decfsz    cnt1,f
    goto    $+2
    decfsz    cnt2,f
    goto    $+2
    decfsz    cnt3,f
    goto    retardo_500ms_0
;2 ciclos
    goto    $+1
;4 cicles (incluyendo call)
    retlw    0x00
    end

y verifica que en la direccion que te hemos dicho y redicho este el valor del osccal, si sigue sin funcionar es que es otra cosa.
 
Ahora si funciona. Este es el código que yo hice:

Código:
LIST P=12F508, r=hex
include <P12F508.INC>

__config    _IntRC_OSC & _WDT_OFF & _MCLRE_OFF

PATA6    EQU 1            ;GP1 QUE ES LA PATA 6
PATA7    EQU 0           ;GP0 QUE ES LA PATA 7
TIEMPO1  EQU 0X0C
TIEMPO2  EQU 0X0D

    ORG 0X1FF            ;VECTOR DE RESET
    ORG 0X00            ;INICIO DEL CODIGO
    MOVWF OSCCAL
    MOVLW b'11100000'    ;los 0 representan las patas que son de salida y los 1 las patas que se utilizaran de entrada
    TRIS GPIO

    BCF GPIO,PATA7         ;BORRO LA SALIDA
    BCF GPIO,PATA6

INICIO

    BSF GPIO,PATA7      ;ENCIENDE EL LED
    CALL RETARDO    
        
    BCF GPIO,PATA7      ;AGAPA EL LED
    CALL RETARDO            
    
    BSF GPIO,PATA6
    CALL RETARDO

    BCF GPIO,PATA6
    CALL RETARDO

GOTO INICIO
;----------------------------
RETARDO
    MOVLW D'255'
    MOVFW TIEMPO1
    MOVFW TIEMPO2
DECREMENTO
    DECFSZ TIEMPO1
    GOTO DECREMENTO
    DECFSZ TIEMPO2
    GOTO DECREMENTO

    RETURN
;-----------------------------    
END

El error estaba en la forma de llamar la variable OSCCAL y la declaración de __config _IntRC_OSC & _WDT_OFF & _MCLRE_OFF, esta parte no la tenia, aunque no tiene mucho que ver, lo importante es que varié eso y funcionó!
 
Última edición por un moderador:
me parece que era el MCLR,

en el circuito que armaste tenias la resistencia pullup en el mclr?, por defecto se necesita poner a menos que especificques el MCLR_off.


edito: bueno tambien el oscilador si no tenias fisicamente el cristal tampoco deberia funcionar., entonces deberias de haber puesto el oscilador interno.
 
Última edición:
no realmente esa pata no la estoy usando, con esa funcion le estoy mandando a decir que trabaje con el oscilador interno!

por otra parte debo corregir que en el retardo el comando se tipea asi:

movlw .255
movwf tiempo1
movwf tiempo2

lo tenia movfw..
 
hice tu circuito DARKBYTES y funciono pero al leer el pic me salen 6 valores que adjunto en la imagen, cual deberia tomar? y otra cosa que no entiendo que mencionaste algo sobre el pin que enciende en el diagrama del lado derecho, en mi disposicion de pines del pic serial el BIT 4, que quieres decir con eso o que significa eso?

otra pregunta, seria posible que funcionara este circuito conectando un adaptador USB a serial? para poder hacer la lectura via usb.
 

Adjuntos

  • valor osccal.JPG
    valor osccal.JPG
    282.2 KB · Visitas: 40
Hice tu circuito, D@rkbytes, y funcionó, pero al leer el pic me salen 6 valores que adjunto en la imagen, cual debería tomar?
Realiza una suma y obtén el resultado promedio.
Si la lectura correcta empieza desde 8 y termina en 48...
Entonces sumas 48 + 8 y el resultado lo divides entre 2. O sea OSCCAL = 8 + 48 / 2
El valor para OSCCAL sería 28 en decimal o 1C en hexadecimal.
y otra cosa que no entiendo que mencionaste algo sobre el pin que enciende en el diagrama del lado derecho, en mi disposición de pines del pic serial el BIT 4
¿Qué quieres decir con eso o que significa eso?
Trata de colocar citas o enlaces sobre las referencias de los posts que mencionas, o coloca el número de post, porque no sé en que post mencioné lo que dices.
Si estás preguntando sobre el LED amarillo del Post #21, ese LED tan sólo indica que el circuito tiene alimentación.
Otra pregunta. ¿Sería posible que funcionara este circuito conectando un adaptador USB a serial para poder hacer la lectura via usb?
Sí, de hecho sobre el mismo Post #21, mencioné que también se puede hacer de esa forma.

Por favor, lee el tema completamente antes de realizar preguntas.

Saludos.
 
Gracias por la pronta respuesta, otra duda que tenia cual seria el codigo pero escrito en PBP en lenguaje basic? Y tambien si este circuito podria utilizarse claro haciendo algunas modificaciones para un pic 10f202 que usa la alimentacion en otros pines de los de la serie 12fxxx
 
Atrás
Arriba