TBNV CT7 N1 Bai3

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 36

BÁO CÁO THỰC HÀNH

GIAO TIẾP ĐIỀU KHIỂN THIẾT BỊ NGOẠI VI

Tên bài thực hành: GIAO TIẾP ĐIỀU KHUYỂN THIẾT BỊ NGOẠI VI (USB)

Tên thành viên nhóm 1 :

• Bùi Đình Hoàng – 21113931


• Hồ Nguyên Đai – 21095041

Ngày thực hiện: 20 /1 / 2024

-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ử

1.1. Mô tả tóm tắt nội dung bài thực hành


- Mô tả tóm tắt nội dung, yêu cầu và mục đích của bài thực hành.
- Bài thực hành này sử dụng vi điều khiển Pic18F4550, phần mềm lập trình
MikroC, và phần mềm mô phỏng Proteus.
- Nội dung chính: của bài thực hành có thể xoay quanh việc lập trình và kiểm
thử chương trình cho vi điều khiển này.
- Mục đích:
- Hiểu rõ về cấu trúc và chức năng của vi điều khiển Pic18F4550.
- Nắm vững việc sử dụng phần mềm MikroC để lập trình cho vi điều khiển.
- Áp dụng kiến thức để thiết kế và mô phỏng mạch trên Proteus.
- Yêu cầu:
- Hiểu về ngôn ngữ lập trình C.
- Cài đặt phần mềm MikroC và Proteus trên máy tính.
- Kiến thức cơ bản về vi điều khiển và linh kiện điện tử.
- Bài thực hành có thể bao gồm các bước như:
1) Lập trình chức năng cơ bản cho vi điều khiển, chẳng hạn như đọc nút nhấn,
điều khiển đèn LED, hoặc giao tiếp với các module ngoại vi.
2) Thiết kế mạch trên Proteus để kiểm thử chương trình.
3) Chạy và debug chương trình trên vi điều khiển thực tế thông qua MikroC.
4) Đánh giá và điều chỉnh chương trình để đảm bảo hoạt động ổn định và đáp ứng
yêu cầu.
5) Chạy trên giao diện VS C# và mô phỏng trên Proteus.

- 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,…

- Mức 3: Bao gồm 3 LED và 3 SW

1.2. Sơ đồ khối của bài thực hành.


- Vẽ sơ đồ khối.

- Giải thích chức năng, nhiệm vụ từng khối.

-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

2.1. Khả năng sử dụng phần mềm mô phỏng, vẽ mạch – Proteus

2.1.1) Vẽ sơ đồ nguyên lý của mạch mức 3 trong Proteus:

- Ta thực hiện vẽ Proteus : Bao gồm 3 LED, 3SW, 1 USB,…

- Mikcro C Mức 3:

-4-
-5-
- Chạy mô phỏng trước và thử nghiệm trên Protesus

- Ta chọn vào Tools -> HID Terminal

-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)

- Ta gửi # -> Led 2 sáng ( trả về Y)

- Ta gửi % -> Led 3 sáng ( trả về Z)

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)

- Chạy thành xong xong ta add File Hex vào Proteus :

-8-
- Tiếp theo là ta sẽ thiết lập giao diện Visual Studio C# như sau :

- Có thể theo video hướng dẫn hoặc trong giáo trình đã có

- 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

- Nhớ chọn thư viện Mikcro C:

-10-
-11-
- Ta gửi ! -> Led 1 sáng ( trả về X)

- Ta gửi # -> Led 2 sáng ( trả về Y)

- Ta gửi % -> Led 3 sáng ( trả về Z)

Còn muốn tắt thì ta gửi tương đương

- Gửi @ ( Led 1 tắt -> Trả F)

- Gửi $(Led 2 tắt -> Trả G)

-Gửi ^(Led 3 tắt -> Trả H)

-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:

- Theo đề bài , ta sẽ được như này:

-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,….)

- Nó sẽ chạy như vậy :

-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” .

- Nhấn ON → Led sáng: 3 LED cùng sáng


-17-
- Đếm số lần nhấn: Ấn SW:

-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

3.1. Lưu đồ giải thuật cho Arduino hoặc PIC

Vẽ lưu đồ giải thuật

-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;

unsigned char readbuff[in_size] absolute 0x500;

unsigned char writebuff[out_size] absolute 0x540;

char TransmitData, ReceiveData;

void interrupt (void)

if (USBIF_bit == 1)

USB_interrupt_Proc();

void main()

ADCON1 |= 0x0F;

CMCON |= 7;

PORTB = 0x00; LATB = 0x00;


-22-
TRISB0_bit = 1;

TRISB1_bit = 1;

TRISB2_bit = 1;

PORTE = 0x00; LATE = 0x00;

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);

else if(readbuff[0] == '@')

LATE1_bit = 0; //LED OFF

writebuff[0] = 'F';

HID_Write(&writebuff, out_size);

////////////////////////////////////////////

else if(readbuff[0] == '#')

LATE2_bit = 1; // LED ON

writebuff[0] = 'Y';

HID_Write(&writebuff, out_size);

else if(readbuff[0] == '$')

LATE2_bit = 0; //LED OFF

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);

else if(readbuff[0] == '^')

LATE0_bit = 0; //LED OFF

writebuff[0] = 'H';

HID_Write(&writebuff, out_size);

3.3. Lập trình giao diện VS C#

- 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();
}

private void textBox1_TextChanged(object sender, EventArgs e)


{

private void label2_Click(object sender, EventArgs e)


{

private void button6_Click(object sender, EventArgs e)


{
if (usbHidPort1.SpecifiedDevice != null)
{
writebuff[1] = (byte)'#';
usbHidPort1.SpecifiedDevice.SendData(writebuff);
}
else
{
MessageBox.Show("Device not found. Please reconnect USB to device use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

private void usbHidPort1_OnDataSend(object sender, EventArgs e)


{

private void usbHidPort1_OnDataRecieved(object sender,


UsbLibrary.DataRecievedEventArgs args)
{
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] == '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();
}
}
}

private void usbHidPort1_OnDeviceArrived(object sender, EventArgs e)


{

private void usbHidPort1_OnDeviceRemoved(object sender, EventArgs e)


{

private void usbHidPort1_OnSpecifiedDeviceArrived(object sender, EventArgs e)


{
textBox1.Text = "Connect";
textBox1.BackColor = Color.Green;
pictureBox1.Image = WindowsFormsApplication1.Properties.Resources.dcm;

private void usbHidPort1_OnSpecifiedDeviceRemoved(object sender, EventArgs e)


{
if (InvokeRequired)
{

-29-
Invoke(new EventHandler(usbHidPort1_OnSpecifiedDeviceRemoved), new
object[] { sender, e });
}
else
{
textBox1.Text = "Disconnected";
textBox1.BackColor = Color.Red;
pictureBox1.Image = WindowsFormsApplication1.Properties.Resources.dcm;
}
}

private void Form1_Load(object sender, EventArgs e)


{
this.usbHidPort1.VendorId = 0x04D8;
this.usbHidPort1.ProductId = 0x0001;
this.usbHidPort1.CheckDevicePresent();
if (this.usbHidPort1.SpecifiedDevice != null)
{
this.usbHidPort1.SpecifiedDevice.SendData(writebuff);
}
textBox5.Text = usbHidPort1.VendorId.ToString("x4");
textBox6.Text = usbHidPort1.ProductId.ToString("x4");
textBox7.Text = "Nhóm 1 Tới Chơi";
textBox8.Text = "USB_Driver";
}

protected override void OnHandleCreated(EventArgs e)


{
base.OnHandleCreated(e);
usbHidPort1.RegisterHandle(Handle);
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
usbHidPort1.ParseMessages(ref m);
}

private void label3_Click(object sender, EventArgs e)


{

private void pictureBox1_Click(object sender, EventArgs e)


{

private void button3_Click(object sender, EventArgs e)


{
if (usbHidPort1.SpecifiedDevice != null)
{
writebuff[1] = (byte)'!';
usbHidPort1.SpecifiedDevice.SendData(writebuff);
}
else
{

-30-
MessageBox.Show("Device not found. Please reconnect USB to device
use.","Information",MessageBoxButtons.OK,MessageBoxIcon.Information);
}

private void button4_Click(object sender, EventArgs e)


{
if (usbHidPort1.SpecifiedDevice != null)
{
writebuff[1] = (byte)'@';
usbHidPort1.SpecifiedDevice.SendData(writebuff);
}
else
{
MessageBox.Show("Device not found. Please reconnect USB to device use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

private void button5_Click(object sender, EventArgs e)


{
if (usbHidPort1.SpecifiedDevice != null)
{
writebuff[1] = (byte)'$';
usbHidPort1.SpecifiedDevice.SendData(writebuff);
}
else
{
MessageBox.Show("Device not found. Please reconnect USB to device use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

private void button8_Click(object sender, EventArgs e)


{
if (usbHidPort1.SpecifiedDevice != null)
{
writebuff[1] = (byte)'%';
usbHidPort1.SpecifiedDevice.SendData(writebuff);
}
else
{
MessageBox.Show("Device not found. Please reconnect USB to device use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

private void button7_Click(object sender, EventArgs e)


{
if (usbHidPort1.SpecifiedDevice != null)
{
writebuff[1] = (byte)'^';
usbHidPort1.SpecifiedDevice.SendData(writebuff);
}
else
{
MessageBox.Show("Device not found. Please reconnect USB to device use.",
"Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

-31-
}

private void label9_Click(object sender, EventArgs e)


{

private void textBox3_TextChanged(object sender, EventArgs e)


{

private void label5_Click(object sender, EventArgs e)


{

private void label11_Click(object sender, EventArgs e)


{

private void label12_Click(object sender, EventArgs e)


{

private void textBox5_TextChanged(object sender, EventArgs e)


{

private void label10_Click(object sender, EventArgs e)


{

private void button1_Click(object sender, EventArgs e)


{
DialogResult answer1 = MessageBox.Show("Bạn có muốn thoát chương trình không
? ", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (answer1 == DialogResult.Yes)
{
this.Close();
}
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)


{
DialogResult answer = MessageBox.Show("Bạn có muốn tắt chương trình không ?
", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (answer == DialogResult)
{
e.Cancel = true;
}
}
}
}

-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

4.1. Quy trình Lắp ráp và Test thực nghiệm


Viết quy trình Test theo từng bước: bước 1, bước 2, bước 3 …

4.2. Lắp ráp mạch thực tế


Một hình ảnh chụp bo mạch sau khi đã lắp ráp xong hoàn thiện
Một hoặc hai hình ảnh có các thành viên đang thao tác trên Testboard
Một hình ảnh chụp kết quả khi bo giao tiếp được với VS C#.

4.3. Khả năng cân chỉnh bo mạch


Trình bày + hình ảnh lỗi khi thao tác lắp ráp và Test.
Trình bày cách khắc phục, xử lý lỗi đó.

-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.

- Khả năng áp dụng trong thực tế như thế nào?

- 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.

- Đề xuất và kiến nghị cho bài thực hành.

- 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-

You might also like