Professional Documents
Culture Documents
TBNV CT7 N1 Bai3
TBNV CT7 N1 Bai3
TBNV CT7 N1 Bai3
Tên bài thực hành: GIAO TIẾP ĐIỀU KHUYỂN THIẾT BỊ NGOẠI VI (USB)
-1-
PHẦN I: Chuẩn đầu ra môn học -1: Trình bày được cấu tạo, nguyên lý hoạt động và
biết sử dụng các thành phần trong hệ thống, thiết bị điện tử
- Xác định, liệt kê các linh kiện, thiết bị cần sử dụng: Sử dụng ứng dụng MikroC,
Protues, Serial Port Terminal, USB,…
-2-
- Vi điều khiển PIC 18F4550: Là khối trung tâm của hệ thống, thực hiện các
nhiệm vụ xử lý dữ liệu, điều khiển các thiết bị ngoại vi, và thực hiện nhiện vụ
điều khiển led ON/OFF, điều khiển SW.
- USB, hoặc Universal Serial Bus, là một chuẩn giao tiếp được sử dụng để kết
nối và truyền dữ liệu giữa các thiết bị điện tử.
- PIC 18F4550 được kết nối với máy tính thông qua cổng USB.
- VS C# được sử dụng để viết mã nguồn cho vi điều khiển PIC.
- Proteus được sử dụng để mô phỏng mạch điện tử có sử dụng vi điều khiển
PIC.
- Mikro C được sử dụng để biên dịch mã nguồn được viết trong VS C#.
-3-
PHẦN II: Chuẩn đầu ra môn học 2: Có khả sử dụng các phần mềm lập trình, mô
phỏng
- Mikcro C Mức 3:
-4-
-5-
- Chạy mô phỏng trước và thử nghiệm trên Protesus
-6-
- Thiết lập các thông số và tên ProductName -> Save descriptor ( Lưu cùng file Mikcro
C)
-7-
- Ta gửi ! -> Led 1 sáng ( trả về X)
Còn muốn tắt thì ta gửi @ ( Led 1 tắt -> Trả F) , $(Led 2 tắt -> Trả G), ^(Led 3 tắt -> Trả
H)
-8-
- Tiếp theo là ta sẽ thiết lập giao diện Visual Studio C# như sau :
- Ta sẽ tạo ra 1 bảng giao diện có 3 SW, 3 LED, 1 cổng Device Status, Vendor ID,
Product ID, …
-9-
2.2. Khả năng sử dụng phần mềm lập trình Arduino
Một hình ảnh chụp màn hình Full – có code trong phần mềm Arduino.
2.3. Khả năng sử dụng phần mềm lập trình cho PIC – MikroC
-10-
-11-
- Ta gửi ! -> Led 1 sáng ( trả về X)
-12-
-13-
2.4. Khả năng sử dụng phần mềm viết giao diện Visual Studio C#.
Hai hình ảnh chụp màn hình Full – code và giao diện VS C#.
- Sau khi chạy xong trên Mikro C thì ta tiếp tục thiết lập cho VS C#
- Ta sẽ dùng các thư viện trong Toolbox và setup thuộc tính cho nó
-14-
-
- Tiếp theo , ta sẽ Add thư viện USB vào:
-15-
- Tiếp theo ta kích hoạt thuộc tính cho USB:
- Tiếp là lập trình cho từng thuộc tính trong bảng ( Ví dụ: COM PORT, Connect,
SW0,SW1,SW2,LED,….)
-16-
- Tiếp theo là thử nghiệm trên Proteus:
- Khi kết nối thành công, Device Status -> Sẽ chuyển sang màu xanh “ Connect” .
-18-
PHẦN III. Chuẩn đầu ra môn học 3: Có khả năng phân tích, thiết kế giải thuật và
lập trình ứng dụng
-19-
-20-
3.2. Lập trình code cho Arduino hoặc PIC
-21-
- CODE LẬP TRÌNH CHO PIC:
#define led_on 1
#define led_off 0
#define in_size 64
#define out_size 64
char count_1=0;
char count_2=0;
char count_3=0;
bit oldstate;
if (USBIF_bit == 1)
USB_interrupt_Proc();
void main()
ADCON1 |= 0x0F;
CMCON |= 7;
TRISB1_bit = 1;
TRISB2_bit = 1;
TRISE0_bit = 0;
TRISE1_bit = 0;
TRISE2_bit = 0;
UPUEN_bit = 1;
UPUEN_bit = 1;
FSEN_bit = 1;
HID_Enable(&readbuff, &writebuff);
USBIF_bit = 0;
USBIE_bit = 1;
GIE_bit = 1;
PEIE_bit = 1;
LATE0_bit = 0;
LATE1_bit = 0;
LATE2_bit = 0;
while(1)
{
-23-
if (Button(&PORTB, 0, 10, 0))
while(Button(&PORTB,0,10,0));
writebuff[0] = 'A';
HID_Write(&writebuff, out_size);
else if(Button(&PORTB,1,10,0))
while(Button(&PORTB,1,10,0));
writebuff[0] = 'B';
HID_Write(&writebuff, out_size);
else if(Button(&PORTB,2,10,0))
while(Button(&PORTB,2,10,0));
writebuff[0] = 'C';
HID_Write(&writebuff, out_size);
if (HID_Read() !=0)
if(readbuff[0] == '!')
LATE1_bit = 1; // LED ON
-24-
writebuff[0] = 'X';
HID_Write(&writebuff, out_size);
writebuff[0] = 'F';
HID_Write(&writebuff, out_size);
////////////////////////////////////////////
LATE2_bit = 1; // LED ON
writebuff[0] = 'Y';
HID_Write(&writebuff, out_size);
writebuff[0] = 'G';
HID_Write(&writebuff, out_size);
///////////////////////////////////////////
-25-
else if(readbuff[0] == '%')
LATE0_bit = 1; // LED ON
writebuff[0] = 'Z';
HID_Write(&writebuff, out_size);
writebuff[0] = 'H';
HID_Write(&writebuff, out_size);
- CODE MỨC 3:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using UsbLibrary;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
byte[] readbuff = new byte[2];
-26-
byte[] writebuff = new byte[2];
int count2 = 0;
int count3 = 0;
int count4 = 0;
public Form1()
{
InitializeComponent();
}
}
catch
{ }
}
else
{
///////////// LED ON \\\\\\\\\\\\\\\\
if (usbHidPort1.SpecifiedDevice != null)
{
readbuff = args.data;
if (readbuff[1] == 'X')
-27-
{
pictureBox1.Image =
WindowsFormsApplication1.Properties.Resources.clm;
}
///////////// LED OFF \\\\\\\\\\\\\\\\
else if (readbuff[1] == 'F')
{
pictureBox1.Image =
WindowsFormsApplication1.Properties.Resources.dcm;
}
///////////// BUTTON \\\\\\\\\\\\\\\\
else if (readbuff[1] == 'A')
{
count2++;
textBox2.Text = count2.ToString();
}
}
}
////////////////////////////////////////////////////////////////////
if (InvokeRequired)
{
try
{
Invoke(new DataRecievedEventHandler(usbHidPort1_OnDataRecieved), new
object[] { sender, args });
}
catch
{ }
}
else
{
///////////// LED ON \\\\\\\\\\\\\\\\
if (usbHidPort1.SpecifiedDevice != null)
{
readbuff = args.data;
if (readbuff[1] == 'Y')
{
pictureBox2.Image =
WindowsFormsApplication1.Properties.Resources.clm;
}
///////////// LED OFF \\\\\\\\\\\\\\\\
else if (readbuff[1] == 'G')
{
pictureBox2.Image =
WindowsFormsApplication1.Properties.Resources.dcm;
}
///////////// BUTTON \\\\\\\\\\\\\\\\
else if (readbuff[1] == 'B')
{
count3++;
textBox3.Text = count3.ToString();
}
}
}
//////////////////////////////////////////////////////
if (InvokeRequired)
{
try
-28-
{
Invoke(new DataRecievedEventHandler(usbHidPort1_OnDataRecieved), new
object[] { sender, args });
}
catch
{ }
}
else
{
///////////// LED ON \\\\\\\\\\\\\\\\
if (usbHidPort1.SpecifiedDevice != null)
{
readbuff = args.data;
if (readbuff[1] == 'Z')
{
pictureBox3.Image =
WindowsFormsApplication1.Properties.Resources.clm;
}
///////////// LED OFF \\\\\\\\\\\\\\\\
else if (readbuff[1] == 'H')
{
pictureBox3.Image =
WindowsFormsApplication1.Properties.Resources.dcm;
}
///////////// BUTTON \\\\\\\\\\\\\\\\
else if (readbuff[1] == 'C')
{
count4++;
textBox4.Text = count4.ToString();
}
}
}
-29-
Invoke(new EventHandler(usbHidPort1_OnSpecifiedDeviceRemoved), new
object[] { sender, e });
}
else
{
textBox1.Text = "Disconnected";
textBox1.BackColor = Color.Red;
pictureBox1.Image = WindowsFormsApplication1.Properties.Resources.dcm;
}
}
-30-
MessageBox.Show("Device not found. Please reconnect USB to device
use.","Information",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
-31-
}
-32-
3.4. Biên dịch code và sửa lỗi.
- Một vài hình ảnh bị lỗi (nếu có) và trình bày cách khắc phục lỗi đó.
- Một số lỗi nhóm em gặp phải đó chính là để thiếu dấu ; và chỉnh cách lề vào khi
gặp phải các câu điều kiện if, else,… và chỉnh các thông số của PIC còn sai và cái đặt thư
viện và đánh dấu tích vào.
- Và khi gặp các lỗi chỉnh thông số của hình ảnh khi add vào VS C#:
- Chưa chỉnh các thông HID Terminal
-33-
- Cách khắc phục : Nhóm sẽ cẩn thận hơn và xem kĩ video , tài liệu thầy đã gửi và rút
kinh nghiệm và đây là lần đầu tụi em tiếp xúc với môn thực hành làm quen giao tiếp với
thiết bị này nên vẫn còn nhiều hạn chế và sai sót trong công việc.
-34-
PHẦN IV: Chuẩn đầu ra môn học 4: Có khả năng lắp ráp, cân chỉnh các board
mạch điện tử theo qui trình
-35-
PHẦN V: Kết luận bài thực hành
- Trình bày kết quả của bài thực hành mà nhóm đã thực hiện;
- Dạ nhóm 1 của chúng em đã thực hiện mức độ 3 của đề bài yêu cầu và chạy mô
phỏng và biên dịch , sửa lỗi trong quá trình làm bài.
- Theo cảm nhận của bọn em nghĩ thì bài làm này rất thực tế và phù hợp với bọn em
vì sau này khi tiếp xúc với các vấn đề này thì bọn em sẽ không bị hạn chế hơn.
- Do đây là lần đầu thực hành và làm quen với các phần mềm mới : Mikcro C, Serial
Port Terminal,.. nên bọn em còn hơi chậm và trễ bài thực hành, lần sau bọn em sẽ rút
kinh nghiệm và cố gắng hoàn thành bài đầy đủ nhất.
-36-