PDP-10 KI10 panel - analog controls

Parent Category: Stories Category: The PDP-10 KI10 console panel Written by Administrator

The upper "Maintenance Panel": your 1970's BIOS

The KI10 console consists of two panels which are independent of each other. The upper panel is called "Maintenance Panel", because it has controls to modify the logic voltage and adjust processor speed. In the 1970's days it was common to perform "margin tests": The voltage for the computer was lowered, until special tests failed, than raised and tested, than regulated back to the middle. So the operator had a feeling for safe operation conditions. And also the processor speed could be trimmed. The KI10 had special memory cells used for margin testing.

The same settings can be done in modern PC BIOSes, to allow for overclocking. In the 1970's, focus was primary on stability. But surely the operators at night tried to boost their machine to new speed records!

PDP-10 KI10 upper Maintenance panel, front

To be perfect, I also wanted to connect the analog controls of the KI10 to the BlinkenBone system. This perfectionistic attitude costed many sleepless nights and another 10 weeks. 

Getting the controls under control!

While the lamps and buttons are as simple to connect as possible, the controls on the Maintenance Panel are really a challenge to work with:

PDP-10 KI10 upper Maintenance panel, back

 The KI10 is equipped with this queer stuff:

  • a voltage meter to check various internal voltages.
  • three big multiposition rotary switches, wildly wired on-the-fly. They're labeled "MARGIN SELECT", "IND SELECT" and "SPEED CONTROL COARSE"
  • There is a regulatory transformer to set margin voltages for self test: "VOLTAGE"
  • a hour meter is counting operation hours. It requires 7VAC 50Hz to run.
  • a classical potentiometer for fine trimming the processor clock: "SPEED CONTROL FINE".

The Maintenance Panel Controller board

I made a little subsystem for this analog stuff, and called it "Maintenance Panel Controller":

PDP-10 KI10 BlinkenBone controller for upper Maintenance Panel

There's a lot of peripherals wrapped around an Atmel ATmega88 micro controller.

The ATmega88 comes in 28 pin DIL package and is labeled "Maint. panel µC" on the picture. The design is quite tight, I used every single pin of it, and it drives these interfaces:

The  program code is given in the attachement below.

BBUCI - the BlinkenBone µController Interface

At first the ATmega has to be connected to the BeagleBone in a way compatible with the other digital I/O registers. This is accomplished by driving it over the CPLD on one of the BlinkenBoards. So logically it implements additional registers in that BlinkenBoards I/O address space:

  • the ATmega implements additional input registers IN5, IN6 and IN7 for "MARGIN SELECT", "MARGIN VOLTAGE", "IND SELECT" , "SPEED CONTROL COARSE" and "SPEED CONTROL FINE".
  • the ATmega implements the additional output register OUT11 for "HOURMETER enable" and "VOLTMETER".
  • IN0..4 are regular 74LVX244 input latches
  • OUT0..10 are regular 74LVX573 output registers

The parallel "BBUCI interface" is realized in the ATmega by software^. The bus timing is generated by software on the 700MHz ARM CPU on the BeagleBone, so making the 16MHz ATmega fast enough was a challenge. It took these combined actions:

  • A BlinkenBus read or write access is implemented by two different Interrupt Service Routines in the ATMega
  • The BlinkenBoard-CPLD generates optimized Bus signals for the ATmega: no address strobe, but separate READ/WRITE lines.
  • The BeagleBone driver generated slower timing, if one of the DIP switches on the BlinkenBoard is active, and timing for IN5..14 or OUT 11..14 is to be generated.
  • I let the ATMega run at 20MHZ, which is quite out of spec at 3.3V supply voltage. This should be stable, according to all those electronic forum entries.

Now a read or write is handled in below 5 µ seconds. A regular register access needs only 2 µseconds. See attachement for modified BlinkenBus timing.

The BBUCI interface needs 12 ATMega pins: ADDRESS0, ADDRESS1, READ, WRITE and an 8 bit bidirectional DATA port. There are only two address lines, because only 4 internal registers must be decoded.

Input from the rotary switches

The rotary switches "MARGIN SELECT", "IND SELECT" and "SPEED CONTROL COARSE"  encode 8 + 4 +5 = 17 positions altogether.

pdp10 ki10 bb rotary switch

Since the 28pin ATmega88 case has not enough digital pins, I encodes the position of every rotary switch over a resistor ladder into an analog voltage, which is read in by A/D ports. So just 3 A/D capable pins were needed for the switches.

Input from the "SPEED CONTROL FINE" potentiometer

This is just another A/D input. This potentiometer has a very low resistance of 100 Ohm. I made a voltage divider with a 1K Ohm resistor, so output voltage is now only in the A/D range of 0..10%. But since I added a software low pass, this resoultion is sufficient.

Driving the volt meter

The volt meter displays one of the margin voltages set with the VOLTAGE knob. While it is nice to look at, it is very easy to drive: I just used one of the PWM channels and low-passed the resulting voltage. So one ATmega pin was needed for it.

PDP-10 KI10 upper Maintenance Panel volt meter

The voltmeter was the first control I connected, because I used it heavily as diagnostic display while debugging my code. This was funny: instead of printing something like "I'm now in state 4" I simply let the volt meter point to a certain digit! Later I added a LED parallel to the voltmeter output onto the Controller board, because I was tired of always walking around my desk just to see the voltmeter display.

Driving the hour meter

The hour meter is a just little motor, which drives a tachometer-like counter. It should run with approximate 7VAC, 50Hz. Curiously, there was no 60 Hz version. The DEC documentation states that in the U.S. the hour meter value has to be scaled down manually to 5/6 of its reading.

Tests indicated that the AC voltage has to be as low as possible, else the motor would get loud and overheat. It was showing 20800 hours when the panel arrived, so it needs special care now.

I generated a synthetic 100Hz half sine wave signal for it. The ATmega outputs a highspeed 80kHz PWM signal, modulated with 100Hz duty factor. The sine wave itself is read from a function table. This signal was amplified by stepper motor driver of type L293, the current direction is switched by an additional 50Hz polarity signal.

So two ATmega pins are used for the HOURMETER.

PDP-10 KI10 upper Maintenance Panel hour meter PDP-10 KI10 upper Maintenance Panel, 50hz signal to drive hour meter

 The stepper motor driver is connected to +12V. To reduce the voltage level to +/- 3.5V, the amplitude of the sine wave is reduced to 1/4 by varying the PWM duty cycle only between 0 and 25%.

I'm really not a circuit board designer: amplifying the PWM first and THEN trying to low-pass it was a bad idea ... the low-pass capacitors get quite warm. I'm sure I never will pass an EMC test.

The hour meter is controlled by just one bit in an output register: It can be switched On and OFF. After switching ON, it is driven with double voltage for half a second to speed it up.

Input from the regulatory transformer

This was the biggest problem. The "VOLTAGE" control is not a potentiometer , but a little regulatory transformer. It has two lines to feed in an alternating current, and one slider moving over the copper windings. The induced output voltage is given by the ratio "slider windings"/ "total windings".

PDP-10 KI10 upper Maintenance Panel regulatory transformer

 Steam punk!

I first tried just measuring the static resistance of the slider position, but this gave only chaoting values, because the slider makes different contact on each winding.

So the transformer must be stimulated with AC current, the resulting induced slider voltage has to be rectified and low passed for a good readout.

Luckily I already had the 50Hz VAC for the hourmeter. So I just used a second power driver L293 and fed its output into the transformer. This worked! After a simple R/C lowpass, the input signal is also passed through a software lowpass. This way only one additional pin was used for the "VOLTAGE" knob.

There's one ugly consequence of reusing the hourmeter VAC: if I fine trim the hourmeter voltage, (even if I changed the characteristic of the power amplifier), the input voltage to the transformer also changes. So the internal scale ratio has to be adjusted every time something on the 50Hz subsystem was changed.

Mounting into the KI10

Finally the "Maintenance Panel Controller" was build into the KI10. I made a little show case for it, because I was so proud:

PDP-10 KI10 BlinkenBone Maintenance panel controller mounted





Download this file (blinkenbus_04.pdf)blinkenbus_04.pdf[See BBUCI chapter for modified BlinkenBus timing]131 kB
Download this file (maintenance_panel_controller.zip)maintenance_panel_controller.zip[C sources for ATMega based "Maintenance Panel Controller"]22 kB