[ apsolvent1 @ 21.01.2004. 09:41 ] @
Kako se postize periodicno izvrsavanje operacija nakon isteka odredjenog vremena
(npr svakih 110ms) - analogija sa timer kontrolom u visual studiju?

Potrebno mi je naizmenicno ocitavanje sa AD/DA konvertora na svakih 110ms.
[ filmil @ 21.01.2004. 10:29 ] @
Citat:
Kako se postize periodicno izvrsavanje operacija nakon isteka
odredjenog vremena


U Turbo C-u je jedini izlaz da se zakačiš za tajmerski prekid. Pogledaj
funkcije setintvec i getintvec (valjda se tako zovu). Kako je rezolucija
tajmera poznata, moći ćeš da periodično očitavaš konvertor. Međutim, ako
želiš precizan tajmer nema druge nego da ga napraviš sam pošto PIT nije
dostupan programeru.

(Da ne bude zabune, Turbo C je DOS program koji se koristio početkom
devedesetih godina prošlog veka. Poslednja verzija bila je 2.0 posle
čega je ime promenjeno u Borland C/C++)

f

[ leka @ 21.01.2004. 10:33 ] @
Filipe, nisam ovo probao, ali valja probati...
http://moss.csc.ncsu.edu/~mueller/pthreads/ :)
[ filmil @ 21.01.2004. 11:05 ] @
Zaboravih da kažem da za digitalnu obradu signala apsolutno mora
da se koristi odabiranje sa stabilnom periodom, tako da su razne
tajmerske kontrole sasvim nepodesne: one garantuju samo da razmak između
dva „okidanja“ neće biti manji od unesene vrednosti, a koliki će razmak
stvarno biti, i kada, to se može utvrditi samo eksperimentom. Ali ako je
džiter (varijacija) preveliki, onda se obesmišljava sva obrada posle
konverzije.

S druge strane ako možeš da tolerišeš džiter tajmerske kontrole iz
Njindonjsa, onda tvoj proces uopšte nije toliko brz da bi mu bilo
neophodno semplovanje od 10Hz - primer je merenje temperature u nekom
industrijskom procesu.

f
[ yooyo @ 21.01.2004. 13:27 ] @
Citat:
apsolvent1:
Kako se postize periodicno izvrsavanje operacija nakon isteka odredjenog vremena
(npr svakih 110ms) - analogija sa timer kontrolom u visual studiju?

Potrebno mi je naizmenicno ocitavanje sa AD/DA konvertora na svakih 110ms.


Ako to radis pod DOS-om, moraces da se okacis na timer interrupt i da napises svoj
interrupt handler. Ja sam se svojevremeno zezao sa ovim i mogu se napraviti jako precizni tajmeri (ja sam cak terao i do 10KHz). Naravno... veca frekvencija znaci da
se IRQ rutina mora izvrsiti brzo.

Standardno, timer IRQ pod DOS-om okida 18.2 puta u sekundi. Evo malog primera. Code sam pisao za Watcom compiler i nadam se da ce raditi u Turbo C-u.

Code:

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
#include <time.h>

#define INTR 0X08    /* The clock tick interrupt */
void interrupt ( *old8)(void);  /*pointer na stari interapt*/

int count=0;

void interrupt new8(void) /*novi interapt.Procesor zove tu f-ju kad okine*/
                          /*PI kolo.*/
{
   // Tvoja interrupt rutina   
   // ugradi mehanizam koji ce pozivati staru interrupt rutinu
   // u pravilnim vremenskim razmacima (18.2 puta u sec) 
   // tako da se realtime casovnik
   // ne poremeti
   // poziv stare interrupt rutine
   old8();
}

void setRate(unsigned short rate)  /*f-ja za povecanje broja prekida/sec*/
{
   asm { cli
         mov al, 0x36
         out 0x43, al
         mov cx, rate
         mov al, cl
         out 0x40, al
         mov al, ch
         out 0x40, al
         sti
       }
}

void main(void)
{
   unsigned long i;

   printf("\nPritisni neki taster za pocetak testiranja");
   getch();
   old8 = getvect(INTR);/*procitamo pocetnu adresu trenutnog interapta.*/
   setvect(INTR, new8);/*stavljam moj interapt*/
   setRate(0x800);/*postavlja broj okidanja u sec*/
/*vodi racuna o realtime casovniku. Zbog 0x800 (2048) casovnik*/
/*ce "poludeti" i desice se da ce vreme ici "ubrzano"*/
   i=0;
   while (!ESC()) DoSomeJob(); 

   setvect(INTR, old8);
   setRate(0);
}
/* ESC prekid programa */


yooyo