Source file: /~heha/enas/Convac-Ätzer/Firmware-190517.zip/Digital.cpp

     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-80