Hollies RDS decoder

Intro Schematics Firmware Software Troubleshooting Matlab model

Intro

You have an old FM receiver laying around? You feel like upgrading it to a fully functional RDS receiver? On this page you'll find the basic information you need to build your own PIC-based RDS decoder.

RDS (radio data system) enables radio stations to send digital data along with the normal sound information that you receive with your radio set. This data is used to transmit information about the radio station (name, alternative frequencies), the current broadcast (type of broadcast), traffic information, ...

Together with Dewy I built a decoder for this information using just a receiver IC from SGS - Thomson (TDA7330B) and a PIC16F84.

Schematics

The schematics are available as Protel schematics file. They are based on a circuit that has been published in Elektuur.

If you don't have access to this software, you can download the screenshots and create your own schematic.

Firmware

You can download the HEX file for this project here.

The assembler source code for the PIC16F84 can be found here. The source file is documented, so there should be few problems there.

Host software

Any serial terminal will do (Hyperterminal, Minicom, Tera Term, ...).
Once receiving data, the decoder will dump the station name to the serial port.

Get it working

The first thing to do is to get a decent signal to feed into the decoder IC. We can get that signal right from the FM decoder IC. So we'll locate that one first.

Open the case of the radio receiver you are planning to 'sacrifice' (do it in a reversible manner, watch out where you put those screws ;-).
Follow the leed that comes from the antenna, it'll probably be directly fed into the FM decoder IC. This is the one we are looking for. (If it's connected to transistors of any kind, just skip them and follow the leeds/pcb traces until you reach an IC). Check the part number and look up the datasheet. The pin we need is the 'baseband output', also called 'MUX out'.

If you are not sure about what pin delivers the right output, you can also do it the hard way. Power up the receiver (if you are not used to doing such stuff, it might be useful to use a battery-powered receiver here. You surely don't want to fry yourself or any fuses while looking for the appropriate output pin!! ).
Tune into a radio station that transmits RDS signals. Connect a multimeter or a buffered LED to the QUAL-pin of the TDA (pin 14). Use a lead to test every pin of the decoder IC in your radio set. Once you get a hold on the right pin, the QUAL pin will be constantly high.
DO NOT FORGET to use capacitor C4 while doing this. You might destroy your TDA if you connect a signal directly to the input pin!!.

If you plan to use the decoder separately from your receiver, or there is no place left to build it into the existing receiver, consider using a shielded cable to connect both units. Do not connect the shielding of the cable to both sides: you will create a ground loop and you will short the diode for the LCD bias.

RDS decoding algorithm in Matlab

I tried to comment the source code for the RDS decoder as clearly as possible. However, if you are into getting a grasp of the inner workings of the decoder, you might want to take a look at the Matlab (tm) code I wrote to test the firmware.
The main file is called RDS.m. The script will read a file containing RDS information (e.g. the 'log.txt' file you can find with the Matlab scripts). After getting a lock on the bitstream, it will search for known structures (called blocks). Finally the decoded information will be displayed on the screen.
The script only decodes the station name and the radio-text, but that should be enough to get you running.

Just extract the zip-file to a local directory and run RDS.m.
You can find the Matlab source files here.


goto 0x0000

Lieven Hollevoet,