Autor Tema: Ayuda con Timer1 y CCS  (Leído 9589 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sepul

  • PIC10
  • *
  • Mensajes: 25
Ayuda con Timer1 y CCS
« en: 02 de Marzo de 2007, 08:23:42 »
Hola!Estoy realizando un proyecto con los PICs 18F4550 y modbus y para controlar los tiempos de modbus estoy teniendo problemas con el timer1. Me había empezado a funcionar el timer1, pero después no se que he borrado en el código que me ha dejado de funcionar. En principiocreo que para que funcione el Timer sería algo así:

Código: [Seleccionar]
#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
}



En resumen, este sería el código para que funcione el Timer1, no sé que se me escapa, porque no se me está interrumpiendo el Timer.
¿De qué me estoy olvidando?Es que me mosquea, porque ya digo que me empezo a funcionar bien, pero luego he borrado algo (pero a posteriori del codigo de funcionamento del Timer1 y ahora ya no me va)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con Timer1 y CCS
« Respuesta #1 en: 02 de Marzo de 2007, 09:00:31 »
Veo que configuras el timer1 en sus modos, ¿pero donde lo enciendes?

Cómo queda el T1CON luego de

Código: C
  1. setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ayuda con Timer1 y CCS
« Respuesta #2 en: 02 de Marzo de 2007, 09:40:37 »
Si no recuerdo mal, cuando el pic entra en estado sleep, no se puede despertar mediante el timer, ya que también quedan 'congelados', quita la instrucción sleep.

En CCS el timer1 se activa con la instrucción enable_interrupts(int_timer1); y posteriormente se habilitan todas las interrupciones con la instrucción enable_interrupts(global);

Una recomendación, carga antes el timer y después activalo


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado sepul

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda con Timer1 y CCS
« Respuesta #3 en: 02 de Marzo de 2007, 13:39:54 »
Gracias por la ayuda!
Os cuento: Probé a hacer lo que dice vszener de quitar el sleep y activar las interrupciones despues de cargar el timer, pero sigue sin interrumpirse.
Respecto a lo que decís de encender el timer, según entendí al leer el manual del CCS con la instruccion set_timer1(valor) ya se carga y se pone en marcha.
Respecto al registro T1CON, no tengo ni idea de cómo queda configurado, es una de las cosas que no entiendo del CCs, cómo se puede leer el valor de los registros, pero según el manual, ya debería de quedar bien configurado.

Hice un programa sencillo de todo para probarlo, que a continuación os pongo entero:

Código: [Seleccionar]
#include <18F4550.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
[u]#FUSES NOLPT1OSC                  //Timer1 configured for low-power operation[/u]
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1                     //No PLL PreScaler

#use delay(clock=12000000)


#int_TIMER1
TIMER1_isr()
{
   setup_timer_1(T1_DISABLED);

}



#define LCD_TYPE 2
#include <lcd.c>
void main()
{
   lcd_init();



   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);

   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   setup_oscillator(False);

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

   // TODO: USER CODE!!
   LCD_PUTC("\fINICIO");


   set_timer1(50000);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   sleep();
   LCD_PUTC("\nok");
   WHILE(1);

}


El fuse que he marcado supongo que será así, ya que estoy usando el oscilador interno para el timer.

Y decir que el programa me queda en "INICIO" según el lcd.

No tengo ni idea qué es lo que falla.
« Última modificación: 02 de Marzo de 2007, 13:42:44 por sepul »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con Timer1 y CCS
« Respuesta #4 en: 02 de Marzo de 2007, 14:55:20 »
Amigo, te han dicho que remuevas la instrucción sleep y ahí la has vuelto a agregar... ;)

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado sepul

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda con Timer1 y CCS
« Respuesta #5 en: 02 de Marzo de 2007, 15:25:45 »
maunix, ya lo sé, y he probado a ponerle un while(1) en vez del sleep y sigue sin interrumpirse. Después he probado poniendo:

Código: [Seleccionar]
#bit TMR1ON=0xFCD.0
Es el bit que inicia el Timer1 en el registro.

Y poniendo TMR1ON=1 despues del set_timer1();

y así si que se interrumpe, pero luego claro, me queda clavado en el while (1) o en el sleep(); y nunca me escribe en el lcd la instruccion "ok".

Yo supongo que tendrá que haber alguna forma para meter al micro en modo bajo consumo y que se interrumpa con el flag de interrupción del timer, ¿no?Es que para el proyecto grande me sería mucho mejor hacerlo de esta forma.Algo tiene que estar fallando, pero no logro verlo.

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ayuda con Timer1 y CCS
« Respuesta #6 en: 02 de Marzo de 2007, 15:30:47 »
Vamos a ver que nos aclaremos, quitando la instrucción sleep(); debe funcionar teóricamente.

El micro no se despierta del estado sleep mediante el timer, lo indica el data sheet.

Aparte, si que te enrará una vez, sólamente, en la interrupción, lo que pasa, que en dicha interrupción tienes puesto la instrucción de desactivar el timer1, así que no te entrará más.

Prueba con quitar la instrucción sleep(); (es obligatorio para que pueda el micro abordar la interrupción del timer), y ponerle en la rutina de interrupción, el intercambio de estado de, por ejemplo, un led.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda con Timer1 y CCS
« Respuesta #7 en: 02 de Marzo de 2007, 15:31:54 »
Bueno, las cosas que veo.

1) No has hecho arrancar a el timer, por eso hacer TMR1ON lo ha hecho andar y que se produzca la interrupción. (si te fijas es lo que puse en mi primera respuesta donde te preguntaba donde lo encendías al timer)

2) Es posible que no estés regresando del vector de interrupciones y/o que no estes borrando el flag de la interrupción del timer1.  No se si el CCS hace esto automático o lo debes hacer tu.  En concreto es PIR1.TMR1IF = 0 y PIE1.TMR1IE = 0

El pic que estas usando prevé el uso de 2 niveles de interrupción, ¿estás teniendo esto en cuenta?

3) Otra pregunta, si quitas todo lo relacionado al timer, esas instrucciones del LCD se procesan bien y se ven en el display? Acaso no será ese el problema?
« Última modificación: 02 de Marzo de 2007, 15:35:42 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado sepul

  • PIC10
  • *
  • Mensajes: 25
Re: Ayuda con Timer1 y CCS
« Respuesta #8 en: 03 de Marzo de 2007, 19:01:05 »
Hola!bueno, antes de nada, otra vez gracias por las molestias.

Citar
Publicado por: vszener 

Vamos a ver que nos aclaremos, quitando la instrucción sleep(); debe funcionar teóricamente.

El micro no se despierta del estado sleep mediante el timer, lo indica el data sheet.

Aparte, si que te enrará una vez, sólamente, en la interrupción, lo que pasa, que en dicha interrupción tienes puesto la instrucción de desactivar el timer1, así que no te entrará más.

Prueba con quitar la instrucción sleep(); (es obligatorio para que pueda el micro abordar la interrupción del timer), y ponerle en la rutina de interrupción, el intercambio de estado de, por ejemplo, un led.
 

Como bien dices, quitando la instruccion sleep() si que entra en la interrupcion. Voy a intentar probar algun modo de bajo consumo donde se pueda interrumpir el micro, a ver si se puede, solo que con el ccs no me aclaro mucho, pero bueno.


Citar
Publicado por: maunix 

Bueno, las cosas que veo.

1) No has hecho arrancar a el timer, por eso hacer TMR1ON lo ha hecho andar y que se produzca la interrupción. (si te fijas es lo que puse en mi primera respuesta donde te preguntaba donde lo encendías al timer)

2) Es posible que no estés regresando del vector de interrupciones y/o que no estes borrando el flag de la interrupción del timer1.  No se si el CCS hace esto automático o lo debes hacer tu.  En concreto es PIR1.TMR1IF = 0 y PIE1.TMR1IE = 0

El pic que estas usando prevé el uso de 2 niveles de interrupción, ¿estás teniendo esto en cuenta?

3) Otra pregunta, si quitas todo lo relacionado al timer, esas instrucciones del LCD se procesan bien y se ven en el display? Acaso no será ese el problema?

Te digo lo que me comentas:

1)Eso ya lo sabía, solo que según entendí del CCS con la instrucción set_timer1() ya arrancaba al ponerle esto.
2)En teoría pone que el CCS ya lo borra automáticamente, pero probaré como dices dices a borrar los flags manualmente, ya que sólo me entra una vez en la interrupción (ya quité también la instucción de desactivar el timer, que eso era para probar una cosa).
Lo de los dos niveles de interupción no tengo ni idea, porque  supuse que al poner enable_interrupts(int_timer1)
y después enable_interrupts(global) ya quedaría habilitada. ¿Tengo que hacer algo más?
3)El display funciona sin problemas, que ya lo estoy usando en el proyecto con modbus y funciona, y aquí también me está escribiendo, en el ejemplo(hasta que se interrumpe, claro, que ya no me pone nada :) )

Es que me estoy haciendo un lío con el CCS...Como me siga atascando lo hago poniendo  registro a registro y fuera (es que sola trabajara con la familia 8051 de atmel y el Keil y estoy un poco perdido...)







Desconectado fartet

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 145
Re: Ayuda con Timer1 y CCS
« Respuesta #9 en: 03 de Marzo de 2007, 20:16:30 »
No se si podría usarse aqui, mi experiencia de momento se limita al humilde 16f84 y solo en asm, por lo que igual digo una tonteria, pero cuando quiero temporizar estando en sleep uso el watch-dog.

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ayuda con Timer1 y CCS
« Respuesta #10 en: 04 de Marzo de 2007, 07:45:10 »
El perro guardián, si  sale del modo sleep, ya que te hace un reset. Pero el timer no.

El CCS no e smuy complicado de usar, aparte, en el subforo de C tienes bastantes ejemplitos de aplicación.

En caso d etener alguna duda al programar, vete al data sheet.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado fartet

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 145
Re: Ayuda con Timer1 y CCS
« Respuesta #11 en: 04 de Marzo de 2007, 14:07:38 »
Con la ventaja adicional que el pero guardian cuando "despierta" al micro de su estado de sleep en lugar de cargar el contador de programa con el vector de reset lo carga con la dirección siguiente a la del sleep que puso a dormir al micro, lo que da mucho juego para programar


 

anything