pic c18 - hitech c

99
Nhóm biên son BigLab Chbiên ThS. Võ Xuân Quc – [email protected] 1 1 Nhóm Đào To KThut BigLab www.biglab.edu.vn LI NÓI ĐẦU Tài liu này cùng vi đề cương chương trình là tài liu hướng dn chính thc cho hc viên tham gia khóa hc PIC C18 – Full do Nhóm Đào To BigLab phtrách. Tài liu có giá trlưu hành ni b, được cung cp min phí cho hc viên tham gia khóa hc. Mi thc mc vtài liu xin liên htrc tiếp vi ging viên đứng lp. Tài liu được biên son ln đầu chc chn còn nhiu thiếu sót, rt mong sgóp ý ca quý hc viên, độc gi. Mi ý kiến đóng góp xin liên hemail: [email protected] Nhóm biên son BigLab

Upload: daniel-nash

Post on 08-Aug-2015

470 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Pic c18 - Hitech c

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

Page 2: Pic c18 - Hitech c

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

Page 3: Pic c18 - Hitech c

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

Page 4: Pic c18 - Hitech c

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

Page 5: Pic c18 - Hitech c

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

Page 6: Pic c18 - Hitech c

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

Page 7: Pic c18 - Hitech c

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

Page 8: Pic c18 - Hitech c

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

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

Page 9: Pic c18 - Hitech c

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.

Page 10: Pic c18 - Hitech c

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

Page 11: Pic c18 - Hitech c

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

Page 12: Pic c18 - Hitech c

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:

Page 13: Pic c18 - Hitech c

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

Page 14: Pic c18 - Hitech c

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

Page 15: Pic c18 - Hitech c

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

Page 16: Pic c18 - Hitech c

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

Page 17: Pic c18 - Hitech c

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ự

Page 18: Pic c18 - Hitech c

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

Page 19: Pic c18 - Hitech c

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)

Page 20: Pic c18 - Hitech c

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

Page 21: Pic c18 - Hitech c

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

Page 22: Pic c18 - Hitech 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:

Page 23: Pic c18 - Hitech c

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.

Page 24: Pic c18 - Hitech c

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

Page 25: Pic c18 - Hitech 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;

Page 26: Pic c18 - Hitech c

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;

Page 27: Pic c18 - Hitech c

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ố

Page 28: Pic c18 - Hitech c

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

Page 29: Pic c18 - Hitech c

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

Page 30: Pic c18 - Hitech c

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

Page 31: Pic c18 - Hitech c

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)

Page 32: Pic c18 - Hitech c

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

{. . . }

Page 33: Pic c18 - Hitech c

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.

Page 34: Pic c18 - Hitech c

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ẽ

Page 35: Pic c18 - Hitech c

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)

Page 36: Pic c18 - Hitech c

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:

Page 37: Pic c18 - Hitech c

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)

Page 38: Pic c18 - Hitech c

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.

Page 39: Pic c18 - Hitech c

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

Page 40: Pic c18 - Hitech c

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.

Page 41: Pic c18 - Hitech c

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:

Page 42: Pic c18 - Hitech c

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.

Page 43: Pic c18 - Hitech c

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

Page 44: Pic c18 - Hitech c

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.

Page 45: Pic c18 - Hitech c

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.

Page 46: Pic c18 - Hitech c

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

Page 47: Pic c18 - Hitech c

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.

Page 48: Pic c18 - Hitech c

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

Page 49: Pic c18 - Hitech c

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

Page 50: Pic c18 - Hitech c

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

}

Page 51: Pic c18 - Hitech c

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

Page 52: Pic c18 - Hitech c

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.

Page 53: Pic c18 - Hitech c

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

Page 54: Pic c18 - Hitech c

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.

Page 55: Pic c18 - Hitech c

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

Page 56: Pic c18 - Hitech c

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

Page 57: Pic c18 - Hitech c

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

Page 58: Pic c18 - Hitech c

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

Page 59: Pic c18 - Hitech c

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

Page 60: Pic c18 - Hitech c

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.

Page 61: Pic c18 - Hitech c

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.

Page 62: Pic c18 - Hitech c

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

Page 63: Pic c18 - Hitech c

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

Page 64: Pic c18 - Hitech c

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:

Page 65: Pic c18 - Hitech 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

Page 66: Pic c18 - Hitech c

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.

Page 67: Pic c18 - Hitech c

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

Page 68: Pic c18 - Hitech c

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

}

Page 69: Pic c18 - Hitech c

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

}

Page 70: Pic c18 - Hitech c

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

[email protected]

www.biglab.edu.vn

Page 71: Pic c18 - Hitech c

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

[email protected]

www.biglab.edu.vn

ương tác thanh ghi trực tiếp

t thời gian. Vì thế cho

Page 72: Pic c18 - Hitech c

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

Page 73: Pic c18 - Hitech c

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

Page 74: Pic c18 - Hitech c

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

Page 75: Pic c18 - Hitech c

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:

Page 76: Pic c18 - Hitech c

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:

Page 77: Pic c18 - Hitech c

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

Page 78: Pic c18 - Hitech c

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)

Page 79: Pic c18 - Hitech c

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)

Page 80: Pic c18 - Hitech c

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.

Page 81: Pic c18 - Hitech c

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

Page 82: Pic c18 - Hitech c

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:

Page 83: Pic c18 - Hitech c

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

Page 84: Pic c18 - Hitech c

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

Page 85: Pic c18 - Hitech c

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.

Page 86: Pic c18 - Hitech c

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

Page 87: Pic c18 - Hitech c

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

Page 88: Pic c18 - Hitech c

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

Page 89: Pic c18 - Hitech c

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.

Page 90: Pic c18 - Hitech c

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

Page 91: Pic c18 - Hitech c

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.

Page 92: Pic c18 - Hitech c

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.

Page 93: Pic c18 - Hitech c

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.

Page 94: Pic c18 - Hitech c

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.

Page 95: Pic c18 - Hitech c

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:

Page 96: Pic c18 - Hitech c

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

Page 97: Pic c18 - Hitech c

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.

Page 98: Pic c18 - Hitech c

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

Page 99: Pic c18 - Hitech c

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)