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

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:

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

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

 

 

 

 

blinkenbus_04.pdf -- See BBUCI chapter for modified BlinkenBus timing

maintenance_panel_controller.zip -- C sources for ATMega based \"Maintenance Panel Controller\"