TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: superprp en 21 de Diciembre de 2007, 13:31:43

Título: PIC18 TIMER0
Publicado por: superprp en 21 de Diciembre de 2007, 13:31:43
Buenas, toy usando un PIC de la gama de los 18, y estos tienen en el timer0 la posibilidad de configurar el timer con 16 bits en lugar de 8 bits. Usando este modo, lo configuro para que desborde cada 0.5 segundos, pero me tarda mas de 50 segundos!!, con el máximo de cuenta desbordaría cada 6 segundos o cosa así.. por lo que viendo en el debuger del MPLAB he visto que el valor de TIMER0H no se inmuta, mientras TIMER0L se mueve de forma muy extraña, ya que de vez en cuando se pone el solo a un valor (no determinado por mi). ¿sabeis a que puede ser debido?
Título: Re: PIC18 TIMER0
Publicado por: maunix en 21 de Diciembre de 2007, 15:12:02
Buenas, toy usando un PIC de la gama de los 18, y estos tienen en el timer0 la posibilidad de configurar el timer con 16 bits en lugar de 8 bits. Usando este modo, lo configuro para que desborde cada 0.5 segundos, pero me tarda mas de 50 segundos!!, con el máximo de cuenta desbordaría cada 6 segundos o cosa así..
Para saber en mas detalle, habría que revisar tu código. 


por lo que viendo en el debuger del MPLAB he visto que el valor de TIMER0H no se inmuta, mientras TIMER0L se mueve de forma muy extraña, ya que de vez en cuando se pone el solo a un valor (no determinado por mi). ¿sabeis a que puede ser debido?
El simulador funciona como el micro.  El TMR0H será actualizado cuando escribas en el TMR0L o cuando lo leas, si te fijas el datasheet el funcionamiento del PIC en modo 16bits es ese.  Es para evitar que las transacciones sean por partes (primero el resgistro alto y luego el bajo).  De esa forma, en una sola operación puedes leer/grabar el registro
Título: Re: PIC18 TIMER0
Publicado por: superprp en 21 de Diciembre de 2007, 15:47:40
pero, internamente, ¿el se incrementa? en el stopwatch no se ve que aumente el registro timer0, y además, en la simulación al igual que en el montaje de prueba me tarda 50 segundos en detectar el flag de desbordamiento, es algo muy raro porque no puede contar tanto el timer, aquí pongo el código:
tengo definida una variable sensor y otra contador

        movlw 0x97
   movwf T0CON
   movlw 0xF0
   movwf TMR0H
   movlw 0xBE
   movwf TMR0L
inicio
        btfss PORTB, 0         
   goto x0
   btfss PORTB, 1
   goto _1s
   goto on
x0
   btfsc PORTB, 1
   goto _0.5s
   goto off
fin
        goto inicio




off
   bcf LATC, 6
   bcf LATC, 7
   bcf INTCON, 2         ;reseteo el buffer del TMR0
   goto fin


on
   bsf LATC, 6
   bsf LATC, 7
   bcf INTCON, 2         ;reseteo el buffer del TMR0
   goto fin


_0.5s
   btfss INTCON, 2              ;compruebo si se ha desbordado el TMR0
   goto fin
   btfsc sensor, 0               ;cambia de estado la variable sensor (apagado=0, encendido=1)
   goto ponera0
   goto ponera1
ponera0
   bcf sensor, 0
   goto sigue
ponera1
   bsf sensor, 0
sigue
   btfsc sensor, 0             ;actuo sobre las salidas dependiendo de la variable sensor
   goto off
   goto on


_1s
   btfss INTCON, 2
   goto fin
   btfsc contador, 0
   goto cont0
   goto cont1
cont0
   incf contador
   goto fin
cont1
   decf contador
   goto _0.5s


QUIERO QUE DEPENDIENDO DE RBO,RB1, ME SAQUE EN RC6 Y RC7 O UN 1,1, UN 0,0, O QUE OSCILE DURANTE 0.5SEG O 1SEG
Título: Re: PIC18 TIMER0
Publicado por: maunix en 21 de Diciembre de 2007, 16:05:31
pero, internamente, ¿el se incrementa? en el stopwatch no se ve que aumente el registro timer0, y además, en la simulación al igual que en el montaje de prueba me tarda 50 segundos en detectar el flag de desbordamiento, es algo muy raro porque no puede contar tanto el timer, aquí pongo el código:
tengo definida una variable sensor y otra contador

Esperate , vamos por partes.  El TRM0H internamente se incrementa , siempre y cuando lo tengas en modo 16 bits.
¿El stopwatch? Eso no tiene nada que ver, eso marca el tiempo transcurrido de la simulación pero allí no podras ver el estado el timer0 ni de ningún otro registro.

Creo que tu código es algo incompleto, es decir, si quieres que lo revise y/o simule, te pido que subas el proyecto.  Ando con poco tiempo y ponerme a armar todo para probar eso, sería muy tedioso.  ¿Con qué pic trabajas?

Algo que te ayudará es usar los marcos para código fuente, y es lo siguiente

Pones:

[ code = asm ]

... aquí va tu código

[ /code ]


Título: Re: PIC18 TIMER0
Publicado por: superprp en 21 de Diciembre de 2007, 17:37:23
en el stopwatch es donde veo que a los 50 segundos es cuando se activa el flag de desbordamiento del timer, uso el 18f2331,  donde veo el valor del timer0 es con el watch, lo simulo con el mplab sim, ¿que ves incompleto? así a primera vista ves porque puede ser que tarde tantísimo en entrar en el bucle? ¿alguna cosa que veas mal a primera vista que me pueda ayudar a solucionarlo? muchas gracias.

PD: no te puedo poner todo el código porque es extralargo, esta es la parte en la que uso el timer0, espero que puedas ayudarme aunque sea un poquito, gracias de todas formas
Título: Re: PIC18 TIMER0
Publicado por: maunix en 22 de Diciembre de 2007, 10:02:55
superprp lo que veo es que la lógica del timer viene también supeditada a cómo estén unos pines de entrada.

¿no vendrá por allí el tema?
Título: Re: PIC18 TIMER0
Publicado por: superprp en 22 de Diciembre de 2007, 10:36:49
a que te refieres? los tengo configurados unos como entrada y otros como salida, eso lo tengo correcto, hay algo mas de los pines que deba revisar? alguna configuración de algun puerto?
Título: Re: PIC18 TIMER0
Publicado por: maunix en 03 de Enero de 2008, 16:19:21
a que te refieres? los tengo configurados unos como entrada y otros como salida, eso lo tengo correcto, hay algo mas de los pines que deba revisar? alguna configuración de algun puerto?

Me refiero a que si los pines de entrada (RB0 y RB1) no están en el estado que deben estar la cuenta sigue y sigue (el timer no se detiene) y por eso tal vez estes demorando los 5 segundos que mencionas.
Título: Re: PIC18 TIMER0
Publicado por: superprp en 30 de Enero de 2008, 15:42:32
vamos a ver, yo configuro el timer0 para 16bits, y el solo una vez está inicializado, TMR0 register se incrementa cada ciclo de instrucción, hasta ahí bien, se va incrementando poco a poco el TMR0L que es la parte baja de TMR0, pero cuando llega a FF y le toca el paso a TMR0H éste no se incrementa, es decir, TMR0 pasa de por ejemplo:

TMR0 EEFF

EN EL SIGUIENTE CICLO DE INSTRUCCIÓN A:

TMR0 EE00

y debería ser:

TMR0 EF00

lo que viene a ser que TMR0H no se incrementa y TMR0L si, y ya no se como hacerlo, porque así nunca me llega a desbordar TMR0IF, ¿alguna idea de porque puede ser?
Título: Re: PIC18 TIMER0
Publicado por: PerriPic en 30 de Enero de 2008, 16:01:46
LLevo varios dias con el mismo problema pero con el timer1 y tp sé como solucionarlo.Espero q alguna alma caritativa nos eche una mano...
Título: Re: PIC18 TIMER0
Publicado por: maunix en 30 de Enero de 2008, 16:35:20
LLevo varios dias con el mismo problema pero con el timer1 y tp sé como solucionarlo.Espero q alguna alma caritativa nos eche una mano...

En tu código probá leer el registro TMR1L y verás como el TMR1H se actualiza.

Título: Re: PIC18 TIMER0
Publicado por: superprp en 30 de Enero de 2008, 16:50:34
pero si el timer0 va solo aumentando cuando realizo la lectura de tmr0L para que tmr0H se actualice???? cuando tmr0L llegue a FF??
Título: Re: PIC18 TIMER0
Publicado por: maunix en 30 de Enero de 2008, 16:58:48
pero si el timer0 va solo aumentando cuando realizo la lectura de tmr0L para que tmr0H se actualice???? cuando tmr0L llegue a FF??

Recién me mencionaste el timer1  y ahora el timer 0.

El registro H del timer se actualiza , pero no lo vas a ver actualizado hasta no leer el TMR0L porque en modo 16bits se leen de una sola vez, en un solo paso y el contenido del TMRxH interno se copia al TMRxH que vos lees con una operación de lectura sobre el TMR0L

En cuanto al momento de la lectura, lo podes leer cuando quieras.

Título: Re: PIC18 TIMER0
Publicado por: PerriPic en 30 de Enero de 2008, 17:48:59
A mi ahora me va perfectamente, asi q muxas gracias x tu consejo.

Ahora viene otro problema, yo kiero utilizar el timer1 para q me cuente 1min y mientras q cuenta no hago nada, asi q kiero poner el micro a dormir y q despierte con cada interrupcion hasta llegar al minuto.¿como hago eso?xq si pongo el readtimer1 despues del sleep no va a actualizar el timer1 mientras duerme.mi codigo es este:(solo la parte de iniciar el timer y mandar a dormir)

   OpenTimer1(TIMER_INT_ON &
            T1_16BIT_RW &
            T1_SOURCE_INT &
            T1_PS_1_2 &
            T1_OSC1EN_OFF &
            T1_SYNC_EXT_OFF);
   
   RCONbits.IPEN = 0;                  //Deshabilito la prioridad en las interrupciones
   INTCONbits.PEIE=1;                  //Habilito todas las interrupciones
   INTCONbits.GIE=1;                  //Habilito todas las interrupciones


//   Comando_LCD(CLEAR);                  //Borro LCD
   
/******************************************************************************
PASAMOS LOS DATOS DE LA PROGRAMACION
*******************************************************************************/

   while (TIEMPO<TIEMPO_MAX)
   {
//      Comando_LCD(DOFF);                  //Borro LCD
      ReadTimer1 ();
      Sleep();

   }

Si kito el sleep() va perfectamente...
Título: Re: PIC18 TIMER0
Publicado por: maunix en 31 de Enero de 2008, 08:33:27
Qué pic estás usando ? Te lo pregunto para saber qué eventos hacen despertar a ese modelo de pic de un sleep.

Hasta ahora no he usado el sleep en mis aplicaciones ya que hasta ahora las mismas deben esta siempre disponibles (y no hay problemas de consumo ni mucho menos, de hecho el pic consume menos del 1% de lo que consume todo lo demás).

De todas formas podemos ir viendo juntos cómo encontarle la vuelta a tu problema.

Saludos
Título: Re: PIC18 TIMER0
Publicado por: superprp en 31 de Enero de 2008, 09:14:22
he de pensar pues que mi problema puede que sea de configuración, me podeis indicar todos los bits que he de configurar para que con el timer0 me salte el bit TMR0IF ?? porque si no no se a que puede ser debido...
Título: Re: PIC18 TIMER0
Publicado por: maunix en 31 de Enero de 2008, 09:40:01
he de pensar pues que mi problema puede que sea de configuración, me podeis indicar todos los bits que he de configurar para que con el timer0 me salte el bit TMR0IF ?? porque si no no se a que puede ser debido...

Elige un pic y sube el código que hayas hecho (en un .zip o con el marco [ code ] [ / code ] si el timer está andando el flag debe encender si o sí.
Título: Re: PIC18 TIMER0
Publicado por: PerriPic en 01 de Febrero de 2008, 10:08:32
Utilizo el 18F2550 y s la primera vez q utilizo el trimer1 y el sleep. He leido todo lo q he visto en el data sheet y el timer1 creo q lo he configurado bien, aunq tendré q hacer los calculos mejor para q me funione como kiero.En cuanto al sleep el problema es q no sé como funciona.Como x ejemplo no sé si hay q hacer algo primero antes de utilizarlo, xq yo creía q con la interrupcion se despertaría, pero al tener q leer el timer1 para q cuente a 16 bits...No sé, seguiré investigando!!!Y gracias x el ofrecimiento para ayudarme, q nunca está de más!!!

Para superprp, decir q yo lo único q e puesto ha sido las habilitaciones de interrupciones general y de perifericos, con los bits GIE y PEIE.Prueba a hacerlo si s q no lo habias exo ya!!!
Título: Re: PIC18 TIMER0
Publicado por: superprp en 01 de Febrero de 2008, 11:38:51
Ya he solucionado el problema!!!! lo que me pasaba es que le metía un valor al timer0, me desbordaba la primera vez pero luego seguía contando el timer sin volver a inicializarlo, y se tenía que recorrer los 16 bits  con el prescaler de 256 enteritos, y no me contaba el medio segundo que kería, vamos, que me faltaba reinicializar el timer cada vez que detectaba el TMR0IF

Lo de que no me aumentaba el TMR0H era porque en watch veía el TMR0, y ahí no se actualiza si no realizas una lectura de TMR0L, pero hay otro registro el TMR0_internal que ese si que se ve como aumenta el TMR0, asi que muchas gracias por vuestra ayuda y problema solucionado
Título: Re: PIC18 TIMER0
Publicado por: maunix en 01 de Febrero de 2008, 13:34:28
Utilizo el 18F2550 y s la primera vez q utilizo el trimer1 y el sleep. He leido todo lo q he visto en el data sheet y el timer1 creo q lo he configurado bien, aunq tendré q hacer los calculos mejor para q me funione como kiero.En cuanto al sleep el problema es q no sé como funciona.Como x ejemplo no sé si hay q hacer algo primero antes de utilizarlo, xq yo creía q con la interrupcion se despertaría, pero al tener q leer el timer1 para q cuente a 16 bits...No sé, seguiré investigando!!!Y gracias x el ofrecimiento para ayudarme, q nunca está de más!!!

Para superprp, decir q yo lo único q e puesto ha sido las habilitaciones de interrupciones general y de perifericos, con los bits GIE y PEIE.Prueba a hacerlo si s q no lo habias exo ya!!!

perripic, como te he mencionado no he usado el sleep pero te puedo comentar que si no te funciona es casi seguro que es porque algo lo está despertando.

fijate enel datasheet y te comentará qué eventos lo despiertan.  será tu tarea deshabilitar los que no quieres que lo hagan y habilitar los que quieres que sí lo hagan, previo a ejecutar la instrucción sleep.

Título: Re: PIC18 TIMER0
Publicado por: maunix en 01 de Febrero de 2008, 13:36:07
Ya he solucionado el problema!!!! lo que me pasaba es que le metía un valor al timer0, me desbordaba la primera vez pero luego seguía contando el timer sin volver a inicializarlo, y se tenía que recorrer los 16 bits  con el prescaler de 256 enteritos, y no me contaba el medio segundo que kería, vamos, que me faltaba reinicializar el timer cada vez que detectaba el TMR0IF

Lo de que no me aumentaba el TMR0H era porque en watch veía el TMR0, y ahí no se actualiza si no realizas una lectura de TMR0L, pero hay otro registro el TMR0_internal que ese si que se ve como aumenta el TMR0, asi que muchas gracias por vuestra ayuda y problema solucionado

superprp algo que quiero aclarar por si no quedó claro.  El tmr0h SIEMPRE se incrementa , lo que puede ocurrir es que no lo veas, para verlo debes hacer el read pero internamente siempre se incrementa.

Lo quiero aclarar por si no se entendió mi explicación anterior.  Leer el TMR0L para ver como se actualiza el TMR0h es un "truquito" para verlo en el simulador pero siempre se anda incrementando.