When hardware foils software -- and then helps it out!
Sometimes, an oscilloscope can come in very handy.
About a year ago I was working on a signal processing driver that, for several weeks, I could seem to get to work correctly (part of the ordeal is documented here. At the time, I was working under the assumption that I had a problem with the timing of the incoming signal (fronts were taking too long to get to my driver and the delay was both random and huge – at least, that was the hypothesis). What I was trying to do is to get the signal I received to come out of the board somewhere, so I could probe it. There being no test points on the board anywhere1 the only way to do that was to output the signal through a GPIO2 and probe that (the incoming signal was tucked away nice and snug so I couldn’t get at it).
Once I got it working, the problem was relatively easy to see: the input signal had been inverted by an opto3. Fixing the problem was a simple matter of inverting the signal I read on my GPIO before passing it to the parser.
Yesterday, I was faced with a very similar problem: I am developing a driver that interfaces with an FPGA4 that decodes a signal very similar to the one I was working with a year ago. I plugged everything in together and voila! Nothing!
I am happy to say my plea from last year has been heard, though: this time, I had a nice test point I could probe, giving me the signal exactly as it would be passed to the FPGA (so it was connected somewhere between the opto and the FPGA). What I saw was a beautiful almost-square wave pattern (these are differential signals, a little like RS-485) that was exactly the opposite of what I should be seeing (i.e. the signal was high when it should be low and vice-versa). One call to the guy who wrote the firmware for the FPGA and one E-mail later and I had a new FPGA firmware that did the right thing.
So, an ordeal was spared me, just by adding less than a gram of gold to a PCB5 in a few strategic places.
-
Test points are points on the printed circuit board where you can easily put an oscilloscope probe to see the current passing through the circuit they’re connected to. ↩
-
A GPIO is a General-Purpose Input/Output. Software can use it to directly interact with the physical world. They can be programmed as either an input or an output and can be represented by a single bit or boolean in the software. ↩
-
An “opto” is an optical coupler: it de-couples an electrical signal from a circuit by using a light on one end and an optical sensor in another. Thus, if there’s a problem with the incoming signal’s current or voltage, the opto might blow out, but the rest of the circuit remains in tact. ↩
-
An FPGA, or Field-Programmable Gate Array, is a chip you’ll find in many modern circuits – probably including your phone. It can be programmed with a firmware and thus coerced to do almost anything, including simulating a complete computer. FPGAs are often used as a relatively low-cost replacement for specialized high-speed circuitry, such as those required for certain types of signal processing. ↩
-
A PCB is a Printed Circuit Board. If you crack open one of your gadgets you’ll see a few of them. They’re the (often red or green) boards with the little gold lines drawn on them and the little chip thingies sticking out. Don’t touch! You’ll ruin it! ↩