C/Visual C - retardos en c++

 
Vista:

retardos en c++

Publicado por Joaquin Llano (10 intervenciones) el 05/07/2006 02:09:36
Hola a todos/as.

Necesito crear un retardo de un microsegundo independientemente de qué pc tenga. Es para emplearlo en un conversor D/A cuyas muestras están almacenadas en un fichero y las cuales se tomaron a una determinada frecuencia. Necesito reproducir dicho fichero a la misma frecuencia que se muestreó.

¿Alguna sugerencia?

Gracias y saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:retardos en c++

Publicado por fernando.gomez (1604 intervenciones) el 05/07/2006 04:48:19
Puedes mandar llamar a Sleep:

::Sleep(1);

donde el parámetro es el número de milisegundos a emplear. No puedes irte más allá de los milisegundos con esta función.

C provée el tipo de dato time_t, que representa el número de segundos transcurridos desde la "época" o "tiempo calendario", que es 00:00:00 GMT del 1 de enero de 1970. Usualmente, time_t se define como un long int. Lo que tendrías que hacer entonces es convertirlo a un double y dividirlo entre 1e6 (una micra es una millonésima, __creo__) y hacer tu cálculo manualmente.

Ahora bien, aunque dudo que lo puedas hacer, si lo lograses (y sería interesante que lo publicaras, por curiosidad mía al menos) debes de tener en cuenta que el programador no es dueño del tiempo de procesamiento. Si en ese instante a Windows (o el sistema operativo que emplees) se le ocurre darle prioridad a otro hilo/proceso, tu rutina se dejará de procesar aunque sea por unos milisegundos, dando al traste con lo que quieres hacer.

Buena suerte, sin embargo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:retardos en c++

Publicado por Joaquín Llano (10 intervenciones) el 05/07/2006 08:15:03
Algo parecido a lo que me dices lo estuve intentando anoche.

Lo que intenté es poner un contador que se iba incrementando sucesivamente hasta un límite marcado y medir cuánto se tarda en realizar esa cantidad de sumas dadas inicialmente. Mi problema es que puedo poner un 1 y 8 ceros seguidos para la suma y tarda normalmente unos 10 s, pero luego no es capaz de realizar la división.

Ahora o esta tarde probaré a en lugar de realizar sólo una operación básica, realizar por ejemplo 1000 y dividir de esa forma, para hacer en el retardo, pues por decir algo 15 veces esas mil operaciones.

De todas formas luego publicaré mis progresos.

Ahora mismo lo que hago para esos retardos pues es poner un contador, el problema pues es que dependiendo de qué ordenador se use ese contador varía, y también depende de la frecuencia a la que se muestreó el fichero.

Gracias por todo y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:retardos en c++

Publicado por Ion (7 intervenciones) el 05/07/2006 09:56:36
Hola:

Como bien dice Fernando, ten en cuenta que los PCs no están pensados para realizar trabajos digamos en "tiempo real", como lo están los microcontroladores/procesadores. Sino que están orientados a la multitarea ó multiproceso.

Cuando programas un PC, hará lo que tú le digas, ¡¡pero cuando el sistema operativo crea conveniente que pueda hacerlo!! Por eso no se puede confiar en medidas de tiempo exactas (si el tiempo a medir es pequeño), en una aplicación de PC.

Si en lugar de 1 PC, programas directamente un circuito hardware, ya sea con C, C++ o ensamblador, entonces sí podrías tener un control preciso del tiempo. Para soluciones complejas que requieran el uso de distintos periféricos, existen sistemas operativos en tiempo real (RTOS), que pueden "embeberse" ("embedded" en inglés) dentro del microprocesador. Un ejemplo es eCOS de Redhat.

Si te es indispensable el control de tiempo, quizás, en lugar de mandar las muestras directamente del PC al D/A, podrías plantearte usar algún montaje hardware intermedio (memoria+micro) que almacene temporalmente las muestras en un buffer, y las pase al D/A con la frecuencia deseada.

No sé...es una idea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:retardos en c++

Publicado por Nelek (816 intervenciones) el 05/07/2006 11:51:43
Mira, nos e si te servira pero te comento lo que hice yo en un proyecto de hace unos años.

El objetivo era controlar el giro de un motor de corriente continua desde el pc (en 1 instancia) y despues desde un microcontrolador.

Cuando lo hice desde el pc, yo programaba en Borland C++ Builder 1.6 (creo recordar). El intermedario con el proceso era una tarjeta de adquisicion de datos PCI9118Lab. La salida del pc era digital, dicha señal le llegaba a un par de PALs, de ahi a un puente H para amplificar la intensidad y hacerla continua, luego llegaba el motor. Dicho motor tenia un disco pintado en codigo gray que afectaba a un sensor optico, el sensor daba un tren de pulsos que luego eran transformados a continua mediante un conversor frecuencia-tension y eso era lo que acababa por entrar al pc, en formato analogica.

Para el manejo del proceso yo cree un modulo especial donde solo habia un timer y el decia que se tenia que hacer en cada momento.

En principio tambien lo queria hacer en tiempo real como tu, y me tope con los problemas que ya te han descrito, asi que lo que hice fue "disimularlo" de la siguiente manera.

Despues de saber cuanto tiempo necesitaba para realizar una de las "tareas minimas" lo que hice fue redondear hacia arriba el tiempo y ese valor se lo puse a un timer. Luego lo que hacia era:

Periodo 1: escribo salida, leo entrada, guardo datos
Periodo 2: realizo calculos, escribo salida, leo entrada
Periodo 3: guardo datos, escribo salida, leo entrada
Periodo 4: actualizo variables, escribo salida, leo entrada
Periodo 5: actualizo todas las vistas, tomo los nuevos valores de control (usuario)

Con esto logre "disimular" las tomas de control del windows y disminuir al maximo el desfase entre tiempo real y tiempo de periodo de control. Ya que, al tomar los 5 periodos pero tener 4 valores de datos, realizaba la media de esos 4 valores y "extrapolaba" que si 4 tomas de datos tenian un valor de X, 5 tomas tendrian X con un margen de error de Y%, cuando logre que el Y% fuera menor a 5% el profesor me lo tomo por valido y pude entregar.

Lamento no poder ser mas exacto, esto fue hace mas de 3 años (como puedes observar por la version de BC++ que use), pero espero que al menos te pueda servir para algo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:retardos en c++

Publicado por Joaquin Llano (10 intervenciones) el 12/07/2006 19:36:03
Hola de nuevo, siento habeos tenido tan abandonados pero me ha salido trabajo para esta semana y no he tenido tiempo.

Os comento, por si a alguien le sirve de algo.

Al final lo que he hecho ha sido:
- Primero guardo el valor que me da time en una variable temporal.
- Entro en un bucle que incrementa un indice hasta que time- mi varaible temporal sea menor que por ejemplo 10 segundos.
- Luego aplico una regla de tres, si efectua contador operaciones en 10 segundos, tendra que efectuar x operaciones en el tiempo que queramos que se retarde.

Los problemas que me deciais del sistema operativo los noto, sobre todo si empiezo a abrir programas y demás, pero bueno, para lo que lo quería me sirve.

De todas maneras ahora mismo me encuentro en el siguiente paso que es colocar un microcontrolador y transmitir en serie, así que me estoy dando cabezazos con el pickdev y demas.

Gracias por todo y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar