Autor Tema: Leer un evento externo en Raspberry  (Leído 405 veces)

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

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 229
Leer un evento externo en Raspberry
« en: 27 de Octubre de 2018, 11:03:04 »
Hola a todos , estoy programando en Lazarus , que es casi o mismo que delphi , por eso pregunto aca , el tema es el siguiente

Quiero leer un evento externo ..pulsos para ser mas exacto ...de un caudalimetro , el tema es que lo intento leer por medio de un timer cada 1 milisegundos , y deberia cada vuelta del caudalimetro leer 4 pulsos , pero me pasa que leo solo la mitad , es evidente que hay algun proceso que me ocupa tiempo y pierdo pulsos

procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin

            Caudal := Main.GPIO.PinValue[PinCaudal1];

         if Caudal = TPinValue.Low then CauState :=0 else CauState :=1;

           if (CauState <> CauLastState) then
            begin

             if Caudal = TPinValue.High then // Si cambia el estado incremento Pulsos
                 begin
                   inc(Pulsos) ;   // if the current state is HIGH then the button went from off to on:

                   Mililitro:= round(Pulsos/calibrado);
                    LabMili.Caption:= 'Ml ' + FloatToStr(Mililitro) ;


A esto mismo lo hago en el form  de calibrado y me anda perfecto , he intentado de todo y no me doy cuenta de donde esta el problema

Por favor si alguien me puede dar una mano le estaria muy agradecido

Saludos
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6949
Re:Leer un evento externo en Raspberry
« Respuesta #1 en: 27 de Octubre de 2018, 11:30:13 »
Faltan un par de cosas ahi en el codigo..

Falta la asignacion de CauLastState, faltan los end de los if.

Ademas de eso, si es que lo tenes, entonces no veo otro problema, podrias tratar de accionar una salida y verlo con algun osciloscopio para saber si es que se esta ejecutando como vos queres.
Tambien podrias ver la señal del caudalimetro para ver que los señales respondan al tiempo que vos le estas dando.

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 229
Re:Leer un evento externo en Raspberry
« Respuesta #2 en: 27 de Octubre de 2018, 11:37:39 »
Hola KiLLERJC como estas ...antes que nada muchas gracias ...si si no puse el codigo completo ...el tema es el siguiente , ya mire la salida del caudalimetro con un osciloscopio ...y los pulsos son perfectos , tengo un form de calibracion que es casi igual a este , y en este form los pulsos se leen completos , por eso no entiendo la diferencia en realidad son 5 forms , en el form 3 decido si es calibracion o consumo de mililitros , si elijo calibracion los pulsos los cuenta perfecto con un timer de 1 milisegundo , en cambio si elijo el form4 que es el de consumo , me pierdo la mitad de los pullsos o sea me lee 2 de 4 tambien con un timer de 1 milisegundo ...y no me doy cuenta de donde pierdo tiempo

Muchas gracias
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6949
Re:Leer un evento externo en Raspberry
« Respuesta #3 en: 27 de Octubre de 2018, 11:48:04 »
Por eso comentaba si ademas podes cambiar el estado de una salida cada ves que entra al form que cuenta los pulsos, para asi determinar cada cuanto es que entra, a leer los pulsos,

así determinas si es problema de tiempos entre procesos, algo hay que ir eliminando de la lista, si ves que lee demasiado lento algo debe haber distinto que seguramente no estemos teniendo en cuenta.

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 229
Re:Leer un evento externo en Raspberry
« Respuesta #4 en: 27 de Octubre de 2018, 12:08:05 »
Por eso comentaba si ademas podes cambiar el estado de una salida cada ves que entra al form que cuenta los pulsos, para asi determinar cada cuanto es que entra, a leer los pulsos,

así determinas si es problema de tiempos entre procesos, algo hay que ir eliminando de la lista, si ves que lee demasiado lento algo debe haber distinto que seguramente no estemos teniendo en cuenta.


Perdoname no te entiendo ...

yo entro al form de calibracion , habilito el timer , y hago esto

procedure TForm5.TimerCaudalCalibraTimer(Sender: TObject);
begin
          CaudalCali := Main.GPIO.PinValue[PinCaudal1];

          if CaudalCali = TPinValue.Low then CauStateCali :=0 else CauStateCali :=1;

           if (CauStateCali <> CauLastStateCali) then
            begin

             if CaudalCali = TPinValue.High then // Si cambia el estado incremento Caupuscounter
                 begin
                   inc(PulsosCali) ;   // if the current state is HIGH then the button went from off to on:

                    EditCalibra.Text:= 'Pulsos ' + IntToStr(PulsosCali) ;
                  end;
            end
           else
             SystemCore.Delay(30);  // rebote caudalimetro
        // save the current state as the last state, for next time through the loop
        CauLastStateCali := CauStateCali;

end;

Ahi me cuenta perfectamente los pulsos , los 4 de cada vuelta del caudalimetro

El tema es que en el form que me muestra el caudal consumido , si hago un copy paste de esta subrutina , me cuenta la mitad , y no hay muchas diferencias entre forms , estoy mirando variables , lectura de la base de datos , pero no lo veo al problema , es evidente que es un proceso , pero no te entiendo lo que me propones ...

Gracias y disculpa
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6949
Re:Leer un evento externo en Raspberry
« Respuesta #5 en: 27 de Octubre de 2018, 12:52:31 »
procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin

          // Aca todo de los pulsos

          //Activo una salida Main.GPIO.PinValue[Salida] := Main.GPIO.PinValue[Salida] ^ 1;
end;

O... la otra forma es usar unicamente el Form5, y preguntar alli si es Calibrar o Consumo, para hacer una cosa u otra. (Si el problema es que hay 2 codigos usando el mismo Timer)

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 229
Re:Leer un evento externo en Raspberry
« Respuesta #6 en: 27 de Octubre de 2018, 13:09:24 »
procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin

          // Aca todo de los pulsos

          //Activo una salida Main.GPIO.PinValue[Salida] := Main.GPIO.PinValue[Salida] ^ 1;
end;

O... la otra forma es usar unicamente el Form5, y preguntar alli si es Calibrar o Consumo, para hacer una cosa u otra. (Si el problema es que hay 2 codigos usando el mismo Timer)





Ahora si entendi , no entendia a que te referias con salida ...voy a probar ...la otra pregunta , en delphi no existe una manera de obtener interrupciones como en los microcontroladores ??

Saludos y mil gracias
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 229
Re:Leer un evento externo en Raspberry
« Respuesta #7 en: 28 de Octubre de 2018, 15:12:32 »
procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin

          // Aca todo de los pulsos

          //Activo una salida Main.GPIO.PinValue[Salida] := Main.GPIO.PinValue[Salida] ^ 1;
end;

O... la otra forma es usar unicamente el Form5, y preguntar alli si es Calibrar o Consumo, para hacer una cosa u otra. (Si el problema es que hay 2 codigos usando el mismo Timer)





Ahora si entendi , no entendia a que te referias con salida ...voy a probar ...la otra pregunta , en delphi no existe una manera de obtener interrupciones como en los microcontroladores ??

Saludos y mil gracias


Estimado KILLERJC , queria comentarte del problema , acabo de resolverlo , parece mentira pero es asi , un tlabel , demora mas en ejecutarse que un tedit , solo cambie la forma de mostrar el resultado y todo anduvo perfecto ...no vi exactamente los tiempos con el osciloscopio , pero es evidente que el tlabel se demora bastante para mostrar el resultado , es para tenerlo en cuenta en este tipo de programas donde los tiempos son muy exactos en el formulario numero 4 mostraba el resultado con una label y en el 5 con un edit y ahi estaba el problema

Muchas gracias por tu colaboracion ....te mando un abrazo

« Última modificación: 28 de Octubre de 2018, 15:14:43 por Rseliman »
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6949
Re:Leer un evento externo en Raspberry
« Respuesta #8 en: 28 de Octubre de 2018, 19:36:44 »
bueno me alegro que encontraste cual era el problema, no entiendo el porque deberia tardar tanto para actualizar un label, tal ves al considerarlo fijo al label este en otro lado y "actualizarlo" sea algo "complejo"...

Y lo correcto sea un "edit" deshabilitado.

Desconectado miquel

  • PIC12
  • **
  • Mensajes: 67
Re:Leer un evento externo en Raspberry
« Respuesta #9 en: 31 de Octubre de 2018, 00:53:33 »
En Delphi es "mano de santo" llamar a "Application.ProcessMessages;" cada vez que actualizas un Tlabel,Tedit o TMemo. No sé si en Lazarus sirve igualmente.

Saludos,

Miquel