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!
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:
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":
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.
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.
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.
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".
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:
blinkenbus_04.pdf -- See BBUCI chapter for modified BlinkenBus timing
maintenance_panel_controller.zip -- C sources for ATMega based \"Maintenance Panel Controller\"