1 /* Projekt Convac-Ätzer
2 Zugriff auf digitale Ein- und Ausgangskarten
3 Henrik Haftmann, 161123
4
5 Beim Controller ist angeschlossen, siehe
6 http://www.tu-chemnitz.de/~heha/enas/Convac-Ätzer/Eagle.zip/
7
8 Die Eingangskarte an Steckplatz 1 ist die ehemalige
9 Prozessorplatine mit 32 Eingängen und ebenso vielen Optokopplern.
10 Die Anschlusszuordnung ist nun anders als in der Dokumentation:
11 e2 c2 e4 c4 e6 c6 usw. bis e32 c32.
12
13 Die Ausgangskarten sind an den Steckplätzen 2 und 4.
14 Diese fressen, wenn alle Ausgänge aktiv, 500 mA.
15 Die Anschlusszuordnung ist gleich geblieben.
16 Das Statusbit erscheint als Eingang an Bit 28
17 */
18
19 #include "Convac.h"
20 #include <string.h>
21
22 // Für Byte 0..3: Eingang lesen
23 // Für Byte 4..11: Ausgangswert rücklesen (nicht von der Karte möglich)
24 // Sonderfall: Byte 7 und 11: Statusbit der Ausgabekarten rücklesen
25 byte DIGITAL::getIo(byte bytenr) {
26 byte r=0;
27 if (bytenr<4) r=~BUS::ioRead(BUS::BA_INPUT|bytenr);
28 else if (!(~bytenr&3))
29 r=BUS::ioRead(bytenr&4?BUS::BA_OUTPUT1:BUS::BA_OUTPUT2)>>3&0x10;
30 return r^ios[bytenr];
31 }
32
33 bool DIGITAL::getBit(byte bitnr) {
34 return shrb(getIo(bitnr>>3),bitnr)&1;
35 }
36
37 // Für Byte 0..3: Togglen des Eingangswertes setzen/löschen (zur Simulation)
38 // Für Byte 4..12: Ausgang setzen
39 void DIGITAL::setIo(byte bytenr, byte value) {
40 ios[bytenr]=value;
41 if (bytenr>=4) {
42 byte h=bytenr&4?BUS::BA_OUTPUT1:BUS::BA_OUTPUT2;
43 bytenr=(bytenr&3)+1; // Adresse 0 = Status der 24×BTS412B im Bit 7
44 if (bytenr==4) bytenr=7; // Relais auf dieser Adresse (4 ungenutzte Bits)
45 BUS::ioWrite(h|bytenr,~value);
46 }
47 }
48
49 void DIGITAL::setBit(byte bitnr,bool bit) {
50 byte m=shlb(1,bitnr);
51 bitnr>>=3;
52 if (bit) m|=ios[bitnr]; else m=~m&ios[bitnr];
53 setIo(bitnr,m);
54 }
55
56 // Ausgänge setzen
57 void DIGITAL::initOutputs() {
58 for (byte i=4; i<12; i++) setIo(i,ios[i]);
59 }
60
61 void DIGITAL::getInputs(byte data[12]) {
62 for (byte i=0; i<12; i++) data[i]=getIo(i);
63 }
64
65 byte DIGITAL::getDir(byte b) {
66 if (byte(b-=4)>=byte(8)) return 0; // Eingänge
67 if (byte(b&=3)!=3) return 0xFF; // 24 Transistorausgänge
68 return 0x0F; // 4 Relaisausgänge
69 }
70
71 byte DIGITAL::getAvail(byte b) {
72 if (b==7 || b==11) return 0x1F; // obere 3 Bits nicht verfügbar
73 return 0xFF;
74 }
75
76 const PROGMEM char eca[] = "eca";
77 void mkeca(byte start, byte nr) {
78 udiv_t q=udiv(nr,3);
79 char*p=floatstr(start+(byte(q.quot)<<1)); // 6-8-10-…-20
80 p+=strlen(p);
81 *p++=pgm_read_byte(eca+q.rem); // 'e','c' oder 'a' (Funktionsname!)
82 *p=0;
83 }
84
85 void DIGITAL::getPin(byte bitnr) {
86 char*p=sbuf;
87 if (bitnr<32) {
88 floatstr(2+(bitnr&0x1E)); // Pinnummer wie im Schaltplan:
89 p+=strlen(p); // Erst Ziffern, dann Buchstabe
90 *p++=bitnr&1?'c':'e';
91 *p=0;
92 }else{
93 bitnr&=0x1F; // beide Analogausgabekarten sind gleich
94 if (bitnr<24) mkeca(6,bitnr);
95 else if ((bitnr-=24)<4) {
96 floatstr(22+(bitnr<<1));
97 p+=strlen(p);
98 strcpy_P(p,eca); // alle 3 Buchstaben weil Relaisausgang
99 }else{
100 *p++='-'; // kein Anschluss für die Treiberüberwachung
101 *p=0;
102 }
103 }
104 }
105
106 byte DIGITAL::ios[12]; // 32 Eingänge (Xor), 64 Ausgänge (Mirror)
107
108 /* Digitale Ausgangskarte, Schaltung
109 IC6 74HC245 Datenbustreiber (Puffer)
110 1 !WR(8)
111 19 !SEL(9)
112 IC4 74HC244 (zum Rücklesen der Ausgangsstati?)
113 IC2,3,5,7 = 74HC373 (Flipflops = Ausgaberegister)
114 1 (6)
115 IC1 74HC138
116 A0 A0
117 A1 A1
118 A2 A2
119 !E1 !IOSTB(7)
120 !E2 !SEL(9)
121 E3 5P
122 Y0 IC4-1-19 IC4-17 vom Optokoppler IC4-3 IC6-3 IC6-17 D7
123 Y1 IC7-11
124 Y2 IC5-11
125 Y3 IC3-11
126 Y4 -
127 Y5 -
128 Y6 -
129 Y7 IC2-11 Relais
130 */
Detected encoding: UTF-8 | 0
|