Autor Tema: posible problema con timer1??  (Leído 2069 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
posible problema con timer1??
« en: 20 de Julio de 2010, 13:29:41 »
Hola, necesito una ayudita ya que no encuentro el problema que tengo en el codigo, es una cosa muy sencilla, y seguro que es una tonteria pero no he conseguido dar con ella, aqui os explico mi situación.

Tengo un pulsador que quando lo pulso quiero que envie una trama de datos, que ya tengo definida, el problema que tengo es que el pic hace caso omiso del pulsador, una ayudita porfavor, me he leido muchos y muchos temas del foro pero no encuentro el maldito error.

Aqui os dejo los archivos, Issis para simulacion y codigo, todo en un RAR.

Gracias.
« Última modificación: 26 de Julio de 2010, 13:10:32 por f-traxx »

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: posible problema en el codigo?
« Respuesta #1 en: 21 de Julio de 2010, 02:42:41 »
No pude ejecutar la simulación. Pero si el problema es que la trama se envia sin que presiones el pulsador, puedes modifcar el IF dentro del WHILE de este modo.

Código: C
  1. if (input(polsador))
  2.     {
  3.         delay_ms(40);
  4.          atent();
  5.          envia_paraula();
  6.          delay_ms(DT*3);
  7.          envia_paraula();
  8.          delay_ms(DT*3);
  9.     }
@fabianjsm is on twitter

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema en el codigo?
« Respuesta #2 en: 21 de Julio de 2010, 03:19:53 »
Gracias por contestar, pero no se ha arreglado, no es que la trama se envie sin pulsar el pulsador, es que aleatoriamente me envia una trama de pulsos muyyy pequeños (que no son la trama que tendria que enviar) y que aparte no me hace caso del pulsador, quando le doy al "polsador" tendira que enviar una trama de bits por el puerto C6 y no lo hace, aqui dejo lo que se ve en el osciloscopio, eso es lo que me envia quando quiere, y repito no me hace caso del pulsador...

Gracias por vuestra ayuda.

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema en el codigo?
« Respuesta #3 en: 21 de Julio de 2010, 03:20:35 »
Me havia olvidado la foto...

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: posible problema en el codigo?
« Respuesta #4 en: 21 de Julio de 2010, 03:53:09 »
Tienes negada la entrada del pulsador: al pulsar envias a masa. Modifica el IF de este modo:

Código: C
  1. if ( ! input(polsador))
  2.     {
  3.          delay_ms(40);
  4.          atent();
  5.          envia_paraula();
  6.          delay_ms(DT*3);
  7.          envia_paraula();
  8.          delay_ms(DT*3);
  9.       }
@fabianjsm is on twitter

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema en el codigo?
« Respuesta #5 en: 21 de Julio de 2010, 03:59:27 »
que quieres decir que tengo negada la entrada del pulsador? ya lo he hecho y nada... :(

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: posible problema en el codigo?
« Respuesta #6 en: 21 de Julio de 2010, 04:33:58 »
Lo adapté a mis nececidades  :lol:
En la simulacion puedes ver como solo envia la trama cuando presionas el boton.
@fabianjsm is on twitter

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema en el codigo?
« Respuesta #7 en: 21 de Julio de 2010, 04:41:48 »
Muchas gracias, por lo que parece, solo has cambiado el while por el for y has sacado todo esto:

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   disable_interrupts(GLOBAL);

Me puedes decir donde estaba el error? o porque crees que sucedia?

Muchas gracias de nuevo

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: posible problema en el codigo?
« Respuesta #8 en: 21 de Julio de 2010, 04:42:04 »
 :-/ :-/ :-/





Esto es tu programa en C funcionando.


Te envío tu programa corregido.
El error estaba en que al parecer no le gusta los decimales en la pausa . Poner 3.5 no le gusta y se quedaba en la parra, por eso en lugar de 3.5ms lo puse en us (3500).
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema en el codigo?
« Respuesta #9 en: 21 de Julio de 2010, 05:06:58 »
 :-/ Ya esta el programa terminado ahora me falta ajustar las pausas y ya!!

Por cierto pibe.

Pedazo de osciloscopio tienes ee.... MUCHAS GRACIAS A LOS DOS, vaya tonteria lo de los tiempos, bueno cosas de novatos...

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema con timer1??
« Respuesta #10 en: 26 de Julio de 2010, 13:18:04 »
Hola buenas, como podreis saber si haveis leido los mensajes, estoy haciendo con dos micros (PIC16F870) unos "emuladores" de cogido trinario.
Lo que estoy es haciendo que un PIC me sirva de codificador como un MC145026 y otro de decodificador como un MC145027, la parte del codificador esta practicamente lista lo que me falta solucionar, es la parte del decodificador, para medir el ancho de los pulsos y asi ver si son unos (que en trinario un "1" es dos pulsos largos en alto, separado por un corto en bajo) o zeros (dos periodos largos en bajo separados por uno corto en alto), mi idea era saber cuanto tiempo se esta en alto, porque asi sabre si en realidad me esta mandando un uno o un zero, y medir el tiempo con el timer1, pero no me funciona... no se que parte del codigo es la que no me va... el codificador, envia las señales bien, pero el timer parece que no me cuente bien lo que me llega por RC2, aqui dejo el codigo, y pediria una ayudita porfavor... me he estado mirando el foro para las interrupciones y mediciones de pulsos y he hecho una mezcla de codigos que he encontrado y me pueden servir, aqui les dejo el codigo completo haber si me pueden decir donde esta el fallo... o si me pueden dar alguna sugerencia para solucionarlo, muchas gracias.

void main()
{
   set_tris_a  (0b00000000);  //Todos los puertos como salidas.
   set_tris_b  (0b00000000);  //Todos los puertos como salidas.
   set_tris_c  (0b00000100);  //Todos los puertos como salidas menos
                              //el pin C2 como entrada.
   output_a (0b00000000);
   output_b (0b00000000);
   output_c (0b00000000);
//DEFINICO D'INTERRUPCIONS//
 
   setup_psp(PSP_DISABLED);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);


//HABILITACIO D'INTERRUPCIONS//

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_internal | T1_DIV_BY_1 );//Configuramos el timer1 con el prescaler a 1
                                             //asi cuenta de 1us en 1us.
   setup_ccp1(CCP_CAPTURE_FE);               //Habilitamos el modo captura.
   setup_timer_2(T2_DISABLED,0,1);           //Dejamos desabilitado el timer2   
   enable_interrupts (int_timer1);           //Habilitamos el timer1.
   enable_interrupts (global);               //Sino habilitaramos las interrupciones globales
                                             //no nos funcionaria ninguna interrupcion.
     
   while(1)
   {
   trans_bit();      //Transforma el codigo trinario en bits ("1" y "0").
   envia_bits();
//   guardar_adres();  //Rutina para guardar los tiempos en la palabra adecuada.
//   guardar_dades();  //Rutina que guarda los datos de las 2 palabras.
   }       
}   
void trans_bit()  //Esta rutina nos quiere medir la duración de los pulsos y
{                 //segun su longitud transformarlos a bits normales de "0" y "1".
int i=0;            //Variable donde guardamos el tiempo que dura el pulso.
int p;            //Variable para incrementar "pols" y así guardar los pulsos
                  //en diferente posicion para luego compararlos.
int repeat;       //Variable para que repita el bucle for 2 veces.

      for (repeat=0;repeat<2;repeat++);
      {
      for (;!input(rebre);)output_high(pin_C4); //Esperamos el inicio del pulso (flanco subida).
         set_timer1(0);                         //Cuando llegue se pone a cero el Timer1.
      for (;input(rebre);)//Esperamos al final del pulso (flanco de bajada).
         i=CCP_1;
         output_low(pin_c4);
         output_high(pin_B1);
         delay_ms(200);
         output_low(pin_b1);//Cuando llegue guardamos el tiempo en la variable i.
      if ((i>140)&(i<155))
      { pols[p]=1;p++;      //Comparamos la duracion del pulso si esta entre(140-155)es
        output_high(pin_c4);//un pulso corto y guardamos un 0 en la posicion p de pols.
        delay_ms(200);
        output_low(pin_c4);
        delay_ms(600);
        output_high(pin_c4);
        delay_ms(200);
        output_low(pin_c4); 
      }
      if ((i>160)&(i<1045))
      { pols[p]=1;p++;      //Comparamos la duracion del pulso si esta entre(170-860)es
        output_high(pin_c5);//un pulso largo y guardamos un 1 en la posicion p de pols.
        delay_ms(600);
        output_low(pin_c5);
        delay_ms(200);
        output_high(pin_c5);
        delay_ms(600);
        output_low(pin_c5);
      }   
      if((repeat==1)&(pols[0]==0)&(pols[1]==0)){bit=0;}//Si entra aqui significa que la sequencia de los 2
                                                       //pulsos es un "0" y lo guardará como como tal en "bit".
      if((repeat==1)&(pols[0]==1)&(pols[1]==1)){bit=1;}//Si entra aqui significa que la sequencia de los 2
      }                                                //pulsos es un "1" y lo guardará como como tal en "bit".
}

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: posible problema con timer1??
« Respuesta #11 en: 26 de Julio de 2010, 19:53:50 »
Para estos codigos largos por varias razones, estaria mejor que adjuntes el archivo en lugar de copiarlo :(
@fabianjsm is on twitter

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema con timer1??
« Respuesta #12 en: 27 de Julio de 2010, 06:42:34 »
Gracias por la respuesta, para las proximas veces lo tendre en cuenta.
Pero si me comentaras donde puede esta el problema me iria mucho mejor.

Gracias todos los consejos son buenos.

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema con timer1??
« Respuesta #13 en: 27 de Julio de 2010, 08:16:39 »
Hola, tengo una pregunta para los entendidos...

tengo el siguiente codigo:

void handle_ccp1_int()
{
  if(flagToggleFlanco==0)           // He recibido Flanco de Subida
  {                 
     t1=get_timer1();               // Guardo en t1 el valor de TMR1 al Flanco de Subida
     setup_ccp1(CCP_CAPTURE_FE);    // Configuro para capturar siguiente flanco de Bajada
     flagToggleFlanco=1;            // Indico que el siguiente flanco será de Bajada
  }
   else                             // He recibido Flanco de Bajada
   {                         
     t2=get_timer1();               // Guardo en t2 el valor de TMR1 al Flanco de Bajada
     setup_ccp1(CCP_CAPTURE_RE);    // Configuro para capturar siguiente flanco de subida
     flagToggleFlanco=0;            // Indico que el siguiente flanco será de Subida
     set_timer1(0);                 // Reinicio TMR1
     if(flagHayDatos==0)            // Si los datos anteriores han sido procesados ...
     {                 
        flagHayDatos=1;             // Indico que ya hay nuevos datos de flancos para calcular
     }
   }
}


No se podria escribir asi tambien?? y asi luego te ahorras hacer la resta de t2-t1
void handle_ccp1_int()
{
  if(flagToggleFlanco==0)           // He recibido Flanco de Subida
  {                 
     set_timer1(0);               // Guardo en t1 el valor de TMR1 al Flanco de Subida
     setup_ccp1(CCP_CAPTURE_FE);    // Configuro para capturar siguiente flanco de Bajada
     flagToggleFlanco=1;            // Indico que el siguiente flanco será de Bajada
  }
   else                             // He recibido Flanco de Bajada
   {                         
     t1=get_timer1();               // Guardo en t2 el valor de TMR1 al Flanco de Bajada
     setup_ccp1(CCP_CAPTURE_RE);    // Configuro para capturar siguiente flanco de subida
     flagToggleFlanco=0;            // Indico que el siguiente flanco será de Subida
     set_timer1(0);                 // Reinicio TMR1
     if(flagHayDatos==0)            // Si los datos anteriores han sido procesados ...
     {                 
        flagHayDatos=1;             // Indico que ya hay nuevos datos de flancos para calcular
     }
   }
}

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: posible problema con timer1??
« Respuesta #14 en: 27 de Julio de 2010, 13:22:54 »
Hola, veo que mis preguntas tiene mucho exito....

Aqui va otra, tengo un codigo para contar el ancho de los pulsos, pero no hay forma de que me funcione... he copiado el codigo de otro foro que hay: - Midiendo un pulso. 2ª Parte. Tiempo en Alto Mediante INTCCP en modo Capture.
El codigo es el siguiente, os lo adjunto en un fichero de CCS.


Me pueden decir que error puede haber??
Por si hay alguna buena persona... gracias.
« Última modificación: 27 de Julio de 2010, 13:25:12 por f-traxx »


 

anything