Lời đầu tiên em xin gửi lời cảm ơn chân thành đến thầy giáo hướng dẫn Phạm Hoàng Vương bộ môn Kỹ thuật máy đã giúp đỡ em rất nhiều trong quá trình thực hiện đề tài này. Từ lúc bắt đầu đến khi kết thúc đề tài thầy đã giúp em làm quen với lĩnh vực vi xử lí, học tập nghiên cứu và sử dụng được các phần mềm liên quan đến điều khiển như Proteus,PicC… . Thầy cũng giúp đỡ em rất nhiều trong lúc thiết kế và thi công mạch mô hình thực tế. Em cũng xin cám ơn các thầy, cô trong bộ môn Kỹ thuật máy đã giúp đỡ, tạo điều kiện cho sinh viên chúng em có cơ hội học tập, nghiên cứu trong suốt các năm học vừa qua để bọn em được phát triển các kĩ năng cơ bản của 1 sinh viên kĩ thuật trước khi tốt nghiệp.
Trang 11
LỜI CÁM ƠN
Lời đầu tiên em xin gửi lời cảm ơn chân thành đến thầy giáo hướng dẫn Phạm Hoàng Vương bộ môn Kỹ thuật máy đã giúp đỡ em rất nhiều trong quá trình thực hiện đề tài này Từ lúc bắt đầu đến khi kết thúc đề tài thầy đã giúp em làm quen với lĩnh vực vi xử lí, học tập nghiên cứu và sử dụng được các phần mềm liên quan đến điều khiển như Proteus,PicC… Thầy cũng giúp đỡ em rất nhiều trong lúc thiết kế
và thi công mạch mô hình thực tế
Em cũng xin cám ơn các thầy, cô trong bộ môn Kỹ thuật máy đã giúp đỡ, tạo điều kiện cho sinh viên chúng em có cơ hội học tập, nghiên cứu trong suốt các năm học vừa qua để bọn em được phát triển các kĩ năng cơ bản của 1 sinh viên kĩ thuật trước khi tốt nghiệp
Hà Nội, ngày 15 tháng 4 năm 2014
Đàm Hùng Việt
Trang 2
2
MỤC LỤC
LỜI CÁM ƠN 1
MỤC LỤC 2
DANH MỤC HÌNH ẢNH 5
CHƯƠNG 1: GIỚI THIỆU TỔNG QUAN VỀ VI XỬ LÍ 7
1.1.Cấu trúc tổng thể của một hệ vi điều khiển 7
1.2.Chức năng của từng bộ phận 8
1.2.1 CPU 8
1.2.2 Bộ nhớ ROM 8
1.2.3 Bộ nhớ RAM 9
1.2.4 Cổng giao tiếp (có thể là cổng nối tiếp hoặc cổng song song) 9
1.2.5.Bộ đếm/Bộ định thời 10
1.2.6.Khối giao tiếp bus 11
1.2.7.Ngăn xếp(stack) 12
1.3.Nguyên lí hoạt động của một vi xử lí 12
1.4.Các dòng vi điều khiển thường gặp 13
1.5.Giới thiệu về Pic16F887 14
1.5.1 PIC nói chung 14
1.5.2 Giới thiệu về PIC16F887 16
Trang 33
1.5.3.Tổ chức bộ nhớ 20
1.5.4.Bộ tạo dao động 25
1.5.5.Cấp nguồn 26
1.5.6.Reset 28
1.5.7 Các bộ định thời 28
CHƯƠNG 2: Ý TƯỞNG THIẾT KẾ VÀ CÁC LINH KIỆN CÓ THỂ ĐƯỢC SỬ DỤNG 36
2.1 IC thời gian thực DS1307 36
2.1.1 Khái quát chung 36
2.1.2.Cấu tạo của DS1307 37
2.1.3.Tổ chức thanh ghi trong DS1307 39
2.2 IC ghi dịch 74HC595 43
2.3 Led ma trận 8*8 47
2.4 Module thu phát sóng RF PT2272 48
CHƯƠNG 3: THIẾT KẾ, THI CÔNG VÀ CHẠY THỬ NGHIỆM 51
3.1.Sử dụng Proteus để thiết kế mạch và mô phỏng 51
3.2.Sử dụng phần mềm Pic C compiler để lập trình cho VDK 53
CHƯƠNG 4: KẾT QUẢ ĐẠT ĐƯỢC VÀ HƯỚNG PHÁT TRIỂN 56 4.1.Kết quả 56
4.2.Hướng phát triển trong tương lai 56
Trang 44 Tài liệu tham khảo 57 Phụ lục 58
Trang 55
DANH MỤC HÌNH ẢNH
Hình 1.1: Kiến trúc cơ bản của môt vi xử lý 7
Hình 1.2: Hai kiểu tổ chức phần cứng trong PIC 15
Hình 1.3.Sơ đồ các chân của PIC16F887 17
Hình 1.4.Chức năng các chân (ảnh chụp từ Data Sheet) 19
Hình 1.6 Bộ nhớ chương trình PIC16F877 22
Hình 1.7.Sơ đồ bộ tạo dao động 25
Hình 1.8.Hình ảnh một con thạch anh 20Mhz 26
Hình 1.9.Mạch ổn áp dùng cầu DIODE và IC ổn áp 3 chân 7805 27
Hình 1.10.Một con IC 7805 27
Hình 1.11.Sơ đồ của 1 mạch reset 28
Hình 1.12 Sơ đồ khối của Timer 0 29
Hình 2.1.Hình ảnh thực tế và sơ đồ các chân của Ds1307 37
Hình 2.2.Hình ảnh kết nối DS1307 với Pic 38
Hình 2.3 Hình ảnh thực tế và sơ đồ chân của IC 74HC595 43
Hình 2.4.Sơ đồ nguyên lý mắc ic74hc595 với Pic và led ma trận 45
Trang 66
Hình 2.6 Cách mắc led ma trận đúng cách 48
Hình 2.7.Hình ảnh thực tế của bộ thu phát sóng tín hiệu RF 49
Hình 3.1.Màn hình khởi động của Proteus 51
Hình 3.2.Mạch nguyên lý để mô phỏng 52
Hình 3.3.Mạch in khi đang thiết kế 53
Hình 3.4.Màn hình khởi tạo Project mới trong PicC 53
Trang 77
CHƯƠNG 1: GIỚI THIỆU TỔNG QUAN VỀ VI XỬ LÍ
1.1.Cấu trúc tổng thể của một hệ vi điều khiển
-Trước hết ta cần phân biệt hai khái niệm vi xử lí và vi điều khiển, về cơ bản chúng không khác nhau nhiều đều là các thuật ngữ dung để đề cập đến kĩ thuật ứng dụng các công nghê vi điện tử, công nghệ tích hợp và khả năng xử lí theo chương trình vào các lĩnh vực khác nhau Tuy nhiên có khác biệt là vi xử lí chủ yếu sử dụng vào mục đích tính toán còn vi điều khiển sử dụng cho các mục đích nhỏ cụ thể
Hình 1.1: Kiến trúc cơ bản của môt vi xử lý
Trang 88
-Ngoài cấu trúc như trên ra với mỗi loại vi điều khiển cụ thể còn có thêm một số phần cứng khác như bộ dao động trong,bộ biến đổi tần số tương tự DAC, các mạch điều chế dạng sóng WG, điều chế độ rộng xung PWM…
1.2.Chức năng của từng bộ phận
1.2.1 CPU
-Là bộ não của vi xử lí, các bộ phận khác của vi xử lí đều là cơ quan chấp hành dưới quyền của CPU Mỗi cơ quan này đều có một cơ chế hoạt động nhất định mà CPU phải tuân theo để giao tiếp với chúng CPU dùng 3 loại tín hiệu để giao tiếp
và điều khiển các cơ quan ngoại vi là :
+ tín hiệu địa chỉ
+ tín hiệu dữ liệu
+ tín hiệu điều khiển
Về mặt vật lí thì các tín hiệu này là các đường điện nhỏ dẫn từ CPU đến các ngoai vi khác hoặc là từ các ngoại vi đến với nhau
Chức năng của CPU là tiến hành các thao tác tính toán, xử lí,đưa ra các tín hiệu địa chỉ, dữ liệu và điều khiển nhằm thực hiện một nhiệm vụ nào đó do người lập trình đưa ra thông qua các lệnh
1.2.2 Bộ nhớ ROM
- Là loại bộ nhớ chứa chương trình hướng dẫn CPU thực hiện một nhiện vụ nào đó, ROM là loại bộ nhớ không bị mất chương trình khi ngừng cung cấp nguồn nuôi
Trang 99
1.2.3 Bộ nhớ RAM
- Là loại bộ nhớ dữ liệu dùng để chứa dữ liệu ( là các tham số, các biến tạm thời….)
- RAM là loại bộ nhớ sẽ mất dữ liệu khi cắt nguồn nuôi
1.2.4 Cổng giao tiếp (có thể là cổng nối tiếp hoặc cổng song song)
Đây là các đường tín hiệu đươc nối với một số chân của IC để giao tiếp với các thiết bị bên ngoài Giao tiếp ở đây là đưa điên áp ra hoặc đọc vào giá trị điện áp tại chân cổng Các giá trị điện áp đưa ra hoặc đọc vào chỉ có thể được biểu diễn bởi mọt trong hai giá trị logic 0 hoặc 1 Trong kĩ thuật vi xử lí, người ta thường dùng quy ước logic dương: giá trị 0 ứng với mức điện áp 0VDC, giá trị 1 ứng với mức điện áp +5VDC Tùy từng loại vi xử lí mà khoảng xấp xỉ đó là khác nhau nhưng nhìn chung là tương thích với mức logic TTL
+ Cổng giao tiếp song song thường gồm 8 đường khác nhau gọi là các cổng 8bit Các đường tín hiệu này độc lập với nhau, điều này cho phép ta đưa ra hay đọc vào các giá trị logic khác nhau đối với từng chân Ngoài ra cần chú ý các cổng giao tiếp này có thể kiêm thêm các chức năng đặc biệt lien quan đến các ngoại
vi khác
+ Cổng giao tiếp nối tiếp khác với cổng song song các bit dữ liệu được truyền lần lượt trên cùng một đường tín hiệu thay vì cùng môt lúc như trên cổng song song Tuy nhiên việc truyền dữ liệu trên cổng nối tiếp phải tuân theo một cơ chế, một giao thức hay một nguyên tắc nhất định Có thể kể một số giao thức như SPI,I2C,SCI
Trang 1010
Cổng nối tiếp có 2 kiểu truyền dữ liệu chính:
Truyền đồng bộ: thiết bị truyền và thiết bị nhận đều dùng chung một xung nhịp
Truyền dị bộ: thiết bị truyền và thiết bị nhận sử dụng hai nguồn xung nhịp riêng Tuy nhiên hai nguồn xung nhịp này không được khác nhau quá nhiều Xung nhịp là yếu tố không thể thiếu trong truyền dữ liệu nối tiếp và nó có vai trò xác định giá tri của bit dữ liệu
Cổng nối tiếp có thể có một trong các tính năng sau:
Đơn công: thiết bị chỉ có thể truyền hoặc nhận dữ liệu
Bán song công: thiết bị có thể truyền và nhận dữ liệu nhưng tại một thời điểm chỉ có thể nhận hoặc truyền đi
Song công: thiết bị có thể truyền và nhận dữ liệu đồng thời
1.2.5.Bộ đếm/Bộ định thời
Đây là các ngoại vi được thiết kế để thực hiện môt nhiệm vụ đơn giản là đếm các xung nhịp Mỗi khi có thêm một xung nhip tại đầu vào đếm thì giá trị bộ đếm tăng lên 1 đơn vị ( trong bộ đếm tiến) hay giảm đi 1 đơn vị (trong bộ đếm lùi) Xung nhịp đưa vào đếm đưa vào đếm có thể là một trong hai loại:
+ Xung nhịp bên trong IC: Đó là xung nhịp được tạo ra nhờ kết hợp mạch dao động bên trong IC và các linh kiện phụ bên ngoài nối với IC Ta có thể coi đó
là “nhịp tim” để toàn bộ các phần cứng bên trong vi xử lí( kể cả CPU và các ngoại vi) có thể hoạt động được Trường hợp này người ta gọi là các bộ định thời (Timer) Do xung nhịp của loại này thường đều đặn nên ta có thể dùng để đếm thời gian một cách chính xác
Trang 1111
+ Xung nhịp bên ngoài IC: đó là tín hiệu logic thay đổi liên tục giữa hai mức 0-1 và không nhất thiết phải đều đặn Trong trường hợp này, người ta gọi là các bô đếm (Counter) Ứng dụng phổ biến của các bộ đếm là đếm các sự kiện bên ngoài như các sản phẩm chạy trên băng truyền, đếm số lượng xe tham gia giao thông trên đường…
- Một khái niệm cần lưu ý đó là “tràn”, nó được hiểu là sự kiện bộ đếm vượt qua giá trị tối đa mà nó có thể biểu diễn và quay trở về 0 Với bộ đếm 8bit giá trị tối
đa của nó là 255 (28=256) và bộ đếm 16bit là 65535 (216=65536)
1.2.6.Khối giao tiếp bus
Khối này có chức năng ghép nối giữa các bus bên trong chip và các chân đưa ra ngoài chip Mục đích của việc đưa các tín hiệu địa chỉ, dữ liệu và điều khiển ra ngoài là mở rộng khả năng phối ghép thêm của vi xử lí với các ngoại vi khác ( chủ yếu là các bộ nhớ ngoài) ngoài các ngoại vi được tích hợp trên IC Thông thường thì số lượng các đường tín hiệu là giữ nguyên khi đưa ra ngoài chip, tuy nhiên trong một số trường hợp số lượng các đường tín hiệu có thể nhỏ hơn số lượng thực hiện bên trong
- Khi đưa ra ngoài , các tín hiệu địa chỉ và dữ liệu có thể được ghép với nhau( cùng sử dụng chung một số chân nào đó) hoặc được tách riêng( tín hiệu địa chỉ dùng một số chân, tín hiệu dữ liệu dùng một số chân khác) Người ta thường dùng
“dồn kênh”, tức là ghép chức năng để giảm thiểu số chân cần thiết Khi đó tín hiệu địa chỉ sẽ xuất hiện trước, sau đó là tín hiệu dữ liệu Để tách được hai loại tín hiệu này thì nhà sản xuất cung cấp cho người sử dụng một đường tín hiệu điều khiển có tên là tín hiệu chốt địa chỉ (thường kí hiệu là ALE) Tín hiệu này sẽ “tích cực” khi tín hiệu địa chỉ xuất hiện và “không tích cực” khi tín hiệu dữ liệu xuất hiện trên các
Trang 12cơ chế “vào sau ra trước”(LIFO-Last in First out)
Ngăn xếp là phần cứng vô cùng quan trọng trong vi xử lí, nó tham gia vào các thao tác rẽ nhánh( trừ thao tác nhảy) của chương trình Người lập trình phải hết sức cẩn thận khi gán giá trị khởi tạo cho SP(thanh ghi con trỏ ngăn xếp) để tránh sự cố tràn ngăn xếp hoặc ngăn xếp trùng với các vùng nhớ lưu dữ liệu khác Khi xảy ra một trong các sự cố trên sẽ không có cách nào kiểm soát được hoạt động của vi xử
lí và có thể gây thiệt hại lớn đối với hệ thống
1.3.Nguyên lí hoạt động của một vi xử lí
-Các thao tác tính toán xử lí được CPU thực hiện theo chuỗi các lệnh đặt trong bộ nhớ chương trình
-Việc thực hiện các lệnh sẽ diễn ra tuần tự từ thấp đến cao bắt đầu từ thấp đến cao bắt đầu từ địa chỉ reset Địa chỉ reset là địa chỉ mà tại đó sau khi cấp nguồn nuôi CPU sẽ bắt đầu đọc và thực hiện theo các chỉ dẫn được mã hóa tại đó Mỗi loại vi xử lí sẽ có một địa chỉ reset riêng do nhà sản xuất quy định
-Các lệnh được thực hiện tuần tự là nhờ có thanh ghi “bộ đếm chương trình” Thanh ghi này chứa địa chỉ của ô nhớ chứa mã của lệnh tiếp theo sẽ được thực
Trang 1313
hiện Khi CPU tìm nạp được mã của lệnh n, thanh ghi sẽ tự động tăng lên 1 đơn vị
để chỉ vào ô nhớ chứa mã của lệnh (n=1)
-CPU sẽ thực hiện các lệnh theo các bước nhỏ Thường thì nó bao gồm:
+Tìm mã lệnh: tức là truy cập chương trình đọc lấy giá trị tại ô nhớ được chỉ bởi thanh ghi và lưu vào một thanh ghi chuyên dùng chứa mã lệnh trên CPU +Giải mã lệnh: giải mã giá trị đã lấy được và đang đặt trong thanh ghi chứa mã lệnh trong CPU
+Thực hiện lệnh:thực hiện chỉ dẫn được giải mã từ lệnh đọc đươc
1.4.Các dòng vi điều khiển thường gặp
• Họ vi điều khiển Atmel: AT89, 8051,8052,8951
• Họ vi điều khiển Intel: 8XC42, MCS96, 386ex
• Họ vi điều khiển Fujitsu: F²MC Family (8/16 bit), FR Family (32 bit), FR-V Family (32 bit RISC)…
• Họ vi diều khiển AMCC: 403 PowerPC CPU, PPC 403GCX,405 PowerPC CPU, PPC 405EP, PPC 405GP/CR, PPC 405GPr, PPC NPe405H/L
• Họ vi điều khiển Microchip: PIC16Fxxx, dsPIC30F
• Và còn nhiều dòng vi điều khiển khác nữa
-Sau khi tham khảo nhiều tài liệu về các loại vi điều khiển và nhận được sự góp
ý, chỉ dẫn của thầy giáo em chọn Pic 16F887 làm vi điều khiển cho mạch điều khiển của mình Lý do:
+ Pic16F887 là vi điều khiển phổ biến dễ dàng tìm mua được
+ Giá thành không quá đắt với sinh viên
+ Nó đáp ứng được yêu cầu của mạch điều khiển mà em dự định thiết kế
Trang 1414
+Tài liệu về ứng dụng khá phổ biến
+ Lý do quan trọng nhất là em đã từng sử dụng Pic16F887 để thi công 1 mạch thực tế và nhận được kết quả khả quan
1.5.Giới thiệu về Pic16F887
1.5.1 PIC nói chung
1.5.1.1.Khái niệm PIC
-PIC là chữ viết tắt của “Programmable Intelligent Computer”(máy tính thông minh khả trình) là một họ vi điều khiển RISC được sản xuất bởi công ty Microchip Technology
- Qua thời gian phát triển lâu dài( từ năm 1975), ngày nay, rất nhiều dòng được sản xuất hàng loạt với các module ngoại vi tích hợp sẵn với bộ nhớ chương trình từ 512Word đến 32K Word
- Ưu thế của PIC là phổ biến rộng rãi, giá thành không quá đắt, có đầy đủ tính năng của vi điều khiền khi hoạt động độc lập, có nhiều tính năng đa dạng và các tính năng này không ngừng được phát triển
1.5.1.2.Cấu trúc của PIC
- Cấu trúc phần cứng của PIC được thiết kế theo 2 dạng:
+Cấu trúc Von-Neumann, 2 bộ nhớ được bố trí nằm chung nên rất gọn, tuy nhiên điều này chỉ có ý nghĩa khi tốc độ xử lí của CPU là rất cao
+ Đối với cấu trúc Havard bộ nhớ dữ liệu và bộ nhớ chương trình tách ra thành các thành phần riêng biệt Như vậy, trong cùng một thời điểm CPU có thể truy xuất đến cả hai bộ nhớ Điều này giúp cho tốc độ xử lý của vi xử lý tăng lên
Trang 1515
Ngoài ra, tập lệnh trong cấu trúc Havard có thể được tối ưu tùy theo yêu cầu cấu trúc của vi điều khiển mà không phụ thuộc cấu trúc dữ liệu Ví dụ, đối với vi điều khiển PIC dòng 16Fxxx thì độ dài lệnh luôn là 14-bit
Hình 1.2: Hai kiểu tổ chức phần cứng trong PIC
Tổ chức phần cứng của các dòng vi điều khiển PIC được thiết kế theo cấu trúc Havard Việc được thiết kế theo cấu trúc Havard giúp cho tập lệnh của vi điều khiển PIC được tối ưu, cấu trúc lệnh không phụ thuộc cấu trúc dữ liệu và có thể linh động tùy chỉnh theo khả năng và tốc độ của từng vi điều khiển
1.5.1.3.Ngôn ngữ lập trình
- Ngôn ngữ lập trình cho PIC rất đa dạng từ cấp thấp đến cấp cao
- Ngôn ngữ cấp thấp có MPLAB,các ngôn ngữ lập trình cao hơn có C, Baisic , Pascal…
Trang 16Ngoài ra người dùng có thể tự chế tạo các mạch nạp cho PIC
1.5.2 Giới thiệu về PIC16F887
-Đặc điểm nổi bật của vi điều khiển PIC là khả năng tính toán tốc độ cao và các ứng dụng trong điều khiển công suất và điều khiển động cơ
Trang 1717
Hình 1.3.Sơ đồ các chân của PIC16F887
-Chức năng các chân:
1.Là chân Reset hoặc chân đặt điện áp Vpp
2 Các chân 2-10 được sử dụng làm chân IN/OUT tín hiệu số hoặc INPUT tín
hiệu tương tự(trừ chân số 6) Ngoài ra các chân 4,5 có thể làm chân chuyển đổi
A/D
3.Chân 11 và chân 32 dùng để cấp điện áp Vdd=5V cho PIC
4.Chân 12 và chân 31 để cấp điện áp Vss=0V cho PIC
Trang 1818
5 Chân 13 và 14 dùng để mắc thạch anh cho mạch tạo xung nhịp cho vi điều khiển
6.Chân 15 có thể làm chân I/O tín hiệu số hoặc chân T1OSO/T1CK1
7 Chân 16 có thể làm chân I/O tín hiệu số hoặc chân T1OS1 hoặc chân CCP2
8 Chân 17 dùng làm chân I/O tín hiệu số hoặc làm chân CCP1/P1A
9 Chân 18,19,20,21,22,23,27 làm chân I/O tín hiệu số, các chân 18,23 còn có thể dùng làm chân giao tiếp I2C
10.Các chân 24,25,26 đều có thể dùng làm chân I/O tín hiệu số; chân 25,26 có thể dùng làm chân ghép nối máy tính
11 Chân 28 làm chân I/O tín hiệu số hoặc chân P1B
12 Chân 29 làm chân I/O tín hiệu số hoặc chân P1C
13 Chân 30 làm chân I/O tín hiệu số hoặc chân P1D
14.Chân 33 đến 38 làm chân I/O tín hiệu số hoặc chân Input tín hiệu tương tự
20 Chân 39 làm chân I/O hoặc ICSPCLK
21.Chân 40 làm chân I/O hoặc ICSPDAT
Trang 1919 Hình 1.4.Chức năng các chân (ảnh chụp từ Data Sheet)
Trang 2020
Hình 1.5.Một vi điều khiển PIC16F887
1.5.3.Tổ chức bộ nhớ
- Đây là vi điều khiển thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ dài
14 bit Mỗi lệnh đều được thực thi trong một chu kì xung clock Tốc độ hoạt động tối đa cho phép là 20 MHz với một chu kì lệnh là 200ns Bộ nhớ chương trình 8Kx14 bit, bộ nhớ dữ liệu 368x8 byte RAM và bộ nhớ dữ liệu EEPROM với dung lượng 256x8 byte Số PORT I/O là 5 với 33 pin I/O
Các đặc tính ngoại vi bao gồm các khối chức năng sau:
+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
Trang 2121
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) thông qua 2 chân
+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 thạch anh khác nhau
Bộ nhớ chương trình của vi điều khiển PIC16F877 là bộ nhớ flash, dung lượng
bộ nhớ 8K word (1 word = 14 bit) và được phân thành nhiều trang (từ page0 đến page 3) Như vậy, bộ nhớ chương trình có khả năng chứa được 8*1024 = 8192 lệnh (vì một lệnh sau khi mã hóa sẽ có dung lượng 1 word (14 bit)
Để mã hóa được địa chỉ của 8K word bộ nhớ chương trình, bộ đếm chương trình có dung lượng 13 bit (PC<12:0>) Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h (Reset vector) Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h (Interrupt vector)
Trang 2323
GPR(General Purpose Register) nằm ở vùng địa chỉ còn lại trong bank Các thanh ghi SFR thường xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽ được đặt ở tất cả các bank của bộ nhớ dữ liệu giúp thuận tiện trong quá trình truy xuất và làm giảm bớt lệnh của chương trình Sơ đồ cụ thể của bộ nhớ dữ liệu PIC16F877 như sau:
Trang 2424
Trang 2525
1.5.4.Bộ tạo dao động
- Vi điều khiển PIC16F887 có thể thực hiện với nhiều kiểu bộ tạo dao động khác nhau Ta lấy 1 ví dụ đơn giản là dao động thạch anh
Hình 1.7.Sơ đồ bộ tạo dao động
-Thông số của 2 tụ gốm phụ thuộc vào tần số của bộ dao động thạch anh
Bảng 2.1: Thông số của 2 tụ gốm theo từng loại của bộ dao động thạch anh
Trang 2727
Hình 1.9.Mạch ổn áp dùng cầu DIODE và IC ổn áp 3 chân 7805
Hình 1.10.Một con IC 7805
+Cấp nguồn cho tất cả các chấn Vss/Vdd của PIC Mỗi cặp chân Vss/Vdd gắn thêm 1 tụ 104pF sát chân đó để chống nhiễu
Trang 2828
1.5.6.Reset
Nguyên tắc là dùng trở kháng 10k – 33k và 4k7 cho mạch reset
Hình 1.11.Sơ đồ của 1 mạch reset 1.5.7 Các bộ định thời
1.5.7.1 TIMER 0
Đây là một trong ba bộ đếm hoặc bộ định thời của vi điều khiển PIC16F877A Timer0 là bộ đếm 8 bit được kết nối với bộ chia tần số (prescaler) 8 bit Cấu trúc của Timer0 cho phép ta lựa chọn xung clock tác động và cạnh tích cực của xung clock Ngắt Timer0 sẽ xuất hiện khi Timer0 bị tràn Bit TMR0IE (INTCON<5>) là bit điều khiển của Timer0
TMR0IE=1 cho phép ngắt Timer0 tác động, TMR0IF= 0 không cho phép ngắt Timer0 tác động
-Sơ đồ khối của Timer0 như sau:
Trang 2929
Hình 1.12 Sơ đồ khối của Timer 0
Muốn Timer0 hoạt động ở chế độ Timer ta clear bit TOSC (OPTION_REG<5>), khi đó giá trị thanh ghi TMR0 sẽ tăng theo từng chu kì xung đồng hồ (tần số vào Timer0 bằng ¼ tần số oscillator) Khi giá trị thanh ghi TMR0 từ FFh trở về 00h, ngắt Timer0 sẽ xuất hiện Thanh ghi TMR0 cho phép ghi và xóa được giúp ta ấn định thời điểm ngắt Timer0 xuất hiện một cách linh động
Muốn Timer0 hoạt động ở chế độ counter ta set bit TOSC (OPTION_REG<5>) Khi đó xung tác động lên bộ đếm được lấy từ chân RA4/TOCK1 Bit TOSE (OPTION_REG<4>) cho phép lựa chọn cạnh tác động vào bộ đếm Cạnh tác động
sẽ là cạnh lên nếu TOSE=0 và cạnh tác động sẽ là cạnh xuống nếu TOSE=1
Trang 3030
Khi thanh ghi TMR0 bị tràn, bit TMR0IF (INTCON<2>) sẽ được set Đây chính
là cờ ngắt của Timer0 Cờ ngắt này phải được xóa bằng chương trình trước khi bộ đếm bắt đầu thực hiện lại quá trình đếm Ngắt Timer0 không thể “đánh thức” vi điều khiển từ chế độ sleep
Bộ chia tần số (prescaler) được chia sẻ giữa Timer0 và WDT (Watchdog Timer) Điều đó có nghĩa là nếu prescaler được sử dụng cho Timer0 thì WDT sẽ không có được hỗ trợ của prescaler và ngược lại Prescaler được điều khiển bởi thanh ghi OPTION_REG Bit PSA (OPTION_REG<3>) xác định đối tượng tác động của prescaler Các bit PS2:PS0 (OPTION_REG<2:0>) xác định tỉ số chia tần số của prescaler Xem lại thanh ghi OPTION_REG để xác định lại một cách chi tiết về các bit điều khiển trên
Các lệnh tác động lên giá trị thanh ghi TMR0 sẽ xóa chế độ hoạt động của prescaler Khi đối tượng tác động là Timer0, tác động lên giá trị thanh ghi TMR0 sẽ xóa prescaler nhưng không làm thay đổi đối tượng tác động của prescaler Khi đối tượng tác động là WDT, lệnh CLRWDT sẽ xóa prescaler, đồng thời prescaler sẽ ngưng tác vụ hỗ trợ cho WDT
Các thanh ghi điều khiển liên quan đến Timer0 bao gồm:
TMR0 (địa chỉ 01h, 101h): chứa giá trị đếm của Timer0
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE
và PEIE)
OPTION_REG (địa chỉ 81h, 181h): điều khiển prescaler
Trang 3131
1.5.7.2 TIMER 1
Timer1 là bộ định thời 16 bit, giá trị của Timer1 sẽ được lưu trong hai thanh ghi (TMR1H:TMR1L) Cờ ngắt của Timer1 là bit TMR1IF (PIR1<0>) Bit điều khiển của Timer1 sẽ là TMR1IE (PIE<0>)
Tương tự như Timer0, Timer1 cũng có hai chế độ hoạt động: chế độ định thời (timer) với xung kích là xung clock của oscillator (tần số của timer bằng ¼ tần số của oscillator) và chế độ đếm (counter) với xung kích là xung phản ánh các sự kiện cần đếm lấy từ bên ngoài thông qua chân RC0/T1OSO/T1CKI (cạnh tác động là cạnh lên)
Việc lựa chọn xung tác động (tương ứng với việc lựa chọn chế độ hoạt động là timer hay counter) được điều khiển bởi bit TMR1CS (T1CON<1>)
Ngoài ra, Timer1 còn có chức năng reset input bên trong được điều khiển bởi một trong hai khối CCP (Capture/Compare/PWM)
Khi bit T1OSCEN (T1CON<3>) được set, Timer1 sẽ lấy xung clock từ hai chân: RC1/T1OSI/CCP2 và RC0/T1OSO/T1CKI làm xung đếm Timer1 sẽ bắt đầu đếm sau cạnh xuống đầu tiên của xung ngõ vào Khi đó PORTC sẽ bỏ qua sự tác động của hai bit TRISC<1:0> và PORTC<2:1> được gán giá trị 0 Khi clear bit T1OSCEN Timer1 sẽ lấy xung đếm từ oscillator hoặc từ chân RC0/T1OSO/T1CKI Timer1 có hai chế độ đếm là đồng bộ (Synchronous) và bất đồng bộ (Asynchronous)
Chế độ đếm được quyết định bởi bit điều khiển T1SYNC (T1CON<2>)
Khi T1SYNC = 1 xung đếm lấy từ bên ngoài sẽ không được đồng bộ hóa với xung clock bên trong, Timer1 sẽ tiếp tục quá trình đếm khi vi điều khiển đang ở
Trang 3232
chế độ sleep và ngắt do Timer1 tạo ra khi bị tràn có khả năng “đánh thức” vi điều khiển Ở chế độ đếm bất đồng bộ, Timer1 không thể được sử dụng để làm nguồn xung clock cho khối CCP (Capture/Compare/Pulse width modulation)
Khi T1SYNC = 0 xung đếm vào Timer1 sẽ được đồng bộ hóa với xung clock bên trong Ở chế độ này Timer1 sẽ không hoạt động khi vi điều khiển đang ở chế
độ sleep
Các thanh ghi liên quan đến Timer1 bao gồm:
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và PEIE)
PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer1 (TMR1IF)
PIE1( địa chỉ 8Ch): cho phép ngắt Timer1 (TMR1IE)
TMR1L (địa chỉ 0Eh): chứa giá trị 8 bit thấp của bộ đếm Timer1
TMR1H (địa chỉ 0Eh): chứa giá trị 8 bit cao của bộ đếm Timer1
T1CON (địa chỉ 10h): xác lập các thông số cho Timer1
1.5.7.3 TIMER2
Timer2 là bộ định thời 8 bit và được hỗ trợ bởi hai bộ chia tần số prescaler và postscaler Thanh ghi chứa giá trị đếm của Timer2 là TMR2 Bit cho phép ngắt Timer2 tác động là TMR2ON (T2CON<2>) Cờ ngắt của Timer2 là bit TMR2IF (PIR1<1>) Xung ngõ vào (tần số bằng ¼ tần số oscillator) được đưa qua bộ chia tần số prescaler 4 bit (với các tỉ số chia tần số là 1:1, 1:4 hoặc 1:16 và được điều khiển bởi các bit T2CKPS1:T2CKPS0 (T2CON<1:0>)
Trang 3333
Timer2 còn được hỗ trợ bởi thanh ghi PR2 Giá trị đếm trong thanh ghi TMR2 sẽ tăng từ 00h đến giá trị chứa trong thanh ghi PR2, sau đó được reset về 00h Khi reset thanh ghi PR2 được nhận giá trị mặc định FFh
Ngõ ra của Timer2 được đưa qua bộ chia tần số postscaler với các mức chia từ 1:1 đến 1:16 Postscaler được điều khiển bởi 4 bit T2OUTPS3:T2OUTPS0 Ngõ ra của postscaler đóng vai trò quyết định trong việc điều khiển cờ ngắt
Ngoài ra ngõ ra của Timer2 còn được kết nối với khối SSP, do đó Timer2 còn đóng vai trò tạo ra xung clock đồng bộ cho khối giao tiếp SSP
Các thanh ghi liên quan đến Timer2 bao gồm:
INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép toàn bộ các ngắt (GIE và PEIE)
PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer2 (TMR2IF)
PIE1 (địa chị 8Ch): chứa bit điều khiển Timer2 (TMR2IE)
TMR2 (địa chỉ 11h): chứa giá trị đếm của Timer2
T2CON (địa chỉ 12h): xác lập các thông số cho Timer2
PR2 (địa chỉ 92h): thanh ghi hỗ trợ cho Timer2
Ta có một vài nhận xét về Timer0, Timer1 và Timer2 như sau:
Timer0 và Timer2 là bộ đếm 8 bit (giá trị đếm tối đa là FFh), trong khi Timer1 là
bộ đếm 16 bit (giá trị đếm tối đa là FFFFh)
Timer0, Timer1 và Timer2 đều có hai chế độ hoạt động là timer và counter Xung clock có tần số bằng ¼ tần số của oscillator
Trang 3434
Xung tác động lên Timer0 được hỗ trợ bởi prescaler và có thể được thiết lập ở nhiều chế độ khác nhau (tần số tác động, cạnh tác động) trong khi các thông số của xung tác động lên Timer1 là cố định Timer2 được hỗ trợ bởi hai bộ chia tần số prescaler và postcaler độc lập, tuy nhiên cạnh tác động vẫn được cố định là cạnh lên
Timer1 có quan hệ với khối CCP, trong khi Timer2 được kết nối với khối SSP Một vài so sánh sẽ giúp ta dễ dàng lựa chọn được Timer thích hợp cho ứng dụng 2.8 ADC
ADC (Analog to Digital Converter) là bộ chuyển đổi tín hiệu giữa hai dạng tương tự và số PIC16F877 có 14 ngõ vào analog (AN0 : AN13) Hiệu điện thế chuẩn VREF có thể được lựa chọn là VDD, VSS hay hiệu điện thế chuẩn được xác lập trên hai chân RA2 và RA3
Kết quả chuyển đổi từ tín tiệu tương tự sang tín hiệu số là 10 bit số tương ứng và được lưu trong hai thanh ghi ADRESH:ADRESL Khi không sử dụng bộ chuyển đổi ADC, các thanh ghi này có thể được sử dụng như các thanh ghi thông thường khác Khi quá trình chuyển đổi hoàn tất, kết quả sẽ được lưu vào hai thanh ghi ADRESH:ADRESL, bit (ADCON0<2>) được xóa về 0 và cờ ngắt ADIF được set Qui trình chuyển đổi từ tương tự sang số bao gồm các bước sau:
Thiết lập các thông số cho bộ chuyển đổi ADC
Chọn ngõ vào analog, chọn điện áp mẫu (dựa trên các thông số của thanh ghi ADCON1)
Chọn kênh chuyển đổi AD (thanh ghi ADCON0)
Chọn xung clock cho kênh chuyển đổi AD (thanh ghi ADCON0)
Cho phép bộ chuyển đổi AD hoạt động (thanh ghi ADCON0)
Trang 3535
Thiết lập các cờ ngắt cho bộ AD
Clear bit ADIF
Set bit ADIE
Set bit PEIE
Set bit GIE
Đợi cho tới khi quá trình lấy mẫu hoàn tất
Bắt đầu quá trình chuyển đổi (set bit GO/DONE )
Đợi cho tới khi quá trình chuyển đổi hoàn tất bằng cách:
Kiểm tra bit GO/DONE Nếu GO/DONE =0, quá trình chuyển đổi đã hoàn tất