Đề tài Nghiên cứu và triển khai hệ thồng nhúng trên kit Spartan - 3E, xây dựng mô hình Giám sát và điều khiển thiết bị theo nhiệt độ phòng

LỜI MỞ ĐẦU Để đơn giản trong việc thiết kế số, người thiết kế cần một ngôn ngữ chuẩn để mô tả các mạch điện. Từ đó Hardware Description Languages (HDLs) hay còn gọi là ngôn ngữ mô tả phần cứng ra đời. Ngôn ngữ mô tả phần cứng (HDL) là một loại ngôn ngữ để thể hiện các thiết kế Phần cứng thông qua bằng các phát biểu bằng lời. Có 2 ngôn ngữ thông dụng: Verilog HDL và VHDL. Ngôn ngữ mô tả phần cứng ngày càng thông dụng được đánh dấu sự phát triển mạnh mẽ của hệ thống nhúng. Nắm được tầm quan trọng của vấn đề cùng với định hướng giáo viên hướng dẫn đề ra nhóm chúng em tiến hành nghiên cứu và triển khai hệ thồng nhúng trên kit Spartan-3E, với mong muốn là xây dựng được mô hình “Giám sát và điều khiển thiết bị theo nhiệt độ phòng ” và lấy đó làm đề tài tốt nghiệp cho mình. Nội dung đề tài bao gồm những phần sau: Tìm hiểu về cấu trúc kít Vi điều khiển nhúng Microblaze Tìm hiểu về phần mềm EDK Thiết kế ứng dụng nhúng trên kit Mặc dù đã cố gắng để hoàn thành tập đề tài, nhưng không tránh khỏi những thiếu sót mong quí thầy cô thông cảm. Rất mong được sự góp ý của thầy cô. MỤC LỤC Trang Chương 1: GIỚI THIỆU VỀ CHIP FPGA VÀ NGÔN NGỮ ĐẶC TẢ PHẦN CỨNG VHDL . .1 1.1 KHÁI QUÁT VỀ CHIP FPGA: . .1 1.1.1 Khái niệm: . 1 1.1.2 Ứng dụng: . .2 1.2 NGÔN NGỮ ĐẶC TẢ PHẦN CỨNG VHDL: . .2 1.2.1 Giới thiệu: . .2 1.2.2 Cấu trúc một file VHDL: . 3 1.2.3 Cấu trúc từ vựng: . .4 1.2.4 Các đối tượng dữ liệu trong VHDL: . .5 1.2.5 Kiểu dữ liệu: . 6 1.2.6 Các lệnh tuần tự: . 10 Chương 2: CẤU TRÚC KIT SPARTANT-3E, VI ĐIỀU KHIỂN MICROBLAZE VÀ PHẦN MỀM EDK CỦA HÃNG XILINK . 14 2.1 CẤU TRÚC KIT SPARTANT-3E CỦA XILINX: . 14 2.1.1 Các thành phần chính của kit SPARTANT - 3E: . 14 2.1.2 Bộ tạo xung clock cho FPGA: . .15 2.1.3 Các nút chuyển nút nhấn và Led: . 15 2.1.4 Khối LCD: . .17 2.1.5 Bộ biến đổi tương tự sang số: . 18 2.2 VI ĐIỀU KHIỂN NHÚNG MICROBLAZE: . .23 2.2.1 Giới thiệu về vi điều khiển Microblaze: . 23 2.2.2 Kiến trúc cơ bản của MicrroBlaze: . 24 2.2.3 Kiến trúc Pipeline của vi điều khiển MicroBlaze: . .25 2.2.4 Giao tiếp tính hiệu trong MicroBlaze: . 25 2.3 PHẦN MỀM EDK: . 27 2.3.1 Giới thiệu Phần mềm EDK: . 27 2.3.2 Các tập lệnh trong EDK: . .27 2.3.3 Cách tạo Project với phần mềm EDK: . 32 Chương 3: PHẦN MỀM VB VÀ GIAO DIỆN ĐIỀU KHIỂN . .39 3.1 GIỚI THIỆU VỀ NGÔN NGỮ LẬP TRÌNH VB.NET: . .39 3.2 LẬP TRÌNH GIAO TIẾP CỔNG NỐI TIẾP VB.NET: . .39 3.2.1 Tự động dò tìm cổng COM: . .39 3.2.2 Đóng mở cổng COM: . .39 3.2.3 Nhận dữ liệu từ cổng COM: . .40 3.2.4 Gửi dữ liệu ra cổng COM: . .40 3.2.5 Cài đặt tham số cho cổng COM: . .41 3.2.6 Viết chương trình: . .41 Chương 4: TRIỂN KHAI XÂY DỰNG HỆ THỐNG NHÚNG TRÊN KIT SPARTANT 3E . .53 4.1 SƠ ĐỒ TỔNG QUÁT VỀ ỨNG DỤNG NHÚNG: . 53 4.2 XÂY DỰNG CÁC CHIP NHÚNG: . .54 4.2.1 Khối cảm biến nhiệt: . .54 4.2.2 Khối điều khiển Camera: . .58 4.3 XÂY DỰNG CÁC ỨNG DỤNG NHÚNG: . .61 4.3.1 Sơ đồ giải thuật: . .61 KẾT LUẬN . .70 PHỤ LỤC CÁC TỪ VIẾT TẮC . 71 DANH MỤC TÀI LIỆU THAM KHẢO . .72

pdf80 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2770 | Lượt tải: 4download
Bạn đang xem trước 20 trang tài liệu Đề tài Nghiên cứu và triển khai hệ thồng nhúng trên kit Spartan - 3E, xây dựng mô hình Giám sát và điều khiển thiết bị theo nhiệt độ phòng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1 hoặc 2) Data: giá trị để ghi lên thanh ghi dữ liệu tạ vị trí con trỏ đang trỏ tới. Chú ý: Hàm không có gái trị trả về. Nếu hàm này không sử dụng kênh 1, thì phần cứng phải được xây dựng ở chế độ kênh đôi. XGpio_Discreteset(XGpio * InstancePtr, unsigned Channel, u32 Mask) Chức năng: Định các đầu ra riêng biêt lên mức logic 1, tương ứng với 1 kênh được chon của thiết bị. Thông số: InstancePtr: là con trỏ chỉ tới ngoại vi đang làm việc. Channel: bao gồm 2 kênh (1 hoặc 2) Mask:set các bit ngõ ra lên mức cao, các bit khác của thanh ghi dữ liệu không bị ảnh hưởng. XGpio_Discreteclear(XGpio * InstancePtr, unsigned Channel, u32 Mask) Chức năng: Định các đầu ra riêng biệt xuống mức logic 0, tương ứng với 1 kênh được chọn của thiết bị. Thông số: InstancePtr: là con trỏ chỉ tới ngoại vi đang làm việc. Channel: bao gồm 2 kênh (1 hoặc 2) Mask:set các bit ngõ ra xuống mức thấp, các bit khác của thanh ghi dữ liệu không bị ảnh hưởng. Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 30 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn XGpio_mGetDataReg(BaseAddress, Channel) Chức năng: Lấy dữ liệu của một thanh ghi của một kênh đã được xác định. Thông số: BaseAddress: chứa địa chỉ nền của thiết bị GPIO. Channel: bao gồm 2 kênh (1 hoặc 2). Chú ý: Hàm trả về giá trị dữ liệu 32bits XGpio_mReadReg(BaseAddress, RegOffset) Chức năng: Đọc một giá trị từ thanh ghi GPIO. Kết quả thu được một dữ liệu 32bits. Nếu thiết bị hoạt động với độ rộng bit nhỏ hơn 32bits thì chỉ có lấy những bit có trọng số nhỏ, các bit còn lại sẽ là bit 0. Thông số: BaseAddress: chứa địa chỉ nền của thiết bị GPIO. RegOffset: địa chỉ của thanh ghi được đọc cách địa chỉ nền một khoảng XGpio_mWriteReg(BaseAddress, RegOffset, Data) Chức năng: Ghi một giá trị từ thanh ghi GPIO, một dữ liệu 32bits được ghi. Nếu thiết bị hoạt động với độ rộng bit nhỏ hơn 32bits thì chỉ có lấy những bit có trọng số nhỏ hơn mới được ghi. Thông số: BaseAddress: chứa địa chỉ nền của thiết bị GPIO. RegOffset: địa chỉ của thanh ghi được ghi cách địa chỉ nền một khoảng. Data: dữ liệu được ghi vào thanh ghi. XUartLite_ClearStats(XUartLite *InstancePtr) Chức năng: Đưa về không các số liệu của các phần cứng được chỉ tới. Thông số: InstancePtr: con trỏ chỉ tới thiết bị truyền dẫn nối tiếp. Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 31 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn XUartLite_DisableInterrupt(XUartLite *InstancePtr) Chức năng: Hàm này có tác dụng vô hiệu hóa các ngắt khi truyền dẫn nối tiếp. Sau khi hàm này được gọi thì việc nhận các dữ liệu nối tiếp sẽ không gặp phải bất cứ ngắt nào. Thông số: InstancePtr: con trỏ chỉ tới thiết bị truyền dẫn nối tiếp. XUartLite_EnableInterrupt(XUartLite *InstancePtr) Chức năng: Hàm này cho phép các ngắt được hoạt động trong quá trình nhận và truyền dữ liệu nối tiếp. Đối với một thiết bị có chứa 16 byte để truyền nhận dữ liệu theo kiểu FIFO thì bất cứ lúc nào cũng có thể có ngắt được cho phép trong quá trình truyền nhận dữ liệu. Thông số: InstancePtr: con trỏ chỉ tới thiết bị truyền dẫn nối tiếp. XUartLite_IsSending(XUartLite *InstancePtr) Chức năng: Hàm sẽ xác định liệu thiết bị truyền dẫn nối tiếp được chỉ ra có đang gửi dữ liệu hay không. Nếu thanh ghi truyền dẫn không bỏ trống tức là nó đang gửi dữ liệu. Thông số: InstancePtr: con trỏ chỉ tới thiết bị truyền dẫn nối tiếp. Chú ý: Hàm trả về giá trị đúng khi thiết bị đang gửi dữ liệu, ngược lại là sai. XUartLite_ResetFifos(XUartLite *InstancePtr) Chức năng: Hàm có tác dụng reset bộ nhớ FIFO, việc truyền và nhận dữ liệu sẽ bị xóa. Hàm này có thể được sử dụng trong các ứng dụng nhằm xóa các dữ liệu không mong muốn trong bộ nhớ FIFO. Thông số: InstancePtr: con trỏ chỉ tới thiết bị truyền dẫn nối tiếp. Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 32 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn XUartLite_RecvByte(u32 BaseAddress) Chức năng: Hàm nhận một byte đơn từ cổng truyền dẫn nối tiếp. Hàm đọc giá trị 8 bits từ thanh ghi nhận. Thông số: BaseAddress: là địa chỉ nền của thiết bị được xác định. Chú ý: Hàm trả lại giá trị byte mong muốn. XUartLite_RecvByte(u32 BaseAddress, u8 Data ) Chức năng: Hàm gửi đi một byte đơn qua cổng truyền dẫn nối tiếp. Hàm sẽ ghi giá trị 8 bits vào thanh ghi truyền. Thông số: BaseAddress: là địa chỉ nền của thiết bị được xác định. Data : byte dữ liệu gửi đi. Tạo hệ thống phần cứng cơ bản trong XPS (Xilinx Platform Studio): khi các bạn cho chạy chương trình EDK thì một cửa sổ xuất hiên gọi là cửa sổ XPS, chúng ta sẽ bắt đầu tạo Project ở đây, màn hình khởi đông chương trình như sau : 2.3.3 Cách tạo Project với phần mềm EDK: Hình 2.10: Cửa sổ XPS Trong hôp thoại đầu tiên xuất hiện, cho phép chúng ta thao tác cơ bản : Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 33 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Base System Builder Wizard :hộp thoại này sẽ cho phép chúng ta tao một Project mới. Open A Recent Project : mở một Project đã có sẵn. Ở đây sẽ bắt đầu với bước tạo một Project mới: nhấn Ok khi hôp chọn ở Base System…, hộp thoại tiếp theo sẽ hiện ra: Hình 2.11: Hộp thoại Create New XPS Project Ở hộp thoại này, phần mềm sẽ yêu cầu đặt tên cho thư mục chứa Project và các thư mục liên quan, nhần Browse và tạo một thư mục với một đường dẫn cụ thể, ở đây, mình sẽ đặt tên cho thư mục doan, lưu ý nhấn Open 2 lần, chương trình sẽ tự động tạo ra file doan.xmp trong thư mục chúng ta vừa tạo. Click Next xuất hiện hộp thoại Select Board, lần lượt chọn: Board vendor: Xilinx Board name: Spartan-3E Starter Board Board revision: C Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 34 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Hình 2.12: Hộp thoại Select Board Click Next xuất hiện hộp thoại Select Processor. Hình 2.13: Hộp thoại Select Processor Click Next xuất hiện hộp thoại Configure MicroBlaze Processor. Lần lượt chọn Reference clock frequency: 50 MHz Processor–Bus clock frequency: 50 MHz Debug interface: On-Chip H/W debug module Local Data and Instruction memory: 8 KB Cache setup: Enable - unchecked Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 35 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Hình 2.14: Hộp thoại Configure MicroBlaze Processor Click Next xuất hiện hộp thoại Configure IO Interfaces, đánh dấu chọn RS232_DCE và LEDs_8Bit. RS232_DCE: 115200 bits per second, 8 data bits, no parity, no interrupt LEDs_8Bit: XPS GPIO peripheral, no interrupt. Tương tự chọn ngoại vi Dip_switchs_4bit và các ngoại vi khác bỏ trống. Hình 2.15: Hộp thoại Configure IO Interfaces Click Next cho đến khi xuất hiện hộp thoại Add Internal Peripherals. Bạn có thể click Add Peripheral để thêm ngoại vi. Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 36 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Click Next xuất hiện hộp thoại Software Setup, cho phép Memory test được chọn và không chọn Peripheral selftest. Hình 2.16: Hộp thoại Software Setup Click Next xuất hiện hộp thoại Configure Memory Test Application. Hình 2.17: Hộp thoại Configure Memory Test Application Click Next xuất hiện hộp thoại System Created, tổng kết phần cứng mà ta vừa tạo ra. Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 37 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Hình 2.18: Hộp thoại System Created Click Generate, xuất hiện hộp thoại Finish. Click Finish để kết thúc quá trình tạo project. Nếu hộp thoại Next Step xuất hiện thì chọn muc Start Using Platform Studio và click OK. Cửa sổ System Assembly View1 xuất hiện, thể hiện sự kết nối của hệ thống ngoại vi và hệ thống bus. Hình 2.19: Cửa sổ System Assembly View Chọn Project → Generate and View Block Diagram để thể hiện sơ đồ khối phần cứng. Chương 2: Cấu trúc kit SPARTANT-3E, vi điều khiển MICROBLAZE và phần mềm EDK 38 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Hình 2.20: Block Diagram View of the Generated Project Như vậy ta đã xây dựng xong phần cứng cơ bản. Trong thực tế, nếu người dùng cần thêm ngoại vi cho thiết kế thì có nhiều cách thêm ngoại vi (có hướng dẫn trong video kèm theo). Chương 3: Phần mền VB và giao diện điều khiển 39 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Chƣơng 3: PHẦN MỀM VB VÀ GIAO DIỆN ĐIỀU KHIỂN 3.1 GIỚI THIỆU VỀ NGÔN NGỮ LẬP TRÌNH VB.NET: Visual Basic.NET (VB.NET) là ngôn ngữ lập trình khuynh hướng đối tượng (Object Oriented Programming Language) do Microsoft thiết kế lại từ con số không. Visual Basic.NET (VB.NET) không kế thừa VB6 hay bổ sung, phát triển từ VB6 mà là một ngôn ngữ lập trình hoàn toàn mới trên nền Microsoft ‟s .NET Framework. Do đó, nó cũng không phải là VB phiên bản 7. Thật sự, đây là ngôn ngữ lập trình mới, không những lập nền tảng vững chắc theo kiểu mẫu đối tượng như các ngôn ngữ lập trình hùng mạnh khác như C++, Java mà còn dễ học, dễ phát triển và còn tạo mọi cơ hội hoàn hảo để giúp ta giải đáp những vấn đề khúc mắc khi lập trình. 3.2 LẬP TRÌNH GIAO TIẾP CỔNG NỐI TIẾP VB.NET: 3.2.1 Tự động dò tìm cổng COM: Tự động dò tìm cổng COM và add vào listbox, sử dụng đoạn mã sau: Sub GetSerialPortNames() ' Show all available COM ports. For Each sp As String In My.Computer.Ports.SerialPortNames ListBox1.Items.Add(sp) Next End Sub Hoặc đoạn mã sau: For n As Integer = 0 To _ My.Computer.Ports.SerialPortNames.Count - 1 cbport.Items.Add( _ My.Computer.Ports.SerialPortNames(n)) 3.2.2 Đóng mở cổng COM: Để mở cổng COM sử dụng đoạn lệnh sau: If SerialPort1.IsOpen Then SerialPort1.Close() ’ đóng cổng COM SerialPort1.Open() ’ mở cổng COM Else Chương 3: Phần mền VB và giao diện điều khiển 40 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn SerialPort1.Open() End If 3.2.3 Nhận dữ liệu từ cổng COM: Khi có sự kiện nhận dữ liệu từ cổng COM sẽ hiển thị ra textbox. Dữ liệu nhận được dạng string. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Control.CheckForIllegalCrossThreadCalls = False txtreceiver.Text = SerialPort1.ReadExisting End Sub Hoặc sử dụng hàm sau với cổng COM 1: Function ReceiveSerialData() As String ' Receive strings from a serial port. Dim returnStr As String = "" Using com1 As IO.Ports.SerialPort = _ My.Computer.Ports.OpenSerialPort("COM1") Do Dim Incoming As String = com1.ReadLine() If Incoming Is Nothing Then Exit Do Else returnStr &= Incoming & vbCrLf End If Loop End Using End Function 3.2.4 Gửi dữ liệu ra cổng COM: Dữ liệu truyền đi mã ASCII. Mã lệnh: phải mở cổng COM trước khi truyền dữ liệu. SerialPort1.Write(Tx.Text) Chương 3: Phần mền VB và giao diện điều khiển 41 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Hoặc sử dụng hàm sau: Sub SendSerialData(ByVal data As String) ' Send strings to a serial port. Using com1 As IO.Ports.SerialPort = _ My.Computer.Ports.OpenSerialPort("COM1") com1.WriteLine(data) End Using End Sub 3.2.5 Cài đặt tham số cho cổng COM: Với cbbaud, cbdat, cbstop, cbport là các combobox. Và cài trước các tham số (add item) vào các combox tương ứng. Tốc độ baud: SerialPort1.BaudRate = CInt(cbbaud.Text) Số data bit: SerialPort1.DataBits = CInt(cbdat.Text) Số stop bit: If cbstop.Text = 1 Then SerialPort1.StopBits = IO.Ports.StopBits.One ‘ số stop bit là 1 ElseIf cbstop.Text = 1.5 Then SerialPort1.StopBits = IO.Ports.StopBits.OnePointFive ‘ stop bit là 1.5 ElseIf cbstop.Text = 2 Then SerialPort1.StopBits = IO.Ports.StopBits.Two ‘ stop bit là 2 Else SerialPort1.StopBits = IO.Ports.StopBits.None ‘ không có stop bit End If 3.2.6 Viết chƣơng trình: Chương trình gồm hai chế độ hoạt động điều khiển thứ nhất là chế độ giám sát, thứ hai là chế độ điều khiển. Chế độ giám sát : nhận dữ liệu và hiển thị trạng thái các thiết bị, nhiệt độ, góc xoay của camera theo một thông số được thiết lập thông qua chương trình từ trước. Chương 3: Phần mền VB và giao diện điều khiển 42 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Chế độ điều khiển: điều khiển các thiết bị theo mong muốn của người dùng. Chương trình có giao diện như bên dưới. Hình 3.1: Giao diện điều khiển và giám sát trên máy tính Chƣơng trình trên form điều khiển và giám sát: Dim data As String Dim tam As String Dim achar As String Dim Received As String Function ReceiveSerialData() As String ' Receive strings from a serial port. Dim returnStr As String = "" Using tam As IO.Ports.SerialPort = _ My.Computer.Ports.OpenSerialPort("COM15") Do Dim Incoming As String = tam.ReadLine() If Incoming Is Nothing Then Exit Do Else returnStr &= Incoming & vbCrLf End If Loop Chương 3: Phần mền VB và giao diện điều khiển 43 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn End Using Return returnStr End Function If SerialPort1.IsOpen Then SerialPort1.Close() End If End Sub Private Sub send() If SerialPort1.IsOpen = True Then If ((rdmodenhiet.Checked = False) And (rdmodegoc.Checked = False) And (rdmodenhiet2.Checked = False)) Then MsgBox("Pleases check", , "Warning") Else SerialPort1.Write(txtSend.Text) 'txtSend.Text = "" End If Else MsgBox("Pleases connect COM", , "Warning") rdmodenhiet.Checked = False rdmodegoc.Checked = False rdmodenhiet2.Checked = False End If 'If SerialPort1.CDHolding = False Then ' MsgBox("Pleases connect terminal") 'End If End Sub Private Sub continue_start() 'khai bao cho toc do baud , databit stop bit SerialPort1.Encoding = System.Text.Encoding.Default SerialPort1.ReceivedBytesThreshold = 1 SerialPort1.BaudRate = CInt(Cblbaud.Text) SerialPort1.DataBits = CInt(CblDatabit.Text) ' SerialPort1.ReceivedBytesThreshold = 1 If CDbl(CblStopbit.Text) = 1 Then SerialPort1.StopBits = IO.Ports.StopBits.One ElseIf CDbl(CblStopbit.Text) = 1.5 Then SerialPort1.StopBits = IO.Ports.StopBits.OnePointFive ElseIf CDbl(CblStopbit.Text) = 2 Then SerialPort1.StopBits = IO.Ports.StopBits.Two Else SerialPort1.StopBits = IO.Ports.StopBits.None End If '------------------------------------------------------ lblSate.Text = "Connected" PictureBox2.Visible = False Chương 3: Phần mền VB và giao diện điều khiển 44 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn PictureBox3.Visible = True If SerialPort1.IsOpen Then SerialPort1.Close() SerialPort1.PortName = cblPort.Text 'khai bao cho toc do baud , databit stop bit SerialPort1.ReceivedBytesThreshold = 1 SerialPort1.BaudRate = CInt(Cblbaud.Text) SerialPort1.DataBits = CInt(CblDatabit.Text) 'SerialPort1.ReceivedBytesThreshold = 1 If CDbl(CblStopbit.Text) = 1 Then SerialPort1.StopBits = IO.Ports.StopBits.One ElseIf CDbl(CblStopbit.Text) = 1.5 Then SerialPort1.StopBits = IO.Ports.StopBits.OnePointFive ElseIf CDbl(CblStopbit.Text) = 2 Then SerialPort1.StopBits = IO.Ports.StopBits.Two Else SerialPort1.StopBits = IO.Ports.StopBits.None End If '-------------------------------------------------- SerialPort1.Open() Else SerialPort1.PortName = cblPort.Text 'khai bao cho toc do baud , databit stop bit SerialPort1.ReceivedBytesThreshold = 1 SerialPort1.BaudRate = CInt(Cblbaud.Text) SerialPort1.DataBits = CInt(CblDatabit.Text) 'SerialPort1.ReceivedBytesThreshold = 1 If CDbl(CblStopbit.Text) = 1 Then SerialPort1.StopBits = IO.Ports.StopBits.One ElseIf CDbl(CblStopbit.Text) = 1.5 Then SerialPort1.StopBits = IO.Ports.StopBits.OnePointFive ElseIf CDbl(CblStopbit.Text) = 2 Then SerialPort1.StopBits = IO.Ports.StopBits.Two Else SerialPort1.StopBits = IO.Ports.StopBits.None End If '-------------------------------------------------- SerialPort1.Open() End If Timer3.Interval = 100 Timer3.Enabled = True End Sub Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Chương 3: Phần mền VB và giao diện điều khiển 45 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn ToolStripButton2.Image = System.Drawing.Image.FromFile("D:\netluanvan\start.bmp") ToolStripButton2.Text = "Start" Me.Hide() SOTP_DUNG() Form2.Show() End Sub Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click exit_thoat() End End Sub Private Sub SettingToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SettingToolStripMenuItem.Click ToolStripButton2.Image = System.Drawing.Image.FromFile("D:\netluanvan\start.bmp") ToolStripButton2.Text = "Start" Me.Hide() SOTP_DUNG() Form2.Show() End Sub Private Sub ExitToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem1.Click ToolStripButton2.Image = System.Drawing.Image.FromFile("D:\netluanvan\start.bmp") ToolStripButton2.Text = "Start" SOTP_DUNG() End Sub Private Sub ExitToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem2.Click exit_thoat() End End Sub Private Sub AboutAuthourToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AboutAuthourToolStripMenuItem.Click Dialog1.Show() End Sub Private Sub cmdSend_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdSend.Click send() nhanthu.Text = "" Received = "" If SerialPort1.IsOpen = True Then If rdmodenhiet.Checked = True Then TxtStem.Text = txtSend.Text Chương 3: Phần mền VB và giao diện điều khiển 46 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn txtSend.Text = "" ElseIf rdmodegoc.Checked = True Then txtSAngle.Text = txtSend.Text txtSend.Text = "" ElseIf rdmodenhiet2.Checked = True Then Txtdv2.Text = txtSend.Text txtSend.Text = "" End If End If 'SendSerialData(txtSend.Text) End Sub ' ham send chuoi du lieu xuong cong com (cong com duoc chon la cblPort.Text) Private Sub SendSerialData(ByVal data As String) ' Send strings to a serial port. Using thu As IO.Ports.SerialPort = _ My.Computer.Ports.OpenSerialPort(cblPort.Text) thu.WriteLine(data) End Using End Sub Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer2.Tick lbltimer.Text = TimeString End Sub Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Control.CheckForIllegalCrossThreadCalls = False achar = SerialPort1.ReadExisting Received = Received & achar nhanthu.Text = Received If Received = "" Then Else If Mid(Received, Len(Received), 1) = "F" Or Mid(Received, Len(Received), 1) = "Y" Then 'nhanthu.Text = Received txtCAngle.Text = Mid(Received, 1, 3) txtCtem.Text = Mid(Received, 4, 3) If Mid(Received, 7, 1) = "M" Then Picdevice1.Visible = True ElseIf Mid(Received, 7, 1) = "N" Then Picdevice1.Visible = False End If If Mid(Received, 8, 1) = "M" Then Picdevice1.Visible = True ElseIf Mid(Received, 8, 1) = "N" Then Picdevice1.Visible = False End If Chương 3: Phần mền VB và giao diện điều khiển 47 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Received = "" Exit Sub Else End If End If End Sub 'ketqua = Mid(chuoi, 3, 4) Private Sub cmdprocess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdprocess.Click rdmodenhiet.Checked = False rdmodegoc.Checked = False rdmodenhiet2.Checked = False If SerialPort1.IsOpen = True Then SerialPort1.Write("C") Timer1.Interval = 100 Timer3.Interval = 100 Timer1.Enabled = True Timer3.Enabled = True Else MsgBox("Pleases connect COM", , "Warning") End If End Sub Private Sub cmdset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdset.Click Timer3.Enabled = False Timer1.Enabled = False If SerialPort1.IsOpen = True Then SerialPort1.Write("I") Else MsgBox("Pleases connect COM", , "Warning") End If End Sub Private Sub cmdonoff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) If SerialPort1.IsOpen = True Then SerialPort1.Write("F") Else MsgBox("Pleases connect COM", , "Warning") End If End Sub Private Sub cmdmode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdmode.Click Timer3.Enabled = False Timer1.Enabled = False Chương 3: Phần mền VB và giao diện điều khiển 48 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn If cmdmode.Text = "Manual" Then If SerialPort1.IsOpen = True Then SerialPort1.Write("D") cmdmode.Text = "Auto" Timer4.Interval = 100 Timer4.Enabled = True 'ChDevice1.Checked = True 'ChDevice2.Checked = True Else MsgBox("Pleases connect COM", , "Warning") End If Else If SerialPort1.IsOpen = True Then Timer3.Interval = 100 Timer3.Enabled = True SerialPort1.Write("E") cmdmode.Text = "Manual" Timer4.Interval = 100 Timer4.Enabled = False ChDevice1.Checked = False ChDevice2.Checked = False Else MsgBox("Pleases connect COM", , "Warning") End If End If End Sub Private Sub cmdstop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdstop.Click If SerialPort1.IsOpen = True Then SerialPort1.Write("G") Else MsgBox("Pleases connect COM", , "Warning") End If End Sub Private Sub cmdrun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdrun.Click If SerialPort1.IsOpen = True Then SerialPort1.Write("H") Else MsgBox("Pleases connect COM", , "Warning") End If End Sub Private Sub rdmodenhiet_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdmodenhiet.CheckedChanged If rdmodenhiet.Checked = True Then Chương 3: Phần mền VB và giao diện điều khiển 49 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn If SerialPort1.IsOpen = True Then SerialPort1.Write("A") Else rdmodenhiet.Checked = False rdmodegoc.Checked = False rdmodenhiet2.Checked = False MsgBox("Pleases connect COM", , "Warning") End If End If End Sub Private Sub rdmodegoc_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdmodegoc.CheckedChanged If rdmodegoc.Checked = True Then If SerialPort1.IsOpen = True Then SerialPort1.Write("B") Else rdmodenhiet.Checked = False rdmodegoc.Checked = False rdmodenhiet2.Checked = False MsgBox("Pleases connect COM", , "Warning") End If End If End Sub Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick nhanthu.Text = "" Received = "" SerialPort1.Write("Z") 'Timer1.Enabled = False Timer1.Interval = 100 Timer1.Enabled = False End Sub Private Sub Timer3_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer3.Tick If nhanthu.Text = "" Then Else If Mid(nhanthu.Text, Len(nhanthu.Text), 1) = "F" Then Timer1.Interval = 100 Timer1.Enabled = True End If End If End Sub Private Sub Timer4_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer4.Tick If nhanthu.Text = "" Then Else Chương 3: Phần mền VB và giao diện điều khiển 50 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn If Mid(nhanthu.Text, Len(nhanthu.Text), 1) = "Y" Then Timer1.Interval = 100 Timer1.Enabled = True End If End If End Sub Private Sub rdmodenhiet2_CheckedChanged(ByVal sender As System.Object, Private Sub ChDevice1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChDevice1.CheckedChanged If cmdmode.Text = "Manual" Then ChDevice1.Checked = False Else If SerialPort1.IsOpen = True Then If Picdevice1.Visible = True Then Picdevice1.Visible = False Else Picdevice1.Visible = True End If SerialPort1.Write("F") Else MsgBox("Pleases connect COM", , "Warning") End If End If End Sub Private Sub ChDevice2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChDevice2.CheckedChanged If cmdmode.Text = "Manual" Then ChDevice2.Checked = False Else If SerialPort1.IsOpen = True Then If Picdevice2.Visible = True Then Picdevice2.Visible = False Else Picdevice2.Visible = True End If SerialPort1.Write("L") Else MsgBox("Pleases connect COM", , "Warning") End If End If End Sub Private Sub ChDevice3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChDevice3.CheckedChanged If ChDevice3.Checked = True Then Chương 3: Phần mền VB và giao diện điều khiển 51 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn If SerialPort1.IsOpen = True Then SerialPort1.Write("K") End If End Sub Private Sub txtSend_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSend.TextChanged If (Len(txtSend.Text)) > 3 Then MsgBox("Number only 3 charter", , "Warning") txtSend.Text = Mid(txtSend.Text, 1, 3) Else End If End Sub End Class Chương 3: Phần mền VB và giao diện điều khiển 52 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Giao diện và chƣơng trình Setting COM: Hình 3.2: Giao diện form setting Com Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load MaximizeBox = False For i As Integer = 0 To _ My.Computer.Ports.SerialPortNames.Count - 1 CboPort.Items.Add( _ My.Computer.Ports.SerialPortNames(i)) Next 'Form1.Hide() End Sub Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancel.Click Form1.Show() Me.Hide() End Sub Private Sub CmdOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdOk.Click Form1.Cblbaud.Text = CboBaud.Text Form1.CblDatabit.Text = Cbodatabit.Text Form1.CblStopbit.Text = CboStopbit.Text Form1.CblFlow.Text = CboFlow.Text Me.Hide() End Sub End Class Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 53 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn Chƣơng 4: TRIỂN KHAI XÂY DỰNG HỆ THỐNG NHÚNG TRÊN KIT SPARTANT 3E 4.1 SƠ ĐỒ TỔNG QUÁT VỀ ỨNG DỤNG NHÚNG: Hình 4.1: Sơ đồ tổng quát về ứng dụng nhúng Giao diện VB IP cảm biến nhiệt Kit Spartan 3E IC cảm biến nhiệt Thiết bị IP encoder LCD encode r Moto camera Cổng nối tiếp Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 54 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn 4.2 XÂY DỰNG CÁC CHIP NHÚNG: 4.2.1 Khối cảm biến nhiệt: Sơ đồ giải thuật: Hình 4.2: Sơ đồ giải thuật Khối cảm biến nhiệt Chƣơng trình: TYPESTATE_TYPEis (RESET,CMD_CC,WRITE_BYTE,WRITE_LOW, WRITE_HIGH,READ_BIT,CMD_44,WAIT800MS,CMD_BE GET_TMP,WAIT4MS); signal STATE: STATE_TYPE:=RESET; signal temp_h : std_logic_vector(7 downto 0); signal temp_l : std_logic_vector(7 downto 0); signal clk_temp : std_logic:='0'; signal clk1m : std_logic; signal write_temp : std_logic_vector(7 downto 0):="00000000"; signal TMP : std_logic_vector(11 downto 0); signal tmp_bit : std_logic; signal WRITE_BYTE_CNT : integer range 0 to 8:=0; signal WRITE_LOW_CNT : integer range 0 to 2:=0; signal WRITE_HIGH_CNT : integer range 0 to 2:=0; signal READ_BIT_CNT : integer range 0 to 3:=0; Begin Reset DS1820 Ghi lệnh đổi nhiệt độ Chờ 750ms Gửi lệnh đọc nhiệt dộ END Reset DS1820 Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 55 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn signal GET_TMP_CNT : integer range 0 to 12:=0; signal cnt : integer range 0 to 100001:=0; signal count : integer range 0 to 25:=0; signal WRITE_BYTE_FLAG : integer range 0 to 4:=0; ------------------------------------------ -- Signals for user logic slave model s/w accessible register example ------------------------------------------ signal slv_reg0 : std_logic_vector(0 to C_SLV_DWIDTH-1); signal slv_reg_write_sel : std_logic_vector(0 to 0); signal slv_reg_read_sel : std_logic_vector(0 to 0); signal slv_ip2bus_data : std_logic_vector(0 to C_SLV_DWIDTH-1); signal slv_read_ack : std_logic; signal slv_write_ack : std_logic; begin --USER logic implementation added here ClkDivider:process (clk) begin if rising_edge(clk) then if (count = 24) then count <= 0; clk_temp<= not clk_temp; else count <= count +1; end if; end if; clk1m<=clk_temp; end Process; STATE_TRANSITION:process(STATE,clk1m) begin when CMD_CC=> write_temp<="11001100"; STATE<=WRITE_BYTE; when WRITE_BYTE=> case WRITE_BYTE_CNT is when 0 to 7=> if (write_temp(WRITE_BYTE_CNT)='0') then STATE<=WRITE_LOW; else STATE<=WRITE_HIGH; end if; WRITE_BYTE_CNT<=WRITE_BYTE_CNT+1; when 8=> if (WRITE_BYTE_FLAG=0) then -- ????0XCC?? STATE<=CMD_44; WRITE_BYTE_FLAG<=1; elsif (WRITE_BYTE_FLAG=1) then --?0X44?? STATE<=RESET; WRITE_BYTE_FLAG<=2; elsif (WRITE_BYTE_FLAG=2) then --????0XCC?? STATE<=CMD_BE; Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 56 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn WRITE_BYTE_FLAG<=3; elsif (WRITE_BYTE_FLAG=3) then --?0XBE?? STATE<=GET_TMP; WRITE_BYTE_FLAG<=0; end if; WRITE_BYTE_CNT<=0; end case; when WRITE_LOW=> case WRITE_LOW_CNT is when 0=> dq_O<='0'; if (cnt=78) then cnt<=0; WRITE_LOW_CNT<=1; else cnt<=cnt+1; end if; when 1=> dq_O<='Z'; if (cnt=2) then cnt<=0; WRITE_LOW_CNT<=2; else cnt<=cnt+1; end if; when 2=> STATE<=WRITE_BYTE; WRITE_LOW_CNT<=0; when others=>WRITE_LOW_CNT<=0; end case; when WRITE_HIGH=> case WRITE_HIGH_CNT is when 0=> dq_O<='0'; if (cnt=8) then cnt<=0; WRITE_HIGH_CNT<=1; else cnt<=cnt+1; end if; when 1=> dq_O<='Z'; if (cnt=72) then cnt<=0; WRITE_HIGH_CNT<=2; else cnt<=cnt+1; end if; when 2=> STATE<=WRITE_BYTE; Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 57 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn WRITE_HIGH_CNT<=0; when others=>WRITE_HIGH_CNT<=0; end case; when READ_BIT=> case READ_BIT_CNT is when 0=> when 1=> dq_O<='Z'; cnt<=cnt+1; end if; when others=>READ_BIT_CNT<=0; end case; when CMD_44=> write_temp<="01000100"; STATE<=WRITE_BYTE; when WAIT800MS=> if (cnt>=100000) then STATE<=RESET; cnt<=0; else cnt<=cnt+1; STATE<=WAIT800MS; end if; when CMD_BE=> write_temp<="10111110"; STATE<=WRITE_BYTE; when GET_TMP=> case GET_TMP_CNT is when 0 to 11=> STATE<=READ_BIT; TMP(GET_TMP_CNT)<=TMP_BIT; GET_TMP_CNT<=GET_TMP_CNT+1; when 12=> GET_TMP_CNT<=0; STATE<=WAIT4MS; end case; when WAIT4MS=> if (cnt>=4000) then STATE<=RESET; cnt<=0; else cnt<=cnt+1; STATE<=WAIT4MS; end if; when others=>STATE<=RESET; end case; end if; end process; end IMP Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 58 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn 4.2.2 Khối điều khiển Camera: Sơ đồ giải thuật: Hình 4.3: Sơ đồ giải thuật khối điều khiển Camera Chƣơng trình: entity user_logic is port ( -- ADD USER PORTS BELOW THIS LINE ------------------ --USER ports added here CONTR : out std_logic_vector(0 to 1); EN_CLK : in std_logic; -- ADD USER PORTS ABOVE THIS LINE ------------------ -- DO NOT EDIT BELOW THIS LINE --------------------- Begin Nhận số xung chuẩn Nạp cho counter Counter <= counter - 1 Xung encoder Có Không có Cập nhật số xung đã đếm lên phần mềm Counter = 0 không đúng Đổi chiều quay moto Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 59 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn -- Bus protocol ports, do not add to or delete Bus2IP_Clk : in std_logic; Bus2IP_Reset : in std_logic; Bus2IP_Data : in std_logic_vector(0 to C_SLV_DWIDTH-1); Bus2IP_BE : in std_logic_vector(0 to C_SLV_DWIDTH/8-1); Bus2IP_RdCE : in std_logic_vector(0 to C_NUM_REG-1); Bus2IP_WrCE : in std_logic_vector(0 to C_NUM_REG-1); IP2Bus_Data : out std_logic_vector(0 to C_SLV_DWIDTH-1); IP2Bus_RdAck : out std_logic; IP2Bus_WrAck : out std_logic; IP2Bus_Error : out std_logic -- DO NOT EDIT ABOVE THIS LINE --------------------- ); attribute SIGIS : string; attribute SIGIS of Bus2IP_Clk : signal is "CLK"; attribute SIGIS of Bus2IP_Reset : signal is "RST"; end entity user_logic; ------------------------------------------------------------------------------ -- Architecture section ------------------------------------------------------------------------------ architecture IMP of user_logic is --USER signal declarations added here, as needed for user logic signal counter :STD_LOGIC_vector(6 downto 0):="0000000"; signal tam : STD_LOGIC_vector(1 downto 0):= "01"; signal tam1 : STD_LOGIC_vector(6 downto 0); signal temp : STD_LOGIC_vector(6 downto 0); signal temp_pulse : STD_LOGIC_vector(6 downto 0); -------------------------------------------------- -- Signals for user logic slave model s/w accessible register example -------------------------------------------------- signal slv_reg0 : std_logic_vector(0 to C_SLV_DWIDTH-1); signal slv_reg_write_sel : std_logic_vector(0 to 0); signal slv_reg_read_sel : std_logic_vector(0 to 0); signal slv_ip2bus_data : std_logic_vector(0 to C_SLV_DWIDTH-1); signal slv_read_ack : std_logic; signal slv_write_ack : std_logic; begin tam1 <= temp; CONTR <= tam; DEM_PRO : PROCESS (EN_CLK,tam,counter) is begin if (EN_CLK' event and EN_CLK = '1') then if (counter >0) then counter <=counter-1; else Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 60 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn counter<=tam1; if (tam="10")then tam <="01"; else tam <="10"; end if; end if; end if; end process DEM_PRO; XUNG_PROC : process( Bus2IP_Clk ) is begin if Bus2IP_Clk'event and Bus2IP_Clk = '1' then if Bus2IP_Reset = '1' then temp <= temp; else if Bus2IP_WrCE(0) = '1' then temp <= Bus2IP_Data(25 to 31); end if; end if; end if; end process XUNG_PROC; end IM Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 61 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn 4.3 XÂY DỰNG CÁC ỨNG DỤNG NHÚNG: 4.3.1 Sơ đồ giải thuật: Khối điều khiển camera: Hình 4.4: Sơ đồ giải thuật khối điều khiển camera giao tiếp vb Khối điều khiển điều khiển nhiệt độ: Hình 4.5: Sơ đồ giải thuật khiển điều khiển nhiệt độ giao tiếp vb Chƣơng trình lập trình: #include "xparameters.h" #include "xgpio.h" #include "xgpio_l.h" #include "xutil.h" #include "xuartlite_l.h" Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 62 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn #define NHIET_BASEADDR XPAR_NHIET_IP_0_BASEADDR #define LCD_BASEADDR XPAR_LCD_IP_0_BASEADDR // #define LED_BASEADDR XPAR_LEDS_8BIT_BASEADDR #define ADC_BASEADDR XPAR_ADC_IP_0_BASEADDR #define INIT_DELAY 1000 //delay time during initiaton #define INST_DELAY 500 //delay tim between instructons #define DATA_DELAY 250 //delay time between data packages //==================================================== // INTERNAL FUNCTIONS // delay function void usleep(unsigned int delay) { unsigned int j, i; for(i=0; i<delay; i++) for(j=0; j<26; j++); } // initial statements is in the form of manufacturer void XromInitInst(void) { XGpio_mSetDataReg(LCD_BASEADDR, 1, 0x00000003); usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, 0x00000043); //set enable usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, 0x00000003); usleep(INIT_DELAY);// delay used for initialization } void XromWriteInst(unsigned long inst1, unsigned long inst2) { unsigned long printinst; printinst = 0x00000040 | inst1; XGpio_mSetDataReg(LCD_BASEADDR, 1, inst1); usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, printinst); //set enable and send 4-bit higher usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, inst1); //turn off enable usleep(1); printinst = 0x00000040 | inst2; XGpio_mSetDataReg(LCD_BASEADDR, 1, printinst); usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, inst2); //turn off enable usleep(INST_DELAY);//delay used for writing commands } // writing data with: E=1, RS=1, RW=0 void XromWriteData(unsigned long data1, unsigned long data2) { unsigned long rs_data, enable_rs_data; rs_data = (0x00000020 | data1); //contain RS=1 enable_rs_data = (0x00000060 | data1);//contain E=1, RS=1 XGpio_mSetDataReg(LCD_BASEADDR, 1, rs_data); Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 63 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, enable_rs_data); usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, rs_data); //turn off enable usleep(1); rs_data = (0x00000020 | data2); //sets rs, data2 enable_rs_data = (0x00000060 | data2); //sets rs, data2 XGpio_mSetDataReg(LCD_BASEADDR, 1, enable_rs_data); // usleep(1); XGpio_mSetDataReg(LCD_BASEADDR, 1, rs_data); //turn off enable usleep(DATA_DELAY);//delay used for writing data } // EXTERNAL FUNCTIONS //set the position of cursor void XromMoveCursorHome() { XromWriteInst(0x00000000, 0x00000002);//write code: 0000.0010, return home } void XromMoveCursorLeft() { XromWriteInst(0x00000001, 0x00000000);//write code: 0001.0000, shirf the cursor toward left } void XromMoveCursorRight() { XromWriteInst(0x00000001, 0x00000004); //write code: 0001.0100, shirf the cursor toward right } void XromLCDOn() void XromLCDOff() { //xil_printf("DISPLAY OFF\r\n"); XromWriteInst(0x00000000, 0x00000008);//writing code: 0000.1000, put out the screen and //cursor, remain the DRAM } void XromLCDClear() { //xil_printf("DISPLAY CLEAR\r\n"); XromWriteInst(0x00000000, 0x00000001);//code: 0000.0001, clear the screen and DRAM XromWriteInst(0x00000000, 0x00000010);//0000.0000, with E=1, RW=1, RS=0, read BF status XromMoveCursorHome();//return home } void XromLCDInit() { XGpio_mSetDataDirection(LCD_BASEADDR, 1, 0x00000000); XGpio_mSetDataReg(LCD_BASEADDR, 1, 0x00000000); usleep(15000); XromInitInst(); Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 64 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn usleep(4100); //Wait 4.1ms XromInitInst(); usleep(100); //Wait 100us XromInitInst(); XromInitInst(); XromWriteInst(0x00000002, 0x00000008);//code: 0010.1000, display the 4-bit protocol, two- line, 5x8-type XromWriteInst(0x00000000, 0x00000006);//code: 0000.0110, increase AC when writing, not shirf the displayed data. XromWriteInst(0x00000000, 0x00000008); XromWriteInst(0x00000000, 0x0000000F); XromWriteInst(0x00000000, 0x00000001); } void XromLCDSetLine(int line) { XromMoveCursorHome(); for(i=0; i<40; i++) XromMoveCursorRight();//after shirfing forty characters, th cursor is at the beginning of the second line } else XromMoveCursorHome();//in the case displaying on the first line } //display a character void XromLCDPrintChar(char c) { XromWriteData(((c >> 4) & 0x0000000F), (c & 0x0000000F)); } //display a string on the first line void XromLCDPrintString(char * line) { int i=0; while(line[i]) { XromLCDPrintChar(line[i]); i++; } return; } // display two string on two lines void XromLCDPrint2Strings(char * line1, char * line2) { int i=0; XromLCDSetLine(1); for(i=0; i<16; i++) { Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 65 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn if(line1[i]) XromLCDPrintChar(line1[i]); else break; } XromLCDSetLine(2); for(i=0; i<16; i++) { if(line2[i]) XromLCDPrintChar(line2[i]); else break; } return; } // //////////////////// MAIN //////////////////////////////////////// main() { extern char a[3]; extern char b; unsigned char adc; XGpio DIP_Switches_4Bit, push, LEDs_8bit; int i,ketqua,ketqua1, ketqua2, c1, c2, c3, tam, hien, hien1, tam1, tam2, tam3, tam4, tam5, tam6, tam7, goc_chuan, so_xung, devi1_32bit, devi2_32bit, nhiet_chuan1, nhiet_chuan2, cua_cotr, nhiet, nhiet1, nhiet32bit,nhiet_chuan, sta_quay, quay32bit, angle1, angle11, angle2, angle22, angle3, angle33, cur_angle, so_xung1, dk1, dk2; XGpio_Initialize(&LEDs_8bit, XPAR_LEDS_8BIT_DEVICE_ID); XGpio_SetDataDirection(&LEDs_8bit, 1, 0x000000ff); XromLCDInit(); XromLCDOn(); XromLCDClear(); XromLCDPrintString("Embedded Systems"); sta_quay = 0x00000003; XGpio_mSetDataReg(XPAR_ENCODER0_IP_0_BASEADDR + 0x4,1,sta_quay); again1: XromLCDSetLine(2); XromLCDPrintString("nhiet do22:"); nhiet = XGpio_mGetDataReg (NHIET_BASEADDR,1); tam = nhiet / 10; hien = 0x00000030 + tam; XromLCDPrintChar(hien); tam1 = nhiet % 10; hien = 0x00000030 + tam1; XromLCDPrintChar(hien); XromLCDPrintString("oC"); Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 66 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn while (!XUartLite_mIsReceiveEmpty(STDIN_BASEADDRESS)) { b = XUartLite_RecvByte(STDIN_BASEADDRESS); tam1 = b + 0x00000000; switch(tam1) { case 0x00000041: goto nhietdevi1; case 0x0000004a: goto nhietdevi2; case 0x00000042: goto quay; case 0x00000043: goto xuly; } goto again1; } goto again1; quay: i = 0; quay1: a[i] = XUartLite_RecvByte(STDIN_BASEADDRESS); quay32bit = a[i] + 0x00000000; switch(i) { case 2: { c1 = quay32bit & 0x0000000f; ketqua = c1 + c2 + c3; goc_chuan = ketqua; so_xung = goc_chuan / 4; i = 0; XromLCDPrintString("vu"); goto again1; break; } case 1: { c2 = quay32bit & 0x0000000f; c2 = c2 * 10; break; } case 0: { c3 = quay32bit & 0x0000000f; c3 = c3 * 100; break; Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 67 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn } i= i+1; goto quay1; } goto quay; nhietdevi1: i = 0; a[i] = XUartLite_RecvByte(STDIN_BASEADDRESS); devi1_32bit = a[i] + 0x00000000; switch(i) { case 2: { c1 = devi1_32bit & 0x0000000f; ketqua1 = c1 + c2 + c3; nhiet_chuan1 = ketqua1; i = 0; goto again1; break; } case 1: { c2 = devi1_32bit & 0x0000000f; c2 = c2 * 10; break; } case 0: { c3 = devi1_32bit & 0x0000000f; c3 = c3 * 100; } } i= i+1; goto nhietdevi11; goto nhietdevi1; nhietdevi2: i = 0; a[i] = XUartLite_RecvByte(STDIN_BASEADDRESS); devi2_32bit = a[i] + 0x00000000; xuly: XromLCDClear(); XromLCDPrintString("Embedded Systems"); XromLCDSetLine(2); nhiet = XGpio_mGetDataReg (NHIET_BASEADDR,1); tam = nhiet / 10; hien1 = 0x00000030 + tam; tam1 = nhiet % 10; hien = 0x00000030 + tam1; Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 68 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn XGpio_mSetDataReg(XPAR_ENCODER0_IP_0_BASEADDR,1,so_xung); XGpio_mSetDataReg(XPAR_ENCODER0_IP_0_BASEADDR + 0x4,1,sta_quay); so_xung1 = XGpio_mGetDataReg (XPAR_ENCODER0_IP_0_BASEADDR + 0x8,1); cur_angle = (so_xung - so_xung1) * 4; angle1 = cur_angle / 100; angle11 = 0x00000030 + angle1; angle2 = (cur_angle / 10) - (angle1 * 10); angle22 = 0x00000030 + angle2; angle3 = cur_angle - (angle1 * 100) + (angle2 * 10); angle33 = 0x00000030 + angle3; xil_printf("%c", 0x00000046); xuly1: XromLCDSetLine(2); nhiet = XGpio_mGetDataReg (NHIET_BASEADDR,1); tam = nhiet / 10; hien1 = 0x00000030 + tam; tam1 = nhiet % 10; hien = 0x00000030 + tam1; XGpio_mSetDataReg(XPAR_ENCODER0_IP_0_BASEADDR,1,so_xung); XGpio_mSetDataReg(XPAR_ENCODER0_IP_0_BASEADDR + 0x4,1,sta_quay); so_xung1 = XGpio_mGetDataReg (XPAR_ENCODER0_IP_0_BASEADDR + 0x8,1); cur_angle = (so_xung - so_xung1) * 4; XromLCDSetLine(2); angle1 = cur_angle / 100; angle11 = 0x00000030 + angle1; XromLCDPrintChar(angle11); angle2 = (cur_angle / 10) - (angle1 * 10); angle22 = 0x00000030 + angle2; XromLCDPrintChar(angle22); angle3 = cur_angle - ((angle1 * 100) + (angle2 * 10)); angle33 = 0x00000030 + angle3; XromLCDPrintChar(angle33); if (nhiet <= nhiet_chuan1) dk1 = 0x0000004d;// mo thiet bi 1 (M) tam3 = 0x00000003; XGpio_mSetDataReg (XPAR_LEDS_8BIT_BASEADDR,1,0x00000003); } else { dk1 = 0x0000004e;//dong thiet bi 1 (N) tam3 = 0x00000000; XGpio_mSetDataReg (XPAR_LEDS_8BIT_BASEADDR,1,0x00000000); } if (nhiet <= nhiet_chuan2) { dk2 = 0x0000004d;//dong thiet bi 2 (M) tam6 = 0x0000000c; XGpio_mSetDataReg (XPAR_LEDS_8BIT_BASEADDR,1,tam6 + tam3); } else Chương 4: Triển khai xây dựng hệ thống nhúng trên kit SPARTANT 3E 69 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn { dk2 = 0x0000004e;//dong thiet bi 2 (N) tam6 = 0x00000000; XGpio_mSetDataReg (XPAR_LEDS_8BIT_BASEADDR,1,tam6 + tam3); } b = XUartLite_RecvByte(STDIN_BASEADDRESS); tam4 = b + 0x00000000; if(tam4 == 0x00000044)//ngat che do tu dong(D) { xil_printf ("Y"); xuly2: nhiet = XGpio_mGetDataReg (NHIET_BASEADDR,1); tam = nhiet / 10; hien1 = 0x00000030 + tam; tam1 = nhiet % 10; hien = 0x00000030 + tam1; angle1 = cur_angle / 100; angle11 = 0x00000030 + angle1; sta_quay = 0x00000000; goto xuly1; goto xuly1; } else if (tam4 == 0x0000005a)// ma cho phep gui len(Z) { goto xuly1; } else goto xuly1; } goto xuly1; } KẾT LUẬN 70 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn KẾT LUẬN Theo nhận định chủ quan của nhóm thực hiện thì tập đồ án này đã trình bày các nội dung, những kiến thức liên quan, giải quyết đƣợc những yêu cầu đặt ra như sau:  Hiểu được khái niệm hệ thống nhúng và tầm quan trọng của hệ thống nhúng ngày nay.  Hiểu và biết cách sử dụng phần mềm EDK của hãng Xilinx.  Sử dụng được vi điều khiển Microblaze.  Vận dụng kiến thức để xây dựng những ứng dụng nhúng bằng phần mềm EDK trên kit SPARTAN 3E của hãng Xilinx. Tuy nhiên do thời gian cũng như trình độ chuyên môn có hạn vẫn còn nhiều vấn đề mà nhóm vẫn chƣa giải quyết đƣợc.  Chưa khai thác hết những tiện ích của phần mềm EDK và kit SPARTAN 3E.  Chưa phát triển những ứng dụng nhúng ở mức độ cao hơn. Hƣớng phát triển đề tài: Để đề tài này thêm phong phú và tăng hiệu quả sử dụng thì cần đáp ứng được những yêu cầu sau:  Tìm hiểu để xây dựng hệ thống nhúng trên những kit khác nhau.  Xây dựng các ứng dụng nhúng ở mức độ cao hơn, như nhúng uClinux vào kit với phần mềm EDK và vi điều khiển Microblaze ,..đặc biệt là có khă năng ứng dụng trong thực tế. Sau cùng một lần nữa chúng em xin chân thành cảm ơn Cô Phạm Trần Bích Thuận cùng qúy thầy cô trong khoa đã tận tình hướng dẫn chúng em. Chân thành cảm ơn các bạn sinh viên đã đóng góp những ý kiến quí báu để đề tài này hoàn thành tốt đẹp. PHỤ LỤC CÁC TỪ VIẾT TẮC 71 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn PHỤ LỤC CÁC TỪ VIẾT TẮC ADC: Analog digital converter. BTN_EAST : Button east. BRAM: block RAM. Bus IF: Bus interface. CPLD : Complex Programable Logic Device. DAC: Digital analog converter. DCM: Digital Clock Manager. DCR: Device Control Register. DLMB: Data-side Local Memory Bus. DOPB: Data-side On-chip Peripheral Bus. EDK: Embedded Development Kit. EDIF: Electronic Data Interchange Format file. EST: Embedded System Tools. FPGA: Field Programable Gate Arrays . FSL: MicroBlaze Fast Simplex Link. GDB: GNU Debugger. GPIO General Purpose Input and Output. HDL: Hardware Description Language. ILMB: Instruction-side Local Memory Bus. IP: Intellectual property. IOPB: Instruction-side On-chip Peripheral Bus. OCM: On Chip Memory. RISC : Reduced Instruction Set Computer. UART: Universal Asynchronus receiver transmitter. UCF: User Constraints File. XCL: Xilinx® CacheLink. XMD: Xilinx Microprocessor Debug. DANH MỤC TÀI LIỆU THAM KHẢO 72 GVHD: Phạm Trần Bích Thuận SVTH: Nguyễn Ngọc Vũ – Võ Xuân Văn DANH MỤC TÀI LIỆU THAM KHẢO 1) Công nghệ vi điện tử –Phạm Trần Bích Thuận, TP.HCM. 2) EDK_Tutorial, www.xilinx.com 3) MicroBlaze Tutorial, 4) MicroBlaze Overview ,

Các file đính kèm theo tài liệu này:

  • pdfNghiên cứu và triển khai hệ thồng nhúng trên kit Spartan-3E, xây dựng mô hình Giám sát và điều khiển thiết bị theo nhiệt độ phòng.pdf