TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: paco1980 en 27 de Abril de 2007, 11:51:55

Título: configurando timer1 externo
Publicado por: paco1980 en 27 de Abril de 2007, 11:51:55
Os parecerá una tontería, pero es la primera vez que intento hacerlo y no se como empezar.
Vamos a ver, como lo que quiero es utilizar un cristal externo para temporizar por timer 1 y así poder poner el pic en modo sleep, lo que necesito es configurar el timer 0 interno para que trabaje a 32kHz, y así poner el pic al menor consumo. y es que no tengo ni idea de como hacerlo.
Podrian ayudarme?
Gracias.
Título: Re: timer 0 interno.
Publicado por: micro_cadaver en 03 de Mayo de 2007, 20:11:18
una pregunta mñas, para que pic es? gama 16 o gama 18? supongo q es en CCS o C18?
Título: Re: timer 0 interno.
Publicado por: paco1980 en 04 de Mayo de 2007, 06:00:56
Es un 16f917.
Creo que ya se como hacerlo, pero hasta que no consiga dicho pic no puedo probarlo, ya que ahora solo dispongo del 16f877, y ese no lleva oscilador interno.
Lo que más me trae de cabeza es lo del timer 1.
Ya que quiero configurarlo como contador asíncrono externo, y los pulsos introducirlos con un cristal externo.
¿Esto puede ser?
¿Tienes idea?
Nota: todo esto es para desbordar el timer 1 estando el pic en SLEEP.
Un saludito y gracias.
Título: Re: timer 0 interno.
Publicado por: vszener en 04 de Mayo de 2007, 20:46:40
Te estás liando bastante, a ver, si quieres que el timer1 funcione como contador de pulsos externos, no te hace falta ningun cristal.

En cambio, si quieres usar el timer1 como una rtc o que sea la fuente de reloj para otros periféricos, se le puede enchufar un cristal de externo.


Suerte!!! ;)
Título: Re: timer 0 interno.
Publicado por: micro_cadaver en 05 de Mayo de 2007, 02:58:03
hola segun lo que lei del datasheet de ese pic, si se puede desbordar asyncronamente el timer1 para despertarlo por overflow del sleep.  :-/ cual es el sigueinte paso?
Título: Re: timer 0 interno.
Publicado por: paco1980 en 07 de Mayo de 2007, 11:20:18
No se si estaré equivocado. Lo que yo pretendía era colocarle un cristal a los pines correspondientes del timer 1. ( De forma similar a como se coloca el típico cristal para timer 0). y poder calcular tiempos mientras el pic esté durmiendo.
Pero he probado y no consigo que me haga nada. ¿ Es factible lo que quiero hacer?.
Un saludo.
Título: Re: timer 0 interno.
Publicado por: micro_cadaver en 07 de Mayo de 2007, 14:33:48
??? un cristal? no amigo en ese pin se coloca una entrada de pulsos de reloj (1 y 0) el datasheet no se refiere a poner un cristal ese va en los repetivos pines OSC1 OSC2  :-/ derepente no te entendi, mejor mandanos un pantallazo de tu  circuito a ver que estas haciendo  :mrgreen:
Título: Re: timer 0 interno.
Publicado por: garopa en 07 de Mayo de 2007, 21:59:38
Manejo de los timers en c:

#INT_TIMER1
void interrupcion_timer1()
{
   setup_timer_1(T1_DISABLED);
}

#ZERO_RAM
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

enable_interrupts(int_timer1);
   enable_interrupts(global);

 set_timer1(64429);
sleep();
   LCD_PUTC("\fz"); //Esto lo uso para ver si se interrumpe o no, faltaría el include del lcd y el lcd_init() y todo eso que tb lo tengo puesto
}


Ejemplo Basico del funcionamiento.
Suerte.
Título: Re: timer 0 interno.
Publicado por: paco1980 en 08 de Mayo de 2007, 04:03:22
Pero para una entrada de pulsos de reloj, ya hay que poner otro componente en el circuito, y por lo tanto, el consumo que logras bajar durante el sleep, te lo estas comiendo por otra parte con este dispositivo.
¿no es así?.
Título: Re: timer 0 interno.
Publicado por: micro_cadaver en 08 de Mayo de 2007, 09:42:01
sip, aqmigo podrias colgar tu circuito? para darte mas luces sobre tu asunto :-/
Título: Re: timer 0 interno.
Publicado por: paco1980 en 09 de Mayo de 2007, 07:39:25
(http://)
Título: Re: timer 0 interno.
Publicado por: paco1980 en 09 de Mayo de 2007, 07:40:39
como se insertan las imágenes?
es que no se como colgar el circuito
Título: Re: timer 0 interno.
Publicado por: paco1980 en 09 de Mayo de 2007, 07:53:05
Bueno, como no se mandar imágenes, probaré con los srchivos adjuntos.
En la imagen que envío solo aparece el pic 18f4331 (he puesto este, pero puede ser que utilice el 16f917, según el que localice antes).
Le he puesto dos cristales, uno para el timer 0 ( El cual voy a intentar programar para poder suprimirlo, y otro para que el timer uno reciba pulsos durante el sleep. Creo que es bastante sencillo. ¿ Con este esquema recibiría el timer 1 pulsos desde este cristal?. Y de ser así, como se programaría el timer 1?
Gracias y un saludo.
Título: Re: timer 0 interno.
Publicado por: micro_cadaver en 09 de Mayo de 2007, 11:39:48
pues viendo el datasheet del 18F4331 observo que tu circuito esta correcto  :-/  en cuanto a la programación te sugiero que leas la parte del timer1 y nos posteas tus dudas despues de su respectiva lectura,

RA7-RA6:
(http://img177.imageshack.us/img177/4324/39102442lg7.jpg)


RC0-RC1:
(http://img151.imageshack.us/img151/6003/65230067ab2.jpg)


ahora segun el data sheet del pic 16F917 estos pines estan juntos  :? o mejor dicho conmutados asi:
(http://img408.imageshack.us/img408/5458/66228205on7.jpg)
y lei el timer1 y no hay mucha info, decia algo de un crital interno de 32.768khz  :-) se puede hacer mucho con ese cristal jejeje , primero define con que pic vas a aplicar tu idea y entonces atacamos el problema . exitos amigo!!! no sabia de esa cualidad jejejej leyendo tu post me acabo de enterar de eso.  :)


PD: para subir imagenes primero debes registarte en alguna pagina internet que te permita alojar las imagenes en linea, por ejemplo hay las gratuitas como http://imageshack.us/ yo me suscribi (es gratuito) y listo, te aparece una barra en tu navegador para subir tus imagenes desde tu pc o desde cualquier pagina mientras estas navegando, luego una vez que subes la imagen copias el link : DIRECT LINK

(http://img518.imageshack.us/img518/108/23641972dn3.jpg)
y listo luego pegas la imagen haciendo cliclk en el boton " insertar imagen  " , te sale esto

Código: [Seleccionar]
[img]  [/img]
y colocas el link copiado entre los img

Código: [Seleccionar]
[img]http://img408.imageshack.us/img408/5458/66228205on7.jpg[/img]




Título: Re: timer 0 interno.
Publicado por: paco1980 en 09 de Mayo de 2007, 12:12:33
Gracias micro-cadaver.
Como ya he dicho en ciertas ocasiones, no me manejo bien ni con el ensamblador, ni con el ingles.
Según el datasheet del 18f4331, y si no lo he entendido mal, el timer1 , con un cristal externo como el de la imagen que mandé. puede funcionar durante el sleep. (vamos a basarnos en el 18f4331. ok?). pero no sé que funciones del ccs debo utilizar para configurarlo como tal, ni para trabajar con el. Eso es lo que me gustaría saber, con que funciones puedo programarlo. Ya que solo se configurarlo como contador interno.
Gracias.
 
Título: Re: timer 0 interno.
Publicado por: micro_cadaver en 09 de Mayo de 2007, 12:26:58
bueno en este momento no tengo a la mano el datasheet pero creo recordar que si es posible la interrupcion durante el sleep, ahora para el pic de la gamma 18F yo uso el C18, pero el CCs solo lo utilizo para la gamma 16F y 12F, si recien tas comenzando podriamos evaluar tu promocion a C18  :mrgreen:
Título: Re: timer 0 interno.
Publicado por: paco1980 en 09 de Mayo de 2007, 13:33:29
Pero creo que la configuración para lo que quiero hacer con el timer1 es similar tanto para 16f como para 18f.
Podrías intentar implementarlo para 16f917 por ejemplo?
Yo lo intenté pero no lo conseguí. Y es lo que quiero, algun ejemplo de como se podría hacer en ccs.
Ten en cuenta que no manejo el lenguaje ensamblador, y me podría volver loco intentando en ensamblador acceder a los bancos del uC para poner uno u otro bit a uno según la configuración necesaria.
Aunque yo lo desconozco, creo que con las funciones de ccs se debería de hacer sin ningún problema. (Creo).
Un saludo.
Título: Re: timer 0 interno.
Publicado por: micro_cadaver en 09 de Mayo de 2007, 16:07:33
ya pes voy a revisar como se puede configurar eso en CCS y te comento. hasta mas luego  :-/
Título: Re: timer 0 interno.
Publicado por: PalitroqueZ en 09 de Mayo de 2007, 18:39:57
Gracias micro-cadaver.
Como ya he dicho en ciertas ocasiones, no me manejo bien ni con el ensamblador, ni con el ingles.
Según el datasheet del 18f4331, y si no lo he entendido mal, el timer1 , con un cristal externo como el de la imagen que mandé. puede funcionar durante el sleep. (vamos a basarnos en el 18f4331. ok?). pero no sé que funciones del ccs debo utilizar para configurarlo como tal, ni para trabajar con el. Eso es lo que me gustaría saber, con que funciones puedo programarlo. Ya que solo se configurarlo como contador interno.
Gracias.
 

puedes leerte la función compilada set_timer1 en la ayuda ccs_c_manual.pdf pag 63 y en los parametros buscarte el archivo 18f4331.h que está en el directorio picc, (si es que el ccs soporta este micro)


PD: el título de post no corresponde a tu pregunta ¿o me equivoco?
Título: Re: timer 0 interno.
Publicado por: PalitroqueZ en 10 de Mayo de 2007, 17:11:24
Es un 16f917.
Creo que ya se como hacerlo, pero hasta que no consiga dicho pic no puedo probarlo, ya que ahora solo dispongo del 16f877, y ese no lleva oscilador interno.
Lo que más me trae de cabeza es lo del timer 1.
Ya que quiero configurarlo como contador asíncrono externo, y los pulsos introducirlos con un cristal externo.
¿Esto puede ser?
¿Tienes idea?
Nota: todo esto es para desbordar el timer 1 estando el pic en SLEEP.
Un saludito y gracias.


después de ver porque en el proteus, no funcionaba el timer1 como osc externo. me dí cuenta de una cosa:

parece que el cristal no funciona en este caso, este es el código simulado:

Código: C
  1. //---------------------------------------------
  2. // usando el timer1 como osc externo e interrumpiendo
  3. // en modo sleep
  4. //---------------------------------------------
  5. #include <16F877a.h>
  6.  
  7. #fuses XT,NOPROTECT,NOPUT,NOWDT,NOBROWNOUT,NOLVP,NOCPD
  8. #use delay (clock=4000000)
  9.  
  10. //*************************************************
  11. #INT_TIMER1  // rutina de servicio de interrupcion
  12. void mitimer(){
  13.    delay_cycles(1);  // pegar un punto de ruptura
  14. }
  15. //*************************************************
  16. void main(){
  17.    set_tris_a(0x0);
  18.    set_tris_b(0x0);
  19.    set_tris_c(0b0);
  20.    set_tris_d(0x0);
  21.    set_tris_e(0x0);
  22.    set_timer1(0x7fff);
  23.    setup_timer_1(0b1111);  
  24.    // pre=1:1                (T1CKPS1:T1CKPS0=0)
  25.    // osc externo habilitado  (T1OSCEN=1 y TMR1CS=1)
  26.    // clock entrada asincrono (/T1SYNC=1)
  27.    // enciendo el timer1 ()    (TMR1ON=1)
  28.    
  29.    enable_interrupts(INT_TIMER1);  //selecciono la f. interr. del timer1
  30.    enable_interrupts(GLOBAL);     // enciendo el sistema de interr.
  31.    sleep();
  32.    while(1){ // bucle eterno
  33.       delay_cycles(1);
  34.    } // fin del while
  35. } // fin del main

como está configurado para incrementar desde la frec. del oscilador externo, entonces cada incremento del TMR1 se llevará 1/Fosc externo, entonces para un prescaler de 1:1
y una frecuencia de 32768 para cada desbordamiento (arrancando desde 0) del tmr1 tenemos 2 segundos (1/32768 x 65536). para tener 1 segundo basta cargar al tmr1 la mitad
65536/2 -> 32768 que viene siendo el mismo valor del cristal

está simulado con/sin el sleep y funciona ok

(http://img520.imageshack.us/img520/3971/vertk2.th.jpg) (http://img520.imageshack.us/my.php?image=vertk2.jpg)

en la imagen se observa que cambié el cristal por un clock conectado a T1OSI

ojo, esto es una mera simulación, faltaría corroborarlo en el protoboard.
Título: Re: timer 0 interno.
Publicado por: paco1980 en 11 de Mayo de 2007, 04:02:12
gracias palitroquez.
Pero entonces por lo que me comentas, no pudiste hacerlo funcionar con cristal externo?. Puff, vaya tela.
El caso es que yo se que se puede hacer, pero no se como.

Lo conseguiremos, jajaj
Título: Re: timer 0 interno.
Publicado por: PalitroqueZ en 11 de Mayo de 2007, 12:59:40
Hola paco1980

yo creo que así como está debería funcionar en el protoboard, porque el inversor interno está activado.

en el proteus yo me valgo de esa artimaña, por eso digo que sería cuestión de montarlo y probar... no lo hago pues ya tengo otro montaje y se me acabó el espacio  :(
Título: Re: timer 0 interno.
Publicado por: paco1980 en 11 de Mayo de 2007, 14:10:19
ok. Gracias pedro.
Lo montaré en la protoboard y te comento.
Espero la semana que viene despejar esta duda tan pesada.
Un saludo
Título: Re: timer 0 interno.
Publicado por: PalitroqueZ en 11 de Mayo de 2007, 15:03:50
paco no olvides de agregarle al código otras cosas, por ejemplo que se encienda un led´s al segundo por ejemplo y cambiarle el micro por el que vayas a usar.


nos cuentas después...
Título: Re: timer 0 interno.
Publicado por: paco1980 en 25 de Mayo de 2007, 16:59:58
Hola amigo. Ya era hora que respondiera, pero estaba de viaje y hasta ahora no e podido probar.
Para empezar te doy la enhorabuena porque eres un fenomeno. Ya tengo el pic durmiendo, y saliendo del sleep por el timer1 para hacer lo que quiera.
Ahora viene lo gracioso.... Resulta que al final el único pic que he podido conseguir para trabajar con nanowats es el pic 18f4431, y resulta que la única configuración para permitir que el timer1 despierte al pic del sleep es la que me diste, pero lo gracioso es que no necesito ningún cristal. Por lo que se ve, este pic se despierta con el timer1 funcionando internamente, y el caso es que en el datasheet aparece que hay que implementar un cristal externo. Jajaja, esto es la caña.
Resulta que tengo el micro en sleep consumiendo menos de 7uA y cuando se desborda el timer1 me obedece. (No hay ningún cristal externo en ningún sitio).


 #include <18F4431.h>
  #fuses xt,t1lowpower,mclr,NOPROTECT,noPUT,NOWDT,NOBROWNOUT,LVP
  #use delay (clock=31000)
  #byte port_a  = 5
 
  #byte port_e  = 9
  #use fast_io(a)
   //*************************************************
   #INT_TIMER1  // rutina de servicio de interrupcion
   void mitimer(){
   disable_interrupts(global);
      output_toggle(pin_a0);
      set_timer1(0xf900);
      enable_interrupts(global);
      }
   //*************************************************
   void main(){
     
      set_tris_a(0x00);
      set_tris_b(0xf0);
      set_tris_c(0x00);
      set_tris_d(0x00);
      set_tris_e(0x00);
     
      setup_timer_1(0b1111);   
      set_timer1(0xf900);
      enable_interrupts(int_timer1);
      enable_interrupts(global);
 
     
      for(;;){
      sleep();
      }
     
     }

A costado pero sin entenderlo muy bien, ya está soluocionado.
Ahora que avanzo me salen ciertos problemas que pondré en un post nuevo si difiere del título de este.
Por cierto. GRACIAS PALITROQUEZ Y A TODOS LOS QUE HAN APORTADO SUS IDEAS Y CONOCIMIENTOS.

NOTA: ¿de donde eres palitroquez?

Un saludo.
Título: Re: timer 0 interno.
Publicado por: PalitroqueZ en 26 de Mayo de 2007, 14:20:44
Hola paco1980.

me alegro que te funcionara, aunque no entendí como lo hiciste!!!

¿como es posible que el timer1 cuente sin una base de tiempos?

según la configuración:

setup_timer_1(0b1111);   

debería tomar los pulsos del cristal externo, para incrementar el par TMR1H:TMR1L

¿qué significa el fuse t1lowpower?


ahh.... ya vá... estoy viendo que colocaste como base de tiempos para el micro = 31Khz

pero, no debería ser así, esta frecuencia que declaras:

#use delay (clock=31000)

no tiene que ver con el timer1 externo asíncrono, ¿¿?? mas dudas tengo


...
NOTA: ¿de donde eres palitroquez?
...

Saludos desde la República Bolivariana de Venezuela  :mrgreen:
Título: Re: timer 0 interno.
Publicado por: paco1980 en 26 de Mayo de 2007, 16:20:32
Citar
¿qué significa el fuse t1lowpower?
según css, es una configuración del timer1 para trabajar en low power cuando el micro está en sleep.(de esta manera consigo un consumo tan bajo. o al menos eso creo, porque ya no se que pensar.jajaj).
Respecto al #use delay(31khz), tendré que decirle al micro de alguna manera a que frecuencia quiero que me haga los retardos. no?
de todas formas, El programa funciona igual tanto con el fuse XT, como con INTRC, que es lo que no entiendo, la única diferencia, es que si implemento el programa con INTRC en vez de XT, el consumo es mayor.
Como ya te comenté, estoy algo perdido, porque no comprendo como funciona de esta manera sin cristal ni nada. Es que ni si quiera le digo que use los osciladores internos.
Mañana seguiré con el tema, y ya te comento, ok?
Un saludo.
Título: Re: timer 0 interno.
Publicado por: PalitroqueZ en 26 de Mayo de 2007, 16:32:14
si, hay que revisar los SFR para ver si estan cambiando como deben.

por cierto, sería buena idea que cambiaras el título del tema que se relacione con el timer1, pués ya terminamos hablando de éste  :D
Título: Re: timer 0 interno.
Publicado por: paco1980 en 26 de Mayo de 2007, 16:43:55
Citar

por cierto, sería buena idea que cambiaras el título del tema que se relacione con el timer1, pués ya terminamos hablando de éste  :D
ok, solo tienes que decirme como hacerlo, ya que no utilizo las opciones del foro y las desconozco.
Que título crees que convendría?

Por cierto, me has ayudado mucho y me gustaría compartir contigo algunas dudas que mañana tendré más claras, y como no soy de los que tengan mucha paciencia, me gustaría agregarte a mi messenguer, ¿me lo permites?.
Un saludo.
Título: Re: timer 0 interno.
Publicado por: PalitroqueZ en 26 de Mayo de 2007, 16:55:29
el título podría ser "configurando el timer1 externo" algo que relaciones al timer1 como contador externo. Fijate que por allí el amigo PICmouse tiene un tema donde se expone una duda similar.

...
me gustaría agregarte a mi messenguer, ¿me lo permites?.


dale no hay problemas, pero será pa´l lunes en adelante, mañana no estaré (el ciber no trabaja los domingos   :()



Título: Re: configurando timer1 externo
Publicado por: paco1980 en 30 de Mayo de 2007, 18:00:34
CORRECCION!!!
El programa funciona perfectamente con un cristal externo entre los pines del timer1.
La confusión ha sido debida, a que si le quito el cristal, el timer1 sigue contando y desbordandose, aunque es como si lo hiciera a una frecuencia parecida a 50Hz.
Sorprendente, no?.
Un saludo.
Título: Re: configurando timer1 externo
Publicado por: diegol_2006 en 07 de Febrero de 2012, 19:12:49
Buenas les escribo para dar las gracias Palitroquez, paco1980 y todos los que intervinieron en este post, casi 5 años despues me fue de mucha ayuda  :mrgreen:

tengo una pequeña duda de relación como yo siempre lo hacia.

   setup_timer_1 (0b1111); es igual a decir setup_timer_1(t1_external | t1_div_by_1 | t1_clk_out) o me equivo. Saludos!!!!