TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: electronando en 04 de Agosto de 2007, 14:14:46

Título: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: electronando en 04 de Agosto de 2007, 14:14:46
Buenas hasta ahora e usado solo los retardos por medio del timer que me da el visual el cual se debe de ingresar el valor en milisegundos pero no en usegundos , la cuestion es que deseaba desarrollar un programa para adquirir señales a mayor velocidad por ejemplo cada 50us , no se si sera mucho pedir al visual o es necesario hacerlo mediante otro lenguaje de mayor potencia como el visual c o el delphi , delos cuales prefiero el delphi por temor al primero :shock:, claro que eso en caso que con el visual basic  no tenga remedio o si habra una libreria especial aparte de los temporizadores para estos retardos , les agradecere alguna opinion al respecto :mrgreen:
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: LordLafebre en 06 de Agosto de 2007, 03:22:08
Hola:

Puedes hacer un bucle DUMMY, con el número de iteraciones necesarias para que demore cierto tiempo, lo puedes hacer con un FOR.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: BrunoF en 16 de Agosto de 2007, 15:33:42
Hola electronando.

No hay forma de hacerlo preciso. Lo que te sugiere Lord es una solución,pero todo depende de la PC, de la carga de programas que tengas en ese momento ejecutandose, y de muchisimos factores más.

No sé que tanta precisión necesitás.
Ah! Y te comento que el VB miente. El VB no es capaz de controlar Timers con intervalos menores a los 52ms.

Saludos.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: LordLafebre en 16 de Agosto de 2007, 16:36:17
Hola:

Bruno, tu que ere maestro de maestros en programacion de PC, ahora que estamos en esto de los retardos, tienes idea de como se puede hacer para generar una frecuencia de 50Hz para controlar un servo desde el PC por el LPT?

(http://img526.imageshack.us/img526/1135/servox2mzfx1.gif)
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: BrunoF en 16 de Agosto de 2007, 17:26:19
Hola Gio.

¿Te estás refiriendo a VB6?

Para generar una señal de 50Hz podés usar la llamada a la API GetTickCount para contar los milisegundos transcurridos, pero dividir 1ms en 180 partes ya no es tan sencillo. Se pierde precisión.

Saludos.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: migsantiago en 16 de Agosto de 2007, 18:56:03
Hola

Otro método de conteo de tiempo es la función Timer, y no me refiero al objeto timer.

Un pequeño ejemplo...

dim inicio
dim tiempotranscurrido

inicio = Timer 'empieza a contar usando función Timer
'inicio tendrá un valor que indica el tiempo desde las 12am hasta el momento en que se llama

'después de un rato si se llama otra vez Timer entregará un nuevo tiempo
'solo hay que sacar la diferencia

tiempo = Timer - inicio 'entrega la diferencia en fracciones decimales y enteros si se da el caso


Yo usé Timer para saber cuánto tiempo le toma al pic enviar una trama de datos por el puerto serial.

Y Bruno tiene razón sobre la falla del objeto timer... nunca se ejecuta cuando debe hacerlo, yo intenté hacer un conteo con el objeto y da tiempos todos ilógicos.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: BrunoF en 16 de Agosto de 2007, 19:57:28
Si migsantiago, pero ojo que el timer trabaja contando centesimas de segundo(es decir, de a 10ms) y no creo que eso le alcance a Gio.

Saludos.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: migsantiago en 16 de Agosto de 2007, 20:17:39
Jaja sí  :lol:

Es lo malo de los ambientes multitareas... windows siempre anda ocupado atendiendo mil y un procesos a la vez.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: LordLafebre en 20 de Agosto de 2007, 21:15:52
Hola:

Pues en efecto Bruno,  10ms es mucho, ya que necesito entre 1ms y 2ms para que el servo varíe su posición, como es eso de los ticks que tu mencionas?
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: LABmouse en 16 de Octubre de 2007, 01:07:05
Yo tambien estoy necesitando generar un retardo de 1ms, pero no encuentro forma, ya lo resolvieron?? Me pueden decir a mi tambien  :mrgreen:

Intente hacer esto:

Código: [Seleccionar]
Private Function Retardo(Tiempo As Integer)
Timer1.Interval = Tiempo
Bandera = 0
Timer1.Enabled = True
    Do While Bandera = 0
    Loop
End Function


Private Sub Timer1_Timer()
Bandera = 1
Timer1.Enabled = False
End Sub

Y usarlo así:
Código: [Seleccionar]
Retardo (1)

pero el programa me deja colgado el Windows..



Encontré Esto (http://www.geocities.com/SiliconValley/Garage/6472/Apis.htm)

Usa una Api de Windows y permite crear retardos desde 1ms.

Solo hay que crear un Modulo Bas
Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Hay que llamarla asi:
Sleep 2000 'Llama a la API Sleep (2000 milisegundos = 2 segundo de pausa).



SALUDOS!!
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: RICHI777 en 16 de Octubre de 2007, 11:38:27
Hola, debido a que los Pentium tiene varias unidades de ejecución y los simples retardos calculando el tiempo de ejecucion de las instrucciones ya no son validos en este tipo de procesadores, Win32 provee dos funciones para que el calculo de tiempos sea preciso. Estas son :
Hay mucho info en la Web donde explica su uso para medir tiempos con mucha precision, con respecto a generar un retardo especifico, tal vez sea conveniente crear un Thread con resolucion "real time" y ahi aplicar el metodo basado en las 2 funciones anteriores.
En los operativos Win 9X/Me se podia utilizar unas funciones reservadas que paran el "scheduler" de windows

En las listas de Ralf Brown figuran el modo de empleo, pero la idea es que el codigo entre estas dos llamadas no es interrunpido por ningun thread, pero como dije antes no deberia funcionar en Windows NT/2000/XP....
Bueno eso es todo, espero haber aportado algo...
Salu2!

Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: PalitroqueZ en 16 de Octubre de 2007, 15:58:53
Ernesto el Sleep también deja en un lazo eterno hasta que cumpla el plazo del tiempo, aunque se me ocurre esto (no lo he probado):

Código: Visual Basic
  1. ...
  2. Sleep(2000)
  3. DoEvents
  4. ...

Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: LABmouse en 16 de Octubre de 2007, 16:57:16
El DoEvent no se colocaria antes de decirle Sleep???
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: PalitroqueZ en 16 de Octubre de 2007, 17:08:38
que va, lo acabo de probar, no funciona ni antes ni después

Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: LABmouse en 16 de Octubre de 2007, 17:20:10
 :D :D :D :D :D, Bueno pero pasa como con el PIC, ideal para retardos muy pequeños, ya mas grandes es mejor usar el TIMER.

SALUDOS!!!
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: RICHI777 en 16 de Octubre de 2007, 17:29:04
No funciona porque Sleep freeza la aplicación, por eso no sirve llamar a DoEvents antes ni despues.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: migsantiago en 16 de Octubre de 2007, 23:58:08
jeje a este ritmo es mejor conectar un pic al puerto paralelo e indicarle que maneje directamente el servomotor, Windows no puede controlar tiempos con tanta precisión, es probable que solo por hardware se pueda hacer.

Esperemos que den con la solución  :mrgreen:
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: RICHI777 en 17 de Octubre de 2007, 09:52:20
Aca hay una nota de aplicaciíon que muestra la implementacíón de un Timer de alta precision, la nota esta escrita en C++, pero creo que puede ser traducida a Visual Basic.

http://www.codeguru.com/cpp/w-p/system/timers/article.php/c5759/ (http://www.codeguru.com/cpp/w-p/system/timers/article.php/c5759/)

Salu2 !
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: Gorgonas en 17 de Octubre de 2007, 10:08:04
Hay formas de hacerlo tanto en vb6 como en otros lenguajes, pero como dijo bruno no tiene ninguna precision, puesto que la ejecucion de cualquier programa en el ordenador depende de muchos factores que pueden ralentizar la aplicacion por periodos de tiempo que aparentemente no se aprecian, pero hablando de us claro que se notaria.

Desde mi punto de vista trabajar por debajo de 1ms o incluso tiempos algo mayores, es imposible a traves del pc.
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: RICHI777 en 17 de Octubre de 2007, 10:30:44
La nota de aplicación habla de una resolucion minina de 1 ms con una precision del 5 % que puede ser inadecuada en algunas aplicaciones, la otra alternativa muchisimo mas costosa en implementación es hacer un "driver" que corra en otro ring mas cercano al microkernel, pero como dije antes la implementación es bastante complicada.
Salud2!
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: PalitroqueZ en 18 de Octubre de 2007, 15:09:28
Leyendo la nota que menciona RICHI777 me ha dado por buscar las api timeSetEvent en el Apiguide (http://allapi.mentalis.org/agnet/apiguide.shtml) y me he conseguido con que hay un ejemplo:

High Performance Timer

"Descripción:
The timeSetEvent function starts a specified timer event. The multimedia timer runs in its own thread. After the event is activated, it calls the specified callback function or sets or pulses the specified event object."


y aquí el fuente que dan:

Código: Visual Basic
  1. 'This project requires a Form and a Module
  2. 'On the form, there should be one command button (Command1)
  3. 'and one Timer (Timer1)
  4.  
  5. 'In the form:
  6. Option Explicit
  7. Private Sub Form_Load()
  8.     'KPD-Team 2001
  9.    'URL: http://www.allapi.net/
  10.    'E-Mail: KPDTeam@Allapi.net
  11.    Command1.Caption = "Start"
  12. End Sub
  13. Private Sub Form_Unload(Cancel As Integer)
  14.     'Stop the timers if they're still counting
  15.    timeKillEvent hMMTimer
  16.     Timer1.Enabled = False
  17. End Sub
  18. Private Sub Timer1_Timer()
  19.     'increment VBTimer
  20.    VBTimer = VBTimer + 1
  21. End Sub
  22. Private Sub Command1_Click()
  23.     If Command1.Caption = "Start" Then
  24.         'Start both timers
  25.        Timer1.Interval = 1
  26.         Timer1.Enabled = True
  27.         hMMTimer = timeSetEvent(1, 0, AddressOf TimerProc, 0, TIME_PERIODIC Or TIME_CALLBACK_FUNCTION)
  28.         Command1.Caption = "Stop"
  29.     Else
  30.         'Stop both timers
  31.        timeKillEvent hMMTimer
  32.         Timer1.Enabled = False
  33.         Command1.Caption = "Start"
  34.         'Show result
  35.        MsgBox "Timer1_Timer was called " & VBTimer & " times;" & vbNewLine & "TimerProc was called " & MMTimer & " times."
  36.         VBTimer = 0
  37.         MMTimer = 0
  38.     End If
  39. End Sub
  40. 'In a module
  41. Option Explicit
  42. Public Const TIME_ONESHOT = 0  'Event occurs once, after uDelay milliseconds.
  43. Public Const TIME_PERIODIC = 1  'Event occurs every uDelay milliseconds.
  44. Public Const TIME_CALLBACK_EVENT_PULSE = &H20  'When the timer expires, Windows calls thePulseEvent function to pulse the event pointed to by the lpTimeProc parameter. The dwUser parameter is ignored.
  45. Public Const TIME_CALLBACK_EVENT_SET = &H10  'When the timer expires, Windows calls theSetEvent function to set the event pointed to by the lpTimeProc parameter. The dwUser parameter is ignored.
  46. Public Const TIME_CALLBACK_FUNCTION = &H0   'When the timer expires, Windows calls the function pointed to by the lpTimeProc parameter. This is the default.
  47. Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
  48. Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long
  49. Public VBTimer As Long, MMTimer As Long
  50. Public hMMTimer As Long
  51. Sub TimerProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
  52.     'Increment MMTimer
  53.    MMTimer = MMTimer + 1
  54. End Sub

lo que no me queda claro es cuanto tardaría la máquina virtual en ejecutar una línea en vb, porque habría que añadirle ese tiempo.

Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: PalitroqueZ en 19 de Octubre de 2007, 14:37:54
recapitulando: ¿retardo en vb menos de 1ms? no lo creo a menos que trabajemos en ensamblador, en todas las apis que he mirado estan por encima del ms

Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: LABmouse en 19 de Octubre de 2007, 16:41:11
SIP, lastima, Procesador a 4GHz y no somos capaces de hacer un carajo retardo de 1us jajajaja  :D
Título: Re: Se puede hacer retardos menores a un milisegundo en VB ?
Publicado por: IAO en 05 de Mayo de 2008, 16:40:25
Holaaaaa:

Aunque admito no entender muy bien todo este rollo, me interesa el tema.
Buscando e indagando por varios sitios encontré algo en C y Asembler y esto en VB.
MicroSegundos (http://www.vdev.net/MyWebs/vdev.net/vbprofiler/perfcount1.htm)

Está en inglés y tiene un ejemplo al final de la página. Son Cuatro páginas de información
que deberían leer.

Hice varias pruebas con un archivo en .c y .asm llamado uclock, pero me pinto una paloma volando
y no hubo forma de compilarlo. El uclock lo usan para ese oficio desde hace años atrás.

Espero te sirva Sr. LordLafebre. Y si te llega a funcionar, solo dejanos saber por favor.


Bye('_')