Re: Commodore joystick ports

From: Hársfalvi Levente (hlpublic_at_freestart.hu)
Date: 2004-10-22 00:17:26

Hi guys! :-)


Jim Brain wrote:
>>more, it appears that it bangs the 6 bit position data digitally (why it
>>would do this on the POT port, I don't understand...) Is this what you
>>getting from this?:
>>http://www.funet.fi/pub/cbm/documents/projects/interfaces/mouse/Mouse.html
> 
> Yes.  It does that to "feed" 1uS chunks of 5V to the capacitor used by SID
> to determine the pot position (using the idea that you can detect voltage
> by charging a cap to that voltage and measuring how long it takes to
> discharge.)  The more 1uS chunks of 5V I feed, the more charge the cap
> has, the higher voltage is recorded.  Primitive, but I was amazed that it
> works pretty well.

That doc was written by me.

The digital "bit banging" trick is possible because of the A/D 
conversion method of the SID chip. This is a "single slope" A/D. Analog 
resistance measurement is done by means of time measurement. The rest 
are just dirty details. The input whose signal level triggers the end of 
time measurement is a digital input. If you feed this input with a 
clever (well controlled =)) digital signal, you can trigger it to 
measure whatever time intervals, actually pretty regardless of the 
presence or absence of the capacitor that is normally used for the 
"resistance --> time" conversion.

So, as an answer to the question at the top above: this method was quite 
logical IMHO for Commodore engineers, who only had digital (NMOS) 
electronics to realise the 1351 mouse. In fact, I found their way pretty 
"creative" ;-). They knew how the SID worked, so they hacked it... nice 
;-))).

Thinking it over, the above method could be jitter-free and maybe full 
8-bit, provided that the oscillator of the external unit (a 
microcontroller, or whatever) could be synced to the "frequency" derived 
from the POT line frequency (Phi0/512, as the SID's measurement cycle is 
512 clock cycles long). For that, either the external clock should be 
higher by an order or so (the clock resolution could be higher, so some 
"clever" method could be programmed into the microcontroller to avoid 
the jitter), or the clock should be derived from a PLL (...a pretty 
tricky PLL I think... because the SID isn't always connected to the 
joystick port).

The mouse interface described above uses the "simple" digital method, 
cloning the 1351; the doc may sound complicated, but in fact... it 
wasn't the method itself that was complicated: it was the way to figure 
out the method of the SID A/D, without good documentation and 
measurement tools, and later the implementation of the 1351 emulation 
process on a microcontroller like the '16c84. ...It's been a great fun 
to figure out, BTW... ;-) On the other hand, today, with the knowledge 
of the SID A/D internals and with a much better microcontroller, I guess 
it isn't hard to code a similar, but more sophisticated routine anymore.

>>I would think it would make more sense to simply emulate a paddle. In
>>which
>>case, you could use a transistor to create a current source on each pot
>>port
>>which would emulate a paddle. It is a little early for me this morning to
>>think clearly, but I will look at this later tonight and try to help more
>>if
>>someone doesn't already answer you.
> 
> Because I loathed this bit-bang the POT line approach, I tried a bunch of
> other ideas first.
> 
> My initial idea was to use PWM through a low pass RC filter to create the
> correct voltage, but that did not work at all.  I'm still not sure why
> this simplistic approach did not work.

Actually, you need to "emulate" a resistor, or you could also "emulate" 
a current source (not voltage source).

As you see, the paddle resistors are always connected between the POT 
line and +5v. For each measurement cycles, the internal capacitor beside 
the SID discharges completely, and then -- with the start of the 
measurement -- it charges up by the current flown from Vcc through the 
paddle resistor, to at least the trigger level of the SID digital input 
(in this case 2.5v, Vcc/2) (provided that it's a valid measurement 
cycle). After that the process repeats. Now let's suppose there isn't a 
resistor between Vcc and the capacitor, but there is another capacitor 
and a resistor (your RC filter), whose other end is continously 
alternating by the PWM signal of the microcontroller. ...This will, at 
the best case, give a fully random series of values captures by the SID 
A/D. Or (if the resistor of the RC filter is high enough) it will simply 
"look like" (from the point of the SID) a "too high" external 
resistance, thus it'll never capture anything but $ff-s.

It could work, if the PWM output was fed to a small operational 
amplifier, whose output was connected to the POT input through a 
resistor. ...Probably... Even this case, the output voltage of the 
amplifier would have to be always higher than 2.5v to produce any effect 
in the SID. In the 2.5v to 5v region there could be a "proportional" 
segment, where the increasing of output voltage resulted in decreasing 
values read from the POT registers in the SID.

It could also work (probably) if the PWM controlled a current 
amplifier... Or if you used a "current output"-type, preferably static D/A.

> I then looked at serial DACs, as Maxim has some low cost dual SPI DAC
> parts, but Could not determine if that would work, so abandoned the idea.

They could presumably work, provided you connect it to the joystick POT 
input through a resistor. Their output is "static", in the sense that 
they don't ripple like PWMs. They may need an external opamp like the 
above pwm example, though (depending on their capability to drive a load).

Best regards!,


L.

       Message was sent through the cbm-hackers mailing list

Archive generated by hypermail pre-2.1.8.