SKYLAB SKM53 GPS or NEO7 and the AXE133

marks

Senior Member
Years ago I bought a skylab SKM53 ,I haven't got arround too yet making that outside clock ,water controller ,pool timer or logger
The data sheet says it has an internal battery and needs a supply capable of at least 150ma ,
with decoupling of atleast 10uF and 1uF and TXD0 with a recommended pull up (10KΩ),which can increase the stability of serial data.
default speed: 9600bps LVTTL.
cold start: 36s
Sensitivity: -165dBm
Supply: 5v @ 39ma

Just hook up a USB to TTL adapter with the skm53 and you can view its output on the PE terminal.

To use just reprogram the axe133 (18m2) with the txd0 connected to pinC.0
we don't use the inputC.5 as this has a 10k pulldown resistor more suited for Normal serial.
We output the $gprmc sentence to serial terminal the only difference is the last two hex characters which are the checksum
will be converted and displayed as a binary number instead.
When power is first applied the oled will display "marks" until valid data or no checksum error is sent,
so it can be handy to view whats happening using the serial terminal.
It will then show the time in 12 hr format with seconds.
The $gprmc sentence gives you UTC time just change your time zone hours which can be negative also
Rich (BB code):
TimeZoneHours = -9
This is an example for Adelaide.
Rich (BB code):
TimeZoneHours = 9 ' example Adelaide
TimeZoneMins = 30
AuNzDST = 1 ' =0 StandardTime =1 for AuDST =2 for NzDST
Neo7ma.JPG
For Christmas I received a Neo-7m fitted with onboard ceramic antenna for about $12au.
And at first had trouble receiving any valid data it really needs to have an external antenna as well $5au.
And the first field of data is also different so had to alter the code slightly to except both types.
NMEA0183 standard has a maximum length of 82 characters including end of line <cr><lf> which
our @bptr buffer allows for but we don't use.
default speed: 9600bps TTL.
cold start: 27s fastest
Sensitivity: -162dBm
Supply: 5v @ 52ma and increasing to 62ma with an external antenna.

Using the VCC pin to provide 3.3v supply to either module, performance remained the same and current was much the same.
neo7mb.JPG
 
Last edited:

marks

Senior Member
Rich (BB code):
#no_data
#terminal 38400
#picaxe 18m2 ' AXE133 marks
' DB7 = B.7
' DB6 = B.6
' DB5 = B.5
' DB4 = B.4
' DB3 = B.3
' DB2 = B.2
' DB1 = B.1
' DB0 = B.0
SYMBOL Rx = C.5
SYMBOL E = C.6
SYMBOL RS = C.7
SYMBOL GPS = C.0
SETFREQ M32 'read GPS data at 9600 baud standard default
dirsB = %11111111
dirsC = %11001111
SYMBOL senddata = pinsb
SYMBOL index = b0
SYMBOL secs = b1 SYMBOL CRC = B1
SYMBOL mins = b2 SYMBOL Checksum = B2
SYMBOL hours = b3
SYMBOL date = b4 SYMBOL Datebptr = B4
SYMBOL month = b5
SYMBOL year = b6
SYMBOL Day = b7
SYMBOL CommonYear = b8
SYMBOL PM_AM = b9 SYMBOL Lastday =B9
SYMBOL AuNzDST = b10
SYMBOL DayNumber = W6
SYMBOL DSTend = W7
SYMBOL DSTstart = W8 SYMBOL DayS = W8
SYMBOL CRCerrors = W9
SYMBOL D0 = b20
SYMBOL D1 = b21
SYMBOL D2 = b22
SYMBOL D3 = b23
SYMBOL D4 = b24
SYMBOL D5 = b25
SYMBOL TimeZoneMins = b26
SYMBOL TimeZoneHours = b27

;--Settings-------------------------------------------------------------;
TimeZoneHours = 8 ' example Adelaide
TimeZoneMins = 0
AuNzDST = 0 ' =0 StandardTime =1 for AuDST =2 for NzDST
;--Settings-------------------------------------------------------------;

TABLE 0,("SatSunMonTueWedThuFri")
InitialiseOLED: 
FOR index = 0 to 6
LOOKUP index, ($38,$38,$38,$0C,$01,$02,$06),senddata : PULSOUT E,1 ' Initialise LCD/OLED
'(8bit/2line/5x8)*3(Display On)(Clear Display)(Return Home)(Entry Mode Set)
NEXT index : PAUSE 10

LOW RS : senddata = 130 : PULSOUT E,1 ' CommandMode (128-147) Line 1 Cursor Position
HIGH RS ' CharacterMode
FOR index = 0 TO 4 ' sending characters to LCD line one
LOOKUP index,("marks"),senddata : PULSOUT E,1
NEXT index

Main:
GPS_SKM53:'$GPRMC,HHMMSS.sss,A,DDMM.mmmm,S,DDDMM.mmmm,E,0.02,133.23,DDMMYY,,,D*7D
NEO_7M:'$GPRMC,HHMMSS.ss,A,DDMM.mmmmm,S,DDDMM.mmmmm,E,0.007,88.53,DDMMYY,,,D*7D

bptr = 28
SERIN gps,t9600_32,("RMC"),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc

GPSmessageCRC:
SERTXD (13,10," $GPRMC,")
bptr=29
CRC=103 ' seed GPRMC,
DO until @bptr="*" ' crc = XOR all characters between $ and *
SERTXD(@bptr)
CRC=CRC XOR @bptrinc
LOOP
SERTXD(@bptr) '*
datebptr=bptr-10
CRCchecksum: ' convert ascii $x+$x to bin
inc bptr : @bptrinc = @bptr /64 *9 + @bptr *16
Checksum = @bptr /64 *9 + @bptrdec &$0F +@bptr
SERTXD(#Checksum," ")

IF CRC <> Checksum THEN :INC CRCerrors : SERTXD (CR,LF, "Checksum Error ",#CRCerrors) : GOTO Main : ENDIF
bptr =39 : IF @bptr = "," THEN : INC bptr : ENDIF
IF @bptr <> "A" THEN : SERTXD(@bptr) : GOTO Main : ENDIF ' A=data valid or V=data not valid

GPStime:  bptr  = 29
hours = @bptrinc *10 + @bptrinc -16 +TimeZoneHours
mins = @bptrinc *10 + @bptrinc -16 +TimeZoneMins
secs = @bptrinc *10 + @bptrinc -16 ' convert ascii x+x to bin

IF mins >127 THEN : dec hours : ENDIF
IF mins > 59 THEN : inc hours : ENDIF
Day=0 : mins = mins//60
IF hours > 230 THEN : hours=hours+24 : day=-1 : ENDIF 'negative Timezone
IF hours > 23 THEN : hours=hours-24 : day= 1 : ENDIF 'positive TimeZone

GPSdate: bptr = datebptr
date = @bptrinc *10 + @bptrinc -16 +day
month = @bptrinc *10 + @bptrinc -16
year = @bptrinc *10 + @bptrinc -16

CommonYear = year //4 +3 /4 'CommonYear =1
Adjustdate:
IF date =0 THEN : dec month
  IF month =0 THEN : month =12: dec year : ENDIF
ENDIF : Lastday =31
IF month =4 or month =6 or month =9 or month =11 THEN : lastday =30: ENDIF
IF month =2 THEN : Lastday = 29 -CommonYear : ENDIF
IF date =0 THEN : date =lastday: ENDIF
IF date >Lastday THEN : date =1 : month=month//12+1
IF month=1 THEN : INC year : ENDIF
ENDIF

DayNumberOfTheYear:
DayNumber = month +9 /12
DayNumber = CommonYear + DayNumber * DayNumber
DayNumber = month *275 /9 +date -30 -DayNumber

DayOfWeek:
DayS = year *368 **65046 '365.2485 * year 1-99
Day = days + DayNumber //7 'Sat=0 Sun=1 Mon=2 Tue=3 Wed=4 Thu=5 Fri=6

;--DSTadjust------------------------------------------------------------------------;
AustralianNewZealandDST:
IF AuNzDST <>0 THEN
 DSTend = Days +96 //7
 DSTend = 98 -CommonYear -DSTend 'First Sunday in April AuNz
  IF AuNzDST =1 THEN
  DSTstart = Days +279 //7
  DSTstart = 281 -CommonYear -DSTstart 'First Sunday in October Au
  ENDIF
   IF AuNzDST =2 THEN
   DSTstart = Days +272 //7
   DSTstart = 274 -CommonYear -DSTstart 'Last Sunday in September Nz
   ENDIF
 IF DayNumber > DSTend AND DayNumber < DSTstart THEN DisplayTime
 IF DayNumber = DSTstart AND hours <2 THEN DisplayTime ' DST starts at 0200
 IF DayNumber = DSTend AND hours >1 THEN DisplayTime ' DST ends at 0200
'------------------------------------------------------------------------------'
 IF hours =23 THEN : inc date : day=day+1//7
   IF date >Lastday THEN : date =1 : month=month//12+1
      IF month=1 THEN : INC year : ENDIF
   ENDIF
 ENDIF : hours =hours +1//24
ENDIF
;--DSTadjust------------------------------------------------------------------------;

DisplayTime: day =day*3
   PM_AM = "P" : IF hours <12 THEN : PM_AM ="A": ENDIF ' Indicate PM or AM
     hours = hours //12 : IF hours =0 THEN: hours =12 : ENDIF ' 24 to 12 hour format
D5 = hours  /10 +$30 : IF D5 = "0" THEN : D5 = " " : ENDIF 'Zero blanking   
D4 = hours //10 +$30
D3 = mins /10 +$30
D2 = mins //10 +$30
D1 = secs /10 +$30
D0 = secs //10 +$30

DisplayOled:
LOW RS : senddata = 128 : PULSOUT E,1 ' CommandMode (128-147) Line 1 Cursor Position
      HIGH RS                                                 ' CharacterMode

   FOR  index = 0 TO 2                                   ' sending characters to LCD line one
     readtable day,senddata
    ' PULSOUT E,1 ' uncomment to display day on OLED
     INC day
     sertxd (senddata) ' comment out to remove day from terminal
   NEXT index

      FOR  index = 0 TO 11                                    ' sending characters to LCD line one
LOOKUP index,(" ",D5,D4,":",D3,D2,":",D1,D0," ",PM_AM,"M"),senddata : PULSOUT E,1
      NEXT index

'sertxd (" ",#date,"/",#month,"/20",#year,"  ")       ' (Date dd/mm/20yy) uncomment to display on terminal
sertxd (" ",D5,D4,":",D3,D2,":",D1,D0," ",PM_AM,"M") ' (Time HH:MM:SS AM)

GOTO main
 
Last edited:

marks

Senior Member
Damn I gave away my SKM53 thinking the Neo7-m would be better and also use less power .
So decided to get another the new model is the same but marked SKM53T about $32au.
I use to have software for the skylab GPS but could not find it luckily U-blox still has U-centre8.12(2014) on the web.
now we can see how they compare ,you will also need to connect RX as well otherwise the software can only show location and time info.
weather conditions have changed and without an antenna it only just works you can see from the picture it only gets a fix on 4 satellites'.
At desk level attaching the antenna you see a huge improvement with the neo-7m more satellites' should give a more accurate location.
neo7md.jpg
The SKM53T has slightly less signal strength and one less decimal place for lat. and long. but seems steadier
and surprisingly accurate position when looking at google maps finding the location within your home hopefully that data is not displayed.
Final picture shows what information we get when we first open the u-blox 7 port within the terminal
the $GPRMC sentence is the first sent so should be the most accurate one to use to get our time .
switching to the axe027 port we can check what the 18m2 is doing.
neo7mc.JPG
 

marks

Senior Member
Here's some code to view latitude and longitude on your oled 16x2
the gps usually outputs degrees with minutes we convert this back to degrees and display to 6 decimal places.
Rich (BB code):
#no_data
#terminal 38400
#picaxe 18m2 ' AXE133 marks
' DB7 = B.7
' DB6 = B.6
' DB5 = B.5
' SCL DB4 = B.4
' DB3 = B.3
' DB2 = B.2
' SDA DB1 = B.1
' DB0 = B.0
SYMBOL Rx = C.5
SYMBOL E = C.6
SYMBOL RS = C.7
SYMBOL GPS = C.0
SETFREQ M32 'read GPS data at 9600 baud standard default
dirsB = %11111111
dirsC = %11001111
SYMBOL senddata = pinsb
SYMBOL index = b0 '
SYMBOL secs = b1 SYMBOL CRC = B1
SYMBOL mins = b2 '
SYMBOL hours = b3 '
SYMBOL date = b4 SYMBOL Datebptr = B4
SYMBOL month = b5 SYMBOL Checksum = B5
SYMBOL year = b6 SYMBOL sign = b6
SYMBOL Day = b7 '
SYMBOL CommonYear = b8
SYMBOL PM_AM = b9 SYMBOL Lastday = B9
SYMBOL AuNzDST = b10 '
SYMBOL DayNumber = W6 SYMBOL DecimaL123 = w6
SYMBOL DSTend = W7 SYMBOL DecimaL456 = w7
SYMBOL DSTstart = W8 SYMBOL DayS = W8 SYMBOL DegS = b17
SYMBOL CRCerrors = W9 SYMBOL Deg1 = b18 SYMBOL Deg0 = b19
SYMBOL D1 = b20
SYMBOL D2 = b21
SYMBOL D3 = b22
SYMBOL D4 = b23
SYMBOL D5 = b24
SYMBOL D6 = b25
SYMBOL TimeZoneMins = b26 '
  SYMBOL TimeZoneHours = b27  '
InitialiseOLED:  
FOR index = 0 to 6
LOOKUP index, ($38,$38,$38,$0C,$01,$02,$06),senddata : PULSOUT E,1 ' Initialise LCD/OLED
'(8bit/2line/5x8)*3(Display On)(Clear Display)(Return Home)(Entry Mode Set)
NEXT index : PAUSE 10

LOW RS : senddata = 130 : PULSOUT E,1 ' CommandMode (128-147) Line 1 Cursor Position
HIGH RS ' CharacterMode
FOR index = 0 TO 4 ' sending characters to LCD line one
LOOKUP index,("marks"),senddata : PULSOUT E,1
NEXT index
Main:
GPS_SKM53:'$GPRMC,HHMMSS.sss,A,DDMM.mmmm,S,DDDMM.mmmm,E,0.02,133.23,DDMMYY,,,D*7D
NEO_7M:'$GPRMC,HHMMSS.ss,A,DDMM.mmmmm,S,DDDMM.mmmmm,E,0.007,88.53,DDMMYY,,,D*7D
bptr = 28
SERIN gps,t9600_32,("RMC"),@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,_
@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
GPSmessageCRC:
SERTXD (13,10," $GPRMC,")
bptr=29
CRC=103 ' seed GPRMC,
DO until @bptr="*" ' crc = XOR all characters between $ and *
SERTXD(@bptr)
CRC=CRC XOR @bptrinc
LOOP
SERTXD(@bptr) '*
datebptr=bptr-10

CRCchecksum: ' convert ascii $x+$x to bin
inc bptr : @bptrinc = @bptr /64 *9 + @bptr *16
Checksum = @bptr /64 *9 + @bptrdec &$0F +@bptr
SERTXD(#Checksum," ")
IF CRC <> Checksum THEN Main
bptr =39 : IF @bptr = "," THEN : INC bptr : ENDIF
IF @bptr <> "A" THEN Main ' A=data valid (Active)or V=data not valid (Void)
  GPSlat:  sign = 1
GPSLong: bptr =bptr +2
IF sign = " " THEN : degS = @bptrinc : endif
Deg1 = @bptrinc : Deg0 = @bptrinc
DecimaL123 = @bptrinc *10 + @bptrinc *10 : inc bptr
DecimaL123 = DecimaL123 + @bptrinc *10 +@bptrinc -53328
DecimaL456 = DecimaL123//6 : DecimaL123 = DecimaL123/6
DecimaL456 = DecimaL456 *10 + @bptrinc *10 + @bptrinc *10
IF @bptr = "," THEN : @bptr ="0" : ENDIF
DecimaL456 = DecimaL456 +@bptrinc /6-888
IF @bptr = "," THEN : inc Bptr : ENDIF
BinToAscii DecimaL123,d1,d2,d3
BinToAscii DecimaL456,d4,d5,d6

DisplayLatLong:
IF sign = 1 THEN
IF @bptr = "S" THEN :degs = "-": ENDIF : IF @bptr = "N" THEN : degs = " " : ENDIF
LOW RS : senddata = 128 : PULSOUT E,1 ' CommandMode (128-147) Line 1 Cursor Position
HIGH RS : FOR index = 0 TO 5 ' sending characters to LCD line one
LOOKUP index,("Lat: "),senddata : PULSOUT E,1
NEXT index : ENDIF

IF sign = " " THEN :IF @bptr = "W" THEN :sign ="-":ENDIF
LOW RS : senddata = 192 : PULSOUT E,1
HIGH RS : FOR index = 0 TO 5 ' sending characters to LCD line two
LOOKUP index,("Lon: ",sign),senddata : PULSOUT E,1
NEXT index : sertxd(sign) : ENDIF

sertxd(DegS,Deg1,Deg0,".",D1,D2,D3,D4,D5,D6," ") ' -DD.dddddd DDD.dddddd
FOR index = 0 TO 9 ' sending characters to LCD
LOOKUP index,(DegS,Deg1,Deg0,".",D1,D2,D3,D4,D5,D6),senddata : PULSOUT E,1
  NEXT index : IF sign = 1 THEN : sign = " " : goto GPSLong : ENDIF
goto main
 
Top