A "new" device at my workbench :-)

For issues with communication ports, protocols, etc.
Post Reply
D.J.Peters
Posts: 8586
Joined: May 28, 2005 3:28
Contact:

A "new" device at my workbench :-)

Post by D.J.Peters »

For my retro computer project I got an used vintage 20 years old 32 channel 100 MHz. logic analyzer
(eBay: GA320s = 28$ and AP03 pod 100MHz highspeed probes = 26$)

The GA320s from Global Specialties is in very good condition and it cames in only 6 days from USA to GERMAY but is was made in UK.

Here are some images to enlarge you can click on it if you like:

Looks good at my small hobby workbench :-)
Image

Here are the the 100 MHz 16 channel pod (32 channels = 25MHz.):
Image

Image

4 clock and 32 channel inputs and one clock output and the RS-232 remote interface:
Image

LCD without a backlight may be there are space for a LED modification:
Image

A clean design:
Image

Nothing special at all some logic gates and a bunch of data-bus drivers:
Image

Retro horsepower Zilog Z80 with 25MHz / 4 = 6.25MHz:
Image

The data collector XILINX FPGA XC3120A:
Image

I found only this catalog image (last listed at 2006):
Image

Currently I write an RS-232 remote controller in FreeBASIC and FLTK-c of course ;-)

So I can use the larger PC screen to show all 32 channels at once.

There are a problem I can open the COM port
and I see on my ocilloscope the GA320s sends data over TX
but something are wrong may be it isn't a standard NULL modem wire.

This are not a real problem it's more a challenge
like "hack the device protocol without an data sheet" :-)

Joshy
Last edited by D.J.Peters on Oct 12, 2022 19:00, edited 2 times in total.
D.J.Peters
Posts: 8586
Joined: May 28, 2005 3:28
Contact:

Re: A "new" device at my workbench :-)

Post by D.J.Peters »

Looks like my Global Specialties GA320s is in original an TTI TA320s from Thurlby Thandar Instruments.
Image
Image
May be I can find a complete service manual or any other data sheet with the right RS232 specs. from TTI :-)

Joshy
Last edited by D.J.Peters on Oct 12, 2022 19:00, edited 2 times in total.
srvaldez
Posts: 3379
Joined: Sep 25, 2005 21:54

Re: A "new" device at my workbench :-)

Post by srvaldez »

thank you D.J.Peters, I find bare metal projects fascinating :-)
D.J.Peters
Posts: 8586
Joined: May 28, 2005 3:28
Contact:

Re: A "new" device at my workbench :-)

Post by D.J.Peters »

I got it :-)

I soldered 4 times a different RS232 NULL modem cable.

Now I can remote control the logic analyzer and download all current samples.

From the 9 pin serial connector on PC side:
pin 1 + 4 + 6 are shorted
and
pin 7 + 8 also

crossed TX, RX:
PC pin 2 -> analyzer pin 3
PC pin 3 -> analyzer pin 2

ground:
PC pin 5 -> analyzer pin 5

Joshy

Code: Select all

const PORT = "COM1"
const BAUD = "9600"
const INIT = "N,8,1,BIN,DS0,CS0"

var hFile = FreeFile()
if open com(PORT & ":" & BAUD & "," & INIT ,as #hFile) then
  print "error: can't open port: " & PORT & " with " & BAUD & " baud !"
  beep : sleep : end 1
end if
print PORT & " is open"


dim as string char,s
print "*IDN? instrument identification"
print #hFile,!"*IDN?\n"
while inkey()=""
  while loc(hfile) > 0
    char = Input(1,hFile)
    if char=!"\n" andalso len(s)>0 then 
      print s:s=""
    elseif asc(char)>31 then
      s &= char
    end if  
  Wend
  sleep 10
wend
s=""
print "ACQ? get current acquisition of samples"
print #hFile,!"ACQ?\n"
while inkey()=""
  while loc(hFile) > 0
    s = Input(loc(hFile),hFile)
    print s;
  Wend
  sleep 10
wend
close #hFile
Last edited by D.J.Peters on Oct 12, 2022 19:01, edited 1 time in total.
D.J.Peters
Posts: 8586
Joined: May 28, 2005 3:28
Contact:

Re: A "new" device at my workbench :-)

Post by D.J.Peters »

If I use print# or input# on the RS232 without any handshaking protocol

only pin 5 ground and 2+3 are needed and must be crossed TX -> RX and RX <- TX.

Does anyone knows the sense behind shorting the pins 1+4+6 and 7+8 on PC side ?

Joshy
D.J.Peters
Posts: 8586
Joined: May 28, 2005 3:28
Contact:

Re: A "new" device at my workbench :-)

Post by D.J.Peters »

Here are how I draw the front pannel of my RS232 GSA320S remote controller.

Joshy

GFX_SCALE = 5
Image
GFX_SCALE = 10
Image
GFX_SCALE = 20 (blue arrows becomes visible)
Image
GFX_SCALE = 30 (printed label becomes visible)
Image
original :-)
Image

Code: Select all

#include once "fbgfx.bi"

const as single ORIGINAL_PIXEL_SIZE = 0.053125 ' cm

' device 40 x 8 chars = 40*5 pixels x 8*8 pixels = 240x64 pixels display
const as single ORIGINAL_DISPLAY_HEIGHT = 64 * ORIGINAL_PIXEL_SIZE ' cm

' all in cm
const as single DEVICE_WIDTH  = 25.5
const as single DEVICE_HEIGHT =  8.8
const as single DEVICE_FRAME  =  0.5
const as single DEVICE_BUTTON =  0.5
const as single FRAME_LEFT    =  2.8
const as single FRAME_TOP     =  1.3

const as single DEVICE_LABEL_LEFT  = 3.3 + DEVICE_FRAME
const as single DEVICE_LABEL_TOP   = 0.5 + DEVICE_FRAME

const as single DISPLAY_BKG_LEFT   =  FRAME_LEFT + DEVICE_FRAME
const as single DISPLAY_BKG_TOP    =  FRAME_TOP  + DEVICE_FRAME
const as single DISPLAY_BKG_WIDTH  = 13.8
const as single DISPLAY_BKG_HEIGHT =  4.5

const as single DISPLAY_LEFT       =  0.5
const as single DISPLAY_TOP        =  0.5
const as single DISPLAY_WIDTH      = 12.75 ' 240 * ORIGINAL_PIXEL_SIZE
const as single DISPLAY_HEIGHT     =  3.4  '  64 * ORIGINAL_PIXEL_SIZE

const as single SOFTKEY_BKG_LEFT   =  FRAME_LEFT + DEVICE_FRAME
const as single SOFTKEY_BKG_TOP    =  6.6 + DEVICE_FRAME
const as single SOFTKEY_BKG_WIDTH  = 13.8
const as single SOFTKEY_BKG_HEIGHT =  1.1

const as single SOFTKEY_LEFT       =  1.4
const as single SOFTKEY_TOP        =  0.3
const as single SOFTKEY_DISTANCE   =  1.6

const as single KEYPAD_LEFT        = 18.7 + DEVICE_FRAME
const as single KEYPAD_TOP         =  0.7 + DEVICE_FRAME
const as single KEYPAD_DISTANCE    =  0.7

const as single CURSOR_BKG_LEFT    = 21.1 + DEVICE_FRAME
const as single CURSOR_BKG_TOP     =  5.0 + DEVICE_FRAME
const as single CURSOR_BKG_WIDTH   =  2.9
const as single CURSOR_BKG_HEIGHT  =  2.7


const as single GFX_SCALE              =  35.5

const as single GFX_FRAME_LEFT         = FRAME_LEFT * GFX_SCALE
const as single GFX_FRAME_TOP          = FRAME_TOP  * GFX_SCALE

const as single GFX_DEVICE_WIDTH       = DEVICE_WIDTH  * GFX_SCALE
const as single GFX_DEVICE_HEIGHT      = DEVICE_HEIGHT * GFX_SCALE
const as single GFX_DEVICE_BORDER      = DEVICE_FRAME * GFX_SCALE
const as single GFX_DEVICE_BUTTON      = DEVICE_BUTTON * GFX_SCALE

const as single GFX_DEVICE_LABEL_LEFT  = DEVICE_LABEL_LEFT * GFX_SCALE
const as single GFX_DEVICE_LABEL_TOP   = DEVICE_LABEL_TOP  * GFX_SCALE

const as single GFX_DISPLAY_BKG_LEFT   = DISPLAY_BKG_LEFT   * GFX_SCALE
const as single GFX_DISPLAY_BKG_TOP    = DISPLAY_BKG_TOP    * GFX_SCALE
const as single GFX_DISPLAY_BKG_WIDTH  = DISPLAY_BKG_WIDTH  * GFX_SCALE
const as single GFX_DISPLAY_BKG_HEIGHT = DISPLAY_BKG_HEIGHT * GFX_SCALE

const as single GFX_DISPLAY_LEFT       = DISPLAY_LEFT   * GFX_SCALE
const as single GFX_DISPLAY_TOP        = DISPLAY_TOP    * GFX_SCALE
const as single GFX_DISPLAY_WIDTH      = DISPLAY_WIDTH  * GFX_SCALE
const as single GFX_DISPLAY_HEIGHT     = DISPLAY_HEIGHT * GFX_SCALE

const as single GFX_SOFTKEY_BKG_LEFT   = SOFTKEY_BKG_LEFT   * GFX_SCALE
const as single GFX_SOFTKEY_BKG_TOP    = SOFTKEY_BKG_TOP    * GFX_SCALE
const as single GFX_SOFTKEY_BKG_WIDTH  = SOFTKEY_BKG_WIDTH  * GFX_SCALE
const as single GFX_SOFTKEY_BKG_HEIGHT = SOFTKEY_BKG_HEIGHT * GFX_SCALE

const as single GFX_SOFTKEY_LEFT       = SOFTKEY_LEFT       * GFX_SCALE
const as single GFX_SOFTKEY_TOP        = SOFTKEY_TOP        * GFX_SCALE
const as single GFX_SOFTKEY_DISTANCE   = SOFTKEY_DISTANCE   * GFX_SCALE

const as single GFX_KEYPAD_LEFT       = KEYPAD_LEFT       * GFX_SCALE
const as single GFX_KEYPAD_TOP        = KEYPAD_TOP        * GFX_SCALE
const as single GFX_KEYPAD_DISTANCE   = KEYPAD_DISTANCE   * GFX_SCALE

const as single GFX_CURSOR_BKG_LEFT   = CURSOR_BKG_LEFT   * GFX_SCALE
const as single GFX_CURSOR_BKG_TOP    = CURSOR_BKG_TOP    * GFX_SCALE
const as single GFX_CURSOR_BKG_WIDTH  = CURSOR_BKG_WIDTH  * GFX_SCALE
const as single GFX_CURSOR_BKG_HEIGHT = CURSOR_BKG_HEIGHT * GFX_SCALE


const as ulong FRAME_R   = 88
const as ulong FRAME_G   = 98
const as ulong FRAME_B   = 99

const as ulong FRONT_R   = 206
const as ulong FRONT_G   = 209
const as ulong FRONT_B   = 198

const as ulong GRAY_R    = 159
const as ulong GRAY_G    = 162
const as ulong GRAY_B    = 155 

const as ulong DISPLAY_R =  94
const as ulong DISPLAY_G = 120
const as ulong DISPLAY_B =  85 


const as ulong SOFTKEY_R =  17
const as ulong SOFTKEY_G = 160
const as ulong SOFTKEY_B = 216

const as ulong PADKEY_R =  17
const as ulong PADKEY_G = 160
const as ulong PADKEY_B = 216

const as ulong ARROW_R =  44
const as ulong ARROW_G =  80
const as ulong ARROW_B = 164

const as string LABEL = "GA320S 32 CHANNEL LOGIC ANALYZER REMOTE CONTROLLER"

' saturate [N]ormal color (range of 0 - 255)
#define SATN(x)    iif((x)<0,0,iif((x)>255,255,(x)))
' saturate [D]arg color (color-16)
#define SATD(x) iif(x - 16 <   0,  0,x-16)
' saturate [B]right color (color+16)
#define SATB(x)   iif(x + 16 > 255,255,x+16)
sub drawButton(xp as integer,yp as integer,size as integer,r as long,g as long,b as long,border as integer=2)
  dim as ulong NORMAL = RGB(SATN(r),SATN(g),SATN(b)) 
  dim as ulong LIGHT  = RGB(SATN(r+64),SATN(g+64),SATN(b+64)) 
  dim as ulong BRIGHT = RGB(SATB(r),SATB(g),SATB(b)) 
  dim as ulong DARG   = RGB(SATD(r),SATD(g),SATD(b)) 
  dim as single w
  line(xp,yp)-step(size-1,size-1),0,BF
  if border<0 then border=0
  if border>0 then
    for i as integer = 1 to border
      w=size-1-i*2
      if i=border-1 then
        line (xp+i,yp+i)-step( w, 0),LIGHT
        line            -step( 0, w),LIGHT
      else  
        line (xp+i,yp+i)-step( w, 0),BRIGHT
        line            -step( 0, w),BRIGHT
      end if  
      line            -step(-w, 0),DARG
      line            -step( 0,-w),DARG
    next
  end if  
  w=size-2 - border*2
  if w<1 then return 
  line (xp+border,yp+border)-step(w,w),NORMAL,BF
end sub  

screenres GFX_DEVICE_WIDTH,GFX_DEVICE_HEIGHT,32,,FB.GFX_NO_FRAME

line (0,0)-step(GFX_DEVICE_WIDTH - 1,GFX_DEVICE_HEIGHT - 1),RGB(FRAME_R,FRAME_G,FRAME_B),BF
line (GFX_DEVICE_BORDER,GFX_DEVICE_BORDER) _
-step(GFX_DEVICE_WIDTH - 1 - GFX_DEVICE_BORDER*2,GFX_DEVICE_HEIGHT - 1 - GFX_DEVICE_BORDER*2),RGB(FRONT_R,FRONT_G,FRONT_B),BF

' label
if GFX_SCALE>29 then draw string (GFX_DEVICE_LABEL_LEFT,GFX_DEVICE_LABEL_TOP),LABEL,RGB(FRAME_R,FRAME_G,FRAME_B)

' display
line (GFX_DISPLAY_BKG_LEFT,GFX_DISPLAY_BKG_TOP) _
-step(GFX_DISPLAY_BKG_WIDTH-1,GFX_DISPLAY_BKG_HEIGHT-1),RGB(GRAY_R,GRAY_G,GRAY_B),BF
line (GFX_DISPLAY_BKG_LEFT+GFX_DISPLAY_LEFT,GFX_DISPLAY_BKG_TOP+GFX_DISPLAY_TOP) _
-step(GFX_DISPLAY_WIDTH-1,GFX_DISPLAY_HEIGHT-1),RGB(DISPLAY_R,DISPLAY_G,DISPLAY_B),BF

' softkeys
line (GFX_SOFTKEY_BKG_LEFT,GFX_SOFTKEY_BKG_TOP) _
-step(GFX_SOFTKEY_BKG_WIDTH-1,GFX_SOFTKEY_BKG_HEIGHT-1),RGB(GRAY_R,GRAY_G,GRAY_B),BF
for x as integer = 0 to 5
  if GFX_SCALE>19 then
    draw string (GFX_SOFTKEY_BKG_LEFT + GFX_SOFTKEY_LEFT + x * (GFX_SOFTKEY_DISTANCE+GFX_DEVICE_BUTTON)+0.125*GFX_SCALE, _
                 6.3*GFX_SCALE  + GFX_SOFTKEY_TOP), chr(30), RGB(ARROW_R,ARROW_G,ARROW_B)
  end if               
  drawButton(GFX_SOFTKEY_BKG_LEFT + GFX_SOFTKEY_LEFT + x * (GFX_SOFTKEY_DISTANCE+GFX_DEVICE_BUTTON), _
             GFX_SOFTKEY_BKG_TOP  + GFX_SOFTKEY_TOP, _
             GFX_DEVICE_BUTTON,SOFTKEY_R,SOFTKEY_G,SOFTKEY_B,2)
next

' keypad
for y as integer = 0 to 4
  for x as integer = 0 to 4
    if y<4 then
      line(GFX_KEYPAD_LEFT + x * (GFX_KEYPAD_DISTANCE+GFX_DEVICE_BUTTON)-GFX_DEVICE_BUTTON, _
           GFX_KEYPAD_TOP  + y * (GFX_KEYPAD_DISTANCE+GFX_DEVICE_BUTTON)+1) _
      -step(GFX_DEVICE_BUTTON-1,GFX_DEVICE_BUTTON-1),RGB(GRAY_R,GRAY_G,GRAY_B),BF
    elseif y=4 andalso x>1 then 
      continue for
    end if
    drawButton(GFX_KEYPAD_LEFT + x * (GFX_KEYPAD_DISTANCE+GFX_DEVICE_BUTTON), _
               GFX_KEYPAD_TOP  + y * (GFX_KEYPAD_DISTANCE+GFX_DEVICE_BUTTON), _
               GFX_DEVICE_BUTTON,FRAME_R,FRAME_G,FRAME_B,2)
  next
next  

' cursorkeys
line (GFX_CURSOR_BKG_LEFT,GFX_CURSOR_BKG_TOP) _
-step(GFX_CURSOR_BKG_WIDTH-1,GFX_CURSOR_BKG_HEIGHT-1),RGB(GRAY_R,GRAY_G,GRAY_B),BF

drawButton(GFX_CURSOR_BKG_LEFT + 1.2 * GFX_SCALE, GFX_CURSOR_BKG_TOP  + 0.3 * GFX_SCALE, _
           GFX_DEVICE_BUTTON,SOFTKEY_R,SOFTKEY_G,SOFTKEY_B,2)
drawButton(GFX_CURSOR_BKG_LEFT + 1.2 * GFX_SCALE, GFX_CURSOR_BKG_TOP  + 1.9 * GFX_SCALE, _
           GFX_DEVICE_BUTTON,SOFTKEY_R,SOFTKEY_G,SOFTKEY_B,2)
drawButton(GFX_CURSOR_BKG_LEFT + 0.3 * GFX_SCALE, GFX_CURSOR_BKG_TOP  + 1.1 * GFX_SCALE, _
           GFX_DEVICE_BUTTON,SOFTKEY_R,SOFTKEY_G,SOFTKEY_B,2)
drawButton(GFX_CURSOR_BKG_LEFT + 2.1 * GFX_SCALE, GFX_CURSOR_BKG_TOP  + 1.1 * GFX_SCALE, _
           GFX_DEVICE_BUTTON,SOFTKEY_R,SOFTKEY_G,SOFTKEY_B,2)           


sleep
Last edited by D.J.Peters on Oct 12, 2022 19:02, edited 2 times in total.
xlucas
Posts: 334
Joined: May 09, 2014 21:19
Location: Argentina

Re: A "new" device at my workbench :-)

Post by xlucas »

Man, if I knew more about electronics, I'd spend more time programming a Z80 than a modern computer. It's a lot more fun to do everything from scratch. Without knowing much on the topic here, I still look at in in awe!
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: A "new" device at my workbench :-)

Post by MrSwiss »

@D.J.Peters,

nice stuff, as usual ;-)
But I had to change some of your definitions, in order to scale properly (on my hires. Display).
I'd like you to check the changes on yours, in order to verify, that I've *got it right*:

Code: Select all

#include once "fbgfx.bi"

'const as single ORIGINAL_PIXEL_SIZE = 0.053125 ' cm
const as single ORIGINAL_PIXEL_SIZE = 0.009201 ' cm (QHD+ 13,3" Display, 276 DPI)

' device 40 x 8 chars = 40*5 pixels x 8*8 pixels = 240x64 pixels display
const as single ORIGINAL_DISPLAY_HEIGHT = 64 * (1/ORIGINAL_PIXEL_SIZE) ' cm <-- corrected math. (inverted proportionality)

' all in cm
const as single DEVICE_WIDTH  = 25.5
const as single DEVICE_HEIGHT =  8.8
const as single DEVICE_FRAME  =  0.5
const as single DEVICE_BUTTON =  0.5
const as single FRAME_LEFT    =  2.8
const as single FRAME_TOP     =  1.3

const as single DEVICE_LABEL_LEFT  = 3.3 + DEVICE_FRAME
const as single DEVICE_LABEL_TOP   = 0.5 + DEVICE_FRAME

const as single DISPLAY_BKG_LEFT   =  FRAME_LEFT + DEVICE_FRAME
const as single DISPLAY_BKG_TOP    =  FRAME_TOP  + DEVICE_FRAME
const as single DISPLAY_BKG_WIDTH  = 13.8
const as single DISPLAY_BKG_HEIGHT =  4.5

const as single DISPLAY_LEFT       =  0.5
const as single DISPLAY_TOP        =  0.5
const as single DISPLAY_WIDTH      = 12.75 ' 240 * ORIGINAL_PIXEL_SIZE -- ??
const as single DISPLAY_HEIGHT     =  3.4  '  64 * ORIGINAL_PIXEL_SIZE -- ??

const as single SOFTKEY_BKG_LEFT   =  FRAME_LEFT + DEVICE_FRAME
const as single SOFTKEY_BKG_TOP    =  6.6 + DEVICE_FRAME
const as single SOFTKEY_BKG_WIDTH  = 13.8
const as single SOFTKEY_BKG_HEIGHT =  1.1

const as single SOFTKEY_LEFT       =  1.4
const as single SOFTKEY_TOP        =  0.3
const as single SOFTKEY_DISTANCE   =  1.6

const as single KEYPAD_LEFT        = 18.7 + DEVICE_FRAME
const as single KEYPAD_TOP         =  0.7 + DEVICE_FRAME
const as single KEYPAD_DISTANCE    =  0.7

const as single CURSOR_BKG_LEFT    = 21.1 + DEVICE_FRAME
const as single CURSOR_BKG_TOP     =  5.0 + DEVICE_FRAME
const as single CURSOR_BKG_WIDTH   =  2.9
const as single CURSOR_BKG_HEIGHT  =  2.7


const as single GFX_SCALE              =  72 '35.5 <-- corrected factor
' --- end of changes ---
All the remaining code was left unchanged ... (I'm now getting: Device height = 8.8 cm)
D.J.Peters
Posts: 8586
Joined: May 28, 2005 3:28
Contact:

Re: A "new" device at my workbench :-)

Post by D.J.Peters »

@MrSwiss your properties doesn't fit on my screen in my hobby "eLab" I use an older computer with 1680x1050 pixels :-)

Joshy
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: A "new" device at my workbench :-)

Post by MrSwiss »

@Joshy, maybe a misunderstanding here:
only the changed math. (in your case) but, the *old* constants otherwise, to be used :-)

Code: Select all

const as single ORIGINAL_DISPLAY_HEIGHT = 64 * (1/ORIGINAL_PIXEL_SIZE) ' cm <-- corrected math. (inverted proportionality)
Reason: smaller PIXEL --> larger multiplier *required*, to get the same physical size.
Factor: not 1:1 but invers: 1 * (1 / PX-size) ...
Post Reply