Πέμπτη 8 Δεκεμβρίου 2011
Κυριακή 27 Νοεμβρίου 2011
Signal Ratiometer
Μια πολύ χρήσιμη συσκευή για ραδιοερασιτέχνη χρήση είναι ένας μετρητής λογού ισχύος/φάσης δυο σημάτων (περισσότερες λεπτομέρειες στο http://www.w1ghz.org/small_proj/hna.zip ). Η παρούσα κατασκευή συγκρίνει δυο σήματα από 50MHz μέχρι 2.7GHz ισχύoς από -50dBm μέχρι 0dBm. Το RF κομμάτι παράδοξος είναι απλοϊκό και αποτελείται ουσιαστικά από δυο ολοκληρωμένα, τα AD8302 και LT5534 μέσα σε ένα θωρακισμένο κουτάκι. To AD8302 (έχει χαρακτηριστεί ως VNA-in-a-chip :-) κάνει την σύγκριση των δυο σημάτων. Το LT5534 μετράει την απόλυτη ισχύ του σήματος στην μια από τις δυο εισόδους. Ο λόγος της ύπαρξης του είναι για να φέρνουμε τις στάθμες των προς σύγκριση σημάτων γύρω από τα -30dBm όπου το AD8302 εμφανίζει την μεγαλύτερη ακρίβεια.
Ένας μΕ Atmega 16 διαβάζει τις αναλογικές τάσεις εξόδου των ολοκληρωμένων και κάνει τους υπολογισμούς τα αποτελέσματα των οποίων εμφανίζονται σε μια οθόνη χαρακτήρων 2Χ16. Επίσης στέλνει σειραϊκά τα δεδομένα σε μια έξοδο για data logging. Η κατασκευή τροφοδοτείται από δυο μπαταρίες λιθίου-πολυμερούς 400mAh σε σειρά.
73 de SV1IXP
Δευτέρα 21 Νοεμβρίου 2011
IC1=ATMEGA16
IC2-IC2=LM78L05 / LM2950CZ-5.0
IC2-IC2=LM78L05 / LM2950CZ-5.0
R1=4.7K
JP1-JP8=PIN HEADER
C1-C2-C3=1μF
JP1-JP8=PIN HEADER
C1-C2-C3=1μF
Οι κονέκτορες JP5-JP6 χρησιμεύουν για την σύνδεση των μπαταριών και ο JP7 για την φόρτιση τους. Στον JP4 συνδέεται το GPS module (+5V,GND και DATA). O JP8 είναι για την σύνδεση του ISP. Στο JP2 συνδέεται ο διακοπτης ON-OFF. To μπουτόν χρησιμεύει για την πλοήγηση στις ανάμεσα στις διαφορετικές οθόνες.
73 de SV1IXP
Πέμπτη 17 Νοεμβρίου 2011
GPS grid square finder πηγαίος κώδικας.
'gps
$regfile = "m16def.dat"
$crystal = 1000000
$baud = 4800
Config Porta = Input
Config Portd.2 = Input
Config Porta.0 = Output
Config Portb = Output
'Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Porta.0 , E = Portb.3 , Rs = Portb.4
Config Lcd = 16 * 2
Dim A As String * 1
Dim I As Byte
Dim K As Byte
Dim J As Byte
Dim Screen As Byte
Dim L As String * 1
Dim Packet(100) As String * 1
Dim Gps_time(10) As String * 1
Dim Status(1) As String * 1
Dim Lat(9) As String * 1
Dim Lat_num(9) As Integer
Dim Lat_dir(1) As String * 1
Dim Lon(10) As String * 1
Dim Lon_num(9) As Integer
Dim Lon_dir(1) As String * 1
Dim Speed(6) As String * 1
Dim Z As String * 3
Dim Track(10) As String * 1
Dim Day(6) As String * 1
Dim Mag(5) As String * 1
Dim Temp As Single
Dim Temp2 As Single
Dim Temp3 As Integer
Dim Temp4 As Integer
Dim Temp5 As Single
Dim Height(6) As String * 1
Dim Pre(3) As String * 1
Dim Sat(3) As String * 1
Config Int0 = Rising
Declare Sub Coordinate_print
Declare Sub Letter(x As Integer)
Declare Sub Get_info
Declare Sub Get_info2
Declare Sub Lat_conversion
Declare Sub Lon_conversion
Declare Sub Grid
Declare Sub Square
Declare Sub Subsquare
Declare Sub Date_gps
Declare Sub Time_gps
On Int0 Button
Cursor Off 'main program
Cls
Lcd "GPS GRID SQUARE"
Locate 2 , 1
Lcd " BY SV1IXP"
Wait 3
I = 0
Screen = 1
Cls
Enable Int0
Enable Interrupts
Do
Call Get_info2
Call Get_info
Select Case Screen
Case 2:
Locate 1 , 1
Lcd "LAT:"
Locate 2 , 1
Lcd "LON:"
Call Lat_conversion
Call Lon_conversion
Call Coordinate_print
Waitms 250
Enable Interrupts
Enable Int0
Case 1 :
Cls
Locate 1 , 1
Lcd "UTC: "
Locate 2 , 1
Lcd "GRID:"
Locate 2 , 1
Call Lat_conversion
Call Lon_conversion
Call Grid
Call Square
Call Subsquare
Call Time_gps
Waitms 250
Enable Interrupts
Enable Int0
Case 3:
Cls
Locate 1 , 1
Lcd "DATE: "
Locate 2 , 1
Lcd "HEIGHT: "
Locate 2 , 9
I = 1
Do
If Height(i) <> "," Then
Lcd Height(i)
End If
I = I + 1
Loop Until I = 7
Lcd "m"
Call Date_gps
Waitms 250
Enable Interrupts
Enable Int0
Case 4:
Cls
Lcd "SATS IN VIEW:"
I = 2
Do
If Sat(i) <> "," Then
Lcd Sat(i)
End If
I = I + 1
Loop Until I = 4
Locate 2 , 1
Lcd "PRE:"
I = 1
Do
Lcd Pre(i)
I = I + 1
Loop Until I = 4
Waitms 250
Enable Interrupts
Enable Int0
Case Else:
Cls
Lcd 55555
Waitms 250
Enable Interrupts
Enable Int0
End Select
Loop
End
Sub Grid
Temp2 = Lon_num(1) * 100
Temp = Lon_num(2) * 10
Temp = Temp + Lon_num(3)
Temp = Temp + Temp2
Lon_dir(1) = Packet(43)
If Lon_dir(1) = "E" Then
Temp = Temp + 180
Else
Temp = 180 - Temp
End If
Temp2 = Temp / 20
Temp3 = Int(temp2)
Call Letter(temp3)
Locate 2 , 7
Lcd L
Temp2 = Lat_num(1) * 10
Temp = Lat_num(2) * 1
Temp = Temp + Temp2
If Lat_dir(1) = "N" Then
Temp = Temp + 90
Else
Temp = 90 - Temp
End If
Temp2 = Temp / 10
Temp3 = Int(temp2)
Call Letter(temp3)
Lcd L
End Sub
Sub Square
Temp2 = Lon_num(1) * 100
Temp = Lon_num(2) * 10
Temp = Temp + Lon_num(3)
Temp = Temp + Temp2
Lon_dir(1) = Packet(43) 'prepei na allaksei
If Lon_dir(1) = "E" Then
Temp = Temp + 180
Else
Temp = 180 - Temp
End If
Temp2 = Temp / 20
Temp2 = Int(temp2)
Temp3 = Temp2
Temp3 = Temp3 * 20
Temp4 = Temp
Temp4 = Temp4 - Temp3
Temp = Temp4 / 2
Temp = Int(temp)
Temp4 = Temp
Locate 2 , 9
Lcd Temp4
Temp2 = Lat_num(1) * 10
Temp = Lat_num(2) * 1
Temp = Temp + Temp2
If Lat_dir(1) = "N" Then
Temp = Temp + 90
Else
Temp = 90 - Temp
End If
Temp2 = Temp / 10
Temp2 = Int(temp2)
Temp3 = Temp2
Temp3 = Temp3 * 10
Temp4 = Temp
Temp4 = Temp4 - Temp3
Temp = Temp4 / 1
Temp = Int(temp)
Temp4 = Temp
Lcd Temp4
End Sub
Sub Coordinate_print
K = 1
Locate 1 , 5
Do
Lcd Lat(k)
K = K + 1
Loop Until K = 10
Lcd Lat_dir(1)
K = 1
Locate 2 , 5
Do
Lcd Lon(k)
K = K + 1
Loop Until K = 11
Lcd Packet(43)
End Sub
Sub Subsquare
Temp = Lon_num(1) * 100
Temp2 = Lon_num(2) * 10
Temp = Temp + Temp2
Temp2 = Lon_num(3) * 1
Temp = Temp + Temp2
Temp2 = Temp / 20
Temp2 = Int(temp2)
Temp2 = 20 * Temp2
Temp = Temp - Temp2
Temp2 = Temp / 2
Temp2 = Int(temp2)
Temp2 = 2 * Temp2
Temp = Temp - Temp2
Temp = Int(temp)
Temp = Temp * 60
Temp2 = Lon_num(4) * 10
Temp5 = Lon_num(5) * 1
Temp2 = Temp2 + Temp5
Temp5 = Lon_num(7) * 0.1
Temp2 = Temp2 + Temp5
Temp2 = Temp2 + Temp
Temp = Temp2 / 5
Temp = Int(temp)
Temp3 = Temp
Call Letter(temp3)
Locate 2 , 11
Lcd L
Temp = Lat_num(3) * 10
Temp2 = Lat_num(4)
Temp = Temp + Temp2
Temp2 = Lat_num(6) * 0.1
Temp = Temp + Temp2
Temp2 = Lat_num(7) * 0.001
Temp = Temp + Temp2
Temp = Temp / 2.5
Temp = Int(temp)
Temp3 = Temp
Call Letter(temp3)
Locate 2 , 12
Lcd L
End Sub
Sub Get_info
Begin:
Do
A = Waitkey()
Loop Until A = "$"
I = 0
Do
A = Waitkey()
I = I + 1
Packet(i) = A
Loop Until I = 80 Or A = "*"
If Packet(5) = "C" And Packet(3) = "R" And Packet(4) = "M" Then 'check packet if ok
I = 7
J = 1
Do
A = Packet(i)
I = I + 1
Gps_time(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Status(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lat(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lat_dir(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lon(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lon_dir(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
Speed(j) = A
J = J + 1
Loop Until A = ","
J = 1
'void
Do
A = Packet(i)
I = I + 1
Track(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Day(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
Mag(j) = A
J = J + 1
Loop Until A = ","
Else
Goto Begin:
End If
End Sub
Sub Get_info2
Begin2:
Do
A = Waitkey()
Loop Until A = "$"
I = 0
Do
A = Waitkey()
I = I + 1
Packet(i) = A
Loop Until I = 80 Or A = "*"
If Packet(5) = "A" And Packet(3) = "G" And Packet(4) = "G" Then 'check packet if ok
I = 7
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
Sat(j) = A
J = J + 1
Loop Until A = ","
J = 1
'void
Do
A = Packet(i)
I = I + 1
Pre(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Height(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
Else
Goto Begin2:
End If
End Sub
Sub Lat_conversion
K = 0
Do
K = K + 1
Lat_num(k) = Val(lat(k))
Loop Until K = 9
End Sub
Sub Lon_conversion
K = 0
Do
K = K + 1
Lon_num(k) = Val(lon(k))
Loop Until K = 10
End Sub
Sub Time_gps
Locate 1 , 6
K = 1
Do
Lcd Gps_time(k)
K = K + 1
Loop Until K = 3
Lcd ":"
Do
Lcd Gps_time(k)
K = K + 1
Loop Until K = 5
Lcd ":"
Do
Lcd Gps_time(k)
K = K + 1
Loop Until K = 7
End Sub
Sub Date_gps
Locate 1 , 7
K = 1
Do
Lcd Day(k)
K = K + 1
Loop Until K = 3
Lcd "/"
Do
Lcd Day(k)
K = K + 1
Loop Until K = 5
Lcd "/"
Do
Lcd Day(k)
K = K + 1
Loop Until K = 7
End Sub
Sub Letter(x As Integer)
Select Case Temp3
Case 0 : L = "A"
Case 1 : L = "B"
Case 2 : L = "C"
Case 3 : L = "D"
Case 4 : L = "E"
Case 5 : L = "F"
Case 6 : L = "G"
Case 7 : L = "H"
Case 8 : L = "I"
Case 9 : L = "J"
Case 10 : L = "K"
Case 11 : L = "L"
Case 12 : L = "M"
Case 13 : L = "N"
Case 14 : L = "O"
Case 15 : L = "P"
Case 16 : L = "Q"
Case 17 : L = "R"
Case 18 : L = "S"
Case 19 : L = "T"
Case 20 : L = "U"
Case 21 : L = "V"
Case 22 : L = "W"
Case 23 : L = "X"
Case 24 : L = "Y"
Case 25 : L = "Z"
Case Else L = "*"
End Select
End Sub
Button:
Disable Interrupts
Disable Int0
Screen = Screen + 1
If Screen = 5 Then
Screen = 1
End If
Waitms 100
While Pind.2 = 1
Wend
Waitms 200
Cls
Return
$regfile = "m16def.dat"
$crystal = 1000000
$baud = 4800
Config Porta = Input
Config Portd.2 = Input
Config Porta.0 = Output
Config Portb = Output
'Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Porta.0 , E = Portb.3 , Rs = Portb.4
Config Lcd = 16 * 2
Dim A As String * 1
Dim I As Byte
Dim K As Byte
Dim J As Byte
Dim Screen As Byte
Dim L As String * 1
Dim Packet(100) As String * 1
Dim Gps_time(10) As String * 1
Dim Status(1) As String * 1
Dim Lat(9) As String * 1
Dim Lat_num(9) As Integer
Dim Lat_dir(1) As String * 1
Dim Lon(10) As String * 1
Dim Lon_num(9) As Integer
Dim Lon_dir(1) As String * 1
Dim Speed(6) As String * 1
Dim Z As String * 3
Dim Track(10) As String * 1
Dim Day(6) As String * 1
Dim Mag(5) As String * 1
Dim Temp As Single
Dim Temp2 As Single
Dim Temp3 As Integer
Dim Temp4 As Integer
Dim Temp5 As Single
Dim Height(6) As String * 1
Dim Pre(3) As String * 1
Dim Sat(3) As String * 1
Config Int0 = Rising
Declare Sub Coordinate_print
Declare Sub Letter(x As Integer)
Declare Sub Get_info
Declare Sub Get_info2
Declare Sub Lat_conversion
Declare Sub Lon_conversion
Declare Sub Grid
Declare Sub Square
Declare Sub Subsquare
Declare Sub Date_gps
Declare Sub Time_gps
On Int0 Button
Cursor Off 'main program
Cls
Lcd "GPS GRID SQUARE"
Locate 2 , 1
Lcd " BY SV1IXP"
Wait 3
I = 0
Screen = 1
Cls
Enable Int0
Enable Interrupts
Do
Call Get_info2
Call Get_info
Select Case Screen
Case 2:
Locate 1 , 1
Lcd "LAT:"
Locate 2 , 1
Lcd "LON:"
Call Lat_conversion
Call Lon_conversion
Call Coordinate_print
Waitms 250
Enable Interrupts
Enable Int0
Case 1 :
Cls
Locate 1 , 1
Lcd "UTC: "
Locate 2 , 1
Lcd "GRID:"
Locate 2 , 1
Call Lat_conversion
Call Lon_conversion
Call Grid
Call Square
Call Subsquare
Call Time_gps
Waitms 250
Enable Interrupts
Enable Int0
Case 3:
Cls
Locate 1 , 1
Lcd "DATE: "
Locate 2 , 1
Lcd "HEIGHT: "
Locate 2 , 9
I = 1
Do
If Height(i) <> "," Then
Lcd Height(i)
End If
I = I + 1
Loop Until I = 7
Lcd "m"
Call Date_gps
Waitms 250
Enable Interrupts
Enable Int0
Case 4:
Cls
Lcd "SATS IN VIEW:"
I = 2
Do
If Sat(i) <> "," Then
Lcd Sat(i)
End If
I = I + 1
Loop Until I = 4
Locate 2 , 1
Lcd "PRE:"
I = 1
Do
Lcd Pre(i)
I = I + 1
Loop Until I = 4
Waitms 250
Enable Interrupts
Enable Int0
Case Else:
Cls
Lcd 55555
Waitms 250
Enable Interrupts
Enable Int0
End Select
Loop
End
Sub Grid
Temp2 = Lon_num(1) * 100
Temp = Lon_num(2) * 10
Temp = Temp + Lon_num(3)
Temp = Temp + Temp2
Lon_dir(1) = Packet(43)
If Lon_dir(1) = "E" Then
Temp = Temp + 180
Else
Temp = 180 - Temp
End If
Temp2 = Temp / 20
Temp3 = Int(temp2)
Call Letter(temp3)
Locate 2 , 7
Lcd L
Temp2 = Lat_num(1) * 10
Temp = Lat_num(2) * 1
Temp = Temp + Temp2
If Lat_dir(1) = "N" Then
Temp = Temp + 90
Else
Temp = 90 - Temp
End If
Temp2 = Temp / 10
Temp3 = Int(temp2)
Call Letter(temp3)
Lcd L
End Sub
Sub Square
Temp2 = Lon_num(1) * 100
Temp = Lon_num(2) * 10
Temp = Temp + Lon_num(3)
Temp = Temp + Temp2
Lon_dir(1) = Packet(43) 'prepei na allaksei
If Lon_dir(1) = "E" Then
Temp = Temp + 180
Else
Temp = 180 - Temp
End If
Temp2 = Temp / 20
Temp2 = Int(temp2)
Temp3 = Temp2
Temp3 = Temp3 * 20
Temp4 = Temp
Temp4 = Temp4 - Temp3
Temp = Temp4 / 2
Temp = Int(temp)
Temp4 = Temp
Locate 2 , 9
Lcd Temp4
Temp2 = Lat_num(1) * 10
Temp = Lat_num(2) * 1
Temp = Temp + Temp2
If Lat_dir(1) = "N" Then
Temp = Temp + 90
Else
Temp = 90 - Temp
End If
Temp2 = Temp / 10
Temp2 = Int(temp2)
Temp3 = Temp2
Temp3 = Temp3 * 10
Temp4 = Temp
Temp4 = Temp4 - Temp3
Temp = Temp4 / 1
Temp = Int(temp)
Temp4 = Temp
Lcd Temp4
End Sub
Sub Coordinate_print
K = 1
Locate 1 , 5
Do
Lcd Lat(k)
K = K + 1
Loop Until K = 10
Lcd Lat_dir(1)
K = 1
Locate 2 , 5
Do
Lcd Lon(k)
K = K + 1
Loop Until K = 11
Lcd Packet(43)
End Sub
Sub Subsquare
Temp = Lon_num(1) * 100
Temp2 = Lon_num(2) * 10
Temp = Temp + Temp2
Temp2 = Lon_num(3) * 1
Temp = Temp + Temp2
Temp2 = Temp / 20
Temp2 = Int(temp2)
Temp2 = 20 * Temp2
Temp = Temp - Temp2
Temp2 = Temp / 2
Temp2 = Int(temp2)
Temp2 = 2 * Temp2
Temp = Temp - Temp2
Temp = Int(temp)
Temp = Temp * 60
Temp2 = Lon_num(4) * 10
Temp5 = Lon_num(5) * 1
Temp2 = Temp2 + Temp5
Temp5 = Lon_num(7) * 0.1
Temp2 = Temp2 + Temp5
Temp2 = Temp2 + Temp
Temp = Temp2 / 5
Temp = Int(temp)
Temp3 = Temp
Call Letter(temp3)
Locate 2 , 11
Lcd L
Temp = Lat_num(3) * 10
Temp2 = Lat_num(4)
Temp = Temp + Temp2
Temp2 = Lat_num(6) * 0.1
Temp = Temp + Temp2
Temp2 = Lat_num(7) * 0.001
Temp = Temp + Temp2
Temp = Temp / 2.5
Temp = Int(temp)
Temp3 = Temp
Call Letter(temp3)
Locate 2 , 12
Lcd L
End Sub
Sub Get_info
Begin:
Do
A = Waitkey()
Loop Until A = "$"
I = 0
Do
A = Waitkey()
I = I + 1
Packet(i) = A
Loop Until I = 80 Or A = "*"
If Packet(5) = "C" And Packet(3) = "R" And Packet(4) = "M" Then 'check packet if ok
I = 7
J = 1
Do
A = Packet(i)
I = I + 1
Gps_time(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Status(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lat(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lat_dir(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lon(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Lon_dir(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
Speed(j) = A
J = J + 1
Loop Until A = ","
J = 1
'void
Do
A = Packet(i)
I = I + 1
Track(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Day(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
Mag(j) = A
J = J + 1
Loop Until A = ","
Else
Goto Begin:
End If
End Sub
Sub Get_info2
Begin2:
Do
A = Waitkey()
Loop Until A = "$"
I = 0
Do
A = Waitkey()
I = I + 1
Packet(i) = A
Loop Until I = 80 Or A = "*"
If Packet(5) = "A" And Packet(3) = "G" And Packet(4) = "G" Then 'check packet if ok
I = 7
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
Sat(j) = A
J = J + 1
Loop Until A = ","
J = 1
'void
Do
A = Packet(i)
I = I + 1
Pre(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do
A = Packet(i)
I = I + 1
Height(j) = A
J = J + 1
Loop Until A = ","
J = 1
Do 'void
A = Packet(i)
I = I + 1
J = J + 1
Loop Until A = ","
Else
Goto Begin2:
End If
End Sub
Sub Lat_conversion
K = 0
Do
K = K + 1
Lat_num(k) = Val(lat(k))
Loop Until K = 9
End Sub
Sub Lon_conversion
K = 0
Do
K = K + 1
Lon_num(k) = Val(lon(k))
Loop Until K = 10
End Sub
Sub Time_gps
Locate 1 , 6
K = 1
Do
Lcd Gps_time(k)
K = K + 1
Loop Until K = 3
Lcd ":"
Do
Lcd Gps_time(k)
K = K + 1
Loop Until K = 5
Lcd ":"
Do
Lcd Gps_time(k)
K = K + 1
Loop Until K = 7
End Sub
Sub Date_gps
Locate 1 , 7
K = 1
Do
Lcd Day(k)
K = K + 1
Loop Until K = 3
Lcd "/"
Do
Lcd Day(k)
K = K + 1
Loop Until K = 5
Lcd "/"
Do
Lcd Day(k)
K = K + 1
Loop Until K = 7
End Sub
Sub Letter(x As Integer)
Select Case Temp3
Case 0 : L = "A"
Case 1 : L = "B"
Case 2 : L = "C"
Case 3 : L = "D"
Case 4 : L = "E"
Case 5 : L = "F"
Case 6 : L = "G"
Case 7 : L = "H"
Case 8 : L = "I"
Case 9 : L = "J"
Case 10 : L = "K"
Case 11 : L = "L"
Case 12 : L = "M"
Case 13 : L = "N"
Case 14 : L = "O"
Case 15 : L = "P"
Case 16 : L = "Q"
Case 17 : L = "R"
Case 18 : L = "S"
Case 19 : L = "T"
Case 20 : L = "U"
Case 21 : L = "V"
Case 22 : L = "W"
Case 23 : L = "X"
Case 24 : L = "Y"
Case 25 : L = "Z"
Case Else L = "*"
End Select
End Sub
Button:
Disable Interrupts
Disable Int0
Screen = Screen + 1
If Screen = 5 Then
Screen = 1
End If
Waitms 100
While Pind.2 = 1
Wend
Waitms 200
Cls
Return
Κυριακή 13 Νοεμβρίου 2011
GPS locator finder
Ένα ραδιοερασιτεχνικό πρόβλημα στις /p επαφές είναι ο ακριβής προσδιορισμός του grid locator. Οι περισσότερες φορητές συσκευές GPS δίνουν το στίγμα μόνο σε κλασική μορφή γεωγραφικού μήκους/πλάτους και οι πράξεις στο χαρτί για να υπολογιστεί το locator από το lat/lon δεν είναι και οι πιο εύκολες να γίνουν στο πόδι χωρίς λάθη... Συσκευή που να δίνει το loc δεν είχα. Είχα όμως ένα GPS μάους που καθόταν! Βέβαια είχε USB συνδεσιμότητα αλλά για καλή τύχη στο εσωτερικό του είχε ένα Prolific PL-2303HX. Στο Pin Νο5 είναι η είσοδος για τα σειραϊκά δεδομένα που έρχονται από το SiRFstarII ! Οπότε η σύνδεση του με έναν μικροελενκτή είναι παιχνιδάκι.
Ένας Atmega16 διαβάζει τα ΝΜΕΑ πακέτα που στέλνει το GPS και υπολογίζει το grid locator αυτόματα. Η προβολή γίνεται σε μια κλασική οθόνη χαρακτήρων 2Χ16 . Η τροφοδοσία προέρχεται από δυο lipo μπαταρίες 400mAh σε σειρά. Ακολουθούν σε νέα ανάρτηση το σχηματικό και ο πηγαίος κώδικας που τρέχει ο μΕ.
Πληροφορίες για το grid locator system :
Πληροφορίες για το NMEA:
http://aprs.gids.nl/nmea/73 de SV1IXP
Παρασκευή 28 Οκτωβρίου 2011
Τρίτη 25 Οκτωβρίου 2011
Αυτόματο τρύπημα πλακετών. (Final)
Παρατίθενται ως αναφορά τα τελευταία σχεδία της κατασκευής. Η τάση εξόδου του 317 πρέπει να είναι στα 7V. Σε περίπτωση που χρησιμοποιηθεί 5V servo θα πρέπει να υπολογιστεί η R3 για 5V και να παραληφθούν οι δίοδοι D1,D2 και D3.
R1=500
R2=240
R3=***
R4=500
R5=500
R6=10K
R7=10K
R8=4.7K
R9=10K
R10=10K
R11=10K
C1=2000μf
C2=1μf
T1=BC547
K1=RT424005
IC1=ATMEGA16
IC2=LM317
D1=1N4004***
D2=1N4004***
D3=1N4004***
73 de SV1IXP
R2=240
R3=***
R4=500
R5=500
R6=10K
R7=10K
R8=4.7K
R9=10K
R10=10K
R11=10K
C1=2000μf
C2=1μf
T1=BC547
K1=RT424005
IC1=ATMEGA16
IC2=LM317
D1=1N4004***
D2=1N4004***
D3=1N4004***
73 de SV1IXP
Τετάρτη 19 Οκτωβρίου 2011
Κώδικας για αυτόματο τρύπημα πλακετών.
Παρατίθεται ο κώδικας σε Bascom που τρέχει ο μΕ ATMEGA16 για το αυτόματο τρύπημα πλακετών.
'servo
$regfile = "m16def.dat"
$crystal = 8000000
Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Porta.3 = Input
Config Porta.4 = Input
Config Porta.5 = Input
Config Portd.0 = Input
Config Portd.2 = Input
Dim I As Integer
Dim Neutral_position As Integer
Dim Drill_start As Integer
Dim Drill_end As Integer
Dim Drill_speed As Integer
Dim Drill_speed_temp As Single
Dim Temp1 As Single
Dim Temp As Integer
Dim Drill_start_rom As Eram Integer At 14 , Drill_end_rom As Eram Integer At 16 , Drill_speed_rom As Eram Integer At 18
On Int0 Neutral
Config Int0 = Falling
Portd.7 = 1
Waitms 200
Neutral_position = 250
Drill_start = Drill_start_rom
Drill_end = Drill_end_rom
Drill_speed = Drill_speed_rom
Enable Interrupts
Enable Int0
Portd.6 = 0
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Waitms 500
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Wait 500
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Wait 500
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Wait 500
If Pina.5 = 1 Then
Porta.0 = 1
Wait 1
While Pina.5 = 0
If Pina.4 = 1 Then
Drill_start = Drill_start + 1
End If
If Pina.3 = 1 Then
Drill_start = Drill_start - 1
End If
If Drill_start < 375 Then
Drill_start = 375
End If
If Drill_start > 500 Then
Drill_start = 500
End If
Pulseout Portd , 6 , Drill_start
Waitms 18
Wend
Drill_start_rom = Drill_start
Porta.0 = 0
Wait 1
End If
If Pina.5 = 1 Then
Porta.1 = 1
Wait 1
While Pina.5 = 0
If Pina.4 = 1 Then
Drill_end = Drill_end + 1
End If
If Pina.3 = 1 Then
Drill_end = Drill_end - 1
End If
If Drill_end < 380 Then
Drill_end = 380
End If
If Drill_end > 510 Then
Drill_end = 510
End If
Pulseout Portd , 6 , Drill_end
Waitms 18
Wend
Drill_end_rom = Drill_end
Porta.1 = 0
Wait 1
End If
If Pina.5 = 1 Then
Porta.2 = 1
Wait 1
Temp1 = Drill_start
While Pina.5 = 0
If Pina.4 = 1 Then
Drill_speed = Drill_speed + 1
End If
If Pina.3 = 1 Then
Drill_speed = Drill_speed - 1
End If
If Drill_speed < 1 Then
Drill_speed = 0
End If
If Drill_speed > 100 Then
Drill_speed = 100
End If
Drill_speed_temp = Drill_speed / 40
Temp1 = Temp1 + Drill_speed_temp
Temp = Round(temp1)
Pulseout Portd , 6 , Temp
If Temp > Drill_end Then
Temp = Drill_start
Temp1 = Temp
End If
Waitms 18
Wend
Drill_speed_rom = Drill_speed
Wait 1
Porta.2 = 0
End If
Begin:
Do
Portd.6 = 0
While Pind.0 = 0
Pulseout Portd , 6 , Drill_start
Waitms 18
Wend
Temp1 = Drill_start
Portd.6 = 0
Do
Drill_speed_temp = Drill_speed / 40
Temp1 = Temp1 + Drill_speed_temp
Temp = Round(temp1)
Pulseout Portd , 6 , Temp
Waitms 17
Loop Until Temp > Drill_end
Loop
End
Neutral:
Disable Interrupts
Disable Int0
Portd.6 = 0
I = 0
Do
Pulseout Portd , 6 , Neutral_position
Waitms 18
I = I + 1
Loop Until I = 50
Portd.7 = 0
Wait 5
Return
Η pulseout εντολή δημιουργεί τους παλμούς που οδηγούν το servo. Η υπορουτίνα neutral είναι υπεύθυνη για την απομάκρυνση του τρυπανιού από την επιφάνεια όταν μετακινηθεί ο διακόπτης σε θέση Off.
73 de SV1IXP
Πέμπτη 13 Οκτωβρίου 2011
Αυτόματο τρύπημα πλακετών
Μετά από αρκετή αναμονή πλέον είναι έτοιμο και το σύστημα τρυπήματος πλακετών με χρήση μοντελιστικού σερβομηχανισμού και μικροελενκτη.
Το σύστημα βασίζεται στην βάση MB140/S και τον ταχυτροχο IB/E της PROXXON.
H λογική λειτουργίας είναι απλή και βασίζεται σε έναν μικροελεγκτή ΑTMEGA16 ο οποίος δημιουργεί το απαιτούμενο PWM (pulse width modulation) σήμα που χρειάζεται το servo για τον έλεγχο της θέσης του. Ρυθμιζόμενες παράμετροι μέσω διακοπτών είναι η αρχή και το τέλος της διαδρομής καθώς και η ταχύτητα διάτρησης. Οι παράμετροι αποθηκεύονται στην ανεξίτηλη μνήμη του μικροελεγκτή για ανάκληση κάθε φορά που ενεργοποιείται το σύστημα. Για τη ρύθμιση κρατάμε πατημένο το κουμπί SETUP κατά την ενεργοποίηση της τροφοδοσίας μέχρι να ανάψει το πρώτο led το οποίο μας ενημερώνει ότι ρυθμίζουμε την αντίστοιχη παράμετρο μέσω των κουμπιών UP/DOWN. Για τη ρύθμιση των υπολοίπων παραμέτρων κρατάμε πατημένο το SETUP μέχρι να ανάσσει το επόμενο led ή το πατάμε στιγμιαία για να βγούμε από την διαδικασία του setup.
Μια extra λειτουργία/ευκολία είναι η απομάκρυνση του τρυπανιού από την επιφάνεια μας (πάνω στην οποία τρυπάμε) με την απενεργοποίηση του διακόπτη της τροφοδοσίας, η οποία υλοποιείται με την βοήθεια του relay όπως φαίνεται στο σχέδιο.
Με την πίεση ενός ποδοδιακοπτη ξεκινάει η διάτρηση.
Ακολουθεί ο κώδικας/σχηματικό/πλακέτα σε νέα δημοσίευση.
Ακολουθεί ο κώδικας/σχηματικό/πλακέτα σε νέα δημοσίευση.
73 de SW1IXP
Παρασκευή 16 Σεπτεμβρίου 2011
Σάββατο 10 Σεπτεμβρίου 2011
STEP ATTENUATOR
Ο ρυθμιζόμενος εξασθενητής είναι σχεδιασμένος με βάση το ARRL HANDBOOK (19.52 A SWITCHED ATTENUATOR) και έχει 1,2,4,8,10 και δυο 20dB τιμές εξασθένισης δίνοντας επιλογές εξασθένησης ανά 1dB μέχρι 65dB θεωρητικά (βλέπε διάγραμμα παρακάτω). Οι αντιστάσεις είναι 1% metal film και οι διακόπτες απλοί toggle switches. Το κέλυφος είναι κατασκευασμένο από χαλκό πάχους 1mm. Οι κοννέκτορες είναι BNC θηλυκοί. Η μέγιστη τιμή ισχύος που αντέχει είναι 300mW και μπορεί να χρησιμοποιηθεί για μετρήσεις με τυπική ακρίβεια +-1dB για συχνότητες μέχρι 150MHz περίπου.
Με μπλε το πραγματικό μέρος και με κόκκινο το φανταστικό.
Η μέγιστη εξασθένηση που μετρήθηκε ήταν 47dB περίπου. Ο θόρυβος με την μορφή spikes στην καμπύλη υποδηλώνει παρεμβολή από ισχυρά σήματα (πιθανότατα ραδιοφονικά) και περιορίζει την ευαισθησία του Minivna (Ίσως πρέπει να μετακομίσω σε καμιά σπηλιά για να κάνω την μέτρηση)
73 de SV1IXP
Με μπλε το πραγματικό μέρος και με κόκκινο το φανταστικό.
Η μέγιστη εξασθένηση που μετρήθηκε ήταν 47dB περίπου. Ο θόρυβος με την μορφή spikes στην καμπύλη υποδηλώνει παρεμβολή από ισχυρά σήματα (πιθανότατα ραδιοφονικά) και περιορίζει την ευαισθησία του Minivna (Ίσως πρέπει να μετακομίσω σε καμιά σπηλιά για να κάνω την μέτρηση)
Τα στάσιμα είναι κάτω από 3:1 για συχνότητες <160MHz Άρα για συχνότητες κάτω από 160MHz η απώλεια λόγο κακής προσαρμογής ειναι μικρότερη από 1dB.
Η ελάχιστη εξασθένηση είναι 1dB περίπου (έχοντας επιλέξει μηδενική εξασθένηση!).
73 de SV1IXP
Εγγραφή σε:
Αναρτήσεις (Atom)