C, C++, embedded, real-time projects

This page describes my work on C, C++, embedded, real-time projects.

Medical device developer   Developed unit tests, totaling 5000 lines of object-oriented, multithreaded C++ code, for testing the embedded C++ code of a medical imaging device, including drivers for SPI, I2C, A/D, D/A and digital I/O.  Used CPPUint with BullsEye coverage tool, and VectorCAST.

University of Michigan Space Physics Research Laboratory   Wrote a program to control a Time-of-Flight mass spectrometer and to histogram and log the output of the spectrometer and to graph in real-time the total ion current.  Wrote a C#/Windows Forms GUI and a VC++ API to the TOF adapter card, and a VC++ DLL API a National Instruments 6602 DIO and Counter/Timer board used in controlling the spectrometer and a gas heater/cooler. 

University of Michigan Space Physics Research Laboratory  Developed firmware and software for all the components of a magnetometer and data logger (which is currently in operation on top of Greenland’s ice cap).  Wrote C firmware for the 8051uC which functions as the instrument controller and communicates through UARTs with aTDS2020 flash memory-based data logger (which I programmed in FORTH), with a GPS receiver using the NMEA standard protocol, and with a remote laptop PC running a console program which I wrote in VB6. My 8051 code also digitizes four analog signals 10 times a second, compresses the readings and communicates them to the TDS2020 for storage in flash memory.   Every hour my 8051 code awakens a GPS receiver, waits it for it to acquire satellites, then resynchronizes the 8051’s internal clock with universal time obtained from the GPS receiver.  Wrote a VC++ DLL for the PC and additional code for the TDS2020 to implement a CAN bus connection for transferring logged data from the instrument to the laptop.  For the PC side of the connection I selected the Vector CANtech PCMCAI CAN-bus adapter card and wrote a VC++ DLL API for it. (See my “Making the CAN bus a can-do bus,” August 21, 2003 EDN).

University of Michigan Space Physics Research Laboratory   Designed and developed a system based on a PC that monitors the operation of a mass spectrometer, and simulates the input from its sensors, while the instrument executes scanning sequences.  By monitoring the operation of the instrument we can debug the scanning sequences before they are up-linked to the instrument’s twin which is orbiting Saturn on the Cassini spacecraft.  I wrote a GUI in VB6, a VC++ DLL and a Windows driver to control a National Instruments 6533 DIO board to periodically sense the state of the instrument and interact with it, a VC++ DLL to monitor messages on a MIL-STD 1553 bus, and a VC++ DLL to communicate the captured data (through TCP/IP sockets) to a remote data archiver.

Chromatofast   Developed, in C, the executive program for a PC104 system to function as the internal controller of a gas chromatograph, including digital and analog I/O through PC104 bus I/O boards and PID control of temperature.

Dolman, Inc Helped architect two PC boards to switch between multiple video sources based on the detection of human voice at multiple microphones.  Then I wrote real-time programs in C to control the two boards.  My programs download DSP code into ADSP-2100 DSP chips and upload compressed audio data from a CT8020-TrueSpeech Co-processor; monitor the DSP chip registers to learn which microphone is processing human voice, and manipulate the registers in the proprietary video switching board to show the video from the camera pointed at the selected microphone and to superimpose on the video the name of the speaker; monitor, debounce and act on digital pushbutton inputs used to mute selected microphones.

Steeple Chase   Wrote, in C,  iRMX threads and device drivers for Opto 22 digital and analog I/O devices, for a general purpose PID controller, and for the ARCNET bus using the COM20020 ARNET controller chip. 

Open Networks Engineering   Wrote VRTX “threads” in C to automatically monitor and test the internal components of operating telephone switching equipment.  (See my “Non-preemptive multithreading performs embedded software’s juggling act,” July 8, 1999 EDN.)

Mechanical Simulation Corp.   Designed signal conditioning electronics and real-time C code for a PC to use Computer Boards DIO and A/D boards to link an automobile simulation program in the PC to an antilock braking ECU for hardware-in-the-loop testing of the ECU.   My software conveys outputs of the ECU to the simulation program, and outputs of that program back to the ECU so the ECU responds as if it were controlling an actual car and its operation can then be analyzed.

Montronix, Inc.   Ported a proprietary real-time operating system (implemented in C and assemble language) to the Intel 87C196 single-chip microprocessor and wrote devices drivers for sensors and displays in a device that monitored vibrations in machine tools to characterize tool wear and predict tool breakage.  Then I wrote, in C, a menu-based test program for the device that tested its ROM, RAM, battery, EEPROM, FLASH memory, LCD, keyboard, LEDs, and analog inputs.

Bell and Howell   Wrote in C for UNIX a process to balance the load of requests to retrieve and FAX articles from a digitized magazine database.   Wrote APIs in C to use a pass-through SCSI driver and adapter card to control the operation of several brands of CD-ROM jukeboxes and CD-ROM drives.

Bio Image   Developed a VC++ console program for a laptop PC to control and monitor the operation of a fluorometer through a serial port.  Wrote UNIX (Sun Solaris) SCSI device drivers for numerous document scanners and a CCD camera, and wrote C libraries for acquiring, compressing, decompressing and storing digitized images of DNA sequences.

ImageSoft Corp  Wrote, in C, UNIX SCSI device drivers for numerous brands of optical disk drives and optical disk jukeboxes; also for several tape drives and tape libraries.  Wrote UNIX servers for the archival and retrieval and transmission (through TCP/IP sockets) of compressed digitized images.  (See my “Compression algorithms reduce digitized images to manageable size, “ June 21, 1990 EDN).  (See my “Adapter and software simplify interface to SCSI peripherals,” June 1991 EDN.)

Access Corp   Developed embedded software for a Motorola 6803 single-chip microcomputer for a position-loop servo controller, a bar code reader and stepper-motor controller.  (See my “Use a single-chip microcomputer as the heart of your position controller,”  September 1, 1988 EDN)

Machine Vision International  Architected and programmed a system for the use of machine vision in various industrial applications.  Wrote PC and UNIX drivers for video frame grabbers and code to execute machine vision algorithms, and PLC programs to act on the output of the of the machine vision algorithms. 

The General Electric Company   Design, development, and applications of CNCs and PLCs.  Wrote embedded operating system code to enable a PLC to interpret and execute ladder-diagram programs.  Wrote embedded code to perform system diagnostics in a CNC.  Architected and programmed a system to drive a machine tool for automatic tool and workpiece inspection.