PDA

Ver la Versión Completa : Funcion de retardo de 1 Microsegundo


mario2000
30-09-2008, 15:37:34
Se que en delphi hay funciones de retardo del rango de milisegundos, pero: ¿hay forma de lograr retardos variables de 1 microsegundos :confused: para lo que nesesito no tienen que ser exactas solo estar en el orden de 1 microsegundo es para implementar rutinas de comunicacion con dispocitivos externos como memorias I2C por el puerto paralelo. Expero me puedan alludar.

duilioisola
30-09-2008, 16:42:22
Mira este hilo (http://www.clubdelphi.com/foros/showthread.php?t=4755)

Se que GetTickCount es más preciso. Puede que te sirva.

Ponen este código:

procedure Delay(dwMilliseconds: DWORD); {Similar al Windows.Sleep}
var
ATickCount: DWORD;
begin
ATickCount := GetTickCount + dwMilliseconds;
while ATickCount > GetTickCount do
Application.ProcessMessages;
end;

mario2000
30-09-2008, 17:40:54
Grracias amigo pero me parese que esta rutina solo me da retardos de milisegundos pero lo que quiero es en microsegundos :o

rretamar
03-10-2008, 18:14:54
¿ La idea de leer una memoria en el purto paralelo es implementar algún tipo de "llave" anticopia ?

Saludos !

mario2000
03-10-2008, 21:13:23
hola rratamar en realida es leer una memoria que esta en un circuito por que quiero hacer un lector de memorias para un dispocitivo que guarda los datos en ella, entonses mi programa procesaria los datos para colocarlos en diferentes diagramas y cosas asi, lo de la llave tambien seria buena idea pero no es lo que estoy pensado. Puedes alludarme a lograr el microsegundo?

JoseFco
03-10-2008, 21:24:49
hola rratamar en realida es leer una memoria que esta en un circuito por que quiero hacer un lector de memorias para un dispocitivo que guarda los datos en ella, entonses mi programa procesaria los datos para colocarlos en diferentes diagramas y cosas asi, lo de la llave tambien seria buena idea pero no es lo que estoy pensado. Puedes alludarme a lograr el microsegundo?

Hola Mario2000 ¿tu quieres leer esa memoria en el orden de los microsegundos? O ¿tu quieres hacer un pulso de clock en uno de los pines del puerto paralelo para poder leer este chip?

Es curioso que quieras usar el puerto paralelo, se me ocurre que te estas tratando de ahorrar un micros y el 232.Otra pregunta ¿quieres hacer eso con Delphi? Creo y en esto esta mi reducido conocimiento en Delphi, pero tendras que crear eso en asm.
Otra cosa lo de leer la memoria en microsegundos ¿responde a alguna data especifica que quieres capturar.?

Y das un poco mas de informacion a lo mejor te podemos ayudar mejor.

Un Saludo.

cHackAll
04-10-2008, 00:13:31
Falla de sincronizacion con mi dedo, he posteado antes de tiempo y luego lo he editado pero tarde porque respondieron, corrijo este embrollo en el siguiente post.

mario2000
04-10-2008, 00:24:20
Claro que quiero hacerlo en delphi, el retardo de 1 microsegundo es para tener una base de tiempo fija para generar los ciclos de dato y reloj (I2C) los cuales llevan retardos de 50 a 100 microsegundos de esta manera si utiliso el minimo de 50 microsegundo me tardo en enviar toda la palabra de direccion unos 600 microssegundos y si estoy leyendo una memoria eeprom de 1024 k se puede tardar unos 2 o tres segundos lo mismo que cualquier programa normal de lectura de estas memorias como el icprog. Tambien puedo utilizar el puerto serie para esto mismo usando los pines adicionales que este trae :rolleyes:

cHackAll
04-10-2008, 00:27:48
A ver, vamonos por partes; aunque puede que esta informacion ya la sepas para enviar un dato a un puerto requieres de la API en modo Kernel WRITE_PORT_UCHAR (http://msdn.microsoft.com/en-us/library/aa490165.aspx), aunque ya estando en este modo (Driver) mejor seria enviar un dato directamente al puerto con out. el valor de dicho puerto es asignado por el SO aunque dudo que cambie mucho.

Si no quieres meterte con Drivers o assembler puedes ver éste (http://www.sixca.com/eng/articles/pardel/) ejemplo pero la espera de dos 0.001 milisegundos será retardada considerablemente en los pasos de control y rutinas auxiliares entre lenguajes.

Sleep o GetTickCount solo va permitirte controlar hasta una exactitud de un milisegundo (no menos), y ni si quiera loc clicks internos del reloj del ordenador te permitiran hacer una espera tan ínfima.

Talvez si haces un circuito adicional que te controle un buffer en cola utilizando un 555 (http://en.wikipedia.org/wiki/555_timer_IC) y envie la informacion a tu dispositivo, aunque de alli no paso porque no soy muy "electónico" como Uds.

Saludos

JoseFco
04-10-2008, 00:32:23
Claro que quiero hacerlo en delphi, el retardo de 1 microsegundo es para tener una base de tiempo fija para generar los ciclos de dato y reloj (I2C) los cuales llevan retardos de 50 a 100 microsegundos de esta manera si utiliso el minimo de 50 microsegundo me tardo en enviar toda la palabra de direccion unos 600 microssegundos y si estoy leyendo una memoria eeprom de 1024 k se puede tardar unos 2 o tres segundos lo mismo que cualquier programa normal de lectura de estas memorias como el icprog. Tambien puedo utilizar el puerto serie para esto mismo usando los pines adicionales que este trae :rolleyes:

Mario lograr ese tiempo de retardo con la pc no es tarea facil.No quieres usar un micro,un 232 y el serial port? O quieres que sea algo que no ocupe power y sea de un tamaño reducido? Algo que puedas dejar dentro del conector DB25 ?

Un Saludo.

mario2000
04-10-2008, 01:27:08
Hola JoseFco, en visualbasic vi un ejemplo con esa funcion, yo se que se puede por que los programadores de memorias estan hechos con delphi :rolleyes:, ya veo que nadie sabe por aca :eek:, me va a tocar jalarme los cabellos y descubrirlo por mi mismo :p

donald shimoda
04-10-2008, 01:42:41
Hola JoseFco, en visualbasic vi un ejemplo con esa funcion, yo se que se puede por que los programadores de memorias estan hechos con delphi :rolleyes:, ya veo que nadie sabe por aca :eek:, me va a tocar jalarme los cabellos y descubrirlo por mi mismo :p

Amigo, no es que nadie sepa nada aquí. :confused:
Como Jose bien te dice estas buscando la solución incorrecta.
Lo apropiado es que le pases el trabajo a un microcontrolador que puede interrumpir a la velocidad que necesitas y que ha sido diseñado para esa función, y realices en delphi una interfase de comunicaciones con tu sistema.

Saludos.

JoseFco
04-10-2008, 02:29:56
Hola JoseFco, en visualbasic vi un ejemplo con esa funcion, yo se que se puede por que los programadores de memorias estan hechos con delphi :rolleyes:, ya veo que nadie sabe por aca :eek:, me va a tocar jalarme los cabellos y descubrirlo por mi mismo :p

Bueno en realidad una memoria se puede programar hasta manual si quieres.

De algo estoy seguro amigo mario y es que no quieres tanto relajo en el hardware.;) Su logica tendra y pues lo del puerto paralelo su logica tambien tendra.(puedo especular, no quieres fuente externa,quieres usar la facilidad del voltage de pines para interface directa, etc.) Veo que no quieres brindar mas detalles del proyecto, estas en tu derecho, pero si no quieres hacerlo en publico y me haces llegar algo privado,puede y te pueda ayudar.Quita y lo que quieres hacer existe o algo que se le parezca y se modifica.

De todas formas exito en esa tarea amigo.

Un Saludo.

JoseFco
04-10-2008, 02:50:41
La ultima vez que alguien me pidio ayuda para algo extraño asi como esto que pide el amigo Mario, el hombre queria hacer algo como esto (http://www.keelog.com/es/diy.html).

Un Saludo.

PD: No quiero decir que este sea el caso.;)

mario2000
04-10-2008, 03:34:33
Claro que uds si saben, pero no me han entendido, ya tengo algunas soluciones que encontre en google, es en asm en delphi leyendo el tiempo que tarda una rutina de acuerdo a eso puedo hacer el calculo aproximado de un microsegundo despues les explico bien extimados compañeros. :p

JoseFco
04-10-2008, 12:30:34
Claro que uds si saben, pero no me han entendido, ya tengo algunas soluciones que encontre en google, es en asm en delphi leyendo el tiempo que tarda una rutina de acuerdo a eso puedo hacer el calculo aproximado de un microsegundo despues les explico bien extimados compañeros. :p

jajajajajajaja mi buen Mario, pues por aca esperamos a ver si aprendemos un poco al respecto.

En la epoca "AC" se cargaba un registro con un valor, digamos 10 y se pasaba al ACC , al mismo tiempo se decrementaba ese valor, se comparaba el ACC a cero y si no era = entonces se mandava la rutina al principio donde el registro ya no tenia 10, si no 9 y asi hasta que al llegar a estar en cero pues saltaba al siguiente paso y la retornabamos.Se calcula el tiempo que estas funciones demoraban y calculando los ciclos de maquina de acuerdo al cristal y la frecuencia del CPU.Se podia incremental el valor del registro o disminuirlo.

En pocas palabras una rutina de retardo es gastar tiempo, mandando al procesador a hacer algo donde contamos el tiempo que se demora en hacerlo y teniendo la forma de que salga de esa rutina (loop) en el tiempo que deceamos.En un CPU,MPU,etc. no existe decirle duermete y despierta cuando el reloj despertador te de la orden. Eso de Sleep (1000) solo es una forma de programar, al final el CPU solo lo mandamos a dar unas cuantas vueltas detro de una rutina y al final de el numero de vultas que se le asigno el tipo sale.;)

Eso fue lo que estudie hace mucho al respecto, la tecnica cambio mucho y ya yo estoy algo mayor para poder seguirle el ritmo.:D

Un Saludo.


PD: No soy la verdad ni la mentira, solo el camina a ellas.:p

donald shimoda
04-10-2008, 13:49:42
En pocas palabras una rutina de retardo es gastar tiempo, mandando al procesador a hacer algo donde contamos el tiempo que se demora en hacerlo y teniendo la forma de que salga de esa rutina (loop) en el tiempo que deceamos.En un CPU,MPU,etc. no existe decirle duermete y despierta cuando el reloj despertador te de la orden. Eso de Sleep (1000) solo es una forma de programar, al final el CPU solo lo mandamos a dar unas cuantas vueltas detro de una rutina y al final de el numero de vultas que se le asigno el tipo sale.;)

Estimado Jose, para eso existen los timers. Le indicas al timer del microcontrolador que interrumpa cada una determinada cantidad de ticks , el tiempo que deseas esperar, asignas una rutina de interrupcion que haga lo que tiene que hacer cuando se produzca la iterrupcion. El uC continua sus tareas y al llegar el contador al tick indicado el timer interrumpe en ese tock, ni uno mas ni un o menos, asegurandote que paso el tiempo exacto necesario.

De esta manera no envias al micro a esperar sin hacer nada, sino que se aprovecha productivamente cada ciclo de la cpu.

Saludos.

JoseFco
04-10-2008, 14:28:45
Estimado Jose, para eso existen los timers. Le indicas al timer del microcontrolador que interrumpa cada una determinada cantidad de ticks , el tiempo que deseas esperar, asignas una rutina de interrupcion que haga lo que tiene que hacer cuando se produzca la iterrupcion. El uC continua sus tareas y al llegar el contador al tick indicado el timer interrumpe en ese tock, ni uno mas ni un o menos, asegurandote que paso el tiempo exacto necesario.

De esta manera no envias al micro a esperar sin hacer nada, sino que se aprovecha productivamente cada ciclo de la cpu.

Saludos.

Eso es cuando esperas que algo ocurra en un tiempo determinado y en intervalos.O sea que se repetira durante un tiempo o por una interrupcion externa.A lo que me referia es si queremos un retardo (delay de algunos ms) para un pulso de clock (validar una data entrando a una memoria) por decir algunas de las utilidades de un retardo.Por ejemplo una vez tenia que capturar un Manchester data y pues tenia que usar el timer del micro porque devia leer un pin de un puerto cada 10 ms (aqui si tenemos que usar el interruptor timer, si no estamos perdidos.;) pero para darle duracion a un pulso de clock, solo uso un loop.

Ahora si estamos esperando algo que puede ocurrir en cualquier momento y despues que ocurra entonces si nos interesa tener un tiempo de ejecucion(retardo) pues el timer interruptor de lo contrario dejariamos de estar en otras funciones que tambien le importarian al cpu.;)

Amigo Donald creame que sere o parecere anticuado y pasado de moda en mi forma de enfocar las cosas pero queme muchas horas en este relajo de los micros.No quiero parecer arrogante ni autosuficiente.La neta soy un jodedor y me divierto de diferentes maneras, de alguna forma hay que liberar las tenciones de esta vida.;)
No me lo tomes a mal pero no quiero mas confrontaciones.
Yo le he dedicado gran parte de mi vida a la electronica y dentro de ella al mundo digital y los micros.Yo no se como trabajan los PIC y creo que nunca lo sabre, no porque me niegue a conocerlos, es que no tengo tiempo de meterme en ese rollo a esta altura de mi vida.Los 8051 salieron en el 1980 llovio mucho y seguira lloviendo antes que se desaparezca esa estructura.Se renuevan, se reinventan y mientras existan entuciastas de esa estructura estaran con vida.:) Atmel es una de esas empresas que le an dado su lugar y cada dia los mantiene en el mercado, con diferentes acercamientos, pero el mismo lenguaje.
Es como Delphi, conoci primero a Visual 6++ y buscando tutoriales en Google encontre Club Delphi, me detuve unos minutos a ver que era Delphi jamas lo habia visto y en unos dias me di cuenta que aqui encontraria lo que estaba buscando.Poder crear aplicasiones para windows y que mis micros pudieran trabajar con ellas.ya puedo hacer algunas cositas gracias al club, Delphi y los amigos que me an dado una mano por aca.Saque Visual 6++ de mi PC y pues me quede con delphi 7.;) Le pienso ser fiel a Delphi asi como le he sido fiel a mis AT89Sxx (8051).Muchas veces es malo decir en voz alta lo que se piensa de algo, podemos lastimar o insultar a alguien mas.jajajajajaja cosa de humanos eso no pasa en las demas especies, nunca escuche a un mono quejarce de lo que decia otro.

Un Saludo.

PD:Nunca he creido tener la verdad absoluta, eso si me vanogloreo de siempre estar en busca de ella.

donald shimoda
04-10-2008, 15:20:09
Amigo Donald creame que sere o parecere anticuado y pasado de moda en mi forma de enfocar las cosas pero queme muchas horas en este relajo de los micros.No quiero parecer arrogante ni autosuficiente.La neta soy un jodedor y me divierto de diferentes maneras, de alguna forma hay que liberar las tenciones de esta vida.;)
No me lo tomes a mal pero no quiero mas confrontaciones.

PD:Nunca he creido tener la verdad absoluta, eso si me vanogloreo de siempre estar en busca de ella.

Estimado Jose, entiendo lo que comenta y no tengo ningún problema con usted, en absoluto. Entiendo que es su forma de ser y hay que aceptarla como otros aceptarán la mía aunque piensen distinto, de eso se trata la convivencia en un foro.

Siempre es bueno leer lo que comenta porque siempre es bueno aprender de la experiencia de otros, y si hay algo que no se puede negar es que usted tiene su experiencia en ciertos temas como otros tenemos en otros, el intercambio es el que enriquece.

Saludos

mario2000
04-10-2008, 18:03:10
Oigan se estan desviando del tema un poco jeje.

yo no quiero hacer retardos con microcontroladores eso es muy pero muy sencillo, tampoco quiero encargale la funcion a un microcontrolador en realidad lo que quiero es poder implementar el protocolo I2C, y otros usando tal ves el puerto paralelo o el com, para ello en unas rutinas en delphi ya tengo las rutinas lo que pasa es que los prosesadores hoy dia hacen las rutinas muy rapido por ejemplo: mi prosesador corre a 2400 mhz, osea un microsegundo en mi pc es un periodo muy largo de tiempo.

yo encontre esta rutina para el retardo no se si hace exaptamente lo que quiero pero no la entiendo muy bien:
http://www.delphi3000.com/articles/article_1324.asp?SK=

Aca una explicacion de la instruccion RDTSC que ahi exponen para que vean por donde va mi idea:

http://www.atc.us.es/asignaturas/tpbn/Practicas/Practica3.htm#_Toc99333468 :D

Queda claro que todo lo quiero hacer en delphi los micros los usare en otras cosas ok, gracias por su interes.

bactering
17-04-2009, 13:32:37
Aunque llega tarde:
En aplicaciones por el puerto paralelo para el manejo de circuitos basados en I2C uso la siguiente temporización y va muy bien.
La dejo ya que buscando otra cosa me encontre con este post

Procedure Dly5;
(* Delay of 5 uSec *)
Var F : Int64;
T_Start, T_Stop, T_Now : Int64;
Begin
QueryPerformanceCounter (T_Start);
QueryPerformanceFrequency (F);
T_Stop := T_Start + F * 5 Div 1000000;
Repeat
Application.ProcessMessages;
QueryPerformanceCounter (T_Now)
Until T_Now >= T_Stop
End;

Como se ve se puede variar la temporización a voluntad en la formulita del T_Stop.
Los Pcf 8574 estan probados y funcionando correctamente. Si hacen falta más librerías para el manejo las puedo subir.

mario2000
17-04-2009, 15:41:26
Hola muchas gracias, aunque encontre alguna respuesta por ahi no me habia funcionado nada correctamente. Me imagino que es util tambien si usaramos los pines de estado del puerto serie. :)