Newsgroup: it.comp.lang.visual-basic
Titolo: Ritardo 400us

Come posso ottenere un ritardo di circa 400us (microsecondi)?
Avevo pensato ad un ciclo FOR ma non ho la più pallida idea di come
calcolare il ritardo che ottengo...
Grazie
Alessia

 Come posso ottenere un ritardo di circa 400us (microsecondi)?
Allora Alessia...
Esiste una funzione GetTickCount che ti fornisce come Long il numero di
millisecondi che sono trascorsi dall'avvio di windows. Per cui una soluzione
al tuo problema puņ essere questa:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim Tinizio As Long
    Tinizio = GetTickCount       'valore iniziale in millisecondi
    while (GetTickCount <= Tinizio+1)
        'non fare nulla
    wend
Questo ti permette teoricamente un delay di circa 1000 microsecondi (1
millesimo).
Andare al disotto del millesimo mi sembra praticamente inutile in quasi
tutte le applicazioni, salvo hard-realtime. A cosa ti serve, per curiositą?
Personalmente non conosco metodi per scendere al disotto di quella soglia.
Sarei lieto di venirne a conoscenza e spero in una risposta da parti di
quelli bravi sul serio. :o)))
Ciao,
Antonio
PS: finalmente qualche donna... siamo anche coetanei... :o))
--
"I grandi spiriti hanno sempre incontrato violenta
opposizione da parte delle menti mediocri."
A.Einstein

 calcolare il ritardo che ottengo...
Siamo in due, mi interessa solo sapere a cosa ti serve
un ritardo cosi piccolo?
________________________________________
James Tiberius Kirk, matricola SC 937-076 CEC
  Nato a Riverside, nello Iowa, USA, Terra
            il 1277.1 (26/03/2233)

 
Prova avedere se funziona la API:
QueryPerformanceCounter
e la:
QueryPerformanceFrequency
ciao
		maxx

 calcolare il ritardo che ottengo...
Sleep(), ma ha una precisione al millisecondo.
Non credo sia fisicamente possibile arrivare ai micro, comunque M$ dice
questo per le CPU che supportano l'hi-resolution-performance-counter (e
quindi ne va testata la presenza):
"
For Intel®-based CPUs, the resolution is about 0.8 microseconds. For
MIPS®-based CPUs, the resolution is about twice the clock speed of the
processor.
"
Quindi saresti comunque imprecisa.
Se a questo sommi i cicli macchina necessari per VB stesso...
Ciao

Come posso ottenere un ritardo di circa 400us (microsecondi)?
*di fatto* e' impossibile su sistemi basati su intel x86 con sistema
operativo microsoft.
dovresti andare almeno su qnx o altro sistema operativo "real time".
saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 26+15, RA, 193, 152
   VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 BMW 530D "BatMobile EVO" Driver - Subarone da 500 CV dreamer
Kawasaki "Gas Gas" ZZ-R 1100 - HD Electra Ultra Classic Dreamer
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

Spiego brevemente a cosa mi servirebbe:
Devo acquisire un dato trasmesso in seriale su LPT (su di un pin) da un
dispositivo esterno.
La linea è normalmente a 1 (high).
Quando il dispositivo trasmette, invia 4 bit di "start" seguiti da bit di
dati
La tensione sull'ingresso sarà del tipo:
1111110101XXXXXXXXXXXXXXX111111111
            |                                                |
            | inizio trasmissione                    |fine trasmissione
X= 1 bit
In poche parole dovrei attendere che la linea vada a 0 e poi iniziare a
campionare i bit che hanno un lunghezza di circa 400us
L'intera operazione di lettura dura circa 40ms
Alessia80

Credo che Vb non sia adatto in tal caso. L'ideale sarebbe l'assembler... mi
correggano se sbaglio.
ciao,
Antonio


Ho messo giu ( è in parte scopiazzato) alcune righe di codice:
Public Declare Function QueryPerformanceCounter Lib "Kernel32"
(lpPerformanceCount As LARGE_INTEGER) As Long
Public Declare Function QueryPerformanceFrequency Lib "Kernel32"
(lpFrequency As LARGE_INTEGER) As Long
Public Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type
Dim Start_Time As LARGE_INTEGER
Dim End_Time As LARGE_INTEGER
Dim HighTimerFreq As LARGE_INTEGER
Dim MicroSecondi As Integer
MicroSecondi  = 400
QueryPerformanceFrequency HighTimerFreq
Delay_Counts = HightTimerFreq * MicroSecondi
If QueryPerformanceCounter(Start_Time) Then
    Do
        QueryPerformanceCounter End_Time
    Loop Until (End_Time - Start_Time) > Delay_Counts
    Msgbox("Comprati un high-resolution timer. Bill")
End If
Il problema sono le operazione algebriche con dati di tipo LARGE_INTEGER nel
calcolo di Delay_Counts e nella condizione del Loop
Come si fanno?
Forse occorre trasformarli con calcoli del tipo
Start_Time. lowpart  + 2^32 * Start_Time.highpart ??!!
Una volta che il codice sarà funzionante ho intenzione di provarlo
facendogli generare il clock come output sulla LPT per vedere cosa ne esce
con un oscilloscopio (sempre che riesca a reperirne uno). Forse così
scoprirò
quanto "high-resolution" è questo timer.
Dopo di che passo, ad un NG di assembler... :-((((
Resto in attesa di commenti, suggerimenti...
Grazie a tutti
Alessia80

 condizione del Loop
Questa è la parte più semplice, basta convertirle in double:
<code>
Function LIToDouble(ByRef li As LARGE_INTEGER) As Double
    Dim dblLo As Double, dblHi As Double
    Dim Lo As Long, Hi As Long
    Lo = li.lowpart
    Hi = li.highpart
    dblLo = Lo
    If (Lo < 0) Then dblLo = 2 ^ 32 + Lo
    dblHi = Hi
    If (Hi < 0) Then dblHi = 2 ^ 32 + Hi
    LIToDouble = dblLo + dblHi * 2 ^ 32
End Function
</code>
Solo che un simile loop ti manda la CPU al 100%.
Credo che scrivere un driver che acceda alla seriale sia
l'unica soluzione.
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

 calcolare il ritardo che ottengo...
Non è possibile; l'intervallo minimo gestibile da Win9x è 1/27s. Anche il
Timer di VB, infatti, permette di gestire intervalli al millesimo (anche 1
millesimo) ma il minimo rimane sempre 1/27 di secondo (anche se imposti 1
millesimo, in realtà lui non lo considera).
Se usi WinNT/2000 il discorso cambia. Comunque VB non è certo il linguaggio
adatto per fare una cosa del genere.
Ciao,
Andrea

     If (Hi < 0) Then dblHi = 2 ^ 32 + Hiì
A cosa servono questi due IF?
Scrivere un driver? Qui finiscono le mie conoscenze...
Come?
Grazie ancora
Bye
Ale80

 Come?
La cosa purtroppo non è per nulla banale, e non può essere
fatta in VB, ma difficilmente vedo altre soluzioni. Conosci il
C?


 C?
umm umm ... io consiglierei un po di ASM , lavorando direttamente sui
registri la cosa puo' risultare molto + performante !

 performante !
Ormai, salvo casi particolari, scrivere codice ASM non porta a
miglioramenti di prestazioni, anzi...


Anni fa avevo scritto qualche prg DOS usando il C++ della Borland


 Borland
Prova a scaricarti il DDK (Driver Development Kit) dal sito della
M$, e a leggerti un po' di documentazione.


miglioramenti di prestazioni, anzi...
in un processore fatto bene, non porta *mai* ad aumenti di
prestazioni. uno dei primi requisiti di un processore e' proprio
l'avere un linguaggio macchina che permetta l'ottimo funzionamento del
suo compilatore.
saluti che rispondo davvero solo ai post che non c'entrano niente...
scusatemi :P
-- 
      Gianni "bugbarbeq" Rondinini, 26+15, RA, 193, 152
   VBR - Vero Birro RomagnoloŽ, diffidate dalle imitazioni!
 BMW 530D "BatMobile EVO" Driver - Escortone da 500 CV dreamer


 l'ottimo funzionamento del suo compilatore.
Beh, dubito che gli Intel siano realmente fatti bene ;-)


Beh, dubito che gli Intel siano realmente fatti bene ;-)
non mi mettere in bocca parole che non ho detto --ma che ho pensato
*FORTISSIMO* ;)--
saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 26+15, RA, 193, 152
   VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
