di3039.txt ;************************************************************************************************* ; ; LISTING 1 - TURBO C FOR DATA-TRANSFER CYCLE ; ; "Parallel port provides high-resolution temperature sensing," EDN, October 3, 2002, pg 90 ; ;************************************************************************************************* #include #include #include #include #include #define VDD_ON 0x01 /* power to PIC through VDD_ON on pin 2 (D0) */ #define SCK 0x02 /* serial clock for SPI provided by PC */ #define PCSDO 0x04 /* serial data out from PC on Data bit 2 */ #define PCSDI 0x20 /* note this is on Status register (bit 1) */ #define SSOUT 0x40 /* =CE, active high, not low as for PIC SPI */ #define MCLR_HI 0x80 /* MCLR* on pin 9 (Data bit 7) normally high */ #define OPERATE VDD_ON | MCLR_HI /* normal operation of DS1722 */ /* adjust these to match the CPU speed */ #define DELTIME 10000 /* settling time after transfers */ #define SECDELA 10000000 /* to get about 1 s sampling */ void dodelay(long); void outportd(unsigned char); int dport,sport; void main(void) { unsigned char LSB,transfer(unsigned char,unsigned char); char MSB; /* note this is signed */ void outportd(unsigned char outbyte); int i,j,it; float T; /* LPT1 port addresses */ if(!(dport = peek(0x40,0x08))) { printf("\n\n\nLPT1 not available... aborting\n\n\n"); exit(1); } sport = dport + 1; /* status port address */ /* Initialize the Printer DATA Port for PIC operation */ /* includes putting SCK in the neutral 0 position: ~ is bitwise negation */ outportd(OPERATE&~SSOUT); printf("hit key to stop list\n"); transfer(0x80,0xE8); /* initialize DS1722 */ for(j=0;j<20;j++) { if(kbhit()) break; printf(" config %X: ",transfer(00,0)); dodelay(SECDELA); printf(" LSB %X: ",LSB=transfer(0x01,0)); dodelay(SECDELA); printf(" MSB %X: ",MSB=transfer(0x02,0)); dodelay(SECDELA); printf("T=%10.4f\n",T=MSB+(float)LSB/256.); } /* for loop */ } unsigned char transfer(unsigned char outbyte,unsigned char outdata) { /* output address byte on Data2, data byte, getting inbyte on Status5 */ unsigned char outmask,inbyte,statusmask; int ibit; inbyte=0x00; /* raise SSOUT for 2 byte transfer, SCK also in lowered neutral position */ outportd(OPERATE|SSOUT); for(ibit=0;ibit<8;ibit++) /* output outbyte */ { outportd(OPERATE|SCK|SSOUT); /* raise clock SCK */ outmask=outbyte&0x80; outbyte=outbyte<<1; if(outmask)outportd(OPERATE|SCK|PCSDO|SSOUT); /* output of 1 or */ else outportd(OPERATE|SCK|SSOUT); /* of 0 on PCSDO */ if(outmask)outportd(OPERATE|PCSDO|SSOUT); /* lower clock SCK */ else outportd(OPERATE|SSOUT); /* retaining data */ } for(ibit=0;ibit<8;ibit++) /* output outdata */ { /* & input inbyte */ outportd(OPERATE|SCK|SSOUT); /* raise clock SCK */ outmask=outdata&0x80; outdata=outdata<<1; if(outmask)outportd(OPERATE|SCK|PCSDO|SSOUT); /* output of 1 or */ else outportd(OPERATE|SCK|SSOUT); /* of 0 on PCSDO */ if(outmask)outportd(OPERATE|PCSDO|SSOUT); /* lower clock SCK */ else outportd(OPERATE|SSOUT); /* retaining data */ statusmask=inportb(sport); /* read status port*/ statusmask=statusmask&PCSDI; /* mask input line */ inbyte=inbyte<<1; inbyte=inbyte&0xFE; inbyte|=statusmask>>5; } /* lower SSOUT at end of 2 byte transfer, lower SCK to neutral position */ outportd(OPERATE&~SSOUT); return inbyte; } void outportd(unsigned char outbyte) { dodelay(DELTIME); outportb(dport,outbyte); dodelay(DELTIME); } void dodelay(long deltime) { long i; for(i=0; i