Autor Tema: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo  (Leído 23372 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #15 en: 13 de Octubre de 2007, 16:20:37 »
Pues creo que lo fundamental los tienes en Midiendo un pulso. 3ª Parte. Tiempo en Alto con INTRB, ampliando el tiempo en alto al pulso completo. La técnica es la misma.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo
« Respuesta #16 en: 13 de Octubre de 2007, 20:07:35 »
Pero no entiendo. Eso es para los pines desde RB4 hasta RB7 :S Dime, se puede hacer la interrupcion externa por RB1 ?? Porque segun el datasheet en Rb0, Rb1 y Rb2 tienen los tres INT0, 1, 2 respectivamente.  :? :?


saluos 8)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #17 en: 14 de Octubre de 2007, 05:51:35 »
Ahhhh ....  :D

Con un 18F las INT_EXT, INT_EXT1 y INT_EXT2 funcionan exactamente igual y solo hay que cambiar las habilitaciones de las mismas ...

Voy a revisar tu fuente y te comento ...

15 minutos después ...

Revisado el fuente y no veo nada que esté mal. Has cambiado todos los sitios donde se configura la INT_EXT para usar ahora la INT_EXT1 y no logro ver porqué no funciona.  :(


« Última modificación: 14 de Octubre de 2007, 06:01:49 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo
« Respuesta #18 en: 14 de Octubre de 2007, 06:55:04 »
Uy menos mal, gracias por darme esperanza a saber q se puede hacer lo mismo ahi porque ya mande a hacer el PCB  :lol:

Entonces que estara mal??  :? en RB0 si funciona perfectamente, no faltara alguna configuracion previa en el main? o en los fusibles quiza?  :(


Gracias RedPic! 8)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #19 en: 14 de Octubre de 2007, 08:08:42 »
¿Como están los TRIS del PORTB? Prueba a declarar ese pin de entrada por si acaso, y de camino los demás del PORTB según los estés usando.

¿Necesitas las PULL-UPS internas? Habilítalas o deshabilítalas según tu fuente de señal de de pulsos negativos, tira a masa la señal para indicarte que tienes un pulso, o te de pulsos positivos, sube a 5V para indicarte eso mismo.

El asunto puede estar en los TRIS.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo
« Respuesta #20 en: 14 de Octubre de 2007, 08:26:05 »
Veamos. Lo de la forma de indicarme la fuente de señal q tengo un pulso no estoy seguro como lo haga pero si de que en RB0 funciona perfecto, y si estuve pensando en los tris pero entonces fallaria tb en Rb0... igual probare (ahorita no tengo un quemador) en poner un tris para todo el puerto B.

Disculpa, pero nose a q te refieres con PULL-UPS internas  :?
esto: port_b_pullups(FALSE); ?? Pues la verdad no entiendo del todo para q sirve eso, haber si de paso me explicas  ello :P


Gracias. salu2 8)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo
« Respuesta #21 en: 19 de Octubre de 2007, 01:23:18 »
Disculpen el doble post.

Buenas RedPic. Tenias razon el problema estaba en la falta de configuracion en el tris_b, pero no lo usaba porque para el INT0 no lo usabas y supuse q para la INT1 seria igual. Entonces la pregunta ahora seria: ¿Porque al usar INT0 no es necesario configurar el pin a entrada mientras que en INT1 si?

Gracias hombre!!!!!! :D!!

salu2 8) 8)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #22 en: 19 de Octubre de 2007, 05:01:49 »
Esos son los misterios de los PIC's ... pero seguro que investigando el Datasheet llegamos a un por qué exacto.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Periodo
« Respuesta #23 en: 19 de Octubre de 2007, 22:57:42 »
Estare en ello lo mas que pueda.

Se agradece.


salu2 8)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
(me equivoq era aqui xP)

Citar
Hola RePic.

Queria saber si es necesario la variable T1, yaque su valor es tomado del timer 1 justo despues de poner este a 0. Si no lo fuera pues entonces el valor, en ticks de timer1, del ancho del pulso en alto no serai mas que t2 y por ende no habria necesidad del: t2 - t1. Eso si esq no me equivoco y esq t1 puede llegar a tomar un valor diferente a 0, quisiera q me aclares esa duda.

Gracias.
salu2 8)

salu2, gracias.  :-)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Porq lo haces asi ? x)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #26 en: 06 de Enero de 2008, 23:16:34 »
Bueno, vamos a ver si soy capaz de explicarme. Tienes razón en que T1 debe valer 0 en esta versión del programa y que es una solemne tontería guardar ese valor si acabamos de hacerlo igual a cero.

Pero esto es un añadido al programa original que no llevaba el set_timer1(0);

Quiero decir que realmente no le hace falta ya que si T3>T2>T1 sean cuales sean los valores de T3, T2 y T1 hacen que tengamos el pulso completamente definido con los tres flancos: inicio, cambio y final. Pero ... y es un pero muy importante ... siempre y cuando el pulso completo empiece y termine en la misma vuelta del Timer1.

Como sabes un Timer empieza a contar en 0x00 y acaba en 0xFF, si es de 8 bits, y vuelve a empezar por 0x00 sin solución de continuidad. Entonces puede darse perfectamente el caso de que el primer flanco nos llegue con el estado del Timer1 muy avanzado con lo que la variable T1 podría tener un valor muy cercano a 0xFF, y con ello se produciría el caso de que los restantes flancos nos llegasen tras el desborde del Timer1, su paso de 0xFF a 0x00, con lo que T2 y T3 serían entonces menores que T1.

Esto haría que nuestro cálculo de Pulso en Bajo =  T2 - T1, Pulso en Alto = T3 - T2 y Pulso completo T3 - T1 no sería válido sin contar con las vueltas completas o desbordes del Timer1.

Como esta serie de artículos eran para primerizos en esto de los PIC's no me pareció oportuno complicar los cálculos poniendo una variable que indicase el número de veces que ocurría este tránsito en pleno pulso del desborde del Timer. Porque la verdad es que la cosa se complica un poco y la rutina deja de ser tan extremadamente clara como quería conseguir.

Así que opté por la solución mas fácil y que era poner a cero el Timer1 al llegar el primer flanco. Con esto conseguía que si el pulso era mas corto que el tiempo que tarda el Timer1 en dar una vuelta completa la formula de T3-T2-T1 sería siempre verdadera y no habría que complicar nada. Asi que puse el Set_Timer1(0) tras la primera entrada en la interrupción y esperé a que T2 y T3 fuesen siempre menores a 0xFF pero mayores a T1 (que yo había puesto a cero).

Esa es la explicación de tan extraña secuencia de instrucciones.  :mrgreen:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Haya. Entonces mas q nada es para hacer una comparacion correcta a la hora de tener un nuevo dato. Si, estaba pensando q fuera asi porq siempre valia 0. En el caso de las interrupciones pues si q se complica algo y estoy investigando ello  :D; pero e logrado algo mas "compacto" por asi decirlo que, es lo mismo, pero ya ves q si e aprendido algo gracias a ti  :mrgreen:

Código: [Seleccionar]
#INCLUDE <12F683.h>

#FUSES HS
#FUSES INTRC
#FUSES NOWDT
#FUSES PUT
#FUSES MCLR
#FUSES NOPROTECT
#FUSES NOCPD

#USE DELAY(clock = 8 000 000)

#USE RS232(baud = 9600, xmit = PIN_A0, FORCE_SW)

float const us_por_tick = 0.5;   //0.2;   //Cada 0.5 microsegundos se producira un tick de timer1, dada por la formula: 4 / (FOSC(Mhz)).
int1 hay_pulso_contado = 0;
int8 numero_de_flanco_alto = 0;
int16 periodo_alto_en_ticks_1, periodo_alto_en_ticks_2;
float frecuencia_hz, periodo_en_us;
                   
#INT_EXT
void SQW_OUT()
{
   numero_de_flanco_alto++;     
 
   if (numero_de_flanco_alto == 1)
   {
      set_timer1(0);
      periodo_alto_en_ticks_1 = get_timer1();
   }
   
   if (numero_de_flanco_alto == 2)
   {
      periodo_alto_en_ticks_2 = get_timer1();     
      numero_de_flanco_alto = 0;
      set_timer1(0);
     
      if (hay_pulso_contado == 0)
      {
         hay_pulso_contado = 1;
      }
   }
}


void main()
{
   setup_oscillator(OSC_8MHZ);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); 
   delay_ms(300);
         
   ext_int_edge(L_TO_H);
   
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   
   while (TRUE)
   {
      if (hay_pulso_contado == 1)
      {
         if (periodo_alto_en_ticks_1 < periodo_alto_en_ticks_2)
         {
            periodo_en_us = us_por_tick * periodo_alto_en_ticks_2;      // Calculo en uS el periodo del pulso.
            frecuencia_hz = 1 / (periodo_en_us / 1000000);             // Calculo la Frecuencia
           
            printf("uSegundos: %3.1f  F = %4.2f Hz\r\n\n", periodo_en_us, frecuencia_hz);
         }
         
         hay_pulso_contado = 0;
      }
   }
}
Solo hago el conteo con los pulsos en alto y aunq aqui tb t1 (con otro nombre) vale 0 solo lo hago, como tu,  el tema del timer1 desbordado.


Gracias! Ahora voy entendiendo mas est tema d interrupciones, pulsos y eso  :P
salu2 8)

PD: Estaba pensando q para hacer una lectura de los pulsos sin tener q estar estos dentro de una vuelta del TMR1, podria cojerse, esperando el flanco de bajada (despues de esperar el d subida),  el tmr1 y ahi mismo ponerlo 0 y asi con el ultimo flanco para q cada tiempo de los tiempos en alto y en bajo sean independientes en cada timer1 por asi decirlo. No estoy seguro pero estare investigando sobre ello o bien recurrir a las tenebrosas interrupciones de estas  :-)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Serie Técnicas en C : Midiendo un pulso. 4ª Parte. El pulso completo. El Per
« Respuesta #28 en: 07 de Enero de 2008, 11:43:47 »
Si, buena idea (la de poner a 0 el timer tras recoger cada flanco). Pero el desarrollo definitivo, el que haría independiente del valor del timer en cada momento sería algo así:

#INT_EXT Recoge los tres estados consecutivos del Timer sin ponerlo a cero nunca, dejándolo correr alegremente, sólo conmutando el tipo de flanco a recoger cada recepción. Cada tres conmutaciones tenemos los valores T1, T2 y T3 y podemos poner en alto el flag de Hay_Dato. Entre T1 y T2 pueden haber N desbordes del Timer, y entre T2 y T3 puede haber M desbordes del Timer. Para poder realizar el cálculo correcto del periodo debemos saber los valores de N y M.

Esto lo conseguimos con ..

#INT_TIMER Esta interrupción se produce cada vez que el Timer pasa de 0xFF a 0x00. Así que en ella ponemos un simple contador de desbordes. ++NumDesbordes.

Entonces nuestro programa debe recoger tanto los valores del Timer como el estado de NumDesbordes en cada recogida de T1, T2 y T3 respectivamente en dT1, dT2, y dT3. Con estas parejas de valores podemos calcular perfectamente el tiempo transcurrido ente cada uno de ellos y el siguiente, independiente de si el pulso es corto o muy largo.

Ésta es la técnica que implemento en mi Analizador lógico de 3 Canales. Esta idea la explico un poco mas en profundidad en este post y los siguientes.  :mrgreen:




Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Si! asi estaba haciendo algo tb, algo tan simple como eso n la interupcion del timer1. Gracias por dejarmelo en claro.

Porcierto, es igual usar un cristal externo q uno interno a la hora de querer contar pulsos y todo esto ?? Porq necesito algo muy pero muy preciso yaq estoy intentando leer el SQW del DS1307 para revisar si el cristal (32,768 KHZ) esta bien o no pormedio d la INTEXT del`PIC12f683. Cambiando cristales como q baja un poco  el conteo  de la frecuencia (ocea el tiempo), o quizas sea por q al poner una frecuncia menor de 20MHZ (yaq ese pic internamente como maximo solo me da 8MHZ) este contando mas lento...

Esq quiero una prescicion bien precisa  :D y creo q aqui entra mucho el tema del oscilador verda?  :? Que puedo hacer? ajustar el uSxTick a un valor diferent al q es para q sea igual al q lee en 20 mhz ? modificar mi condigo ISR para mejorar precicion? ...


Gracias, salu2 8)

Revisando ese links q dejast  :mrgreen:...


 

anything