Time Display unit for a GPS module
I decided to build a device to permanently display accurate time received from a cheap GPS module installed in my workshop.
Having obtained a PIC18F1320 microcontroller for experimentation, I wanted to learn about the new features of the PIC18F range using only minimal hardware to control the display.
I am currently using it with the on-chip 8Mhz oscillator only and driving a six digit led display, multiplexed with further saving of chip pins by a technique pioneered by Charlie Allen of Maxim-Dallas for their MAX6951 LED display drivers called “Charlieplexing” (see their application note AN1880).
I would have liked to have used a MAX6951 chip for better display brightness, but they appear to be only available in "Quarter Size Outline Packages" (QSOP) - the leads are very close together,not easy to experiment with.
Another alternative would be to use a MAX7219 display driver, this chip has a serial interface and an option to adjust the display brightness - something I may try later.
Simple design, few components, no surface-mount types.
UTC time configurable to different time zones with DST option
Low power consumption
Uses modern Microchip PIC 18F1320 microcontroller
Selectable 12 or 24 hour time display modes
Leading zero blanking option
AM/PM indication in 12 hour mode
GGA and RMC sentence status indication
The microcontroller receives serial data from a GPS module at the standard rate of 4800 Baud.
It parses the NMEA 0183 Standard data sentences, looking for only two types of sentence – RMC and GGA. (These sentences must be sent by the GPS module every second for it to work.)
The RMC sentences include date and time information and GGA has Time and number of satellites received (no date information).
The serial time data sentences are only usually accurate to within a second, so a separate 1pps pulse from the GPS module is used to sync the seconds transitions.
(Note. Some GPS modules do not have a 1pps pulse output, these will not work with the current project firmware ).
(It has been tested ok with a Holux GM-82 module with TTL logic serial outputs.)
The controller drives the three (high efficiency) dual LED digit common cathode type display segments through series 510ohm resistors to help limit the current to remain within the 25mA per pin drive limit, together with the multiplexing action which effectively reduces the average current.
A disadvantage of this method is with the multiplexing and drive current limitations, the display is not very bright, requiring the use of high efficiency LEDs to achieve an acceptable brightness.
It is possible to increase brightness by the use of separate driver transistors for the display cathodes - but my initial tests found this produced some switching radio interference. (the MAXIM chips overcome that problem by using slew-limiting on their switching transistors).
Because the display cathodes share the same microcontroller outputs as the segments, the multiplexing action also switches outputs into high impedance (input mode) in addition to to high and low logic levels depending on which segments/cathodes are being driven.
Using the on-chip oscillator frees-up the two pins normally used for connecting a crystal to be used as ports instead.
Another extra (input only) port could have been gained by not using the MCLR pin – I decided not to do this as it can apparently cause problems when used with some types of PIC programmers (according to some web forum posts).
There are two tactile pushbuttons for configuration – a “SET” button to enter config mode and an “UP” button to increment the config values also show the date and number of satellites received.
The transistor (T1) Diode (D1)and resistor (R6) are provided to allow the unit to work with GPS modules that output the serial data using RS232 voltage levels. My GPS module outputs data at TTL logic levels (0-5v) so I have not used those components on my board yet (I will test it later by connecting to a PC emulating a GPS module).
The power requirements are very simple, It consumes less than 50mA with a 9V DC input (the 7805CT 5v regulator could be replaced with a smaller 78L05 type to save space).
The 470uF capacitor (C3) is only required if your DC power supply is not already smoothed.
When power is first applied, the display shows start-up information, including the project name and firmware version.
On receipt of 1pps pulses it will then show zeros while it waits for the GPS module to get valid satellite time. (this can take about a minute).
As soon as it has obtained valid data, it shows the time.
The red LED flashes to indicate the second pulses received from the GPS module.
Satellite time is UTC (GMT) time so there are options to change this:
Pressing the SET button will enter set-up mode and show an option to change to DST (Summer time) one hour advance.
The next press of the SET button allows the Time Zone offset (up to +/-15 hours) to be changed.
The next option toggles 12/24 hour time display mode.
The fourth option toggles leading zero blanking.
Changed settings are saved in eeprom and retained when switched off.
There are no other config options yet – I may add more later...
The DP led next to the second digit indicates an RMC sentence is detected ok.
The DP led next to the fourth digit indicates an GGA sentence is detected ok.
The DP led next to the last digit indicates time is PM (in 12 hour mode)
The firmware for this project is written in assembler language. The 18F1320 controller has 8Kb of memory, allowing up to 4096 instructions.
The current firmware occupies only about 25% of the available memory.
I found a few advantages to using 18F controllers, such as easier control of memory – no need to keep changing memory banks for accessing registers etc. and the additional commands make it easier to perform some tasks.
The downside is that some things are a bit more complicated – small tables are now not so simple because every entry uses two bytes of memory (It does provide some powerful commands for working with tables though).
The extra complexity added to some features such as interrupts and timers etc. can cause a few slight problems,requiring careful studying of the data sheets.
In addition to reading the 18F1320 datasheet, a more detailed coverage of 18F features can be found in the 976 page PICmicro® 18C MCU Family Reference Manual (39500a.pdf) which is available from the microchip website.
Another useful document is Application Note AN716 which explains the differences encountered when migrating from 16F to 18F devices.
I have a few ideas to expand the software features for this project and/or use them in future projects – when I have time..
You will require a PIC programmer compatible with the PIC18F1320 microcontroller.
If you don't have one - there are various articles on the web for constructing a simple serial port "JDM" type programmer. Good Freeware programmer software is easily available - such as "IC-Prog" or "WinPic800".
I shall update the file version here as features are added/bugs fixed etc.
The initial version of the program HEX file (v0.1) (04/06/2006) is HERE (right-click then "Save As")
(Note. This is a beta software version - still being tested etc)
I do not release the ASM source code for this project.
The circuit is small enough to construct on stripboard, Or you may wish to try the double sided pcb layout design provided.
The microcontroller and displays should be mounted in sockets. Sockets for the displays can be made by carefully cutting-off the ends of 0.6 inch wide 24 or 28 pin ic sockets so they just have 18 pins (or cut some 18 pin 0.3 inch wide sockets down the middle).
If you decide to make the double sided pcb,the "toner transfer" method can be used (search for instructions on the web) - you will need to position both sheets on the pcb very accurately to achieve good results.
I have included some alignment marks in the pcb artwork and the topside sheet is already mirrored ready for printing.
I used a bright light to help align the two sheets together accurately.
PCB vias will have to be made with short lengths of wire soldered between pcb sides.
Many component leads will require soldering on both sides of the pcb - you need to leave a small gap between sockets and the board to allow access to the topside pads for soldering.