BỐ CỤC TRÌNH BÀY
PHẦN A :LÝ THUYẾT LIÊN QUAN
PHẦN B :THIẾT KẾ
PHẦN C :KẾT QUẢ- HƯỚNG PHÁT TRIỂN
1.GIỚI THIỆU MẠNG CÔNG NGHIỆP
Trong nhiều thập niên qua việc ứng dụng mạng thông tin vào lĩnh vực công nghiệp đã bùng nổ rất mạnh mẽ.Các hệ thống mạng phát triển rất mạnh và đa dạng .
Việc ứng dụng mạng công nghiệp đã mang lại những lợi ích rõ nét
Chi phí lắp đặt hệ thống
Nhân công điều hành
Tiện ích quản lý hệ thống
Cải thiện môi trường làm việc
93 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2449 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu và thiết kế mạng công nghiệp sử dụng FPGA và CPU 89S8252, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Khoâng
Time out?
Khoâng
Soá laàn phaùt baèng 3 ?
Coù
Xoùa Time out
Taêng bieán soá laàn phaùt döõ lieäu
Xoùa Time out
Xoùa bieán soá laàn phaùt döõ lieäu
Thoaùt
Thoaùt
Loãi ñöôøng truyeàn
1.3.2.Thuû tuïc nhaän döõ lieäu
Giaûm ñoä daøi khung
1 ñôn vò
Ñoä daøi khung =0?
Boä ñeäm coù döõ lieäu ?
Phuïc hoài caùc con troû
vaø caùc thanh ghi
Thoaùt
Löu giöõ caùc con troû
vaø caùc thanh ghi
Khoâng
Coù
Caát döõ lieäu
Ñoä daøi khung =0?
Coù
Kieåm tra
ñaàu khung ?
Coù
Gaùn ñoä daøi khung baèng 5
Gaùn ñoä daøi khung baèng 0
Khoâng
Khoâng
A
B
C
D
Coù
E
Khoâng
Thuû tuïc nhaän döõ lieäu
Tính FCS
Tính FCS K
A
Ñoä daøi khung =0?
Coù
C
Khoâng
D
E
Löu döõ lieäu
Taêng con troû döõ lieäu
B
Phaàn dö tính FCS =0 ?
Coù
Döïng côø baùo nhaän toát
Tính FCS K
Döïng côø baùo nhaän khoâng toát
Tính FCS K
Khoâng
F
Xöû lyù khung leänh
Tính FCS K
Nhaän ñuùng ñòa chæ ?
F
Côø nhaän toát khoâng ?
Coù
Khoâng
Traû con troû döõ lieäu veà vò trí ban ñaàu
Xoùa côø nhaän
Tính FCS K
Thoaùt
Coù
Khoâng
Thuû tuïc nhaän döõ lieäu xöû lyù caùc khung leänh nhaän ñöôïc töø Kit convert.dsn göûi leân baèng 2 con troû
Con troû giöõ vò trí ban ñaàu cuûa boä ñeäm
Con troû giöõ vò trí döõ lieäu coù trong boä ñeäm
Khi 2 con troû khaùc nhau chöùng toû trong boä ñeäm coù döõ lieäu.Khi boä ñeäm nhaän ñuû moät khung leänh thì thuû tuïc tính FCS.Keát quaû tính FCS xaùc ñònh khung nhaän toát hay bò loãi .Khi khung nhaän toát thì thuû tuïc tieáp tuïc xöû lyù xem khung döõ lieäu nhaän ñöôïc laø loaïi khung gì thoâng qua byte Command trong khung maø coù nhöõng xöû lyù töông öùng vôùi khung vöøa nhaän .
1.3.2.1.Tính FCS
Khoâng
Dòch phaûi FCS
Dòch phaûi Data
Dòch phaûi Command
Dòch phaûi Address
Dòch phaûi Header
Giaûm soá laàn quay 1 ñôn vò
Soá laàn quay baèng 0 ?
Coù
Gaùn soá laàn quay dòch phaûi laø 32
Côø C baèng 1?
Côø C baèng 1?
Xor byte Header vaø 07h
Caäp nhaät byte Header
Thoaùt
Khoâng
Khoâng
Coù
Xor byte Header vaø 07h
Gaùn Header vaøo byte FCS
Gaùn Header
vaøo byte FCS
Coù
Tính FCS
Giaûi thuaät tính FCS coù ña thöùc sinh: 100000111
Höôùng phaùt:
Tính CRC-8 cho 4 byte
1/Header
2/Address
3/Command
4/Data
Keát quaû tính FCS laø byte thöù 5 trong khung döõ lieäu phaùt.
FCS
Data
Command Lôùp lieân keát
Address
Header
Khung döõ lieäu phaùt
Höôùng thu:
Tính CRC-8 cho 5 byte nhaän ñöôïc
1/Header
2/Address
3/Command
4/Data
5/FCS
Header
Address
Command Lôùp lieân keát
Data
FCS
Khung döõ lieäu thu
Phaàn dö keát quaû tính FCS baèng 0 thì keát quaû nhaän khoâng loãi .Phaàn dö khaùc 0 thì khung döõ lieäu nhaän bò loãi.
Trong giaûi thuaät tính FCS coù söû duïng côø C.Côø C laø keát quaû dòch phaûi cuûa 5 byte khung döõ lieäu.Keát quaû tính ñöôïc löu vaøo byte FCS.
1.4.Chöông trình nguoàn
Chöông trình:
Frmmain:
Private Sub CmdImage1_Click()
FrmSystemConfig.Show
FrmCom.Show
End Sub
Private Sub CmdOpenPort_Click()
Call PortOpen
End Sub
Private Sub Form_Load()
Demo = " MOÂ HÌNH MAÏNG "
Demolbl = Demo & " "
TimeReadBuffer.Enabled = True
Timereadcode.Enabled = True
End Sub
Private Sub timer_ack_Timer()
MsgBox "Network erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Rx_frame(0) = 0
Rx_frame(1) = 0
Rx_frame(2) = 0
Rx_frame(3) = 0
Rx_frame(4) = 0
End Sub
Private Sub Timer1_Timer()
Dim Str As String
Str = Left(Demolbl.Caption, 1)
Demolbl.Caption = Mid(Demolbl.Caption, 2, Len(Demolbl.Caption) - 1) & Str
End Sub
Private Sub Timer3_Timer()
'=============================================
'Day la doan kiem tra Ack .Neu nhan duoc dung Ack
'thi off kiem tra timoout
'Neu nhu nhan duoc frame tot ma khong dung
'Ack cua kenh vua gui thi cagnh bao dong thoi
'cung off luon timeout
'Kiem tra ACK nhan duoc
'Co Complte_F bao nhan frame tot
If Complete_F Then
'=============================================
Complete_F = False
If Crc_F Then
MsgBox "Crc8 erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Else
If (Rx_frame(1) Kit) Then
MsgBox "Address erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Else
'Sau 6 s ma chua nhan duoc Ack thi canh bao duong truyen
If (Rx_frame(2) Ack_F) Then
MsgBox "Ack erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Else
FrmMain.timer_ack.Enabled = False
Ack_good = True
Msgbox "nhan duoc ack"
Rx_header = Rx_frame(0)
Rx_address = Rx_frame(1)
Rx_command = Rx_frame(2)
Rx_data = Rx_frame(3)
Rx_fcs = Rx_frame(4)
End If
End If
End If
Rx_frame(0) = 0
Rx_frame(1) = 0
Rx_frame(2) = 0
Rx_frame(3) = 0
Rx_frame(4) = 0
End If
End Sub
Private Sub Timer4_Timer()
If Ack_good Then
Ack_good = False
If Data_send_F Then
Data_send_F = False
Else
Header = 160
Address = Kit
Command = Data_F
Data = Val(FrmSystemConfig.txtdata1.Text)
Call senddata
Data_send_F = True
MsgBox "gui data1"
FrmMain.timer_ack.Enabled = True
End If
End If
End Sub
Private Sub TimeReadBuffer_Timer()
TimeReadBuffer.Enabled = False
Call ReadBuffer
End Sub
Private Sub timereadcode_Timer()
timereadcode.Enabled = False
Call Readcode
End Sub
Frmsystemconfig:
Private Sub txdaddress_Change()
End Sub
Private Sub CmdOpenPort_Click()
Call PortOpen
End Sub
Private Sub Cmdsend_Click()
Cmdsend.Enabled = True
Data = Val(txtdata1.Text)
If Data > 255 Then
MsgBox ("Invalid Value,Try again Datatx value:")
Exit Sub
Else
If txtdata1.Text = "" Then
MsgBox ("No value,Try again Datatx value:")
Exit Sub
End If
End If
Address = Kit
If Address > 255 Then
MsgBox ("Invalid Value,Try again Addresstx value:")
Exit Sub
Else
If (Kit 1) And (Kit 2) And (Kit 3) And (Kit 4) And (Kit 5) Then
MsgBox ("No Kit,Try again Kit value:")
Exit Sub
End If
End If
Header = 160
Address = Kit
Command = Token_F
Call senddata
'=============================================
'Cho timer tinh timeout
'=============================================
MsgBox "Phat xong dang cho ack"
FrmMain.timer_ack.Enabled = True
FrmMain.Timer3.Enabled = True
End Sub
Private Sub Combo1_Change()
End Sub
Private Sub Combo1_Click()
End Sub
Private Sub CmpBaud_Click()
Select Case CmpBaud.ListIndex
Case 0
Baud = "1200"
Case 1
Baud = "2400"
Case 2
Baud = "4800"
Case 3
Baud = "9600"
Case 4
Baud = "19200"
End Select
End Sub
Private Sub CmpKit_Click()
Select Case CmpKit.ListIndex
Case 0
Kit = 1
Case 1
Kit = 2
Case 2
Kit = 3
Case 3
Kit = 4
Case 4
Kit = 5
End Select
End Sub
Private Sub Command1_Click()
FrmMain.timer_ack.Enabled = True
End Sub
Private Sub Form_Load()
CmpPort.AddItem "COM1"
CmpPort.AddItem "COM2"
CmpPort.ListIndex = 0
CmpBaud.AddItem "1200"
CmpBaud.AddItem "2400"
CmpBaud.AddItem "4800"
CmpBaud.AddItem "9600"
CmpBaud.AddItem "19200"
CmpBaud.ListIndex = 0
Port_Num = 1
Baud = "1200"
Token_F = 12
Ack_F = 10
Data_F = 15
Cmdsend.Enabled = True
CmpKit.AddItem "1"
CmpKit.AddItem "2"
CmpKit.AddItem "3"
CmpKit.AddItem "4"
CmpKit.AddItem "5"
FCSTX = 0
Count_F = 0
Timer_F = 0
RX_pointer = 0
Buffer_pointer = 0
End Sub
Private Sub Label6_Click()
End Sub
Private Sub Label7_Click()
End Sub
Module1
Declare Function OPENCOM Lib "port" (ByVal A$) As Integer
Declare Sub CLOSECOM Lib "port" ()
Declare Sub SENDBYTE Lib "port" (ByVal b%)
Declare Function READBYTE Lib "port" () As Integer
Declare Sub DTR Lib "port" (ByVal b%)
Declare Sub RTS Lib "port" (ByVal b%)
Declare Sub TXD Lib "port" (ByVal b%)
Declare Function CTS Lib "port" () As Integer
Declare Function DSR Lib "port" () As Integer
Declare Function RI Lib "port" () As Integer
Declare Function DCD Lib "port" () As Integer
Declare Sub DELAY Lib "port" (ByVal b%)
Declare Sub TIMEINIT Lib "port" ()
Declare Sub TIMEINITUS Lib "port" ()
Declare Function TIMEREAD Lib "port" () As Long
Declare Function TIMEREADUS Lib "port" () As Long
Declare Sub DELAYUS Lib "port" (ByVal l As Long)
Declare Sub REALTIME Lib "port" (ByVal i As Boolean)
Module2:
'Var Parametter
Public NewPort As Integer
Public OldPort As Integer
Public Port_Num As Integer
Public Baud As String
Public Setting As String
Public RX_str(0 To 255) As String
Public RX_pointer As Integer
Public RX_code(0 To 255) As Integer
Public RX(0 To 2) As String
Public Buffer_str(0 To 255) As String
Public Buffer_pointer As Integer
Public Buffer_code(0 To 255) As Integer
Public Header As Integer
Public Address As Integer
Public Addresstx As Integer
Public Command As Integer
Public Token_F As Integer
Public Ack_F As Integer
Public Data_F As Integer
Public Rx_header As Integer
Public Rx_address As Integer
Public Rx_command As Integer
Public Rx_data As Integer
Public Rx_fcs As Integer
Public Data As Integer
Public FCSRX As Integer
Public FCSTX As Integer
Public Lenght_Frame As Integer
Public Rx_frame(0 To 4) As Integer
Public Frame_pointer As Integer
Public Header_f As Boolean
Public Complete_F As Boolean
Public Crc_F As Boolean
Public Kit As Integer
Public Ack_good As Integer
Public Data_send_F As Integer
Public Code_str As String
Public Count_Byte As Byte
Public fcs As Integer
Public data As Integer
Public command As Integer
Public address As Integer
Public crc As Integer
Public header As Integer
Public rotate As Integer
Public fcs_c As Boolean
Public data_c As Boolean
Public command_c As Boolean
Public address_c As Boolean
Public header_c As Boolean
Public crc_request As Boolean
'===========Send Byte to BTS=============
Public Sub SendTX(Data As Integer)
Dim i As Integer
On Error Resume Next
If FrmMain.MSComm.PortOpen Then
FrmMain.MSComm.PortOpen = False 'Close FrmMain.Mscomm32.ocx
End If
'use Port.DLL
Setting = "COM" + CStr(Port_Num) + "," + Baud + ",N,8,1"
i = OPENCOM(Setting)
If i = 0 Then
FrmSystemConfig.lblStatusport.Caption = Setting + vbCrLf + "STATUS" + " : CLOSE" + vbCrLf
GoTo lable1
Else
FrmSystemConfig.lblStatusport.Caption = Setting + vbCrLf + "STATUS" + " : OPEN" + vbCrLf
SENDBYTE (Data)
CLOSECOM 'Close Port.dll
End If
lable1:
Call PortOpen
End Sub
'=========================
Public Sub PortOpen()
Dim ReOpen As Boolean
On Error Resume Next
NewPort = FrmSystemConfig.CmpPort.ListIndex + 1
OldPort = FrmMain.MSComm.CommPort
If Err = 0 Then
If NewPort OldPort Then ' If the port number changes, close the old port.
If FrmMain.MSComm.PortOpen Then
FrmMain.MSComm.PortOpen = False
ReOpen = True
End If
FrmMain.MSComm.CommPort = NewPort
If ReOpen Then
FrmMain.MSComm.PortOpen = True
Setting = Baud & ",N,8,1"
FrmMain.MSComm.Settings = Setting
End If
End If
End If
Setting = Baud & ",N,8,1"
FrmMain.MSComm.Settings = Setting
FrmMain.MSComm.PortOpen = Not FrmMain.MSComm.PortOpen
If Err Then MsgBox Error$, 48
Port_Num = FrmMain.MSComm.CommPort
If FrmMain.MSComm.PortOpen Then
FrmSystemConfig.lblStatusport.Caption = "COM" & CStr(Port_Num) + "," + Setting + vbCrLf + "STATUS:" + " OPEN" + vbCrLf
Else
FrmSystemConfig.lblStatusport.Caption = "COM" & CStr(Port_Num) + "," + Setting + vbCrLf + "STATUS:" + " CLOSE" + vbCrLf
End If
End Sub
'==========ReadBuffer Port to save Buffer=========
Public Sub ReadBuffer()
If FrmMain.MSComm.InBufferCount Then
FrmMain.MSComm.InputLen = 1
Buffer_str(Buffer_pointer) = FrmMain.MSComm.Input
Buffer_pointer = Buffer_pointer + 1
If (Buffer_pointer > 255) Then
Buffer_pointer = 0
End If
End If
FrmMain.TimeReadBuffer.Enabled = True
End Sub
Public Sub Readcode()
If (RX_pointer Buffer_pointer) Then
'======================================================'Day la doan cap nhat con tro va bien doi ve thanh decimal
'luu giu trong Rx_code
If (Buffer_str(RX_pointer) "") And Buffer_str(RX_pointer) " " Then
RX_str(RX_pointer) = Buffer_str(RX_pointer) '???
RX_code(RX_pointer) = Asc(LTrim(RX_str(RX_pointer)))
' FrmSystemConfig.txtdata2.Caption = Str(Asc(LTrim(RX_str(RX_pointer))))
' Code_str = BinaryConvert(RX_code(RX_pointer))
'======================================================'sua chua
If Header_f Then
Rx_frame(Frame_pointer) = RX_code(RX_pointer)
Frame_pointer = Frame_pointer + 1
Else
If (RX_code(RX_pointer) = 160) Then
Rx_frame(Frame_pointer) = RX_code(RX_pointer)
Frame_pointer = Frame_pointer + 1
Header_f = True
Else
End If
End If
'====================================================== Else
RX_code(RX_pointer) = 32
'======================================================'sua chua
If Header_f Then
Rx_frame(Frame_pointer) = RX_code(RX_pointer)
FrmSystemConfig.txtdata2.Caption = Str(Rx_frame(Frame_pointer))
Frame_pointer = Frame_pointer + 1
Else
If (RX_code(RX_pointer) = 160) Then
Rx_frame(Frame_pointer) = RX_code(RX_pointer)
Frame_pointer = Frame_pointer + 1
Header_f = True
Else
End If
End If
'====================================================== Code_str = BinaryConvert(RX_code(RX_pointer))
End If
'====================================================== RX_pointer = RX_pointer + 1
End If
If (RX_pointer > 255) Then
RX_pointer = 0
End If
If (Frame_pointer > 4) Then
Header_f = False
FrmMain.timereadcode.Enabled = True
Frame_pointer = 0
'======================================================'Tinh Fcs
'====================================================== FCSRX = Rx_frame(0) Xor Rx_frame(1)
FCSRX = FCSRX Xor Rx_frame(2)
FCSRX = FCSRX Xor Rx_frame(3)
If (FCSRX = Rx_frame(4)) Then
Complete_F = True
Crc_F = False
Else
Complete_F = True
Crc_F = True
End If
Else
FrmMain.timereadcode.Enabled = True
End If
End Sub
'==========BinaryConvert=============
Public Function BinaryConvert(Number As Integer) As String
Dim Digit As Integer
Dim BinaryForm As String
BinaryForm = ""
Do
Digit = Number Mod 2
If Digit = 0 Then
BinaryForm = "0" + BinaryForm
Else
BinaryForm = "1" + BinaryForm
End If
Number = Number \ 2
Loop Until (Number = 0)
BinaryConvert = BinaryForm
End Function
Public Sub senddata()
'=============================================
'Gui khung Token
'=============================================
'Gui header
Call SendTX(Header)
'Gui dia chi
Call SendTX(Address)
'Gui token
Call SendTX(Command)
'Gui Data
Call SendTX(Data)
'=============================================
'Tinh FCS
'=============================================
FCSTX = Header Xor Address
FCSTX = FCSTX Xor Command
FCSTX = FCSTX Xor Data
'Gui FCS
Call SendTX(FCSTX)
End Sub
TimeReadBuffer
Private Sub TimeReadBuffer_Timer()
TimeReadBuffer.Enabled = False
Call ReadBuffer
End Sub
Timereadcode
Private Sub timereadcode_Timer()
timereadcode.Enabled = False
Call Readcode
End Sub
Timer4
Private Sub Timer4_Timer()
If Ack_good Then
Ack_good = False
If Data_send_F Then
Data_send_F = False
Else
Header = 160
Address = Kit
Command = Data_F
Data = Val(FrmSystemConfig.txtdata1.Text)
Call senddata
Data_send_F = True
FrmMain.timer_ack.Enabled = True
End If
End If
End Sub
Timer3
Private Sub Timer3_Timer()
'=============================================
'Day la doan kiem tra Ack .Neu nhan duoc dung Ack
'thi off kiem tra timoout
'Neu nhu nhan duoc frame tot ma khong dung
'Ack cua kenh vua gui thi cagnh bao dong thoi
'cung off luon timeout
'Kiem tra ACK nhan duoc
'Co Complte_F bao nhan frame tot
If Complete_F Then
Complete_F = False
If Crc_F Then
MsgBox "Crc8 erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Else
If (Rx_frame(1) Kit) Then
MsgBox "Address erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Else
'Sau 6 s ma chua nhan duoc Ack thi canh bao duong truyen
If (Rx_frame(2) Ack_F) Then
MsgBox "Ack erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Else
FrmMain.timer_ack.Enabled = False
Ack_good = True
MsgBox "Nhan duoc ACK"
Rx_header = Rx_frame(0)
Rx_address = Rx_frame(1)
Rx_command = Rx_frame(2)
Rx_data = Rx_frame(3)
Rx_fcs = Rx_frame(4)
End If
End If
End If
Rx_frame(0) = 0
Rx_frame(1) = 0
Rx_frame(2) = 0
Rx_frame(3) = 0
Rx_frame(4) = 0
End If
End Sub
Timer1
Private Sub Timer1_Timer()
Dim Str As String
Str = Left(Demolbl.Caption, 1)
Demolbl.Caption = Mid(Demolbl.Caption, 2, Len(Demolbl.Caption) - 1) & Str
End Sub
Timer_Ack
Private Sub timer_ack_Timer()
MsgBox "Network erro", vbExclamation
FrmMain.timer_ack.Enabled = False
Rx_frame(0) = 0
Rx_frame(1) = 0
Rx_frame(2) = 0
Rx_frame(3) = 0
Rx_frame(4) = 0
End Sub
CmdOpenPort
Private Sub CmdOpenPort_Click()
Call PortOpen
End Sub
CmdImage1
Private Sub CmdImage1_Click()
FrmSystemConfig.Show
FrmCom.Show
End Sub
Timer5
If crc_request Then
'============================================
'Quay phai 1 bit tu FCS sang Data
fcs_c = fcs Mod 2
fcs = Int(fcs / 2)
data_c = data Mod 2
data = Int(data / 2)
command_c = command Mod 2
command = Int(command / 2)
address_c = address Mod 2
address = Int(address / 2)
header_c = header Mod 2
header = Int(header / 2)
If fcs_c Then
data = data + 128
Else
End If
If data_c Then
command = command + 128
Else
End If
If command_c Then
address = address + 128
Else
End If
If address_c Then
header = header + 128
Else
End If
rotate = rotate - 1
If rotate = 0 Then
If header_c Then
header = header Xor 7
crc = header
crc_request = False
Else
crc = hader
crc_request = False
End If
Else
If header_c Then
header = header Xor 7
Else
End If
End If
End If
End Sub
End Sub
2.Thieát keá phaàn cöùng
2.1.Maïch convert.dsn:
Chöùc naêng :
Nhaän döõ lieäu töø maùy tính ,sau ñoù ñieàu cheá FSK vaø göûi ñeán caùc Kit
Moâ taû:
Höôùng phaùt:
Tín hieäu göûi töø maùy tính xuoáng theo chuaån RS232.Ngoõ ra TXD ñöa vaøo IC 73M223 ñieàu cheá FSK göûi ra chaân TXA coù bieân ñoä ñænh ñænh laø 5V vaø caùch ly qua T2.T2 coù 2 ngoõ ra laø TX1 vaø TX2 truyeàn döõ lieäu xuoáng caùc Kit.
Daïng soùng vaøo ra convert.dsn
Start bit
Stop bit
-12V
12V
TXD
TXA
Höôùng thu:
Tín hieäu truyeàn töø caùc Kit trong maïng veà Kit convert daïng FSK ñöôïc ñöa vaøo 2 ngoõ vaøo RX1 ,RX2 cuûa T1 .T1 coù nhieäm vuï caùch ly döõ lieäu nhaän ñöôïc töø ñöôøng truyeàn vôùi Kit convert vaø ñöa tín hieäu vaøo 73M223 ñeå giaûi ñieàu cheá FSK.Döõ lieäu sau khi ñöôïc giaûi ñieàu cheá ñöôïc göûi leân maùy tính .
2.2.Maïch Kit.dsn
Chöùc naêng :
Höôùng thu:
Nhaän döõ lieäu töø maùy tính ñöôïc Kit convert ñieàu cheá FSK vaø caùc Kit trong maïng.Döõ lieäu FSK ñöôïc giaûi ñieàu cheá trôû thaønh tín hieäu nhò phaân .Sau ñoù tín hieäu ñöôïc ñöa vaøo XC95108 ñeå xöû lyù ñoàng boä bit.Keát quaû sau ñoù ñöa veà CPU 89S8252 ñeå xöû lyù ñoàng boä khung , ñoàng boä byte vaø loïc laáy döõ lieäu ñieàu khieån .
Höôùng phaùt:
Göûi caùc khung döõ lieäu veà maùy tính .CPU89S8252 phaùt khung döõ lieäu ñeán 73M223 ñeå ñieàu cheá FSK .Sau ñoù tín hieäu ñieàu cheá truyeàn veà maùy tính qua T1.
Sô ñoà nguyeân lyù
2.2.1.Maïch ñieàu cheá vaø giaûi ñieàu cheá FSK
Sô ñoà nguyeân lyù
Moâ taû:
Höôùng thu:
Maïch giaûi ñieàu cheá FSK laøm nhieäm vuï nhaän tín hieäu FSK ,giaûi ñieàu cheá ñöa ra döõ lieäu daïng nhò phaân 1010..
Tín hieäu FSK ñöa vaøo 2 chaân RX1 vaø RX2.T2 laøm nhieäm vuï caùch ly ñöôøng truyeàn vaø chaân Receive nhaän ñöôïc FSK so vôùi ñaát heä thoáng .
Receive
Daïng tín hieäu FSK taïi chaân Receive
Tín hieäu Receive ñöôïc loïc thoâng daûi baäc 4 Butterworth vôùi caùc giaù trò thích hôïp cuûa C5 ,R12,R14 ñöa vaøo chaân RXF.Tín hieäu FSK coù f =1302Hz cho möùc logic 1 vaø f = 2097Hz cho möùc logic zero .
0
5V
Data_in_1
Daïng tín hieäu giaûi ñieàu cheá chaân Data_in_1
Höôùng phaùt:
Maïch giaûi ñieàu cheá FSK laøm nhieäm vuï nhaän tín hieäu nhò phaân töø CPU 89S8252 ñöa ñeán IC73M223 ñieàu cheá thaønh tín hieäu FSK ñeå phaùt leân ñöôøng truyeàn .
Tín hieäu nhò phaân caàn ñöôïc ñieàu cheá ñöôïc ñöa ñeán chaân TXD cuûa IC 73M223.
Daïng tín hieäu caàn ñöôïc ñieàu cheá chaân TXD
TXD
0
5V
Tín hieäu sau khi ñieàu cheá ñöa ra chaân TXA laø tín hieäu FSK, ñöôïc ñöa vaøo chaân Transmit cuûa T1 qua tuï ngaên DC C4.T1 laøm nhieäm vuï caùch ly tín hieäu FSK vôùi ñöôøng truyeàn vaø truyeàn tín hieäu ñi.
Transmit
Daïng tín hieäu FSK taïi chaân Transmit
2.2.2.Maïch xöû lyù trung taâm
Sô ñoà nguyeân lyù
Moâ taû:
JP1 : Thöïc hieän keát noái khi taûi chöông trình töø maùy tính xuoáng vaø ghi vaøo CPU 89S8252.
SCK :Nhòp clock khi ghi chöông trình
MISO:Göûi traû lôøi töø CPU veà maùy tính
MOSI :Göûi döõ lieäu chöông trình töø maùy tính xuoáng CPU 89S8252
Chaân 16_clk:Taïo xung caáp cho XC95108 thöïc hieän ñoàng boä bit
J1: Giao tieáp ngoaïi vi,nhaän leänh ñieàu khieån
2.2.3.Maïch led hieån thò
Sô ñoà nguyeân lyù
Moâ taû:
Maïch led töông öùng caùc keânh ñieàu khieån
Giaù trò ñieän trôû
R = (Vcc –1.7) / 10 mA = 330
Choïn R = 330 ohm
2.2.4.Maïch xöû lyù ñoàng boä bit
Sô ñoà nguyeân lyù
Moâ taû:
XC95108 nhaän döõ lieäu töø 73M223 xöû lyù ñoàng boä bit,sau ñoù göûi veà CPU
J6:Taûi chöông trình töø maùy tính xuoáng XC95108
16_CLK:Xung clock ñoàng boä bit
RXD:Göûi döõ lieäu veà CPU 89S8252 ñaõ xöû lyù ñoàng boä
DATA_IN:Ngoõ vaøo döõ lieäu chöa xöû lyù ñoàng boä bit
TMS,TDI,TDO,TCK :Caùc chaân laäp trình XC95108
2.2.4.1.Hoaït ñoäng xöû lyù ñoàng boä bit
Khi döõ lieäu truyeàn trong moät heä thoáng maïng raát deã xaûy ra hieän töôïng nhieãu .Vì vaäy vieäc ñoïc bit start xaùc ñònh bit ñaàu tieân cuûa moät byte thöôøng gaëp loãi .Ñeå traùnh hieän töôïng naøy taïi ñaàu thu caàn xöû lyù ñoàng boä bit.
Döõ lieäu sau khi giaûi ñieàu cheá FSK ñöôïc ñöa vaøo maïch xöû lyù ñoàng boä bit.Khi phaùt hieän chuyeån möùc logic töø cao xuoáng thaáp cuûa start bit thì bit start ñöôïc nhaän daïng .Luùc naøy moät boä ñeám 8 xung clock ñöôïc kích hoaït.Sau khi boä ñeám traøn thì döõ lieäu ngoõ vaøo ñöôïc kieåm tra moät laàn nöõa .Neáu laø möùc thaáp thì xaùc nhaän ñaây laø start bit,ngöôïc laïi thì laø do hieän töôïng nhieãu gaây ra vaø maïch vaøo traïng thaùi reset .
Khi xaùc nhaän laø start bit thì maïch kích khôûi boä ñeám 16 xung clock ñeå ñoïc döõ lieäu tuaàn töï vaøo .Cöù nhö vaäy maïch ñoàng boä ñoïc vaøo 10 bit cuûa 1 byte.Khi keát thuùc 1 byte thì maïch xöû lyù ñoàng boä laïi ñöôïc reset ñeå chôø bit start cuûa byte keá.Nhö vaäy toác ñoä baud laáy maãu döõ lieäu töø maùy tính göûi xuoáng gaáp 16 laàn toác ñoä baud 1200.
0
5V
Trung taâm bit start
Bit start 7 bit P Bit stop
Hình minh hoïa hoaït ñoäng tìm start bit
2.2.4.2.Sô ñoà macro maïch xöû lyù ñoàng boä bit
Maïch xöû lyù ñoàng boä bit ñöôïc thieát keá baèng ngoân ngöõ VHDL treân phaàn meàm Project Manager cuûa haõng Xillinx ñöôïc chia thaønh 8 macro.Moãi macro coù chöùc naêng rieâng .
2.2.4.2.1.Macro Detect start
Data_in :Ngoõ vaøo döõ lieäu chöa ñoàng boä bit
Reset_Detect_Start:Ngoõ vaøo
Detect_Start:Ngoõ ra
Chöùc naêng : Khi xuaát hieän start bit thì macro phaùt hieän taïo möùc logic cao ôû ngoõ ra Detect_Start ñoàng thôøi reset macro.
------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
entity sync is
port (
Data_in: in STD_LOGIC;
Detect_start: out STD_LOGIC;
Reset_Detect_start: in STD_LOGIC
);
end sync;
architecture sync_arch of sync is
begin
if Reset_Detect_start ='0'then
Detect_start <='0';
else
if data_in ='0' then
Detect_start <='1';
else
end if;
end if ;
end sync_arch;
------------------------------------------------------------------------------
2.2.4.2.2.Macro Count
CE :Ngoõ vaøo
CLK:Ngoõ vaøo
LOAD:Ngoõ vaøo
RESET:Ngoõ vaøo
Q0-Q3:Ngoõ ra
Chöùc naêng : Sau khi macro Detect_Start phaùt hieän start bit thì macro Count ñeám 8 xung clock ñeå laáy möùc logic trung taâm cuûa start bit.
------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
entity count is
port (
CE: in STD_LOGIC;
CLK: in STD_LOGIC;
LOAD: in STD_LOGIC;
RESET: in STD_LOGIC;
Q: out STD_LOGIC_VECTOR (0 to 3)
);
end count;
architecture count_arch of count is
signal COUNT : std_logic_vector (3 downto 0);
begin
process (CLK, RESET)
begin
if RESET='0' then
COUNT <= 0;
elsif CLK='1' and CLK'event then
if LOAD='0' then
COUNT <= '0';
else
if CE='1' then
COUNT <= COUNT + 1;
Q <= COUNT;
end if;
end if;
end if;
end if;
end process;
end count_arch;
2.2.4.2.3.Macro Create_pulse
In1: Ngoõ vaøo
In2:Ngoõ vaøo
In3:Ngoõ vaøo
In4:Ngoõ vaøo
Out:Ngoõ ra
Chöùc naêng : Sau khi macro Count ñeám ñuû 8 xung thì macro Create_pulse taïo xung ñeå ñeå ñoïc laáy möùc logic trung taâm cuûa start bit.
------------------------------------------------------------------------------
--Chöông trình nguoàn taïo moät xung caïnh leân khi ñaõ ñeám ñöôïc 16 xung töø khi phaùt hieän ñöôïc start bit
library IEEE;
use IEEE.std_logic_1164.all;
entity Create_pulse is
port (
In1: in STD_LOGIC;
In2: in STD_LOGIC;
In3: in STD_LOGIC;
In4: in STD_LOGIC;
Out: out STD_LOGIC
);
end Create_pulse;
architecture Create_pulse_arch of Create_pulse is
begin
Out <= In1 and In2 and In3 and In4
end Create_pulse_arch;
2.2.4.2.4.Macro Detect_false_start
CLK: Ngoõ vaøo
RESET:Ngoõ vaøo
DATA_IN:Ngoõ vaøo
REFRESH:Ngoõ ra
Chöùc naêng :.Macro Create_pulse taïo xung ñeå ñoïc laáy möùc logic trung taâm cuûa start bit .Trong tröôøng hôïp möùc logic ñoïc ñöôïc khoâng phaûi laø möùc thaáp thì macro Detect_false_start seõ reset maïch ñeå doø tìm start bit môùi.Neáu möùc logic ñoïc ñöôïc laø möùc cao thì macro Detect_false_start cho pheùp caùc hoaït ñoäng keá tieáp.
------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
entity detect_false_start is
port (
CLK: in STD_LOGIC;
RESET: in STD_LOGIC;
Data_in: in STD_LOGIC;
REFRESH: out STD_LOGIC
);
end detect_fale_start;
architecture detect_fale_start_arch of detect_fale_start is
begin
process (CLK)
begin
if CLK'event and CLK='1' then
if RESET='0' then
REFRESH <= '0';
else
REFRESH <= Data_in;
end if;
end if;
end process;
end detect_fale_start_arch;
2.2.4.2.5.Macro Active_reset
In1: Ngoõ vaøo
In2:Ngoõ vaøo
Out1:Ngoõ ra
Out2:Ngoõ ra
Chöùc naêng :.Khi phaùt hieän loãi trong vieäc doø tìm start bit thì macro Active_reset kích hoaït reset maïch .
------------------------------------------------------------------------------
--Chöông trình nguoàn kích hoaït reset khi nhaän start bit loãi
library IEEE;
use IEEE.std_logic_1164.all;
entity active_reset is
port (
In1: in STD_LOGIC;
In2: in STD_LOGIC;
Out1: out STD_LOGIC;
Out2: out STD_LOGIC
);
end active_reset;
architecture active_reset_arch of active_reset is
begin
Out2 <= In1 xor '1';
Out1 <= In2 and Out2;
end active_reset_arch;
2.2.4.2.6.Macro Enable_16
In1: Ngoõ vaøo
In2:Ngoõ vaøo
CLK:Ngoõ vaøo
Out1:Ngoõ ra
Out2:Ngoõ ra
Chöùc naêng :.Cho pheùp ñeám 16 xung ñeå ñoïc möùc logic döõ lieäu khi vieäc doø tìm start bit laø chính xaùc.
------------------------------------------------------------------------------
--Chöông trình nguoàn khi nhaän ñuùng start bit
library IEEE;
use IEEE.std_logic_1164.all;
entity enable_16 is
port (
In1: in STD_LOGIC;
In2: in STD_LOGIC;
CLK: in STD_LOGIC;
Out1: out STD_LOGIC;
Out2: out STD_LOGIC
);
end enable_16;
architecture enable_16_arch of enable_16 is
begin
process (CLK)
begin
if CLK'event and CLK='1' then
if In1 then
if In2 then
Out1 <= '1';
Out2 <= Not Out1
else
Out1 <= '0';
Out2 <= Not Out1
else
Out1 <= '0';
Out2 <= Not Out1
else
end if;
end if;
end if;
end process;
end enable_16_arch;
------------------------------------------------------------------------------
2.2.4.2.7.Macro Select_clock
In1: Ngoõ vaøo
In2:Ngoõ vaøo
Out:Ngoõ ra
Chöùc naêng :.Laø ngoõ taïo xung clock ñoïc laáy döõ lieäu ñaõ ñöôïc ñoàng boä bit. Ngoõ taïo xung naøy chæ coù khi vieäc doø tìm start bit laø chính xaùc .
------------------------------------------------------------------------------
--Chöông trình nguoàn choïn xung clock döõ lieäu
library IEEE;
use IEEE.std_logic_1164.all;
entity Select_clock is
port (
In1: in STD_LOGIC;
In2: in STD_LOGIC;
Out: out STD_LOGIC
end Select_clock;
architecture Select_clock_arch of Select_clock is
begin
Out <= In1 or In2
end Select_clock_arch;
2.2.4.2.8.Macro 10bit
In1: Ngoõ vaøo
In2:Ngoõ vaøo
Out:Ngoõ ra
Chöùc naêng :.Sau khi ñoïc laáy 10 bit cuûa 1 byte döõ lieäu, macro 10bit seõ reset maïch ñeå doø tìm start bit môùi.
------------------------------------------------------------------------------
--Chöông trình nguoàn reset maïch khi nhaän ñuû 10 bit döõ lieäu
library IEEE;
use IEEE.std_logic_1164.all;
entity 10bit is
port (
In1: in STD_LOGIC;
In2: in STD_LOGIC;
Out: out STD_LOGIC
);
end 10bit;
architecture 10bit_arch of 10bit is
begin
Out <= In1 nand In2
end 10bit_arch;
Chöông trình xöû lyù ñoàng boä ñöôïc bieân dòch thaønh file machdong.jed.
3.Chöông trình
3.1.Caáu truùc cuûa maïng thieát keá
Maïng thieát keá ñöôïc toå chöùc thaønh 3 lôùp
Lôùp öùng duïng
Lôùp lieân keát
Lôùp vaät lyù
Lôùp öùng duïng : Taïo söï thaân thieän giao tieáp vôùi ngöôøi söû duïng .Lôùp naøy cho pheùp ngöôøi söû duïng quan saùt vaø ñieàu khieån moät caùch ñôn giaûn baèng caùc nuùt leänh vaø baûng keát quaû .
Lôùp lieân keát : Xaây döïng khung döõ lieäu giao tieáp vôùi lôùp vaät lyù
Lôùp vaät lyù : Phaàn cöùng hoã trôï vieäc truyeàn döõ lieäu
Lôùp öùng duïng
Lôùp lieân keát
Lôùp vaät lyù
Data
Header
Address Lôùp lieân keát
Command Lôùp lieân keát
Data
FCS
3.2.Caáu truùc khung lôùp döõ lieäu
Döõ lieäu ñöôïc toå chöùc theo ñònh daïng khung coá ñònh 5 byte .
Header
Address
Command
Data
FCS
1 byte
1 byte
1 byte
1 byte
1 byte
Header: Chieàu daøi 1 byte ,chæ ñònh ñaàu khung coù giaù trò A0 hex
Address : Ñòa chæ coù giaù trò töø 00h -> FFh , chieàu daøi 1 byte cho pheùp maïng keát noái vôùi 256 kit xöû lyù
Command : Chieàu daøi 1 byte, bao goàm caùc leänh sau :
INIT : 0D hex, muïc ñích laø ñeå maùy tính nhaän bieát kit naøo ñang ñöôïc keát noái, ñòa chæ laø bao nhieâu. Khi maùy tính truyeàn khung döõ lieäu coù maõ leänh laø INIT, neáu kit vi xöû lyù naøo coù ñòa chæ truøng vôùi ñòa chæ trong khung döõ lieäu maø maùy tính ñaõ göûi, thì kit xöû lyù seõ göûi khung döõ lieäu ACK leân maùy tính. Nhö vaäy, maùy tính bieát ñöôïc kit naøo ñang keát noái vaø caû ñòa chæ cuûa kit ñoù. Heä thoáng ban ñaàu khi hoaït ñoäng, maùy tính seõ laàn löôït göûi caùc khung döõ lieäu INIT, trong ñoù ñòa chæ taêng daàn töø 00h -> FFh.Do vaäy cho pheùp maùy tính seõ nhaän bieát ñöôïc taát caû kit naøo ñang keát noái.
SETADDR : 0E hex, muïc ñích laø thieát laäp ñòa chæ cho kit môùi ñöôïc keát noái. Khi moät kit ñöôïc keát noái, sau khi maùy tính nhaän bieát coù kit môùi ñöôïc keát noái, maùy tính seõ göûi khung döõ lieäu SETADDR trong ñoù coù chöùa ñòa chæ môùi seõ thieát laäp cho kit.
TOKEN : 0C hex, maùy tính hay kit maø giöõ TOKEN naøy thì ñöôïc quyeàn truyeàn DATA cho caùc thieát bò khaùc. Ban ñaàu khi heä thoáng môùi hoaït ñoäng, maùy tính ñöôïc giöõ TOKEN. Sau khi maùy tính ñaõ thöïc hieän xong moät soá coâng vieäc nhö kieåm tra keát noái, thieát laäp ñòa chæ, truyeàn xong döõ lieäu xuoáng kit … thì maùy tính truyeàn TOKEN cho caùc kit. Kit seõ traû lôøi baèng ACK. Kit naøo giöõ TOKEN thì seõ ñöôïc quyeàn phaùt döõ lieäu. Sau khi phaùt döõ lieäu xong, kit göûi TOKEN veà maùy tính. Maùy tính laïi truyeàn tieáp TOKEN cho caùc kit khaùc.
ACK : 0Ah, khung ACK ñeå baét tay giöõa maùy tính vaø Kit.
NMD :0Bh, sau moät khoaûng thôøi gian nhaát ñònh, maùy tính seõ göûi khung NMD xuoáng caùc kit. Neáu coù moät kit môùi naøo vöøa ñöôïc keát noái, kit ñoù khi nhaän ñöôïc Frame naøy seõ traû lôøi vaø maùy tính nhaän bieát ñöôïc coù kit môùi ñöôïc keát noái.
DATA :05h, muïc ñích baùo laø khung naøy coù döõ lieäu.
Nhö vaäy coù 5 khung :
Khung INIT
Khung SETADDR
Khung TOKEN
Khung ACK
Khung NMD
Data:Döõ lieäu ñieàu khieån töø maùy tính göûi xuoáng caùc Kit hoaëc döõ lieäu töø caùc Kit göûi leân maùy tính
FCS:Kieåm tra loãi
Giöõa maùy tính vaø caùc Kit hay giöõa caùc Kit vôùi nhau coù moät chöông trình bieân dòch döõ lieäu .Do ñoù caáu truùc khung naøy cho pheùp môû roäng chöông trình vaø hoaøn toaøn khoâng phuï thuoäc vaøo ñoä daøi döõ lieäu .
FCS
Data
Command Lôùp lieân keát
Address
Header
Header
Address
Command Lôùp lieân keát
Data
FCS
Trình bieân dòch döõ lieäu
Khung döõ lieäu phaùt
Khung döõ lieäu thu
3.2.1.Trình bieân dòch döõ lieäu
Trình bieân dòch laø moät baûng thöïc hieän thao taùc leänh ñöôïc qui ñònh tröôùc.Töông öùng vôùi moät giaù trò cuûa byte döõ lieäu thì trình bieân dòch coù thao taùc töông öùng.Do vaäy vôùi caáu truùc truyeàn khung döõ lieäu 5 byte coá ñònh thì trình bieân dòch hoaït ñoäng raát hieäu quaû ,coù theå môû roäng trình bieân dòch moät caùch meàm deûo.
Hoaït ñoäng 1
Hoaït ñoäng 2
Hoaït ñoäng 3
Hoaït ñoäng 4
Hoaït ñoäng n
Data
Trình bieân dòch
01h
02h
03h
3.3.Caùc thuû tuïc truyeàn döõ lieäu
3.3.1.Thuû tuïc khôûi ñoäng heä thoáng
Khi khôûi ñoäng heä thoáng, maùy tính truyeàn khung INIT coù ñòa chæ taêng daàn töø 00 ->FF hex. Neáu kit vi xöû lyù naøo coù ñòa chæ truøng vôùi ñòa chæ trong Frame maø maùy tính ñaõ göûi, thì Kit xöû lyù seõ göûi khung ACK leân maùy tính. Nhö vaäy, maùy tính bieát ñöôïc kit naøo ñang keát noái vaø caû ñòa chæ cuûa kit ñoù. Do vaäy cho pheùp maùy tính seõ nhaän bieát ñöôïc taát caû kit naøo ñang keát noái.
FCS
Data
INT
Address
Header
Header
Address
ACK
Data
FCS
Phaùt
Thu
3.3.2.Thuû tuïc ñaêng nhaäp kit môùi
Sau moät khoaûng thôøi gian nhaát ñònh, maùy tính seõ göûi khung NMD xuoáng caùc kit. Neáu coù moät kit môùi naøo vöøa ñöôïc keát noái, kit ñoù khi nhaän ñöôïc khung naøy seõ traû lôøi vaø maùy tính nhaän bieát ñöôïc coù kit môùi ñöôïc keát noái vaø maùy tính seõ ñònh ñòa chæ cho Kit môùi naøy.
FCS
Data
NMD
Address
Header
Header
Address
ACK
Data
FCS
Phaùt
Thu
3.3.3.Thuû tuïc chuyeån Token
Ban ñaàu khi heä thoáng môùi hoaït ñoäng, maùy tính ñöôïc giöõ Token. Sau khi maùy tính ñaõ thöïc hieän xong moät soá coâng vieäc nhö kieåm tra keát noái, thieát laäp ñòa chæ, truyeàn xong döõ lieäu xuoáng kit … thì maùy tính truyeàn khung Token cho caùc kit. Kit seõ traû lôøi baèng khung ACK. Kit naøo giöõ TOKEN thì seõ ñöôïc quyeàn phaùt döõ lieäu. Sau khi phaùt döõ lieäu xong, kit göûi TOKEN veà maùy tính. Maùy tính laïi truyeàn tieáp TOKEN cho caùc kit khaùc. . .
FCS
Data
TOKEN
Address
Header
Header
Address
ACK
Data
FCS
Phaùt
Thu
3.3.4.Thuû tuïc truyeàn döõ lieäu
Khi Kit naøo giöõ Token, Kit ñoù coù quyeàn truyeàn döõ lieäu . Kit nhaän seõ traû lôøi baèng khung ACK.
FCS
Data
DATA
Address
Header
Header
Address
ACK
Data
FCS
Phaùt
Thu
3.3.5.Thuû tuïc caáp ñòa chæ
Sau khi xaùc nhaän ñaêng nhaäp moä kit môùi,maùy tính seõ göûi khung döõ lieäu SETADDR trong ñoù coù chöùa ñòa chæ môùi seõ thieát laäp cho Kit.
FCS
Data
SETADD
Address
Header
Header
Address
ACK
Data
FCS
Phaùt
Thu
3.4.Löu ñoà giaûi thuaät
Chöông trình chính
Khôûi ñoäng ngaét
Xoùa oâ nhôù
Xöû lyù döõ lieäu nhaän ñöôïc
Chuaån bò döõ lieäu phaùt
Xöû lyù bieân dòch döõ lieäu
Phaùt döõ lieäu
Chöông trình chính
Khoâng
E
Coù
D
C
B
A
Khoâng
Khoâng
Gaùn ñoä daøi khung baèng 0
Gaùn ñoä daøi khung baèng 5
Coù
Kieåm tra
ñaàu khung ?
Coù
Ñoä daøi khung =0?
Xoùa côø ngaét
Caát döõ lieäu
Coù
Khoâng
Löu giöõ caùc con troû
Vaø caùc thanh ghi
Thoaùt ngaét
Phuïc hoài caùc con troû
Vaø caùc thanh ghi
Ngaét noái tieáp ?
Cho pheùp phaùt
Chöông trình ngaét
Ñoä daøi khung =0?
Giaûm ñoä daøi khung
1 ñôn vò
Tính FCS
Tính FCS K
A
Ñoä daøi khung =0?
Coù
C
Khoâng
D
E
Löu döõ lieäu
Taêng con troû döõ lieäu
B
So saùnh FCS vaødöõ lieäu thöù 5
Coù
Döïng côø baùo nhaän toát
Tính FCS K
Döïng côø baùo nhaän khoâng toát
Traû con troû döõ lieäu veà vò trí ban ñaàu
Tính FCS K
Chöông trình phuïc vuï ngaét
Thoaùt ngaét
3.4.1.Löu ñoà thuû tuïc xöû lyù döõ lieäu nhaän ñöôïc
Khi nhaän khung döõ lieäu töø maùy tính, thuû tuïc luoân phaûi ñaûm baûo raèng keát quaû tính CRC khoâng vi phaïm loãi .Khi ñoù thuû tuïc xeùt xem keát quaû nhaän ñöôïc laø yeâu caàu gì töø maùy tính .
Vieäc xaùc ñònh thuoäc tính cuûa khung döõ lieäu do byte thöù 3 cuûa khung quyeát ñònh Ñaëc tính khung nhö sau:
ACK:Yeâu caàu baét tay giöõa maùy tính vaø caùc Kit coù trong maïng
NMD:Sau moät khoaûng thôøi gian nhaát ñònh, maùy tính seõ göûi khung NMD xuoáng caùc Kit. Neáu coù moät Kit môùi naøo vöøa ñöôïc keát noái, Kit ñoù khi nhaän ñöôïc khung naøy seõ traû lôøi vaø maùy tính nhaän bieát ñöôïc coù kit môùi ñöôïc keát noái.
TOKEN: Maùy tính hay Kit maø giöõ TOKEN thì ñöôïc quyeàn truyeàn döõ lieäu cho caùc thieát bò khaùc.
INT: Khi maùy tính truyeàn khung INIT, neáu kit vi xöû lyù naøo coù ñòa chæ truøng vôùi ñòa chæ trong khung maø maùy tính ñaõ göûi, thì Kit seõ göûi ACK leân maùy tính. Nhö vaäy, maùy tính bieát ñöôïc Kit naøo ñang keát noái vaø caû ñòa chæ cuûa Kit ñoù.
SETADD: Thieát laäp ñòa chæ cho Kit môùi ñöôïc keát noái. Khi moät Kit ñöôïc keát noái, sau khi maùy tính nhaän bieát coù Kit môùi ñöôïc keát noái, maùy tính seõ göûi SETADDR trong ñoù coù chöùa ñòa chæ môùi seõ thieát laäp cho Kit.
DATA:Khung baùo coù döõ lieäu
Thuû tuïc xöû lyù döõ lieäu nhaän ñöôïc
Keát quaû nhaän toát khoâng
Khoâng
Thoaùt thuû tuïc
Coù
Tieáp tuïc
Xöû lyù khung ACK
Xöû lyù khung DATA
Tieáp tuïc
Truy caäp döõ lieäu taïi byte thöù 3 qua con troû vaø nhaûy ñeán ñaùp öùng töông öùng
Thoaùt thuû tuïc
Xöû lyù khung NMD
Xöû lyù khung TOKEN
Xöû lyù khung INIT
Xöû lyù khung SETADD
Thuû tuïc xöû lyù döõ lieäu nhaän ñöôïc
3.4.1.1.Ñaùp öùng xöû lyù khung ACK
Khi xaùc nhaän laø khung ACK , ñaùp öùng kieåm tra ñòa chæ vaø môû côø ACK ñeå chuaån bò traû lôøi maùy tính ,caäp nhaät con troû .Trong tröôøng hôïp ñòa chæ sai ñaùp öùng caäp nhaät con troû vaø thoaùt .
Xöû lyù khung ACK
Ñuùng ñòa chæ
Khoâng
Thoaùt thuû tuïc
Coù
Môû côø ACK
3.4.1.2.Ñaùp öùng xöû lyù khung NMD
Khi xaùc nhaän laø khung NMD ,ñaùp öùng kieåm tra ñòa chæ vaø môû côø ACK ñeå chuaån bò traû lôøi maùy tính ,caäp nhaät con troû .Trong tröôøng hôïp ñòa chæ sai ñaùp öùng caäp nhaät con troû vaø thoaùt .
Xöû lyù khung NMD
Ñuùng ñòa chæ
Khoâng
Thoaùt thuû tuïc
Coù
Môû côø ACK
3.4.1.3.Ñaùp öùng xöû lyù khung TOKEN
Khi xaùc nhaän laø khung TOKEN ,ñaùp öùng kieåm tra ñòa chæ vaø môû côø ACK ñeå chuaån bò traû lôøi maùy tính ,caäp nhaät con troû .
Xöû lyù khung TOKEN
Ñuùng ñòa chæ
Khoâng
Thoaùt thuû tuïc
Coù
Môû côø ACK
Môû côø TOKEN
3.4.1.4.Ñaùp öùng xöû lyù khung INIT
Khi xaùc nhaän laø khung INIT , ñaùp öùng kieåm tra ñòa chæ vaø môû côø ACK ñeå chuaån bò traû lôøi maùy tính ,caäp nhaät con troû .Trong tröôøng hôïp ñòa chæ sai ñaùp öùng caäp nhaät con troû vaø thoaùt .
Xöû lyù khung INIT
Ñuùng ñòa chæ
Khoâng
Thoaùt thuû tuïc
Coù
Môû côø ACK
3.4.1.5.Ñaùp öùng xöû lyù khung SETADD
Khi xaùc nhaän laø khung SETADD , ñaùp öùng kieåm tra ñòa chæ vaø môû côø ACK ñeå chuaån bò traû lôøi maùy tính ,caäp nhaät con troû vaø nhaän ñòa chæ môùi .Trong tröôøng hôïp ñòa chæ sai ñaùp öùng caäp nhaät con troû vaø thoaùt .
Xöû lyù khung SETADD
Ñuùng ñòa chæ
Khoâng
Thoaùt thuû tuïc
Coù
Môû côø ACK
Caäp nhaät ñòa chæ môùi
3.4.1.6.Ñaùp öùng xöû lyù khung DATA
Khi xaùc nhaän laø khung DATA , ñaùp öùng kieåm tra ñòa chæ vaø môû côø ACK ñeå chuaån bò traû lôøi maùy tính ,caäp nhaät con troû vaø nhaän döõ lieäu .Trong tröôøng hôïp ñòa chæ sai ñaùp öùng caäp nhaät con troû vaø thoaùt .
Xöû lyù khung DATA
Ñuùng ñòa chæ
Khoâng
Thoaùt thuû tuïc
Coù
Môû côø ACK
Caäp nhaät döõ lieäu
Chöông trình :
;======================================================;Chuong trinh xu ly data nhan duoc .Dieu kien de goi duoc chuong trinh
;nay la TF_RESULT =1
;Trong truong data nhan duoc thi co 5 byte .Tuy nhien ;khong biet
;la byte thu 3 la lenh nao trong 6 lenh sau day
ACK EQU 10
NMD EQU 11
TOKEN EQU 12
INT EQU 13
SETADD EQU 14
DATA EQU 15
;====================================================== XULYDATA_RECEIVE:
MOV A,TF_RESULT
CJNE A,#1 ,EXIT_XULYDATA_RECEIVE_1
;======================================================
;R0 tro toi byte 3 de doc xem Command gi
; Header - Address - "Command" - Data -FCS
;======================================================
MOV R0,RDT_PNT
INC R0
INC R0
MOV A,@R0
MOV B,#4
MUL AB
MOV DPTR,#EXIT_XULYDATA_RECEIVE_1
PUSH DPL
PUSH DPH
MOV DPTR,#JUMP0
JMP @A+DPTR
EXIT_XULYDATA_RECEIVE_1:
RET
JUMP0:
LJMP COMMAND_ACK
RET
LJMP COMMAND_NMD
RET
LJMP COMMAND_TOKEN
RET
LJMP COMMAND_INT
RET
LJMP COMMAND_SETADD
RET
LJMP COMMAND_DATA
RET
;======================================================
;Day la truong hop nhan Command_Ack
;======================================================
COMMAND_ACK:
;======================================================
;Tro con tro toi byte thu 2 de lay address
; Header - Address - "Command" - Data -FCS
;======================================================
MOV R0,RDT_PNT
INC R0
MOV A,@R0
CJNE A,ID,EXIT_COMMAND_ACK
SETB FLAG_ACK
EXIT_COMMAND_ACK:
CALL UPDATE_POINTER
RET
;======================================================
;Day la truong hop nhan Command_NMD
;======================================================
COMMAND_NMD:
JB INSTALL_ED,EXIT_COMMAND_NMD
;======================================================
;FLAG_ACK la co dung de chi thi phai tra loi ACK
;Khi kiem tra thay co nay =1 thi phai tra loi ACK
;======================================================
SETB FLAG_ACK
EXIT_COMMAND_NMD:
CALL UPDATE_POINTER
RET
;======================================================
;Day la truong hop nhan Command_TOKEN
;======================================================
COMMAND_TOKEN:
;======================================================
;Tro con tro toi byte thu 2 de lay address
; Header - Address - "Command" - Data -FCS
;======================================================
MOV R0,RDT_PNT
INC R0
MOV A,@R0
CJNE A,ID,EXIT_COMMAND_TOKEN
;======================================================
;Co TOKEN la co uu tien phat .Khi Kit nao giu co nay nay thi se
;duoc uu tien phat.Nhung luu y sau khi chuyen co uu tien phat
;sang kit khac thi phai xoa co nay
;======================================================
SETB TOKEN
SETB FLAG_ACK
EXIT_COMMAND_TOKEN:
CALL UPDATE_POINTER
RET
;======================================================
;Day la truong hop nhan Command_INT
;======================================================
COMMAND_INT:
;======================================================
;Tro con tro toi byte thu 2 de lay address
; Header - Address - "Command" - Data -FCS
;======================================================
MOV R0,RDT_PNT
INC R0
MOV A,@R0
CJNE A,ID,EXIT_COMMAND_INT
SETB FLAG_ACK
EXIT_COMMAND_INT:
CALL UPDATE_POINTER
RET
;======================================================
;Day la truong hop nhan Command_SETADD
;======================================================
COMMAND_SETADD:
;======================================================
;Tro con tro toi byte thu 3 de lay address
; Header - Address - "Command" - Data -FCS
;======================================================
MOV R0,RDT_PNT
INC R0
INC R0
INC R0
MOV A,@R0
MOV ID,A
SETB FLAG_ACK
CALL UPDATE_POINTER
RET
;======================================================
;Day la truong hop nhan Command_DATA
;======================================================
COMMAND_DATA:
;======================================================
;Tro con tro toi byte thu 2 de lay address
; Header - Address - "Command" - Data -FCS
;======================================================
MOV R0,RDT_PNT
INC R0
INC R0
MOV A,@R0
CJNE A,ID,EXIT_COMMAND_DATA
MOV R0,RDT_PNT
INC R0
INC R0
INC R0
MOV A,@R0
MOV DATA_BYTE,A
SETB FLAG_ACK
EXIT_COMMAND_DATA:
CALL UPDATE_POINTER
RET
3.4.2.Löu ñoà thuû tuïc chuaån bò döõ lieäu phaùt
Khi coù leänh yeâu caàu ñieàu khieån töø Kit hoaëc göûi ACK veà maùy tính thì thuû tuïc chuaån bò döõ lieäu phaùt ñöôïc goïi .Thuû tuïc xaây döïng khung döõ lieäu töø thoâng tin laø byte ACK hoaëc byte döõ lieäu ñieàu khieån .
FCS
Data
Command
Address
Header
Address
Header
Data
Command
Command
Address
Header
Address
Header
Header
Truïc thôøi gian thieát keá khung döõ lieäu
Ñoä daøi khung =0?
Coù
Gaùn ñoä daøi khung baèng 5
Gaùn ñoä daøi khung baèng 0
Khoâng
A
B
Coù
E
Khoâng
Thuû tuïc chuaån bò döõ lieäu phaùt
Coù yeâu caàu ñieàu khieån
Thoaùt thuû tuïc
Coù
Traû lôøi ACK
Khoâng
Khoâng
Tieáp tuïc
Coù
Coù
Tieáp tuïc
Gaùn Header vaøo khung
Gaùn ñòa chæ göûi ñi
Yeâu caàu traû lôøi ACK ?
Yeâu caàu göûi döõ lieäu?
Gaùn ACK traû lôøi
Gaùn côø döõ lieäu
Caäp nhaät byte döõ liieäu
Coù
Coù
Khoângù
Tình FCS
Xoùa côø ACK
Xoùa côø döõ lieäu
Caáp phaùt con troû ñích
Thoaùt thuû tuïc
Khoângù
3.4.2.1.Löu ñoà tính FCS
Höôùng phaùt:
Chuoãi döõ lieäu tính FCS laø 4 byte :
Header
Address
Command
Data
Keát quaû tính FCS ñöôïc chöùa trong byte thöù 5 cuûa khung döõ lieäu
Ña thöùc sinh :100000111 .Tính CRC-8
100000111
1111000000011101
0000110001001
FCS=00111111B
Tính CRC-8 coù chuoãi döõ lieäu sau vôùi ña thöùc sinh 100000111
11110000 11010000 10101010 10000000 00000000
10000011 1
01110011 01
8 bit dòch
1000001 11
0110010 100
100000 111
010010 0111
10000 0111
00010 0000000
10 0000111
00 00001110 10101
1000 00111
0110 100100
100 000111
010 1000111
10 0000111
00 10000000 1
10000011 1
00000011 0000000
10 0000111
01 00001110
1 00000111
0 00001001 00000
1000 00111
0001 00111000
FCS
Data
Command
Address
Header
FCS chöùa keát quaû CRC-8
1 00000111
0 00111111
11110000
11010000
10101010
10000000
00111111
Phaùt
FCS
Chuoãi döõ lieäu phaùt coù FCS =00111111B
Höôùng thu:
Chuoãi döõ lieäu tính FCS laø 5 byte :
Header
Address
Command
Data
FCS
Keát quaû tính FCS coù giaù trò laø khoâng thì vieäc truyeàn khoâng bò loãi .
Vôùi chuoãi döõ lieäu treân ta coù khung döõ lieäu phía thu nhö sau :
ÔÛ höôùng thu giaûi thuaät tính FCS khoâng thay ñoåi .Tuy nhieân 8 bit dòch ôû byte thöù 5 luùc naøy chính laø giaù trò FCS ôû ñaàu phaùt
Ña thöùc sinh :100000111 .Tính CRC-8
11110000
11010000
10101010
10000000
00111111
Thu
Keát quaû tính phaàn dö baèng 0.Truyeàn khoâng bò loãi
Khoâng
Xoaù côø C
Quay traùi côø C byte FCS
Quay traùi côø C byte data
Quay traùi côø C byte Command
Quay traùi côø C byte Address
Quay traùi côø C byte Header
Giaûm soá laàn quay
Soá laàn quay baèng 0 ?
Coù
Gaùn soá laàn quay traùi côø C laø 32
Côø C baèng 1?
Côø C baèng 1?
Xor byte Header vaø 07h
Caäp nhaät byte Header
Thoaùt
Khoâng
Khoâng
Coù
Xor byte Header vaø 07h
Gaùn Header vaøo byte FCS
Gaùn Header
vaøo byte FCS
Coù
Tính FCS
Chöông trình :
;======================================================
;Tinh CRC-8
;X^8 + X^2 + X^1 + 1
;Ti1nh CRC-8 cho 4 byte :
;1/Header
;2/Address
;3/Command
;4/Data
;Ket qua CRC-8 duoc luu vao byte FCS
;Truong du lieu can tinh la 40 byte
;Duoc sap xep nhu sau
;Header-Addree-Command-Data-FCS
;Ngo vao tinh CRC co 4 byte Header-Addree-Command-Data
;la cac gia tri nhan duoc
;Gia tri FCS la zero
;Ngo ra CRC-8 duoc chua trong FCS
;R0 =32 so lan dich
;======================================================
LOOPCRC:
CLR C
MOV A,34H
RLC A
MOV 34H,A
MOV A,33H
RLC A
MOV 33H,A
MOV A,32H
RLC A
MOV 32H,A
MOV A,31H
RLC A
MOV 31H,A
MOV A,30H
RLC A
MOV 30H,A
DJNZ R0,UNCRC
JC LASTCRC
RESULT_CRC:
MOV CRC,30H
MOV 34H,CRC
RET
UNCRC:
JNC LOOPCRC
CLR C
MOV A,30H
XRL A,#07H
MOV 30H,A
SJMP LOOPCRC
LASTCRC:
CLR C
MOV A,30H
XRL A,#07H
MOV 30H,A
SJMP RESULT_CRC
3.4.3.Löu ñoà thuû tuïc phaùt döõ lieäu
Thuû tuïc phaùt döõ lieäu söû duïng 2 con troû ñeå chæ boä ñeäm ñang chöùa döõ lieäu .
Con troû nguoàn giöõ vò trí byte döõ lieäu phaùt sau cuøng
Con troû ñích ñöôïc caáp phaùt qua thuû tuïc chuaån bò döõ lieäu phaùt .Con troû ñích giöõ vò trí cao nhaát cuûa döõ lieäu phaùt
Thuû tuïc ñöôïc goïi khi Kit xöû lyù ñöôïc trao TOKEN .
Thuû tuïc phaùt döõ lieäu
TOKEN?
Coù
Con troû ñích ñöôïc caáp phaùt ?
Phaùt
Thoaùt
Khoâng
Khoâng
PHAT:
MOV A,MSI_PNT
CJNE A,MSO_PNT,PHAT1
JNB RX_INHIBIT,EXIT_PHAT
CLR RX_INHIBIT
MOV MSI_PNT,#2BH
MOV MSO_PNT,#2BH
MOV RI_PNT,#30H
MOV RDT_PNT,#30H
SJMP EXIT_PHAT
PHAT1:
JNB FL_SCOM,EXIT_PHAT
CLR FL_SCOM
MOV R1,MSI_PNT
MOV SBUF,@R1
INC R1
MOV MSI_PNT,R1
EXIT_PHAT:
RET
KEÁT QUAÛ VAØ HÖÔÙNG PHAÙT TRIEÅN
1.Caùc vaán ñeà ñaõ thöïc hieän trong luaän aùn:
Thieát keá vaø thi coâng hoaøn thaønh maïch ñieàu cheá ,giaûi ñieàu cheá FSK trao ñoåi döõ lieäu giöõa maùy tính vaø caùc Kit trong maïng
Thieát keá vaø thi coâng hoaøn thaønh Kit, trong ñoù thöïc hieän ñieàu cheá giaûi ñieàu cheá FSK ;xöû lyù ñoàng boä bit duøng FPGA ;ñoàng boä khung döõ lieäu.
Tìm hieåu vaø xöû duïng CPU 89S8252 phuïc vuï nhu caàu môû roäng .
Vieát chöông trình giao tieáp vôùi caùc Kit trong maïng .Giao tieáp cho pheùp ngöôøi söû duïng coù theå khai thaùc maïng moät caùch deã daøng .
2.Nhöõng haïn cheá vaø höôùng phaùt trieån cuûa luaän aùn:
2.1.Nhöõng haïn cheá
Chöa thöïc hieän keát noái ñieàu khieån moät maùy coâng nghieäp cuï theå
Caùc tuøy choïn ñeå söû duïng coøn haïn cheá
Söû duïng coång COM neân toác ñoä coøn haïn cheá
2.2.Höôùng phaùt trieån
Caàn laäp trình toái öu hôn nöõa, laøm cho chöông trình linh hoaït hôn trong vieäc xeùt töông quan caùc giaù trò, giaûm toái ña vieäc hao phí taøi nguyeân. Ñaëc bieät neân ñöôïc thöû nghieäm thöïc teá maïng coâng nghieäp.
Truyeàn ñoàng boä duøng USB naâng cao toác ñoä truyeàn
DATA SHEET CAÙC CHIP SÖÛ DUÏNG
1.89S8252
2.73M223
3.XC95108
TAØI LIEÄU THAM KHAÛO
1.Industrial electronics Thomas E.kissell
2.http:/www.xilinx.com
3.Hôïp ngöõ vaø laäp trình öùng duïng Toáng Vaên On-Hoaøng Ñöùc Haûi
4.
5.
6.
7.
8.
9.