#include #include #include #define ADR_CH0 0x8f1c /* Data adresse 8254 kanal 0 */ #define ADR_CH1 0x8f1e /* Data adresse 8254 kanal 1 */ #define KNTR_ADR 0x9f1e /* Kontroll adresse 8254 */ #define UT_PORT 0x0f1c /* Adr. UT-port kort 1 */ #define KNTR_ORD0 0x34 /* Kanal 0,16 biter,modus 2,binært */ #define KNTR_ORD1 0x70 /* Kanal 1,16 biter,modus 0,binært */ #define LES_TILBAKE 0xd6 /* Les tilbake kanal 0 og 1 */ #undef inportb() /* Besørger nødvendig I/O forsinkelse */ #undef outportb() /* Funksjons deklarasjoner */ void near init8254(void); void near les8254(char *tellere); main() { double mikro_sek,forskyvning; unsigned char svar,start[4],stopp[4]; /* 4B - to tellere i serie */ int i; clrscr(); forskyvning = 0.0; /* Byttes med verdien for tom løkke */ init8254(); /* Initialiser 8254 */ delay(20); /* Nedtelleren i kanal 1 lastes inn */ do { les8254(start); for(i=1; i<=10; i++) /* Test-løkke */ { } les8254(stopp); mikro_sek = (double)(start[3]-stopp[3])* 4194304 + (double)(start[2]-stopp[2])* 16384 + (double)(start[1]-stopp[1])* 64.0 + (double)(start[0]-stopp[0])* 0.25 - forskyvning; printf("\nAntall mikrosekunder %10.2f\n",mikro_sek); printf("Trykk på 's' gir retur, ellers ny tidsbestemmelse\n"); svar = toupper(getch()); }while(svar != 'S'); /* Trykk på s gir retur */ } /* Initialiserer 8254 */ void near init8254() { outportb(UT_PORT,0x00); /* Stopp tellerne */ outportb(KNTR_ADR,KNTR_ORD1); /*CH1: Mode 0, 16 biter */ outportb(ADR_CH1,0xff); outportb(ADR_CH1,0xff); outportb(KNTR_ADR,KNTR_ORD0); /* CH0: Mode 2, 16 biter */ outportb(ADR_CH0,0xff); outportb(ADR_CH0,0xff); outportb(UT_PORT,0x01); /* Start tellerne */ } /* Leser og returnerer innholdet i teller 0 og teller 1 */ void near les8254(char *tellere) { outportb(KNTR_ADR,LES_TILBAKE); /* Les 16 biter, CH0 og CH1 */ tellere[0] = inportb(ADR_CH0); tellere[1] = inportb(ADR_CH0); tellere[2] = inportb(ADR_CH1); tellere[3] = inportb(ADR_CH1); }