Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/10/2014 #1


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
03/10/2014 #2
Moderador

Avatar de D@rkbytes

jesusbarazartem dijo: Ver Mensaje
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.
03/10/2014 #3

Avatar de papirrin



probaste poner:

#byte option= 0XC0
03/10/2014 #4


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);
      //}
   }
}
---------- Actualizado después de 5 minutos ----------

papirrin dijo:
probaste poner:

#byte option= 0XC0
No tampoco funciona, de verdad no se que hacer...
03/10/2014 #5

Avatar de papirrin

ya intentaste definir el registro TRISGPIO?

no veo que los definas, aunque al poner el output lo deberia cambiar...
03/10/2014 #6


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
03/10/2014 #7

Avatar de papirrin

mmm... pues con ese codigo deberia estar oscilando que quieres hacer?
03/10/2014 #8


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..
03/10/2014 #9

Avatar de papirrin

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)
03/10/2014 #10
Moderador

Avatar de D@rkbytes

jesusbarazartem dijo: Ver Mensaje
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:
#include <12f508.h>
#fuses   nomclr
#use     delay(internal = 4MHz)

void main (void)
{

#asm
   movlw   0xC0 ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
   option
#endasm

   output_high(pin_b2);
   delay_ms(500);

   while(true)
      {
         output_toggle(pin_b2);
         delay_ms(500);
      }
}
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:
#include <12f508.h>
#fuses   nomclr
#use     delay(internal = 4MHz)

#byte    osccal = getenv("SFR:OSCCAL")

void main (void)
{

#asm
   movlw   0xC0  ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
   option
#endasm

   osccal = 0x32;

   output_high(pin_b2);
   delay_ms(500);

   while(true)
      {
         output_toggle(pin_b2);
         delay_ms(500);
      }
}
Aquí unas imágenes leyendo el valor de backup de OSCCAL:

Con WinPic800


Con PICkit 3



El valor vendría siendo 0x32, ya que C32 es un movlw 0x32

Suerte.
Imágenes Adjuntas
Tipo de Archivo: jpg OSCCAL 12F508 (WinPic800).jpg (5,5 KB (Kilobytes), 72 visitas)
Tipo de Archivo: jpg OSCCAL 12F508 (PICkit 3).jpg (72,2 KB (Kilobytes), 74 visitas)
Tipo de Archivo: jpg OSCCAL 12F508 (PICkit 3) 002.jpg (59,9 KB (Kilobytes), 72 visitas)
03/10/2014 #11


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..
03/10/2014 #12

Avatar de papirrin

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?

TOSCKI = Clock input to TMR0
06/10/2014 #13


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...
06/10/2014 #14
Moderador

Avatar de D@rkbytes

jesusbarazartem dijo: Ver Mensaje
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.
jesusbarazartem dijo: Ver Mensaje
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.
Archivos Adjuntos
Tipo de Archivo: rar 12F508 LED en GP2.rar (25,2 KB (Kilobytes), 29 visitas)
10/11/2014 #15


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)??

---------- Actualizado después de 18 minutos ----------

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);
      }
   }
}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.