1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Đề cương thiết kế hệ thống nhúng

71 199 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 71
Dung lượng 2,46 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Tuy nhiên điều này chỉ có ý nghĩa khi tốc độ xử lý của CPU phải rất cao, vì với cấu trúc đó, trong cùng một thời điểm CPU chỉ có thể tương tác với bộ nhớ dữ liệu hoặc bộ nhớ chương trình

Trang 1

MỤC LỤC

MỤC LỤC 1

DANH MỤC HÌNH VẼ 4

Bài 1 5

TỔNG QUAN VỀ VI ĐIỀU KHIỂN PIC 5

1.1 Giới thiệu tổng quan về Pic 5

1.2 Kiến trúc Pic 6

1.2.1 Cấu trúc của PIC 6

1.2.2 RISC và CISC 7

1.3 Vi điều khiển PIC 16F877A 7

1.3.1 Sơ đồ chân và kiểu đóng vỏ 7

1.3.2 Sơ đồi khối 9

1.3.3 Một số đặc điểm 9

1.3.4 So sánh với vi điều khiển họ 8051 10

Bài 2 11

TỔNG QUAN VỀ LẬP TRÌNH NHÚNG TRÊN PIC 11

2.1 Ngôn ngữ lập trình và trình biên dịch 11

2.1.1 Trên hệ điều hành window 11

2.1.2 Trên hệ điều hành Linux 12

2.1.3 Các mạch nạp và mạch gỡ rối chương trình 12

2.2 Lập trình PIC với CCS 15

2.2.1 Tổng quan về CCS 15

2.2.2 Tạo PROJECT đầu tiên trong CCS 16

2.3 Biến, hàm, cấu trúc lệnh và các chỉ thị tiền xử lý 23

2.3.1 Biến, hằng, hàm và cấu trúc lệnh 23

2.4 Mẫu chương trình cho lập trình CCS 26

Bài 3 29

LẬP TRÌNH VÀO RA SỐ 29

3.1 Các hàm xử lý bit và các phép toán 29

3.1.1 Hàm Shift_left, Shift_right 29

3.1.2 Hàm Bit_set, Bit_clear 29

3.1.3 Hàm Bit_test 29

3.1.4 Hàm Swap 30

3.1.5 Hàm Make8 30

3.1.6 Hàm Make16 30

3.1.7 Make32 30

3.2 Các hàm vào ra 31

3.2.1 Output_low (pin), Output_high (pin) 31

3.2.2 Output_bit (pin, value) 31

3.2.3 Input (pin) 32

3.2.4 Output_X (value) 32

3.2.5 Input_X () 32

Trang 2

3.2.6 Port_B_pullups 32

3.2.7 Set_tris_X (value) 32

3.3 Lập trình vào ra với led đơn, led 7 thanh và bàn phím 33

Bài 4 34

THỰC HÀNH: LẬP TRÌNH VÀO RA SỐ 34

Bài 5 34

LẬP TRÌNH VÀO RA TƯƠNG TỰ 34

5.1 Bộ chuyển đổi ADC và DAC 34

5.1.1 Tổng quan 34

5.1.2 Độ phân giải 35

5.1.3 Điện áp tham chiếu 36

5.2 Bộ chuyển đổi ADC trong PIC 36

5.2.1 ADC trong PIC 16F877A 37

5.2.2 Cấu hình bộ ADC trong CCS 39

5.2.3 Lập trình ứng dụng 42

Bài 6 44

THỰC HÀNH: LẬP TRÌNH VÀO RA TƯƠNG TỰ 44

Bài 7 44

LẬP TRÌNH VÀ XỬ LÝ NGẮT 44

7.1 Tổng quan về ngắt trong PIC 16F877A 44

7.2 Khai báo và sử dụng ngắt trong CCS 45

7.3 Ngắt do sự thay đổi trạng thái của các chân trong PORTB 48

7.4 Chế độ Sleep 50

7.5 Watch Dog Timer 50

7.6 “Đánh thức” vi điều khiển 51

Bài 8 53

THẢO LUẬN LẬP TRÌNH XỬ LÝ NGẮT 53

Bài 9 53

THỰC HÀNH: LẬP TRÌNH NGẮT 53

Bài 10 53

TIMER TRONG PIC 16F877A 53

10.1 Timer 0 53

10.2 Timer 1 55

10.3 Timer 2 56

10.4 Khai báo Timer trong CCS 57

10.4.1 Các lệnh Timer0 57

10.4.2 Các lệnh Timer1 59

10.4.3 Các lệnh Timer2 59

10.5 Lập trình ứng dụng 60

Bài 11 61

THỰC HÀNH: LẬP TRÌNH TIMER/COUNTER 61

Bài 12 62

THẢO LUẬN VỀ TIMER/COUNTER 62

Bài 13 62

Trang 3

THỰC HÀNH: LẬP TRÌNH TIMER/COUNTER (TIẾP) 62

Bài 14 62

LẬP TRÌNH TRUYỀN THÔNG 62

14.1 Tổng quan về lập trình truyền thông 62

14.2 Chuẩn RS232 62

14.3 Lập trình ứng dụng 66

Bài 15 67

THỰC HÀNH: LẬP TRÌNH TRUYỀN THÔNG 67

Bài 16 68

LẬP TRÌNH TRUYỀN THÔNG (tiếp) 68

16.1 Chuẩn I2C 68

16.2 Lập trình ứng dụng 69

Bài 17: 70

THỰC HÀNH: LẬP TRÌNH TRUYỀN THÔNG (TIẾP) 70

Bài 18: 70

THẢO LUẬN VỀ LẬP TRÌNH TRUYỀN THÔNG 70

Bài 19 70

LẬP TRÌNH NÂNG CAO 70

19.1 GLCD 70

19.2 Thẻ nhớ 70

19.3 Ethernet 70

Bài 20: 70

THỰC HÀNH: LẬP TRÌNH NÂNG CAO 70

Bài 21: 70

BÀI TẬP, THẢO LUẬN TỔNG KẾT 70

TÀI LIỆU THAM KHẢO 71

Trang 4

DANH MỤC HÌNH VẼ

Hình 1: Kiến truc Harvard và Von-Neumann 6

Hình 2: Một số sơ đồ chân và kiểu đóng vỏ cho PIC 16F87XA 8

Hình 3: Sơ đồ khối của vi điều khiển PIC 16F877A 9

Hình 4: Trình biên dịch MPASM trên 11

Hình 5: Mạch nạp PIC Kit 2 và PIC Kit 3 13

Hình 6: MPLAB ICD3 - Công cụ nạp và gỡ rối 14

Hình 7: MPLAB REAL ICE – In Circuit Emulator 15

Hình 8: Giao diện PICC 16

Hình 9: Cửa sổ Save As 17

Hình 10: Tab General 18

Hình 11: Tab Communications 18

Hình 12: Tab SPI andLCD 19

Hình 13: Tab Timer 20

Hình 14: Tab Analog 20

Hình 15: Tab Other 21

Hình 16: Tab Interrupts 22

Hình 17: Tab Driver 22

Hình 18: Mạch flash ADC với 4 bộ so sánh 35

Hình 19: Minh họa tín hiệu Analog và digital của hàm sin 36

Hình 20: Sơ đồ khối bộ chuyển đổi ADC 38

Hình 21: Các cách lưu kết quả chuyển đổi ADC 38

Hình 22: Sơ đồ kết nối với vi điều khiển PIC 16F877 42

Hình 23: Sơ đồ logic của các ngắt trong PIC 16F877A 45

Hình 24: Ghép nối điều khiển LED đơn 46

Hình 25: Sơ đồ ghép nối xử lý ngoài trên PortB 49

Hình 26: Sơ đồ khối của bộ Timer0 54

Hình 27: Sơ đồ khối của Timer1 55

Hình 28: Sơ đồ khối Timer2 57

Hình 29: Sơ đồ mạch ví dụ dùng Timer0 60

Hình 30: Hình ảnh giao diện DB9 và DB25 63

Hình 31: Sơ đồ chân trên giao diện DB9 và DB25 63

Hình 32: Sơ đồ khối các vi mạch MAX232, MAX233 66

Hình 33: Sơ đồ ghép nối thiết bị chuẩn I2C 68

Trang 5

ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN

PIC sử dụng tập lệnh RISC (Reduced Instructions Set Computer), với dòng PIC low-end (độ dài mã lệnh 12 bit, ví dụ: PIC12Cxxx) và mid-range (độ dài

mã lệnh 14 bit, ví dụ: PIC16Fxxxx), tập lệnh bao gồm khoảng 35 lệnh, và 70 lệnh đối với các dòng PIC high-end (độ dài mã lệnh 16 bit, ví dụ: PIC18Fxxxx) Tập lệnh bao gồm các lệnh tính toán trên các thanh ghi, với các hằng số, hoặc các vị trí

bộ nhớ, cũng như có các lệnh điều kiện, lệnh nhảy/gọi hàm, và các lệnh để quay trở

về, nó cũng có các tính năng phần cứng khác như ngắt hoặc sleep (chế độ hoạt động tiết kiện điện) Microchip cung cấp môi trường lập trình MPLAB, nó bao gồm phần mềm mô phỏng và trình dịch ASM

Các dòng Pic hiện nay được phân chia theo các loại:

- Vi điều khiển 8 bit: Pic10xxxx, Pic 12xxxx, Pic 14xxxx, Pic 16xxxx, Pic 17xxxx, Pic 18xxxx

- Vi điều khiển 16 bit: Điển hình ở đây là Pic 24, dsPIC30, dsPIC33F

- Vi điều khiển 32 bit: PIC 32

Hiện nay có khá nhiều dòng PIC và có rất nhiều khác biệt về phần cứng, nhưng chúng ta có thể điểm qua một vài nét như sau:

- FLASH và ROM có thể tuỳ chọn tùy theo từng loại chip

- Các cổng Xuất/Nhập (I/O ports) (mức logic thường từ 0V đến 5 5V, ứng với logic 0 và logic 1)

- 8/16 Bit Timer

- Các chuẩn giao Tiếp Ngoại Vi Nối Tiếp Đồng bộ/Không đồng

bộ USART, AUSART, EUSARTs

- Bộ chuyển đổi ADC Analog-to-Digital Converters, 8, 10/12 bit

- Bộ so sánh điện áp (Voltage Comparators)

- Các module Capture/Compare/PWM

- MSSP Peripheral dùng cho các giao tiếp I2C, SPI, và I²S

Trang 6

- Bộ nhớ nội EEPROM - có thể ghi/xoá lên tới 1 triệu lần

- FLASH (dùng cho bộ nhớ chương trình) có thể ghi/xóa 10 000 lần (tiêu chuẩn)

- Hỗ trợ giao tiếp USB

- Hỗ trợ điều khiển Ethernet

- Hỗ trợ giao tiếp CAN

- Một số dòng có tích hợp bộ RF (PIC16F639, và rfPIC)

- DSP những tính năng xử lý tín hiệu số (dsPIC)

1.2 Kiến trúc Pic

1.2.1 Cấu trúc của PIC

Cấu trúc phần cứng của một vi điều khiển được thiết kế theo hai dạng kiến trúc:

Kiến trúc Von Neuman và kiến trúc Harvard

Hình 1: Kiến truc Harvard và Von-Neumann

Tổ chức phần cứng của Pic được thiết kế theo kiến trúc Harvard Điểm khác biệt giữa kiến trúc Harvard và kiến trúc Von-Neumann là cấu trúc bộ nhớ dữ liệu và bộ nhớ chương trình

Đối với kiến trúc Von-Neumann, bộ nhớ dữ liệu và bộ nhớ chương trình nằm chung trong một bộ nhớ, do đó ta có thể tổ chức, cân đối một cách linh hoạt bộ nhớ chương trình và bộ nhớ dữ liệu Tuy nhiên điều này chỉ có ý nghĩa khi tốc độ xử lý của CPU phải rất cao, vì với cấu trúc đó, trong cùng một thời điểm CPU chỉ có thể tương tác với bộ nhớ dữ liệu hoặc bộ nhớ chương trình Như vậy có thể nói kiến trúc Von-Neumann không thích hợp với cấu trúc của một vi điều khiển

Đối với kiến truc Harvard, bộ nhớ dữ liệu và bộ nhớ chương trình tách ra thành hai bộ nhớ riêng biệt Do đó trong cùng một thời điểm CPU có thể tương tác với cả hai bộ nhớ, như vậy tốc độ xử lý của vi điều khiển được cải thiện đáng kể

Một điểm cần lưu ý nữa là tập lệnh trong kiến trúc Harvard có thể được tối ưu theo yêu cầu kiến trúc của vi điều mà không phụ thuộc vào cấu trúc dữ liệu Ví dụ, đối với vi điều khiển dòng 16F, độ dài lện luôn là 14 bit (trong khi dữ liệu được tổ

Trang 7

chức thành từng byte), còn đối với kiến truc Von-Neumann, độ dài lệnh luôn là bội

số của 1 byte (do dữ liệu được tổ chức thành từng byte)

dữ liệu, giúp tăng tốc độ xử lý của vi điều khiển lên gấp đôi Đồng thời cấu trúc lệnh không còn phụ thuộc vào cấu trúc dữ liệu nữa mà có thể linh động điều chỉnh tùy theo khả năng và tốc độ của từng vi điều khiển Và để cải thiện tốc độ thực thi lệnh, tập lệnh của họ vi điều khiển PIC được thiết kế sao cho chiều dài mã lệnh luôn

cố định (ví dụ với họ 16Fxxxx chiều dài mã lệnh luôn là 14 bit) và cho phép thực thi lệnh trong một chu kỳ xung clock (ngoại trừ một số trường hợp đặc biệt như lệnh nhảy, gọi chương trình con… cần hai chu kỳ xung đồng hồ) Điều này có nghĩa tập lệnh của vi điều khiển thuộc cấu trúc Harvard sẽ ít lệnh hơn, đơn giản hơn và ngắn hơn để đáp ứng yêu cầu mà mã hóa lệnh bằng một lượng bit nhất định

Vi điều khiển được tổ chức theo kiến trúc Harvard còn gọi là vi điều khiển RISC (Reduced Instructions Set Computer) hay vi điều khiển có tập lệnh rút gọn Vi điều khiển được thiết kế theo kiến trúc Von-Neumann còn được gọi là vi điều khiển CISC (Complex Instructions Set Computer) hay vi điều khiển có tập lệnh phức tạp

vì mã lệnh của nó không phải là một số cố định mà luôn là bội số của 8 bit

1.3 Vi điều khiển PIC 16F877A

1.3.1 Sơ đồ chân và kiểu đóng vỏ

Trang 8

Hình 2: Một số sơ đồ chân và kiểu đóng vỏ cho PIC 16F87XA

Hình 2 trình bày sơ đồ chân và kiểu đóng vỏ của Pic16F87XA Trong đó:

- Kiểu đóng vỏ 40-Pin PDIP: Pic16F87XA được đóng trong một vỏ có 44 chân, kích thước lớn, chân cắm hàn trên mạch, thích hợp lắp đặt cho các mạch có kích thước linh kiện lớn

- Kiểu đóng vỏ 44-Pin PLCC: là kiểu đóng vỏ kích thước IC nhỏ, có 4 hàng chân xung quanh, chân ngắn, thích hợp cho lắp mạch với linh kiện dán

- Kiểu đóng vỏ 44-Pin TQFP: gần tương tự kiểu đóng vỏ 44-Pin PLCC với kích thước chân dài hơn, dùng trên các mạch lắp linh kiện dán

Mặc dù được đóng vỏ khác nhau (kích thước lớn/nhỏ chênh lệch nhiều) song tính năng, khả năng hoạt động của Pic vẫn không thay đổi

Trang 9

1.3.2 Sơ đồi khối

Hình 3: Sơ đồ khối của vi điều khiển PIC 16F877A

Các đặc tính ngoại vi bao gồm các khối chức năng sau:

Trang 10

- Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit

- Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep

- Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler

- Hai bộ Capture/so sánh/điều chế độ rông xung

- Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C

- Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ

- Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD, WR, CS ở bên ngoài

- Các đặc tính Analog: 8 kênh chuyển đổi ADC 10 bit

- Hai bộ so sánh

Bên cạnh đó là một vài đặc tính khác của vi điều khiển như:

- Bộ nhớ flash với khả năng ghi xóa được 100 000 lần

- Bộ nhớ EEPROM với khả năng ghi xóa được 1 000 000 lần

- Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm

- Khả năng tự nạp chương trình với sự điều khiển của phần mềm

- Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial Programming)

- Watchdog Timer với bộ dao động trong

- Chức năng bảo mật mã chương trình

- Chế độ Sleep

- Có thể hoạt động với nhiều dạng Oscillator khác nhau

1.3.4 So sánh với vi điều khiển họ 8051

Trang 11

Khi không sử dụng trình soạn thảo chuyên dụng trong PIC, chúng ta hoàn toàn

có thể sử dụng Notepad hoặc Notepad Plus, để soạn thảo chương trình và sau đó trực tiếp chạy MPASMWIN exe để biên dịch

Hình 4: Trình biên dịch MPASM trên

- Trình soạn thảo: MPLAB IDE

- Trình biên dịch: C18 (dành cho PIC 18), C30 (dành cho PIC 24, dsPIC), C32 (dành cho PIC 32)

- Ngôn ngữ lập trình: C

Trang 12

- MPLAB C không hỗ trợ cho PIC 10/12/16 do đó đây là một lựa chọn phù hợp cho những dòng PIC cao hơn Tuy nhiên nếu muốn sử dụng trình hợp ngữ thì MPLAB cũng có thể giúp chúng ta thực hiện

e) Mikro Elektronika

- Trình soạn thảo: MikroE IDE

- Trình biên dịch: MikroC (ngôn ngữ C), MikroPascal (ngôn ngữ Pascal), MikroBasic (ngôn ngữ Basic)

f) SourceBoost

- Trình soạn thảo: SourceBoost IDE

- Trình biên dịch: Boost C (ngôn ngữ C), Boost C++ (ngôn ngữ C++), BoostBasic (ngôn ngữ Basic), Novo RTOS (hệ điều hành), Flowcode (ngôn ngữ flowchart)

- Đây là phần mềm được phát triển mạnh với nhiều ngôn ngữ lập trình khác nhau, đặc biệt là đây là phần mềm đầu tiên trong việc phát triển PIC trên nền tảng hướng đối tượng C++

2.1.2 Trên hệ điều hành Linux

2.1.3 Các mạch nạp và mạch gỡ rối chương trình

Nếu một vi điều khiển mà không có chương trình nằm bên trong nó (firmware) thì nó chưa thể thực hiện được một chức năng nào cả Do đó, mạch nạp là một phần

Trang 13

không thể thiếu khi chúng tra nghiên cứu và sử dụng với vi điều khiển nói chung và với PIC nói riêng

Có rất nhiều mạch nạp trên thị trường thế giới cũng như Việt Nam Tuy nhiên chúng ta có thể phân loại theo đối tượng sử dụng như sau:

Mạch nạp và gỡ rối dành cho sinh viên: Loại này giá rẻ, chức năng tương đối

bị hạn chế, và chủ yểu chỉ đảm nhiệm chức năng nạp chương trình (firmware) Hiện nay mạch nạp dành cho sinh viên rất phong phú, đặc biệt với mục tiêu hạ giá thành sản phẩm tới mức tối đa Điển hình là một số mạch nạp sau:

- Mạch nạp PICKit 2, PICKit 3 của microchip

Tính năng: Nạp hầu hết các dòng sản phẩm Microchip PIC/dsPIC, hỗ trợ Programmer Go (Không cần sử dụng máy tính, nạp chương trình vào PICKit, sau

đó cấp nguồn và bấm nút để nạp vào PIC), cấp nguồn từ USB

Giá thành: Từ 30$ đến 50$

Hình 5: Mạch nạp PIC Kit 2 và PIC Kit 3

- Mạch gỡ rồi ICD2 LE (phiên bản giới hạn)

Tính năng: nạp và debug hầu hết các dòng Microchip/dsPIC, không hỗ trợ nguồn từ ICDE LE Bề ngoài nhìn giống PICKit 2 nhưng có màu xanh dương Do đây là phiên bản giới hạn (limited Edition) nên sản phẩm không được phổ biến lắm Giá thành: Từ 60$ đến 80$

- Mạch nạp PK2FUN của R&P

Tính năng: giống với PICKit 2, nhưng bỏ đi 2 tính năng chính là tính năng

Programmer To Go và tính năng cấp nguồn từ USB

Giá thành: Khoảng 10$

Trang 14

- Mạch nạp Gusb của PduyTech

Tính năng: Đây là một mạch phát triển từ mạch GTP-USB, sử dụng với chương trình nạp WinPIC800 Tuy nhiên, sau đó Pduytech đã phát triển lại phần mềm và phát triển khá tốt

Giá thành: Khoảng 10$

Mạch nạp, gỡ rối dành cho nhà thiết kế: Loại này trong bị nhiều tính năng hơn,

chủ yếu tập trung vào tính năng gỡ rối và mô phỏng Đây là phiên bản trả phí, với các nhà thiết kế ở Việt Nam thường chấp nhận bỏ qua tính năng mô phỏng (Emulator) mà chỉ dừng ở tính năng gỡ rồi (debugger) nhằm giảm chi phí trang thiết bị

Một số sản phẩm tiểu biểu:

- ICD3 – In Circuit Debugger 3

Tính năng: Là một phiên bản cải tiến từ ICD2, tuy nhiên hiện nay ICD2 không còn sản xuất nữa, ICD3 tăng tốc độ nạp chip đáng kế

Giá thành: Khoảng 200$

Hình 6: MPLAB ICD3 - Công cụ nạp và gỡ rối

- REAL ICE – In Circuit Emulator

Tính năng: Mô phỏng trực tiếp trên mạch, chủ yếu sử dụng cho các mạch nạp phức tạp, thuật toán phức tạp

Giá thành: Khoảng 550$

Trang 15

Hình 7: MPLAB REAL ICE – In Circuit Emulator

Mạch nạp dành cho nhà sản xuất: Chỉ tập trung vào tính năng duy nhất là tính

năng nạp, điều quan trong nhất là phải nạp nhanh, thao tác đơn gian, bền vữ và đảm bảo cho công nhân kỹ thuật có thể sử dụng

Vấn đề chính của các nhà sản xuất chính là số giữa tốc độ nạp chip và số lượng nhân công Một bài toán rất rõ ràng như sau: nếu khi nhà sản xuất lên tới khoảng

100000 sản phẩm mỗi năm, việc nạp chip trở thành một vấn đề lớn Giải phải bắt buộc là phải nạp cùng lúc nhiều sản phẩm, vì thời gian nạp để cho chop gần như là khó có thể giam, tùy theo dung lượng của chip và kích thước firmware

Các loại mạch trên thị trường hiện nay cho phép nạp cúng lúc từ 4 đến 32 chip điển hình một số loại như sau:

‐ PCB cho dòng PIC 12‐bit opcodes

‐ PCM cho dòng PIC 14‐bit opcodes

Trang 16

‐ PCH cho dòng PIC 16và 18‐bit

Tất cả 3 trình biên dich này đuợc tích hợp lại vào trong một chương trình bao gồm cả trình soạn thảo và biên dịch là CCS

Giống như nhiều trình biên dịch C khác cho PIC, CCS giúp cho người sử dụng nắm bắt nhanh được vi điều khiển PIC và sử dụng PIC trong các dự án Các chương trình diều khiển sẽ được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc

sử dụng ngôn ngữ lập trình cấp cao – ngôn ngữ C

2.2.2 Tạo PROJECT đầu tiên trong CCS

Để tạo một Project trong CCS có nhiều cách, có thể dùng ProjectWizard, ManualCreat, hay đơn giản là tạo một Files mới và thêm vào đó các khai báo ban đầu cần thiết và“bắt buộc”

Dưới đây sẽ trình bày cách tạo một project hợp lệ theo cả 3 phương pháp Một điều ta cần chú ý khi tạo một Project đó là: khi tạo bắt cứ một Project nào mới thì ta nên tạo một thư mục mới với tên liên quan đến Project ta định làm, rồi lưu các files vào đó Khi lập trình và biên dịch, CCS sẽ tạo ra rất nhiều files khác nhau, do đó nếu để chung các Project trong một thư mục sẽ rất mất thời gian trongviệc tìm kiếm sau này Đây cũng là quy tắc chung khi ta làm việc với bất kỳ phần mềm nào, thiết

kế mạch hay lập trình

Việc đầu tiên bạn cần làm là khởi động máy tính và bật chương trình PIC C Compiler

Tạo một PROJECT sử dụng PIC Wizard

Trước chết bạn khởi động chương trình làm việc PICC Compiler Từ giao diện

chương trình bạn di chuột chọn Project ‐> New‐>PIC Wizard nhấn nút trái chuột

để chọn

Hình 8: Giao diện PICC

Sau khi nhấn chuột, một cửa sổ hiện ra yêu cầu ban nhập tên Files cần tạo Bạn tạo một thư mục mới, vào thư mục đó và lưu tên files cần tạo tại đây

Trang 17

Hình 9 : Cửa sổ Save As

Như vậy là xong bước đầu tiên Sau khi nhấn nút Save, một cửa sổ NewProject

hiện ra Trong của sổ này bao gồm rất nhiều Tab, mỗi Tab mô tả về một vài tính năng của con PIC Ta sẽ chọn tính năng sử dụng tại các Tab tương ứng

Dưới đây sẽ trình bày ý nghĩa từng mục chọn trong mỗi Tab Các mục chọn này chính là đề cập đến các tính năng của một con PIC, tùy theo từng loại mà sẽ có các Tab tương ứng Đối với từng dự án khác nhau, khi ta cần sử dụng tính năng nào của con PIC thì ta sẽ chọn mục đó Tổng cộng có 13 Tab để ta lưa chọn, ta sẽ đi vào một

số tab hay sử dụng

a) Tab General

Tab General cho phép ta lựa chọn loại PIC mà ta sử dụng và một số lựa chọn khác như chọn tần số thạch anh dao động, thiết lập các bit CONFIG nhằm thiết lập chế độ hoạt động cho PIC (hình dưới)

- Device: Liệt kê danh sách các loại PIC12F, 16F, 18F…Ta sẽ chọn tên Vi

điều khiển PIC mà ta sử dụng trong dự án Lấy ví dụ chọn PIC16F877A

- Oscilator Frequency: Tần số thạch anh ta sử dụng, chọn 20 MHz (tùy

từng loại)

- Fuses: Thiết lập các bit Config như: Chế độ dao động (HS, RC, Internal),

chế độ bảovệ Code, Brownoutdetected…

- Chọn kiểu con trỏ RAM là 16bit hay 8bit

Trang 18

Hình 10 : Tab General

b) Tab Communications

Tab Communications liệt kê các giao tiếp nối tiếp mà một con PIC hỗ trợ, thường là RS232 và I2C, cùng với các lựa chọn để thiết lập chế độ hoạt động cho từngloại giao tiếp

c) Giao tiếpRS232

Mỗi một Vi điều khiển PIC hỗ trợ một cổng truyền thông RS232 chuẩn Tab này cho phép ta lựa chọn chân Rx, Tx, tốc độ Baud, Data bit, Bit Parity…

Hình 11 : Tab Communications

Trang 19

d) Giao tiếp I2C

Để sử dụng I2C ta tích vào nút chọn Use I2C, khi đó ta có các lựa chọn: Chân SDA, SCL, tốc độ truyền (Fast- Slow), chế độ Master hay Slave, địa chỉ cho Salve

e) Tab SPI and LCD

Tab này liệt kê cho người dùng các lựa chọn đối với giao tiếp nối tiếp SPI, chuẩn giao tiếp tốc độ cao mà PIC hỗ trợ về phầncứng Chú ý khi ta dùng I2C thì không thể dùng SPI và ngược lại Để có thể sử dụng cả hai giao tiếp này cùng một lúc thì buộc một trong 2 giao tiếp phải lập trình bằng phần mềm (giồng như khi dùng I2C cho các chip AT8051, không có hỗ trợ phần cứng SSP)

Phần cấuhình choLCD dành cho các chip dòng 18F và 30F

Hình 12 : Tab SPI andLCD

Trang 20

Hình 13 : Tab Timer

g) Tab Analog

Liệt kê các lựa chọn cho bộ chuyển đổi tương tự/số (ADC) của PIC Tùy vàotừng IC cụthể mà cócáclựa chọn khácnhau, bao gồm:

Lựa chọn cổng vào tương tự

Chọn chânđiện áp lấymẫu (Vref)

Chọn độ phângiải:8bit = 0~ 255 hay10bit = 0~1023

Nguồn xung đồng hồ cho bộ ADC (trong hay ngoài), từ đó mà ta có được tốc độ

lấy mẫu, thường ta chọn là internal2-6 us

Khi khôngsử dụng bộ ADC ta chọn none

Hình 14 : Tab Analog

Trang 21

- Thực hiệnngắt nhưng không thay đổi trạng thái của chân PIC

- Đưa Timer1 về 0 nhưng không thay đổi trạng thái chân

PWM - Điều chế độ rộng xung

Lựa chọn về tần số xung ra và dutycycle Ta có thể lựa chọn sẵn hay tự chọn tần

số, tất nhiên tần số ra phải nằm trong một khoảng nhất định

Comparator - So sánh

Lựa chọn mức điện áp so sánhVref Có rất nhiều mức điện áp để ta lựa chọn Ngoài ra ta còn có thể lựa chọn cho đầu vào của các bộ so sánh

Hình 15: Tab Other

Trang 22

i) Tab Interrupts và Tab Driver

TabInterrupts cho phép ta lựa chọn nguồn ngắt mà ta muốn sử dụng Tùy vào

từng loại PIC mà số lượng nguồn ngắt khác nhau, bao gồm: ngắt ngoài 0 (INT0), ngắt RS232, ngắt Timer, ngắt I2C‐SPI, ngắt onchange PORTB v v…

TabDrivers được dùng để lựa chọn những ngoại vi mà trình dịch đã hỗ trợ các

hàm giao tiếp Đây là nhưng ngoại vi mà ta sẽ kết nối với PIC, trong các IC mà CCS hỗ trợ, đáng chú ý là các loại EEPROM như 2404, 2416, 2432, 9346, 9356…Ngoài ra còn có IC RAM PCF8570, IC thời gian thực DS1302, Keypad3x4,

LCD, ADC…Chi tiết ta có thể xem trong thư mục Driver của chươngtrình: \

\PICC\Drivers

Hình 16: Tab Interrupts

Hình 17: Tab Driver

Trang 23

Sau các bước chọn trên, ta nhấn OK để kết thúc quá trình tạo một Project trong

CCS, một File ten_project c được tạo ra, chứa những khai báo cần thiết cho PIC trong một Files ten_project h

2.3 Biến, hàm, cấu trúc lệnh và các chỉ thị tiền xử lý

Ví du: #include <16F877 H> // Chương trình sử dụng vđk 16F877

id (0 / 1) sẽ thay đổi giá trị bit tương ứng y do đó thay đổi trị x

Trang 24

Gán tên biến id cho địa chỉ (thanh ghi) x, sau đó muốn gán hay kiểm tra địa chỉ

x chỉ cần dùng id Không tốn thêm bộ nhớ, tên id thường dùng tên gợi nhớ chức năng thanh ghi ở địa chỉ đó Lưu ý rằng giá trị thanh ghi có thể thay đổi bất kỳ lúc nào do hoạt động chương trình nên giá trị id cũng tự thay đổi theo giá trị thanh ghi

đó Không nên dùng id cho thanh ghi đa mục đích như 1 cách dùng biến int8 vì CCS có thể dùng các thanh ghi này bất kỳ lúc nào cho chương trình, nếu muốn dùng riêng, hãy dùng #LOCATE

VD:

#byte port_b = 0xc6; // 16F877:0xc6 là địa chỉ portb

Muốn port b có giá trị 120 thì: port_b=120;

Cú pháp: #DEVICE chip option

chip: tên VĐK sử dụng, không dùng tham số này nếu đã khai báo tên chip ở # include

option: toán tử tiêu chuẩn theo từng chip:

* = 5 dùng pointer 5 bit (tất cả PIC)

* = 8 dùng pointer 8 bit (PIC14 và PIC18)

* = 16 dùng pointer 16 bit (PIC14, PIC 18)

ADC = x sử dụng ADC x bit (8, 10, bit tuỳ chip), khi dùng hàm read_adc (),

sẽ trả về giá trị x bit

ICD = true: tạo mã tương thích debug phần cứng Microchip

HIGH_INTS = TRUE : cho phép dùng ngắt ưu tiên cao

- Khai báo pointer 8 bit, bạn sử dụng được tối đa 256 byte RAM cho tất cả biến chương trình

- Khai báo pointer 16 bit, bạn sử dụng được hết số RAM có của VDK

- Chỉ nên dùng duy nhất 1 khai báo #device cho cả pointer và ADC

Trang 25

#org start, end { }

Start, end: bắt đầu và kết thúc vùng ROM dành riêng cho hàm theo sau, hoặc để riêng không dùng

#USE delay (clock = speed)

Speed: giá trị OSC mà bạn dùng VD: dùng thạch anh dao động 40Mhz thì: #use delay (clock = 40000000)

Chỉ khi có chỉ thị này thì trong chương trình bạn mới được dùng hàm delay_us () và delay_ms ()

#USE fast_io (port)

Port: là tên port:từ A-G (tuỳ chip)

Dùng cái này thì trong chương trình khi dùng các lệnh io như output_low (), …

nó sẽ set chỉ với 1 lệnh, nhanh hơn so với khi không dùng chỉ thị này

Trong hàm main () bạn phải dùng hàm set_tris_x () để chỉ rõ chân vào ra thì chỉ thị trên mới có hiệu lực, không thì chương trình sẽ chạy sai

Không cần dùng nếu không có yêu cầu gì đặc biệt

VD: # use fast_io (A)

#USE I2C (options) - thiết lập giao tiếp I2C

Option bao gồm các thông số sau, cách nhau bởi dấu phẩy:

Trang 26

Master : chip ở chế độ master

Slave : chip ở chế độ slave

SCL = pin : chỉ định chân SCL

SDA = pin : chỉ định chân SDA

ADDRESS = x : chỉ định địa chỉ chế độ slave

FAST : chỉ định FAST I2C

SLOW : chỉ định SLOW I2C

RESTART_WDT: restart WDT trong khi chờ I2C_READ ()

FORCE_HW : sử dụng chúc năng phần cứng I2C (nếu chip hỗ trợ)

VD:

#use I2C (master, sda=pin_B0, scl = pin_B1)

#use I2C (slave, sda= pin_C4, scl= pin_C3, address = 0xa00, FORCE_HW)

#USE RS232 (options)

Thiết lập giao tiếp RS232 cho chip (có hiệu lực sau khi nạp chương trình cho chip, không phải giao tiếp RS232 đang sử dụng để nạp chip)

Option bao gồm:

BAUD = x : thiết lập tốc độ baud rate: 19200, 38400, 9600,

PARITY = x : x= N, E hay O, với N: không dùng bit chẵn lẻ

XMIT = pin : set chân transmit (chuyển data)

RCV = pin : set chân receive (nhận data)

- Các thông số trên là những thông hay dùng nhất, các tham số khác sẽ bổ sung sau

VD:

#use rs232 (baud=19200, parity=n, xmit=pin_C6, rcv=pin_C7)

2.4 Mẫu chương trình cho lập trình CCS

a) Mô tả một số nội dung tiền xử lý

#include16f877a h:Đikèmchươngtrìnhdịch, chứakhaibáovềcácthanhghitrong

mỗi con PIC, dùng cho việc cấuhình cho PIC

#include def_877a h: Files do người lập trình tạo ra, chứa khai báo về

cácthanhghitrongPICgiúpchoviêclậptrìnhđượcdễdanghơnvídụtacothểgánPORTB=0xAA (chi tiết files này sẽ trình bày trong phần dưới đây)

#device *=16 ADC = 10: Khai báo dùng con trỏ 8 hay 16 bit, bộ ADC là 8 hay

10 bit

#FUSES NOWDT, HS: Khai báovề cấu hình cho PIC

Trang 27

#use delay (clock=20000000) : Tần số thạch anh sử dụng

#use rs232 (baud=9600, …) : Khai báo cho giao tiếp nốitiếp RS232

#use i2c (master, SDA=PIN_C4, …) : Khai báo dùng I2C, chế độ hoạt động

#include <tên_file c>:Khai báo các files thư việnđược sử dụng vídụ

LCD_lib_4bit c

#INT_xxx: Khai báo địa chỉ chương trình phục vụ ngắt

Void tên_chương_trình (tên_biến) {}: Chương trình chínhhay chươngtrình con

b) Viết chương trình trong CCS

Đầu tiên là chỉ thị tiền xử lý # có nhiệm vụ báo cáo cho CCS cần sử dụng những gì trong chương trình: Dùng loại chip nào, dùng ADC hay không? Sử dụng thạch anh

Khai báo các biến

Chương trình con: Có hoặc không

Các hàm phục vụ ngắt theo sau bởi một tiền xử lý cho biết dùng ngắt nào: Nếu

sử dụng ngắt

Chương trình chính

Chương trình được thể hiện qua đoạn code sau:

#include<16F877 h>

#device PIC6f877*=16 ADC = 10

#use delay (clock = 20000000)

Trang 28

#use delay (clock=4000000) // su dung thach anh 20mhz

#use fast_io (b) // dung voi cac lenh nhu output_low nhanh hon binh thuong

#byte portb=0x06

#byte portd=0x08

int16 count;

int8 a;

// chuong trinh ngat ngat timer0

#int_timer0 // cho phep vao ngat timer0

set_tris_d (0) ; //cong B la cong xuat

enable_interrupts (int_timer0) ; //cho phep ngat timer0 hoat dong

setup_timer_0 (rtcc_internal|rtcc_div_2) ; //chon xung clock noi va chia tan enable_interrupts (global) ; //cho phep tat ca ngat hoat dong

Trang 29

Bài 3

LẬP TRÌNH VÀO RA SỐ 3.1 Các hàm xử lý bit và các phép toán

3.1.1 Hàm Shift_left, Shift_right

Cú pháp: Shift_right (address, byte, value)

Shift_left (address, byte, value)

Chức năng Dịch phải (trái) 1 bit vào 1 mảng hay 1 cấu trúc Địa chỉ có thể là địa chỉ mảng hay địa chỉ trỏ tới cấu trúc (kiểu như &data) Bit 0 byte thấp nhất là LSB

3.1.2 Hàm Bit_set, Bit_clear

Cú pháp: Bit_set (var, bit)

Dùng set=1 bit được chỉ định bởi vị trí bit trong biến var

Bit_clear (var, bit)

dùng xóa (set = 0) bit được chỉ định bởi vị trí bit trong biến var

var: biến 8, 16, 32 bit bất kỳ

bit: vị trí clear (set) : từ 0-7 (biến 8 bit), 0-15 (biến 16 bit), 0-31 (biến 32 bit) Hàm không trả về trị

- Cú pháp: Bit_test (var, bit)

- Tác dụng: Dùng kiểm tra vị trí bit trong biến var

- Hàm trả về 0 hay 1 là giá trị bit đó trong var

- var: biến 8, 16, 32 bit

- bit: vị trí bit trong var

Ví dụ:

Giả sử có biến x 32 bit đếm từ 0 lên và muốn kiểm tra xem nó có lớn hơn 4096 không (4096= 2^12 =1000000000000b) :

If (x >= 4096) // phép kiểm tra này mất ~5 us

Trong 1 vòng lặp, việc kiểm tra thường xuyên như vậy sẽ làm mất 1 thời gian đáng kể Để tối ưu, chỉ cần dùng:

if (bit_test (x, 12) ) : chỉ mất ~ 0 4 us (20 Mhz thạch anh)

Do đó việc kiểm tra đếm lên tới những giá trị đặc biệt (2^ i) thì dùng hàm này rất tiện lợi

Trang 30

3.1.4 Hàm Swap

- Cú pháp: Swap (var)

- var: biến 1 byte

- Hàm này đảo vị trí 4 bit trên với 4 bit dưới của var, tương đương var = (var>>4) | (var << 4)

- Cú pháp: Make8 (var, offset)

- Hàm này trích 1 byte từ biến var

- var: biến 8, 16, 32 bit

- offset: là vị trí của byte cần trích (0, 1, 2, 3)

- Cú pháp: Make16 (varhigh, varlow)

- Tác dung: Hàm trả về giá trị 16 bit kết hợp từ 2 biến 8 bit varhigh và varlow Byte cao là varhigh, thấp là varlow

3.1.7 Make32

- Cú pháp: Make32 (var1, var2, var3, var4)

- Trả về giá trị 32 bit kết hợp từ các giá trị 8 bit hay 16 bit từ var1 tới var4 Trong đó var2 đến var4 có thể có hoặc không Giá trị var1 sẽ là MSB, kế tiếp là var2, Nếu tổng số bit kết hợp ít hơn 32 bit thì 0 được thêm vào MSB cho đủ 32 bit

Trang 31

3.2.2 Output_bit (pin, value)

- Pin: tên chân của vi điều khiển

- value: có giá trị 0 hoặc 1

- Hàm này cũng xuất giá trị 0 / 1 trên pin, tương tự 2 hàm trên Thường dùng nó khi giá trị ra tuỳ thuộc giá trị biến 1 bit nào đó, hay muốn xuất đảo của giá trị ngõ ra trước đó

Trang 32

- X là tên port có trên chip

- Value là giá trị 1 byte

- Hàm này xuất giá trị 1 byte ra port Tất cả chân của port đó đếu là ngõ ra

Ví dụ:

Output_B (212) ; // xuất giá trị 11010100 ra port B

3.2.5 Input_X ()

- X: là tên port (a, b, c, d e) của PIC

- Hàm này trả về giá trị 8 bit là giá trị đang hiện hữu của port đó

- Value là giá trị 8 bit Mỗi bit đại diện 1 chân và bit=0 sẽ set chân đó là ngõ vào, bit= 1 set chân đó là ngõ ra

#byte portB = 0x6 // 16F877 có port b ở địa chỉ 6h

#bit B0 = portB 0 // biến B0 chỉ đến chân B0

#bit B1=portB 1 // biến B1 chỉ đến chân B1

#bit B2=portB 2 // biến B2 chỉ đến chân B2

Trang 33

#bit B3=portB 3 // biến B3 chỉ đến chân B3

#bit B4=portB 4 // biến B4 chỉ đến chân B4

#bit B5=portB 5 // biến B5 chỉ đến chân B5

#bit B6=portB 6 // biến B6 chỉ đến chân B6

#bit B7=portB 7 // biến B7 chỉ đến chân B7

Main ()

{ set_tris_B (126) ; //portB=01111110 b

// B0 là ngõ vào, thường làm ngắt ngoài

//B1 B6 là ngõ ra, ví dụ làm 6 ngõ ra điều chế PWM

//B7 là ngõ vào, Vd là nhận tín hiệu cho phép chẳng hạn

if (B7) //nếu ngõ vào chân B7 là 1 thì xuất 3 cặp xung đối nghịch

- Set_tris_B (0) : port B =00000000: tất cả chân portB là ngõ ra

- Set_tris_B (1) : portB = 00000001: chỉ B0 là ngõ vào, còn lại là ngõ ra

- Set_tris_B (255) : portB=11111111: tất cả chân portB là ngõ vào

3.3 Lập trình vào ra với led đơn, led 7 thanh và bàn phím

- Sử dụng hàm set_tris_X () để thiết lập trạng thái cho cổng ứng dụng cho việc nhập hay xuất Nếu đường tín hiệu vào phải thiết lập “1”, đường ra phải thiết lập “0”

- Với LED đơn thực hiện bật tắt theo 2 phương pháp: active “1” và active

“0” tùy theo cách ghép nối LED

- LED 7 thanh có thể điều khiển theo 2 phương pháp là quét từng thanh hoặc sử dụng IC chuyên dụng để chốt tín hiệu cho từng thanh

Trang 34

5.1.1 Tổng quan

Trong các ứng dụng đo lường và điều khiển bằng vi điều khiển bộ chuyển đổi tương tự-số là một thành phần rất quan trọng Dữ liệu trong thực tế là các dữ liệu tương tự (analog) Ví dụ nhiệt độ không khí buổi sáng là 250C và buổi trưa là 320C, giữa hai mức giá trị này có vô số các giá trị liên tục mà nhiệt độ phải “đi qua” để có thể đạt mức 320 C từ 250C, đại lượng nhiệt độ như thế gọi là một đại lượng analog Trong khi đó, rõ ràng vi điều khiển là một thiết bị số (digital), các giá trị mà một vi điều khiển có thể thao tác là các con số rời rạc vì thực chất chúng được tạo thành từ

sự kết hợp của hai mức 0 và 1 Ví dụ chúng ta muốn dùng một thanh ghi 8 bit trong

vi điều khiển để lưu lại các giá trị nhiệt độ từ 00 C đến 2550C, như chúng ta đã biết, một thanh ghi 8 bit có thể chứa tối đa 256 (28) giá trị nguyên từ 0 đến 255, như thế các mức nhiệt độ không nguyên như 28 123 0C sẽ không được ghi lại Nói cách khác, chúng ta đã “số hóa” (digitalize) một dữ liệu analog thành một dữ liệu số (digital signal) Quá trình “số hóa” này thường được thực hiện bởi một thiết bị gọi

là “bộ chuyển đổi tương tự - số” hay gọi tắt là ADC (Analog to Digital Converter)

Có rất nhiều phương pháp chuyển đổi ADC trong đó phương pháp chuyển đổi trực tiếp (direct converting) hoặc flash ADC là phương pháp cơ bản nhất Các bộ chuyển đổi ADC theo phương pháp này được cấu thành từ một dãy các bộ so sánh, các bộ so sánh được mắc song song và được kết nối trực tiếp với tín hiệu analog cần chuyển đổi Một điện áp tham chiếu (reference) và một mạch chia áp được sử dụng

để tạo ra các mức điện áp so sánh khác nhau cho mỗi bộ so sánh Hình dưới mô tả một bộ chuyển đổi flash ADC có 4 bộ so sánh, Vin là tín hiệu analog cần chuyển đổi và giá trị sau chuyển đổi là các con số tạo thành từ sự kết hợp các mức nhị phân trên các chân Vo Trong hình dưới, ta thấy rằng do ảnh hưởng của mạch chia áp (các điện trở mắc nối tiếp từ điện áp +15V đến ground), điện áp trên chân âm của các bộ so sánh sẽ khác nhau Trong lúc chuyển đổi, giả sử điện áp Vin lớn hơn điện

áp “V-“ của bộ so sánh 1 (opamp ở phía thấp nhất trong mạch) nhưng lại nhỏ hơn điện áp V- của các bộ so sánh khác, khi đó ngõ Vo1 ở mức 1 và các ngõ Vo khác ở

Trang 35

mức 0, chúng ta thu được một kết quả số Một cách tương tự, nếu tăng điện áp Vin

ta thu được các tổ hợp số khác nhau Với mạch điện có 4 bộ so sánh như trong hình

1, sẽ có tất cả 5 trường hợp có thể xảy ra, hay nói theo cách khác điện áp analog Vin được chia thành 5 mức số khác nhau Tuy nhiên, chú ý là các ngõ Vo không phải là các bit của tín hiệu số ngõ ra, chúng chỉ là đại diện để tổ hợp thành tín hiệu số ngõ

ra, dễ hiểu hơn chúng ta không sử dụng được các bit Vo trực tiếp mà cần một bộ giải mã (decoder)

Hình 18: Mạch flash ADC với 4 bộ so sánh

Bảng 1: Giá trị số ngõ ra sau khi giải mã

Ngày đăng: 24/10/2017, 15:51

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w