home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / px8info.lbr / ATOD.DZC / ATOD.DOC
Encoding:
Text File  |  1993-10-25  |  6.9 KB  |  153 lines

  1.          Performing PX-8 Analog-to-digital Conversions on the PX-8
  2.  
  3.  
  4.  
  5. The PX-8 analog to digital conversion operations are performed under
  6. control of the 7508 slave CPU.  Most, but not all, of these A/D operations
  7. can be handled with just one BIOS call that makes all the Z80/7508
  8. communication involved transparent to the user.  However, temperature
  9. sensing with the A/D converter is not handled by this call and requires
  10. some extra programming, which will be discussed later.  The special A/D
  11. converter used in the PX-8 is a uPD 7001C.
  12.  
  13. The mnemonic ADCVRT is used for this BIOS call, and it provides a common
  14. entry point for reading certain specific bytes of input data, such as an
  15. external analog voltage input, the bar code reader input voltage, the
  16. internal battery voltage, the DIP switch settings, and the power switch
  17. status.  Note that the last two items do not involve the A/D converter as
  18. you would expect.
  19.  
  20.  
  21. A/D Specifications
  22.  
  23. The A/D converter (uPD 7001C) specifications are:
  24.  
  25.   Input level:         0 to 2.0 V
  26.   Resolution:          6 bits/32 mV
  27.   Channels:            Four channels, two of which are available to the
  28.                        user.  Two other channels are used internally to
  29.                        detect battery voltage and temperature.
  30.   Conversion time:     140 us
  31.   Max. input voltage:  0 - 4.5 V
  32.  
  33.  
  34. ADCVRT call description
  35.  
  36. The ADCVRT subroutine call is setup as follows:
  37.  
  38.   Entry Point:   WBOOT + 6F
  39.  
  40.   Entry Parameters:
  41.  
  42.   Register C = 0     ; selects A/D channel 1 (input from A/D input jack)
  43.   Register C = 1     ; selects A/D channel 2 (input from bar code reader
  44.                        connector)
  45.   Register C = 2     ; selects DIP SW1
  46.   Register C = 3     ; selects battery voltage
  47.   Register C = 4     ; selects power switch status
  48.  
  49. When any other value is set in Register C, the routine returns without
  50. doing anything.
  51.  
  52.  
  53. Return Parameters:
  54.  
  55. Upon return from the ADCVRT call, register A will contain the data byte
  56. requested on entry as illustrated below.
  57.  
  58.   Bit  -   7   6   5   4   3   2   1   0     ;Register A bits
  59.   --------------------------------------
  60.   Data -  MSB                 LSB            ;A/D channels 1 & 2
  61.   Data -   8   7   6   5   4   3   2   1     ;DIP SW1
  62.   Data -  MSB                 LSB            ;Battery voltage
  63.   Data -                         TRIG PWSW   ;Power switch
  64.  
  65. For an A/D channel 1 or 2 request, bits 2 to 7 will all be 1 if the input
  66. voltage is greater than 2.0 V.  If the input voltage is negative, bits 2 to
  67. 7 will all be 0.
  68.  
  69. For a DIP SW1 status request, each bit returned denotes the corresponding
  70. switch on/off status.
  71.  
  72. For a battery voltage request, bits 2 to 7 will all be 1 if the input
  73. voltage is greater than 5.7 V.  The greater than 2.0 V battery voltage is
  74. compensated for by a special divider circuit that prevents the A/D device
  75. from seeing more than the 2.0 volts at its input.  The ADCVRT routine then
  76. returns a value in the A register that can be related to the actual voltage
  77. of the battery by a linear formula.
  78.  
  79. For a power switch status request, bit 0 = 1 indicates that the Power
  80. switch is On, while bit 0 = 0 indicates that it is Off.  Bit 1 = 1
  81. indicates that the TRIG status of the analog connector is On, while bit 1 =
  82. 0 indicates that it is Off.
  83.  
  84. A practical use of the ADCVRT call is presented by the source listing for
  85. the program BATTERY.ASM written by Bob Diaz, and available on the EPSON
  86. B.B.S.  Running this program on the PX-8 produces a graphic display of the
  87. actual battery voltage of your unit.  As you will notice, the simplest part
  88. of the program is the actual ADCVRT call, while the rest of the program
  89. deals with binary to ASCII conversions and screen display.
  90.  
  91.  
  92. 7508 CPU communications
  93.  
  94. For cases where no BIOS Call is provided, the programmer should keep in
  95. mind that communication with the 7508 CPU must take place across a serial
  96. interface that requires handshaking protocol.  The discussion below will
  97. illustrate this.
  98.  
  99. Since all A/D converter operations are controlled by the 7508 slave CPU,
  100. the Z80 never writes or reads directly to or from the A/D converter.  The
  101. Z80 program merely sends commands to and reads data from a register in the
  102. 7508 I/F.  When a one byte command is stored in this register, it is then
  103. serially passed to the 7508 CPU, which in turn recognizes and executes the
  104. specific command.  The result of the 7508 command execution is then
  105. serially passed back to the same I/F register for subsequent readback into
  106. the A register of the Z80.
  107.  
  108. As described above, the ADCVRT call does all this for you for the specific
  109. cases it was designed to handle.  There is one A/D feature that this call
  110. does not handle, however.  This is the temperature sensing feature.
  111.  
  112. The following example of temperature sensing will further illustrate how to
  113. communicate with the 7508 chip.
  114.  
  115. I/O address 06H points to the SIOR (Serial I/O Register) in the 7508 I/F,
  116. where a one byte command to the 7508 chip is sent.  For sensing temperature
  117. this command is 1CH; for battery voltage reading it is 0CH.  This parallel
  118. byte is then serially transferred to the 7508 as soon as the RES RDYSIO bit
  119. (bit 1 of CMDR address 01H) is set to a 1.  Setting this bit to a 1 resets
  120. the RDYSIO bit (bit 3 of STR address 05H) and signals the 7508 to read the
  121. SIOR serially.  While this command is being executed by the 7508, the
  122. RDYSIO bit (Serial I/O Ready) stays low indicating that the 7508 command is
  123. still executing.  When the execution is finally complete, the result is
  124. passed serially by the 7508 back to the SIOR.  A Z80 input command can now
  125. read this result and process it as needed.
  126.  
  127. To obtain a temperature reading perform the following routine in Z80 code:
  128.  
  129.     LD   A,1CH          ;1CH is the temperature sense command
  130.     OUT  (06H),A        ;Output 1CH to the SIOR
  131.     LD   A,02
  132.     OUT  (01H),A        ;Set RES RDYSIO bit to 1 to reset RDYSIO
  133.   ; at this point the command is being sent to 7508
  134.   RDY:
  135.     IN   A,(05H)        ;Read RDYSIO bit.  Low=7508 busy
  136.     BIT  3,A            ;test it
  137.     JP   Z,RDY          ;if busy, loop until 7508 op complete
  138. ; when here, SIOR contains result of requested command
  139.     IN   A,(06H)        ;Read the raw temperature data
  140.  
  141. The data byte that is now in register A must be converted into a meaningful
  142. form with a nonlinear translation formula.  This formula is too complex
  143. to detail at this time.  However, a very rough linear approximation, as
  144. extracted from the PX-8 technical manual, could be constructed from the
  145. five values below.
  146.  
  147. If A reg = 60H then temperature = 50 degrees Centigrade.
  148. If A reg = 80H then temperature = 40 degrees Centigrade.
  149. If A reg = A0H then temperature = 32 degrees Centigrade.
  150. If A reg = C0H then temperature = 25 degrees Centigrade.
  151. If A reg = E0H then temperature = 18 degrees Centigrade.
  152.  
  153.