Miten tämä olisi järkevintä toteuttaa?
Tarkoitus olisi LPT porttiin tulevien pulssien kestoa mitata mahdollisemman tarkasti.
Itselläni ei hirveästi ole kokemusta QuickBasic 4.00 ohjelmoinnista Joten olen toteuttanut sen tällä tavalla.
DEF SEG=&H40
100
IF (INP(889) AND 64)=0 THEN 100
OUT &H40,&HFF: OUT &H40,&HFF
A=PEEK(&H6C)
200
IF (INP(889) AND 64)=64 THEN 200
OUT &H43,48
B=PEEK(&H6C)
Aika#=(INP(&H40)+INP(&H40)*256%)
IF A<>B THEN 100 ' *** eli laskuri on pyörähtänyt yli ja pulssi on ollut pitempi kuin 0.054s
Aika#=((65535-AIKA#)/1193182))
' *** sitten tallennetaan Aika# ja palataa taas tukimaan LPT porttia
Eli tarkoitus on mitata pulsseja jotka ovat pienempiä kun 0.054s
Tämä toimii kun ajan sitä Dos:ssa, mutta ei varmaan ole kovin järkevää sorkkia tota ajoitinpiirin kello 0 siinä alkaa koneen kellokin käydä väärää aikaa.
Yritin äänenmuodostukseen tarkoitettua kello 2 käskyllä OUT &H43,&HBA joka pitäisi olla kerta ajo, eli laskuri pysähtyisi nollaa jos mitattava aika olisi pitempi, mutta jostain syystä ei toiminut.
Onko mitään mahdollisuutta, että ohjelmaa pystyisi ajamaan Windowsin alla ja saada tarkkaa mittausta ettei Windows varaisi kesken mittausta itselleen aikaa?
Minulle nuo keskeytykset ja muut on aika tuntemattomia asioita.
Muutenkin ohjelman käyttäminen on aika hankalaa kun mitatusta ajasta se piirtää värillistä grafiikkaa ruudulle ja sen tulostuksen joudun toteuttamaan muodostamalla näyttöruudulla olevasta kuvasta BMP kuvan ja sitten käymässä Windowsin puolella tulostamassa USB liitäntään liitetyllä tulostimella.
Mikä olisi Dos käsky, jos hommaisin Dos tulostimen ja ohjelmasta SHELL"?????" käskyllä tulostaisin BMP kuvan, eikös sen pitäisi tulostaa grafiikkaa ja värejä?
Jos joku viitsi neuvoa miten mittaus ja tulostus pitäisi toteuttaa olisin kiitollinen.
Onko jotain erityistä syytä, miksi ohjelma täytyy tehdä DOSilla? Windows-ohjelmalta onnistuisi ainakin paljon kivuttomammin tarkka ajanmittaus ja kuvan tulostaminen.
Ei siinä mitään erityistä syytä ole, mutta tuo QuickBasic on ainoa ohjelma jolla osaan jotain pientä tehdä.
Pystyy sitä ohjelmaa ajamaan windows ikkunassakin, mutta sillon ajan mittaukseen tulee virhettä, syystä josta en tiedä. Päättelin se johtuvan siitä kun Windows on "moniajo-ohjelma" ja se varaisi aikaa johonkin muuhun aina välillä, niin virheet johtuisivat siitä.
En tiedä olenko oikeassa mutta tuolla laskurin uuden raja-arvon kirjoituksella estän sen pulssin mittauksen aikana menemästä nollaa ja tekemästä muita keskeytyksiä joten mittaus olisi tarkka, sitä en tiedä onko näin.
Pitäisikö tuo portin luku tehdä jotenkin keskeytyksillä eikä lukemalla jatkuvasti porttia.
Todellisuudessa tuossa portin lukemisessa on useampi lukukäskyjä peräkkäin, Koska kun se pulssi nousee ja laskee siinä on hieman "kytkinvärähtelyä"
Miten nuo mainitsemat kivuttomammin toteutetut ajan mittaukset pitäisi tehdä ja millä ohjelmalla.
Voisit tietenkin hommata vaikka Visual Basicin, jossa käytettävä ohjelmointikieli on lähestulkoon samaa kuin QuickBasicissa... Ja sietlä puolestaan löytyy MSComm ActiveX-komponentti, jolla tämä kait onnistuisi...
Taikka unohtaa Windows ja muut aivan kokonaan. Löysin meinaan netistä jutun jonka mukaan moninajojärjestelmät ovat kuunelma melkoisen huonoja, jos aikoo jotain mitata millisekuntien tarkkuudella.
-Grey-
Kyllä Windowsinkin ihan tarkkaan ajanmittaukseen pitäisi kyetä. Yksi tapa on käyttää WinApin QueryPerformanceCounter-funktiota, jonka käytöstä VB:llä kirjoitin koodivinkin taannoin:
https://www.ohjelmointiputka.net/koodivinkit/
Onko sulla tietoa kuinka tarkkaan ajanottoon VB:n kyseisellä esimerkillä pääsisi.
Tolla quickbasikin esimerkillä pääsee "periaattessa"
1/1193182=0.0000008s tarkkuuteen +-1 laskurin sykäys, kun eihän sitä tiedä onko laskurin arvo juuri muuttunut vai muuttumassa, kumminkin yli sekunnin miljoonasosan tarkkuuteen, jos vaan kone ehtii lukea porttia tarpeeksi nopeasti.
Tuo on nyt teoriaa ja saattaa todellisuus olla hieman toinen.
Silloin kun se lukee porttia se ei saisi tehdä minkäänlaisia keskeytyksiä eikä mitään muutakaan, ettei se pulssin laskeminen portista jäisi huomaamatta tarkasti.
Täytyy varmaankin alkaa suunnitelemaan sitä jollain itsenäisellä tiedonkeruu kortilla josta sen tiedon voi sitten lukea kortin muistista, niin ei ole väliä millä ohjelmalla sitä pyörittää.
Mutta jos kyseiseen asiaan tulee ajatuksia/oivalluksia kertokaa ihmeessä.
lainaus:
Onko sulla tietoa kuinka tarkkaan ajanottoon VB:n kyseisellä esimerkillä pääsisi.
Tällä koneella (Windows 2000) aika kasvoi reilulla 3500000:lla sekunnissa eli teoriassa tarkkuus oli 1/3500000 s eli 0,00000029 s.
Tuo oli jo lähes kolme kertaa tarkempi, mitenkähän tuo funktio on toteutettu lähinnä"konekielisellä tasolla"
Silloinhan pitäis jossain osotteessa olla joku 3.5 mhz taajuudella "tikuttava laskuri" vai onkohan se joku silmukkarakenne, että se vertaa ensiksi pitempään aikaan ja sitten katsoo monta kertaa se ehtii pyöriä jossain luupissa ja laskee siitä aikaa.
Mutta jos windows:ssa pystyy aja tota yhtäjaksosesti ja aina pääsee lähellekkin noita tarkkuuksia,tuntuis kyllä hyvältä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.