Vi Dieu Khien Pic PDF

You might also like

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

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CƠ KHÍ
BỘ MÔN CƠ ĐIỆN TỬ

KỸ THUẬT
VI ĐIỀU KHIỂN PIC
Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
TS. Đặng
del Duomo Phước Vinh
di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
Email: dangphuocvinh@gmail.com
Phone: 0908 217 415
2
Nội dung

1. Giới thiệu chung về vi điều khiển PIC16F877A


2. Cấu trúc phần cứng
3. Tập lệnh, chỉ thị tiền xử lý
4. Bộ định thời
5. Hoạt động ngắt
6. Bộ chuyển đổi ADC
7. Giao tiếp nối tiếp

TS. Đặng Phước Vinh Khoa Cơ khí


3
Thuyết trình

1. Chia lớp thành 10 nhóm

2. Báo cáo + Thuyết minh + datasheet

TS. Đặng Phước Vinh Khoa Cơ khí


4
Các chủ đề
1. Led 7 đoạn: Anode/Catode, 1÷4 Led, không/dùng IC giải mã
2. Hiển thị LCD
3. Nút nhấn và Ma trận phím
4. EEPROM: khóa điện tử
5. Đồng hồ thể thao
6. Động cơ DC (quay, đảo chiều, điều khiển tốc độ)
7. Động cơ bước
8. Cảm biến
9. Lịch vạn niên (sử dụng IC thời gian thực qua giao tiếp I2C)
10.Giao tiếp với máy tính dùng Visual Studio/Matlab vẽ đồ thị
TS. từ cảm
Đặng biến
Phước Vinh Khoa Cơ khí
5
Tài liệu tham khảo

1. Datasheet của PIC

2. CCS C Compiler

3. “Vi xử lý”. Nguyễn Đình Phú, Trường Đại học Sư phạm


Kỹ thuật TP. Hồ Chí Minh.
4. Các tài liệu bằng tiếng Anh
5. Các trang web liên quan
6. “Kỹ thuật vi điều khiển PIC”. Đặng Phước Vinh, Võ Như
Thành. NXB Xây dựng, 2019.

TS. Đặng Phước Vinh Khoa Cơ khí


6

TS. Đặng Phước Vinh Khoa Cơ khí


7

TS. Đặng Phước Vinh Khoa Cơ khí


CHƯƠNG 1

GIỚI THIỆU CHUNG


Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
9
Vi xử lý

✓ CPU cho các máy tính


✓ Không có RAM, ROM, I/O trên chip CPU
✓ Ví dụ: Intel’s x86, Motorola’s 680x0
BUS DỮ LIỆU

CỔNG
CPU CỔNG
RAM ROM TIMER NỐI
Vi xử lý I/O
TIẾP

TS. Đặng Phước Vinh


BUS ĐỊA CHỈ Khoa Cơ khí
10
Vi điều khiển

✓ Là máy tính mini


✓ Có RAM, ROM, I/O ports trên CPU chip
✓ Ví dụ: Intel’s 8051, Zilog’s Z80, & PIC 16X

CPU RAM ROM


tất cả bên trong 1 chip
Cổng
I/O Timer nối tiếp
Port

TS. Đặng Phước Vinh Khoa Cơ khí


Thạch anh Vi xử lý RAM 11

ADC Bộ nhớ
Thạch anh SPI
USART T0 T1 T2 RAM
0 – 20Mhz I2C SFR
(368 byte)
Thạch anh Truyền thông Bộ định thời
nội nối tiếp Bộ nhớ
chương trình
(8k)
CPU EEPROM
CCP1 , CCP2 (35 tập lệnh) (256 byte)
Bộ ADC
PWM
Khối Bộ nhớ
Khối CCP/ WDT
Vref ngắt
PWM
RESET

Cổng A Cổng B Cổng C Cổng D Cổng E Nguồn nuôi


2 – 5.5 VDC
Cổng xuất/nhập (25mA)

Vi điều khiển
TS. Đặng Phước Vinh Khoa Cơ khí
12
Vi xử lý & Vi điều khiển

Vi xử lý Vi điều khiển
CPU chip riêng biệt. RAM, ROM, I/O, CPU, RAM, ROM, I/O và Timer nằm
Timer nằm bên ngoài trên cùng 1 chip

Lượng ROM, RAM, I/O Ports tùy ý Cố định lượng ROM, RAM, I/O
Ports trên chip

Giá thành cao Thích hợp cho các ứng dụng:


▪ Giá cả thấp
▪ Năng lượng tiêu thụ thấp
▪ Không gian hạn chế

Đa năng, đa mục đích Đơn mục đích

TS. Đặng Phước Vinh Khoa Cơ khí


13
Các tiêu chí chọn vi điều khiển

1. Đáp ứng yêu cầu về nhiệm vụ và giá thành thi công


✓ Tốc độ, lượng bộ nhớ, cổng I/O, timers, kích cỡ, đóng gói,
năng lượng tiêu thụ
✓ Dễ nâng cấp
✓ Giá tiền

2. Các công cụ phát triển phần mềm


✓ Bộ sửa lỗi, trình dịch C, mô phỏng, hỗ trợ kỹ thuật

3. Thị trường cung cấp sản phẩm tin cậy

TS. Đặng Phước Vinh Khoa Cơ khí


14
Vi điều khiển PIC

✓ PIC được sản xuất bởi công ty


Microchip Technology

✓ "Programmable Intelligent
Computer" là một sản phẩm của
hãng General Instruments

✓ Dòng sản phẩm đầu tiên là


PIC1650

✓ PIC 8-bit được phát triển vào


khoảng năm 1975
TS. Đặng Phước Vinh Khoa Cơ khí
15
Vi điều khiển PIC

✓ Có thể tìm mua dể dàng tại thị trường Việt Nam

✓ Giá thành không quá cao

✓ Có đầy đủ tính năng của một VĐK khi hoạt động độc lập

✓ Số lượng người dùng lớn → số lượng tài liệu lớn, mã


nguồn mở, dể dàng trao đổi học tập, thảo luận

✓ Sự hổ trợ của nhà sản xuất về trình biên dịch, các công cụ
lập trình, nạp chương trình…

✓ Các tính năng đa dạng của VĐK liên tục được cập nhật
TS. Đặng Phước Vinh Khoa Cơ khí
16
Các loại chip PIC

Các ký hiệu của vi điều khiển PIC:


PIC12xxxx: độ dài lệnh 12 bit
PIC16xxxx: độ dài lệnh 14 bit
PIC18xxxx: độ dài lệnh 16 bit

C: PIC có bộ nhớ chương trình là EPROM (chỉ có 16C84 là EEPROM)


F: PIC có bộ nhớ chương trình là flash
LF: PIC có bộ nhớ chương trình là flash hoạt động ở điện áp thấp
LV: tương tự như LF, đây là tín hiệu cũ

✓ Bên cạnh đó một số vi điều khiển có ký hiệu xxFxxx thì bộ nhớ chương trình
là EEPROM, nếu có thêm chữ A ở cuối thì bộ nhớ chương trình là flash (ví dụ
PIC16F877 là EEPROM, còn PIC16F877A là flash).
✓ Ở Việt Nam phổ biến nhất là các họ vi điều khiển PIC do Microchip sản xuất

TS. Đặng Phước Vinh Khoa Cơ khí


17
Các loại bộ nhớ

ROM (Read-Only Memory)


▪ Thông tin trên ROM vẫn được duy trì dù nguồn điện cấp
không còn.
▪ Nó dùng cho lưu giữ mã chương trình điều hành và dữ liệu
mặc định của hệ thống
▪ Cho phép chỉ đọc dữ liệu từ chúng, và chỉ cho phép ghi dữ
liệu một lần

EPROM (Erasable Programmable Read-Only Memory)


▪ Thông tin trên bộ nhớ vẫn được duy trì dù nguồn điện cấp
không còn
▪ Phải dùng thiết bị chuyên dụng để xóa bộ nhớ. Xóa toàn bộ
TS. Đặng Phước Vinh Khoa Cơ khí
18
Các loại bộ nhớ

EEPROM (Electrically Erasable Programmable Read-


Only Memory)
▪ Có khả năng xoá được bằng phương pháp lập trình mà
chúng không cần đến các thiết bị chuyên dụng như các
thế hệ trước của nó

Bộ nhớ Flash
▪ Là một loại EEPROM, đọc/ghi bằng điện và không mất
dữ liệu khi ngừng cung cấp điện
▪ Cho phép đọc/ghi từng khối nhỏ hoặc theo từ của máy
TS. Đặng Phước Vinh Khoa Cơ khí
19
Các loại bộ nhớ
Mất dữ Giá
Xoá
liệu Khả năng thành
Loại Cỡ xoá ? nhiều Tốc độ ?
khi mất ghi ? (theo
lần ?
điện? byte)
Không sẵn Không sẵn
ROM Không Không Nhanh Không đắt
sàng sàng
Có, nhưng
EPROM cần thiết bị
Không Toàn bộ Giới hạn Nhanh Vừa phải
chuyên
dụng
Nhanh cho
đọc
EEPROM Không Có Byte Giới hạn Đắt
Chậm cho
xoá và ghi
Nhanh cho
đọc
Flash Không Có Sector Giới hạn Vừa phải
Chậm cho
TS. Đặng Phước Vinh xoá và
Khoa Cơghi
khí
20
Trình biên dịch

Ngôn ngữ lập trình cho vi điều khiển PIC có 2 loại:

✓ Ngôn ngữ lập trình cấp thấp - Hợp ngữ: có phần


mềm MPLAB

✓ Ngôn ngữ lập trình bậc cao: có nhiều loại, được


phát triển theo ngôn ngữ C, như: CCS, HTPIC, PIC
BASIC v.v

TS. Đặng Phước Vinh Khoa Cơ khí


21
Trình biên dịch hợp ngữ

✓ Được cung cấp miễn phí bởi nhà sản xuất Microchip

✓ Giúp người học và lập trình hiểu rõ hơn về cấu trúc


bên trong của vi điều khiển PIC

✓ Tối ưu hóa bộ nhớ chương trình.

✓ Tuy nhiên, nhìn chung phương pháp tiếp cận hợp


ngữ là khó và khả năng phát triển ứng dụng là hạn
chế, mất thời gian.

TS. Đặng Phước Vinh Khoa Cơ khí


22
Trình biên dịch MPLAB

TS. Đặng Phước Vinh Khoa Cơ khí


23
Trình biên dịch CCS

✓ Kế thừa tất cả đặc điểm của ngôn ngữ C - là ngôn ngữ cơ


bản, quen thuộc mà sinh viên đã được đào tạo

✓ Xây dựng sẵn các hàm phục vụ cho việc sử dụng dễ


dàng các khối chức năng đặc biệt của Vi điều khiển PIC
như: ADC, PWM, RS232, SPI

✓ Có khả năng kết hợp với ngôn ngữ hợp ngữ, tạo sự mềm
dẻo trong phát triển ứng dụng

✓ Khả năng phát triển, nâng cấp ứng dụng là dễ dàng

✓ Ngày càng được cập nhật với nhiều tính năng ưu việt và
TS. hiệu quảVinh
Đặng Phước hơn. Khoa Cơ khí
24
Trình biên dịch CCS

TS. Đặng Phước Vinh Khoa Cơ khí


25
PICkit 2

TS. Đặng Phước Vinh Khoa Cơ khí


26
PICkit 3

TS. Đặng Phước Vinh Khoa Cơ khí


27
Phần mềm mô phỏng Proteus

TS. Đặng Phước Vinh Khoa Cơ khí


28
Mạch thực hành

PICkit 2

Giao tiếp
máy tính

Điều khiển
động cơ
EEPROM

Nguồn
Chân nạp
TS. Đặng Phước Vinh Khoa Cơ khí
CHƯƠNG 2
CẤU TRÚC PHẦN CỨNG
Firma convenzione

PIC 16F877A
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
30
Tổng quan về PIC16F877A

✓ Thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ


dài 14 bit
✓ Tất cả các lệnh là 1 chu kỳ máy, ngoại trừ chương trình
con là 2 chu kỳ máy.
✓ Một chu kỳ lệnh của vi điều khiển bao gồm 4 xung
clock
▪Sử dụng thạch anh 4MHz → xung lệnh có tần số 1MHz
(1µs)
✓ Bộ nhớ chương trình flash với dung lượng 8K x 14 bit,
với khả năng ghi/xóa 100.000 lần

TS. Đặng Phước Vinh Khoa Cơ khí


31
Tổng quan về PIC16F877A

✓ Bộ nhớ dữ liệu RAM: 368 byte

✓ Bộ nhớ EEPROM với dung lượng 256 byte, với khả


năng ghi/xóa 1.000.000 lần. Có thể lưu trữ dữ liệu hơn
40 năm

✓ Nguồn sử dụng: 5VDC

✓ Chế độ sleep

✓ Có 5 ports I/0 (A, B, C, D, E) với 33 chân

TS. Đặng Phước Vinh Khoa Cơ khí


32
Sơ đồ chân họ PIC16F87XA

TS. Đặng Phước Vinh Khoa Cơ khí


33

TS. Đặng Phước Vinh Khoa Cơ khí


34

TS. Đặng Phước Vinh Khoa Cơ khí


35
Sơ đồ chân họ PIC16F87XA

Reset

Port A Port B

Port E Power
Power
Port D
Oscillator
Port C Port C

Port D
TS. Đặng Phước Vinh Khoa Cơ khí
36
Giới hạn hoạt động

TS. Đặng Phước Vinh Khoa Cơ khí


37
Chức năng các chân

Chân MCRL/Vpp (1)


✓ MCRL: là ngõ vào
reset tích cực ở mức
thấp
✓ Vpp: khi lập trình cho
PIC thì đóng vai trò là
ngõ vào nhận điện áp
lập trình

TS. Đặng Phước Vinh Khoa Cơ khí


38
Chức năng các chân

Chân RA0(1)/AN0(1) (2, 3)


✓ RA0(1): xuất/nhập số
✓ AN0(1): ngõ vào tương tự của kênh
thứ 0 (1)

Chân RA2/AN2/VREF-/CVREF (4)


✓ RA2: xuất/nhập số
✓ AN2: ngõ vào tương tự của kênh thứ
2
✓ VREF-: ngõ vào điện áp chuẩn(thấp)
của bộ A/D
✓ CVREF: điện áp tham chiếu VREF ngõ
ra bộ so sánh
TS. Đặng Phước Vinh Khoa Cơ khí
39
Chức năng các chân
Chân RA3/AN3/VREF+ (5)
✓ RA3: xuất/nhập số
✓ AN3: ngõ vào tương tự của kênh thứ 3
✓ VREF+: ngõ vào điện áp chuẩn(cao)
của bộ A/D

Chân RA4/T0CKI/C1OUT (6)


✓ RA4: xuất/nhập số
✓ T0CKI: ngõ vào xung clock bên ngoài
cho Timer 0
✓ C1OUT: ngõ ra bộ so sánh 1 Khoa Cơ khí
TS. Đặng Phước Vinh
40
Chức năng các chân
Chân RA5/AN4/SS/C2OUT (7)
✓ RA5: xuất/nhập số
✓ AN4: ngõ vào tương tự của kênh thứ 4
✓ SS: ngõ vào chọn lựa SPI phụ
✓ C2OUT: ngõ ra bộ so sánh 2

Chân RE0/RD/AN5 (8)


✓ RE0: xuất/nhập số
✓ RD: điều khiển đọc port slave song
song
✓TS.AN5: ngõ Vinh
Đặng Phước vào tương tự của kênh thứ 5 Khoa Cơ khí
41
Chức năng các chân
Chân RE1/WR/AN6 (9)
✓ RE1: xuất/nhập số
✓ WR: điều khiển ghi port slave song
song
✓ AN6: ngõ vào tương tự của kênh thứ 6

Chân RE2/CS/AN7 (10)


✓ RE2: xuất/nhập số
✓ CS: chip chọn lựa điều khiển port slave
song song
✓TS.AN7: ngõ vào tương tự của kênh thứ 7
Đặng Phước Vinh Khoa Cơ khí
42
Chức năng các chân

VDD (11, 32)


VSS (12, 31)
→ là các chân nguồn
của PIC

TS. Đặng Phước Vinh Khoa Cơ khí


43
Mạch nguồn

TS. Đặng Phước Vinh Khoa Cơ khí


44
Cầu Diode

1 3

2 4
TS. Đặng Phước Vinh Khoa Cơ khí
45
Chức năng các chân
Chân OSC1/CLKIN (13)
Chân OSC2/CLKOUT (14)
→Là các chân nối với thạch anh để tạo ra xung dao động cho
PIC
→Thêm 2 tụ lọc C1, C2 để xung tạo ra từ thạch anh ổn định
→Giá trị của tụ dựa theo datasheet của PIC

TS. Đặng Phước Vinh Khoa Cơ khí


46
Chức năng các chân
Chân RC0/T1OSO/T1CKI (15)
✓ RC0: xuất/nhập số
✓ T1OSO: ngõ ra bộ dao động Timer 1
✓ T1CKI: ngõ vào xung clock bên ngoài
Timer 1

Chân RC1/T1OSI/CCP2 (16)


✓ RC1: xuất/nhập số
✓ T1OSI: ngõ vào bộ dao động Timer 1
✓ CCP2: ngõ vào Capture 2, ngõ ra
Compare
TS. Đặng Phước2, ngõ ra PWM 2
Vinh Khoa Cơ khí
47
Chức năng các chân
Chân RC1/T1OSI/CCP2 (16)
✓ RC1: xuất/nhập số
✓ T1OSI: ngõ vào bộ dao động Timer 1
✓ CCP2: ngõ vào Capture 2, ngõ ra
Compare 2, ngõ ra PWM 2

Chân RC2/CCP1 (17)


✓ RC2: xuất/nhập số
✓ CCP1: ngõ vào Capture 1, ngõ ra
Compare 1, ngõ ra PWM1
TS. Đặng Phước Vinh Khoa Cơ khí
48
Chức năng các chân
Chân RC3/SCK/SCL (18)
✓ RC3: xuất/nhập số
✓ SCK: ngõ vào xung clock nối tiếp
đồng bộ/ngõ ra của chế độ SPI
✓ SCL: ngõ vào xung clock nối tiếp
đồng bộ/ngõ ra chế độ I2C

Chân RC4/SDI/SDA (23)


✓ RC4: xuất/nhập số
✓ SDI: dữ liệu vào SPI
✓TS.SDA: xuất/nhập
Đặng Phước Vinh dữ liệu I2C Khoa Cơ khí
49
Chức năng các chân
Chân RDx/PSPx (19, 20, 21, 22, 27-30)
✓ RDx: xuất/nhập số
✓ PSPx: dữ liệu port slave song song

TS. Đặng Phước Vinh Khoa Cơ khí


50
Chức năng các chân

Chân RC6/TX/CK (25) Chân RC7/RX/DT (26)


✓ RC6: xuất/nhập số ✓ RC7: xuất/nhập số
✓ TX: truyền bất đồng bộ USART ✓ RX: nhận bất đồng bộ USART
✓ CK: xung đồng bộ USART ✓ DT: dữ liệu đồng bộ USART

Chân RC5/SDO (24)


✓ RC5: xuất/nhập số
✓ SDO: dữ liệu ra SPI

TS. Đặng Phước Vinh Khoa Cơ khí


51
Chức năng các chân
Chân RB0/INT (33)
✓ RB0: xuất/nhập số
✓ INT: ngõ vào nhận tín hiệu ngắt ngoài

Chân RB1, RB2, RB4, RB5 (34, 35, 37, 38)


✓ Xuất nhập số

Chân RB3/PGM (36)


✓ RB3: xuất/nhập số
✓ PGM: chân cho phép lập trình điện áp thấp
ICSP
TS. Đặng Phước Vinh Khoa Cơ khí
52
Chức năng các chân

Chân RB6/PGC (39)


✓ RB6: xuất/nhập số
✓ PGC: mạch gỡ rối và xung clock lập trình
ICSP

Chân RB7/PGD (40)


✓ RB7: xuất/nhập số
✓ PGC: mạch gỡ rối và dữ liệu lập trình
ICSP

TS. Đặng Phước Vinh Khoa Cơ khí


53
Các đặc tính ngoại vi
✓ 3 bộ định thời
▪ Timer 0: timer/counter 8 bit, có bộ chia trước
▪ Timer 1: timer/counter 16 bit, có bộ chia trước, có thể
đếm khi CPU ở chế độ sleep với nguồn xung từ thạch
anh hoặc nguồn xung bên ngoài
▪ Timer 2: timer/counter 8 bit, có bộ chia trước và
postscale

✓ 2 bộ CCP (Capture/Compare/PWM)
▪ Capture có độ rộng 16 bit, độ phân giải 12.5 ns
▪ Compare có độ rộng 16 bit, độ phân giải 200ns
▪ Độ phân giải lớn nhất của PWM là 10 bit
TS. Đặng Phước Vinh Khoa Cơ khí
54
Các đặc tính ngoại vi

✓ Các chuẩn giao tiếp nối tiếp MSSP


▪ Giao tiếp SPI
▪ Giao tiếp I2C

✓ Chuẩn giao tiếp nối tiếp USART

✓ Chuẩn giao tiếp song song PSP

✓ Bộ chuyển đổi ADC với 8 kênh có độ phân giải 10 bit

✓ Có khả năng hoạt động với nhiều dạng Oscillator khác


nhau
TS. Đặng Phước Vinh Khoa Cơ khí
55
Sơ đồ khối

TS. Đặng Phước Vinh Khoa Cơ khí


56
Bộ nhớ chương trình

▪ Là bộ nhớ flash, dung lượng


bộ nhớ 8K word (1 word =
14 bit)
▪ Được phân thành nhiều trang
(từ page 0 đến page 3).
▪ Như vậy bộ nhớ chương
trình có khả năng chứa được
8*1024 = 8192 lệnh (vì một
lệnh sau khi mã hóa sẽ có
dung lượng 1 word (14 bit).

TS. Đặng Phước Vinh Khoa Cơ khí


57
Bộ nhớ chương trình

▪ Khi vi điều khiển được reset,


bộ đếm chương trình sẽ chỉ
đến địa chỉ 0000h (Reset
vector).
▪ Khi có ngắt xảy ra, bộ đếm
chương trình sẽ chỉ đến địa
chỉ 0004h (Interrupt vector).
▪ Có bộ đếm chương trình 13bit
có thể quản lý bộ nhớ chương
trình có dung lượng 8K word

TS. Đặng Phước Vinh Khoa Cơ khí


58
Bộ nhớ dữ liệu
✓Là bộ nhớ EEPROM
✓Được chia ra làm 4
bank.
✓Mỗi bank có dung
lượng 128 byte
▪ Thanh ghi có chức năng
đặc biệt SFR (Special
Function Register) nằm
ở các vùng địa chỉ thấp
▪ Thanh ghi mục đích
chung GPR (General
Purpose Register) nằm
ở vùng địa chỉ còn lại
TS. Đặng Phước Vinh Khoa Cơ khí
trong bank
59
Bộ nhớ dữ liệu

✓Các thanh ghi SFR


thường xuyên được
sử dụng (ví dụ như
thanh ghi STATUS) sẽ
được đặt ở tất cả các
bank để giúp thuận
tiện trong quá trình
truy xuất và làm giảm
bớt lệnh của chương
trình

TS. Đặng Phước Vinh Khoa Cơ khí


60
Xuất nhập I/O
1 0 0 1 0 1 1 0 TRIS

Output
Output

Output

Output
CPU Input

Input
Input
Input
1 1 0 1 0 1 0 1 PORT

Port xuất nhập: 2 chiều


PORT: trạng thái của port TRIS = 1: input
TRIS: thanh ghi định hướng dữ liệu TRIS = 0: output
TS. Đặng Phước Vinh Khoa Cơ khí
61

TS. Đặng Phước Vinh Khoa Cơ khí


62
Port A
✓ Là port 2 chiều. Chỉ có 6 bit: RA0 – RA5
✓ Thanh ghi định hướng dữ liệu: TRISA.
0: OUTPUT, 1: INPUT.
✓ Chân RA4 được đa hợp với ngõ vào
xung clock của module Timer0:
RA4/T0CKI
✓ Các chân còn lại được đa hợp với các
ngõ vào tương tự, ngõ vào tương tự
VREF cho các bộ chuyển đổi A/D và các
bộ so sánh
✓ Khi sử dụng ngõ vào tương tự → đảm
bảo rằng thanh ghi TRISA được duy trì
TS. ở mức
Đặng 1 Vinh
Phước Khoa Cơ khí
63
Các thanh ghi liên kết với Port A

TS. Đặng Phước Vinh Khoa Cơ khí


64
Port B
✓ Là port 2 chiều. Có 8 bit: RB0 – RB7
✓ Thanh ghi định hướng dữ liệu: TRISB.
0: OUTPUT, 1: INPUT.
✓ Mỗi chân của port B có điện trở nội kéo lên.
Bit điều khiển là RBPU (OPTION_REG<7>)
✓ RBPU = 0 → mở các điện trở kéo lên
✓ Port B được thiết lập là ngõ ra hoặc lúc bị
reset → tắt chức năng điện trở kéo lên
✓ Chân RB0/INT được đa hợp ngắt ngoài
✓ RB4 – RB7 có cấu trúc ngắt thay đổi (chỉ
khi được thiết lập là input)

TS.RBPU
Đặng Phước Vinh
INTEDG T0CS T0SE PSA PS2 KhoaPS1
Cơ khí PS0
65
Các thanh ghi liên kết với Port B

TS. Đặng Phước Vinh Khoa Cơ khí


66
Các thanh ghi liên kết với Port B

RBPU = 0 → mở các điện trở kéo lên


Trong CCS: port_b_pullups(1)
OPTION_REG

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

TS. Đặng Phước Vinh Khoa Cơ khí


67
Port C
✓ Là port 2 chiều. Có 8
bit: RC0 – RC7
✓ Thanh ghi định
hướng dữ liệu:
TRISC.
0: OUTPUT, 1: INPUT.
✓ Chân RC3-RC4 được
đa hợp với giao tiếp
SPI và I2C
✓ RC6-RC7 được đa
hợp với giao tiếp nối
tiếp USART
TS. Đặng Phước Vinh Khoa Cơ khí
68
Các thanh ghi liên kết với Port C

TS. Đặng Phước Vinh Khoa Cơ khí


69
Port D

✓ Là port 2 chiều. Có
8 bit: RD0 – RD7
✓ Thanh ghi định
hướng dữ liệu:
TRISD.
0: OUTPUT
1: INPUT.
✓ Port D được đa
hợp với giao tiếp
song song

TS. Đặng Phước Vinh Khoa Cơ khí


70
Các thanh ghi liên kết với Port D

TS. Đặng Phước Vinh Khoa Cơ khí


71
Port E
✓ Là port 2 chiều. Có 3 bit: RE0 –
RE2
✓ Thanh ghi định hướng dữ liệu:
TRISE.
0: OUTPUT, 1: INPUT.
✓ Các chân ở Port E được đa hợp
với ngõ vào tương tự.
✓ Phải đảm bảo các chân được
cấu hình là ngõ vào khi sử
dụng ngõ vào tương tự
TS. Đặng Phước Vinh Khoa Cơ khí
72
Các thanh ghi liên kết với Port E

TS. Đặng Phước Vinh Khoa Cơ khí


CHƯƠNG 3
TẬP LỆNH
& Firma convenzione
Politecnico di Milano e Veneranda Fabbrica

CHỈ THỊ TIỀN XỬ LÝ


del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
74
Ký hiệu của lưu đồ thuật toán
Hình dạng (Symbol) Hành động (Activity)
Dữ liệu vào (Input)

Xử lý (Process)

Dữ liệu ra (Output)

Quyết định (Decision), sử dụng điều kiện

Luồng xử lý (Flow lines)

Gọi CT con, hàm… (Procedure, Function…)

Bắt đầu, kết thúc (Begin, End)

TS. Đặng Phước Vinh Điểm ghép nối (Connector)


Khoa Cơ khí
75
Lưu đồ thuật toán

TS. Đặng Phước Vinh Khoa Cơ khí


76
Khai báo biến
Cú pháp: <kiểu dữ liệu> <tên biến>
Ví dụ: int a, b, c;
Vị trí biến:
✓ Biến toàn cục
✓ Biến cục bộ
Ký hiệu Diễn giải Ví dụ
{} Bắt đầu và kết thúc hàm hay khối lệnh. void main() { }
; Kết thúc khai báo biến, một lệnh, một int a;
lời gọi hàm, hay khai báo nguyên mẫu void NhapMang(int a[]);
hàm.
// Chú thích (ghi chú) cho một dòng. Chỉ có //Nhap mang
tác dụng đối với người đọc chương void NhapMang(int a[]);
trình.
/* Tương tự như ký hiệu //, nhưng cho /* Dau tien nhap vao n.
*/ trường hợp nhiều dòng. Sau do nhap tung phan tu*/
TS. Đặng Phước Vinh Khoa Cơ khí
NhapMang(int a[], int &n);
77
Khai báo biến
Unsigned Signed
Kiểu Kích cỡ
(Không dấu) (Có dấu)
Số 1 bit = true
int1 hay 0 đến 1 Không có
false ( 0 hay 1)
Số nguyên 1 byte
int8 0 đến 255 -128 đến 127
( 8 bit)
int16 Số nguyên 16 bit 0 đến 65535 -32768 đến 32767
-2147483648 đến
int32 Số nguyên 32 bit 0 đến 4294967295 2147483647
0 đến -140737488355328 đến
int48 Số nguyên 48 bit 281474976710655 140737488355327
-9223372036854775808
int64 Số nguyên 64 bit Không Có đến
9223372036854775807
TS. Đặng Phước Vinh Khoa Cơ khí
float32 Số thực 32 bit -1.5 x 1045 đến 3.4 x 1038
78
Khai báo biến

Kiểu tiêu chuẩn của C Kiểu mặc định của trình biên dịch CCS
short int1
char unsigned int8
int int8
long int16
long long int32
float float32
double Không có

TS. Đặng Phước Vinh Khoa Cơ khí


Các phép toán 79

PHÉP TOÁN SỐ HỌC (TOÁN TỬ 2 NGÔI)


+ Cộng
- Trừ
* Nhân
/ Chia lấy phần nguyên
% Chia lấy phần dư
PHÉP TOÁN QUAN HỆ
> Lớn hơn
< Nhỏ hơn
>= Lớn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
== Bằng nhau
TS. Đặng Phước Vinh Khoa Cơ khí
!= Khác nhau
Các phép toán 80

PHÉP TOÁN LOGIC


! NOT
&& AND dùng để kiểm tra điều kiện
|| OR dùng để kiểm tra điều kiện
TOÁN TỬ TĂNG GIẢM (TOÁN TỬ 1 NGÔI)
++ Tăng 1 Nếu toán tử tăng giảm đặt trước thì tăng
-- Giảm 1 giảm trước rồi tính biểu thức hoặc ngược
lại.
PHÉP TOÁN THAO TÁC TRÊN BIT
& AND
| OR
^ XOR
<< Dịch trái
>> Dịch phải
TS. Đặng Phước Khoa Cơ khí
~ Lấy Vinh
phần bù theo bit
81
Dịch trái & dịch phải

TS. Đặng Phước Vinh Khoa Cơ khí


82
Toán tử biểu thức điều kiện
Đây là toán tử 3 ngôi (tác động lên 3 toán hạng), được ký hiệu: “?:”
Cú pháp: <biểu thức 1>?< biểu thức 2 >:< biểu thức 3 >
Biểu thức này cho ra kết quả là:
✓ biểu thức 2 nếu biểu thức 1 đúng
✓ biểu thức 3 nếu biểu thức 1 sai

Ví dụ:
int a = 10, b = 20;
Max = (a>b)?a:b; → max = b = 20
Min = (a<b)?a:b; → min = a = 10

TS. Đặng Phước Vinh Khoa Cơ khí


83
Toán tử chuyển kiểu

Dùng để chuyển một kiểu dữ liệu bất kỳ sang một kiểu dữ liệu
mong muốn
Cú pháp: <kiểu>biến

Ví dụ:
int a = 9, b = 2;
int c = a/b; →c=4
float d = (float)a/b; → d = 4.5

TS. Đặng Phước Vinh Khoa Cơ khí


84
Cấu trúc điều kiện – Lệnh if
Quyết định sẽ thực hiện hay không một lệnh/khối lệnh
if (biểu thức luận lý) if (biểu thức luận lý) if (b.thức luận lý 1)
{ { khối lệnh 1; } { khối lệnh 1; }
khối lệnh; else elseif (b.thức luận lý 2)
} { khối lệnh 2; } { khối lệnh 2; }

Vào Vào
elseif (b.thức luận lý n-1)
Sai Điều kiện
Sai { khối lệnh n-1; }
Điều kiện
Đúng Đúng else
Khối lệnh Khối lệnh 1 Khối lệnh 2 { khối lệnh n; }

Ra Ra
TS. Đặng Phước Vinh Khoa Cơ khí
85
Cấu trúc điều kiện – Lệnh switch
Tương tự như lệnh if; nhưng mềm dẻo, linh động hơn
switch (biểu thức) ✓ Biểu thức phải là kết quả có giá trị
{ nguyên (char, int, long…)
case giá trị 1: khối lệnh 1; ✓ Nếu khối lệnh từ 2 lệnh trở lên thì
break; đặt trong dấu { }
case giá trị 2: khối lệnh 2; ✓ Các từ khóa switch, case, break
break; phải viết bằng chữ thường
……………. ✓ Sau lệnh i, nếu không có lệnh
case giá trị n: khối lệnh n; break thì chương trình thực hiện
lệnh i+1. Nếu có thì thoát ra ngoài
break;
} ✓ Sau lệnh switch không có dấu ;

TS. Đặng Phước Vinh Khoa Cơ khí


86
Cấu trúc điều kiện – Lệnh switch
Vào

switch (biểu thức) Đúng


switch (biểu thức) Giá trị = 1? Lệnh/khối lệnh 1
{

case giá trị 1: khối lệnh 1; Sai break?

Không
break;
Đúng
Giá trị = 2? Lệnh/khối lệnh 2
case giá trị 2: khối lệnh 2;
break; break?

Sai
……………. Không
Đúng
case giá trị n: khối lệnh n; Giá trị = n? Lệnh/khối lệnh n

break; Có
break?
Sai
} Không

Ra

TS. Đặng Phước Vinh Khoa Cơ khí


87
Cấu trúc điều kiện – Lệnh switch
switch (biểu thức) ✓ Biểu thức phải là kết quả có giá trị nguyên
{ (char, int, long…)
case giá trị 1: khối lệnh 1; ✓ Nếu khối lệnh từ 2 lệnh trở lên thì đặt trong
dấu { }
break;
✓ Các từ khóa switch, case, break phải viết
case giá trị 2: khối lệnh 2;
bằng chữ thường
break;
✓ Sau lệnh i, nếu không có lệnh break thì
……………. chương trình thực hiện lệnh i+1. Nếu có thì
case giá trị n: khối lệnh n; thoát ra ngoài
break; ✓ Sau lệnh switch không có dấu ;
default: khối lệnh n+1; ✓ Nếu giá trị biểu thức không trùng với bất
break; cứ giá trị i nào thì lệnh tương ứng với từ
khóa default sẽ được thực hiện
}
TS. Đặng Phước Vinh Khoa Cơ khí
88
Cấu trúc điều kiện – Lệnh switch
Vào
switch (biểu thức)
Đúng
{ switch (biểu thức) Giá trị = 1? Lệnh/khối lệnh 1

case giá trị 1: khối lệnh 1; Có


Sai break?
break; Không
Đúng
case giá trị 2: khối lệnh 2; Giá trị = 2? Lệnh/khối lệnh 2

break; Có
break?
Sai
……………. Không
Đúng
case giá trị n: khối lệnh n; Giá trị = n? Lệnh/khối lệnh n

break; Có
break?
Sai
default: khối lệnh n+1; Không

break; default: Lệnh/khối


lệnh n+1
}
TS. Đặng Phước Vinh Khoa Cơ khí
Ra
89
Vòng lặp for #include <stdio.h>

int main()
{
for (g.trị bắt đầu ; điều kiện kết thúc ; thay đổi giá trị) int i;
{ for (i = 1; i <= 10; i++)
{
khối lệnh; printf("%-5d", i);
}
} }
Thay đổi biến điều khiển từ 1
đến 100, mỗi lần tăng 1:
✓ Nếu điều kiện để kết thúc vòng lặp không for(i = 1; i <=100; i++)
có → vòng lặp luôn lặp
Thay đổi biến điều khiển từ
✓ Để kết thúc vòng lặp → break; return; 100 đến 1, mỗi lần giảm 1:
for(i = 100; i >= 1; i--)
goto
Thay đổi biến điều khiển từ 7
✓ Trong thân for (khối lệnh) có thể chứa một đến 77, mỗi lần tăng 7:
hoặc nhiều cấu trúc điều khiển khác, vòng for(i = 7; i <= 77; i+=7)
lặp khác.
Thay đổi biến điều khiển từ 20
TS. Đặng Phước Vinh đến 2, mỗi
Khoa lần giảm 2:
Cơ khí
for(i = 20; i >= 2; i –= 2)
90
Vòng lặp while
while(biểu thức) ✓ Trước tiên biểu thức được kiểm tra.
✓ Nếu sai → thoát khỏi vòng lặp (khối lệnh chưa được
{ thực thi một lần nào.
✓ Nếu đúng → thực hiện khối lệnh + kiểm tra biểu thức.
khối lệnh; ✓ Khối lệnh có thể 1 hoặc nhiều lệnh.
✓ Nếu biểu thức là một hằng khác không thì nó luôn đúng
} và vòng lặp diễn ra vô hạn. Muốn thoát khỏi vòng lặp
while tùy ý có thể dùng các lệnh break, goto, return.

TS. Đặng Phước Vinh Khoa Cơ khí


91
Vòng lặp while, do...while
do Vào
{
khối lệnh;
} Đúng Khối lệnh
while (biểu thức)
✓ Trước tiên thực hiện khối lệnh.
Điều kiện?
✓ Kiểm tra biểu thức. Nếu sai →
thoát khỏi vòng lặp (khối lệnh Sai
được thực thi một lần.
Ra
✓ Nếu đúng → thực hiện khối lệnh.
TS. Đặng Phước Vinh Khoa Cơ khí
92
Một chương trình trong CCS
#include <16F877A.h> // các chỉ thị tiền xử lý
#device ADC=10
#use delay(clock = 4000000) // cần thiết
#FUSES NOWDT, NOPROTECT, NODEBUG, NOBROWNOUT
……
#use rs232(baud=9600, parity=N, xmit=PIN_C6, RCV=PIN_C6)//giao tiếp nối tiếp
#use i2c(Master , SDA=PIN_C3 , SCL=PIN_C4)

int a = 0, b = 1, c = 2; // các khai báo biến

#int_TIMER1{ // chương trình con ngắt


…}

void chuong_trinh_con() { // chương trình con


…}

void main()
TS. Đặng {… Vinh
Phước } Khoa Cơ khí
// chương trình chính
93
Các hàm trong CCS

1. Hàm không trả về giá trị void sang_led(led)


void <tên_hàm>(các tham số) {
{ output_high(led);
nội dung hàm; }
}

2. Hàm có giá trị trả về


<kiểu dữ liệu trả về> <tên_hàm> (tham int tinh_toan(int a, int b)
số) {
{ int z = a + b;
nội dung hàm; return z;
}
return giá trị trả về;
}

TS. Đặng Phước Vinh Khoa Cơ khí


94
Hàm delay trong CCS
✓ Để dùng hàm delay, cần có khai báo
▪ #use delay(clock = 4000000)

✓ delay_cycles(unsigned int8 X) → delay X chu kỳ lệnh (X: 1 – 255)


▪ 1 chu kỳ lệnh = 4 chu kỳ máy

✓ delay_ms(unsigned int16 X) → delay X ms


▪ X là biến hoặc hằng từ 0 đến 65535

✓ delay_us(unsigned int16 X) → delay X us


▪ X là biến hoặc hằng từ 0 đến 65535

TS. Đặng Phước Vinh Khoa Cơ khí


95
Các chỉ thị tiền xử lý

#INCLUDE​
#include <filename>
▪ Filename : tên file cho thiết bị *.h , *.c
▪ Khai báo chỉ định đường dẫn cho trình biên dịch​
▪ Luôn phải có để khai báo chương trình viết cho VĐK
nào , và luôn đặt ở dòng đầu tiên
▪ Ví dụ: #include <16F877A.h>​
#include < I2C.h>​

TS. Đặng Phước Vinh Khoa Cơ khí


96
Các chỉ thị tiền xử lý

#BIT​
#bit name = x.y
▪ Tạo biến 1bit có tên là name đặt ở byte x vị trí y.
▪ Thường dùng để kiểm tra hoặc gán giá trị cho thanh
ghi.
▪ Ví dụ: #bit TMR1IF = 0x0B.2; => tạo biến 1bit tên
TMR1IF đặt ở byte có địa chỉ 0x0B ở vị trí thứ 2.

TS. Đặng Phước Vinh Khoa Cơ khí


97
Các chỉ thị tiền xử lý

#BYTE​
#byte name = x
▪ Gán tên biến name cho địa chỉ x
▪ Name thường trùng với tên thanh ghi có địa chỉ x​
▪ Ví dụ: #byte portB = 0x06;

TS. Đặng Phước Vinh Khoa Cơ khí


98
Các chỉ thị tiền xử lý

#DEFINE​
#define name text​
▪ Dùng để khai báo một chuỗi, một biến, hoặc số có tên
là name​
▪ Ví dụ: #define constant 123456;​
#define LED_D5 PIN_E2

TS. Đặng Phước Vinh Khoa Cơ khí


99
Các chỉ thị tiền xử lý
#USE
#use delay(clock = speed)​
▪ Dùng để khai báo tốc độ dao động của thạch anh
▪ Có chỉ thị này thì mới sử dụng được các hàm trễ thời
gian delay_ms hay delay_us

#use I2C(options)
▪ Thiết lập giao tiếp I2C
▪ #use i2c(master , SDA = PIN_B1 , SCL = PIN_B4)

TS. Đặng Phước Vinh Khoa Cơ khí


100
Các chỉ thị tiền xử lý

#USE
#use fast_io(port)
▪ Port là các cổng vào ra của PIC (từ A -> E)​
▪ Có chỉ thị này thì chúng ta có thể điều chỉnh các port
chỉ với 1 lệnh như output_low() , input_high()
▪ Trong hàm main → phải dùng hàm set_tris_x() để
chỉ rõ chân vào ra thì chỉ thị trên mới có hiệu lực,
nếu không chương trình sẽ chạy sai
▪ Ví dụ: #use fast_io(A)
#use fast_io(all)

TS. Đặng Phước Vinh Khoa Cơ khí


101
Các hàm xử lý I/O

✓ output_low(pin), output_high(pin)
▪ Thiết lập 1 chân vi điều khiển là OUTPUT, điện áp xuất ra là
mức 0 hoặc mức 1.
▪ output_low(PIN_B0); // chân 0 của PORTB xuất ra điện áp
0V (mức 0)
output_high(PIN_A0); // chân 0 của PORTA xuất ra điện áp
5V (mức 1)

✓ output_x(byte)
▪ Thiết lập PORT x là OUTPUT, giá trị xuất ra là byte.
▪ output_b(0x35); // giá trị xuất ra ở PORTB là 0x00110101
output_d(0x76); // giá trị xuất ra ở PORTD là 0x01110110

TS. Đặng Phước Vinh Khoa Cơ khí


102
Các hàm xử lý I/O

output_bit(pin,value)
▪ Thiết lập 1 chân vi điều khiển là OUTPUT, mức logic
thiết lập là value (0 hoặc 1).
▪ Thường dùng khi giá trị ra tùy thuộc giá trị của 1
biến nào đó
output_bit(PIN_B1,0);
→ chân 1 của PORTB xuất ra mức logic 0 (0V)

→ output_bit(PIN_C2,input(PIC_B2));
→ chân C2 xuất ra mức logic = giá trị đầu vào của chân B2

TS. Đặng Phước Vinh Khoa Cơ khí


103
Các hàm xử lý I/O
✓ output_toggle(pin)
▪ Đảo trạng thái của chân chỉ định
▪ output_toggle(PIN_B1); //đảo trạng thái của chân B1

✓ output_float(pin)
▪ Hàm này thiết lập chân chỉ định đến chế độ input
(nhập),với trạng thái trở kháng cao.
▪ output_float(PIN_B3); // chân B3 trở thành input

✓ output_drive(pin)
▪ Thiết lập chân chân chỉ định đến chế độ OUTPUT (TRIS
bit 0).
▪ output_drive(PIN_B1); // chân B1 trở thành output
TS. Đặng Phước Vinh Khoa Cơ khí
104
Các hàm xử lý I/O

✓ input(pin)
▪ Trả về trạng thái của một chân vi điều khiển, giá trị trả về có
kiểu bit (0 hoặc 1).
▪ if(input(PIN_C5)) output_b(0xFF); // nếu chân C5 ở mức
cao → PORTB = 0xff
if(!input(PIN_C5)) output_b(0x00); // nếu chân C5 ở mức
thấp → PORTB = 0x00
✓ input_x()
▪ trả về trạng thái của PORT x, giá trị trả về là 1 byte
▪ int8 DATA;
DATA = input_a(); // biến DATA sẽ chứa giá trị trạng thái
của PORTA
TS. Đặng Phước Vinh Khoa Cơ khí
105
Các hàm xử lý I/O

✓ port_b_pullups(value)
▪ value = 1 → thiết lập điện trở kéo lên cho PORTB khi sử
dụng là chức năng INPUT (đối với 16F877A thì chỉ có
PORTB có điện trở nội kéo lên).

✓ set_tris_x(byte)
▪ Thiết lập hướng IN/OUT cho PORT x trong đó 0: OUTPUT, 1:
INPUT.
▪ set_tris_a(0xF0); // chân 0,1,2,3 là OUTPUT ; chân 4,5,6,7
là INPUT

TS. Đặng Phước Vinh Khoa Cơ khí


106
Bài tập
Bài tập 1: Chớp tắt LED điểm
Viết chương trình chớp/tắt 1 LED điểm với tần số 1Hz
Bài tập 2: Điều khiển nhiều LED điểm
Viết chương trình quét 8 LED điểm (mỗi lần chỉ 1 LED sáng) với tần
số 1Hz
Bài tập 3: Nút nhấn
Viết chương trình sáng/tắt LED điểm khi nhấn nút
Bài tập 4: Hiển thị LED 7 đoạn
Viết chương trình vòng lặp đếm số từ 0 đến 9 trên LED 7 đoạn
Bài tập 5: Nút nhấn và LED 7 đoạn
Viết chương trình hiển thị số trên LED 7 đoạn bằng nút nhấn. Giá trị
tăng lên 1 sau mỗi lần nhấn nút. Giá trị LED 7 đoạn
TS. Đặng Phước Vinh
sẽ quay về số 0
Khoa Cơ khí
nếu giá trị trước đó là 9.
CHƯƠNG 4
BỘ ĐỊNH THỜI
Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
108
Đặc điểm của bộ định thời

✓Có 3 bộ định thời


▪ Timer 0: timer/counter 8 bit, có bộ chia trước

▪ Timer 1: timer/counter 16 bit, có bộ chia trước, có


thể đếm khi CPU ở chế độ sleep với nguồn xung từ
thạch anh hoặc nguồn xung bên ngoài

▪ Timer 2: timer/counter 8 bit, có bộ chia trước và


postscale

TS. Đặng Phước Vinh Khoa Cơ khí


BỘ ĐỊNH THỜI
TIMER 0
Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
110
Timer 0 – Đặc điểm

✓Là timer/counter 8 bit


✓Có thể đọc và ghi
✓Có bộ chia trước 8 bit có thể lập trình bằng phần mềm
✓Cho phép lựa chọn nguồn xung clock bên trong hoặc
bên ngoài
✓Phát sinh ngắt khi bị tràn từ FFh đến 00h
✓Cho phép lựa chọn tác động cạnh cho xung clock bên
ngoài

TS. Đặng Phước Vinh Khoa Cơ khí


111
Timer 0 – Các thanh ghi liên quan

✓TMR0: chứa giá trị đếm của Timer0

✓INTCON: cho phép ngắt hoạt động


GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF

✓OPTION_REG: xác định các tham số về xung tác động,


cạnh tác động và tỉ lệ bộ chia
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

TS. Đặng Phước Vinh Khoa Cơ khí


112
Thanh ghi OPTION_REG

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

TOCS (Timer0 Clock Source Select bit): bit lựa chọn


nguồn xung cho TMR0. Lựa chọn chế độ Timer hay
Counter
▪ TOCS = 1: Counter → clock lấy từ chân RA4/TOCKI
▪ TOCS = 0: Timer → xung clock bên trong (nguồn xung
để thực thi lệnh)
TS. Đặng Phước Vinh Khoa Cơ khí
113
Chế độ Timer – TOCS = 0

▪ Giá trị thanh ghi TMR0 sẽ tăng theo từng chu kỳ xung
đồng hồ
✓ Tần số vào của Timer0 = ¼ tần số thạch anh

▪ Giá trị TMR0 từ FFh → 00h: bit TMR0IF (INTCON<2>)


= 1 → Ngắt Timer0 xuất hiện
✓ Bit TMR0IF phải được xóa bằng phần mềm
✓ Ngắt Timer0 không thể đánh thức VĐK từ chế độ
sleep

▪ Thanh ghi TMR0 có thể ghi hoặc xóa → dể dàng ấn


định thời điểm ngắt
TS. Đặng Phước Vinh Khoa Cơ khí
114
Thanh ghi OPTION_REG

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

TOSE (Timer0 Source Edge Select bit): bit lựa chọn cạnh
tích cực

▪ TOSE = 1: xung chuyển đổi từ thấp → cao ở chân


TOCKI
▪ TOSE = 0: xung chuyển đổi từ cao → thấp ở chân
TOCKI
TS. Đặng Phước Vinh Khoa Cơ khí
115
Thanh ghi OPTION_REG

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

PSA (Prescaler Assignment Select bit): bit gán bộ chia


trước
▪ PSA = 1: bộ chia tần số được dùng cho WDT
▪ PSA = 0: bộ chia tần số được dùng cho Timer0

TS. Đặng Phước Vinh Khoa Cơ khí


116
Thanh ghi OPTION_REG

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

PS2-PS0 (Prescaler Rate Select bit): lựa chọn tỉ lệ bộ


chia trước
▪ Khi gán bộ chia trước cho Timer0 → không có bộ chia cho WDT
▪ Khi gán bộ chia trước cho WDT → không có bộ chia cho Timer0

TS. Đặng Phước Vinh Khoa Cơ khí


117
Bit lựa chọn tỉ lệ bộ chia trước

PS2-PS0: Prescaler Rate Select bit


Bit lựa chọn
Tỉ lệ TMR0 Tỉ lệ WDT
PS2-PS1-PS0
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
TS. Đặng Phước Vinh 111 1:256 1:128
Khoa Cơ khí
118
Sơ đồ khối Timer 0

TS. Đặng Phước Vinh Khoa Cơ khí


119
Giá trị định thời

T = 4 × (1/Fosc) * Prescaler
▪ Fosc : tần số dao động thạch anh
▪ Prescaler: giá trị bộ chia trước

Trong CCS
setup_timer_0(int8 mode)
set_timer0(int8 value)
Ví dụ: setup_timer_0(T0_INTERNAL|T0_DIV_64);
set_timer0(1);
TS. Đặng Phước Vinh Khoa Cơ khí
120
Ví dụ

Viết chương trình nhấp nháy LED với chu kỳ 1s dùng Timer0

TS. Đặng Phước Vinh Khoa Cơ khí


BỘ ĐỊNH THỜI
TIMER 1
Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
122
Timer 1 – Đặc điểm

✓Là timer/counter 16 bit gồm 2 thanh ghi (TMR1H &


TMR1L)
▪ Có thể đọc và ghi
▪ Giá trị tăng từ 0000h đến FFFFh

✓Cờ ngắt của Timer1 là TMR1IF (PIR<0>)

✓Bit điều khiển của ngắt Timer1 là TMR1IE (PIE<0>)

✓Có thể hoạt động ở 2 chế độ (Timer hoặc Counter) dựa


vào bit TMR1CS (T1CON<1>)

TS. Đặng Phước Vinh Khoa Cơ khí


123
Timer 1 – Các thanh ghi liên quan

✓TMR1L & TMR1H: chứa giá trị đếm của Timer1

✓INTCON: cho phép ngắt hoạt động


GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF

✓PIR1: chứa cờ ngắt Timer1 (TMR1IF)


PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

TS. Đặng Phước Vinh Khoa Cơ khí


124
Timer 1 – Các thanh ghi liên quan

✓PIE1: cho phép ngắt Timer1 (TMR1IE)


PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

✓T1CON: xác lập các thông số cho Timer1


- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

TS. Đặng Phước Vinh Khoa Cơ khí


125
Thanh ghi T1CON – T1CKPS0 & 1

- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

✓ T1CKPS1 – T1CKPS0 (Timer1 Input Clock Prescaler Select bit):


Các bit lựa chọn bộ chia

T1CKPS1 - T1CKPS0 Giá trị chia

00 1:1
01 1:2
10 1:4
11 1:8

TS. Đặng Phước Vinh Khoa Cơ khí


126
Thanh ghi T1CON – T1OSCEN

- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

✓T1OSCEN (Timer1 Oscillator Enable Control bit) bit điều


khiển cho phép bộ dao động Timer1

▪ 0: Timer1 lấy xung clock từ thạch anh nội (Timer)


hoặc từ chân RC0/T1OSO/T1CKI (Counter)
▪ 1: Timer1 lấy xung clock từ 2 chân RC1/T1OSI/CCP2
và RC0/T1OSO/T1CKI làm xung đếm

TS. Đặng Phước Vinh Khoa Cơ khí


127
Thanh ghi T1CON – TMR1CS

- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

✓TMR1CS (Timer1 Clock Source Select bit): bit lựa


chọn nguồn xung clock của Timer1
▪ 1: counter: nguồn xung clock từ bên ngoài ở
chân RC0/T1OSO/T1CKI

▪ 0: timer: nguồn xung clock bên trong (FOSC/4)

TS. Đặng Phước Vinh Khoa Cơ khí


128
Thanh ghi T1CON – TMR1ON

- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

✓TMR1ON (Timer1 On bit): bit điều khiển Timer1


▪ 1: cho phép Timer1 hoạt động
▪ 0: không cho phép Timer1 hoạt động

TS. Đặng Phước Vinh Khoa Cơ khí


129
Thanh ghi T1CON – T1SYNC

- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

✓T1SYNC (Timer1 Internal Clock Input Synchronization


Control bit): bit điều khiển đồng bộ ngõ vào xung clock
bên ngoài của Timer1
✓Khi TMR1CS = 1
▪ 0: đồng bộ xung clock ngoại vi đưa vào Timer1
▪ 1: không đồng bộ xung clock ngoại vi đưa vào
Timer1
✓Khi TMR1CS = 0: không quan tâm
TS. Đặng Phước Vinh Khoa Cơ khí
130
Timer1 ở chế độ Counter – TMR1CS = 1

✓Timer1 tăng lên 1 khi có cạnh lên của xung bên ngoài
✓Counter phải nhận 1 xung cạnh xuống trước khi có xung
đếm

TS. Đặng Phước Vinh Khoa Cơ khí


131
Timer1 ở chế độ Counter đồng bộ

✓Khi bit T1SYNC = 0

✓Ngõ vào xung clock bên ngoài sẽ đồng bộ với xung clock bên
trong

✓Sự đồng bộ được thực hiện sau tầng chia trước

✓Timer1 không tăng giá trị khi có xung đếm trong chế độ
SLEEP do mạch đồng bộ ngừng hoạt động → không thể
đánh thức VĐK ở chế độ SLEEP

TS. Đặng Phước Vinh Khoa Cơ khí


132
Timer1 ở chế độ Counter bất đồng bộ

✓Khi bit T1SYNC = 1

✓Bộ đếm tiếp tục tăng bất đồng bộ với xung clock bên trong

✓Bộ đếm hoạt động ở chế độ SLEEP → có thể phát sinh ngắt
để khởi động lại VĐK

✓Trong chế độ này, Timer1 không thể được sử dụng để làm


nguồn xung clock cho khối CCP (Capture/Compare/PWM)

TS. Đặng Phước Vinh Khoa Cơ khí


133
Bộ dao động Timer1

✓ Mạch dao động thạch anh được thiết kế và tích hợp bên trong
giữa chân T1OSI (ngõ vào) và T1OSO (ngõ ra có khuyếch đại)

✓ Bộ dao động này được phép hoạt động khi T1OSCEN = 1

✓ Bộ dao động vẫn hoạt động khi ở chế độ SLEEP

TS. Đặng Phước Vinh Khoa Cơ khí


134
Sơ đồ khối Timer1

TS. Đặng Phước Vinh Khoa Cơ khí


135
Giá trị định thời

T = 4 × (1/Fosc) * Prescaler
▪ Fosc : tần số dao động thạch anh
▪ Prescaler: giá trị bộ chia trước

Trong CCS
setup_timer_1(int16 mode)
set_timer1(int16 value)
Ví dụ: setup_timer_1(T1_INTERNAL|T1_DIV_1); Tràn bộ định
thời sau 10ms
set_timer1(55536);
TS. Đặng Phước Vinh Khoa Cơ khí
BỘ ĐỊNH THỜI
TIMER 2
Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
137
Timer 2 – Đặc điểm

✓ Là timer/counter 8 bit có prescaler và postscaler


✓ Có thể sử dụng như bộ tạo xung PWM của khối CCP
✓ Thanh ghi TMR2 có thể đọc và ghi và có thể xóa khi bị reset
✓ Tùy chọn bộ chia trước dựa vào bit T2CKPS1 & T2CKPS0
✓ Có 1 thanh ghi chu kỳ 8 bit PR2 → thanh ghi đỉnh.
▪ Là thanh ghi có thể đọc và ghi
▪ Khi reset → PR2 = FFh
✓ TMR2 tăng giá trị từ 00h đến giá trị bằng PR2 và reset về 00h ở
chu kỳ kế tiếp
✓ Ngõ ra TMR2 đi qua postscaler 4 bit để tạo ra yêu cầu ngắt
TS. Đặng Phước Vinh Khoa Cơ khí
138
Timer 2 – Các thanh ghi liên quan

✓TMR2: chứa giá trị đếm của Timer2

✓INTCON: cho phép ngắt hoạt động


GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF

✓PIR1: chứa cờ ngắt Timer2 (TMR2IF)


PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

TS. Đặng Phước Vinh Khoa Cơ khí


139
Timer 2 – Các thanh ghi liên quan

✓PIE1: cho phép ngắt Timer2 (TMR2IE)


PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

✓T2CON: xác lập các thông số cho Timer2


- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

TS. Đặng Phước Vinh Khoa Cơ khí


140
Thanh ghi T2CON – TOUTPS3 : 0

- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

✓ TOUTPS3 – TOUTPS0: Các bit lựa chọn ngõ ra của Postscaler


của Timer2

TOUTPS3 – TOUTPS0 Giá trị chia


0000 1:1
0001 1:2
0010 1:3
… …
1111 1:16

TS. Đặng Phước Vinh Khoa Cơ khí


141
Thanh ghi T2CON – TMR2ON

- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

✓TMR2ON (Timer2 On bit): bit điều khiển Timer2


▪ 1: cho phép Timer2 hoạt động
▪ 0: không cho phép Timer2 hoạt động

TS. Đặng Phước Vinh Khoa Cơ khí


142
Thanh ghi T2CON – T2CKPS1 & 2

- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

✓ T2CKPS1 – T2CKPS0 (Timer2 Input Clock Prescaler Select bit):


Các bit lựa chọn bộ chia

Bit lựa chọn


Giá trị chia
PS1-PS0
00 1:1
01 1:4
1x 1:16

TS. Đặng Phước Vinh Khoa Cơ khí


143
Lưu ý

✓Bộ đếm chia trước và postscaler sẽ bị xóa khi:


▪ Thực hiện ghi dữ liệu vào TMR2
▪ Ghi vào thanh ghi T2CON
▪ Bất kỳ sự reset nào của linh kiện

✓TMR2 không bị xóa khi ghi dữ liệu vào thanh ghi


T2CON

TS. Đặng Phước Vinh Khoa Cơ khí


144
Sơ đồ khối Timer2

TS. Đặng Phước Vinh Khoa Cơ khí


145
Giá trị định thời

Trong CCS
Prescaler Giá trị đỉnh Bao nhiêu lần đếm
tràn thì xảy ra ngắt

setup_timer_2(int8 mode, int8 period, int8 postscale)


set_timer2(int8 value)
Ví dụ: setup_timer_2(T2_DIV_BY_4,250,10);
set_timer2(1);

TS. Đặng Phước Vinh Khoa Cơ khí


146
Tổng kết về Timer
TIMER 0 TIMER 1 TIMER 2
16 bit
Kích thước thanh ghi 8 bit (TMR0) 8 bit (TMR2)
(TMR1H-TMR1L)
Nguồn clock
FOSC/4 FOSC/4 FOSC/4
(bên trong)
▪ Chân T1CKI
Nguồn clock
Chân T0CKI ▪ Bộ dao động None
(bên ngoài)
Timer1 (T1OSC )
▪ Prescaler
8 bit 3 bit (1:1, 1:4, 1:8)
Bộ chia
(1:2 → 1:256) (1, 2, 4, 8) ▪ Postscaler
(1:1 → 1:16)
Sự kiện ngắt và cờ FFh → 00h FFFFh → 0000h TMR2 = PR2
ngắt TMR0IF (INTCON) TMR1IF (PIR1) TMR2IF (PIR2)
Đánh thức PIC từ chế
NO YES NO
độ SLEEP

TS. Đặng Phước Vinh Khoa Cơ khí


147
Ví dụ

Viết chương trình nhấp nháy LED với chu kỳ 0.5s dùng Timer2

TS. Đặng Phước Vinh Khoa Cơ khí


148
Ví dụ

Viết chương trình khi nhấn nút SW1 thì LED 7 đoạn thực hiện vòng lặp
đếm lên từ 0 đến 9. Thời gian delay mỗi lần đếm là 2.5s. Dùng Timer2 để
thực hiện delay

U5 R6 Q4
13 33 NPN
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1 330
35
RB2
2 36
RA0/AN0 RB3/PGM
3 37 LED_7_DOAN
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC
6 40 R7

SW1
RA4/T0CKI/C1OUT RB7/PGD
7 10k
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19

LED_7_DOAN
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
TS. Đặng Phước Vinh
RD5/PSP5
RD6/PSP6
29 Khoa Cơ khí
30
RD7/PSP7
149
CCP: Capture/Compare/PWM

✓ PIC16F877A có 2 modul CCP(Capture/Compare/PWM ) giống


hệt nhau về hoạt động

✓ Các module này có nguồn là các Timer

TS. Đặng Phước Vinh Khoa Cơ khí


150
Chế độ Capture

✓ Khi có một “hiện tượng” xảy ra


tại chân RC2/CCP1 hoặc
RC1/CCP2
→ TMR1 đưa vào CCPR1,2

✓ Các hiện tượng được định


nghĩa bởi bit CCPxM3:CCPxM0
(CCPxCON<3:0>)
▪ Mỗi khi có cạnh xuống tại chân CCP → 0100
▪ Mỗi khi có cạnh lên → 0101
▪ Mỗi khi có cạnh lên thứ 4 → 0110
▪ Mỗi khi có cạnh lên thứ 16 →0111

- Phước Vinh
TS. Đặng - CCPxX CCPxY CCPxM3 Khoa CCPxM1
CCPxM2 Cơ khí CCPxM0
151
Chế độ Capture

✓ Khi giá trị TMR1 đưa vào


CCPRx → cờ ngắt CCPxIF
được set

✓ Các chân dùng cho khối


CCP phải là input

✓ Timer1 phải hoạt động ở


chế độ Timer hoặc Counter
đồng bộ

✓ Bit ngắt: CCPxIE (PIE1)

✓ Cờ ngắt: CCPxIF

TS. Đặng Phước Vinh Khoa Cơ khí


152
Chế độ Compare

✓ Giá trị trong thanh ghi CCPRx sẽ thường xuyên được so sánh với
TMR1
✓ Khi CCPRx = TMR1
▪ Các chân CCP sẽ thay đổi trạng thái: tùy thuộc vào các bit
CCPxM3:CCPxM0 (CCPxCON<3:0>)
▪ Cờ ngắt CCPxIF được set

✓ Timer1 phải hoạt động ở chế độ Timer hoặc Counter đồng bộ

✓ Có khả năng tạo ra hiện tượng đặc biệt (Special Event Trigger)
làm reset giá trị thanh ghi TMR1 và khởi động bộ ADC

TS. Đặng Phước Vinh Khoa Cơ khí


153
Chế độ Compare

TS. Đặng Phước Vinh Khoa Cơ khí


154
Chế độ PWM

✓ Là khối điều chế độ rộng xung (Pulse Width Modulation)


✓ Tín hiệu sau khi được điều chế → chân CCP1,2 (chân RC1 , RC2)
✓ Cần set các chân này là output

TS. Đặng Phước Vinh Khoa Cơ khí


155
Thanh ghi CCPxCON (x = 1, 2)

- - CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0

✓ CCPxX, CCPxY: 2 bit thấp nhất chứa giá trị tính độ rộng xung
(duty cycle) của khối PWM

✓ CCPxM3:CCPxM0: Xác lập chế độ hoạt động của khối CCPx


→ 11xx : CCPx hoạt động ở chế độ PWM

TS. Đặng Phước Vinh Khoa Cơ khí


156
Chế độ PWM – Các bước cài đặt

1. Thiết lập thời gian của 1 chu kỳ của xung cần điều chế (period)
→ đưa giá trị thích hợp vào PR2

2. Thiết lập độ rộng xung cần điều chế (duty cycle)


→ đưa giá trị vào thanh ghi CCPRxL và 2 bit CCPxCON<5:4>

3. Set các chân CCP1,2 là output

4. Thiết lập các thông số cho Timer2


→ setup_timer_2(T2_DIV_BY_1,99,1);

5. Cho phép CCP hoạt động ở chế độ PWM


→ setup_ccp2(CCP_PWM);

TS. Đặng Phước Vinh Khoa Cơ khí


157
1. Chu kỳ 1 xung

✓ Chu kỳ (period) của xung điều chế (tính bằng “s”):

TPWM =  PR2 + 1  4  TOSC  T2CKPS

✓ Giá trị PR2:


1
PR2 = −1
f PWM  4  TOSC  T2CKPS

Ví dụ: Tạo ra xung có tần số 10kHz, dùng OSC = 4Mhz, T2CKPS: 1


1
PR2 = − 1 = 99
1
10  103  4  1
4  10 6

TS. Đặng Phước Vinh Khoa Cơ khí


158
2. Độ rộng xung cần điều chế

✓ Độ rộng xung cần điều chế (duty cyle):

PWM duty cyle = ( CCPRxL:CCPxCON<5:4> )  TOSC  T2CKPS

✓ CCPRxL: 8 bit thấp của khối CCP


7 6 5 4 3 2 1 0

✓ CCPxCON: thanh ghi điều khiển khối CCP


- - CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0

7 6 5 4 3 2 1 0 CCPxX CCPxY

TS. Đặng Phước Vinh Khoa Cơ khí


159
Sơ đồ khối chế độ PWM

Khi TMR2 = PR2:


▪ TMR2 được xóa
▪ Pin của CCP được set
▪ CCPR1L → CCPR1H

Khi TMR2 = CCPR1H


&
CCP1CON<5:4> = T2CKPS<1:0>
▪ Pin của CCP được clear

TS. Đặng Phước Vinh Khoa Cơ khí


160
Lưu ý trong chế độ PWM

▪ Chỉ Timer2 được sử dụng cho khối PWM


▪ Timer2 có 2 bộ chia tần số: prescaler và postscaler. Nhưng bộ
postscaler không được dùng trong khối PWM
▪ Nếu PWM duty cycle > PWM period: ngõ ra tiếp tục ở mức cao
sau khi PR2 = TMR2

TS. Đặng Phước Vinh Khoa Cơ khí


161
Ví dụ

Tạo ra xung có chu kỳ 10kHz, duty = 25%, dùng OSC = 4Mhz, T2CKPS: 1

𝑓𝑃𝑊𝑀 = 10kHz → 𝑇𝑃𝑊𝑀 = 10−4 s

PWM duty cyle = ( CCPRxL:CCPxCON<5:4> )  TOSC  T2CKPS

−4 1
0.25  10 = Value  1
4  10 6

Value = 100 CCPRxL:CCPxCON<5:4> = 0001 1001 . 00

TS. Đặng Phước Vinh Khoa Cơ khí


162
Ví dụ

Tạo ra xung có chu kỳ 10kHz, duty = 25%, dùng OSC = 4Mhz, T2CKPS: 1

PR2 = 99; // tạo xung có chu kỳ 10kHz (T = 10−4 s)

T2CKPS0:1 = 00; // prescaler = 1

CCPR2L = 00011001;

CCP2CON = 00001100;

TMR2ON = 1; // cho phép Timer2 hoạt động

- - CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0

TS. Đặng Phước Vinh Khoa Cơ khí


163
Trong CCS

Tạo ra xung có chu kỳ 10kHz, duty = 25%, dùng OSC = 4Mhz, T2CKPS: 1

setup_timer_2(T2_DIV_BY_1,99,1);
setup_ccp2(CCP_PWM);
set_pwm2_duty(0);
set_pwm2_duty(value);

value
duty_cycle = value = 0.25   4  ( 99 + 1)  = 100
4  ( PR2 + 1)

TS. Đặng Phước Vinh Khoa Cơ khí


CHƯƠNG 5

HOẠT ĐỘNG NGẮT


Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
165
Tổng quan

time

Main

(a) Thực thi chương trình không có ngắt

ISR ISR ISR Thực thi ở mức ngắt

Main Main Main Main Thực thi ở mức nền

time
(b) Thực thi chương trình có ngắt

TS. Đặng Phước Vinh Khoa Cơ khí


166
Tổng quan
✓ Có 15 nguồn ngắt
▪ Ngắt Timer (0, 1, 2)
▪ Ngắt ngoài ở chân RB0/INT
▪ Ngắt Port B thay đổi (ở các bit PORTB<4:7>)
▪ Ngắt ngoại vi
✓ Thanh ghi điều khiển ngắt: INTCON (chứa bit toàn cục GIE)

✓ Các cờ báo ngắt được set lên 1 bất chấp trạng thái ngắt tương
ứng cho hay không cho phép ngắt

✓ Khi GIE được phép và bit cờ ngắt và bit cho phép ngắt độc lập
lên 1 → xảy ra ngắt

✓TS.Để kết
Đặng thúc
Phước chương trình ngắt → lệnh RETFIE
Vinh Khoa Cơ khí
167
Xử lý ngắt

✓ Khi 1 ngắt được đáp ứng →


GIE được xóa → không cho
các ngắt khác xảy ra

✓ Bit cờ ngắt phải được xóa bởi


phần mềm → tránh gọi lại
ngắt đã thực hiện

TS. Đặng Phước Vinh Khoa Cơ khí


168
Xử lý ngắt

✓ Địa chỉ trở về được lưu


trong ngăn xếp stack
✓ Có 8 ngăn xếp stack
✓ Hoạt động như 1 vòng kín
✓ Không có bit trạng thái để
cảnh báo ngắn xếp bị tràn

✓ Bộ đếm chương trình


(Program Counter) được
nạp địa chỉ 0004h

TS. Đặng Phước Vinh Khoa Cơ khí


169
Các thanh ghi liên quan – INTCON

GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF

GIE: bit cho phép ngắt toàn cục


1: cho phép tất cả các nguồn ngắt
0: không cho phép tất cả các nguồn ngắt

PEIE: bit cho phép ngắt ngoại vi

TMR0IE: bit cho phép ngắt timer0


1: cho phép ngắt
INTE: bit cho phép ngắt ngoài ở chân RB0 0: không cho phép ngắt

RBIE: bit cho phép ngắt thay đổi ở port B

TS. Đặng Phước Vinh Khoa Cơ khí


170
Các thanh ghi liên quan – INTCON

GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF

TMR0IF: cờ tràn Timer0


1: thanh ghi TMR0 tràn (phải xóa bằng chương trình)
0: thanh ghi TMR0 chưa tràn hoặc không tràn

INTF: cờ báo ngắt ngoài RB0/INT


1: ngắt ngoài ở chân RB0/INT đã xảy ra (phải xóa bằng chương trình)
0: ngắt ngoài ở chân RB0/INT không xảy ra

RBIF: cờ báo khi PORTB có thay đổi


1: có ít nhất các chân RB7:RB4 thay đổi trạng thái (phải xóa bằng chương
trình)
0: các chân RB7:RB4 không có sự thay đổi trạng thái

TS. Đặng Phước Vinh Khoa Cơ khí


171
Các thanh ghi liên quan – PIE1

PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

PSPIE: bit cho phép ngắt đọc/ghi ở port nhánh song song (PSP)
ADIE: bit cho phép ngắt bộ chuyển đổi ADC
RCIE: bit cho phép ngắt nhận dữ liệu USART
TXIE: bit cho phép ngắt phát dữ liệu USART 1: cho phép ngắt
0: không cho
SSPIE: bit cho phép ngắt port nối tiếp đồng bộ phép ngắt
CCP1IE: bit cho phép ngắt CCP1
TMR2IE: bit cho phép ngắt tương thích TMR2 với PR2
TNR1IE: bit cho phép ngắt tràn TMR1

TS. Đặng Phước Vinh Khoa Cơ khí


172
Các thanh ghi liên quan – PIE2

- CMIE - EEIE BCLIE - - CCP2IE

CMIE: bit cho phép ngắt bộ so sánh


1: cho phép
EEIE: bit cho phép ngắt hoạt động ghi ở EEPROM
ngắt
BCLIE: bit cho phép ngắt sự xung đột đường dẫn 0: không cho
phép ngắt
CCP2IE: bit cho phép ngắt CCP2

TS. Đặng Phước Vinh Khoa Cơ khí


173
Các thanh ghi liên quan – PIR1

PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

PSPIF: cờ báo ngắt port nhánh song song (PSP)


1: hoạt động đọc/ghi được thực thi (phải xóa bằng chương trình)
0: hoạt động đọc/ghi không được thực thi

ADIF: cờ báo ngắt bộ chuyển đổi ADC


1: chuyển đổi ADC đã được hoàn thành
0: chuyển đổi ADC chưa được hoàn thành

RCIF: cờ báo ngắt nhận USART


1: USART nhận xong
0: USART nhận chưa xong

TXIF: cờ báo ngắt truyền USART


1: truyền đệm của USART còn trống
0: truyền đệm của USART còn đầy

TS. Đặng Phước Vinh Khoa Cơ khí


174
Các thanh ghi liên quan – PIR1

PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

SSPIF: cờ báo ngắt port nối tiếp đồng bộ (SSP)


1: điều kiện ngắt SSP đã xảy ra
0: không có điều kiện ngắt SSP xảy ra

CCP1IF: cờ báo ngắt CCP1


1: xảy ra bắt nhịp/so sánh thanh ghi TMR1
0: không xảy ra bắt nhịp/so sánh thanh ghi TMR1

TMR2IF: cờ báo ngắt tương thích TMR2 với PR2


1: TMR2 tương thích với PR2
0: TMR2 không tương thích với PR2

TMR1IF: cờ báo ngắt tràn TMR1


1: thanh ghi TMR1 đã tràn
0: thanh ghi TMR1 không tràn

TS. Đặng Phước Vinh Khoa Cơ khí


175
Các thanh ghi liên quan – PIR2

- CMIF - EEIF BCLIF - - CCP2IF

CMIF: cờ báo ngắt bộ so sánh


1: ngõ vào bộ so sánh đã thay đổi
0: ngõ vào bộ so sánh không thay đổi

EEIF: cờ báo ngắt hoạt động ghi của EEPROM


1: hoạt động ghi được hoàn thành
0: hoạt động ghi chưa hoàn thành hoặc không khởi động

BCLIF: cờ báo ngắt xung đột đường dẫn


1: xung đột đường dẫn đã xảy ra
0: đường dẫn không xảy ra xung đột

CCP2IF: cờ báo ngắt CCP2


1: xảy ra bắt nhịp/so sánh thanh ghi TMR1
0: không xảy ra bắt nhịp/so sánh thanh ghi TMR1

TS. Đặng Phước Vinh Khoa Cơ khí


176
Lưu ý

✓ Khi xảy ra ngắt → chỉ có giá trị của PC được lưu


vào stack

✓Một số thanh ghi quan trọng (STATUS, PCLATH)


có thể bị ảnh hưởng
✓ Lưu trữ nó trước khi thực hiện ngắt
✓ Trả lại giá trị sau khi kết thúc chương trình ngắt

TS. Đặng Phước Vinh Khoa Cơ khí


177
Ngắt Timer

✓ Timer0
▪ Xảy ra khi thanh ghi TMR0 tràn từ FFh → 00h
▪ Bit cho phép ngắt TMR0IE (INTCON<5>)
▪ Cờ ngắt TMR0IF (INTCON<2>)
✓ Timer1
▪ Xảy ra khi thanh ghi TMR1H:TMR1L tràn từ FFFFh → 0000h
▪ Bit cho phép ngắt TMR1IE (PIE1<0>)
▪ Cờ ngắt TMR1IF (PIR1<0>)
✓ Timer2
▪ Thanh ghi TMR2 tăng đến giá trị PR2 và đi qua postscaler
▪ Bit cho phép ngắt TMR2IE (PIE1<1>)
▪ Cờ ngắt TMR2IF (PIR1<1>)
▪ Có thể tắt ngắt Timer2 bằng cách xóa bit TMR2ON(T2CON<2>)

TS. Đặng Phước Vinh Khoa Cơ khí


178
Ngắt Timer

Trong CCS
#int_TIMER0
void ngat_timer0(){

}

void main() {
enable_interrupts(INT_TIMER0);
enable_interrupts(GlOBAL);
}

TS. Đặng Phước Vinh Khoa Cơ khí


179
Ví dụ

Viết chương trình nhấp nháy LED đơn với chu kỳ 1s

TS. Đặng Phước Vinh Khoa Cơ khí


180
Ngắt ngoài INT

✓ Ngắt xảy ra khi có xung tác động lên chân RB0/INT → INTF = 1
(INTCON<1>).
✓ Phải được xóa bằng phần mềm trước khi có phép ngắt trở lại
✓ Bit cho phép INTE (INTCON<4>)
✓ Bit điều khiển cạnh INTEDG (OPTION_REG<6>)
▪ INTEDG = 1: Kích bằng cạnh lên
▪ INTEDG = 0: Kích bằng cạnh xuống

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

✓ Có thể đánh thức VĐK khỏi chế độ SLEEP

TS. Đặng Phước Vinh Khoa Cơ khí


181
Encoder – Cấu tạo

✓ Một đĩa tròn xoay, quay quanh trục


✓ Trên đĩa có các lỗ (rãnh)
✓ Một đèn led để chiếu lên mặt đĩa.

TS. Đặng Phước Vinh Khoa Cơ khí


182
Encoder – Ứng dụng

✓ Được tích hợp vào đuôi của động cơ

TS. Đặng Phước Vinh Khoa Cơ khí


183
Đo tốc độ động cơ

TS. Đặng Phước Vinh Khoa Cơ khí


184
Ví dụ

Viết chương trình nhấp nháy LED đơn 1s khi nhấn nút SW

TS. Đặng Phước Vinh Khoa Cơ khí


Đèn giao thông 185

TS. Đặng Phước Vinh Khoa Cơ khí


CHƯƠNG 6

BỘ CHUYỂN ĐỔI
Firma convenzione

ADC
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
187
Tổng quan về ADC

✓ Mạch chuyển đổi tương tự sang số (Analog-to-digital-


converter)

✓ Tại sao cần bộ chuyển đổi ADC?


✓ Tín hiệu trong thế giới thực: tương tự
✓ Các chip VĐK: tín hiệu số (với logic TTL ta có: Từ 0V
đến 0,8V là mức logic 0, từ 2V đến 5V là mức logic 1)
✓ Là linh kiện bán dẫn dùng để chuyển đổi 1 đại lượng vật lý
tương tự liên tục (thường là điện áp) → giá trị số biểu
diển độ lớn của đại lượng đó

TS. Đặng Phước Vinh Khoa Cơ khí


188
Tổng quan về ADC

Sơ đồ khối của chuyển


đổi ADC
Bộ chuyển đổi ADC0802-
ADC0804

TS. Đặng Phước Vinh Khoa Cơ khí


189
Khối ADC trên PIC 16F877A

✓ Có 8 kênh chuyển đổi ADC với độ phân giải 10 bit → 𝟐𝟏𝟎 mức giá trị digital
✓ Có các ngõ vào điện áp chuẩn thấp và cao
▪ Phần mềm → Tạo tổ hợp VDD, VSS, RA2 hoặc RA3
✓ Có cấu trúc độ lập để có thể hoạt động khi VĐK ở chế độ sleep
✓ Xung cung cấp cho ADC được lấy từ dao động RC bên trong của khối
ADC
✓ Khối ADC có 4 thanh ghi:
▪ ADRESH (A/D Result High Register)
▪ ADRESL (A/D Result Low Register)
▪ ADCON0 (A/D Control Register 0)
▪ ADCON1 (A/D Control Register 1)

TS. Đặng Phước Vinh Khoa Cơ khí


ADCON0 190

ADCON1

TS. Đặng Phước Vinh Khoa Cơ khí


Not available on 28-pin devices
191
ADCON0: A/D Control Register 0

ADCS1 ADCS0 CHS3 CHS2 CHS1 CHS0 GO/DONE ADON

bit 7-6 ADCS<1:0>: A/D Conversion Clock Select bits


ADCON1 ADCON0
Clock Conversion
<ADCS2> <ADCS1:ADCS0>
0 00 FOSC/2
0 01 FOSC/8
0 10 FOSC/32
0 11 FRC (xung clock lấy từ bộ dao động nội RC)
1 00 FOSC/4
1 01 FOSC/16
1 10 FOSC/64
1 11 FRC (xung clock lấy từ bộ dao động nội RC)
TS. Đặng Phước Vinh Khoa Cơ khí
192
ADCON0: A/D Control Register 0

ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON

bit 5-3 CHS<2:0>: A/D Channel Select bits


CHS<2:0> Chọn kênh
000 kênh 0 (AN0)
001 kênh 1 (AN1)
010 kênh 2 (AN2)
011 kênh 3 (AN3)
100 kênh 4 (AN4)
101 kênh 5 (AN5)
110 kênh 6 (AN6)
TS. Đặng Phước Vinh 111 kênh 7 (AN7) Khoa Cơ khí
193
ADCON0: A/D Control Register 0

ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON

bit 2 GO/DONE: A/D Conversion Status bit


Khi ADON = 1:
1: chuyển đổi ADC đang diễn ra (bằng 1 khi bắt đầu chuyển đổi
và sẽ xóa về 0 khi quá trình chuyển đổi kết thúc)
0: chuyển đổi ADC không diễn ra

bit 0: ADON: A/D On bit


1: khối chuyển đổi ADC được mở nguồn
0: khối chuyển đổi ADC bị tắt nguồn để giảm công suất tiêu thụ

TS. Đặng Phước Vinh Khoa Cơ khí


194
ADCON1: A/D Control Register 1

ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0

bit 7 ADFM: A/D Result Format Select bit


0: canh lề trái, 6 bit LSB của ADRESL có giá trị là ‘0’
1: canh lề phải, 6 bit MSB của ADRESH có giá trị là ‘0’

TS. Đặng Phước Vinh Khoa Cơ khí


195
ADCON1: A/D Control Register 1

ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0

bit 3-0 PCFG<3:0>: A/D Port Configuration Control bits

TS. Đặng Phước Vinh Khoa Cơ khí


196
Các bước thực hiện

1. Thiết lập cấu hình ADC


❑ Định cấu hình cho các chân (ADCON1)
❑ Chọn lựa kênh ngõ vào cho khối ADC (ADCON0)
❑ Lựa chọn xung clock cho chuyển đổi ADC (ADCON0)
❑ Cấp điện cho khối ADC (ADCON0)
2. Thiết lập cấu hình ngắt (nếu có yêu cầu)
❑ Khi chuyển đổi ADC hoàn thành (kết quả được nạp
ADRESH và ADRESL) → cờ ADIF = 1
3. Chờ hết thời gian theo yêu cầu

TS. Đặng Phước Vinh Khoa Cơ khí


197
Các bước thực hiện

4. Bắt đầu chuyển đổi ADC: GO/DONE = 1


5. Chờ chuyển đổi ADC được hoàn thành
❑ Giám sát bit GO/DONE (=0 nếu hoàn thành)
❑ Chờ ngắt xảy ra
6. Đọc kết quả từ ADRESH và ADRESL, xóa bit ADIF nếu được
yêu cầu
7. Thực hiện chuyển đổi kế tiếp

TS. Đặng Phước Vinh Khoa Cơ khí


198
Thời gian chuyển đổi

✓ Thời gian chuyển đổi ADC cho mỗi bit được xác định là TAD
✓ Để chuyển đổi 10 bit → cần tối thiểu 12 TAD
✓ Nguồn xung clock cho khối ADC được lựa chọn từ ADCS1:ADCS0
✓ Để chuyển đổi ADC được chính xác → TAD = 1.6µ
ADCON1 ADCON0
Clock Conversion
<ADCS2> <ADCS1:ADCS0>
0 00 FOSC/2
0 01 FOSC/8
0 10 FOSC/32
1 00 FOSC/4
1 01 FOSC/16
1 10 FOSC/64
TS. Đặng Phước Vinh Khoa Cơ khí
x 11 FRC (xung clock lấy từ bộ dao động nội RC)
199
Lưu ý

✓ Các chân dùng làm ngõ vào tương tự → thiết lập input

✓ Nếu thiết lập là output → ngõ ra số

✓ Để bắt đầu quá trình chuyển đổi → GO/DONE = 1

✓ Xóa bit GO/DONE trong thời gian chuyển đổi


❑ Hủy bỏ quá trình đang chuyển đổi
❑ Giá trị trên ADRESH:ADRESL sẽ không được cập
nhật

TS. Đặng Phước Vinh Khoa Cơ khí


200
Chu kỳ chuyển đổi ADC

TS. Đặng Phước Vinh Khoa Cơ khí


201
Trong CCS

#device ADC = 10
SETUP_ADC(ADC_CLOCK_DIV_2);
SETUP_ADC_PORTS(AN0_AN1_AN2_AN3_AN4);
SET_ADC_CHANNEL(0);
DELAY_US(10);
VALUE = READ_ADC();

TS. Đặng Phước Vinh Khoa Cơ khí


202
Đọc giá trị từ LM35

TS. Đặng Phước Vinh Khoa Cơ khí


203
Đọc giá trị từ biến trở

TS. Đặng Phước Vinh Khoa Cơ khí


CHƯƠNG 7

GIAO TIẾP NỐI TIẾP


Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015
205
Các chuẩn giao tiếp nối tiếp

1. Giao diện đồng bộ nối tiếp


MSSP (Master Synchronous Serial Port)
❑SPI (Serial Peripheral Interface)
❑I2C (Inter-Intergrated Circuit)
o I2C Master Mode

2. Giao tiếp cổng nối tiếp


USART (Universal Synchronous Asynchronous Receiver Transmitter)

TS. Đặng Phước Vinh Khoa Cơ khí


GIAO TIẾP I2C
207
Giao tiếp I2C (Inter-Intergrated Circuit)

Định địa chỉ thiết bị: 7-bit or 10 bit +5V


Rkéo: 1.8 – 47kΩ 1 Master +3.3V
1.8kΩ , 4.7kΩ ,10kΩ 128 thiết bị
127 Slaves
VCC

Cần: 16 địa chỉ dự trữ 1 Master


Rp → Tối đa là 112 nút có thể 111 Slaves khác nhau Serial Clock
giao tiếp trên cùng một bus
SCL

SDA
I2C bus Serial
Data
MCU Sensor ADC EEPROM MCU Line
Master Slave Slave Slave Slave

TS. Đặng Phước Vinh Khoa Cơ khí


208
Chế độ hoạt động

Mode Speed
Standard Mode: 100 kbit/s
1 Master – 1 Slave
Low-speed Mode: 10 kbit/s

1 Master – multi-Slave Fast Mode: 400 kbit/s

Fast Mode Plus: 1 Mbit/s


Multi-Master – Multi-Slave
High-speed Mode : 3.4 Mbit/s

TS. Đặng Phước Vinh Khoa Cơ khí


209
Giản đồ thời gian

Idle Idle
Status Status

Start Stop
Transper data

Start sequence
TS. Đặng Phước Vinh Khoa Cơ khí
210
Đọc 1 byte ▪ Master gởi cho Slave
▪ Bằng phần mềm

Stop
Start Re-Start Sequence
Sequence Write Sequence Read
NAK

ST Device Add. (7 bit) W Register Add (8 bit) SR Device Add. (7 bit) R NAK SP
Master

AK AK AK Data (8 bit)
Slave
AK AK AK

AK (ACK) : Acknowledge = ‘0’ ▪ Slave gởi cho Master


▪ Tự động gởi
NAK (NACK) : Not Acknowledge = ‘1’
TS. Đặng Phước Vinh Khoa Cơ khí
211
Đọc nhiều byte
Start Write Re-Start Read AK

ST Device Add. (7 bit) W Register Add (8 bit) SR Device Add. (7 bit) R AK


Master

AK AK AK Data (8 bit)
Slave
AK AK AK
NAK Stop

AK AK NAK SP
Master

Data (8 bit) Data (8 bit) Data (8 bit)


Slave
TS. Đặng Phước Vinh Khoa Cơ khí
212
Ghi 1 byte

Start Stop
Sequence Write Sequence

Master ST Device Add. (7 bit) W Register Add (8 bit) Data (8 bit) SP

Slave AK AK AK

AK AK AK

AK (ACK) : Acknowledge = ‘0’


NAK (NACK) : Not Acknowledge = ‘1’
TS. Đặng Phước Vinh Khoa Cơ khí
213
Ghi nhiều byte

Start Stop
Sequence Write Sequence

ST Device Add. (7 bit) W Register Add (8 bit) Data (8 bit) Data (8 bit) SP
Master

AK AK AK AK
Slave
AK AK AK AK

AK (ACK) : Acknowledge = ‘0’


NAK (NACK) : Not Acknowledge = ‘1’
TS. Đặng Phước Vinh Khoa Cơ khí
214
I2C – Các thanh ghi liên quan

1. SSPCON1, SSPCON2
❑ Điều khiển MSSP
❑ Cho phép đọc ghi
2. SSPSTAT
❑ Chứa các trạng thái hoạt động của MSSP
❑ Chỉ cho phép đọc & ghi ở 2 bit đầu, 6 bit còn lại chỉ đọc
3. SSPBUF: chứa dữ liệu truyền nhận nối tiếp
4. SSPSR: thanh ghi dịch dùng để truyền nhận dữ liệu
5. SSPADD: chứa giá trị tạo ra tốc độ baud cho xung clock dùng để truyền
nhận dữ liệu tại chân SCL

TS. Đặng Phước Vinh Khoa Cơ khí


215
SSPCON - MSSP CONTROL REGISTER 1

WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

bit 7 WCOL: Write Collision Detect Bit


1: đưa dữ liệu truyền đi vào thanh ghi SSPBUF trong khi chế độ
truyền dữ liệu của I2C chưa sẵn sàng
0: không có hiện tượng trên diễn ra

bit 6: SSPOV: Receive Overflow Indicator bit


Bit này chỉ có tác dụng khi nhận dữ liệu
1: dữ liệu mới được đưa vào SSPBUF trong khi dữ liệu cũ chưa
được đọc
0: không có hiện tượng trên xảy ra

TS. Đặng Phước Vinh Khoa Cơ khí


216
SSPCON1 - MSSP CONTROL REGISTER 1

WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

bit 5: SSPEN: Synchronous Serial Port Enable bit


1: cho phép cổng giao tiếp nối tiếp MSSP (chân SDA và SCL)
0: không cho phép cổng giao tiếp nối tiếp MSSP

bit 4: CKP: không có tác dụng trong chế độ I2C Master Mode

bit 3:0 SSPM<3:0>: Synchronous Serial Port Mode Select bits


1000 I2C Master mode, xung clock = FOSC/(4*(SSPADD + 1))

TS. Đặng Phước Vinh Khoa Cơ khí


217
SSPCON2 - MSSP CONTROL REGISTER 2

GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

bit 7: GCEN: General Call Enable bit


1: cho phép ngắt khi địa chỉ 0000h được nhận vào SSPSR
0: không cho phép chế độ địa chỉ trên

bit 6: ACKSTAT: Acknowledge Status bit (chỉ có tác dụng khi truyền
dữ liệu ở chế độ I2C Master Mode)
1: chưa nhận được xung ACK từ I2C Slave
0: nhận được xung ACK từ I2C Slave

TS. Đặng Phước Vinh Khoa Cơ khí


218
SSPCON2 - MSSP CONTROL REGISTER 2

GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

bit 5: ACKDT: Acknowledge Data bit (chỉ có tác dụng khi nhận dữ
liệu ở chế độ I2C Master Mode)
1: Not Acknowledge
0: Acknowledge

bit 4: ACKEN: Acknowledge Sequency Enable bit (chỉ có tác dụng khi
nhận dữ liệu ở chế độ I2C Master Mode)
1: Cho phép xung ACK xuất hiện ở chân SDA và SCL khi kết
thúc quá trình nhận dữ liệu. Tự động xóa bởi phần cứng
0: không cho phép chế độ trên
TS. Đặng Phước Vinh Khoa Cơ khí
219
SSPCON2 - MSSP CONTROL REGISTER 2

GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

bit 3: RCEN: Receive Enable bit (chỉ có tác dụng khi ở chế độ Master)
1: cho phép nhận dữ liệu ở chế độ I2C
0: không cho phép

bit 2: PEN: Stop Condition Enable bit


1: Cho phép thiết lập điều kiện STOP ở 2 chân SDA và SCL
0: không cho phép chế độ trên

TS. Đặng Phước Vinh Khoa Cơ khí


220
SSPCON2 - MSSP CONTROL REGISTER 2

GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

bit 1: RSEN: Repeated Start Condition Enable bit


1: cho phép thiết lập điều kiện START lặp lại liên tục trên 2
chân SDA và SCL
0: không cho phép

bit 0: SEN: Start Condition Enable bit


1: Cho phép thiết lập điều kiện START ở 2 chân SDA và SCL
0: không cho phép chế độ trên

TS. Đặng Phước Vinh Khoa Cơ khí


221
SSPSTAT - MSSP STATUS REGISTER

SMP CKE D/A P S R/W UA BF

bit 7: SMP: Slew Rate Control bit


1: dùng tốc độ chuẩn (100 kHz and 1 MHz)
0: dùng tốc độ cao (400 kHz)

bit 4: P: Stop bit


1: vừa nhận được bit STOP
0: chưa nhận được bit STOP

bit 3: S: Start bit


1: vừa nhận được bit START
0: chưa nhận được bit START

TS. Đặng Phước Vinh Khoa Cơ khí


222
SSPSTAT - MSSP STATUS REGISTER

SMP CKE D/A P S R/W UA BF

bit 2: R/W: Read/Write bit information


1: đang truyền dữ liệu
0: không truyền dữ liệu

bit 0: BF: Buffer Full Status bit


1: thanh ghi SSPBUF đang chứa dữ liệu truyền đi hoặc nhận
được
0: thanh ghi SSPBUF không có dữ liệu

TS. Đặng Phước Vinh Khoa Cơ khí


223

RC4

RC3

TS. Đặng Phước Vinh Khoa Cơ khí


224
Sơ đồ khối BRG (Baud Rate Generator)

TS. Đặng Phước Vinh Khoa Cơ khí


225
Quá trình START

Điều kiện START sẽ không được hình thành nếu


▪ Chân SCL và SDA ở mức thấp hoặc
▪ Trong quá trình tạo điều kiện START, chân SCL được đưa về trạng thái
logic thấp trước khi chân SDA được đưa về mức logic thấp
TS. Đặng Phước Vinh Khoa Cơ khí
226
Quá trình START LIÊN TỤC

RSEN = 1

TS. Đặng Phước Vinh Khoa Cơ khí


227
Quá trình STOP

TS. Đặng Phước Vinh Khoa Cơ khí


228
LỊCH VẠN NIÊN

TS. Đặng Phước Vinh Khoa Cơ khí


229
IC DS1307

TS. Đặng Phước Vinh Khoa Cơ khí


230
IC DS1307

TS. Đặng Phước Vinh Khoa Cơ khí


231
IC DS1307

TS. Đặng Phước Vinh Khoa Cơ khí


GIAO TIẾP USART
233
Giao tiếp USART

✓ USART (Universal Synchronous Asynchronous Receiver Transmitter)


là một trong hai module I/O nối tiếp

✓ Còn được gọi là giao tiếp truyền thông nối tiếp (Serial
Communications Interface - SCI)

✓ Hai chân dùng cho USART:


▪ RC6/TX/CK
▪ RC7/RX/DT

✓ Chế độ:
▪ Bất đồng bộ (Asynchronous)
▪ Đồng bộ (Master mode)
▪ Đồng bộ (Slave mode)

TS. Đặng Phước Vinh Khoa Cơ khí


234
Các dạng giao tiếp nối tiếp USART

Chỉ giao tiếp theo 1


chiều

Giao tiếp 2 chiều


Có thể giao tiếp cùng
thời điểm

Giao tiếp 2 chiều


Không thể giao tiếp
cùng thời điểm

TS. Đặng Phước Vinh Khoa Cơ khí


235
Tốc độ giao tiếp

✓ Tốc độ bit (Bit rate)


▪ Số lượng bit được gởi đi trong một giây (bps)

✓ Tốc độ baud (baud rate)


▪ Số lượng ký tự được gởi trong một giây
▪ Ký tự có thể 1 hoặc nhiều bit
▪ Với USART trong PIC 16F877A, 1 ký tự = 1 bit

Bit rate ≡ baud rate

TS. Đặng Phước Vinh Khoa Cơ khí


236
USART Đồng bộ và bất đồng bộ
Đồng bộ TX RX
✓ Truyền một khối dữ liệu (ký tự) trong cùng một
thời điểm RX TX
✓ Giao tiếp theo chế độ half-duplex
CLK
✓ Một chân tạo xung clock ngoại từ master đến slave
✓ Chỉ sử dụng trong phạm vi ngắn
✓ Có thể thêm bit START, STOP, và tín hiệu chọn chip

TX RX
Bất đồng bộ
✓ Truyền một byte dữ liệu trong một thời điểm RX TX
✓ Giao tiếp theo chế độ full-duplex
✓ Không có chân tạo xung clock
✓ Có bit START và bit STOP, bit chẵn lẻ…

TS. Đặng Phước Vinh Khoa Cơ khí


237
Chế độ USART bất đồng bộ

✓ Hoạt động theo chuẩn NRZ (None-Return-to-Zero)


→ 1 bit START (0) + 8 bit DATA + 1 bit STOP (1)

✓ Bit LSB được truyền đi trước

✓ Các khối truyền và nhận dữ liệu độc lập với nhau sẽ dùng chung
tần số tương ứng với tốc độ baud

✓ Khối truyền và nhận phải dùng chung một định dạng dữ liệu

TS. Đặng Phước Vinh Khoa Cơ khí


238
Sơ đồ khối TRUYỀN trong USART

TXSTA

RCSTA

TS. Đặng Phước Vinh Khoa Cơ khí


239
TXSTA: Transmit status and control register

CSRC TX9 TXEN SYNC - BRGH TRMT TX9D

bit 5 TXEN: Transmit Enable Bit


1: cho phép truyền
0: không cho phép truyền

bit 4: SYNC: USART Mode Select bit


1: dạng đồng bộ
0: dạng bất đồng bộ

TS. Đặng Phước Vinh Khoa Cơ khí


240
TXSTA: Transmit status and control register

CSRC TX9 TXEN SYNC - BRGH TRMT TX9D

bit 2 BRGH: High Baud Rate Select Bit


chỉ có tác dụng ở chế độ bất đồng bộ
1: tốc độ cao
0: tốc độ thấp

bit 1: TRMT: Transmit Shift Register Status bit


1: thanh ghi TSR không có dữ liệu
0: thanh ghi TSR có dữ liệu

TS. Đặng Phước Vinh Khoa Cơ khí


241
RCSTA: Receive status and control register

SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

bit 7 SPEN: Serial Port Enable Bit


1: cho phép cổng nối tiếp hoạt động
0: không cho phép cổng nối tiếp hoạt động

TS. Đặng Phước Vinh Khoa Cơ khí


242
Truyền dữ liệu

✓ Thành phần quan trọng nhất: thanh ghi dịch TSR (Transmit
Shift Register)

✓ Dữ liệu cần truyền sẽ được đưa trước vào thanh ghi TXREG

✓ TSR sẽ lấy dữ liệu từ thanh ghi đệm TXREG


▪ Thanh ghi TXREG bị rỗng
▪ Cờ TXIF (PIR1<4>) sẽ được set lên 1
▪ Cờ TXIF không xóa được bằng phần mềm
▪ Cờ TXIF chỉ được xóa khi có dữ liệu mới được đưa vào
TXREG

TS. Đặng Phước Vinh Khoa Cơ khí


243
Truyền dữ liệu

✓ Trạng thái thanh ghi TSR → cờ TRMT (TXSTA<1>)

✓ TMRT = 1 → thanh ghi TSR rỗng


▪ Bit này chỉ đọc

✓ Thanh ghi TSR không có trong bộ nhớ dữ liệu và chỉ được điều
khiển bởi CPU

✓ TXEN = 1: cho phép khối truyền dữ liệu hoạt động

✓ Quá trình truyền chỉ bắt đầu khi


▪ Có dữ liệu trong thanh ghi TXREG
▪ Xung truyền baud được tạo ra

TS. Đặng Phước Vinh Khoa Cơ khí


244
Sơ đồ khối TRUYỀN trong USART

TS. Đặng Phước Vinh Khoa Cơ khí


245
Các bước thực hiện khi TRUYỀN

1. Tạo xung truyền tốc độ baud (đưa giá trị vào thanh ghi SPBRG)
2. Cho phép cổng giao tiếp nối tiếp bất đồng bộ hoạt động →
SYNC = 0 & SPEN = 1
3. Set bit TXIE nếu cần sử dụng ngắt
4. Set bit TX9 nếu cần truyền 9 bit dữ liệu
5. Set bit TXEN để cho phép truyền dữ liệu
6. Đưa bit thứ 9 vào TX9D (nếu truyền dữ liệu 9 bit)
7. Đưa 8 bit dữ liệu cần truyền vào thanh ghi TXREG
8. Kiểm tra bit GIE và PEIE nếu sử dụng ngắt truyền

TS. Đặng Phước Vinh Khoa Cơ khí


246
Sơ đồ khối NHẬN trong USART

TS. Đặng Phước Vinh Khoa Cơ khí


247
RCSTA: Receive status and control register

SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

bit 7 SPEN: Serial Port Enable Bit


1: cho phép cổng nối tiếp hoạt động
0: không cho phép cổng nối tiếp hoạt động

bit 4 CREN: Continuous Receive Enable bit


1: cho phép nhận một chuỗi dữ liệu liên tục
0: không cho phép nhận

TS. Đặng Phước Vinh Khoa Cơ khí


248
RCSTA: Receive status and control register

SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

bit 2 FERR: Framing Error Bit


1: xuất hiện lỗi “framing” trong quá trình nhận dữ liệu
0: không xuất hiện lỗi

bit 1 OERR: Overrun Error bit


1: lỗi tràn dữ liệu (có thể xóa bằng cách xóa bit CREN)
0: không có lỗi tràn dữ liệu

TS. Đặng Phước Vinh Khoa Cơ khí


249
Lỗi “Framing”: lỗi khung truyền

✓ Xuất hiện khi khối nhận (thanh ghi RSR) không nhận được bit
STOP đúng thời điểm
→ Khối truyền và nhận hoạt động với tốc độ baud khác nhau

✓ Khi xuất hiện lỗi → FERR = 1


✓ Dữ liệu mới vẫn có thể được truyền đi khi xảy ra lỗi “framing”
✓ Khi dữ liệu mới được truyền → FERR = 0
✓ Phải kiểm tra bit FERR trước khi đọc dữ liệu mới
✓ Bit FERR không thể xóa bằng phần mềm.
✓ Xóa bit FERR bằng cách xóa bit SPEN (RCSTA<7>)
TS. Đặng Phước Vinh Khoa Cơ khí
250
Sơ đồ khối NHẬN trong USART

TS. Đặng Phước Vinh Khoa Cơ khí


251
Nhận dữ liệu

✓ Dữ liệu được nhận từ chân RC7/RX/DT và đi qua khối phục hồi


dữ liệu
✓ Thực chất là một thanh ghi dịch tốc độ cao (gấp 16 hoặc 64
lần tốc độ baud)

✓ Thành phần quan trọng nhất: thanh ghi dịch RSR (Receive Shift
Register)

✓ Bit điều khiển cho phép nhận dữ liệu: CREN (RCSTA<4>)

✓ Dữ liệu nhận được trong thanh ghi RSR sẽ được đưa vào thanh
ghi RCREG → cờ RCIF = 1 (RCIF = 0 khi dữ liệu tại RCREG đã
được đọc)
TS. Đặng Phước Vinh Khoa Cơ khí
252
Nhận dữ liệu

✓ RCREG là thanh ghi có bộ đệm kép hoạt động theo cơ chế FIFO (First
In First Out)
▪ RCREG có thể nhận 2 byte dữ liệu
▪ Byte thứ 3 tiếp tục đưa vào thanh ghi RSR

✓ Nếu bit STOP của byte thứ 3 đã được nhận mà thanh ghi RCREG vẫn
đầy:
▪ Cờ báo tràn OERR sẽ được set
▪ Dữ liệu trong thanh ghi RSR sẽ bị mất
▪ Quá trình đưa dữ liệu từ RSR đến RCREG sẽ bị gián đoạn

→ Phải lấy hết dữ liệu của thanh ghi RCREG trước khi nhận dữ liệu
tiếp theo

TS. Đặng Phước Vinh Khoa Cơ khí


253
Nhận dữ liệu

✓ Nếu OERR = 1 → quá trình chuyển dữ liệu từ RSR đến RCREG sẽ


bị cấm

✓ Bit OERR phải được xóa bằng phần mềm: xóa bit CREN rồi set lại

✓ Bit FERR và bit dữ liệu thứ 9 (RX9D) được đưa vào bộ đệm như 8
bit dữ liệu

✓ Đọc thanh ghi RCREG → cập nhật giá trị mới cho FERR và RX9D
→ Đọc thanh ghi RCSTA trước khi đọc thanh ghi RCREG
TS. Đặng Phước Vinh Khoa Cơ khí
254
Các bước thực hiện khi NHẬN
1. Tạo xung truyền tốc độ baud (đưa giá trị vào thanh ghi SPBRG)
2. Cho phép cổng giao tiếp nối tiếp bất đồng bộ hoạt động → SYNC = 0 &
SPEN = 1
3. Set bit RCIE nếu cần sử dụng ngắt
4. Set bit RX9 nếu cần truyền 9 bit dữ liệu
5. Set bit CREN để cho phép truyền dữ liệu
6. Cờ RCIF được set sau khi nhận được dữ liệu
7. Đọc thanh ghi RCSTA để đọc bit dữ liệu thứ 9 và kiểm tra xem quá trình
nhận dữ liệu có bị lỗi hay không
8. Đọc dữ liệu 8 bit từ thanh ghi RCREG
9. Nếu quá trình nhận dữ liệu bị lỗi → xóa bit CREN
10.
TS. Kiểm tra bit
Đặng Phước GIE và PEIE nếu sử dụng ngắt nhận
Vinh Khoa Cơ khí
255
Giao tiếp nối tiếp UART – RS232

✓ Các chip vi điều khiển: chuẩn UART (hay chuẩn TTL)


▪ Chuyển 1 bit trong một đơn vị thời gian theo một tốc độ truyền
nhận dữ liệu quy định (tốc độ baud)
▪ Mức “0” → 0V
▪ Mức “1” → từ 3.3V tới 5V

✓ Máy tính: chuẩn RS232 (Recommeded Standard 232)


▪ Chuyển 1 bit trong một đơn vị thời gian theo một tốc độ truyền
nhận dữ liệu quy định (tốc độ baud)
▪ Cổng COM của máy tính
▪ Mức “0” → từ +3.5V tới +25V
▪ Mức “1” → từ –3.5V tới –25V
Dùng IC MAX232
TS. Đặng Phước Vinh Khoa Cơ khí
256
Cổng COM 9 chân

TS. Đặng Phước Vinh Khoa Cơ khí


257
Cổng COM 9 chân - Male

TS. Đặng Phước Vinh Khoa Cơ khí


258
Cổng COM 9 chân - Female

TS. Đặng Phước Vinh Khoa Cơ khí


259
Cổng COM 25 chân
1 13

14 25

13 1

25 14

TS. Đặng Phước Vinh Khoa Cơ khí


260
MAX 232

TS. Đặng Phước Vinh Khoa Cơ khí


261
Đặc điểm & Ứng dụng

✓ Các PCs sử dụng chuẩn RS232 (cổng COM)


✓ Không yêu cầu tốc độ cao
✓ Giá thành rẻ
✓ Phần cứng đơn giản
✓ Tốc độ truyền nhận tối đa: 20kbit/s
✓ Khoảng cách truyền nhận tối đa: 15m
✓ Tuy nhiên ít phổ biến với các ứng dụng hiện nay
→ Thay thế bằng các chuẩn tốc độ cao hơn, giao diện tinh
vi hơn: USB, Ethernet

TS. Đặng Phước Vinh Khoa Cơ khí


262
Tạo cổng COM ảo

TS. Đặng Phước Vinh Khoa Cơ khí


263
Giao tiếp nối tiếp UART – RS232

RS232 cable

TS. Đặng Phước Vinh Khoa Cơ khí


264
USB to COM

TS. Đặng Phước Vinh Khoa Cơ khí


265
USB to COM

TS. Đặng Phước Vinh Khoa Cơ khí


266
Giao tiếp nối tiếp UART – RS232

C1 10uF
U4
1 15 1 3 P1
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2 17 1
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1 C1+ C1- DCD
3 18 6
RA1/AN1/C12IN1- RC3/SCK/SCL DSR
4 23 11 14 2
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA T1IN T1OUT RXD
5 24 12 13 7
RA3/AN3/VREF+/C1IN+ RC5/SDO R1OUT R1IN RTS
6 25 10 7 3
RA4/T0CKI/C1OUT RC6/TX/CK T2IN T2OUT TXD
7 26 9 8 8
RA5/AN4/SS/C2OUT RC7/RX/DT R2OUT R2IN CTS
14 4
RA6/OSC2/CLKOUT DTR
13 19 2 9
RA7/OSC1/CLKIN RD0 VS+ RI
20 6
RD1 VS-
33 21
RB0/AN12/INT RD2
34
RB1/AN10/C12IN3- RD3
22
C2+ C2- C4 C3 ERROR
35 27 10uF 10uF
RB2/AN8 RD4
36 28 COMPIM
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29 4 5
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D C2
39 10uF
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9 D9
RE1/AN6
10
R9
RE2/AN7
270R
PIC16F877A LED

TS. Đặng Phước Vinh Khoa Cơ khí


267
Trong CCS

#use rs232(baud = 9600, parity = N, xmit = PIN_C6, rcv = PIN_C7)

▪ #use rs232: cung cấp cho trình biên dịch thông tin về các tham
số cấu hình RS232 sẽ sử dụng để giao tiếp

▪ baud = 9600: khai báo tốc độ baud sử dụng là 9600

▪ parity = N: khai báo có sử dụng bit kiểm tra chẳn lẻ hay không, ở
đây ta không kiểm tra nên thiết lập parity = N

▪ xmit = PIN_C6: Chân truyền dữ liệu là PIN C6

▪ rcv = PIN_C7: Chân nhận dữ liệu là PIN C7


TS. Đặng Phước Vinh Khoa Cơ khí
268
Trong CCS

Để nhận dữ liệu từ máy


tính thông qua truyền
thông nối tiếp RS232, ta
sử dụng lệnh getch()

char c;
c = getch();

TS. Đặng Phước Vinh Khoa Cơ khí


269
MATLAB

✓ Matlab: MATrix LABoratory


✓ Công ty MathWorks thiết kế.
✓ Matlab cho phép tính toán số
với ma trận, vẽ đồ thị, xử lý
tín hiệu số, tối ưu hóa, xử lý
ảnh, tạo các giao diện người
dùng …
✓ Các phiên bản của Matlab
được ký hiệu theo năm mà
chúng được giới thiệu đi
kèm với chữ “a” hoặc “b”.

TS. Đặng Phước Vinh Khoa Cơ khí


270
MATLAB

Tab chức
năng

Vùng thực hiện lệnh Vùng chứa


các biến
được tạo ra

Thư mục
hiện hành

TS. Đặng Phước Vinh Khoa Cơ khí


271
MATLAB - Script

TS. Đặng Phước Vinh Khoa Cơ khí


272
MATLAB - GUIDE

Tạo giao diện đồ họa người dùng GUI (Graphical User Interface) để
kết nối với vi điều khiển PIC thông qua cổng COM

TS. Đặng Phước Vinh Khoa Cơ khí


273
MATLAB – Cổng COM

Tạo một biến cổng COM


ten_bien = serial(‘ten_cong_com’);
s = serial(‘COM1’);

Xem các thông số của cổng COM


get(tenbien);
get(s);

Chỉnh sửa các thông số cơ bản


set(ten_bien, ‘ten_thong_so’, gia_tri);
set(s,‘BaudRate’, 9600);

TS. Đặng Phước Vinh Khoa Cơ khí


274
MATLAB – Cổng COM
Mở cổng COM
fopen(ten_bien);
fopen(s);

Đóng cổng COM


fclose(ten_bien);
fclose(s);

Đọc các cổng COM trong bộ nhớ đến vùng làm việc của Matlab
(workspace)
object = instrfind;

Gửi dữ liệu
fwrite(tenbien, gia_tri gia_tri);
fwrite(s, 1);
TS. Đặng Phước Vinh Khoa Cơ khí
275
MATLAB GUI – Ví dụ

TS. Đặng Phước Vinh Khoa Cơ khí


the END !
Firma convenzione
Politecnico di Milano e Veneranda Fabbrica
del Duomo di Milano
Aula Magna – Rettorato
Mercoledì 27 maggio 2015

You might also like