ソースファイル "rt.c"
1 /* rt.c for ad612 */
2
3 #include
4 #include
5 #define PORT 0x378
6
7 static __inline unsigned char inb(unsigned int port);
8 static __inline void outb(unsigned int port, unsigned char data);
9
10 unsigned int rtnval;
11 clock_t start;
12 void main(void)
13 {
14 int fd, i;
15 FILE *fp;
16 float temp;
17
18
19 long t;
20 struct tm *tmbuf;
21
22 if((fd = open("/dev/io",2)) < 0)
23 error("can't open /dev/io", (char *)0);
24
25 if((fp = fopen("/nis/inoue/public_html/RT/thermo.dat", "a+")) < 0)
26 error("can't open thermo.dat", (char *)0);
27
28 t = time(0);
29 tmbuf = localtime(&t);
30
31 temp=0.08*(float)ReadChan(PORT, 0)-214.8;
32
33 fprintf(fp, "%2.2f, %2.3f \n", (float)(tmbuf->tm_hour)+(float)(tmbuf->tm_min)/60.0, temp);
34 start = clock();
35 do{
36 }while(clock() - start < 100);
37 fclose(fp);
38 close(fd);
39 }
40
41 error(s, t) char *s, *t;
42 {
43 fprintf(stderr, s, t);
44 fprintf(stderr, "\n");
45 exit(1);
46 }
47
48 /* basic i/o ---------------------------------------------------------------*/
49
50 static __inline unsigned char
51 inb(unsigned int port)
52 {
53 unsigned char data;
54 __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
55 return(data);
56 }
57
58 static __inline void
59 outb(unsigned int port, unsigned char data)
60 {
61 unsigned char al;
62 al = data;
63 __asm __volatile("outb %0, %%dx" : : "a" (al), "d" (port));
64 }
65 /*-------------------------------------------------------------------------*/
66
67 /* ReadChan returns an int 0-4096 proportional to the voltage at the input */
68 /* addrPort is the port address either 0x278, 0x378, or 0x3bc--------------*/
69 /* nChan is the input channel number 0-5, 0 s connected to the RT sensor---*/
70
71 int ReadChan(unsigned int addrPort, int nChan)
72 {
73 int i, result;
74 unsigned char filter;
75 long filt_result;
76 unsigned char count;
77
78 filter = 20; /* number of samples to average */
79 filt_result = 0;
80
81 for(count = 0; count < filter; count++)
82 {
83 /*--------------------------------------------------------------------*/
84 /* Clk CS Din */
85 outb(addrPort, 0xf8); /* 0 0 0 */
86 outb(addrPort, 0xfc); /* 1 0 0 */
87 outb(addrPort, 0xf9); /* 0 0 1 */
88 outb(addrPort, 0xfd); /* 1 0 1 start */
89 outb(addrPort, 0xf9); /* 0 0 1 */
90 outb(addrPort, 0xfd); /* 1 0 1 sgl/diff */
91 /*--------------------------------------------------------------------*/
92
93 switch(nChan)
94 {
95 case 0:
96 for(i = 1; i < 4; i++)
97 {
98 outb(addrPort, 0xf8); /* 0 0 0 */
99 outb(addrPort, 0xfc); /* 1 0 0 30s */
100 }
101 break;
102
103 case 1:
104 outb(addrPort, 0xf9); /* 0 0 1 */
105 outb(addrPort, 0xfd); /* 1 0 1 */
106 outb(addrPort, 0xf8); /* 0 0 0 */
107 outb(addrPort, 0xfc); /* 1 0 0 */
108 outb(addrPort, 0xf8); /* 0 0 0 */
109 outb(addrPort, 0xfc); /* 1 0 0 */
110 break;
111
112 case 2:
113 outb(addrPort, 0xf8); /* 0 0 0 */
114 outb(addrPort, 0xfc); /* 1 0 0 */
115 outb(addrPort, 0xf8); /* 0 0 0 */
116 outb(addrPort, 0xfc); /* 1 0 0 */
117 outb(addrPort, 0xf9); /* 0 0 1 */
118 outb(addrPort, 0xfd); /* 1 0 1 */
119 break;
120
121 case 3:
122 outb(addrPort, 0xf9); /* 0 0 1 */
123 outb(addrPort, 0xfd); /* 1 0 1 */
124 outb(addrPort, 0xf8); /* 0 0 0 */
125 outb(addrPort, 0xfc); /* 1 0 0 */
126 outb(addrPort, 0xf9); /* 0 0 1 */
127 outb(addrPort, 0xfd); /* 1 0 1 */
128 break;
129
130 case 4:
131 outb(addrPort, 0xf8); /* 0 0 0 */
132 outb(addrPort, 0xfc); /* 1 0 0 */
133 outb(addrPort, 0xf9); /* 0 0 1 */
134 outb(addrPort, 0xfd); /* 1 0 1 */
135 outb(addrPort, 0xf8); /* 0 0 0 */
136 outb(addrPort, 0xfc); /* 1 0 0 */
137 break;
138
139 case 5:
140 outb(addrPort, 0xf9); /* 0 0 1 */
141 outb(addrPort, 0xfd); /* 1 0 1 */
142 outb(addrPort, 0xf9); /* 0 0 1 */
143 outb(addrPort, 0xfd); /* 1 0 1 */
144 outb(addrPort, 0xf8); /* 0 0 0 */
145 outb(addrPort, 0xfc); /* 1 0 0 */
146 break;
147
148 default:
149 return(0xfff1); /* illegal channel number */
150 }
151
152 outb(addrPort, 0xf9); /* 0 0 1 */
153 outb(addrPort, 0xfd); /* 1 0 1 */
154 /* unipolar */
155 outb(addrPort, 0xf9); /* 0 0 1 */
156 outb(addrPort, 0xfd); /* 1 0 1 */
157 /* MSB first */
158 outb(addrPort, 0xf9); /* 0 0 1 */
159 outb(addrPort, 0xfd); /* 1 0 1 */
160 outb(addrPort, 0xf9); /* 0 0 1 */
161 outb(addrPort, 0xfd); /* 1 0 1 */
162 outb(addrPort, 0xf9); /* 0 0 1 */
163 /* end of control word-start of data */
164 result = 0;
165
166 for(i = 1; i < 13; i++)
167 {
168 outb(addrPort, 0xfd); /* 1 0 1 */
169 if(!(inb(addrPort + 1) & 0x80))
170 {
171 result = result +1;
172 }
173 if(i < 12)
174 {
175 result = result *2;
176 }
177 outb(addrPort, 0xf9); /* 0 0 1 */
178 }
179 outb(addrPort, 0xff); /* 1 1 1 */
180 filt_result = filt_result + result;
181 }
182 rtnval = (unsigned int)filt_result/filter;
183 return(rtnval);
184 }
SST_Labo's Home Page