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