Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 1
1 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
LỜI NÓI ĐẦU
Tài liệu này cùng với đề cương chương trình là tài liệu hướng dẫn chính thức cho học viên tham
gia khóa học PIC C18 – Full do Nhóm Đào Tạo BigLab phụ trách.
Tài liệu có giá trị lưu hành nội bộ, được cung cấp miễn phí cho học viên tham gia khóa học.
Mọi thắc mắc về tài liệu xin liên hệ trực tiếp với giảng viên đứng lớp.
Tài liệu được biên soạn lần đầu chắc chắn còn nhiều thiếu sót, rất mong sự góp ý của quý học
viên, độc giả. Mọi ý kiến đóng góp xin liên hệ email: [email protected]
Nhóm biên soạn
BigLab
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 2
2 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
MỤC LỤC
BỘ CHƯƠNG TRÌNH T ẠI BIGLAB ........................................................................... 8
ĐỀ CƯƠNG CHƯƠNG TRÌNH PIC TOTAL ............................................................ 11
Bài 1 : NHỮNG KHÁI NI ỆM BAN ĐẦU ................................................................... 17
1.1 VI ĐIỀU KHIỂN LÀ GÌ ...................................................................................... 17
1.2 TỔNG THỂ KIẾN TRÚC PHẦN CỨNG VI ĐIỀU KHIỂN ................................ 19
1.3 LỰA CHỌN DÒNG VI ĐIỀU KHIỂN ................................................................ 22
1.4 CÁC NGÔN NGỮ LẬP TRÌNH CHO VI ĐIỀU KHIỂN ..................................... 22
Bài 2 : KỸ THUẬT LẬP TRÌNH C ............................................................................. 24
2.1 KHÁI QUÁT NGÔN NGỮ C .............................................................................. 24
2.2 NHỮNG VẤN ĐỀ LIÊN QUAN KHI SỬ DỤNG C CHO LẬP TRÌNH PIC ....... 31
Bài 3 : BỘ NHỚ, BỘ DAO ĐỘNG VÀ THANH GHI H Ệ THỐNG .......................... 33
3.1 BỘ NHỚ ............................................................................................................. 33
3.2 BỘ DAO ĐỘNG .................................................................................................. 36
3.3 TIỀN XỬ LÝ VÀ THANH GHI HỆ THỐNG ...................................................... 38
3.4 BÀI TẬP .............................................................................................................. 39
Bài 4 : IO PORT – OUTPUT ....................................................................................... 40
4.1 GIỚI THIỆU PHẦN CỨNG ................................................................................ 40
4.2 BÀI TẬP - CÁC ỨNG DỤNG CỦA IO PORT-PHẦN OUTPUT ........................ 42
4.3 BÀI TẬP VỀ NHÀ: ............................................................................................. 44
4.4 PHỤ LỤC – CHUẨN LOGIC NGÕ RA CỦA IO PORT ..................................... 45
Bài 5 : NGẮT (INTERRUPTS) .................................................................................... 46
5.1 ĐỊNH NGHĨA NGẮT .......................................................................................... 46
5.2 PHÂN LOẠI NGẮT ............................................................................................ 46
5.3 HOẠT ĐỘNG CỦA NGẮT ................................................................................. 47
5.4 TƯƠNG TÁC VỚI NGẮT ................................................................................... 49
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 3
3 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
5.5 BÀI TẬP .............................................................................................................. 51
Bài 6 : IO PORT - INPUT ............................................................................................ 52
6.1 MÔ TẢ PHẦN CỨNG ......................................................................................... 52
6.2 BÀI TẬP – ỨNG DỤNG IO PORT - INPUT ....................................................... 52
6.3 PHỤ LỤC ............................................................................................................ 53
Bài 7 : TIMER .............................................................................................................. 55
7.1 NHỮNG KHÁI NIỆM ......................................................................................... 55
7.2 HOẠT ĐỘNG CỦA TIMER ................................................................................ 56
7.3 TƯƠNG TÁC VỚI TIMER.................................................................................. 59
7.4 BÀI TẬP .............................................................................................................. 60
Bài 8 : BÀI TẬP GIỮA KHÓA .................................................................................... 61
8.1 YÊU CẦU ............................................................................................................ 61
8.2 MÔ TẢ PHẦN CỨNG ......................................................................................... 61
8.3 GIẢI THUẬT ...................................................................................................... 62
8.4 CHƯƠNG TRÌNH ............................................................................................... 62
Bài 9 : NGÔN NGỮ LẬP TRÌNH C NÂNG CAO ...................................................... 63
9.1 TÀI LI ỆU THAM KHẢO .................................................................................... 63
9.2 CÁC HÀM THÔNG DỤNG TRONG THƯ VIỆN C CHUẨN: ............................ 63
Bài 10 : IO PORT NÂNG CAO – LCD ....................................................................... 66
10.1 TỔNG QUAN VỀ LCD ....................................................................................... 66
10.2 CẤU TRÚC PHẦN CỨNG (LCD- HD 44780) ................................................... 67
10.3 TẬP LỆNH ........................................................................................................... 67
10.4 TƯƠNG TÁC VĐK - LCD .................................................................................... 67
Các hàm tương tác cơ bản: ......................................................................................... 68
Bài 11 : TIMER 1, 2, 3.................................................................................................. 70
11.1 TÀI LI ỆU THAM KHẢO .................................................................................... 70
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 4
4 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
11.2 CẤU TRÚC PHẦN CỨNG TIMER 1, 2, 3 (Tham khảo bài số 7) ........................ 70
11.3 SỬ DỤNG THƯ VIỆN C18 CHO VIỆC CÀI ĐẶT TIMER ................................ 71
...... 73
Bài 12 : ADC (ANALOG – DIGITAL CONVERT) ........... ......................................... 75
12.1 TÀI LI ỆU THAM KHẢO .................................................................................... 75
12.2 TỔNG QUAN VỀ ADC ....................................................................................... 75
12.3 BỘ CHUYỂN ĐỔI ADC TRONG VĐK .............................................................. 76
Bài 13 : USART ............................................................................................................ 81
13.1 TÀI LI ỆU THAM KHẢO .................................................................................... 81
13.2 KHÁI QUÁT VỀ CÁC CHUẨN GIAO TIẾP ...................................................... 81
13.3 USART TRONG PIC ........................................................................................... 82
Bài 14 : PWM / CAPTURE / COMPARE ................................................................... 86
14.1 TÀI LI ỆU THAM KHẢO .................................................................................... 86
14.2 TỔNG QUAN VỀ PWM/CAPTURE/COMPARE ............................................... 86
14.3 QUY TRÌNH SỬ DỤNG MODULE PWM TRONG PIC ..................................... 89
14.4 PHẦN MỞ RỘNG - ENCODER .......................................................................... 89
Bài 15 : SPI – I2C ......................................................................................................... 92
15.1 TÀI LI ỆU THAM KHẢO .................................................................................... 92
15.2 TỔNG QUAN VỀ SPI ......................................................................................... 92
15.3 HOẠT ĐỘNG CỦA SPI ...................................................................................... 92
15.4 SPI TRONG PIC .................................................................................................. 93
15.5 THƯ VIÊN SPI TRONG C18 .............................................................................. 93
15.6 MỞ RỘNG – I2C ................................................................................................. 94
15.7 CÁC PHƯƠNG PHÁP LƯU TRỮ DỮ LIỆU ...................................................... 96
Bài 16 : BÀI TẬP TỔNG KẾT .................................................................................... 98
16.1 YÊU CẦU ............................................................................................................ 98
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 5
5 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
16.2 MÔ TẢ PHẦN CỨNG ......................................................................................... 99
16.3 GIẢI THUẬT ...................................................................................................... 99
16.4 CHƯƠNG TRÌNH ............................................................................................... 99
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 6
6 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
DANH SÁCH HÌNH V Ẽ
Hình 1.1 - Sơ đồ khối kiến trúc tổng thể một hệ máy tính ................................................... 19
Hình 1.2 - CPU .................................................................................................................. 20
Hình 1.3 - Các dòng vi điều khiển PIC hiện nay ................................................................. 22
Hình 3.2 - Stack memory ................................................................................................... 35
Hình 5.1 - Sơ đồ logic của ngắt trong PIC 18F4550............................................................ 46
Hình 6.1 - Sơ đồ mạch lập trình quét phím đơn .................................................................. 52
Hình 7.1 - Timer 3 bit. ....................................................................................................... 55
Hình 8.1 - Sơ đồ phần cứng mạch thí nghiệm ..................................................................... 61
Hình 16.1 - Sơ đồ phần cứng của mạch thí nghiệm ............................................................. 98
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 7
7 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
DANH SÁCH BẢNG BIỂU
Bảng 1.1 Một vài ứng dụng của vi điều khiển trong thực tế ............................................ 18
Bảng 2.1 Các kiểu dữ liệu trong C ................................................................................. 25
Bảng 2.2 Các cấu trúc lệnh trong C ................................................................................ 27
Bảng 2.3 Toán tử trong C ............................................................................................... 27
Bảng 2.4 Bảng so sánh mức độ ưu tiên của các toán tử: ................................................. 28
Bảng 4.1 Các thanh ghi PORTA .................................................................................... 41
Bảng 4.2 Bảng mã dành cho LED 7 đoạn Anode chung ................................................. 43
Bảng 4.3 Bảng mã dành cho LED 7 đoạn Cathode chung: .............................................. 44
Bảng 9.1 Các kiểu dữ liệu nâng cao trong C ................................................................... 63
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 8
8 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
BỘ CHƯƠNG TRÌNH T ẠI BIGLAB
Bộ chương trình tại Nhóm Đào Tạo Kỹ Thuật BigLab được thiết kế nhằm cung cấp những kiến
thức bổ trợ cần thiết nhất cho các bạn học viên quan tâm tới lĩnh vực liên ngành Cơ khí – Điện tử -
Lập trình, hay còn gọi là Cơ điện tử.
BỘ CHƯƠNG TRÌNH ĐÀO TẠO TẠI BIGLAB
Cơ khí Điện tử Lập trình vi điều khiển
AutoCAD căn bản
SolidWorks căn bản
Thiết kế với AutoCAD
Thiết kế với SolidWorks
OrCAD căn bản
Điện tử thực hành
Điện tử ứng dụng
PIC Cơ bản
PIC Ứng dụng
PIC Full
PIC Full CCSC
PIC Full C18
ARM Total
PIC - Điều khiển động
cơ
PIC – Giao tiếp không
dâyPIC – C#
MỤC TIÊU: THIẾT KẾ HỆ THỐNG TỰ ĐỘNG
Điện tử KTS
Với mục tiêu trên, toàn bộ chương trình được chia làm 3 mảng lớn: Cơ khí, Điện tử, Lập trình.
� Cơ khí:
Ở mảng cơ khí, chương trình sử dụng 2 phần mềm thiết kế: SolidWorks và AutoCAD. Đây là
các phần mềm thông dụng với ưu điểm trực quan, tầm ứng dụng lớn, dễ sử dụng, rất thích hợp cho
các yêu cầu thiết kế cơ khí.
Các lớp về SolidWorks và AutoCAD được chia làm 2 cấp độ: Cơ bản và ứng dụng vào thiết kế
cơ khí.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 9
9 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
- Lớp cơ bản sẽ cung cấp những kiến thức cơ bản về các phần mềm, các phương pháp dựng
hình cơ bản. Đối tượng của lớp cơ bản là các bạn sinh viên năm 2, 3 lần đầu tiên tiếp xúc
với phần mềm
- Lớp thiết kế: Các bạn sẽ được học về phương pháp thiết kế, trình tự thiết kế trong cơ khí,
thiết kế theo trình tự gia công... Sau đó sẽ ứng dụng các kiến thức về phần mềm vào việc
thiết kế cơ khí. Đối tượng chính của lớp thiết kế là những ai đã biết về AutoCAD và
SolidWorks cơ bản, mong muốn sử dụng nó để thiết kế các chi tiết cơ khí.
� Điện tử:
- Lớp điện tử thực hành: Ở lớp này các bạn sẽ được học về các linh kiện điện tử cơ bản dựa
trên sự phân tích vai trò của chúng trong các mạch điện tử như mạch nguồn tuyến tính,
mạch khuếch đại, mạch nguồn xung... Trong chương trình còn tích hợp việc sử dụng các
phần mềm thông dụng trong điện tử như: phần mềm thiết kế mạch OrCAD, phần mềm mô
phỏng mạch Tina,...
- Lớp điện tử kỹ thuật số – vi điều khiển: là phần sau của lớp điện tử thực hành. Trong lớp
này các bạn sẽ được học từ các nguyên lý cơ bản của hệ thống xung, số đến việc thiết kế
hoàn chỉnh một mạch kỹ thuật số. Đặc biệt lớp cung cấp cho các bạn những kiến thức thiết
kế mạch giao liên quan tới vi điều khiển (PIC, ARM...) như mạch hiển thị LED, mạch giao
tiếp máy tính, mạch phím nhấn.... Chương trình có sử dụng các phần mềm điện tử như:
OrCAD, Circuit Maker, Proteus,...
- Lớp điện tử ứng dụng: Đây là lớp nâng cao trong mảng điện tử, cung cấp cho các bạn những
kiến thức phối hợp để có thể thiết kế một mạch điện tử.
� Lập trình nhúng:
Các lớp lập trình nhúng là một mảng lớn được quan tâm nhất của bộ chương trình tại BigLab.
Hiện tại BigLab có các chương trình lập trình cho vi điều khiển: PIC, ARM trong đó bộ chương
trình cho vi điều khiển PIC được thiết kế công phu và đã được thử nghiệm qua nhiều khóa học.
Chương trình PIC được thiết kế theo 2 hướng chính:
- Hướng đầy đủ trong 1 khóa:
Đó là các lớp PIC – Full. Đây là các lớp dạy đầy đủ về vi điều khiển PIC. Các bạn sẽ được học
từ hệ thống tới các module ngoại vi và sử dụng thành thạo ngôn ngữ C để lập trình cho các module
này. Trong hướng này chương trình được chia ra làm 2 hướng nhỏ dựa trên việc sử dụng 2 trình
biên dịch khác nhau: CCSC và C18.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 10
10 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
+ CCSC: Đây là trình biên dịch dễ sử dụng, không cần kiến thức chuyên sâu về hệ thống. Lớp
này thích hợp cho những bạn đã đi làm và mong muốn có kiến thức về lập trình vi điều khiển để sử
dụng trong công việc cụ thể.
+ C18: là trình biên dịch chuyên sâu của Microchip viết riêng cho dòng PIC18. Để sử dụng
trình biên dịch này đòi hỏi các bạn phải có kiến thức sâu về phần cứng vi điều khiển. Chính vì thế
sử thông qua việc lập trình các bạn sẽ hiểu rõ về hoạt động của vi điều khiển hơn, từ đó dễ dàng
tìm hiểu những dòng vi điều khiển khác (như ARM,...).
- Hướng PIC Cơ bản � Ứng dụng:
Đây là bộ chương trình lập trình vi điều khiển PIC được thiết kế đặc biệt dành cho các bạn sinh
viên, những người có đủ thời gian, lòng đam mê cũng như sự kiên nhẫn để theo đuổi và nắm vững
dòng vi điều khiển PIC. Lớp đầu tiên trong bộ này là lớp PIC – Cơ bản: lớp này sẽ cung cấp những
kiến thức cơ bản về lập trình C, vi điều khiển PIC, các nguyên lý hoạt động của vi điều khiển, và
các module hệ thống. Các lớp tiếp theo của chương trình là các lớp ứng dụng vi điều khiển vào
việc giải quyết các bài toán thực tế như điều khiển động cơ, giao tiếp máy tính, giao tiếp không
dây... ở các lớp này các bạn sẽ được học các module ngoại vi tương ứng, sau đó sẽ ứng dụng các
module này vào thực tế công việc.
Toàn bộ chương trình này được thiết kế sử dụng trình biên dịch C18, là một trình biên dịch
chuyên sâu do Microchip phát triển chuyên dụng cho dòng vi điều khiển PIC18F.
� Lớp học ĐỒNG HÀNH, buồi nói chuyện chuyên đề:
Ngoài những chương trình cố định trên Nhóm còn thuờng xuyên mở các lớp học ĐỒNG HÀNH
(miễn phí) và chủ nhật hằng tuần. Đây là nơi các bạn có có hội học tập miễn phí, gặp gỡ giao lưu
và có cơ hội tìm hiểu thêm về lĩnh vực mình đang theo đuổi.
Bên cạnh các buổi học ĐỒNG HÀNH là các buổi nói chuyện chuyên đề chia sẻ kinh nghiệm
học tập, cập nhật kiến thức công nghệ... cũng được tổ chức thường xuyên.
Đây là các chương trình được các Giảng viên trường Đại Học Bách Khoa TPHCM thực hiện
nhằm tạo một không khí gặp gỡ giao lưu, kết nối với toàn thể các bạn sinh viên kỹ thuật để cùng
tạo dựng một cồng đồng vững mạnh hơn trong lĩnh vực kỹ thuật điều khiển tự động.
Mọi thắc mắc xin liên hệ website chính thức của nhóm: www.biglab.edu.vn hoặc thông qua
diễn đàn: www.dieukhienvietnam.com
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 11
11 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
ĐỀ CƯƠNG CHƯƠNG TRÌNH PIC TOTAL
I. MỤC TIÊU VÀ ĐỐI TƯỢNG 1. Đối tượng khóa học
Đối tượng chính của khóa học dành cho những ai muốn làm quen và đi đến nắm vững vi
điều khiển PIC, ứng dụng PIC cho các công việc điều khiển, giao tiếp.
2. Mục tiêu khóa học:
Hoàn thành khóa học học viên sẽ:
- Nắm được tổng quan các chức năng trong các dòng vi điều khiển của hãng Microchip và cách lựa chọn dòng vi điều khiển phù hợp.
- Hiểu rõ vi điều khiển PIC - Nắm được cách sử dụng các modul của dòng vi điều khiển PIC18F, đọc và hiểu datasheet để sau này có thể dễ dàng tiếp cận những dòng vi điều khiển khác.
- Lập trình sử dụng tất cả các module của vi điều khiển bằng ngôn ngữ C. - Mô phỏng chương trình và hiện thực trên kit thí nghiệm. - Được sự tư vấn, hỗ trợ trực tiếp từ các thạc sĩ, kỹ sư có kinh nghiệm trong và sau khóa học. II. NỘI DUNG CHƯƠNG TRÌNH
Chương trình xây dựng dựa trên dòng vi điều khiển PIC18 của hãng Microchip. Ngôn ngữ lập
trình sử dụng: C18. Dòng vi điều khiển sử dụng thí nghiệm là PIC18F4620.
Chương trình sẽ cung cấp cho học viên những kiến thức về vi điều khiển PIC từ cơ bản tới nâng
cao. Giúp học viên thực hành thành thạo việc sử dụng các module chức năng trong vi điều khiển,
tiến tới ứng dụng vi điều khiển PIC để giải quyết các vấn đề thực tế. Chương trình cũng có nhiều
bài tập thực hành thực tế liên quan.
Đề cương chi tiết (18 buổi)
- Buổi 1: Những khái niệm cơ bản về vi điều khiển o Vi điều khiển là gì? Những dòng vi điều khiển có trên thị trường o Cấu trúc phần cứng vi các dòng vi điều khiển cơ bản o Giới thiệu phần mềm sử dụng, kit thí nghiệm, bộ thí nghiệm PIC o Bổ túc kỹ thuật lập trình C cho vi điều khiển
� Các hệ số đếm � Biến và hằng
- Buổi 2: Bổ túc kỹ thuật lập trình C cho vi điều khiển (tt) o Con trỏ, mảng o Cấu trúc lệnh
� Cấu trúc điều kiện � Cấu trúc lặp � Cấu trúc lựa chọn
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 12
12 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
o Hàm o Toán tử o Cấu trúc và cách thực thi chương trình C o Những kiến thức căn bản về tổ chứ bộ nhớ PIC
- Buổi 3: Tổ chức phần cứng của PIC o Thanh ghi hệ thống o Các vấn đề liên quan tới bộ dao động, tiền xử lý o Giới thiệu các module của vi điều khiển o Bài tập: Viết code cài đặt phần cứng cho vi điều khiển PIC o Giới thiệu các phần mềm và ngôn ngữ sử dụng
� Trình biên dịch C complier � C complier và MPLAB � Proteus và mô phỏng bằng Proteus
- Buổi 4: Các module căn bản của vi điều khiển PIC o Lý thuyết:
� Tổ chức phần cứng � Các thanh ghi điều khiển PORT
o Bài tập: � Lập trình xuất led đơn
- Buổi 5: Các module căn bản của vi điều khiển PIC (tt) o Bài cũ:
� Lập trình hiển thị led 7 đoạn o Lý thuyết:
� Tổ chức phần cứng của interrupt � Các thanh ghi điều khiển interrupt trong PIC
o Bài tập về nhà: � Lập trình sử dụng đọc phím đơn bằng ngắt ngoài
- Buổi 6: Các module căn bản của vi điều khiển PIC (tt) o Bài cũ:
� Lập trình đọc số lần nhấn phím hiển thị ra led 7 đoạn o Lý thuyết:
� Các thanh ghi điều khiển input o Bài tập:
� Lập trình đọc 4 phím đơn (sử dụng phương pháp quét) o Bài tập về nhà:
� Lập trình đọc 4 phím đơn bằng phương pháp ngắt RB - Buổi 7: Các module căn bản của vi điều khiển PIC (tt)
o Bài cũ: � Lập trình quét phím ma trận
o Lý thuyết: � Tổ chức phần cứng timer � Các thanh ghi điều khiển timer trong PIC � Watch Dog Timer (WDT)
o Bài tập:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 13
13 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� Lập trình sử dụng timer để tạo hàm delay - Buổi 8: Các module căn bản của vi điều khiển PIC (tt)
o Bài cũ: � Lập trình dùng hàm delay để điều khiển I/O Port
o Bài tập giữa khoá: Học viên chọn 1 trong 2 bài tập sau để làm tại lớp, các bài còn lại làm ở nhà
� Bài tập 1: Lập trình hiện thực đồng hồ số � Bài tập 2: Lập trình hiện thực máy tính bỏ túi đơn giản
- Buổi 9: Hoàn thành bài tập giữa khoá - Buổi 10: Lập trình C nâng cao
o Ôn tập các lệnh C cơ bản o Các kiểu dữ liệu mở rộng o Tương tác với các hàm trong thư viện C o Hàm chuyển đổi kiểu dữ liệu o Hàm xử lý chuỗi
- Buổi 11: I/O Port nâng cao o Nhắc lại kiến thức về PORT o LCD
� Kiến trúc phần cứng LCD � Các thanh ghi, các chế độ làm việc của LCD � Tập lệnh LCD
o Bài tập: � Hiển thị dữ liệu vừa nhập ra LCD
o Bài tập về nhà: � Nhập dữ liệu số từ nút nhấn, hiển thị dữ liệu vừa nhập ra LCD (có thể kết
hợp với Basic KIT) - Buổi 12: Timer 1, 2, 3
o Counter � Thanh ghi quy định chức năng counter � Ngắt counter (nhắc lại cơ bản phần ngắt)
o Realtime timer � Tổ chức phần cứng của mạch thời gian thực dùng thạch anh 32k
o Bài tập: � Lập trình đếm xung encoder dùng counter
o Bài tập về nhà: � Thiết kế đồng hồ thời gian thực dùng thạch anh thời gian thực và timer 1/3
- Buổi 13: ADC o Cơ bản về nguyên lý bộ chuyển đổi Analog – Digital o Những thông số đặc trưng của bộ chuyển đổi o Cấu trúc bộ ADC trong PIC o Các thanh ghi quy định cho bộ ADC o Ngắt ADC o Bài tập:
� Đọc giá trị biến trở VR
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 14
14 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� Hiển thị giá trị điện trở hiện thời của VR ra LCD o Bài tập về nhà: Thiết kế hệ thống giám sát nhiệt độ phòng
� Đọc ADC từ cảm biến nhiệt độ � Dùng Timer để cài đặt thời gian lấy mẫu � Hiển thị giá trị nhiệt độ ra LCD
- Buổi 14: UART – giao tiếp nối tiếp bất đồng bộ o Chuẩn giao tiếp nối tiếp
� Chuẩn giao tiếp nối tiếp là gì, các ứng dụng � Các thông số đặc trưng của chuẩn giao tiếp nối tiếp RS232
o UART trong PIC � Tổ chức phần cứng � Ngắt UART � Chương trình truyền nhận trên PIC � Giới thiệu về giao tiếp máy tính qua RS232
o Bài tập: � Giao tiếp PIC – Máy tính: giám sát nhiệt độ phòng bằng đồ thị trên máy tính
- Buổi 15: PWM/Capture/Compare o PWM/Capture/Compare
� Nguyên lý, ứng dụng? � Các thông số đặc trưng
o PWM/Capture/Compare trong PIC � Tổ chức phần cứng � Chương trình thao tác � Thực hành điều chế xung PWM, các chức năng Capture, Compare trên kit
thí nghiệm o Bài tập:
� Điều khiển vận tốc động cơ DC dùng PWM có giám sát vận tốc bằng máy tính
o Bài tập về nhà: � Điều khiển vận tốc động cơ có hồi tiếp dùng encoder
- Buổi 16: Bài tập tổng kết: o Thiết kế hệ thống giám sát tốc độ quạt làm mát, tự động điều chỉnh tốc độ theo
nhiệt độ. � Điều khiển động cơ bằng PWM có hồi tiếp encoder � Đọc ADC từ cảm biến nhiệt độ để cập nhật giá trị vận tốc � Hiển thị nhiệt độ, tốc độ ra LCD ở dòng trên, dòng dưới là thời gian động cơ
hoạt động (tính bằng giờ, phút, giây) � Mỗi 1 phút lưu giá trị vào EEPROM (optional)
- - Buổi 17: SPI – giao tiếp nối tiếp đồng bộ; Các phương pháp lưu trữ dữ liệu
o Chuẩn giao tiếp SPI � Chuẩn giao tiếp SPI là gì, các ứng dụng? � Các thông số đặc trưng của chuẩn giao tiếp SPI
o SPI trong PIC
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 15
15 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� Tổ chức phần cứng � Tập lệnh tương tác với EEPROM � Khái niệm về chuẩn giao tiếp I2C và các phương pháp lưu trữ dữ liệu.
o Bài tập: � Lưu và đọc dữ liệu từ EEPROM ngoài qua SPI
o Bài tập về nhà: � Lập trình mô phỏng giao tiếp giữa 2 VĐK PIC dùng SPI
- Buổi 18: Hoàn thành bài tập, tổng kết o Ôn tập, kiểm tra cuối khóa o Tổng kết o Giới thiệu ứng dụng
III. CÁC CHUYÊN ĐỀ ỨNG DỤNG KÈM THEO SAU KHÓA H ỌC 1. Chuyên đề 1: Điều khiển động cơ: Step, DC motor 2. Chuyên đề 2: Giao tiếp không dây – 2 phần 3. Chuyên đề 3: PIC – C# - Giao tiếp máy tính 4. Chuyên đề 4: Điều khiển 2 động cơ DC phối hợp – bàn máy 2D 5. Chuyên đề 5: chuyên đề phối hợp: Robot 2 bánh, Robot dò line. 6. Chuyên đề 6: chuyên đề phối hợp: Con lắc ngược 7. Chuyên đề 7: chuyên đề phối hợp: Xe 2 bánh tự cân bằng 8. Chuyên đề 8: Điều khiển động cơ không chổi than – điều khiển lực nâng quạt 9. Chuyên đề 9: Điều khiển 2 động cơ không chổi than – cân bằng 2 cánh quạt 10. Chuyên đề 10: chuyên đề phối hợp: Quad – Rotor IV. TÀI LI ỆU VÀ THI ẾT BỊ HỌC TẬP 1. Tài li ệu học tập - Tài liệu học tập chính do trung tâm cung cấp - Các tài liệu tham khảo sẽ được giới thiệu trong từng buổi học 2. Thiết bị học tập - Máy tính Laptop – do học viên tự trang bị - Kit thí nghiệm – do trung tâm cung cấp - Mạch nạp, nguồn và những linh kiện khác – do trung tâm cung cấp
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 16
16 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
PHẦN BÀI GI ẢNG
PIC – C18
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 17
17 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 1 : NHỮNG KHÁI NI ỆM BAN ĐẦU
Bài 1 giới thiệu tổng quan về khái niệm và lịch sử ra đời, phát triển vi điều khiển. Sự khác nhau
và giống nhau giữa vi điều khiển và vi xử lý, kiến trúc điển hình của một vi điều khiển. Bài 1 cũng
giới thiệu về lịch sử, kiến trúc của dòng vi điều khiển PIC. Tác giả cũng đi sâu phân tích các tiêu
chí lựa chọn dòng vi điều khiển cho các ứng dụng cụ thể. Từ đó đưa ra lý do vì sao vi điều khiển
PIC là một sự lựa chọn hợp lý trong hoàn cảnh hiện nay.
1.1 VI ĐIỀU KHI ỂN LÀ GÌ
1.1.1 Vài nét về lịch sử
Những thập kỷ cuối của thế kỷ XX, với sự phát triển của công nghệ bán dẫn, kỹ thuật điện tử có
những bước phát triển vượt bậc. Ngày càng có nhiều linh kiện được tích hợp trong một thể tích
nhỏ hơn. Những thiết bị này gọi là các vi mạch tích hợp.
Năm 1971 Intel cho ra đời bộ vi xử lý đầu tiên, chip 4004, chứa 2300 transistor. Sự kiện này
được xem như là một bước đột phá về công nghệ. Với sự phát triển không ngừng, ngày nay số
transitor tích hợp trong vi xử lý đã lên con số hàng chục triệu (bộ vi xử lý Penltum 4 chứa 55 triệu
transistor).
Như vậy vi xử lý mà một mạch tích hợp chứa hàng ngàn thậm chí hàng triệu transitor kết nối
với nhau. Các transistor đó cùng nhau làm việc để tính toán, xử lý, lưu trữ… Chức năng cụ thể của
vi xử lý được xác định bằng phần mềm.
1.1.2 Từ vi xử lý tới vi điều khiển
Vi xử lý chỉ có tác dụng tính toán, để thực hiện một chức năng nào đó cụ thể (ví dụ điều khiển
động cơ…) vi xử lý phải được kết nối với các thiết bị, cụ thể là các mạch điện bên ngoài. Hệ thống
dù lớn hay nhỏ, nếu dùng vi xử lý thì cũng đòi hỏi các khối mạch điện giao tiếp phức tạp như
nhau. Các khối này bao gồm bộ nhớ để chứa dữ liệu và chương trình thực hiện, các mạch điện giao
tiếp ngoại vi để xuất nhập và điều khiển trở lại, các khối này cùng liên kết với vi xử lý thì mới thực
hiện được công việc. Để kết nối các khối này đòi hỏi người thiết kế phải hiểu biết tinh tường về
các thành phần vi xử lý, bộ nhớ, các thiết bị ngoại vi. Hệ thống được tạo ra khá phức tạp, chiếm
nhiều không gian, mạch in phức tạp. Và để thực hiện việc nay yêu cầu trình độ người thiết kế phải
cao. Kết quả là giá thành sản phẩm cuối cùng rất cao, không phù hợp để áp dụng cho các hệ thống
nhỏ.
Chính vì yêu cầu đó vi điều khiển ra đời. Vi điều khiển là sự tích hợp một ít bộ nhớ và một số
mạch giao tiếp ngoại vi cùng với vi xử lý vào một IC duy nhất. Vi điều khiển có khả năng tương tự
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 18
18 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
như khả năng của vi xử lý, nhưng cấu trúc phần cứng dành cho người dùng đơn giản hơn nhiều. Vi
điều khiển ra đời mang lại sự tiện lợi đối với người dùng, họ không cần nắm vững một khối lượng
kiến thức quá lớn như người dùng vi xử lý. Thêm vào đó, kết cấu mạch điện dành cho người dùng
cũng trở nên đơn giản hơn nhiều, và có khả năng giao tiếp trực tiếp với các thiết bị bên ngoài. Và
dĩ nhiên vì thế giá thành của vi điều khiển cũng rẻ hơn nhiều so với vi xử lý. Nhưng thay cho
những lợi điểm này là khả năng xử lý bị giới hạn (tốc độ xử lý chậm hơn và khả năng tính toán ít
hơn, dung lượng chương trình bị nhỏ hơn).
Với những ưu điểm đó, ngày nay, vi điều khiển riêng lẻ được sử dụng rộng rãi vào nhiều ứng
dụng có chức năng đơn giản, không đòi hỏi tính toán phức tạp. Với sự tích hợp nhiều chuẩn giao
tiếp khác nhau, các vi điều khiển có khả năng kết nối với nhau để tạo thành một hệ thống lớn khi
yêu cầu độ phức tạp về hệ thống tăng lên. Do đó vi điều khiển là thành phần không thể thiếu trong
các hệ thống số dù lớn hay nhỏ mà có khả năng lập trình.
1.1.3 Ứng dụng của vi điều khiển
Như đã nói ở trên, vi điều khiển được ứng dụng nhiều trong các hệ thống vừa phải. Những hệ
thống này có thể kể đến như: các thiết bị gia đình, các thiết bị văn phòng, các ứng dụng công
nghiệp nhỏ, đồ chơi…Một vài ứng dụng vi điều khiển được cho ở bảng sau:
Bảng 1.1 Một vài ứng dụng của vi điều khiển trong thực tế
Thiết bị gia đình Đồ điện trong nhà
Lò vi sóng
Cửa tự động
Dụng cụ thể thao
Tivi
VCR
Camera
Điều khiển từ xa
Trò chơi điện tử
Nhạc cụ điện tử
Điều hòa nhiệt độ
Đồ chơi trẻ em
Thiết bị văn phòng Điện thoại
Máy Fax
Máy photocopy
Máy tính cá nhân
Hệ thống an ninh
Máy in …
Thiết bị công nghiệp Điều khiển động cơ
Thiết bị ABS
Hệ thống đo lường
Điều khiển chiếu sang
…
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 19
19 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
1.2 TỔNG THỂ KI ẾN TRÚC PHẦN CỨNG VI ĐIỀU KHI ỂN
1.2.1 Ki ến trúc tổng thể của một vi điều khiển
CPU
Interrupt
Control
I/O
PORT
Bộ nhớ
Timer/
Counter
Bộ dao
độngNgoại vi
Address, Data, Control BUS
Hình 1.1 - Sơ đồ khối kiến trúc tổng thể một hệ máy tính
Một hệ máy tính cơ bản bao gồm: bộ xử lý trung tâm (CPU), thiết bị tao dao động (bộ dao
động), bộ nhớ, các điều khiển, cổng xuất nhập và các thiết bị ngoại vi (Hình 1.1). Toàn bộ các
thành phần này được kết nối với nhau thông qua các BUS. Trong một hệ máy tính, tùy theo chức
năng sử dụng mà BUS được chia làm 3 loại: BUS địa chỉ (Address BUS), BUS dữ liệu (Data
BUS) và BUS điều khiển (Control BUS). Chi tiết hơn về các thành phần được trình bày sau đây.
1.2.2 Ki ến trúc các thành phần
1.2.2.1 Bộ xử lý trung tâm (CPU)
CPU là đầu não tính toán của toàn bộ hệ thống, quản lý tất cả các hoạt động của hệ và thực hiện
tất cả các thao tác trên dữ liệu. Hầu hết các CPU chỉ bao gồm một tập các mạch logic thực hiện
liên tục 2 thao tác: tìm nạp lệnh và thực thi lệnh. Thực tế việc tính toán trong CPU đơn thuần chỉ là
các phép toán số học trên hệ cơ số 2 được thực hiện trong bộ tính toán số học ALU. Control Unit
trong CPU có nhiệm vụ tìm lệnh từ các thanh ghi và nạp lệnh cho bộ tính toán ALU xử lý (Hình
1.2)
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 20
20 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Hình 1.2 - CPU
1.2.2.2 Bộ nhớ
Đây là một tập hợp các ô nhớ, mỗi ô có một số bit nhất định và chứa một thông tin được mã hóa
thành số nhị phân mà không quan tâm tới kiểu của thông tin. Các thông tin này có thể là lệnh hay
dữ liệu. Mỗi ô nhớ đều có một địa chỉ. Thời gian truy cập vào mỗi ô nhớ là như nhau, vì vậy bộ
nhớ này còn có tên là bộ nhớ truy cập ngẫu nhiên (RAM). Mỗi ô nhớ thường là 8bit, bất kể độ dài
của từ nhớ trong thiết bị là bao nhiêu.
Tuy nhiên bộ nhớ RAM chỉ được sử dụng khi chương trình thực thi. Trong trường hợp chương
trình dừng thực thi vì một lý do gì đó (hệ thống shutdown, mất điện…) thì bộ nhớ này sẽ tự động
giải phóng. Chính vì thế, để lưu trữ các thông tin cần thiết như chương trình, dữ liệu quan trọng
cần thêm một bộ nhớ chỉ đọc ROM.
Trong vi điều khiển có 2 loại bộ nhớ: Bộ nhớ dữ liệu và bộ nhớ chương trình tương ứng với bộ
nhớ RAM, ROM trong cấu trúc trên.
Bộ nhớ dữ liệu(RAM, hay data memory): Là không gian nhớ dùng lưu trữ dữ liệu của chương
trình khi chương trình thực thi.
Bộ nhớ chương trình (program memory): đây là một dạng ROM, tuy nhiên trong vi điều khiển
ROM là bộ nhớ có cho phép truy xuất, thay đổi vì vậy được gọi là EEPROM (Electrically Erasable
Programmable Read-Only Memory).
1.2.2.3 Bộ tạo dao động
Bộ tạo dao động là phần không thể thiếu của một hệ thống số. Đây là nguồn cấp xung nhịp
đồng bộ cho toàn bộ hoạt động của hệ thống. Hầu hết các vi điều khiển hiện nay đều được trang bị
bộ dao động nội, nghĩa là bộ tạo dao động được đóng gói bên trong chip. Tuy nhiên bộ dạo động
bên trong vi điều khiển thường có xung nhịp thấp. Vì thế xu hướng hiện nay trong thiết kế mạch
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 21
21 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
cho vi điều khiển người ta thường dùng bộ dao động từ bên ngoài. Vấn đề này sẽ được nói rõ ở bài
3.
1.2.2.4 Bộ định thời (timer)
Các ứng dụng điều khiển thông thường đều liên quan tới thời gian. Chính vì thế bộ định thời là
một phần không thể thiếu trong các vi điều khiển. Bộ định thời thông thường dùng để: định thời
một khoảng thời gian, đếm sự kiên, tạo xung…
1.2.2.5 Bộ điều khiển ngắt (Interrupt Control)
Ngắt là hành động dừng một chương trình đang thực thi để thực hiện chương trình chỉ định ngắt
khi có một tín hiệu báo ngắt. Bộ ngắt là một mạch logic mục đích là tạo ra một xung kích hoạt ngắt
(tín hiệu báo ngắt) cho CPU. Ngắt là một phần vô cùng quan trọng trong vi điều khiển. Nó giúp
cho người lập trình có nhiều sức mạnh hơn trong việc thiết kế một ứng dụng. Một chương trình
được điều khiển bởi ngắt làm cho ta có cảm giác có nhiều ứng dụng đang chạy song song, trên
thực tế là chúng chạy nối tiếp nhau.
1.2.2.6 Các thiết bị ngoại vi
Thiết bị ngoại vi ở đây được hiểu là những module chức năng tích hợp sẵn trong vi điều khiển.
Các module này ở từng dòng vi điều khiển là khác nhau tùy theo dòng vi điều khiển đó được thiết
kế dành cho các ứng dụng phổ thông hay một vài ứng dụng đặc biệt nào đó. Các module đó bao
gồm: ADC, UART, SPI, I2C, PWM, Capture, Compare…
1.2.2.7 Các chân xuất nhập
Các chân xuất nhập là các chân chức năng chính của vi điều khiển. Đây được xem là ngõ ra
chức năng của vi điều khiển được dùng trực tiếp để thiết kế các ứng dụng điều khiển. Hãy tưởng
tượng các chân xuất nhập như tay, chân của một con người nếu thiếu tay chân thì con người đó sẽ
không thể có được một thao tác nào cả.
1.2.2.8 BUS
BUS là một tập hợp các dây mang thông tin có cùng một mục đích. CPU sử dụng 3 BUS để
truy xuất tới các thành phần xung quanh: BUS dữ liệu, BUS điều khiển và BUS địa chỉ.
Đặc trưng quan trọng nhất của BUS đó là số bit. Số bit là số dây mang thông tin đồng thời của
một BUS. Số bit của BUS địa chỉ quy định độ lớn của bộ nhớ mà CPU có thể truy xuất được. Số
bit của BUS dữ liệu quy định độ lớn của một ô dữ liệu trong bộ nhớ. Số bit của BUS điều khiển
phụ thuộc vào thiết bị cần điều khiển. Vì máy tính thường dùng tới khoảng 2/3 thời gian cho việc
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
22 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
di chuyển các dữ liệu trên các BUS nên độ rộng của BUS (hay số bit) là rất quan trọng đối với hiệu
suất cũng như tốc độ của máy. Tốc độ của máy tính sẽ tăng khi số bit của BUS tăng lên.
1.3 LỰA CHỌN DÒNG VI ĐIỀU KHI ỂN
Kể từ khi ra đời đến nay có rất nhiều dòng vi điều khiển của nhiều hãng khác nhau ra đời. Sau
đây là một vài dòng cơ bản, xếp theo trình tự thời gian: 8611 của Motorola, 8051 của Intel, Z8 của
Zilog, AVR của Atmel, PIC của Microchip. Đây là các dòng vi điều khiển 8bit cơ bản. Ngoài ra
còn có các dòng vi điều khiển 16 bit, 32 bit (PIC30F, 33F (dòng 16 bit), PIC32(dòng 32
bit)…(hình 1.3)
Chính vì có rất nhiều dòng vi điều khiển khác nhau như vậy nên việc lựa chọn vi điều khiển sử
dụng cần phải được xem xét. Về cơ bản có 3 tiêu chuẩn chính để lựa chọn sử dụng dòng vi điều
khiển nào:
� Đáp ứng yêu cầu công việc một cách hiệu quả và kinh tế
� Có sẵn các công cụ phát triển phần mềm, nhà cung cấp linh kiện phần cứng…
� Có nguồn cung cấp tài liệu để học và phát triển tin cậy.
Hình 1.3 - Các dòng vi điều khiển PIC hiện nay
1.4 CÁC NGÔN NGỮ LẬP TRÌNH CHO VI ĐIỀU KHI ỂN
Để lập trình cho vi điều khiển có các ngôn ngữ cơ bản sau:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 23
23 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� Hợp ngữ (Assembly): Đây là một tập hợp các mã gợi nhớ để thực hiện một chức năng nào
đó. Hợp ngữ là ngôn ngữ lập trình gần với ngôn ngữ máy nhất và mỗi dòng vi điều khiển
đều luôn có một tập lệnh hợp ngữ nhất định. Nhà sản xuất cũng bắt buộc phải có một trình
biên dịch hợp ngữ dành riêng cho dòng vi điều khiển đó.
� Ngôn ngữ cấp cao: Hầu hết các ngôn ngữ cấp cao dành cho các vi điều khiển đều dừng lại ở
ngôn ngữ C. Tuy nhiên ở mỗi cấp độ khác nhau ngôn ngữ C cũng chia ra nhiều dạng khác
nhau. Với PIC chúng ta có thể có những trình biên dịch ngôn ngữ C dành riêng như sau:
• CCSC
• Hi-Tech C
• C18, C30, C33
Bộ trình biên dịch C18, C30, C33, … là bộ trình biên dịch được hãng Microchip thiết kế chuyên
dụng để lập trình cho vi điều khiển PIC và nó được đưa ra khi một dòng vi điều khiển PIC nào đó
ra đời. Chính vì đặc điểm này các trình biên dịch này rất phù hợp với việc lập trình cho dòng vi
điều khiển mà nó hỗ trợ. Đây là một dạng ngôn ngữ thao tác trên phần cứng, có thể can thiệp vào
cấp thanh ghi của vi điều khiển để quy định chức năng của từng module căn bản trong vi điều
khiển. Đồng thời ngôn ngữ cũng hỗ trợ các hàm tính toán, cách khai báo, các cấu trúc lệnh của
ngôn ngữ C căn bản. Điều này giúp người lập trình dễ dàng hơn rất nhiều so với việc sử dụng hợp
ngữ mà vẫn đảm bảo hiểu rõ được cách thức làm việc của vi điều khiển ở mức thanh ghi.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 24
24 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 2 : KỸ THUẬT LẬP TRÌNH C
Bài 2 bàn về các vấn đề cơ bản của lập trình C dựa trên ANSI C.
2.1 KHÁI QUÁT NGÔN NG Ữ C
2.1.1 Các hệ số đếm
� Hệ nhị phân:
Hệ số dùng các ký số “0” và “1” để biểu diễn số. VD: 1101, 1001 …
� Hệ thập phân:
Hệ số dùng các ký số từ “0” đến “9” để biểu diễn số. Các con số này được dùng cùng với dấu
“.” để phân cách phần thập phân và phần nguyên. Ngoài ra, để phân biệt số âm và số dương người
ta còn thêm dấu “-“ và dấu “+” trước ký số.
VD: 15; 12.96; -902.6 …
� Hệ thập lục phân:
Hệ số dùng các ký số “0” đến “9” cùng các ký tự “A” đến “F” để biểu diễn số.
VD: 9AF; 6BC …
� Cách chuyển đổi ký số: (GV hướng dẫn tại lớp)
2.1.2 Biến, hằng, mảng
2.1.2.1 Biến
Biến được ví như mạch máu trong chương trình truyền dữ liệu từ hàm này sang hàm khác. Một
biến được đặc trưng bởi 2 đặc tính: kiểu biến và tầm vực của biến. Bảng dưới đây liệt kê các kiểu
biến được hỗ trợ trong C:
Biến : <kiểu dữ liệu> <tên biến> = <giá trị>;
Phần khai báo giá trị có thể cần hoặc không.
� Tầm vực truy xuất biến:
• Biến toàn cục:
o Biến toàn cục là biến xuất hiện khi chương trình thực thi, tồn tại suốt trong thời gian chương trình thực thi chỉ được giải phóng khi chương trình kết thúc.
o Tất cả các hàm trong chương trình đều có thể truy xuất giá trị của biến toàn cục
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
25 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
o Biến toàn cục được khai báo đầu chương trình trong phần khai báo biến
• Biến địa phương:
o Biến địa phương là biến xuất hiện khi đoạn chương trình chứa biến địa phương thực thi, giải phóng khi đoạn chương trình đó kết thúc.
o Chỉ chương trình con, đoạn chương trình chưa biến địa phương mới được truy xuất biến
o Biến địa phương được khai báo trong đoạn chương trình, chương trình con
� Kiểu biến:
Bảng 2.1 Các kiểu dữ liệu trong C
2.1.2.2 Hằng
Hằng số trong C có ý nghĩa theo đúng hằng số toán học. Có nghĩa là giá trị của hằng số không
thay đổi trong suốt quá trình chương trình thực thi.Hằng số luôn có tầm vực toàn cục.
Để khai báo hằng số thuộc một kiểu dữ liệu nào đó ta thêm từ khóa “const” vào phía trước từ
khóa quy định kiểu dữ liệu.
Hằng: const <kiểu dữ liệu> <tên hằng> = <giá trị>;
Bắt buộc phải có phần khai báo giá trị.
VD: const int8 a = 10;
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 26
26 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
2.1.2.3 Mảng
� Khai báo mảng hằng số:
• Một mảng hằng số có kích thước tối đa phụ thuộc vào loại vi điều khiển sử dụng.
• Với VDK PIC16F: Kích thước mảng hằng số tối đa là 256 byte
• Với VDK PIC18F trở lên: Kích thước mảng hằng số tối đa không giới hạn
• Khai báo:
const<kiểu dữ liệu mảng><tên mảng>[<kích thước mảng>] = {<giá trị các phần tử
mảng>};
VD: const int8 vidu[2] = {1,2};
• Lưu ý:
• Những phần tử nào chưa được đặt giá trị sẽ mặc định giá trị là 0
• Truy xuất giá trị vượt quá kích thước mảng sẽ làm chương trình chạy vô tận
• Mảng hằng số thường dùng làm bảng tra (ví dụ bảng tra các hàm lượng giác)
� Khai báo biến mảng:
Khai báo tương tự khai báo mảng hằng số.Tuy nhiên không có từ khóa const và không cần cài
đặt giá trị cho các phần tử của mảng (mặc định giá trị đầu sẽ là giá trị mặc định của kiểu dữ liệu
mảng).
Một số lưu ý về kích thước:
• Kích thước mảng phụ thuộc vào khai báo con trỏ và loại VDK
• PIC16F thường không quá 60 byte dù là khai báo con trỏ 16 bit hay 8 bit. Tuy nhiên nên
khai báo con trỏ 16 bit vì lúc đó sẽ tránh lỗi xảy ra: not enough RAM for all variable
• PIC18F Kích thước biến mảng không giới hạn. Nếu khai báo con trỏ 8 bit thì biến mảng
tối đa là 256 byte, nếu là 16 bit thì toàn bộ không gian bộ nhớ RAM
• Một số lưu ý khi sử dụng biến, mảng, hằng số:
• Tràn số: Sự tràn số xảy ra khi khai báo kiểu dữ liệu nhỏ hơn phạm vi số sử dụng. Lúc đó
trình biên dịch sẽ làm tròn số theo cách vòng tuần hoàn:
VD: int8 a = 260;
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
27 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Khi biên dịch giá trị a được làm tròn như sau: a = 260-256 = 4
• Tính toán với số âm: Khi tính toán với số âm bắt buộc ta phải khai báo kiểu dữ liệu là số
có dấu (mặc định là không dấu) nếu không sẽ gặp kết quả tương tự như trường hợp tràn số.
• Chuyển kiểu và ép kiểu
unsigned char a =8 , b=200; Int c; c= (int16) a * b;
Ở đoạn code trên ta đã ép kiểu dữ liệu của phép nhân 2 số 8 bit thành một số 16 bit. Việc này sẽ
tránh lỗi tràn số cho phép nhân, đồng thời tiết kiệm bộ nhớ, giảm thời gian tính toán (vì nếu không
phải khai báo lại các biến a, b)
2.1.3 Cấu trúc lệnh
Bảng 2.2 Các cấu trúc lệnh trong C
2.1.4 Toán tử
2.1.4.1 Toán tử
Bảng 2.3 Toán tử trong C
STT Loại toán tử Tên toán tử Kí hiệu Chức năng
1 Toán tử tính toán số
Nhân * Nhân 2 số
2 Chia / Chia 2 số
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 28
28 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
3 Cộng + Cộng 2 số
4 Trừ - Trừ 2 số
5 Chia lấy dư % Chia lấy dư 2 số nguyên
6
Toán tử bit
Not bit ~ Đảo logic từng bit
7 Dịch trái << Dịch sang trái một số bit
8 Dịch phải >> Dịch sang phải một số bit
9 AND & “Và” từng bit
10 XOR ^ XOR từng bit
11 OR | OR từng bit
12 Toán tử logic
AND && AND logic 2 giá trị logic
13 OR || OR logic 2 giá trị logic
14 Toán tử quan hệ So sánh bằng == So sáng bằng 2 số
15 So sánh khác != So sánh khác 2 số
16 SS bé hơn < SS bé hơn 2 số
17 SS bé hơn, bằng <= SS bé hơn hoặc bằng 2 số
18 SS lớn hơn > SS lớn hơn 2 số
19 SS lớn hơn, bằng >= SS lớn hơn hoặc bằng 2 số
2.1.4.2 Mức độ ưu tiên của các toán tử
Bảng 2.4 Bảng so sánh mức độ ưu tiên của các toán tử:
STT Tên Mức Toán tử Nhóm
1 Primary 1(high) () . [] � Left to Right
2 Unary 2 ! ~ -(type) * & ++ --sizeof Right to Left
3 Binary 3 • / * % Left to Right
4 Arithmetic 4 • + - Left to Right
5 Shift 5 • >> << Left to Right
6 Relational 6 • < <= > >= Left to Right
7 Equality 7 • == != Left to Right
8 Bitwise 8 • & Left to Right
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 29
29 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
9 Bitwise 9 • ^ Left to Right
10 Bitwise 10 • | Left to Right
11 Logical 11 • && Left to Right
12 Logical 12 • || Left to Right
13 Conditional 13 • ? : Right to Left
14 Assigment 14 (low) • = += -= /= *= %= <= >= &=
|= ^=
Left to Right
2.1.5 Hàm
2.1.5.1 Cú pháp hàm
Một hàm C phải bao gồm một kiểu trả về (kiểu đó trả về void nếu không có giá trị trả về), một
tên xác định, một danh sách các tham số để trong ngoặc đơn (nếu danh sách này không có tham số
nào thì ghi là void bên trong dấu ngoặc), sau đó là khối các câu lệnh (hay khối mã) và/hay các câu
lệnh return. (Nếu kiểu trả về là void thì mệnh đề này không bắt buộc phải có. Ngược lại, cũng
không bắt buộc chỉ có một câu lệnh return mà tùy theo kỹ thuật, người lập trình có thể dẫn dòng
mã sao cho mọi hướng chẻ nhánh đều được trả về đúng kiểu.)
<ki ểu_tr ả_về> tên_hàm(<danh sách tham s ố>)
{
<các_câu_l ệnh>
return <bi ến (hay giá tr ị) có ki ểu là ki ểu_tr ả_về>;
}
Trong đó, <danh sách tham số> của N biến thì được khai báo như là kiểu dữ liệu và tách rời
nhau bởi dấu phẩy ,
Toàn bộ danh sách này được đặt trong ngoặc đơn ngay sau tên_hàm.
- Thí dụ:
Viết hàm add tính tổng hai số có kiểu integer, hàm abs tính trị tuyệt đối của số có kiểu integer,
và chương trình (hàm main) hiển thị hai dòng 1 + 1 = 2 và absolute value of -2 is
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 30
30 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
2.1.5.2 Các kiểu truy xuất biến trong hàm
Khi thực hiện một lời gọi hàm ta phải cung cấp đầy đủ thông tin phù hợp với hàm đó để hàm đó
có thể thực hiện
VD: void test(int8 n)
{}
test(x);
Ở đây n được gọi là tham số hình thức, chỉ mang tính hình thức.x là tham số thực sự. Việc gửi x
vào cho hàm test thay thế cho n được gọi là truyền tham số. Với những hàm không có tham số thì
không phải truyền. Có 3 loại truyền tham số:
� Truyền tham trị:
Giá trị của tham số thực sự được gửi đến cho hàm. Khi thực hiện truyền tham số theo kiểu này
thì hàm được gọi chỉ tác động lên bản sao của tham số gốc, do vậy nó chỉ làm thay đổi giá trị của
bản sao mà không ảnh hưởng đến tham số gốc.
VD:
void test(int x) { x=x+10; } void main() { int n=5; test(n); cout<<"Gia tri n ="<<n<<endl; }
Kết quả sau khi thực hiện chương trình trên: Gia tri n = 5. Ở đây n vẫn giữ nguyên giá trị ban
đầu mặc dù trong test có câu lệnh nhằm làm thay đổi nó.
Truyền tham trị là cơ cấu mặc định trong truyền tham số.
� Truyền tham khảo (tham chiếu)
Về bản chất, truyền tham chiếu là ta gửi địa chỉ của tham số tới hàm được gọi. Hàm được gọi sẽ
tác động lên vùng nhớ có địa chỉ mà nó nhận được(chính là tham số gốc). Bời vậy mọi thay đổi mà
nó gây ra đều làm ảnh hưởng đến tham số gốc.
Ví dụ:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 31
31 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
void test(int &x) { x=x+10; } void main() { int n=5; test(n); cout<<"Gia tri n ="<<n<<endl; }
Kết quả sau khi thực hiện chương trình trên: Gia tri n = 15. Ở đây n đã bị thay đổi.Việc gửi địa
chỉ (tham chiếu) của tham số đến hàm được gọi, người ta gọi đó là truyền tham chiếu. Với hàm có
cơ chế truyền tham chiếu thì nó không có vùng nhớ riêng cho tham số đó, khi thực hiện lời gọi
hàm, nó sẽ gán cho tham số một bí danh (alias) - đó chính là tên của tham số hình thức và tự do tác
động lên vùng nhớ của tham số được gửi tới.
� Truyền con trỏ
Địa chỉ vùng nhớ của một biến nào đó là một số, do đó ta có thể khai báo một biến khác để lưu
trữ giá trị địa chỉ này. Con trỏ là biến như thế.
Cách truyền con trỏ cũng tương tự như cách truyền một tham chiếu, tuy nhiên cần phân biệt con
trỏ và tham chiếu ở những điểm cơ bản sau:
- Có con trỏ null chứ không có tham chiếu null - Con trỏ có thể trỏ đến nhiều đối tượng, trong khi tham chiếu chỉ có thể chỉ đến tham chiếu được tạo cho nó.
Tham khảo:http://www.cplusplus.com/doc/tutorial/pointers/
2.2 NHỮNG VẤN ĐỀ LIÊN QUAN KHI S Ử DỤNG C CHO LẬP TRÌNH PIC
2.2.1 C Complier và MPLAB
2.2.2 Mô phỏng chương trình bằng Protus
(GV sẽ hướng dẫn trực tiếp cách sử dụng các phần mềm trên lớp)
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 32
32 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
2.2.3 Cấu trúc và thực thi chương trình
//Phần các chỉ thị tiền xử lý
#include < 16F877 .h >
#include < delay.h >
. . . .
//Phần khai báo biến, hằng, mảng toàn cục
Int a, b;
. . . .
// Phần khai báo hàm Prototype
Void ADC_Processing() ;
Void timer_INT();
…
//Chương trình chính
Main()
{. . . }
//Chương trình con
Void ADC_Processing()
{ . . . }
//Chương trình xử lý ngắt
#Interrupts
Void timer_INT()
{. . . }
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
33 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 3 : BỘ NHỚ, BỘ DAO ĐỘNG VÀ THANH GHI H Ệ THỐNG
Bài 3 sẽ giới thiệu những vấn đề cốt lõi trong phần cứng của hệ thống liên quan trực tiếp tới lập
trình, đó là: tổ chức bộ nhớ, tổ chức thanh ghi hệ thống, cấu trúc và cách cài đặt cho bộ dao động.
3.1 BỘ NHỚ
Tài li ệu tham khảo: Datasheet 18F4620 – 18F2550
3.1.1.1 Tổ chức phần cứng tổng quát của một bộ VĐK PIC:
Sau đây, ta phân tích cấu trúc cơ bản của một bộ VĐK PIC. (ta xét bộ VĐK 18F4620)
Hình 3.1 - Sơ đồ khối tổng thể của PIC18F4620
� Phần bộ nhớ (khối A): bao gồm bộ nhớ chương trình và bộ nhớ dữ liệu.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
34 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� Phần tạo xung (khối B): bao gồm bộ tạo xung và các chức năng đi kèm với nó.
� Phần tính toán (còn gọi là bộ ALU – khối C): đảm nhận việc tính toán của VĐK.
� Phần I/O (khối D): bao gồm các port input và output.
� Phần ngoại vi (khối E): quản lý các chức năng tương tác ngoại vi trong VĐK.
(con số được ghi trên mỗi mũi tên chính là số bits dữ liệu trong việc giao tiếp giữa các khối)
Trong bài này chúng sẽ xem xét hai khối chính đó là khối bộ nhớ và khối tạo xung.
3.1.1.2 Cơ bản về tổ chức bộ nhớ của VĐK PIC
Tài li ệu tham khảo: chương 5,6,7-datasheet
Tổ chức bộ nhớ của VĐK PIC được phân thành ba phần chính:
• Program Memory (hay còn gọi là
Flash Memory – bộ nhớ Flash, bô nhớ lưu
trữ)
• Data Memory (hay còn có tên gọi là
Data RAM Memory)
• Data EEPROM Memory
Ngoài ra còn có các thành phần phụ khác
đề bổ trợ cho quá trình hoạt động của một bộ
VĐK.
a) Tổ chức bộ nhớ chương trình
(Program Memory)-18F4620:
Như chúng ta có thể thấy bộ nhớ chương
trình được chia làm 3 phần chính:
� Program Counter:
Phần này là một thanh ghi 21 bits (tên gọi
là thanh ghi PC) chứa giá trị địa chỉ của câu lệnh hiện thời trong Program Memory.
� Stack Memory:
Đây là bộ nhớ với 31 ô (mỗi ô có 21 bits) nhằm ghi lại địa chỉ vào ra của các chương trình con.
Ta lấy ví dụ như thế này khi ta chạy chương trình chính tới ô địa chỉ là 0x0082 và ta gọi một
chương trình con (chương trình con này được bắt đầu tại địa chỉ 0x0346) như thế địa chỉ 0x0082 sẽ
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
35 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
được lưu vào bộ nhớ stack, và hệ thống sẽ nhảy đến vị trí bắt đầu của chương trình con, sau khi
thực hiện xong chương trình con rồi thì hệ thống sẽ mở bộ nhớ stack ra và tìm lại giá trị 0x0082 để
trở về cho đúng vị trí trong chương trình chính.
Stack Memory được thực hiện dựa trên cơ chế “VÀO SAU RA TRƯỚC”
Hình 3.2 - Stack memory
� Memory Space:
Đây là phần chứa toàn bộ nội dung của chương trình điều khiển (được mã hóa ra dạng mã hex).
b) Tổ chức bộ nhớ dữ liệu
Data Memory cũng có ba loại bộ nhớ chính:
� Access Ram: phần bộ nhớ này còn được gọi là phần bộ nhớ truy xuất nhanh, tức những dữ
liệu nào chúng ta thường hay truy xuất nên đưa vào phần RAM này.
� GPR (General Purpose Register): thanh ghi dùng chung
� SFR (Special Function Register): thanh ghi đặc biệt-vùng nhớ này dùng để lưu trữ những
thanh ghi đặc biệt (dùng điều khiển các chức năng của VĐK) – tham khảo bảng 5.1
� Một địa chỉ Data bao gồm hai thành phần:
� Opcode: hay còn gọi là số thứ tự “ngăn” (mỗi ngăn 8 bits, 16 bits … tùy theo dòng VĐK)
−
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
36 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Hình 3.3 - Data memory
BSR: hay còn gọi là số thứ tự “tủ”. Mỗi “tủ” chứa 256 ngăn.
c) Data EEPROM Memory:
Thực chất Data EEPROM Memory không được hỗ trợ về mặt phần cứng như hai loại bộ nhớ
vừa kể trên. EEPROM Memory được dùng cùng bộ nhớ vật lý với Program Memory (GV sẽ nói rõ
hơn về EEPROM và Flash). Hay nói cách khác hơn phần bộ nhớ vật lý dành cho Program Memory
có hai chức năng Flash hay EEPROM .
3.2 BỘ DAO ĐỘNG
Tài li ệu tham khảo: chương 2-datasheet
� Vai trò của bộ dao động:
Bộ dao động (hay còn có tên gọi khác là bộ tạo xung) là phần tạo xung nhịp hoạt động chính
cho VĐK.
Tại sao ta lại phải cần tới bộ dao động ?
Bộ tạo dao động nhằm tạo ra các hệ xung có chu kỳ cố định nhằm đồng bộ hóa dữ liệu của
VĐK, hay nói cách khác hơn, thời gian chu kỳ của hệ xung dao động chính là đơn vị cơ bản để đo
đếm thời gian hoạt động của các module trong VĐK.
� Phân loại các bộ dao động thường dùng trong VĐK:
• Bộ tạo xung bằng thạch anh:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
37 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Đây là bộ tạo xung đơn giản, dễ hiểu
và dễ sử dụng nhất.
Tín hiệu dao động vào VĐK theo ngõ
OSC1 và ra theo ngõ OCS2. Tụ C1 và C1
đóng vai trò như bộ ổn định xung nhịp.
Giá trị C1 và C2 thay đổi theo tần số
thạch anh (có thể tra bảng 2.2 datasheet).
• Bộ tạo xung bằng RC:
Bộ tạo xung này dựa vào đặc tính dao
động cơ bản của bộ RC. Bộ dao động loại
này tương đối khó sử dụng, thích hợp với
những ứng dụng cho phép thay đổi tần số
hoạt động của hệ thống.
• Bộ dao động nội:
Trong mỗi VĐK đều tồn tại một bộ dao
động nội, tức là chúng ta có thể sẽ không
cần dùng bộ dao động bên ngoài mà VĐK vẫn hoạt động bình thường.
Khuyết điểm của bộ dao động nội là tần số hoạt động thấp hơn so với bộ dao động gắn ngoài,
nhưng bù lại độ chính xác là tin cậy cao hơn, tiêu tốn ít năng lượng hơn. Đây là bộ dao động tối ưu
năng lượng cho vi điều khiển PIC.
� Phân tích sơ đồ khối của một bộ dao động (18F4620):
GV đứng lớp sẽ giảng dạy trực tiếp phần này. (hình 3.4)
� Các thanh ghi tương tác:
OSCTUNE: thanh ghi chịu trách nhiệm điều chỉnh việc hoạt động của bộ dao động.
OSCCON: thanh ghi chịu trách nhiệm điều chỉnh giá trị hoạt động của bộ dao động.
(GV trực tiếp nói thêm về phần này)
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
38 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Hình 3.4 - Bộ dao động PIC18F4620
3.3 TIỀN XỬ LÝ VÀ THANH GHI H Ệ THỐNG
3.3.1 Những tiền xử lý cơ bản:
#include:
tiền xử lý này dùng để thêm một file mới vào chương trình.
Cú pháp: #include <filename>
#include “filename”
#define:
tiền xử lý này dùng để khai báo các cú pháp (macro)
Cú pháp: #define name replacement_text
#pragma: lệnh tiền xử lý này dùng cho C18 Compiler (C chuẩn không hỗ trợ)
#pragma bao gồm nhiều chứng năng riêng biệt, nhưng chúng ta chỉ trình bày một số chức năng
chính:
• Khai báo vùng lập trình trong program memory, vùng dữ liệu trong data memory.
• Khai báo vector ngắt.
• Khai báo thanh ghi hệ thống.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 39
39 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Khai báo vùng lập trình cho program memory, vùng dữ liệu trong data memory và khai báo cho
vector ngắt sẽ được nói rõ hơn trong những phần liên quan tiếp theo. Ở nội dung bài này chỉ giới
thiệu dùng #pragma cho khai báo thanh ghi hệ thống
3.3.2 Khai báo thanh ghi hệ thống
� Cú pháp:
#pragma config <thanh_ghi_hệ_thống> = <giá_trị>
Các thanh ghi hệ thống: (tham khảo DATASHEET-chương 23, 25, hoặc có thể dùng
Help/Topic/PIC C18 Config Settings)
Ở đây chỉ trình bày những thanh ghi hệ thống giữ chức năng cài đặt cho bộ dao động.
Đối với PIC18F4620:
#pragma config OSC = XT // khai báo xung sử dụng thạch anh
Đối với PIC18F4550:
#pragma config PLLDIV = 5 // Khai sử dụng thạch anh 20MHz
#pragma config CPUDIV = OSC1_PLL2 #pragma config USBDIV = 1
#pragma config FOSC = XTPLL_XT
// GV sẽ giảng thêm phần này ở lớp
� Lưu ý:
• Bắt buộc phải khai báo đầy đủ các thanh ghi hệ thống.
• Chức năng nào của thanh ghi hệ thống không sử dụng đều khai báo là OFF, các chức năng
còn lại có chọn con số thấp nhất.
3.4 BÀI T ẬP
• Viết đoạn chương trình config cho PIC18f4550 với các yêu cầu sau:
• Thạch anh sử dụng 20MHz
• Sử dụng chế độ PLL để cấp xung 48MHz cho CPU
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
40 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 4 : IO PORT – OUTPUT
Bài 4 giới thiệu về module đầu tiên trong vi điều khiển – IO PORT. Đây là phần quan trọng bậc
nhất trong vi điều khiển vì tất cả các ứng dụng đều cần dùng đến. Học viên cần nắm rõ phần cứng
và cách tương tác phần cứng, từ đó áp dụng vào các ứng dụng cụ thể được hướng dẫn trong bài.
4.1 GIỚI THI ỆU PHẦN CỨNG
Tài liệu tham khảo: Chương I/O Port – datasheet 18f4550 /18F4620
4.1.1 Mô tả phần cứng
Hình bên là tổ chức phần cứng cơ bản của
một IO Port, với cấu tạo chính là các D
Flip Flop có chức năng như một bộ chốt
dữ liệu (data lacth). (GV sẽ trình bày về
hoạt động cơ bản).
Có ba thanh ghi cơ bản dành cho việc
tương tác với các chức năng IO Port:
Thanh ghi TRIS: thanh ghi quyết định
hướng truyền của IO port (input hay
output).
Thanh ghi PORT: thanh ghi này để
nhận dữ liệu vào từ IO Port.
Thanh ghi LAT: thanh ghi này dùng
xuất dữ liệu ra IO Port.
4.1.2 Sử dụng các PORT trong PIC
4.1.2.1 PORT A
PORTA được sử chung chân với một số chức năng khác như ADC và Oscillator. Khi sử dụng
PORTA tại chân Analog cần thiết phải đặt giá trị cho thanh ghi ADCON1 là bit tương ứng đang ở
chế độ analog hay digital, với chân RA7 và RA6 do được nối với chân Oscillator nên chân này chỉ
được sử dụng khi không không đặt chế độ oscillator.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
41 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bảng 4.1 Các thanh ghi PORTA
4.1.2.2 PORT B
PORTB với 8 chân giao tiếp bên ngoài, ngoài chức năng I/O nó còn là nơi có các chân ngắt
ngoài và ngắt thay đổi trạng thái. Chú ý khi đặt chế độ ngắt thì các chân I/O phải ở chế độ Input.
Một số chân Port B là có đi cùng chức năng Analog nên khi sử dụng phải khai báo chân này là
analog hay digital trong thanh ghi ADCON1. PORTB có thể được kéo lên nguồn yếu bằng cách
cài đặt bit RBPU trong thanh ghi INTCON2. Các thanh ghi liên quan với PORTB khi sử dụng
được cho tại bảng 10-4.
4.1.2.3 PORT C
Với 8 chân giao tiếp bên ngoài, PORT C là ngõ ra Digital thuần túy.
Các thanh ghi tác động lên PORTC được cho trong bảng 10-6:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
42 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
4.1.2.4 PORT D và PORT E
4.1.2.5 Parallel slaver port
Port D và E có thêm chức năng làm cổng giao tiếp song song tớ. Hoạt đông ở chế độ này xem chi tiết trong Datasheet.
4.2 BÀI TẬP - CÁC ỨNG DỤNG CỦA IO PORT-PHẦN OUTPUT
Tài liệu tham khảo: datasheet 7447, datasheet 74595
4.2.1.1 Ứng dụng chớp tắt LED:
Yêu cầu: GV hướng dẫn chớp tắt LED theo chù kỳ nhất định.
Sơ đồ mạch: đính kèm tài liệu (file)
4.2.1.2 Ứng dụng xuất LED 7 đoạn:
� Giới thiệu chung:
LED 7 đoạn thực chất là bao gồm nhiều LED đơn được sắp xếp theo hình dạng các con số, với
các ký hiệu như sau:
Cấu tạo của LED 7 đoạn bao gồm 8 LED đơn được ký hiệu từ a đến f và một chân chung. Có
hai dạng chân chung cho Led 7 đoạn.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
43 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
• Chân chung Anode(+)
• Chân chung Cathode(-)
Từ cấu tạo phần cứng của LED 7 đoạn nên chúng ta sẽ có 2 bảng giải mã khác nhau cho các tín
hiệu đầu vào:
Bảng 4.2 Bảng mã dành cho LED 7 đoạn Anode chung
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
44 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bảng 4.3 Bảng mã dành cho LED 7 đoạn Cathode chung:
� Các phương pháp hiển thị LED 7 đoạn:
Có nhiều phương pháp hiển thị LED 7 đoạn được dùng hiện nay như: nối trực tiếp, dùng
IC7447, dùng IC74595…. Mỗi phương pháp có những ưu điểm, nhược điểm riêng và tùy thuộc
vào các ưu, nhược điểm này mà sử dụng các phương pháp đó. Chương trình chỉ giới thiệu phương
pháp cơ bản nhất trong hiển thị LED 7 đoạn đó là nối mạch trực tiếp và dùng phương pháp quét.
• Sơ đồ mạch: (GV sẽ hướng dẫn trực tiếp trên lớp)
• Phương pháp quét:
Phương pháp quét là phương pháp tận dụng sự lưu ảnh trong mắt người, bằng cách sử dụng các
hàm delays trong hiển thị. Trong một lần quét, chương trình chỉ hiển thị môt LED 7 đoạn, nhưng
do sử dụng tần số quét cao (>24Hz) để kích/tắt chân nguồn của LED 7 đoạn nên mắt người bị lầm
tưởng là các LED7 đoạn được hiển thị cùng lúc.
4.3 BÀI TẬP VỀ NHÀ:
Hiển thị ma trận LED 4x4.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
45 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
4.4 PHỤ LỤC – CHUẨN LOGIC NGÕ RA CỦA IO PORT
Ở chế độ output mức điện áp sẽ được đưa ra ngõ ra I/O pin, ngõ ra sẽ được đưa ra bằng một
trong hai mức logic 1 hoặc logic 0. Giá trị điện áp của ngõ ra được cho trong bảng sau:
• Dòng điện tối đa cho phép của một ngõ ra là ± 25mA.
• Tổng dòng điện tối đa cho Port là ± 200mA.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
46 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 5 : NGẮT (INTERRUPTS)
5.1 ĐỊNH NGHĨA NGẮT
Ngắt (interrupt) là quá trình tạm thời dừng chương trình chính, để thực thi một chương trình
khác, chương trình này còn được gọi là chương trình thực thi ngắt. Hoạt động ngắt giúp hệ thống
của chúng ta đặc tả tốt hơn các đặc tính thời gian thực.
5.2 PHÂN LOẠI NGẮT
Ngắt thường được chia thành hai loại chính sau đây:
� Ngắt cứng: Là loại ngắt được chính hệ thống chúng ta gọi bằng mã lệnh mà không phụ
thuộc vào các nhân tố bên ngoài.
� Ngắt mềm: Là loại ngắt được sinh ra do các nhân tố bên ngoài tác động vào (hầu hết tất cả
các loại ngắt chúng ta học trong khóa học đều là ngắt mềm).
� Các loại ngắt trong hệ thống:
Hình 5.1 - Sơ đồ logic của ngắt trong PIC 18F4550
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 47
47 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
5.3 HOẠT ĐỘNG CỦA NGẮT
Tài liệu tham khảo: chương Interrupt – datasheet 18F4620
Quá trình hoạt động của ngắt được tóm tắt thông qua sơ đồ sau:
Hình 5.2 - Quy trình hoạt động của ngắt trong VĐK
- Bảng vector ngắt:
Bảng vector ngắt là tập hợp các vector nơi bắt đầu cho quá trình ngắt. Thường thì trong các
dòng VĐK PIC thì số lượng vector ngắt là khác nhau. Giả sử như dòng 16F chúng ta có 1
vector ngắt, còn dòng 18F chúng ta có 2 vector ngắt.
- Vị trí của vector ngắt trong hệ thống:
Vector ngắt của dòng 18F được chứa trong Program Memory (bộ nhớ chương trình), với
hai vector ngắt:
• Vector ngắt mức cao (High Priority Interrupt Vector) nằm tại địa chỉ 0x08. • Vector ngắt mức thấp (Low Priority Interrupt Vector) nằm tại địa chỉ 0x18.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
48 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Hình 5.3 - Vị trí các vecto ngắt trong ROM
Lưu ý:
Những điều cần quan tâm khi sử dụng một loại ngắt trong VĐK:
• Khai báo bật tắt (enable). • Khai báo ưu tiên (priority) • Cờ ngắt (flag).
� Các thanh ghi tương tác cho vector ngắt (dòng 18F4620):
Có 10 thanh ghi được sử dụng để điều khiển hoạt động ngắt chia làm 4 loại sau:
RCON
INTCON, INTCON2, INTCON3
PIR1, PIR2
PIE1, PIE2
IPR1, IPR2
+ Thanh ghi RCON: Chứa các cờ ngắt Reset, cờ ngắt đánh thức từ chế độ Idle cho CPU. Thanh
ghi này còn chứa bit PIEN (enable interrupt priority)
+ Thanh ghi INTCON: loạt thanh ghi INTCON (3 thanh ghi) chứa một loạt khai báo bật tắt,
mức ưu tiên, cờ ngắt cho các loại ngắt Timer0, RB, ngắt ngoài (INT0, INT1, INT2).
+ Thanh ghi PIR: loại thanh ghi PIR (2 thanh ghi) chứa các cờ ngắt của những loại ngắt ngoại
vi (ADC, TIMER1, TIMER2, SSP, PSP, RS232 …)
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 49
49 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
+ Thanh ghi PIE: loạt thanh ghi PIE (2 thanh ghi) chứa các khai báo bật/tắt ngắt cho ngoại vi.
+ Thanh ghi IPR: loạt thanh ghi IPR (2 thanh ghi) chứa các khai báo mức ưu tiên ngắt cho
ngoại vi.
� 3 bits cần phải quan tâm trong quá trình tương tác với ngắt: IPEN, GIE và PEIE:
• IPEN (Interupt Priority Enable) – RCON<7>: bit này cho phép chúng ta có sử dụng đến
tính năng mức ưu tiên ngắt hay không.
• GIE (Global Interrupt Enable) - INTCON<7>: bit này cho phép toàn bộ các ngắt được sử
dụng hay không,
• PEIE (Peripheral Interrupt Enable) – INTCON<6>: bit này cho phép các ngắt phần ngoại
vi có được sử dụng hay không.
(GV hướng dẫn thêm phần sử dụng kết hợp giữa 3 bits này với nhau)
5.4 TƯƠNG TÁC VỚI NGẮT
Trong khuôn khổ bài học chúng ta sẽ có dịp tương tác với 2 loại ngắt:
� Ngắt ngoài: Loại ngắt này được kích thích khi có sự thay đổi trạng thái của các chân INTx.
� Ngắt RB (ngắt PortB): Loại ngắt này được kích hoạt khi có sự thay đổi trạng thái bất kỳ của
một trong các chân R4 – R7.
Cả 2 loại ngắt này được xếp vào loại ngắt External, thời gian từ khi xuất hiện ngắt đến khi
chương trình ngắt hoạt động có thể từ 3 tới 4 chu kỳ lệnh.
5.4.1 Quy trình khai báo ngắt:
Để tương tác với ngắt ta phải quan tâm tới 3 vấn đề sau :
� Trong chương trình chính
- Khai báo sử dụng ngắt (loại ngắt được chọn)
- Khai báo kích hoạt ngắt toàn cục
� Khai báo vector ngắt
- Khai báo sử dụng vecto ngắt
- Khai báo sử dụng chương trình ngắt tương ứng
� Trong chương trình ngắt
- Xử lý ngắt
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 50
50 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
- Reset cờ ngắt
� Chúng ta xét tới ví dụ dưới đây:
#include <p18cxxx.h>
// phần khai báo vec tơ ngắt
void ISR_function(void); // khai báo prototype cho chương trình ngắt
#pragma code interrupt_vector = 0x08 // bắt đầu khai báo vector ngắt
void int_function (void)
{
_asm GOTO ISR_function _endasm
}
#pragma code // kết thúc khai báo vector ngắt
void main(void) // chương trình chính
{
// bắt đầu phần khai báo ngắt
INTCONbits.GIE = 1; // bật bits ngắt toàn cục
INTCONbits.INT0IE = 1; // khởi động ngắt ngoài 0
// kết thúc phần khai báo ngắt
// phần chương trình
}
#pragma interrupt ISR_function
void ISR_function (void)
{
//chương trình ngắt
// nhớ xóa cờ ngắt trước khi kết thúc chương trình ngắt
}
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 51
51 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
5.5 BÀI T ẬP
Sử dụng PIC 18F4620 đọc số lần nhấn phím – hiển thị ra LED 7 đoạn(sử dụng ngắt ngoài)
Tài liệu tham khảo Trích từ datasheet PIC18F4550
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
52 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 6 : IO PORT - INPUT
6.1 MÔ TẢ PHẦN CỨNG
Kiến trúc phần cứng xem ở bài 4.
6.2 BÀI TẬP – ỨNG DỤNG IO PORT - INPUT
6.2.1 Bài tập 1 - Lập trình quét phím đơn
6.2.1.1 Mô tả phần cứng
Hình 6.1 - Sơ đồ mạch lập trình quét phím đơn
Sơ đồ nguyên lý của phím đơn như hình, khi không nhấn phím thì điện áp ngõ ra đưa vào được
điện trở kéo lên nguồn nên mức sẽ là mức 1, khi nhấn nút thì ngõ ra của nút nhấn được kéo thẳng
xuống đất nên điện áp ngõ ra là mức 0.
6.2.1.2 Yêu cầu
Các phím được kết nối lần lược vào các chân RB0 –RB3. 4 LED hiển thị tương ứng được nối
vào các chân RD0 –RD3. Lập trình để mỗi lần nhấn 1 phím, một led tương ứng sẽ sáng.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
53 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
6.2.1.3 Giải thuật (GV sẽ giảng trên lớp)
6.2.2 Bài tập 2 - Lập trình quét phím ma trận
6.2.2.1 Mô tả phần cứng
Sơ đồ kết nối vật lý của các phím ma trận được cho ở hình dưới.
Hình 6.2 - Sơ đồ kết nối bàn phím ma trân 4x4
6.2.2.2 Yêu cầu
Các ROW lần lượt được nối vào RB0 – RB3, các COL lần lượt được nối vào RA0 – RA3, 4
LED hiển thị lần lượt được nối vào RD0 – RD3.
Lập trình sao cho khi mỗi phím được nhấn 4 LED sẽ hiển thị giá trị nhị phân chỉ địa chỉ (1 – 16)
của phím đó trên bàn phím
6.2.2.3 Giải thuật (GV sẽ giảng trên lớp)
6.3 PHỤ LỤC
� Các mức điện áp sử dụng ở chế độ input
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
54 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Ở chế độ này sẽ đọc mức điện áp ở chân I/O pin, và truyền dữ liệu đọc được trong thông qua
Data bus. Mức điện áp ở đây chỉ có một hoặc hai giá trị là là 1 hoặc 0, mức điện áp để nhận ra các
mức như sau:
• Mức logic 0: điện áp từ Vss đến 0,15Vdd khi điện áp cung cấp cho chip là <4,5V, và Vss
đến 0,8 V nếu điện áp từ 4,5 đến 5,5V.
• Mức logic 1: 0,25VDD + 0,8 đến VDD khi điện áp cấp bé hơn 4,5V, và từ 2.0 đến VDD
nếu điện áp cung cấp cho chip từ 4,5 đến 5,5V.
Đối với nhưng I/O có ngõ vào là Trigger Schmitt thì điện áp vào tương ứng là:
Logic 0: là Vss đến 0,2VDD, logic 1: 0,8VDD đến VDD.
� Chú ý: khi điện áp cung cấp là mức nằm giữa mức logic 0 và 1 ở trên thì hoàn toàn không
đọc được, gây ra sai. Do đó khi thiết kế phải chú ý mức logic phải nằm trong hai khoảng
điện áp này.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
55 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 7 : TIMER
7.1 NHỮNG KHÁI NI ỆM
7.1.1 Timer là gì?
Timer trong PIC là một chuỗi flip-flop chia cho 2 nhận nguồn vào là xung clock từ bộ tạo dao
động. Đầu ra của flip-flop thứ nhất là đầu vào của flip-flop thứ hai và cứ như thế tiếp tục cho các
cấp tiếp theo (sơ đồ tương tự như mạch đếm lên). Mỗi flip flop như vậy tương ứng với một ngõ ra
của timer (1 bit timer). Timer 16 bit là một chuỗi 16 flip flop, 8 bit là một chuỗi 8 flip flop … Ngõ
ra của flip flop cuối cùng được gọi là cờ (timer flag). Khi timer tràn thì bit này sẽ được kích hoạt.
Sự kích hoạt này được đưa vào bộ interrupt để tạo ra một ngắt timer (sẽ được bàn trong phần ngắt),
đồng thời tín hiệu này cũng được đưa ra một bộ reset để reset toàn bộ ngõ ra của flip-flop lại từ
đầu. Mạch cài đặt timer sẽ cài đặt các giá trị cho các flip-flop này đúng theo mã nhị phân của giá
trị cài đặt. Vì vậy timer bao giờ cũng là đếm lên nếu ngõ ra là tích cực mức cao (Q), và ngược lại
sẽ là đếm xuống nếu ngõ ra là tích cực mức thấp (Q bù).
Hình 7.1 - Timer 3 bit.
Timer được dùng rất nhiều trong các ứng dụng điều khiển. PIC cũng không phải là ngoại lệ.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
56 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
7.1.2 Watch dog Timer
Watch dog timer là bộ định thời chuyên dụng để cài đặt thời gian time out cho hệ thống. Khi
một lệnh của hệ thống thực thi WDT sẽ được reset, nếu hệ thống treo trong thời gian vượt quá thời
gian cài đặt, WDT tự động reset lại hệ thống.
7.1.3 Prescaler
Prescaler là tham số cho bộ chia của timer. Tham số này được cài đặt bởi người dùng theo các
option định trước. Tương ứng với tham số prescaler được chọn, mỗi lần tăng của timer sẽ được
quy định như sau:
7.2 HOẠT ĐỘNG CỦA TIMER
Timer0 có thể hoạt động ở chế độ 8 bit hoặc 16 bit, và/hoặc timer hoặc counter.
7.2.1 TIMER0 ch ế độ 8 bit
Nguyên lý hoạt động: timer0 ở chế độ 8 bít tức là có giá trị bộ đếm là 8 bit. Khi có một xung
timer clock thì bộ đếm TMR0L tăng lên một giá trị, ví dụ hiện tại TMR0L = 122 sau khi có thêm 1
timer clock thì giá trị của nó là 123. Đến khí giá trị của TMR0L = 255, sau khi nhận thêm một
clock nữa nó sẽ trở về 0 đồng thời cờ TMR0IF được set, cờ này được xóa bởi người dùng hay
chương trình. Giá trị của thanh ghi TMR0L có thể được đọc và ghi.
� Timer clock có thể được chọn ở các chế độ sau:
• Khi timer clock được chọn từ nguồn xung nhịp dao động chính của Fosc/4 với Fosc là tần
số dao động của nguồn.
• Hoặc có thể được chọn từ nguồn xung nhịp bên ngoài chế độ counter.
Xung vào timer = Xung nguồn / Prescaler
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
57 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Nguồn clock có thể là clock của dao động nội hoặc của nguồn ngoài có thể được chọn thông
qua bit T0CS. Nguồn clock sau khi chọn có thể được đưa trực tiếp tới bộ đồng bộ hoặc được đưa
vào bộ chia thông qua bit điều khiển PSA, nếu được đưa qua bộ chia thì clock sẽ được chia cho 2,
4, 8, 16,32, 64, 128 và 256 thông qua 3 bit điều khiển T0PS. Sau khi qua bộ đồng bộ thì clock
được đưa vào bộ đếm để đếm thanh ghi TMR0L.
7.2.2 TIMER0 ở chế độ 16 bit
Về cấu tạo hoàn toàn giống chế độ 8 bit tuy nhiên có một điểm khác là thanh ghi bộ đếm lúc
này là 16 bit, tức là bộ đến sẽ đếm đến 65535 rồi khi chuyển về 0 sẽ tạo set cờ TMR0IF.
7.2.3 Thanh ghi điều khiển TIMER0
T0CON
� Bit 7 TMR0ON: là bít cho phép hoạt động hoặc không hoạt động timer0.
• TMR0ON = 1 cho phép timer 0 hoạt động
• TRM0ON = 0 không cho phép timer 0 hoạt động
� Bit 6 T08BIT: là bit cài đặt timer 0 hoạt động ở chế độ 8 bit hay 16 bit
• T08BIT = 1 Timer0 hoạt động ở chế độ 8 bit
• T08BIT = 0 Timer0 hoạt động ở chế độ 16 bit
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
58 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� Bit 5 T0CS: bit chọn nguồn clock cho timer 0
• T0CS = 1 Clock sử dụng là nguồn clock ngoài (chế độ counter)
• T0CS = 0 clock sử dụng là chu kỳ lệnh Fosc/4
� Bit 4 T0SE: chọn cạnh clock khi sử dụng clock ngoài
• T0SE = 1 clock cạnh xuống ở chân T0CKI
• T0SE = 0 clock cạnh lên ở chân T0CKI
� Bit 3 PSA: chọn chế độ tỉ lệ cho nguồn clock
• PSA = 1 không sử dụng chế độ tỷ lệ. (nguồn clock sử dụng sẽ trở thành clock của timer0)
• PSA = 0 sử dụng chế độ tỷ lệ cho nguồn clock trước khi vào clock cho timer0, giá trị tỷ
lệ được quy định trong bit T0PS
� Bit <2 – 0> T0PS: đặt giá trị tỷ lệ cho bộ tỷ lệ.
• 111: 1:256
• 110: 1:128
• 101: 1:64
• 100: 1:32
• 011: 1:16
• 010: 1:8
• 001: 1:4
• 000: 1:2
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 59
59 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
7.2.4 Các thanh ghi khác
� Thanh ghi TMR0L chứa giá trị của timer0 khi ở chế độ 8bit hoặc chứa giá trị byte thấp của
timer0 khi ở chế độ 16 bit.
� Thanh ghi TMR0H chứa giá trị byte cao của timer0 khi ở chế độ 16 bit. Chú ý là khi sử
dụng ở chế độ 8 bit thì thanh này không có ý nghĩa.
� Thanh ghi INTCON: là thanh ghi điều khiển ngắt
• + GIE/GIEH: bit điều khiển cho phép ngắt toàn bộ.
• + PEIE/GIEL: cho phép ngắt ngoại vi
• + TMR0IE: cho phép ngắt timer0-
• + TMR0IF: cờ báo ngắt timer0
� Thanh ghi TRISA: set TRISA4 = 1 khi sử dụng chế độ counter (clock ngoài).
7.3 TƯƠNG TÁC VỚI TIMER
7.3.1 Quy trình khai báo timer như sau:
� Cài đặt
• Cài đặt chế độ hoạt động cho timer (8 bit/16 bit)
• Cài đặt nguồn xung cho timer (timer/counter)
• Cài đặt Prescaler cho timer
• Tính toán và cài đặt thời gian (nếu ở chế độ timer) cho timer
� Hoạt động
• Kích hoạt timer
• Chờ timer tràn
• Khi timer tràn – xử lý – reset cờ
• Nạp lại timer
7.3.2 Cách tính thông số cài đặt cho timer
��������� = 2�ô� ��� ��� − ���� (
���
4 ∗ �������)
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 60
60 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
7.4 BÀI T ẬP
7.4.1 Yêu cầu: Dùng timer0 để viết hàm delay cho hệ thống.
Để tạo hàm Delay ta có thể sử dụng một lệnh lặp nào đó chẳng hạn vòng lặp for để xác định
thời gian delay cần thiết, tuy nhiên khi thực hiện bằng phương pháp này khó xác định được chính
xác thời gian. Để xác định chính xác thời gian cần thiết phải sử dụng một bộ định thời để làm việc
này.
7.4.2 Giải thuật (GV sẽ giảng trên lớp)
7.4.3 Thực hành: KIT thí nghi ệm sử dụng thạch anh có tần số dao động 25MHz.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 61
61 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 8 : BÀI T ẬP GIỮA KHÓA
8.1 YÊU CẦU
Hình 8.1 - Sơ đồ phần cứng mạch thí nghiệm
8.1.2 Bài tập 1: Đồng hồ số:
Với phần cứng trên chúng ta có thể thiết kế một đồng hồ số dùng timer. Thiết bị hiển thị là 6 led
7 đoạn (2 led cho giây, 2 led cho phút, 2 led cho giờ). Khi cần thay đổi hay cài đặt lại giá trị giờ ta
dùng các phím đơn làm phím điều khiển. Cơ chế nhận tác động của các phím đơn là cơ chế ngắt.
Giá trị giờ, phút, giây được nhập vào trong chế độ cài đặt bằng bàn phím ma trận. Led đơn dùng
làm led báo tín hiệu cài đặt tương ứng.
8.1.3 Bài tập 2: Máy tính bỏ túi:
Với phần cứng trên ta cũng có thể thiết kế một máy tính bỏ túi đơn giản với các phép tính cộng,
trừ, nhân, chia. 4 phím quy định phép tính là 4 phím đơn nhận vào bằng cơ chế ngắt. Các giá trị
hạng tử được nhập bằng bàn phím ma trận. Lỗi được hiển thị bằng các led đơn (2 led cho 4 mã
lỗi), 2 led đơn còn lại hiển thị cho 4 phép tính. Các giá trị trong quá trình nhập cũng như kết quả
được hiển thị qua 6 led 7 đoạn.
Mỗi nhóm học viên chọn 1 trong 2 bài để làm tại lớp, bài còn lại dành cho về nhà
8.2 MÔ TẢ PHẦN CỨNG
� Vi điều khiển: PIC18F4620, sử dụng thạch anh 24MHz.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 62
62 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� Kết nối PORT sẽ được hướng dẫn tại lớp
8.3 GIẢI THU ẬT
(GV hướng dẫn trực tiếp trên lớp)
8.4 CHƯƠNG TRÌNH
Chương trình được giải tại lớp
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 63
63 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 9 : NGÔN NGỮ LẬP TRÌNH C NÂNG CAO
9.1 TÀI LI ỆU THAM KH ẢO
• C Program Language.
• Ôn tập kiến thức cũ:
• Các kiểu dữ liệu cơ bản.
• Các cấu trúc lệnh
• Các dạng hàm và cách truy xuất hàm.
• Các toán tử và cách truy xuất.
Bảng 9.1 Các kiểu dữ liệu nâng cao trong C
char ‘a’�’z’; ‘A’ �’Z’; ‘0’ �’9’ Ki ểu ký tự 1B dữ liệu
float -1.175e-38 � 3.402e38 Kiểu số thực 4Bs dữ liệu
signed long -2147483648 � 2147483647 Kiểu số nguyên có dấu mở
rộng
4Bs dữ liệu
unsigned long 0 � 4294967295 Kiếu số nguyên không dấu
mở rộng
4Bs dữ liệu
9.2 CÁC HÀM THÔNG D ỤNG TRONG THƯ VIỆN C CHUẨN:
9.2.1 Các hàm chuyển đổi kiểu dữ liệu:
Yêu cầu bắt buộc:
#include <stdlib.h>
� atoi(data):
• Chức năng: chuyển đổi dữ liệu (data) sang kiểu số nguyên int.
• Tham số truyền vào: đưa vào phải bắt đầu bằng ký tự, nếu không chương trình sẽ bị lỗi và
không thực hiện được
• Dữ liệu trả về: dữ liệu trả về kiểu int.
� atol(data):
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 64
64 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
• Chức năng: chuyển đổi dữ liệu (data) sang kiểu long
• Tham số truyền vào: đưa vào phải bắt đầu bằng ký tự, nếu không chương trình sẽ bị lỗi và
không thực hiện được
• Dữ liệu trả về: trả về dữ liệu kiểu long
� atof(data):
• Chức năng: chuyển đổi kiếu dự liệu (data) từ dạng chuỗi sang dạng số thực float.
• Tham số truyền vào: đưa vào phải bắt đầu bằng ký tự, nếu không chương trình sẽ bị lỗi và
không thực hiện được.
• Dữ liệu trả về: dữ liệu trả về thuộc kiểu float
9.2.2 Các hàm xử lý chuổi:
Yêu cầu bắt buộc:
#include <string.h>
� strlen(str):
• Chức năng: đo độ dài chuỗi str
• Tham số truyền vào: str thuộc kiểu chuỗi
• Dữ liệu trả về: giá trị trả về chính là số ký tự trong chuỗi str, kiểu unsigned int
� strcat(str1,str2):
• Chức năng: nối 2 chuỗi str1 và str2
• Tham số truyền vào: str1 và str2 thuộc kiểu chuỗi
• Dữ liệu trả về: dữ liệu trả về thuộc kiểu chuỗi
� strcpy(str1, str2):
• Chức năng: sao chép từ chuỗi str1 sang chuổi str2
• Tham số truyền vào: str1 và str2 thuộc kiểu chuỗi
• Dữ liệu trả về: không có kiểu dữ liệu trả về
9.2.3 Các hàm toán học:
Yêu cầu bắt buộc:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 65
65 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
#include <math.h>
� abs(data):
• Chức năng: lấy giá trị tuyệt đối một số
• Tham số truyền vào: data truyền vào thuộc kiểu số (char, int, long, float…)
• Dữ liệu trả về: dữ liệu trả về là dạng unsigned của dữ liệu truyền vào
� acos(data), asin(data), atan(data):
• Chức năng: dùng để lấy các giá trị arcsin, arccos, arctan của dữ liệu
• Tham số truyền vào: dữ liệu đưa vào bắt buộc phải là kiếu số (char, int, long, float…)
• Dữ liệu trả về: kiếu dữ liệu trả về thuộc kiểu float
� cos(data), sin(data), tan(data):
• Chức năng: dùng để lấy các giá trị sin, cos, tan của dữ liệu
• Tham số truyền vào: dữ liệu đưa vào bắt buộc phải là kiếu số (char, int, long, float…)
• Dữ liệu trả về: kiếu dữ liệu trả về thuộc kiểu float
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
66 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 10 : IO PORT NÂNG CAO – LCD
10.1 TỔNG QUAN VỀ LCD
10.1.1 LCD là gì
10.1.2 Các loại LCD trên th ị trường
10.1.2.1 Character LCD:
Character LCD là loại LCD chỉ thể hiện được các ký tự (“A” � “Z”, “a” � “z”, “0” � “9”).
Thông thường trên thị trường chỉ có một số kích cỡ LCD như 16 x 2 (16 cột – 2 dòng), 20 x 4 (20
cột – 4 dòng).
Hình 10.1 - Graphic LCD:
10.1.2.2 Graphic LCD
Graphic LCD được hiển thị bằng các điểm ảnh (dot). Chúng ta tạm chia loại này thành 2 loại
chính: Black/White LCD, Colour LCD.
Về mặt kích thước loại LCD này khá đa dạng, một số kích thước thông dụng trên thị trường
như: 128 x 64, 240 x 128 …
Ngoài ra LCD còn có thể tích hợp tính năng nhận dữ liệu dạng TouchScreen (TouchScreen
LCD). Chương trình này chỉ xét tới LCD dạng Character LCD được điều khiển bởi chip HD
44780.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
67 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
10.2 CẤU TRÚC PHẦN CỨNG (LCD- HD 44780)
Hình 10.2 - Cấu trúc phần cứng LCD HD44780
10.3 TẬP LỆNH
// Hướng dẫn trong tài liệu tham khảo
10.4 TƯƠNG TÁC VĐK - LCD
10.4.1 Sử dụng tập lệnh LCD
// Hướng dẫn trong tài liệu tham khảo
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 68
68 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
10.4.2 Sử dụng thư viện của PIC18:
Chúng ta sẽ sử dụng thư viện xlcd.h, được hỗ trợ sẵn trong bộ công cụ PIC18 Compiler. Để
khai báo sử dụng thư viện này chúng ta phải chèn thêm câu lệnh.
#include <xlcd.h>
Các hàm tương tác cơ bản:
� BusyXLCD():
Cờ báo xem LCD có bận hay không ?
Thường được dùng trước các lệnh ghi dữ liệu, khai báo địa chỉ con trỏ …
� OpenXCLD(thuộc_tính_LCD)
Lệnh khởi tạo XLCD, được dùng khi bắt đầu sử dụng LCD, với thông số thuộc_tính_LCD bao
gồm:
Loại tương tác: FOUR_BIT : tương tác dữ liệu 4 bits.
EIGHT_BIT : tương tác dữ liệu 8 bits.
Kiểu ký tự và cách hiển thị: LINE_5X7 : hiển thị trên một dòng, kiểu chữ 5x7
LINE_5X10 : hiển thị trên một dòng , kiểu chữ 5X10
LINES_5X7 : hiển thị trên nhiều dòng, kiểu chữ 5X7
� putcXLCD(ký_tự) - WriteDataXLCD(ký_tự): Xuất một ký tự lên LCD.
� putsXLCD() – putrsXLCD(): Xuất một chuỗi ký tự lên XLCD.
� SetDDRamAddr(vị_trí):
Di chuyển con trỏ của LCD đến vị trí cần xuất dữ liệu (vị trí cần phải tuân theo quy tắc của
LCD). Lưu ý, trước khi sử dụng lệnh này cần kiểm tra xem LCD có bận hay không.
Ngoài những hàm đã được quy định sẵn trong bộ thư viện, ta còn có một số hàm cần phải được
khai báo trong chương trình (do những hàm này tuy thuộc vào xung clock hệ thống). Đó là các
hàm sau đây:
void DelayFor18TCY(void)
{
Nop(); // lệnh này được lặp lại 18 lần
}
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 69
69 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
void DelayPORXLCD(void)
{ // Delay 15 ms
// phần hàm này sẽ được hướng dẫn kỹ hơn ở lớp
}
void DelayXLCD(void)
{ // Delay 5 ms
// phần này cũng sẽ được hướng dẫn kỹ hơn ở lớp
}
Nhóm biên soạn BigLab
70 Nhóm Đào Tạo Kỹ Thuật BigLab
11.1 TÀI LI ỆU THAM KH ẢO
• Datasheet PIC18F4620 chươ
• MPLAB C18 Libraries
11.2 CẤU TRÚC PHẦN CỨNG TIMER 1, 2, 3
Hình 11.1
Hình 11.2
Chủ biên ThS. Võ Xuân Quốc – [email protected]
BigLab www.biglab.edu.vn
Bài 11 : TIMER 1, 2, 3
O
heet PIC18F4620 chương 12, 13, 14
NG TIMER 1, 2, 3 (Tham khảo bài số 7)
Hình 11.1 - Cấu trúc phần cứng Timer1
Hình 11.2 - Cấu trúc phần cứng Timer2
www.biglab.edu.vn
Nhóm biên soạn BigLab
71 Nhóm Đào Tạo Kỹ Thuật BigLab
Hình 11.3
11.3 SỬ DỤNG THƯ VIỆN C18 CHO VI
Thông thường, để sử dụng Timer1/2/3 chúng ta có th
như học phần trước đã làm, nhưng cách đ
nên, trong học phần này chúng ta s
Để sử dụng thư viện này, chúng ta c
#include <timers.h>
Các hàm cơ bản trong thư vi
(ký hiệu X là con số tương ứng cho 1/2/3)
� OpenTimer1(config): Khai báo s
• Timer1 Interrupt:
TIMER_INT_ON :
TIMER_INT_OFF :
• Khai báo số bits sử dụng:
T1_8BIT_RW
Chủ biên ThS. Võ Xuân Quốc – [email protected]
BigLab www.biglab.edu.vn
Hình 11.3 - Cấu trúc phần cứng Timer3
N C18 CHO VIỆC CÀI ĐẶT TIMER
ng Timer1/2/3 chúng ta có thể dùng cách tương tác thanh ghi tr
ưng cách đó với Timer1/2/3 sẽ tương đối mất th
n này chúng ta sẽ sử dụng thư viện MPLAB C18:
chúng ta cần khai báo tiền xử lý:
ư viện:
ng cho 1/2/3)
OpenTimer1(config): Khai báo sử dụng Timer1
sử dụng ngắt Timer1
không sử dụng ngắt Timer1
ng:
: sử dụng Timer 8 bits
www.biglab.edu.vn
ương tác thanh ghi trực tiếp
t thời gian. Vì thế cho
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 72
72 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
T1_16BIT_RW : sử dụng Timer 16 bits
• Nguồn xung sử dụng:
T1_SOURCE_EXT : sử dụng nguồn xung ngoài (từ chân T1CKI)
T1_SOURCE_INT : sử dụng nguồn xung từ thạch anh
• Prescalers:
T1_PS_1_1 : tỷ lệ 1:1
T1_PS_1_2 : tỷ lệ 1:2
T1_PS_1_4 : tỷ lệ 1:4
T1_PS_1_8 : tỷ lệ 1:8
• Khai báo sử dụng thạch anh ngoài:
T1_OSC1EN_ON : sử dụng thạch anh ngoài
T1_OSC1EN_OFF : không sử dụng thạch anh ngoài
• Khai báo sử dụng bộ đồng bộ xung:
T1_SYNC_EXT_ON : sử dụng bộ đồng bộ xung
T1_SYNC_EXT_OFF : không sử dụng bộ đồng bộ xung
Hình 3.1 OpenTimer2(config): Khai báo sử dụng bộ Timer2
• Timer2 Interrupt:
TIMER_INT_ON : sử dụng ngắt Timer1
TIMER_INT_OFF : không sử dụng ngắt Timer1
• Prescalers
T2_PS_1_1 : tỷ lệ 1:1
T2_PS_1_4 : tỷ lệ 1:4
T2_PS_1_16 : tỷ lệ 1:16
• Postscaler:
T2_PS_1_1 : tỷ lệ 1:1
T2_PS_1_2 : tỷ lệ 1:2
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 73
73 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
......
T2_PS_1_15 : tỷ lệ 1:15
T2_PS_1_16 : tỷ lệ 1:16
� OpenTimer3(config): Khai báo sử dụng Timer3
• Timer3 Interrupt:
TIMER_INT_ON : sử dụng ngắt Timer1
TIMER_INT_OFF : không sử dụng ngắt Timer1
• Khai báo số bits sử dụng:
T3_8BIT_RW : sử dụng Timer 8 bits
T3_16BIT_RW : sử dụng Timer 16 bits
• Nguồn xung sử dụng:
T3_SOURCE_EXT : sử dụng nguồn xung ngoài (từ chân T1CKI)
T3_SOURCE_INT : sử dụng nguồn xung từ thạch anh
• Prescaler:
• T3_PS_1_1 : tỷ lệ 1:1
• T3_PS_1_2 : tỷ lệ 1:2
• T3_PS_1_4 : tỷ lệ 1:4
• T3_PS_1_8 : tỷ lệ 1:8
• Khai báo sử dụng bộ đồng bộ xung:
T1_SYNC_EXT_ON : sử dụng bộ đồng bộ xung
T1_SYNC_EXT_OFF : không sử dụng bộ đồng bộ xung
� CloseTimerX(): Tắt không sử dụng bộ Timer1/2/3
� ReadTimerX() : Đọc giá trị từ bộ Timer1/2/3
� WriteTimerX(): Ghi giá trị và Timer1/2/
Quy trình khai báo Timer cho ứng dụng:
� OpenTimerX(config); // Khởi tạo Timer
� WriteTimerX(...); // Khởi tạo giá trị đầu cho Timer
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 74
74 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
.....
� Biến = ReadTimerX();// Đọc lấy giá trị Timer
....
� CloseTimerX(); // Đóng TimerX khi không sử dụng
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
75 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 12 : ADC (ANALOG – DIGITAL CONVERT)
12.1 TÀI LI ỆU THAM KH ẢO
• Datasheet 18F4620 – Chương 19
12.2 TỔNG QUAN VỀ ADC
12.2.1 ADC là gì?
ADC (Analog to Digital Convert) là một bộ chuyển đổi từ tín hiệu tuần tự (analog) sang tín hiệu
số (digital). Có rất nhiều bộ chuyển đổi ADC, ví dụ như các bộ chuyển đổi sử dụng Op-Amp
(khuếch đại thuật toán), các card chuyển đổi sử dụng IC, hay các bộ chuyển đổi được tích hợp
trong VĐK ... Trong nội dung bài hôm nay, chúng ta chỉ xét đến các bộ chuyển đổi ADC được tích
hợp trong VĐK. Trước hết, chúng ta sẽ tìm hiểu một số khái niệm cơ bản của bộ ADC.
12.2.2 Độ phân giải (Resolution)
Độ phân giải là số giá trị bit có thể có để chứa hết toàn bộ các giá trị của tín hiệu. Độ phân giải
được tính theo đơn vị bits. Độ phân giải càng cao thì tín hiệu thu được sẽ càng “mịn” – tức là gần
giống với tín hiệu tuần tự hơn.
12.2.3 Giá tr ị tham chiếu:
Giá trị tham chiếu là các giá trị cao nhất và thấp nhấp của bộ chuyển đổi ADC. Ta xét đến một
ví dụ sau đây:
Giả sử bạn có một bộ ADC 10 bits, giá trị tham chiếu được chọn là Vref+ = 5V - Vref- = 0V.
Nếu bạn thu về một tín hiệu tuần tự 3V, thì bạn sẽ thu về được giá trị của ADC là:
2�� � 1
5 � 0 �3 � 0 614
Nhưng nếu chúng ta chọn Vref+ = 5V và Vref- = 1.5V, khi ta thu về một tín hiệu tuần tự ở mức
3V, ta sẽ nhận được giá trị như sau:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
76 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
2�� � 1
5 � 1.5 �3 � 1.5 438
12.3 BỘ CHUYỂN ĐỔI ADC TRONG VĐK
12.3.1 Cấu tạo phần cứng một bộ ADC:
Xem hình trang 228, 229 – datasheet 18F4620
12.3.2 Các thanh ghi tương tác:
Có 5 thanh ghi tương tác cho một bộ ADC, bao gồm các thanh ghi sau:
ADRESH – ADRESL : thanh ghi chứa giá trị ADC.
ADCON0 – ADCON1 – ADCON2 : thanh ghi khai báo cho ADC.
// chi tiết các thanh ghi khai báo xem ở trang 225-227
12.3.3 Một số khái niệm quan trọng:
� Thời gian thu nhận dữ liệu (Acquisition Time):
Đây là thời gian cần thiết để phần cứng ADC đáp ứng cho việc thu nhận dữ liệu. Thời gian này
được khai báo tại các thanh ghi ADCON.
// GV hướng dẫn thêm tại lớp.
� Thời gian chuyển đổi ADC (ADC Time):
Thời gian này được tính theo đơn vị TAD (vào khoảng 0.7 us),với giá trị TAD sẽ được khai báo
trong thanh ghi ADCON nhưng phải tuân theo bảng sau:
Với bộ ADC 10 bits ta sẽ cần 11 TAD để chuyển đổi. Sau đây ta ví dụ cho thời gian chuyển đổi
của một bộ ADC 10 bits:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
77 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
// GV đứng lớp hướng dẫn thêm về config bit PBADEN
12.3.4 Sử dụng thư viện ADC trong C18
Chúng ta sẽ bắt đầu tìm hiểu cách sử dụng các hàm trong thư viện ADC của PIC 18F4620.
Trước tiên, muốn sử dụng thư viện ADC trong MPLAB, chúng ta phải khai báo:
#include <adc.h>
Với các hàm sau:
� OpenADC(config1, config2, portconfig): Khởi tạo ADC.
- Config1:
Khai báo Tad:
• ADC_FOSC_2 : Tad = 2Fosc
• ADC_FOSC_4 : Tad = 4Fosc
• ADC_FOSC_8 : Tad = 8Fosc
• ADC_FOSC_16 : Tad = 16Fosc
• ADC_FOSC_32 : Tad = 32Fosc
• ADC_FOSC_64 : Tad = 64Fosc
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 78
78 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Khai báo kiểu kết quả ADC:
• ADC_RIGHT_JUST : bit thấp � bit cao
• ADC_LEFT_JUST : bit cao � bit thấp
Khai báo thời gian tính toán kết quả:
• ADC_0_TAD : Tacq = 0 Tad
• ADC_2_TAD : Tacq = 2 Tad
• ADC_4_TAD : Tacq = 4 Tad
• ADC_6_TAD : Tacq = 6 Tad
• ADC_8_TAD : Tacq = 8 Tad
• ADC_12_TAD : Tacq = 12 Tad
• ADC_16_TAD : Tacq = 16 Tad
• ADC_20_TAD : Tacq = 20 Tad
- Config2:
Chọn kênh ADC mặc định (kênh ADC ban đầu):
• ADC_CH0 : Kênh 0 (AN0)
• ADC_CH1 : Kênh 1 (AN1)
• ADC_CH2 : Kênh 2 (AN2)
• ADC_CH3 : Kênh 3 (AN3)
• ADC_CH4 : Kênh 4 (AN4)
• ADC_CH5 : Kênh 5 (AN5)
• ADC_CH6 : Kênh 6 (AN6)
• ADC_CH7 : Kênh 7 (AN7)
• ADC_CH8 : Kênh 8 (AN8)
• ADC_CH9 : Kênh 9 (AN9)
• ADC_CH10 : Kênh 10 (AN10)
• ADC_CH11 : Kênh 11 (AN11)
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 79
79 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
• ADC_CH12 : Kênh 12 (AN12)
• ADC_CH13 : Kênh 13 (AN13)
• ADC_CH14 : Kênh 14 (AN14)
• ADC_CH15 : Kênh 15 (AN15)
Khai báo có sử dụng ngắt ADC:
• ADC_INT_ON : Sử dụng ngắt
• ADC_INT_OFF : Không sử dụng ngắt
Khai báo sử dụng nguồn chuẩn:
• ADC_VREFPLUS_VDD : Sử dụng nguồn dương chuẩn bên ngoài
• ADC_VREFMINUS_VDD : Sử dụng nguồn âm chuẩn từ bên ngoài
• Nếu không khai báo phần này, ta sẽ xem mặc định là sử dụng nguồn chuẩn cấp từ VĐK
portconfig: khai báo sử dụng bao nhiêu kênh ADC (0 – 15).
� SetChanADC(channel): chọn kênh ADC (nếu sử dụng nhiều kênh ADC).
channel:
• ADC_CH0 : Kênh 0 (AN0)
• ADC_CH1 : Kênh 1 (AN1)
• ADC_CH2 : Kênh 2 (AN2)
• ADC_CH3 : Kênh 3 (AN3)
• ADC_CH4 : Kênh 4 (AN4)
• ADC_CH5 : Kênh 5 (AN5)
• ADC_CH6 : Kênh 6 (AN6)
• ADC_CH7 : Kênh 7 (AN7)
• ADC_CH8 : Kênh 8 (AN8)
• ADC_CH9 : Kênh 9 (AN9)
• ADC_CH10 : Kênh 10 (AN10)
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 80
80 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
• ADC_CH11 : Kênh 11 (AN11)
� BusyADC() : Kiểm tra xem ADC có bận hay không ???
� ConvertADC() : Chuyển đổi analog � digital.
� ReadADC(): Đọc giá trị từ kênh ADC.
� CloseADC(): Kết thúc việc sử dụng kênh ADC.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
81 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 13 : USART
13.1 TÀI LI ỆU THAM KH ẢO
Serial Port Complete – Jan Alexson
Datasheet PIC 18F4620 – Chương 18
13.2 KHÁI QUÁT V Ề CÁC CHUẨN GIAO TI ẾP
USART (Universal Synchronous & Asynchronous serial Receiver and Tranreceiver) có nghĩ là
“Chuẩn truyền nhận nối tiếp đồng bộ và bất đồng bộ”, đây là một thuật ngữ để chỉ một chuẩn giao
tiếp. Ngoài ra, chúng ta còn phân biệt thuật ngữ UART (nghĩa là chuẩn truyền nhận bất đồng bộ),
thường để chỉ một thiết bị phần cứng. Khi chúng ta sử dụng chuẩn giao tiếp USART, chúng ta phải
sử dụng thêm một bộ phận phần cứng đính kèm, thường thì bộ phần phần cứng này là một mạch
đệm dùng để chuyển điện áp 0V đến 5V sang một mức điện áp khác cho phù hợp với loại giao
tiếp. Sau đây, chúng ta sẽ cùng tìm hiểu những khái niệm cơ bản của USART:
13.2.1 Giao tiếp nối ti ếp:
Giao tiếp nối tiếp là kiểu truyền nhận mà dữ liệu đi trong bus dữ liệu ở dạng từng bit một, khác
với chuẩn truyền nhận song song khi mà dữ liệu được truyền trong bus ở dạng “gói dữ liệu”. Hình
ảnh sau giúp chúng ta dễ hình dung hơn chuẩn giao tiếp nối tiếp/ song song:
Ưu điểm lớn nhất của chuẩn giao tiếp nối tiếp là băng thông nhỏ, chuẩn phần cứng đơn giản
(chỉ có 1 hay 2 đường dữ liệu). Bên cạnh đó, chuẩn giao tiếp nối tiếp có khuyết điểm lớn nhất là,
thời gian truyền chậm, nhưng nhờ có sự phát triển của kỹ thuật nên dần dần những khuyết điểm đó
được loại bỏ.
13.2.2 Truy ền thông đồng bộ và bất đồng bộ:
Truyền thông đồng bộ là kiểu tryền được chuẩn hóa về mặt thời gian, nên khi dữ liệu được
truyền đi chúng ta cần phải có tín hiệu báo trước. Khi ấy, chuẩn truyền đồng bộ này cần ít nhất hai
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 82
82 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
chân (một chân dữ liệu và một chân xung nhịp). Nhưng nhờ đó mà độ tin cậy trong truyền nhận
cao hơn, dữ liệu sai sót ít hơn.
Khác với chuẩn truyền thông đồng bộ, chuẩn truyền bất đồng bộ là chuẩn truyền mà chúng ta
không cần có tín hiệu báo trước. Nhưng để nhận biết dữ liệu truyền nhận chúng ta cần tuân thủ các
nguyên tắc chung trong truyền nhận, nên từ đó chúng ta có chuẩn truyền nhận cho các giao tiếp bất
đồng bộ.
13.2.3 Baud Rate:
Baud Rate là một chuẩn về thời gian cho việc truyền nhận, hay nói cách khác Baud Rate chính
là số bit truyền được trong một giây.
13.2.4 Frame truyền:
Do truyền thông bất đồng bộ rất dễ xảy ra sai lệch trong quá trình truyền nhận, nên người ta mới
ra quy định về frame truyền. Frame truyền là một “gói” dữ liệu truyền trong đó bao gồm các thành
phần cơ bản sau:
Start bit : bit báo bắt đầu gới truyền.
Stop bit : bis báo kết thúc gói truyền.
Data : dữ liệu cần truyền.
Parity bit: bit kiểm tra lỗi, thường có 2 loại bit parity (chẵn và lẻ)
// GV sẽ hướng dẫn thêm phần này
13.3 USART TRONG PIC
Module USART bao gồm các thanh ghi sau đây:
� TXSTA: Thanh ghi khai báo phần truyền dữ liệu.
� RCSTA: Thanh ghi khai báo phần nhận dữ liệu.
� TXREG: Thanh ghi chứa dữ liệu cần truyền.
� RCREG: Thanh ghi chứa dữ liệu nhận.
� BAUDCON: Thanh ghi khai báo tốc độ truyền.
Mô hình phần cứng:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
83 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Hình 13.1 - Mô hình phần cứng truyền dữ liệu.
Hình 13.2 - Mô hình phần cứng nhận dữ liệu.
Khai báo cơ bản cho một module USART bao gồm các phần sau đây:
� Khai báo trạng thái nhận
� Khai báo trạng thái truyền.
Khai báo tốc độ truyền (Baud Rate) với công thức sau đây:
Tốc độ BaudRate (chức trong thanh ghi SPBRG) = Fosc / (64 * BaudRate) – 1
Với BaudRate phải được chọn theo tiêu chuẩn.
� Quy trình khai báo cho một module USART trong PIC:
• Khai báo đồng bộ / bất đồng bộ.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 84
84 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
• Khai báo số bits truyền nhận.
• Khai báo ngắt.
• Khai báo tốc độ Baud
� Quy trình truyền dữ liệu:
• Gán giá trị cho thanh ghi TXREG.
• Chờ cho việc truyền thành công.
� Quy trình nhận dữ liệu:
Thường chúng ta làm theo 2 cách:
• Cách 1: Sử dụng ngắt RCIE
• Cách 2: Kiểm tra xem cờ ngắt RCIF có bật lên hay không
13.3.2 Thư viện USART trong C18
#include <usart.h>
Các hàm thông dụng trong MPLAB bao gồm các hàm sau:
� - OpenUSART(config, baud_rate): Khai báo giao tiếp USART:
Config:
Khai báo ngắt sau khi truyền dữ liệu:
• USART_TX_INT_ON : Sử dụng ngắt khi truyền dữ liệu
• USART_TX_INT_OFF : Không sử dụng ngắt khi truyền dữ liệu.
Khai báo ngắt sau khi nhận dữ liệu
• USART_RX_INT_ON : Sử dụng ngắt khi nhận dữ liệu.
• USART_RX_INT_OFF : Không sử dụng ngắt khi nhận dữ liệu.
Chế độ USART:
• USART_ASYNCH_MODE : Truyền nhận bất đồng bộ
• USART_SYNCH_MODE : Truyền nhạn đồng bộ
Khai báo kích thước gói truyền:
• USART_EIGHT_BIT : Gói truyền 8 bits
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 85
85 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
• USART_NINE_BIT : Gói truyền 9 bits
Khai báo truyền nhận đồng bộ (chỉ áp dụng khi chúng ta sử dụng truyền nhận đồng bộ)
• USART_SYNC_SLAVE : Đồng bộ truyền ở Slave
• USART_SYNC_MASTER : Đồng bộ truyền ở Master
Khai báo chế độ nhận dữ liệu:5
• USART_SINGLE_RX : Khai báo chế độ nhận dữ liệu đơn
• USART_CONT_RX : Khai báo chế độ nhận dữ liệu liên tục
Khai báo chế độ baud rate
• USART_BRGH_HIGH : Khai báo baud rate mức cao
• USART_BRGH_LOW : Khai báo baud rate mức thấp
� baud_rate: Khai báo thông số baud rate của hệ thống:
Truyền nhận bất đồng bộ, chế độ baud rate mức cao:
• FOSC / (16 * (spbrg + 1))
Truyền nhận bất đồng bộ, chế độ baud rate mức thấp:
• FOSC / (64 * (spbrg + 1))
Truyền nhận đồng bộ:
• FOSC / (4 * (spbrg + 1))
� CloseUSART(): Tắt giao tiếp USART.
� BusyUSART(): Kiếm tra xem dữ liệu gửi xong chưa ???
� putcUSART(data): gởi một byte ký tự.
� putsUSART(data): gởi một chuỗi ký tự.
� DataRdyUSART(): Kiếm tra xem đã nhận được dữ liệu chưa ???
� getcUSART(): nhận một byte dữ liệu
� getsUSART(data,length): nhận một chuỗi dữ liệu, với chiều dài length.
Cách sử dụng chương trình mô phỏng cổng COM.
// GV hướng dẫn sử dụng tại lớp.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
86 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 14 : PWM / CAPTURE / COMPARE
14.1 TÀI LI ỆU THAM KH ẢO
• Chương 15 – Datasheet 18F4620
• Nhắc lại kiến thức về Timer 1 – 2 – 3:
14.2 TỔNG QUAN VỀ PWM/CAPTURE/COMPARE
14.2.1 PWM là gì?
PWM (Pulse-Width Modulation) còn gọi là chức năng “điều chế độ rộng xung” được ứng dụng
rất nhiều trong các lĩnh vực điện tử, điều khiển ... Chức năng này thực chất là thay đổi giá trị trung
bình của điện áp (dòng điện, ...) bằng cách điều chỉnh độ rộng xung kích mức cao trong một chu
kỳ. Chức năng này thường được ứng dụng trong việc điều chỉnh điện áp đầu ra, điều chỉnh tốc độ
của động cơ DC ...
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
87 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
14.2.2 Ứng dụng trong VĐK:
14.2.2.1 Chức năng Capture:
14.2.2.2 Chức năng Compare
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
88 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
14.2.2.3 Sơ đồ khối chức năng PWM:
Công thức tính toán: (trình bày trong chương trình)
Khai báo config bit CCP2MX: // GV hướng dẫn tại lớp
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 89
89 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
14.3 QUY TRÌNH SỬ DỤNG MODULE PWM TRONG PIC
14.3.1 Quy trình sử dụng PWM
� Khai báo sử dụng chức năng: cài đặt cho 4 bit của thanh ghi CCPxCON
� Tính toán và cài đặt Period vào thanh ghi PR2
� Tính toán và cài đặt duty cycle vào thanh ghi: CCPxRL và CCPxCON<4,5>
� Set TRIS cho ngõ ra
� Cài đặt timer 2 Prescaler và enable timer2
� Enable PWM
14.3.2 Hướng dẫn sử dụng trong PIC 18F:
Chúng ta sẽ sử dụng thư viện PWM của MPLAB để điểu khiển động cơ. Trước khi, sử dụng thư
viện PWM, ta phải khai báo khai báo Timer2.
Tiếp theo, chúng ta phải chèn vào tiền xử lý:
#include <pwm.h>
Với các hàm tương tác sau đây:
� OpenPWMx(period): Khởi tạo module PWM
� SetDCPWMx(duty) : khai báo duty cycle cho động cơ.
� ClosePWMx(): Tắt module PWM.
14.4 PHẦN MỞ RỘNG - ENCODER
14.4.1 Encoder là gì?
Để điều khiển được một động cơ DC đúng với vận tốc hay vị trị cần thiết, chắc chắn rằng chúng
ta phải đọc được vận tốc hay vị trí hiện tại của nó. Từ ta có 3 phương pháp chính:
Dùng tachometer (Tachometer là một cảm biến đo góc) Dùng biến trở xoay (thường phương pháp này dùng để xác định vị trí, ít khi nào dùng xác định vận tốc)
Dùng optical enocoder.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
90 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Hình 14.1 - Encoder là gì ???
Encoder là một loại cảm biến bao gồm 2 phần chính:
Một bộ thu – phát tín hiệu quang học (cảm biến quang) Một đĩa kim loại có khắc vạch.
Độ chính xác của một encoder phụ thuộc rất lớn vào số vạch khác trên đĩa kim loại, cũng như
thời gian đáp ứng của bộ cảm biến quang học.
14.4.2 Phân loại encoder:
Có 2 loại encoder:
Encoder tuyệt đối : thường được ứng dụng nhiều trong các hệ thống đo vị trí. Encoder tương đối: loại encoder này dùng rất nhiều và khá phổ biến. Nên từ nay chúng ta
thống nhất khi nói đến encoder, thì đó chính là encoder tương đối.
14.4.3 Tín hiệu đầu ra encoder:
Một encoder thường có 5 chân, bao gồm các chân sau:
2 chân cho nguồn và mass. 1 chân cho pharse A 1 chân cho pharse B 1 chân cho pharse Z
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
91 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Tín hiệu Pharse A và pharse B thường lệch nhau ½ chu kỳ, thường thì chúng ta dùng hai tín
hiệu này để nhận biết chiều quay của encoder.
14.4.4 Các phương pháp đọc tín hiệu encoder:
Dùng chức năng Capture:
Ta dùng chức năng capture để đo chu kỳ của encoder, từ đó chúng ta có thể tính toán được vận
tốc của động cơ DC.
Dùng chức năng Timer1:
Ta dùng chân T13CKI để thu nhận tín hiệu từ encoder gởi về (xem xung từ encoder như một
nguồn xung). Bên cạnh đó ta có thể kết hợp thêm chức năng Timer 0 để tính toán vận tốc của động
cơ DC.
Dùng chức năng ngắt ngoài:
Dùng các kênh ngắt INTx để thu nhận tín hiệu từ encoder (xem xung từ encoder như một nguồn
kích). Bên cạnh đó, ta có thể kết hợp thêm chức năng Timer0 (đo thời gian) để tính toán vận tốc
của động cơ DC.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
92 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 15 : SPI – I2C
CÁC PHƯƠNG PHÁP LƯU TRỮ DỮ LIỆU
15.1 TÀI LI ỆU THAM KH ẢO
• Chương 17 – Datasheet 18F4620
• Serial Port Complete
15.2 TỔNG QUAN VỀ SPI
SPI (Serial Peripheral Bus) là một chuẩn giao tiếp đồng bộ - nối tiếp do hãng Motorola đề xuất.
SPI là một chuẩn giao tiếp theo kiểu Master – Slave, với một chip Master điều khiển hoạt động
truy xuất của hàng loạt chip Slave. SPI cũng là một chuẩn giao tiếp song công (full duplex), theo
đó dữ liệu truyền và nhận đồng thời. Ở một số tài liệu, người ta còn gọi chuẩn SPI là chuẩn giao
tiếp 4 dây, với 4 đường truyền:
• SCK : xung giữ nhịp cho giao tiếp SPI, xung clock được phát ra từ chip Master và chip Slave sẽ nhận xung và đồng bộ quá trình truyền nhận. Nhờ có chân SCK mà quá trình truyền – nhận diễn ra ít lỗi hơn, và nhanh hơn.
• SDI : chân phát dữ liệu cho Master / Slave. • SDO : chân thu nhận dữ liệu cho Master/Slave.
• SS (Select Slave) : đối với Master thì đây sẽ là chân chọn chip Slave nào sẽ truyền, còn đối với chip Slave thì đây là chân cho phép có truyền – nhận với chip Master.
15.3 HOẠT ĐỘNG CỦA SPI
15.3.1 Phần cứng ban đầu bao gồm:
� Chân Master SDI nối với chân Slave SDO.
� Chân Master SDO nối với chân Slave SDI.
� Chân SCK của 2 chip nối với nhau.
� Một chân IO bất kỳ của Master nối với chân SS của Slave.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 93
93 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
15.4 SPI TRONG PIC
// GV sẽ trình bày tại lớp
15.5 THƯ VIÊN SPI TRONG C18
Để sử dụng giao tiếp SPI trong MPLAB C18, ta khai báo thư viện:
#include <spi.h>
Với các hàm tương tác cơ bản sau đây:
� OpenSPI(sync_config, bus_config, smp_config): Khai báo cho module SPI.
sync_config:
Chế độ Master:
• SPI_FOSC_4 SPI : xung giữ nhịp = Fosc/4
• SPI_FOSC_16 SPI : xung giữ nhịp = Fosc/16
• SPI_FOSC_64 SPI : xung giữ nhịp = Fosc/64
• SPI_FOSC_TMR2 SPI : xung giữ nhịp TMR2 / 2
Chế độ Slaver:
• SLV_SSON : sử dụng chân SS
• SLV_SSOFF : không sử dụng chân SS (chọn chân khác làm SS)
bus_config:
• MODE_00 : chế độ 0, 0
• MODE_01 : chế độ 0, 1
• MODE_10 : chế độ 1, 0
• MODE_11 : chế độ 1, 1
smp_config:
• SMPEND : lấy mẫu vào cuối xung
• SMPMID : lấy mẫu vào giữa xung
� putcSPI(data) : gởi một byte dữ liệu.
� putsSPI(string) : gởi một chuỗi dữ liệu.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 94
94 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
(quá trình gởi ở master phải được khởi đầu và kết thúc bằng việc kích xung và chân SS)
� DataRdySPI() : xét xem dữ liệu đã sẵn sàng nhận chưa ??? (thường chỉ áp dụng cho
việc gởi nhận một byte dữ liệu)
� data = getcSPI(): nhận một byte dữ liệu.
� getsSPI(data_string,length) : nhận một string với chiều dài length.
� CloseSPI(): Tắt giao tiếp SPI
15.6 MỞ RỘNG – I2C
15.6.1 Kiên thức cơ bản về giao tiếp I2C:
I2C (Inter-Intergrade Circuit) là một chuẩn truyền thông do hãng Philip Semiconductor đề xuất.
I2C là chuẩn đồng bộ - nối tiếp, tuy nhiên I2C có một đặc điểm khá hay là giao tiếp này là một
giao tiếp đa chủ, tức là một chip vừa có thể là Slave mà cũng có thể là Master. Trong một mạng
I2C với các chip đồng chức năng (cùng hỗ trợ Master – Slave) thì trong một thời điềm một chip có
thể là Master nhung một thời điểm khác nó có thể là Slave. Nhưng đối với các chip nhớ do thiết
kế của các nhà sản xuất nó chỉ hỗ trợ ở chế độ Slave.
15.6.2 Cấu hình phần cứng của giao tiếp I2C:
� Master là chip giữ vai trò điều phối thông tin trong mạng điều khiển, khi cần giao tiếp với
Slave nào thì Master chỉ việc gởi địa chỉ đến Slave đó, và bắt đầu quá trình giao tiếp.
� Slave: là chip thực thi trong mạng giao tiếp, trong mỗi chip Slave có chức một địa chỉ trong
mạng giao tiếp.
� SDA : là đường truyền dữ liệu chính cho cả giao tiếp, tất cả dữ liệu phải được truyền trên
đường dư liệu này.
� SCL: là đường xung nhịp đồng bộ hóa việc truyền nhận cho giao tiếp.
15.6.2.1 Các bit điều khiển cho giao tiếp I2C:
� Start : điều kiện bắt đầu từ trạng thái nghỉ, khi Master muốn bắt đầu quá trình truyền nhận,
thì bắt buộc Master phải kéo SDA từ cao xuống thấp trong khi SCK vẫn ở mức cao.
� Stop: điều kiện kết thúc, khi Master muốn kết thúc việc truyền nhận dữ liệu thì bắt buộc
Master phải kéo SDA từ cao xuống thấp trong khi SCL vẫn còn đang ở mức cao. Quy trình
Stop xảy ra chỉ khi việc truyền nhận kết thúc.
� Repeat : Khi việc truyền nhận kết thúc thay vì Master kết thúc quá trình truyền truyền nhận
bằng Stop bit, nhưng Master lại gởi tiếp Start bit , trong trường hợp này ta gọi đó là Repeat
Start. Trường hợp này xảy ra khi Master muốn nhận dữ liệu liên tiếp từ Slave.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
95 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
� ACK: đây là bit dùng để báo hiệu xem việc truyền dữ liệu đã hoàn thành chưa. Thường bit
này được gởi từ Slave, Slave dùng nó để báo cho Master mình đã nhận đủ dữ liệu.
15.6.2.2 Địa chỉ Slave:
Địa chỉ thường được gởi đi từ Master đến Slave, địa chỉ chứa Slave mà nó mong muốn truyền
tới. Địa chỉ cũng là gói dữ liệu đầu tiên của một lần truyền. Cấu trúc gói địa chỉ bao gồm:
� 7 bits địa chỉ.
� 1 bit điều khiển hướng truyền (Read/Write).
15.6.2.3 Kết cấu một gói truyền:
Một gói truyền cơ bản bao gồm:
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected]
96 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Thông thường người ta phối hợp giữa gói địa chỉ và gói dữ liệu:
15.6.2.4 Cuộc gọi chung:
Cuộc gọi chung là cuộc gọi mà địa chỉ có dạng 0000000W (địa chỉ = 0 và bít điều khiển hướng
là W). Cuộc gọi chung xảy ra khi Master muốn truyền dữ liệu cho tất cả Slave. Tất nhiên, trong
trường hợp này Slave có thể nhận hay không nhận cuộc gọi chung từ Master (tùy theo Slave có
được cài đặt chế độ cho phép nhận cuộc gọi chung hay không).
15.7 CÁC PHƯƠNG PHÁP LƯU TRỮ DỮ LIỆU
Với những dữ liệu tồn tại lâu dài theo thời gian ta bắt buộc phải lưu trữ. Việc lưu trữ dữ liệu
trong liên quan tới PIC có thể được chia làm 2 loại: có bộ nhớ ngoài và không có bộ nhớ ngoài.
Nếu không dùng bộ nhớ ngoài dữ liệu được lưu trữ trong EEPROM được hỗ trợ của PIC. Nếu
dùng bộ nhớ ngoài có thể dùng EEPROM ngoài hoặc các thiết bị lưu trữ khác như thẻ nhớ, USB,
máy tính… Ở nội dung bài này chỉ trình bày 2 vấn đề: Data EEPROM Memory và Extenal
EEPROM Memory.
15.7.1 Tài liệu tham khảo:
Chương 7, 17, 18 – Datasheet 18F4620
15.7.2 Data EEPROM Memory
15.7.2.1 Kiến trúc
Như chúng ta đã biết EEPROM là bộ nhớ có thể đọc, ghi bằng các tín hiệu điện và hoàn toàn
không bị mất khi ngắt nguồn nuôi. Chính vì thế bộ nhớ này được dùng để lưu trữ các dữ liệu tồn
tại lâu dài theo thời gian kể cả khi hệ thống dừng hoạt động.
Về mặt tổ chức, Data EEPROM được tổ chức theo dạng mảng (hoàn toàn tương tự một bank của
RAM). Chính vì thế việc truy xuất dữ liệu trong Data EEPROM có thể thực hiện bằng phần mềm
trong suốt quá trình hoạt động của PIC. Hoạt động truy xuất này được thực hiện thông qua việc cài
đặt các giá trị của 5 thanh ghi: EECON1, EECON2, EEDATA, EEADR, EEADRH
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 97
97 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
- EEADR, EEADRH: Đây là cặp thanh ghi định địa chỉ của vùng nhớ cần truy xuất trong
EEPROM. Tùy theo dung lượng của từng dòng mà số đường địa chỉ có thể khác nhau (tối
đa là 16, 65536 bytes). Ở dòng PIC18F dung lượng Data EEPROM được giới hạn ở 1024
bytes (PIC18F4620), chính vì vậy CPU cần 10 đường địa chỉ để có thể truy xuất hết vùng
nhớ này. EEADR chứa 8 bit thấp và EEADRH chứa 2 bit cao của địa chỉ.
- EECON1 và EECON2: là bộ thanh ghi điều khiển hoạt động của Data EEPROM. Trong đó
thanh ghi EECON2 không phải là thanh ghi vật lý cho nên người dùng không thể tương tác
được. Mọi cài đặt hoạt động của Data EEPROM đều được thực hiện trên thanh ghi
EECON1 (chi tiết xem trang 84 Datasheet 18F4620 hoặc trang 90 Datasheet 18F4550).
- EEDATA: là thanh ghi chứa dữ liệu xuất, nhập cho EEPROM. Điều này có nghĩa là tại một
thời điểm ta chỉ có thể truy xuất 1 ô nhớ của bộ nhớ này
15.7.2.2 Cài đặt và hoạt động:
a. Đọc dữ liệu
- Cài đặt hoạt động tại thanh ghi EECON1: chế độ ghi dữ liệu và Data Memory(GV giảng
chi tiết phần này trên lớp)
- Ghi địa chỉ vào các thanh ghi: EEADR, EEADRH (địa chỉ có thể lưu trữ là từ 0x00 tới
0x3FF)
- Ghi dữ liệu cần ghi vào thanh ghi EEDATA
b. Ghi dữ liệu
- Cài đặt hoạt động tại thanh ghi EECON1: chế độ đọc dữ liệu từ DataMemory (GV giảng
chi tiết phần này trên lớp)
- Ghi địa chỉ vào các thanh ghi: EEADR, EEADRH (địa chỉ có thể lưu trữ là từ 0x00 tới
0x3FF)
- Đọc dữ liệu từ thanh ghi EEDATA
15.7.3 Extenal EEPROM Memory
Các IC lưu trữ (chip nhớ) ngoài thường được giao tiếp đồng bộ với hệ thống (PIC) thông qua 1
trong 2 chuẩn giao tiếp: SPI và I2C. Mọi hoạt động truy xuất bộ nhớ đều được thực hiện thông
qua các chuẩn giao tiếp này. Chính vì thế việc cài đặt và hoạt động truy xuất bộ nhớ ngoài là
việc cài đặt và hoạt động các chuẩn SPI hoặc I2C. (xem bài 15).
15.7.4 Bài tập
Lưu trữ dữ liệu nhiệt độ tham khảo ở bài tập tổng kết vào DataEEPROM Memory.
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 98
98 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
Bài 16 : BÀI T ẬP TỔNG KẾT
16.1 YÊU CẦU
Hình 16.1 - Sơ đồ phần cứng của mạch thí nghiệm
Với sơ đồ phần cứng trên ta có thể giải quyết nhiều bài toán ứng dụng trong thực tế, trong
nội dung bài tập của khoá học yêu cầu được đặt ra như sau:
Yêu cầu: Thiết kế hệ thống tự động giám sát nhiệt độ có giao tiếp với máy tính
Đầu vào:
- Cảm biến nhiệt độ (analog sensor) - Biến trở để cài đặt giá trị nhiệt độ tham khảo - Nút nhấn để chọn chế độ hoạt động
Đầu ra:
- Hiển thị giá trị nhiệt độ hiện tại và giá trị nhiệt độ tham khảo ra LCD - Điều khiển vận tốc động cơ quạt (DC motor) để điều hoà nhiệt độ - Kết quả được truyền lên máy tính để lưu trữ, xử lý - Optional: bộ nhớ ngoài EEPROM
Hoạt động:
Hệ thống có vai trò giám sát và tự động điều chỉnh nhiệt độ của môi trường.
- Nhiệt độ tham khảo được cài đặt thông qua biến trở trong chế độ cài đặt (được chọn bởi nút nhấn (có thể dùng ngắt hoặc counter).
Nhóm biên soạn BigLab Chủ biên ThS. Võ Xuân Quốc – [email protected] 99
99 Nhóm Đào Tạo Kỹ Thuật BigLab www.biglab.edu.vn
- Khi nhiệt độ cao hơn giá trị tham khảo, hệ thống sẽ tự động khởi động quạt để làm giảm nhiệt độ của thiết bị cần giám sát.
- Giá trị nhiệt độ tham khảo và giá trị nhiệt độ hiện thời được hiển thị lên 2 dòng của LCD. - Sau một thời gian nhất định hệ thống sẽ tự động gửi dữ liệu nhiệt độ lên máy tính để giám
sát, kiểm tra. - Optional: Có thể lưu trữ giá trị dữ liệu vào chíp nhớ ngoài
16.2 MÔ TẢ PHẦN CỨNG
- Vi điều khiển PIC18F4620 hoặc PIC18F4550 - Kết nối các chân PORT sẽ được hướng dẫn tại lớp
16.3 GIẢI THU ẬT
GV hướng dẫn tại lớp
16.4 CHƯƠNG TRÌNH
Thời gian hoàn thành chương trình là 4 tiếng đồng hồ (2 buổi học)
Top Related