TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: S4y4n en 12 de Agosto de 2009, 13:31:07

Título: Problema con los timers 0 y 1 como contadores.
Publicado por: S4y4n en 12 de Agosto de 2009, 13:31:07
Estoy tratando de leer dos encoders usando los timer 0 y 1, ademas de transmitir la cuenta de los pulsos cada segundo por rs232 a una computadora, el programa se compila sin ningun problema y simulado en proteus funciona, pero cuando programo el pic y realizo la comunicacion entre este y la computadora, el pic no transmite la cuenta de pulsos, solo manda ceros. No me explico que pueda ser estoy usando el compilador CCS v4.068 en el que apenas empieso.

Pongo el codigo que funciona en proteus pero no en la vida real, nose porque... nose si haya omitido algo que proteus corrije en la simulacion.

Código: [Seleccionar]

#include <18f452.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT
#use DELAY (CLOCK=4000000)

#use rs232(baud=9600, UART1)
#use STANDARD_IO (a)
#use STANDARD_IO (c)
//#include <bootloader.h>

int16 counter1=0;
int16 counter2=0;
int segundo=0;
int segundos=0;


//*************** INT TIMER1*********************

#int_TIMER3
void TIMER3_isr(void)
{
   segundo = segundo + 1;
   
   if (segundo == 2)
   {
   segundo=0;
   segundos= segundos + 1;
   
   printf("%6lu t0 %6lu t1 %6u seg \n \r", counter1,counter2,segundos);

   
   set_timer0(0);                                        //Borrado contador
   set_timer1(0);
   
   }
   
   set_timer3(3036);                // Recarga a 0.5s
   
}
//**********************************************

VOID MAIN()
{           
 
   PORT_B_PULLUPS(TRUE);
   
   setup_timer_0(rtcc_ext_l_to_h|rtcc_off);              //Configuración TMR0
   setup_timer_1(T1_external|T1_DIV_BY_2);
   setup_timer_3(T3_internal|T3_DIV_BY_8);               //Configuración TMR1
   set_timer0(0);                                        //Borrado contador
   set_timer1(0);
 
   set_timer3(3036);                                     //Carga a 0.5s
   enable_interrupts(int_timer3);
   enable_interrupts(global);                            //Habilitación interrupciones
   
   WHILE (1)
   {
   
   counter1=get_timer0();   //Lectura contador TMR0
   counter2=get_timer1();   //Lectura contador TMR1
 
   }
}

Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: MLO__ en 12 de Agosto de 2009, 13:58:18
Hola.

El printf toma demasiado tiempo como para ponerlo en la interrupcion, mejor sacalo de ahi y ponlo en el programa principal.
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: Suky en 12 de Agosto de 2009, 14:03:44
Para que envíe cada 1 segundo, realizaría la lectura de los timer cada 1 seg y no en cada momento:

Para configurar el módulo USART:
Código: C
  1. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

En espera del segundo:
Código: C
  1. #int_TIMER3
  2. void TIMER3_isr(void)
  3. {
  4.    set_timer3(3036);                // Recarga a 0.5s
  5.    segundo++;
  6.    
  7.    if(segundo==2){
  8.        counter1=get_timer0();   //Lectura contador TMR0
  9.        counter2=get_timer1();   //Lectura contador TMR1
  10.        segundo=0;
  11.    
  12.        set_timer0(0);                                        //Borrado contador
  13.        set_timer1(0);
  14.        FlagSeg=1;                            // Indicamos ocurrido el Segundo.
  15.    }
  16. }

y en el main:

Código: C
  1. .
  2. .
  3. .
  4. FlagSeg=0;
  5. while(1){
  6.  
  7.     while(FlagSeg==0){}
  8.     FlagSeg=0;
  9.     printf("%6lu t0 %6lu t1\n \r", counter1,counter2);
  10.  
  11. }
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: sauron en 12 de Agosto de 2009, 16:18:49
MLO_ está en lo correcto, no es recomendable colocar un printf ni otras instrucciones dentro de una interrupción.

Observando sobre el tiempo del timer, ¿cual es el tiempo máximo que se puede configurar en un timer? ...horas?...que el pic no se sature o presente otra anormalidad
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: Suky en 12 de Agosto de 2009, 16:49:27
Observando sobre el tiempo del timer, ¿cual es el tiempo máximo que se puede configurar en un timer? ...horas?...que el pic no se sature o presente otra anormalidad

Como que se sature? El timer es un contador interno, y si el microcontrolador no tiene problemas de alimentación no va a fallar.
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: S4y4n en 12 de Agosto de 2009, 17:11:58
Gracias por las respuestas ya modifique el codigo, pero ahorita solo puedo simularlo y lo que me interesa es ver que funcione ya implementado en el pic.
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: sauron en 12 de Agosto de 2009, 19:14:24
El timer es un contador interno, y si el microcontrolador no tiene problemas de alimentación no va a fallar.

Ok gracias por la aclaración :o.

Entonces configurando bien el timer y los contadores, se le puede dar el tiempo que uno desee?, supongamos algo exagerado de 12 horas, si usamos el timer1 con periodo máximo a 4MHz sería...
T = 65536 * 8 * 1us = 0,524288s
12 horas = 43200s
Entonces... 43200s/0,524288s = 82397,46

Cuando el registro X llegue a 82397 tenemos la cuenta de 12 horas......¿no hay problema en la practica poner al PIC a contar ese tiempo?, si no hay fallas de alimentación claro.
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: Suky en 12 de Agosto de 2009, 20:06:12
Mientras X sea de 32 bits no hay problema  :mrgreen:
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: MLO__ en 12 de Agosto de 2009, 20:56:21
Si no funciona en real, hay que revisar el esquematico.

Saludos
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: S4y4n en 13 de Agosto de 2009, 02:18:57
Pues ya revise todas las conecciones y verifique con un osciloscopio que los encoders funcionen correctamente, ademas no creo que sea la tablilla porque fue madada a manufacturar junto con otras decenas iguales que no han dado ningun problema.


Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: MLO__ en 13 de Agosto de 2009, 13:48:35
Podrias subir el esquema?

Saludos
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: Suky en 13 de Agosto de 2009, 14:11:16
Pues ya revise todas las conecciones y verifique con un osciloscopio que los encoders funcionen correctamente, ademas no creo que sea la tablilla porque fue madada a manufacturar junto con otras decenas iguales que no han dado ningun problema.

No indica nada?

Al código agrégale:

Código: C
  1. setup_adc_ports(NO_ANALOGS|VSS_VDD);
  2. setup_adc(ADC_OFF);
  3. output_float(PIN_A4);
  4. output_float(PIN_C0);
  5. setup_timer_0(rtcc_ext_l_to_h);


Saludos!
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: S4y4n en 13 de Agosto de 2009, 20:38:06
Ya realize las ultimas modificaciones que menciona Suky y programe el pic, pero sigo sin resivir la cuenta de pulsos, el pic si transmite la cuenta de segundos transcurridos pero no los pulsos leeidos en los encoders.
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: S4y4n en 13 de Agosto de 2009, 20:46:47
Me olvidaba del esquematico

Saludos y gracias.
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: Suky en 13 de Agosto de 2009, 21:29:01
Yo me equivoque, debe ser output_float(PIN_C0);. Después, probé exactamente ese código que posteaste y funciona correctamente  :mrgreen:

Saludos!
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: S4y4n en 13 de Agosto de 2009, 21:51:19
Como lo probaste, en proteus o fisicamente con el pic? ahorita ya puedo leer los pulsos en el timer 1, esta bien raro de hecho debo tener las dos terminales del encoder conectadas a la tablilla, para poder leer los pulsos, esto solo lo hace con el timer 1 sigo sin leer los pulsos en el timer 0 y eso que si le llega el tren de pulsos.

Saludos y gracias por su atencion.
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: Suky en 13 de Agosto de 2009, 22:30:30
Tenes que eliminar rtcc_off, como lo indico mas arriba.

Saludos!
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: S4y4n en 14 de Agosto de 2009, 17:56:56
Muchas gracias Suky elimine la parte del rttc_off y ya puedo leer la cuenta de ambos timers  :mrgreen:, ahora ya nomas me falta agregar al programa los dos pwm para controlar los motores y de ser posible agregar un algoritmo de calculo odometrico para el robot, si a alguien le interesa abrire otro post sobre mis avances.

Saludos y gracias por su ayuda!
Título: Re: Problema con los timers 0 y 1 como contadores.
Publicado por: Suky en 14 de Agosto de 2009, 19:28:31
Muchas gracias Suky elimine la parte del rttc_off y ya puedo leer la cuenta de ambos timers  :mrgreen:, ahora ya nomas me falta agregar al programa los dos pwm para controlar los motores y de ser posible agregar un algoritmo de calculo odometrico para el robot, si a alguien le interesa abrire otro post sobre mis avances.

Saludos y gracias por su ayuda!
Muy interesante! Y por supuesto, mas de uno va a estar interesado, así que esperamos los avances  :mrgreen:

Nota: Para que la temporización de 1 segundo sea lo mas precisa, conviene recargar el timer ni bien se genera la interrupción :wink:

Saludos!