Desactivar la funcion TOCKI en pic 12F508

Hola que tal amigos, agradeceria su ayuda para resolver este peque#o problemita con este codigo.

Estoy tratando de encender un LED en GP2 del pic 12f508, en esta ocacion este pin corresponde al funcionamiento de el TOCKI/GP2 del mismo, por ende el led no funciona

Se que en assembler desactivo esa configuracion con la funcion OPTION, pero en lenguaje C no encuentro como hacer para desactivarla. este es el codigo:

Código:
#include <main.h>

void main()
{

   //Example blinking LED program
   while(true)
   {
      output_low(LED);
      delay_ms(DELAY);
      output_high(LED);
      delay_ms(DELAY);
   }

}

Y de este lado esta el archivo .h:

Código:
#include <12F508.h>
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O

#use delay(internal=4MHz)

#define LED PIN_B2
#define DELAY 1000

Alguien puede decirme que debo mover para resolver esto, estoy metido en un lio y no encuentro por ningun lado algo de documentacion..

Gracias
 
Estoy tratando de encender un LED en GP2 del pic 12f508, en esta ocacion este pin corresponde al funcionamiento de el TOCKI/GP2 del mismo, por ende el led no funciona

Se que en assembler desactivo esa configuración con la función OPTION, pero en lenguaje C no encuentro como hacer para desactivarla.
Usa esto dentro del void main:
#asm
movlw 0xC0 ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
option
#endasm


Suerte.
 
Usa esto dentro del void main:
#asm
movlw 0xC0 ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
option
#endasm

Suerte.

No deja de oscilar esa pata, aun no hace lo que la mando a hacer..

Código:
#include <Probar.h>

void main()
{
#asm
movlw 0xC0; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
option
#endasm
   while(true)
   {
      //if (!input(OPT))
      //{
         output_high(LED);
         delay_ms(1000);
      //}
      //else 
      //{
         output_low(LED);
         delay_ms(1000);
      //}
   }
}



papirrin dijo:
probaste poner:

#byte option= 0XC0
No tampoco funciona, de verdad no se que hacer...
 
Última edición:
no no he hecho eso, osea eso es todo lo que tengo, aparte del archivo .h que es este:

Código:
#include <12F508.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O

#use delay(internal=4MHz)
#use STANDARD_IO( B )

#define LED   PIN_B2
no se si el use STANDARD_IP( B ) corresponda a esa funcion
 
A ver aclara las cosas, dices que ese led no deja de oscilar, y despues dices que no lo puedes hacer encender.

no perdiste el valor del osccal? sabes cual es el de fabrica? (bueno no estoy seguro como se calibre ese pero tiene un registro osccal XD)
 
Encender un LED solamente, lo necesito para otras cosas, pero ese PIN me tiene la vida cuadritos y hasta que no lo haga encender el LED no puedo avanzar..
Como te mencioné funciona (Comprobado físicamente) Así es como lo he hecho siempre.
Para probar, usa este código:
Código:
[COLOR=Red]#include[/COLOR] <[COLOR=SeaGreen]12[/COLOR]f508.h>
[COLOR=Red]#fuses[/COLOR]   nomclr
[COLOR=Red]#use[/COLOR]     delay(internal = [COLOR=SeaGreen]4[/COLOR]MHz)

[COLOR=Blue]void[/COLOR] main ([COLOR=Blue]void[/COLOR])
{

[COLOR=Red]#asm[/COLOR]
   movlw   [COLOR=SeaGreen]0xC0[/COLOR]      [COLOR=RoyalBlue]; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0[/COLOR]
   option
[COLOR=Red]#endasm[/COLOR]

   output_high(pin_b2);
   delay_ms([COLOR=SeaGreen]500[/COLOR]);

   [COLOR=Blue]while[/COLOR](true)
      {
         output_toggle(pin_b2);
         delay_ms([COLOR=SeaGreen]500[/COLOR]);
      }
}
Posiblemente si se haya perdido el valor de OSCCAL como menciona paparrin.
Ese PIC tiene una dirección de backup (0x0204) que muestra cual es el valor de fábrica para OSCCAL.
Utiliza el valor que leas con tu programador y escribelo nuevamente.

Puedes usar esto:
#byte osccal = getenv("SFR:OSCCAL")
Y en el void main le estableces el valor encontrado: osccal = 0x32 (Por ejemplo)
El valor encontrado es sólo para ese PIC, así que no sirve para otro 12F508

A modo de ejemplo "únicamente" con recuperación de OSCCAL:
Código:
[COLOR=Red]#include[/COLOR] <[COLOR=SeaGreen]12[/COLOR]f508.h>
[COLOR=Red]#fuses[/COLOR]   nomclr
[COLOR=Red]#use[/COLOR]     delay(internal = [COLOR=SeaGreen]4[/COLOR]MHz)

[COLOR=Red]#byte[/COLOR]    osccal = getenv([COLOR=Purple]"SFR:OSCCAL"[/COLOR])

[COLOR=Blue]void[/COLOR] main ([COLOR=Blue]void[/COLOR])
{

[COLOR=Red]#asm[/COLOR]
   movlw   [COLOR=SeaGreen]0xC0[/COLOR]     [COLOR=RoyalBlue] ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0[/COLOR]
   option
[COLOR=Red]#endasm[/COLOR]

   osccal = [COLOR=SeaGreen]0x32[/COLOR];

   output_high(pin_b2);
   delay_ms([COLOR=SeaGreen]500[/COLOR]);

   [COLOR=Blue]while[/COLOR](true)
      {
         output_toggle(pin_b2);
         delay_ms([COLOR=SeaGreen]500[/COLOR]);
      }
}
Aquí unas imágenes leyendo el valor de backup de OSCCAL:

Con WinPic800
OSCCAL 12F508 (WinPic800).jpg

Con PICkit 3
OSCCAL 12F508 (PICkit 3).jpg

OSCCAL 12F508 (PICkit 3) 002.jpg
El valor vendría siendo 0x32, ya que C32 es un movlw 0x32

Suerte.
 
Última edición:
Gracias a ambos, no creo que sea el valor OSCCAL que alla perdido, no lo he usado fisicamente, tengo el simulador de circuitos ISIS que es donde hago las pruebas, de todas maneras correre esos codigos a ver que tal.

A ver aclara las cosas, dices que ese led no deja de oscilar, y despues dices que no lo puedes hacer encender.
papirrin el problema es que el Pin tiene activo el TOCKI, entonces eso genera una frecuencia, osea yo conecto un led y el enciende y apaga de manera muy rapida y con una secuencia descontrolada, yo quiero que prende y apaga a mi manera. No he podido configurar el pin como I/O.

Voy a probar nuevamente..
 
Gracias a ambos, no creo que sea el valor OSCCAL que alla perdido, no lo he usado fisicamente, tengo el simulador de circuitos ISIS que es donde hago las pruebas, de todas maneras correre esos codigos a ver que tal.

en el simulador si te va a funcionar porque el isis no contempla el OSCCAL.

papirrin el problema es que el Pin tiene activo el TOCKI, entonces eso genera una frecuencia, osea yo conecto un led y el enciende y apaga de manera muy rapida y con una secuencia descontrolada, yo quiero que prende y apaga a mi manera. No he podido configurar el pin como I/O.

te has cuestionado porque oscila si esta como TOCKI, si cuando esta configurado asi esta como entrada ¿como podra estar al mismo tiempo como entrada y salida? :rolleyes:

TOSCKI = Clock input to TMR0
 
Última edición:
te has cuestionado porque oscila si esta como TOCKI, si cuando esta configurado asi esta como entrada ¿como podra estar al mismo tiempo como entrada y salida?

TOSCKI = Clock input to TMR0

Entiendo lo que quieres decir, pero de igual manera el Pin no funciona como salida, hice la prueba como entrada y funciona pero de manera extrana, me explico: si tengo un valor alto (1 logico) constante y mando a hacer una rutina cuando sea un valor bajo (0 logico) entra en el ciclo, pero si lo trabajo de manera inversa sigue oscilando, de repente se estabiliza y espera a que le mande el pulso. Me parece extrano no se porque hace eso, normalmente con otros pics no me habia pasado!

Gracias por el apoyo...
 
El pin no funciona como salida.
Hice la prueba como entrada y funciona pero de manera extraña.
El pin GP2 es un pin bidireccional, puede funcionar como entrada o como salida.
Es la entrada de conteo para el TMR0 cómo ya te mencionaron.
Pero se puede utilizar también como salida con la configuración que te dije anteriormente.
Ese pin no genera ningún tipo de frecuencia u oscilación aunque sea la entrada T0CKI (Timer 0 Clock Input)
Y mucho menos si éste ha sido configurado como entrada.
Cuando se utiliza como salida, tampoco debe generar ningún tipo de oscilación.
Me explico: si tengo un valor alto (1 lógico) constante y mando a hacer una rutina cuando sea un valor bajo (0 lógico) entra en el ciclo, pero si lo trabajo de manera inversa sigue oscilando, de repente se estabiliza y espera a que le mande el pulso.
¿Cuando te refieres a que tienes un estado lógico alto, a qué pin mandas ese estado?
¿Estás tratando de usar GP2 como entrada y salida?

Para que veas que si funciona, aquí te adjunto el programa y la simulación.
Este programa también funciona perfectamente físicamente.

Espero que nos puedas explicar mejor qué es lo que deseas hacer, porque para simplemente prender un LED por ese pin, ya se te ha explicado.

Por favor, sube el esquema o la simulación, incluyendo tu programa dentro de un archivo comprimido.
 

Adjuntos

  • 12F508 LED en GP2.rar
    25.2 KB · Visitas: 34
Última edición:
Hola amigos gracias por su ayuda, tal cual como mencionaba D@rkbytes era la solucion, simplemente escribir unas lineas en asm y problema resuelto.
movlw 0xC0 ;GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
option

Por lo menos con el 12F508 es la solucion jajaja.

Ahora vengo por la misma duda, pero en este caso para un PIC16F648A

Resulta ser que necesito activar un transistor para hacer funcionar un Relec en el PIN A4, cuya funcion de dicho pin es Bidireccional pero tambien usada para el T0CKL, de que manera puedo definir que esa pata sea una salida?? coloque el mismo codigo asm pero no funciona!

He leido que ese pin cuando es usado como salida, se comporta como un colector abierto, por lo tanto se debe poner una resistencia de pull-up (resistencia externa conectada a un nivel logico de 5 voltios). Por otro lado cuando se usa como salida, la logica es inversa: un "0" escrito a pin del puerto entrega en el pin un "1" logico. Ademas como salida no puede manejar cargas como fuente, solo en el modo sumidero..

Que tan cierto es eso? que significa sumidero para ustedes? y lo otro es que quiere decir que en el codigo en ves de escribir output_high(PIN_A4) para que active el Relec, tengo que poner output_low(PIN_A4)??



Código:
void main(void)
{
   set_tris_a(0b00000100);
   
   output_a(0b00000000);

   #asm
   movlw 0xC0  ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
   option
   #endasm
   while (true)
   {
      if (input(PIN_A2))
      {
         output_high(PIN_A0);
         output_high(PIN_A3);
         delay_ms(500);
         output_low(PIN_A0);
         output_low(PIN_A3);
         delay_ms(500);
         output_high(PIN_A1);
         output_high(PIN_A4);
         delay_ms(500);
         output_low(PIN_A1);
         output_low(PIN_A4);
      }
   }
}
 
Última edición:
Atrás
Arriba