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

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