Professional Documents
Culture Documents
THỰC TẬP CƠ SỞ VIETTEL TUẦN 1
THỰC TẬP CƠ SỞ VIETTEL TUẦN 1
Buổi 1_12/5/2022: Tìm hiểu datasheet của arduino UNO R3 và các chuẩn giao tiếp quan
trọng
I. Tìm hiểu về vi điều khiển Atmega328P
ATmega328P là một bộ vi điều khiển tiên tiến và nhiều tính năng. Nó là một trong
những vi điều khiển nổi tiếng của Atmel vì nó được sử dụng trong bo mạch arduino
UNO. Nó là một bộ vi điều khiển thuộc họ vi điều khiển megaMVR của Atmel.
1. Đặc tính / Thông số kỹ thuật của ATmega328P
2. Sơ đồ chân
STT
Mô tả Chức năng Mô tả chức năng
chân
Khi chân reset này ở mức thấp, bộ vi điều
1 PC6 reset
khiển và chương trình của nó sẽ được reset.
2 PD0 Chân kỹ thuật số (RX) Chân đầu vào cho giao tiếp nối tiếp
3 PD1 Chân kỹ thuật số (TX) Chân đầu ra cho giao tiếp nối tiếp
4 PD2 Chân kỹ thuật số Chân 4 được sử dụng làm ngắt ngoài 0
5 PD3 Chân kỹ thuật số (PWM) Chân 5 được sử dụng làm ngắt ngoài 1
Chân 6 được sử dụng cho nguồn bộ đếm
6 PD4 Chân kỹ thuật số
bên ngoài Timer0 (8 bit)
7 Vcc Điện áp dương Nguồn dương của hệ thống
8 GND Nối đất Nối đất của hệ thống
Chân này nối với một châncủa bộ dao động
9 XTAL Dao động tinh thể tinh thể để cung cấp xung nhịp bên ngoài
cho chip
Chân này nối với chân còn lại của bộ dao
10 XTAL Dao động tinh thể động tinh thể để cung cấp xung nhịp bên
ngoài cho chip
Chân 11 được sử dụng cho nguồn bộ đếm
11 PD5 Chân kỹ thuật số (PWM)
bên ngoài Timer1(16 bit)
12 PD6 Chân kỹ thuật số (PWM) Bộ so sánh analog dương i / ps
13 PD7 Chân kỹ thuật số Bộ so sánh analog âm i / ps
14 PB0 Chân kỹ thuật số Nguồn đầu vào bộ đếm hoặc bộ hẹn giờ
15 PB1 Chân kỹ thuật số(PWM) Bộ đếm hoặc bộ hẹn giờ so sánh khớp A
Chân này hoạt động như lựa chọn slave i /
16 PB2 Chân kỹ thuật số (PWM)
p.
Chân này được sử dụng làm đầu ra dữ liệu
17 PB3 Chân kỹ thuật số (PWM)
master và đầu vào dữ liệu slave cho SPI.
Chân này hoạt động như một đầu vào xung
18 PB4 Chân kỹ thuật số
nhịp master và đầu ra xung nhịp slave.
Chân này hoạt động như một đầu ra xung
19 PB5 Chân kỹ thuật số nhịp master và đầu vào xung nhịp slave
cho SPI.
20 AVcc Điện áp dương Điện áp dương cho ADC (nguồn)
Điện áp tham chiếu analog cho ADC (Bộ
21 AREF Tham chiếu analog
chuyển đổi analog sang kỹ thuật số)
22 GND Nối đất Nối đất của hệ thống
23 PC0 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 0
24 PC1 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 1
25 PC2 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 2
26 PC3 Đầu vào analog Đầu vào analog giá trị kỹ thuật số kênh 3
Đầu vào analog giá trị kỹ thuật số kênh 4.
27 PC4 Đầu vào analog Chân này cũng có thể được sử dụng làm
kết nối giao diện nối tiếp cho dữ liệu.
Đầu vào analog giá trị kỹ thuật số kênh 5.
28 PC5 Đầu vào analog Chân này cũng được sử dụng như dòng
xung nhịp giao diện nối tiếp.
Chân này hoạt động như lựa chọn slave i /
16 PB2 Chân kỹ thuật số (PWM)
p.
3. Bổ sung
3.1. Cấu trúc hàm ngắt trong arduino (Chân 4 và 5)
attachInterrupt(thứ tự ngắt, tên chương trình con thực hiện ngắt, chế độ ngắt)
Thứ tự ngắt: có kiểu (int) (1/0)
Tên chương trình con thực hiện ngắt: khai báo một chương trình con, để khi sự kiện ngắt
xảy ra thì sẽ thực hiện chương trình con đó
Chế độ ngắt: khai báo kiểu ngắt, có 4 kiểu ngắt
+ LOW: ngắt mức thấp(thực hiện chương trình ngắt khi chương trình ngắt ở mức thấp
0V)
+ CHANGE: Khi chân ngắt có sự thay đổi, chương trình ngắt sẽ được thực hiện
+ RISING: Ngắt cạnh lên, thực hiện chương trình ngắt khi chân ngắt từ mức thấp lên
mức cao
+ FALLING: Ngắt cạnh lên, thực hiện chương trình ngắt khi chân ngắt từ mức mức cao
xuống mức thấp
detachInterrupt(pin): Tắt chương trình ngắt
SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao (Master-Slave:
trong đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves được điều
khiển bởi Master )
SPI là một cách truyền song công toàn phần (full duplex: tại cùng một thời điểm quá
trình truyền và nhận có thể xảy ra đồng thời).
SPI còn được gọi là chuẩn truyền thông “4 dây”, bao gồm 4 đường giao tiếp:
SCK (Serial Clock): Xung giữ nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền đồng bộ
nên cần 1 đường giữ nhịp, mỗi nhịp trên chân SCK báo 1 bit dữ liệu đến hoặc đi. Sự tồn
tại của chân SCK giúp quá trình tuyền ít bị lỗi và vì thế tốc độ truyền của SPI có thể đạt
rất cao
DÒNG ĐỒNG BỘ
MISO (Master Input Slave Output)/ MOSI (Master Ouput Slave Input)
MISO của Master và các Slaves được nối trực tiếp với nhau..
SS (Slave Select): SS là đường chọn Slave cần giao tiếp, trên các chip Slave đường SS
sẽ ở mức cao khi không làm việc. Nếu chip Master kéo đường SS của một Slave nào đó
xuống mức thấp thì việc giao tiếp sẽ xảy ra giữa Master và Slave đó. Chỉ có 1 đường SS
trên mỗi Slave nhưng có thể có nhiều đường điều khiển SS trên Master, tùy thuộc vào
thiết kế của người dùng.
Đối với arduino UNO R3, các chân giao tiếp theo đúng chuẩn SPI là: SS-10, MOSI-11,
MISO-12, SCK-13. Chúng ta có thể kiểm soát 1 hoặc nhiều thiết bị SPI.
Dữ liệu được truyền qua lại dữa 2 đường MISO và MOSI. Điều này chỉ thực hiện được
khi Dòng SS được thiết lập ở mức thấp LOW. Nói cách khác, để giao tiếp với một thiết bị
SPI chúng ta cần thiết lập các dòng SS với thiết bị ở mức thấp LOW, sau đó giao tiếp với
nó, sau đó thiết lập các dòng SS trở lại mức cao HIGH.
Sử dụng bất kỳ một chân digital nào trên arduino để cho dòng SS để giao tiếp với nhiều
thiết bị SPI cùng lúc
Sử dụng thư viện SPI. có sẵn trong Arduino IDE (#include “SPI.h”)
Trong void setup (), khai báo pin(s) để sử dụng cho dòng SS và cài đặt chúng ở dạng
output (VD: pinMode(ss, OUTPUT);)
Kích hoạt giao tiếp SPI (VD: SPI.begin();)
Xác định cách thức truyền dữ liệu: SPI.setBitOrder(MSBFIRST);
SPI.setBitOrder(LSBFIRST);
Đưa dòng SS về mức thấp, gửi dữ liệu và đưa về mức cao
digitalWrite(SS, LOW);
SPI.Tranfer(value);
digitalWrite(SS, LOW);
Thư viện trog chương trình để sử dụng chức năng giao tiếp SPI
SPI.begin(): khởi tạo bus SPI và đặt chân SCK và MOSI thành LOW, chân SS thành
HIGH.
SPI.transfer(val): được sử dụng để giao tiếp đồng thời giữa các thiết bị Master và Slave.
SPI.attachInterrupt(handler): được sử dụng để nhận dữ liệu từ master trong slave và
được gọi trong slave.
SPI.setClockDivider(divider): thiết lập bộ chia xung nhịp SPI phù hợp với xung nhịp hệ
thống.
Buổi 2_13/5/2022: Giao tiếp SPI của arduino với các thiết bị
A. Giao tiếp SPI giữa 2 arduino bật tắt LED
Để thực hiện giao tiếp giữa 2 arduino, cần quy định cấu hình của 1 arduino làm master
và 1 arduino còn lại làm slave. Master sẽ truyền đi tín hiệu nếu người dùng nhấn nút nhấn
được kết nối với D2 của arduino SPI Slave Arduino nhận dữ liệu này và dựa trên dữ liệu
nhận được, đưa ra quyết định bật hoặc tắt đèn LED được kết nối với chân D4 của
Arduino.
Trước tiên, cần xác định được mã của thiết bị Master arduino SPI (Arduino 1)
1. Khai báo: Bao gồm việc sử dụng thư viện SPI và xác định các biến khác nhau. Các
biến push là các chân I/O kỹ thuật số Arduino nơi nút nhấn sẽ được kết nối và tùy thuộc
vào trạng thái của nó, dữ liệu sẽ được truyền đến slave. Biến LED là chân Arduino dựa
trên dữ liệu nhận được từ trạng thái đầu ra của slave sẽ được hiển thị.
#include<SPI.h>
#define push 2;
#define LED 4;
int x, value;
2. Thiết lập thiết bị
Serial.begin(x); // xuất một số thông tin từ Arduino ra màn hình máy tính hoặc có một
ứng dụng đang chạy trên máy tính sẽ mong đợi dữ liệu từ Arduino qua một cổng nối tiếp.
Hàm serial.begin() nằm bên trong hàm setup(). Tốc độ truyền x và tốc độ truyền được đặt
trên thiết bị nhận cần phải khớp với nhau để giao tiếp nối tiếp hoạt động.
pinMode(push, INPUT);
pinMode(LED, OUTPUT);
SPI.begin();
SPI. setClockDivider (SPI_CLOCK_DIV8);
DigitalWrite(SS, HIGH);// Xuất tín hiệu ra các chân digital
3. Thực hiện chương trình
Thao tác thực tế gửi và nhận lệnh
byte m_send, m_receive; // Khởi tạo 2 biến gửi và nhận tín hiệu
Value = digitalRead(push); // Đọc giá trị từ chân push HIGH/LOW và lưu vào biến
value
if(value == HIGH)
{
x=1;
}
else
{
x=0; }
digitalWrite(SS, LOW); // m_send = x;
m_receive= SPI.tranfer(m_send);
if(m_receive==1) // Tín hiệu nhận ở mức cao
{
digitalWrite(LED, HIGH); // Xuất tín hiệu mức cao ra chân LED
}
else
{
digitalWrite(LED, LOW); // Xuất tín hiệu mức thấp ra chân LED
}
delay(s);} // Hàm dừng chương trình trong khoảng thời gian s giây, không có giá trị
trả về
}
else
{
x=0;
}