1 /* Projekt Convac-Ätzer
2 Zugriff auf analoge Karte
3 Henrik Haftmann, 161128
4
5 Beim Controller ist angeschlossen, siehe
6 http://www.tu-chemnitz.de/~heha/enas/Convac-Ätzer/Eagle.zip/
7
8 */
9
10 #include "Convac.h"
11 #include <avr/pgmspace.h>
12 #include <util/delay.h>
13
14 // channel=0..8: A/D-Wandler, zuerst 12 Bit, dann 8 Bit
15 // channel=9..17: D/A-Wandler, zuerst 14 Bit, dann 8 Bit
16 // channel=18..20: Zähler (keine Ahnung wie)
17 int ANALOG::getIo(byte channel) {
18 if (!channel) { // AD574
19 BUS::setXaddr(0);
20 #if 1
21 BUS::ioWrite(BUS::BA_ANALOG|7,0); // A/D-Wandlung auslösen (40 µs)
22 _delay_us(40);
23 #endif
24 channel=BUS::ioRead(BUS::BA_ANALOG|7); // High-Byte lesen
25 BUS::setXaddr(1);
26 word r=((word)channel<<8|BUS::ioRead(BUS::BA_ANALOG|7))>>4; // Low-Nibble
27 return r+ios.adc12-2048;
28 }
29 if (--channel<8) { // AD7828
30 BUS::setXaddr(channel);
31 byte r=BUS::ioRead(BUS::BA_ANALOG|1); // Byte lesen
32 return r+ios.adc8[channel]&0xFF;
33 }
34 if (!(channel-=8)) return ios.dac14; // AD7534
35 if (--channel<8) return ios.dac8[channel]; // AD7228
36 return 0; // Zähler (unbekannt)
37 }
38
39 void ANALOG::setIo(byte channel, int value) {
40 // if (value==-32768) return; // NaN
41 if (!channel) { // AD574
42 #if 0
43 BUS::setXaddr(0); // A0=0: 12-bit-Umsetzung (nicht 8 Bit)
44 BUS::ioWrite(BUS::BA_ANALOG|7,0); // A/D-Wandlung auslösen (40 µs)
45 #endif
46 ios.adc12=value;
47 }else if (--channel<8) { // AD7828: nichts tun
48 ios.adc8[channel]=value;
49 }else if (!(channel-=8)) { // AD7534
50 // if (value>0x1FFF) value=0x1FFF;
51 // if (value<-0x2000) value=-0x2000; // begrenzen
52 ios.dac14=value;
53 // value&=0x3FFF; // sicherheitshalber
54 value=(value^0x1FFF)&0x3FFF;
55 /* Dieser D/A-Wandler gibt folgendens aus (Anschlüsse e18-c18):
56 * value gewandelt Spannung
57 * 0x1FFF 0x0000 +10 V
58 * 0x1000 0x0FFF +5 V
59 * 0x0000 0x1FFF 0 V
60 * 0xFFFF 0x2000 -1 mV
61 * 0xF000 0x2FFF -5 V
62 * 0xE000 0x3FFF -10 V
63 */
64 BUS::setXaddr(1);
65 BUS::ioWrite(BUS::BA_ANALOG|4,value>>8); // High-Byte (6 Bits) laden
66 BUS::setXaddr(2);
67 BUS::ioWrite(BUS::BA_ANALOG|4,value); // Low-Byte laden
68 BUS::setXaddr(3);
69 BUS::ioWrite(BUS::BA_ANALOG|4,0); // analog ausgeben
70 }else if (--channel<8) { // AD7228
71 ios.dac8[channel]=value;
72 BUS::setXaddr(channel); // Sub-Kanal adressieren
73 BUS::ioWrite(BUS::BA_ANALOG|2,value); // analog ausgeben
74 }
75 }
76
77 char ANALOG::getBits(byte channel) {
78 if (!channel) return -12; // negativ für "vorzeichenbehaftet"
79 if (--channel<8) return 8;
80 if (!(channel-=8)) return -14; // auch dieser ist vorzeichenbehaftet
81 if (--channel<8) return 8;
82 return 0;
83 }
84
85 int ANALOG::getMin(byte channel) {
86 char bits=getBits(channel);
87 if (bits>=0) return 0; // vorzeichenlos
88 return -(1U<<~bits); // "-12" wird zu "-2048"
89 }
90
91 int ANALOG::getMax(byte channel) {
92 char bits=getBits(channel);
93 if (bits<0) bits=~bits; // bits = -bits-1
94 return (1U<<bits)-1;
95 }
96
97 void ANALOG::getPin(byte channel) { // Hier: Nur den „Pluspol“
98 byte start;
99 if (!channel) start=22;
100 else if (--channel<8) start=10;
101 else if (!(channel-=8)) start=18;
102 else if (--channel<8) start=4;
103 else{
104 sbuf[0]='-'; // Anschluss für Zähler unbekannt
105 sbuf[1]=0;
106 return;
107 }
108 mkeca(start,channel); // bspw. Reihe 4-6-8 für 8-bit-D/A-Wandler AD7228
109 }
110
111 // Ausgänge setzen
112 void ANALOG::initOutputs() {
113 setIo(9,ios.dac14);
114 for (byte i=0; i<8; i++) setIo(10+i,ios.dac8[i]);
115 }
116
117 ANALOG::ios_t ANALOG::ios;
118
119 ANALOG::scale_t ANALOG::scale[21]={
120 // scale offset nk unit[7] gemessen 170314
121 /*0*/ {1550, 0, 1, "U/min"}, // A/D-Wert = -18 bei -109 U/min
122 /*1*/ {1000, 0, 2, "V"},
123 /*2*/ {1000, 0, 2, "V"},
124 /*3*/ {1000, 0, 2, "V"},
125 /*4*/ {1000, 0, 2, "V"},
126 /*5*/ {1000, 0, 2, "V"},
127 /*6*/ {1000, 0, 2, "V"},
128 /*7*/ {1000, 0, 2, "V"},
129 /*8*/ {1000, 0, 2, "V"},
130 /*9*/ {-2790, 0, 1, "U/min"}, // -109 U/min bei D/A-Wert = 100
131 /*10*/ {1000, 0, 2, "V"},
132 /*11*/ {1000, 0, 2, "V"},
133 /*12*/ {1000, 0, 2, "V"},
134 /*13*/ {1000, 0, 2, "V"},
135 /*14*/ {1000, 0, 2, "V"},
136 /*15*/ {1000, 0, 2, "V"},
137 /*16*/ {1000, 0, 2, "V"},
138 /*17*/ {1000, 0, 2, "V"},
139 /*18*/ {256, 0, 2, "Hz"},
140 /*19*/ {256, 0, 2, "Hz"},
141 /*20*/ {256, 0, 2, "Hz"}};
142
143 /* Analoge Karte, Schaltung (Netzliste)
144 Pin Netz (Pin Netz)
145 IC1 74HCT04 6 Inverter Hier: Quarzoszillator 4,194 MHz
146 IC2 74HCT08 4 AND-Gatter
147 4 X0(20) Subadresse
148 5 X0(20)
149 6 x0
150 7(gnd) 00
151 8 a1
152 9 X1(19) Subadresse
153 10 X1(19)
154 14(5p) 5P
155 IC3 74HCT138
156 1(A0) A0
157 2(A1) A1
158 3(A2) A2
159 4(!E1) !IOSTB(7)
160 5(!E2) !SEL(9)
161 6(E3) 5P
162 15 !Y0 IC6-1,19 so 'ne Art ID lesen (hier 0x30)
163 14 !Y1 Auswahl 8-bit-A/D-Wandler
164 13 !Y2 Auswahl 8-bit-D/A-Wandler
165 12 !Y3 IC5-11 (Ausgangslatch, wofür??)
166 11 !Y4 Auswahl 14-bit-D/A-Wandler
167 10 !Y5 Auswahl Zählerchip
168 9(!y6) nc
169 7 !Y7 Auswahl 12-bit-A/D-Wandler
170 8(gnd) 00
171 16(5p) 5P
172 IC4 74HCT245 Datenbustreiber (Puffer)
173 Pin Bus Pin intern
174 1 !WR(8)
175 19 !SEL(9)
176 18 D0 2 d0
177 17 D1 3 d1
178 16 D2 4 d2
179 15 D3 5 d3
180 14 D4 6 d4
181 13 D5 7 d5
182 12 D6 8 d6
183 11 D7 9 d7
184 IC5 74HCT374 (Flipflops = Ausgaberegister)
185 1(!oe) 00
186 18 d0 19
187 3 d1 2 IC9-12
188 17 d2 16
189 4 d3 5
190 14 d4 15
191 7 d5 6
192 13 d6 12
193 8 d7 9
194 10(gnd) 00
195 11(clk) Y3
196 20(ucc) 5P
197
198 IC6 74HCT244 (zum Rücklesen)
199 Pin intern Pin
200 1,19 !Y0
201 3 d0 17 GND
202 18 d1 2 GND
203 5 d2 15 GND
204 16 d3 4 GND
205 7 d4 13 Pin hochgebogen, Ucc
206 14 d5 6 Pin hochgebogen, Ucc
207 9 d6 11 GND
208 12 d7 8 GND
209
210 IC7 74HCT4020 14-bit-Binärzähler
211 IC8 74HCT393 2 4-bit-Binärzähler
212 IC9 74HCT132 4 NAND-Gatter mit Schmitt-Trigger
213 IC10 S360B114 Zähler-ASIC
214 27 d0
215 2 d1
216 3 d2
217 4 d3
218 6 d4
219 10 d5
220 12 d6
221 13 d7
222 20 !Y5
223 IC11 ADC574 12-bit-A/D-Wandler (sukzessive Approximation 40 µs)
224 1 5P
225 2(data mode) GND 8-Bit-Bus
226 3(!CS) !Y7
227 4(BA) x0 Byte-Auswahl über Subadresse
228 5(rc) !WR(8) Konvertierungsstart durch Schreibzugriff
229 6(ce) an 100k an 5P
230 7(15p)
231 8(10p ref out)
232 9(agnd) GND
233 10(reference input)
234 11(15n)
235 12(bipolar offset)
236 13(10V span input)
237 14(20V span input)
238 15(dgnd)GND
239 16 d4
240 17 d5
241 18 d6
242 19 d7
243 20 d0
244 21 d1
245 22 d2
246 23 d3
247 24 d4
248 25 d5
249 26 d6
250 27 d7
251 28(sts) nc
252 IC12 AD7534 14-bit-D/A-Wandler, kann nur Schreibzugriffe
253 1(uref)
254 2(rfb)
255 3(iout)
256 4(agnd) GND
257 5(agnd) GND
258 6(dgnd) GND
259 7(d7) d7
260 8(d6) d6
261 9(d5) d5
262 10(d4) d4
263 11(d3) d3
264 12(d2) d2
265 13(d1) d1
266 14(d0) d0
267 15(a1) x1 01=High-Byte laden, 10=Low-Byte laden
268 16(a0) x0 11=DAC aktualisieren
269 17(!wr) !Y4
270 18(!cs) !Y4
271 19(udd)
272 20(uss)
273 IC13 LT1019
274 1(nc) nc 8(nc)
275 2(in) 15P(31) 7(nc)
276 3(temp) 6(out) ref+
277 4(gnd) 00 5(trim)
278 IC14 AD7828 8 8-bit-A/D-Wandler (2,4 µs)
279 12(!rd) !Y1
280 13(int) nc
281 14(gnd) 00
282 16(ref+)ref+ LT1019 Pin 6
283 17(rdy) nc erfordert 2,4 µs Zugriffszeit (= Buszyklus)
284 18(!cs) !Y1
285 8(d0) d0
286 9 d1
287 10 d2
288 11 d3
289 19 d4
290 20 d5
291 21 d6
292 22(d7) d7
293 23(a2) X2(18) Subadresse
294 24(a1) x1
295 25(a0) x0
296 26 5P
297 IC15 REF01
298 IC16 AD7228 8 8-bit-D/A-Wandler
299 13(d7) d7
300 14 d6
301 15 d5
302 16 d4
303 17 d3
304 18 d2
305 19 d1
306 20(d0) d0
307 21(!wr) !Y2
308 22(a2) X2(18)
309 23(a1) x1
310 24(a0) x0
311 IC17 MC3486
312 IC18 LF351
313 IC19 REF01
314 IC20 OP200
315 */
316
Detected encoding: UTF-8 | 0
|