Home
JAQForum Ver 24.01
Log In or Join  
Active Topics
Local Time 22:40 17 Sep 2025 Privacy Policy
Jump to

Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.

Forum Index : Microcontroller and PC projects : uM2: PCB for 44-pin,40-pin TFT and USB

     Page 1 of 2    
Author Message
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 02:06am 20 Aug 2015
Copy link to clipboard 
Print this post

I've now got loadable drivers for the SSD1963, SSD1289, and S6D0164 TFT displays running very quickly using the 44-pin uM2. Peter Carnegie has created SD card routines for the uM2, and I have demonstrated that these can co-exist happily. We have also seen that the PIC16F1455 provides an ideal USB interface for minimal cost.

Given all this, I have designed a simple board that integrates all these components and brings out pins in an Arduino compatible format to allow easy expansion.
I think this should be possible to fit into a PCB about 100 x 60mm

The board is designed to be powered either by the USB cable or a DC input. This is link selectable for simplicity.

The PIC16F1455 is always powered from the USB cable so will not reset with the uM2 or when the DC input is disconnected. This should make the USB connection much easier to manage.

I'd appreciate any feedback on the concept and circuit design.
2015-08-20_121838_MM44.pdf Edited by matherp 2015-08-21
 
Frank N. Furter
Guru

Joined: 28/05/2012
Location: Germany
Posts: 950
Posted: 07:56pm 20 Aug 2015
Copy link to clipboard 
Print this post

Hi Peter,

your concept is very interesting!
Isn't it a problem for the Micromite with your level-shifter with no power on the Micromite and 5V VBUS on the 16F1455???
- I think it would be better to use a second 3.3V regulator for the 16F1455 (powered by VBUS) without any level-shifters for TX and RX...

...see the attached picture by Chris Roper:



Frank
 
Chris Roper
Senior Member

Joined: 19/05/2015
Location: South Africa
Posts: 280
Posted: 08:26pm 20 Aug 2015
Copy link to clipboard 
Print this post

On my own board I have taken it one step further from the drawing I posted by including a Jumper to switch between 5V and 3V3 operation.

3V3 is best when it is dedicated to the MicroMite but in my case it is part of a more generic board that can accept any DIP Packaged device and I wanted the ability to have it all USB powered.

But I would definitely recommend the regulator with the Micromite and in that configuration you can use the PIC16LF1455 as well.

Cheers
Chris

http://caroper.blogspot.com/
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 09:53pm 20 Aug 2015
Copy link to clipboard 
Print this post

Chris and Frank

Thanks for the great input - I've made the change as you suggest

changed version with a couple of minor bug fixes attached

2015-08-21_075154_MM44.pdf

I'll start on the layout later today
 
Frank N. Furter
Guru

Joined: 28/05/2012
Location: Germany
Posts: 950
Posted: 10:22pm 20 Aug 2015
Copy link to clipboard 
Print this post

Hi Peter,

I think it is much better so.

Frank
 
JTR0701
Regular Member

Joined: 10/07/2013
Location: Australia
Posts: 71
Posted: 06:13am 21 Aug 2015
Copy link to clipboard 
Print this post

Might I very strongly suggest that you connect the unused pins of the 16F1455 to MCLR and the two ICSP of the PIC32MX. You never know where the possibilities might lead down the track. Remember, both devices are fully programmable and the connections can serve many purposes.

For example, the DTR signal could be used as a device RESET and new firmware in the 1455 could provide a USB keyboard interface or a PIC32 programmer. I still have a 16F1455 in front of me that is both a USB-232 bridge and a programmer and I may (or may not) get around to finalizing something or someone else may step in.

It seems a shame to be to not keep open the possibilities as to how functional this board may prove to be.
 
JohnS
Guru

Joined: 18/11/2011
Location: United Kingdom
Posts: 4071
Posted: 07:26am 21 Aug 2015
Copy link to clipboard 
Print this post

What excellent ideas!

John
 
Chris Roper
Senior Member

Joined: 19/05/2015
Location: South Africa
Posts: 280
Posted: 07:41am 21 Aug 2015
Copy link to clipboard 
Print this post

  JTR0701 said  For example, the DTR signal could be used as a device RESET and new firmware in the 1455 could provide a USB keyboard interface or a PIC32 programmer. I still have a 16F1455 in front of me that is both a USB-232 bridge and a programmer and I may (or may not) get around to finalizing something or someone else may step in.


I would very much like to see that code and hex file if you are able to share.
I was also thinking of extra things the 1455 could do but the Microchip USB code is so critical on timing that adding anything else tends to break it.

In my case I was hoping to add a logic probe function and maybe other functions useful for a development board.

Cheers
Chris




http://caroper.blogspot.com/
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 10:25pm 21 Aug 2015
Copy link to clipboard 
Print this post

Great ideas - thanks.

I've wired up three 1455 pins to the ICSP port as suggested, I've also added a jumper to another port that can be read in software to allow the mode (programmer or VCP) to be set.

Board size is 100mm x 62mm

New schematic and first cut layout attached:

2015-08-22_082341_MM44.pdf

2015-08-22_082402_M44layout.pdf



Edited by matherp 2015-08-23
 
MicroBlocks

Guru

Joined: 12/05/2012
Location: Thailand
Posts: 2209
Posted: 07:45am 22 Aug 2015
Copy link to clipboard 
Print this post

Looks fine.
Some feedback i can give is that some of the islands for the resistors and capacitors will make it a bit difficult to solder the components as the traces connected to those islands are thick and will conduct heat away. This only valid when hand soldering.
The islands i mean are the ones for R3, R11, R18, C1, C5, C10, C15 and C18 (maybe i missed one). Best practice is to keep the thick traces for the power traces but branch of a thinner trace to the island.
Any particular reason to use a DIP for the 1455. a ssop is cheaper and i guess it makes routing The blue side) a bit easier and will allow for a better ground copper fill.

Edited by TZAdvantage 2015-08-23
Microblocks. Build with logic.
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 08:16am 22 Aug 2015
Copy link to clipboard 
Print this post

  Quote  Any particular reason to use a DIP for the 1455


I haven't included a ICSP port for the 1455 so it needs programming separately. The DIP format allows it to be socketed during development so it can be removed/replaced.

I've never had an issue soldering with 1oz copper but your point certainly sounds like good practice.

Thanks for the feedback
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 08:20am 23 Aug 2015
Copy link to clipboard 
Print this post

One final version before I go to copper.



I did some testing and the SSD1963 controller doesn't like it when D8-D15 are connected even though it is set to 8-bit mode. To solve this I have had to add shorting links to only connect D8-D15 when required to use the S6D0164 display. This controller doesn't mind when D0-D7 are made if it is in 8-bit mode.

In addition, I have added a header to allow the board to also be used as a backpack for the ILI9143 and ILI9163 SPI displays. This has only increased the board width very slightly (from 61 to 67mm). This left a small amount of unused beard real-estate so I have used the extra space to add two additional I2C headers.

The board is just slightly bigger than a 4.3" SSD1963 display and hidden completely behind a 5" or 7" display.



2015-08-23_181125_MM44.pdf

2015-08-23_181144_M44layout.pdf

Edited by matherp 2015-08-24
 
JTR0701
Regular Member

Joined: 10/07/2013
Location: Australia
Posts: 71
Posted: 07:06am 25 Aug 2015
Copy link to clipboard 
Print this post

Hi Chris,

At this time neither the code or I are ready for show time. Some things to be done and hard decisions that I cannot put off forever though I seem determined to try.

I did mention the existence of this work here some time ago but the response was as such that I didn't feel I needed to give any priority to it...

My code is written completely in assembler with my own stack and programmer design so I don't know anything about the timing issues with the microchip stack. A little surprised that you are finding it so finicky.

Anyway I check in on this forum every few days so if there is any developments I can post and keep posted.

Cheers for now. - Jim
 
JTR0701
Regular Member

Joined: 10/07/2013
Location: Australia
Posts: 71
Posted: 07:12am 25 Aug 2015
Copy link to clipboard 
Print this post

  matherp said   Great ideas - thanks.

I've wired up three 1455 pins to the ICSP port as suggested, I've also added a jumper to another port that can be read in software to allow the mode (programmer or VCP) to be set.



Yeah, smart thinking about including the extra signal. Of course, I thought of it myself but I didn't want to sound to pushy when it is not me having to layout the board.

All round there really have been a big step ups in the work going on here since I first stumbled on this little corner of the web.
 
centrex

Guru

Joined: 13/11/2011
Location: Australia
Posts: 320
Posted: 08:03pm 29 Aug 2015
Copy link to clipboard 
Print this post

Hi Matherp
The PDF of the board layout a couple of posts ago does not appear to be the same as the picture you have shown.
No extra I2C or 14pin header.

Cliff
Cliff
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 12:26am 30 Aug 2015
Copy link to clipboard 
Print this post

Ooops - latest version (checked this time ) attached

2015-08-30_102505_backpack44.pdf

2015-08-30_102527_backpack44layout.pdf
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 12:41am 23 Sep 2015
Copy link to clipboard 
Print this post

Just received the PCBs. The picture shows one on the back of a 4.3" SSD1963 display. Now to build it up and test it.



 
WhiteWizzard
Guru

Joined: 05/04/2013
Location: United Kingdom
Posts: 2948
Posted: 01:32am 23 Sep 2015
Copy link to clipboard 
Print this post

Nice looking board there matherp
 
matherp
Guru

Joined: 11/12/2012
Location: United Kingdom
Posts: 10406
Posted: 11:21pm 23 Sep 2015
Copy link to clipboard 
Print this post

Here it is populated - all works perfectly

Power is selectable between USB and external via the red link. There is separate regulation for the PIC16F1455 which provides the USB console interface (MCP1702-33) and the main 3.3V regulator (TC1264).

The data pins and control pins to the display use the portC pins on the MX170 allowing very fast operation nearly equivalent to the MX470 (CLS takes 25msec on a 4.3" display)

PWM control of the display backlight works perfectly using the onboard npn -transistor/Pchannel-mosfet combination.

Changes for next version:
Connect 5V pin on Arduino header when using USB power (currently only supplied when using external power
Make holes for the heatsink leg bigger
re-allocate pins on the PIC16F1455 to match TZ's default to allow the PIC32 to be programmed via the PIC16F1455 using pic32prog








Latest compatible loadable driver for the SSD1963 is:


sub mm.startup
CPU 48
Display.Open(42,1,4.3) 'reset on pin 42, landscape, 4.3" display
pwm 1,500,50 'set up the backlight
end sub

'**********Append this code and below onto the end of your MMBasic program***********
'
' Author: Peter Mather 2015
'
' Initialise the Display Driver for SSD1963 controlled TFT LCD Panel in 8-bit databus, 24-bit mode
' i.e. RGB888. This is optimised for the 44-pin uM2 and uses defined pinout except for the reset pin
' It achieves performance approaching that of the uM+ by heavily optimising bus I/O
'
' Display.Open initialises the loadable CFunction driver so that you can use all of the
' MMBasic graphic commands in your program.
'
' RST% is pin number of Reset signal
' Orient% PORTRAIT=0,RPORTRAIT=1,LANDSCAPE=2,RLANDSCAPE=3
' Size% is display size in Inches eg 4 inch, 5 etc
'
' After Calling Display.Open, any of the usual MM Graphic commands may be used
' in your MMBasic program, eg BOX, TEXT, LINE, CIRCLE etc
'
' Note: you must use pins 25,26,27,36,37,38,2,3 for the data pins DB0-DB7
' you must use pin 4 for RS and pin 5 for WR
' Tie CS Low and tie RD high
'
' Ver 1.02 2015-08-19 Initial Release
'
'**********************************************************************************

sub Display.Open(RST%,Orient%,Size!) as integer

LOCAL DisplayMetrics%(2)
LOCAL CFuncAddr%
LOCAL Retrn%


DisplayMetrics%(0)=Orient%
DisplayMetrics%(1)=Size!
DisplayMetrics%(2)=1 'sets the display type

CFuncAddr%=PEEK(CFUNADDR SSD1963_V44)

Retrn%=SSD1963_V44(CFuncAddr%,RST%,DisplayMetrics%())

END SUB

' File SSD1963_V44.bas written 15-Sep-2015 11:56:02
'
CFunction SSD1963_V44
0000001C
'write_command_data
27BDFFF8 AFA60010 AFA70014 27A20010 AFA20000 308400FF 34840200 3C02BF88
AC446230 24030200 AC436234 AC436238 18A0000D 8FA40000 00001821 24060200
24870004 AFA70000 80840000 34840300 AC446230 AC466234 AC466238 24630001
1465FFF7 8FA40000 03E00008 27BD0008
'main
27BDFF98 AFBF0064 AFB60060 AFB5005C AFB40058 AFB30054 AFB20050 AFB1004C
AFB00048 0080A821 00A0B021 00C09821 24020019 AFA20028 2402001A AFA2002C
2402001B AFA20030 24020024 AFA20034 24020025 AFA20038 24020026 AFA2003C
24020002 AFA20040 24020003 AFA20044 27B20028 27B40048 3C109D00 8E510000
8E020010 02202021 24050008 0040F809 00003021 8E020010 02202021 24050065
0040F809 00003021 8E02001C 02202021 0040F809 24050005 26520004 5654FFF0
8E510000 3C109D00 8E020010 24040004 24050008 0040F809 00003021 8E020010
24040004 24050065 0040F809 00003021 3C11BF88 24020100 AE226238 8E020010
24040005 24050008 0040F809 00003021 8E020010 24040005 24050065 0040F809
00003021 24020200 AE226238 8E020090 8EC30000 A043002E 8E030090 8E020010
8064002E 24050008 0040F809 00003021 8E030090 8E020010 8064002E 24050065
0040F809 00003021 8E030090 8E02001C 8064002E 0040F809 24050006 3C029D00
24420070 3C169D00 26D60A84 02C2182B 10600004 02C2B023 8EA30000 10000003
02C3B021 8EA30000 02C3B021 3C039D00 24630C38 0062202B 10800004 00621023
8EA40000 10000003 0044A821 8EA40000 0044A821 26710008 8E220004 1C40000A
241201E0 14400006 24120110 8E620008 2C420005 50400004 241201E0 24120110
10000002 241401E0 24140320 3C109D00 8E020090 8E630000 A0430015 8E030090
8E02001C 8064002E 0040F809 24050006 8E020004 0040F809 24042710 8E030090
8E02001C 8064002E 0040F809 24050005 8E020004 0040F809 24042710 8E030090
8E02001C 8064002E 0040F809 24050006 8E020004 0040F809 24042710 8E220004
1C400010 8E630008 54400005 24020054 2C640005 1080000B 00000000 24020054
AFA20010 240400E2 24050003 24060023 24070002 0411FF36 00000000 1000001A
240400E0 5C400010 24020004 14400005 24020054 2C630006 1060000B 24020004
24020054 AFA20010 240400E2 24050003 2406001E 24070002 0411FF25 00000000
10000009 240400E0 AFA20010 240400E2 24050003 24060023 24070002 0411FF1C
00000000 240400E0 24050001 24060001 0411FF17 00000000 3C109D00 8E020004
0040F809 24042710 240400E0 24050001 24060003 0411FF0E 00000000 8E020004
0040F809 24042710 24040001 00002821 0411FF07 00000000 8E020004 3C040001
0040F809 348486A0 8E220004 1C40003A 8E630008 54400005 240200FF 2C640005
10800035 00000000 240200FF AFA20010 240400E6 24050003 24060001 2407001F
0411FEF3 00000000 24020001 AFA20010 240300DF AFA30014 AFA20018 2402000F
AFA2001C AFA00020 240400B0 24050007 24060020 00003821 0411FEE5 00000000
AFA00010 24020008 AFA20014 2402002B AFA20018 AFA0001C 24100002 AFB00020
AFA00024 240400B4 24050008 24060002 24070013 0411FED6 00000000 AFA00010
24020004 AFA20014 2402000C AFA20018 AFA0001C AFB00020 240400B6 24050007
24060001 24070020 0411FEC9 00000000 10000054 240400BA 5C40001F 240200E0
14400005 240200FF 2C630006 1060001A 240200E0 240200FF AFA20010 240400E6
24050003 24060003 240700FF 0411FEB8 00000000 24020003 AFA20010 2402001F
AFA20014 24020001 AFA20018 240200DF AFA2001C AFA00020 240400B0 24050007
24060024 00003821 0411FEA9 00000000 10000018 AFA00010 AFA20010 240400E6
24050003 24060004 24070093 0411FEA0 00000000 24020003 AFA20010 2402001F
AFA20014 24020001 AFA20018 240200DF AFA2001C AFA00020 240400B0 24050007
00003021 00003821 0411FE91 00000000 AFA00010 2402002E AFA20014 24020030
AFA20018 AFA0001C 2402000F AFA20020 AFA00024 240400B4 24050008 24060003
240700A0 0411FE82 00000000 AFA00010 24020010 AFA20014 AFA20018 AFA0001C
24020008 AFA20020 240400B6 24050007 24060002 2407000D 0411FE75 00000000
240400BA 24050001 2406000F 0411FE70 00000000 240400B8 24050002 24060007
24070001 0411FE6A 00000000 24040036 24050001 00003021 0411FE65 00000000
240400F0 24050001 00003021 0411FE60 00000000 2404003A 24050001 24060070
0411FE5B 00000000 24040026 24050001 24060001 0411FE56 00000000 3C109D00
8E020004 0040F809 24042710 24040029 00002821 0411FE4E 00000000 24020001
AFA20010 240200F0 AFA20014 AFA00018 AFA0001C 240400BE 24050006 24060006
240700F0 0411FE42 00000000 240400D0 24050001 2406000D 0411FE3D 00000000
8E020090 80420015 24030002 1443000C 24030004 8E230004 1C600016 240600E0
14600014 240600A0 8E630008 2C630006 14600011 24030001 1000000F 240600E0
1443000C 240600A0 8E230004 5C600017 24060020 14600015 24060060 8E630008
2C630006 14600012 24030003 10000010 24060020 24030001 5443000D 24030003
8E220004 5C400015 24060040 14400013 00003021 8E620008 2C420006 14400010
24040036 1000000E 24060040 24030003 1443000B 24040036 8E220004 5C400008
24060080 14400006 240600C0 8E620008 2C420006 50400001 24060080 24040036
24050001 0411FE02 00000000 3C029D00 8C420090 90420015 30420001 10400006
3C029D00 8C430094 AC740000 8C420098 10000005 AC520000 8C430098 AC740000
8C420094 AC520000 3C109D00 8E020048 AC560000 8E020048 8E030094 8C660000
8E030098 8C670000 AFA00010 8C420000 00002021 00002821 24C6FFFF 0040F809
24E7FFFF 8E02004C AC550000 8E020090 8E630010 A0430014 8E020090 8E630008
A043002D 00001021 00001821 8FBF0064 8FB60060 8FB5005C 8FB40058 8FB30054
8FB20050 8FB1004C 8FB00048 03E00008 27BD0068
'defineregion
2482FFFF 00463021 24A2FFFF 00471021 3C089D00 8D090094 8D230000 8D080098
8D080000 0103482B 11200003 01006021 00606021 01001821 3C089D00 8D0D0090
81A80015 24090001 1509000C 24070002 00805021 00C04821 81A3002D 28630007
14600023 00A05821 00063027 00042027 008C4821 1000001E 00CC5021 15070008
24070003 00A05021 00404821 00063027 00C35821 00041027 10000015 00431021
1507000E 00021027 00C04821 00435821 00051027 00431021 81A3002D 28630007
1060000B 00805021 00063027 00042027 008C4821 10000006 00CC5021 004C5021
00052827 00AC4821 00805821 00C01021 3C03BF88 2404022A AC646230 24080200
AC686234 AC686238 000A2202 34840300 AC646230 AC686234 AC686238 354A0300
AC6A6230 AC686234 AC686238 00092202 34840300 AC646230 AC686234 AC686238
35290300 AC696230 AC686234 AC686238 2404022B AC646230 AC686234 AC686238
000B2202 34840300 AC646230 AC686234 AC686238 356B0300 AC6B6230 AC686234
AC686238 00022202 34840300 AC646230 AC686234 AC686238 34420300 AC626230
AC686234 AC686238 2402022C AC626230 AC686234 AC686238 03E00008 00000000
'DrawRectangle_SSD1963
27BDFFE0 AFBF001C AFB10018 AFB00014 0086102A 14400004 8FB00030 00801021
00C02021 00403021 00A7102A 14400005 28820000 00A01021 00E02821 00403821
28820000 0002200B 3C029D00 8C420094 8C430000 0083402B 2462FFFF 0048200A
28C20000 0002300B 00C3102B 2463FFFF 0062300A 28A20000 0002280B 3C029D00
8C420098 8C430000 00A3402B 2462FFFF 0048280A 28E20000 0002380B 00E01021
00E3382B 2463FFFF 0067100A 24070001 00E41823 00663021 00E53823 00E23821
70E68802 0411FF5E 00000000 7E053C00 34A50300 7E063A00 321000FF 36100300
10B00005 34C60300 1620001E 2624FFFF 1000002C 8FBF001C 14A6FFFB 3C02BF88
AC456230 24030200 AC436234 AC436238 AC436234 AC436238 AC436234 AC436238
2631FFFF 1220001E 2631FFFF 3C03BF88 24020200 2404FFFF AC626234 AC626238
AC626234 AC626238 AC626234 AC626238 2631FFFF 1624FFF8 8FBF001C 10000012
8FB10018 3C02BF88 24030200 2407FFFF AC456230 AC436234 AC436238 AC466230
AC436234 AC436238 AC506230 AC436234 AC436238 2484FFFF 1487FFF5 00000000
8FBF001C 8FB10018 8FB00014 03E00008 27BD0020
'DrawBitmap_SSD1963
27BDFFA8 AFBF0054 AFBE0050 AFB7004C AFB60048 AFB50044 AFB40040 AFB3003C
AFB20038 AFB10034 AFB00030 AFA40058 AFA5005C 00C09021 AFA70064 8FB00068
8FB7006C 8FB40070 8FB30074 3C029D00 8C430094 8C710000 8C420098 8C420000
AFA20018 00171403 34420300 AFA20010 0017F203 37DE0300 36F70300 0014B403
36D60300 0014AA03 36B50300 72063002 72073802 0411FEFD 00000000 8FA20064
1840006A 36940300 02007821 8FA3005C AFA3001C 00121023 AFA20024 8FA30064
70721002 2442FFFF AFA20014 AFB20028 00007021 AFA00020 24180001 3C05BF88
24060200 10000055 8FB90010 0440001F 0051202B 5080001E 24630001 0522001C
24630001 5160001A 24630001 91A40000 008C2024 1080000C 00000000 ACB96230
ACA66234 ACA66238 ACBE6230 ACA66234 ACA66238 ACB76230 ACA66234 ACA66238
1000000B 24630001 ACB66230 ACA66234 ACA66238 ACB56230 ACA66234 ACA66238
ACB46230 ACA66234 ACA66238 24630001 1470FFDE 24420001 24E70001 2508FFFF
10F20010 014F5021 00EE1021 24430007 284D0000 006D100B 000268C3 026D6821
000817C3 00021742 01026021 318C0007 01826023 01986004 01401021 1000FFCB
00001821 8FA20010 24420001 AFA20010 14500004 25290001 10000009 8FA20020
AFA00010 1A40FFF7 8FAA0058 8FA80014 00003821 8FA30018 1000FFE3 0123582B
24420001 AFA20020 8FA3001C 006F1821 AFA3001C 8FA20014 8FA30024 00431021
AFA20014 8FA20028 01C27021 8FA30020 8FA20064 10620006 8FBF0054 1E00FFE8
8FA9001C 1000FFEE 8FA20020 8FBF0054 8FBE0050 8FB7004C 8FB60048 8FB50044
8FB40040 8FB3003C 8FB20038 8FB10034 8FB00030 03E00008 27BD0058
End CFunction





 
WhiteWizzard
Guru

Joined: 05/04/2013
Location: United Kingdom
Posts: 2948
Posted: 11:42pm 23 Sep 2015
Copy link to clipboard 
Print this post

Very neat
 
     Page 1 of 2    
Print this page
The Back Shed's forum code is written, and hosted, in Australia.
© JAQ Software 2025