PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù, cụm từ RISC chưa được sử dụng thời bây giờ, nhưng PIC thực sự là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu kỳ m
Trang 1SVTH : Nguyễn Duy Phúc MSSV : 08510030059
LỜI MỞ ĐẦU
Trong cuộc sống hiện tại ngày nay, khoa học kỹ thuật phát triển rất nhanh đặt biệt
là sự phát triển của công nghiệp vi điện tử, kỹ thuật số các hệ thống điều khiển dần được tự động hóa Với những kỹ thuật tiên tiến như Vi xử lý, Vi mạch số… được ứng dụng vào lĩnh vực điều khiển thì các hệ thống điều khiển cơ khí thô sơ với tốc
độ xử lý chậm, ít chính xác dần dần được thay thế bằng các hệ thống điều khiển tự động với các lệnh chương trình đã được thiết lập trước
Trong quá trình sản xuất ở các nhà máy, xí nghiệp hiện nay, việc phân loại tự động
là một yêu cầu hết sức cần thiết và quan trọng Vì nếu nắm bắt được việc phân loại sản phẩm sẽ giúp tiết kiệm công sức, thời gian cho công nhân, cho sản phẩm đầu
ra Và có những xử lý kịp thời tránh được những hư hỏng và sự cố có thể xảy ra cho sản phẩm
Để đáp ứng được yêu cầu phân loại tự động thì có nhiều cách để thực hiện Việc ứng dụng vi điều khiển PIC 16F877A vào việc phân loại tự động là phương pháp tối ưu Đồng thời được sự đồng ý của khoa Xây Dựng Và Điện, em đã ứng dụng nó vào đề tài: “ Mạch đếm và phân loại sản phẩm dùng PIC 16F877A giao tiếp máy tính”
Giới hạn của đề tài:
Với thời gian 3 tháng thực hiện đề tài, cũng là thời gian có nhiều lễ hội nhất trong năm, với trình độ và chuyên môn có hạng, em đã cố gắng hết sức để hoàn thành tập luận văn này đúng thời hạn do trường đặt ra Tập luận văn này tập trung giải quyết các vấn đề sau:
Tìm hiểu về vi điểu khiển PIC16F877A
Thiết kế mạch đếm sản phẩm và mô hình băng chuyền
Viết chương trình phần mềm để đáp ứng yêu cầu phân loại sản phẩm
………
………
Trang 2SVTH : Nguyễn Duy Phúc MSSV : 0851030059
LỜI CẢM ƠN
Để thực hiện và hoàn chỉnh được luận văn này, ngoài công sức nhỏ bé của em, đó
là công lao và sự tận tình giảng dạy, truyền thụ rất lớn của tất cả các Thầy Cô khoa Xây Dựng Và Điện nói chung và các Thầy Cô giảng dạy bộ môn Điện-Điện Tử nói riêng Đặc biệt hơn cả, em xin bày tỏ lòng biết ơn chân thành nhất đối với Ths Lê Minh Hải đã dành thời gian quý báo, tận tình giúp đỡ em thực hiện và hoàn thành luận văn này đúng thời hạn
Và xin chân thành cảm ơn những người bạn, những người thân đã giúp đỡ và động viên tôi trong học tập và trong quá trình thực hiện đồ án tốt nghiệp
Cuối cùng, em xin chúc quý Thầy Cô trong khoa Xây Dựng Và Điện, các Thầy Cô trong hội đồng bảo vệ và Thầy hướng dẫn Ths Lê Minh Hải được dồi dào sức
khỏe
Trang 3
MỤC LỤC
Lời mở đầu Lời cảm ơn Mục lục Chương 1: DẪN NHẬP – PHƯƠNG ÁN THIẾT KẾ 1
1.1 Đặt vấn đề……… 1
1.2 Phương án thiết kế……… 1
1.2.1 Dùng IC số………
1.2.2 Dùng vi xử lý………
1 2 1.3 Mục đích yêu cầu của đề tài ……… 2
1.4 giới hạn của đề tài……… 3
Chương 2: GIỚI THIỆU VI XỬ LÝ PIC 16F877A 4 2.1 Tổng quan về vi xử lý PIC 16F877A……… 4
2.1.1 PIC là gì ?……… 4
2.1.2 Đặc tính của vi xử lý PIC 16F877A……… 4
2.2 Giới thiệu vi xử lý PIC 16F877A ……… 5
2.2.1 Đặc tính ngoại vi ……… 5
2.2.2 Đặc tính Analog……… 6
2.2.3 Đặc tính đặc biệt……… 6
2.2.4 Công nghệ CMOS ……… 7
2.3 Sơ đồ chân vi xử lý PIC 16F877A……… 7
2.4 Sơ đồ khối vi xử lý PIC 16F877A ……… 8
2.5 Tổ chức bộ nhớ……… 9
2.5.1 Bộ nhớ của chương trình … ……… 9
2.5.2 Bộ nhớ dữ liệu ……… ……… 10
2.6 Các thanh ghi đặc biệt FSR ……… 11
2.7 Thanh ghi mục đích chung GPR ……… 14
2.8 Stack……… ……… 14
2.9 Các cổng xuất nhập của PIC 16F877A ……… 15
2.9.1 PORTA……… 15
2.9.2 PORTB……… 16
2.9.3 PORTC……… ……… 19
2.9.4 PORTD……… 20
2.9.5 PORTE……… 21
2.10 Tổng quan về một số đặc tính của CPU … ……… 22
2.10.1 Configuration bit ……… 22
2.10.2 Các đặc tính của OSCILLATOR… ……….……… 23
2.10.3 Các chế độ Reset……… 24
2.11 Ngắt (Interrupt)……… 26
2.12 Tập lệnh của Vi xử lý PIC ……… 29
2.12.1 Vài nét sơ lược về tập lệnh của Vi xử lý PIC ……… 29
2.12.2 Tập lệnh…… ……… 31
Trang 4CHƯƠNG 3 : GIỚI THIỆU LINH KIỆN SỬ DỤNG TRONG MẠCH 38
3.1 Điện trở………… ……… 38
3.1.1 Khái niệm……… 38
3.1.2 Hình dáng và ký hiệu………….……… 38
3.1.3 Bảng quy ước màu của điện trở ……… 38
3.1.4 Cách đọc……… ……… 39
3.2 Tụ điện……… 39
3.2.1 Khái niệm tụ điện ……… 39
3.2.2 Cấu tạo của tụ điện……… 39
3.2.3 Phân loại tụ điện……… 40
3.2.4 Điện dung - Đơn vị - Kí hiệu của tụ điện.……… 41
3.2.5 Sự phóng nạp – Cách đọc trị số - Ý nghĩa điện áp của tụ điện……… 41
3.3 Diode……… ……… 42
3.3.1 Khái niệm và cấu tạo của diode……… 42
3.3.2 Hoạt động và phân cực cho diode……… 43
3.3.3 Phân loại cho diode……… 44
3.4 Cầu diode……… 46
3.4.1 Sơ đồ chân…… ……… 46
3.4.2 Đặc tính cơ bản……… ……… 46
3.5 Transistor……… ……… 46
3.5.1 Cấu tạo…….……… 46
3.5.2 Nguyên tắc hoạt động của Transistor ……… 46
3.5.3 Kí hiệu và hình dạng của Transistor ……… 48
3.5.4 Xác định chân Transistor ………….……… 49
3.6 Led…….……….……… 49
3.6.1 Khái niệm……… 49
3.6.2 Nguyên lý làm việc và cấu tạo của led… ……… 50
3.7 Led 7 đoạn……… ……… 51
3.7.1 Các khái niệm cơ bản…….……… 51
3.7.2 Cấu tạo……… ……… 51
3.8 Led thu phát hồng ngoại ……… 52
3.8.1 Khái niệm tia hồng ngoại ……… 52
3.8.2 Công dụng từng loại ……… 52
3.9 Relay……… ……… 53
3.10 IC ổn áp……… 53
3.10.1 Sơ đồ chân ……… 53
3.10.2 Đặc tính cơ bản……….……… 53
3.11 IC 74244……… 54
3.11.1 Sơ đồ chân…….……… 54
3.11.2 Đặc tính cơ bản……… 54
3.12 Mosfet IRFZ44N… ……… 54
3.12.1 Sơ đồ chân ……… 54
3.12.1 Đặc tính cơ bản ……… 54
3.13 IC MAX232……… ……… 55
Trang 5CHƯƠNG 4 : SƠ ĐỒ KHỐI TOÀN MẠCH 56
4.1 Khối nguồn……….……… 56
4.2 Khối cảm biến……… 56
4.3 Khối xử lý……… 56
4.4 Khối động lực……….……… 56
4.5 Khối hiển thị ……….……… 56
CHƯƠNG 5: SƠ ĐỒ NGUYÊN LÝ – TÍNH TOÁN MẠCH 57 5.1 Khối nguồn ……… ……… 57
5.2 Khối cảm biến……… 59
5.3 Khối xử lý……… ……… 60
5.3.1 Mạch reset …… ……… 60
5.3.2 Mạch tạo xung nhịp……… 61
5.3.3 Khối truyền thông nối tiếp ……… 61
5.4 Khối hiển thị……….……… 61
5.5 Khối động lực……… ……… 62
CHƯƠNG 6: LẬP TRÌNH CHO PIC 63 6.1 Lưu đồ giải thuật ……… 63
6.1.1 Lưu đồ giải thuật chương trình chính…….……… 63
6.1.2 Lưu đồ giải thuật chương trình con……… 64
6.2 Viết chương trình cho vi xử lý PIC 16F877A ……… 68
CHƯƠNG 7: LẬP TRÌNH ĐIỀU KHIỂN TRÊN PC 7.1 Cơ bản về giao tiếp RS232………
76 76 7.2 VISUAL BASIC 6.0 ……… 78
7.2.1 Tổng quan về Visual Basic ……… 78
7.2.2 Các Thuộc Tính (property) ……… 79
7.2.3 Sự kiện OnComm ……… 82
7.3 Mã nguồn Visual Basic 6.0 của chương trình giao tiếp máy tính….………… 83
7.4 Giao diện chương trình sau khi biên dịch ……….……… 90
KẾT LUẬN 91 PHỤ LỤC 92 TÀI LIỆU THAM KHẢO 94
Trang 7CHƯƠNG 1: DẪN NHẬP – PHƯƠNG ÁN THIẾT KẾ
1.1 Đặt vấn đề:
Ngày nay cùng với sự phát triển của các ngành Khoa học kỹ thuật, kỹ thuật điện – điện tử… trong đó kỹ thuật số đóng vai trò quan trọng trong mọi lĩnh vực Khoa học kỹ thuật, quản lý, tự động hóa, thông tin liên lạc…
Từ ý tưởng tự động hóa trong sản xuất, “Mạch đếm và phân loại sản phẩm” được em chọn làm
đề tài tốt nghiệp vì nó gần gũi với thực tế
Để làm được mạch này, hệ thống cần có bộ phận đếm và bộ phận cảm biến:
Bộ phận cảm biến: gồm phần phát và phần thu Thông thường phần phát sử dụng led phát hồng ngoại và phần thu là led thu hồng ngoại
Bộ phận đếm có nhiều phương pháp thực thi, đó là:
Tần số đáp ứng lớn, cho phép đếm với tốc độ cao
Khoảng cách cảm biến thu – phát có thể đặt xa nhau cho phép đếm những sản phẩm có kích thước lớn
Tổn hao công suất thấp, có thể dùng pin hoặc ắc quy
Trang 8Vi xử lý đa chức năng do đó việc sử dụng Vi xử lý, Vi điều khiển đã giải quyết được những bế tắc mà dùng IC số kết hợp không giải quyết được
1.2.2 Dùng Vi xử lý:
Ngoài những ưu điểm như đã liệt kê khi sử dụng IC số ghép lại, thì mạch đếm
sử dụng Vi xử lý còn có các ưu điểm sau:
Mạch có thể thay đổi số đếm một cách linh hoạt bằng cách thay đổi phần mềm mà không ảnh hưởng tới phần cứng
Sử dụng linh kiện ít hơn
Mạch đơn giản hơn mạch sử dụng IC số
Mạch có thể cài đặt số đếm ban đầu
Mạch có thể lưu lại số lượng của các ca sản xuất
Mạch cũng có thể giao tiếp được với máy tính
Nhưng trong thiết kế, người ta thường chọn phương pháp tối ưu về kinh tế do đó em chọn phương pháp “Đếm sản phẩm dùng Vi xử lý”
1.3 Mục đích yêu cầu của đề tài:
Trong đồ án này, em thực hiện đếm sản phẩm bằng phương pháp dựa trên sự thay đổi mức logic của các chân cảm biến Như vậy mỗi sản phẩm đi trên băng chuyền cần có một thiết bị
để cảm nhận sản phẩm, thiết bị này gọi là cảm biến Khi một sản phẩm đi qua cảm biến, cảm biến sẽ nhận được sự thay đổi mức logic (1 hoặc 0) đưa về khối xử lý để tăng số đếm và phân loại sản phẩm (cao – trung – thấp) Sản phẩm sẽ được đếm và hiển thị trên led 7 đoạn và trên màn hình máy tính
Tuy nhiên, mỗi bộ phận hay mỗi ca sản xuất lại yêu cầu với số đếm khác nhau nên phải có sự chuyển đổi linh hoạt trong việc chuyển đổi số đếm Bộ phận chuyển đổi trực quan nhất là bàn phím Khi cần thay đổi số đếm, người sử dụng chỉ việc nhập số và hệ thống sẽ tự động đếm Khi số sản phẩm đếm bằng với số sản phẩm được nhập từ bàn phím thì mạch đếm sẽ dừng đếm Từ đây suy ra được mục đích yêu cầu của đề tài:
Số đếm phải chính xác và việc thay đổi số đếm một cách linh hoạt
Bộ phận hiển thị rõ ràng
Mạch không quá phức tạp, đảm bảo an toàn sử dụng
Giá thành không quá cao
Trang 91.4 Giới hạn của đề tài:
Do mạch sử dụng bộ phận cảm biến là led phát và led thu hồng ngoại do đó tín hiệu hồng ngoại từ led phát không đủ mạnh để truyền đi xa trong không gian nên để led thu nhận được tín hiệu một cách mạnh và ổn định nhất thì khoảng cách khoảng cách đặt led thu và led phát không quá xa khi đặt với nhau Chính vì vậy mà kích thước sản phẩm đếm không quá lớn Đếm số sản phẩm trong phạm vi từ 00 đến 99
Trang 10CHƯƠNG 2: GIỚI THIỆU VI XỬ LÝ PIC16F877A
2.1 Tổng quan về họ Vi điều khiển PIC:
2.1.1 PIC là gì ?
PIC là một họ vi điều khiển RISC được sản xuất bởi công ty Microchip Technology
Dòng PIC đầu tiên là PIC1650 được phát triển bởi Microelectronics Division thuộc General Instrument
PIC bắt nguồn là chữ viết tắt của "Programmable Intelligent Computer" (Máy tính khả trình thông minh) là một sản phẩm của hãng General Instruments đặt cho dòng sản phẩm đầu tiên của họ là PIC1650 Lúc này, PIC1650 được dùng để giao tiếp với các thiết bị ngoại vi cho máy chủ 16bit CP1600, vì vậy, người ta cũng gọi PIC với cái tên "Peripheral Interface Controller" (Bộ điều khiển giao tiếp ngoại vi) CP1600 là một CPU tốt, nhưng lại kém về các hoạt động xuất nhập, và vì vậy PIC 8-bit được phát triển vào khoảng năm 1975 để hỗ trợ hoạt động xuất nhập cho CP1600 PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù, cụm từ RISC chưa được sử dụng thời bây giờ, nhưng PIC thực sự là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu kỳ máy (4 chu kỳ của bộ dao động)
Năm 1985 General Instruments bán bộ phận vi điện tử của họ, và chủ sở hữu mới hủy bỏ hầu hết các dự án - lúc đó đã quá lỗi thời Tuy nhiên PIC được bổ sung EEPROM để tạo thành 1
bộ điều khiển vào ra khả trình Ngày nay rất nhiều dòng PIC được xuất xưởng với hàng loạt các module ngoại vi tích hợp sẵn (như USART, PWM, ADC ), với bộ nhớ chương trình từ
512 Word đến 32K Word
2.1.2 Đặc tính của Vi xử lý PIC:
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:
8/16 bit CPU, xây dựng theo kiến trúc Harvard có sửa đổi
Flash và ROM có thể tuỳ chọn từ 256 byte đến 256 Kbyte
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ông nghệ Nanowatt
Trang 11 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, 10/12 bit
Bộ so sánh điện áp (Voltage Comparators)
Các module Capture/Compare/PWM
LCD
MSSP Peripheral dùng cho các giao tiếp I2C, SPI, và I2S
Bộ nhớ nội EEPROM - có thể ghi/xoá lên tới 1 triệu lần
Module điều khiển động cơ, đọc encoder
Hỗ trợ giao tiếp USB
Hỗ trợ điều khiển Ethernet
Hỗ trợ giao tiếp CAN
Hỗ trợ giao tiếp LIN
Hỗ trợ giao tiếp IrDA
Một số dòng có tích hợp bộ RF (PIC16F639, và RFPIC)
KEELOQ mã hoá và giải mã
DSP những tính năng xử lý tín hiệu số (dsPIC)
2.2 Giới thiệu Vi xử lý PIC 16F877A:
PIC16F877A thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ dài 14 bit
Mỗi lệnh điều được thực thi trong một chu kỳ xung clock
Tốc độ hoạt động tối đa cho phép là 20MHz với một chu kỳ lệnh là 200ns
Bộ nhớ chương trình 8K x 14 bit, bộ nhớ dữ liệu 368 x 8 byte RAM và bộ nhớ dữ liệu EEPROM với dung lượng 256 x 8 byte
Số Port I/O là 5 với 33 pin I/O
2.2.1 Đặc tính ngoại vi:
Timer0: 8 bit định thời, đếm với 8 bit prescaler
Timer1: 16 bit định thời, đếm với prescaler, có thể được tăng lên trong suốt chế độ sleep qua thạch anh, xung clock bên ngoài
Timer2: 8 bit định thời, đếm với 8 bit prescaler và postcaler
Trang 12Hai module Capture, Compare, PWM:
Capture có độ rộng 16 bit, độ phân giải 12.5ns
Compare có độ rộng 16 bit, độ phân giải 200ns
Độ phân giải lớn nhất của PWM là 10 bit
Chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port) với SPI và I2C
Chuẩn giao tiếp nối tiếp USART (Universal Synchronous Asynchronous Receiver Transmitter) 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
2.2.2 Đặc tính Analog:
8 kênh chuyển đổi ADC (Analog-to-Digital Converter) 10 bit
Brown-out Reset (BOR)
Module so sánh tương tự:
Hai bộ so sánh tương tự
Bộ điện áp chuẩn VREF có thể lập trình PIC
Có thể lập trình ngõ ra vào đến từ những ngõ vào của PIC và trên điện áp bên trong
Những ngõ ra của bộ so sánh có thể sử dụng cho bên ngoài
2.2.3 Đặc tính đặc biệt:
Có thể ghi xóa 100.000 lần với kiểu bộ nhớ chương trình Enhanced Flash
1.000.000 lần ghi xóa với kiểu bộ nhớ EEPROM
Dữ liệu EEPROM có thể được lưu trữ hơn 40 năm
Có thể tự lập lập trình lại dưới sự điều khiển của phần mềm
Nạp chương trình ngay trên mạch điện ICSP (In - Circuit Serial Programming) thông qua
2 chân
Nguồn đơn 5V cho mạch lập trình nối tiếp
Watchdog Timer (WDT) với bộ dao động RC tích hợp sẵn trên chip cho hoạt động đáng tin cậy
Có thể lập trình mã bảo vệ
Tiết kiệm năng lượng với chế độ Sleep
Trang 13Có thể lựa chọn bộ dao động
Mạch dở sai (ICD : In - Circuit Debug) qua 2 chân
2.2.4 Công nghệ CMOS:
Năng lượng thấp, công nghệ Flash/EEPROM tốc độ cao
Thiết kế hoàn toàn tĩnh
Khoảng điện áp hoạt động từ 2V đến 5.5V
Tiêu tốn năng lượng thấp
2.3 Sơ đồ chân Vi xử lý PIC16F877A:
Hình 2.3: Sơ đồ chân và hình dạng của PIC16F877A (40 pin)
Trang 142.4 Sơ đồ khối Vi xử lý PIC16F877A:
Hình 2.4.1: Cấu trúc bên trong của PIC16F877A Như đã nói ở trên, Vi điều khiển PIC có kiến trúc Harvard, trong đó CPU truy cập chương trình và dữ liệu trên hai bus riêng biệt, nên làm tăng đáng kể băng thông so với kiến trúc Von Neumann, trong đó CPU truy cập chương trình và dữ liệu trên cùng một bus
Việc tách riêng bộ nhớ chương trình và bộ nhớ dữ liệu cho phép số bit của từ lệnh có thể khác với số bit của dữ liệu Ở PIC16F877A, từ lệnh dài 14 bit, từ dữ liệu 8 bit PIC16F877A chứa một bộ ALU 8 bit và thanh ghi làm việc WR (Working Register) ALU là đơn vị tính toán số học và logic, nó thực hiện các phép tính số và đại số Boole trên thanh ghi làm việc WR và các thanh ghi dữ liệu ALU có thể thực hiện các phép cộng, trừ, dịch bit và các phép toán logic
Trang 152.5 Tổ chức bộ nhớ:
2.5.1 Bộ nhớ chương trình:
Bộ nhớ chương trình của Vi điều khiển PIC16F877A là bộ nhớ Flash, dung lượng bộ nhớ 8K word (1 word = 14 bit) và được phân chia thành nhiều trang (từ page 0 đến page 3) Như vậy,
bộ nhớ chương trình có khả năng chứa được 8*1024 = 8192 lệnh (vì 1 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ần 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 (Resetvector) Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004H (Interruptvector)
Bộ nhớ chương trình không bao gồm bộ nhớ stack và không được địa chỉ hóa bởi bộ đếm chương trình
Hình 2.5.1: Bộ nhớ chương trình của PIC
Trang 162.5.2 Bộ nhớ dữ liệu:
Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia ra làm nhiều bank Đối với PIC16F877A, bộ nhớ dữ liệu chia làm 4 bank Mỗi bank có dung lượng 12 bytes, bao gồm các thanh ghi có chức năng đặc biệt SFR (Special Function Register) nằm ở các vùng địa chỉ thấp
và các thanh ghi mục đích chung 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 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 PIC16F877A như sau :
Hình 2.5.2: Bộ nhớ dữ liệu của PIC
Trang 172.6 Các thanh ghi đặc biệt FSR:
Hình 2.6.1: Các thanh ghi đặc biệt ở Bank 0
Trang 18Hình 2.6.2: Các thanh ghi đặc biệt ở Bank 1
Trang 19Hình 2.6.3: các thanh ghi đặc biệt ở Bank 2 và Bank 3
Trang 202.7 Thanh ghi mục đích chung GPR:
Các thanh ghi này có thể truy xuất trực tiếp thông qua thanh ghi FSG (File Select Register) Đây là các thanh ghi dữ liệu thông thường, người sử dụng có thế tùy theo mục đích chương trình mà có thể dùng các thanh ghi này để chứa các biến số, hằng số, kết quả hoặc các tham số phục vụ cho chương trình
2.8 Stack:
Stack cho phép 8 lệnh gọi chương trình con và ngắt hoạt động Stack chứa địa chỉ mà chương trình chính sẽ quay về thực hiện từ sau chương trình con hay ngắt Đối với PIC16F877A, Stack có độ sâu 8 lớp
Stack không nằm trong bộ nhớ chương trình hay bộ nhớ dữ liệu mà là một vùng nhớ đặc biệt không cho phép đọc hay ghi Khi lệnh CALL được thực hiện hay khi một ngắt xảy ra làm chương trình bị rẽ nhánh, giá trị của bộ đếm chương trình PC tự động được Vi điều khiển cất vào trong Stack Khi một trong các lệnh RETURN, RETLW hay RETFIE được thực thi, giá trị
PC sẽ tự động lấy ra từ trong Stack, Vi điều khiển sẽ thực hiện tiếp chương trình theo đúng quy trình định trước
Bộ nhớ Stack trong Vi điều khiển PIC họ 16F87xA có khả năng chứa được 8 địa chỉ và hoạt động theo cơ chế xoay vòng Nghĩa là giá trị cất vào bộ nhớ Stack lần thứ 9 sẽ ghi đè lên giá trị cất vào Stack lần đầu tiên và giá trị cất vào bộ nhớ Stack lần thứ 10 sẽ ghi đè lên giá trị cất vào Stack lần thứ 2
Cần chú ý là không có cớ hiệu nào cho biết trạng thái Stack, do đó ta không biết được khi nào Stack bị tràn Bên cạnh đó, tập lệnh của Vi điều khiển dòng PIC cũng không có lệnh POP hay PUSH, các thao tác với bộ nhớ Stack sẽ hoàn toàn được điều khiển bởi CPU
Trang 212.9 Các cổng xuất nhập của PIC16F877A:
2.9.1 PORTA:
Hình 2.9.1: Cấu trúc bên trong của PORTA PORTA gồm 6 chân từ RA0 đến RA5 Việc ghi giá trị vào thanh ghi TRISA sẽ quy định các chân của PORTA là input hay output Việc đọc thanh ghi PORTA sẽ đọc trạng thái các chân ở PORTA Việc ghi giá trị vào thanh ghi PORTA sẽ thay đổi trạng thái của các chân PORTA Riêng chân RA4 được tích hợp chức năng là chân cung cấp xung clock ngoài cho Timer 0 (RA4/T0CKI) Những chân khác của PORTA được đa hợp với các chân ngõ vào Analog của ADC và chân ngõ vào của điện thế so sánh của bộ so sánh Comparator Hoạt động của những chân này được quy định bằng những bit tương ứng trong các thanh ghi ADCCON1
và CMCON1 Khi các chân của PORTA được sử dụng làm ngõ vào Analog thì các bit trong thanh ghi TRISA phải được set bằng 1
Trang 22Hình 2.9.1a: Chức năng và các thanh ghi liên quan đến PORTA
2.9.2 PORTB:
Hình 2.9.2: Cấu trúc bên trong của PORTB
Trang 23PORTB gồm 8 chân từ RB0 – RB7 Việc ghi giá trị vào thanh ghi TRISB sẽ quy định các chân của PORTB là input hay output Việc đọc thanh ghi PORTB sẽ đọc trạng thái của các chân ở PORTB Việc ghi giá trị vào thanh ghi PORTB sẽ thay đổi trạng thái của các chân PORTB
Ba chân của PORTB được đa hợp với chức năng In-Circuit Debugger và Low Voltage Programming Function là : RB3/PGM, RB6/PGC, RB7/PGD Mỗi chân PORTB có một transistor kéo lên VDD Chức năng này hoạt động khi bit RBPU (Option <7>) được xóa Chức năng này sẽ tự động được xóa khi PORTB được quy định là input
Bốn chân của PORTB từ RB7 đến RB4 có chức năng ngắt khi trạng thái chân PORTB thay đổi (Khi PORTB được quy định là output thì chức năng này không hoạt động) Giá trị chân của PORTB được so sánh với giá trị đã được lưu trước đó, khi có sự sai lệch giữa 2 giá trị này, ngắt sẽ xảy ra với cờ ngắt RBIF (INTCON <0>) được set lên Ngắt có thể làm cho VĐK thoát khỏi trạng thái SLEEP
Bất cứ sự truy xuất nào trên PORTB sẽ xóa trạng thái sai lệch, kết thúc ngắt và cho phép xóa cờ ngắt RBIF
Trang 24Hình 2.9.2: Chức năng và các thanh ghi liên quan đến PORTB
Trang 252.9.3 PORTC:
Hình 2.9.3: Cấu trúc bên trong của PORTC PORTC gồm 8 chân từ chân RC0 – RC7 Việc ghi giá trị vào thanh ghi TRISC sẽ quy định các chân của PORTC là input hay output Việc đọc thanh ghi PORTC sẽ đọc trạng thái của các chân ở PORTC Việc ghi giá trị vào thanh ghi PORTC sẽ thay đổi trạng thái của các chân PORTC
Các chân PORTC được đa hợp với các chức năng ngoại vi
Khi các chức năng ngoại vi được cho phép ta cần quan tâm chặt chẽ tới giá trị các bit của thanh ghi TRISC Một số chức năng ngoại vi sẽ ghi đè giá trị 0 lên các bit của thanh ghi TRISC và mặc định các chân này là output, ngoài ra một số chức năng ngoại vi khác sẽ tự động mặc định một số chân là ngõ vào Do đó cần xem kỹ các tính năng của các hàm ngoại vi
để thiết lập giá trị các bit trong thanh ghi TRISC cho thích hợp
Hình 2.9.3a: Chức năng và các thanh ghi liên quan đến PORTC
Trang 262.9.4 PORTD:
Hình 2.9.4: Cấu trúc bên trong của PORTD PORTD gồm 8 chân từ chân RD0 – RD7 Bên cạnh chức năng là port xuất nhập, PORTD còn có thể hoạt động như một cổng song song bằng cách set các bit PSPMODE (TRISE <4>), trong chế độ này buffer ngõ vào là TTL PORTD còn là cổng xuất dữ liệu của chuẩn giao tiếp PSP (Parallel Slave Port)
Hình 2.9.4a: Chức năng và các thanh ghi liên quan đến PORTD
Trang 27Ngoài ra các chân PORTE còn có thể được cấu hình như là các ngõ vào Analog, tại chế độ này, khi đọc giá trị của các chân này sẽ cho ta giá trị là 0
Thanh ghi TRISE quy định chức năng xuất nhập của PORTE ngay cả khi nó được sử dụng như các ngõ vào Analog Phải đảm bảo các chân này được quy định là ngõ vào trong chế độ này
Hình 2.9.5a: Chức năng và các thanh ghi liên quan đến PORTE
Trang 282.10 Tổng quan về một số đặc tính của CPU:
2.10.1 Configuration bit:
Đây là các bit dùng để lựa chọn các đặc tính của CPU Các bit này được chứa trong bộ nhớ chương trình tại địa chỉ 2007h và chỉ có thể được truy xuất trong quá trình lập trình cho vi điều khiển Chi tiết về các bit này như sau :
Bit 13 CP: (Code Protection)
1 : tắt chế độ bảo vệ mã chương trình
0 : bật chế độ bảo vệ mã chương trình
Bit 12, 5, 4: không quan tâm và được mặc định mang giá trị 0
Bit 11 DEBUG (In-circuit debug mode bit)
1:không cho phép, RB7 và RB6 được xem như các pin xuất nhập bình thường
0:cho phép, RB7 và RB6 là các pin được sử dụng cho quá trình debug
Bit 10-9 WRT1:WRT0 Flash Program Memory Write Enable bit
11: Tắt chức năng chống ghi, EECON sẽ điều khiển quá trình ghi lên toàn bộ nhớ chương trình
10: chỉ chống từ địa chỉ 0000h:00FFh
01: chỉ chống ghi từ địa chỉ 0000h:07FFh
00: chỉ chống ghi từ địa chỉ 0000h:0FFFh
Bit 8 CPD Data EEPROM Memory Write Protection bit
1: Tắt chức năng bảo vệ mã của EEPROM
0: Bật chức năng bảo vệ mã
Bit 7 LVP Low-Voltage (Single supply) In-Circuit Serial Programming Enable bit:
1: Cho phép chế độ nạp điện áp thấp, pin RB3/PGM được sử dụng cho chế độ này
0: Không cho phép chế độ nạp điện áp thấp, điện áp cao được đưa vào từ pin , pin RB3 là pin I/O bình thường
Bit 6 BODEN Brown-out Reset Enable bit
1: cho phép BOR (Brown-out Reset)
0: không cho phép BOR
Trang 29Bit 3 Power-up Timer Enable bit
PIC16F877A có khả năng sử dụng một trong 4 loại oscillator, đó là:
LP: (Low Power Crystal)
Trang 30Đối với các ứng dụng không cần các loại oscillator tốc độ cao, ta có thể sử dụng mạch dao động RC làm nguồn cung cấp xung hoạt động cho vi điều khiển Tần số tạo ra phụ thuộc vào các giá trị điện áp, giá trị điện trở và tụ điện, bên cạnh đó là sự ảnh hưởng của các yếu tố như nhiệt độ, chất lượng của các linh kiện Các linh kiện sử dụng cho mạch RC oscillator phải bảo đảm các giá trị sau :
3K < REXT < 100K
CEXT > 20 pF
2.10.3 Các chế độ Reset:
Có nhiều chế độ reset vi điều khiển, bao gồm:
Power-on Reset POR (Reset khi cấp nguồn hoạt động cho vi điều khiển) reset trong quá trình hoạt động
từ chế độ sleep
WDT reset (reset do khối WDT tạo ra trong quá trình hoạt động)
WDT wake up từ chế độ sleep
Brown-out reset (BOR)
Hình 2.10.3: Mạch reset qua pin Ngoại trừ reset POR trạng thái các thanh ghi là không xác định vàWDT wake up không ảnh hưởng đến trạng thái các thanh ghi, các chế độ reset còn lại đều đưa giá trị các thanh ghi về giá trị ban đầu được ấn định sẵn Các bit và chỉ thị trạng thái hoạt động, trạng thái reset của vi điều khiển và được điều khiển bởi CPU
reset: Khi pin ở mức logic thấp, vi điều khiển sẽ được reset Tín hiệu reset được cung cấp bởi một mạch ngoại vi với các yêu cầu cụ thể sau:
Không nối pin trực tiếp lên nguồn VDD
Trang 31 R1 phải nhỏ hơn 40 K để đảm bảo các đặc tính điện của vi điều khiển
R2 phải lớn hơn 1 K để hạn dòng đi vào vi điều khiển
reset còn được chống nhiễu bởi một bộ lọc để tránh các tín hiệu nhỏ tác động lên
Power-up Timer (PWRT): đây là bộ định thời hoạt động dựa vào mạch RC bên trong vi điều khiển Khi PWRT được kích hoạt, vi điều khiển sẽ được đưa về trạng thái reset PWRT sẽ tạo ra một khoảng thời gian delay (khoảng 72 ms) để VDD tăng đến giá trị thích hợp
Oscillator Start-up Timer (OST): OST cung cấp một khoảng thời gian delay bằng 1024 chu
kì xung của oscillator sau khi PWRT ngưng tác động (vi điều khiển đã đủ điều kiện hoạt động)
để đảm bảo sự ổn định của xung do oscillator phát ra Tác động của OST còn xảy ra đối với POR reset và khi vi điều khiển được đánh thức từ chế độ sleep OST chỉ tác động đối với các lọai oscillator là XT, HS và LP
Brown-out reset (BOR): Nếu VDD hạ xuống thấp hơn giá trị VBOR (khoảng 4V) và kéo dài trong khoảng thời gian lớn hơn TBOR (khoảng 100 us), BOR được kích hoạt và vi điều khiển được đưa về trạng thái BOR reset Nếu điện áp cung cấp cho vi điều khiển hạ xuống thấp hơn VBOR trong khoảng thời gian ngắn hơn TBOR, vi điều khiển sẽ không được reset Khi điện áp cung cấp đủ cho vi điều khiển hoạt động, PWRT được kích hoạt để tạo ra một khoảng thời gian delay (khoảng 72ms) Nếu trong khoảng thời gian này điện áp cung cấp cho
vi điều khiển lại tiếp tục hạ xuống dưới mức điện áp VBOR, BOR reset sẽ lại được kích hoạt khi vi điều khiển đủ điện áp hoạt động Một điểm cần chú ý là khi BOR reset được cho phép, PWRT cũng sẽ hoạt động bất chấp trạng thái của bit PWRT
Trang 32Hình 2.10.3: Sơ đồ các chế độ reset của PIC16F877A
Tóm lại để vi điều khiển hoạt động được từ khi cấp nguồn cần trải qua các bước sau:
Đến thời điểm này vi điều khiển mới bắt đầu hoạt động bình thường Thanh ghi điều khiển
và chỉ thị trạng thái nguồn cung cấp cho vi điều khiển là thanh ghi PCON
Trang 33là quá trình tán gẫu của bạn với người bạn ngồi ở nhà, điện thoại reo tạo ra một interrupt và thủ tục interrupt là cuộc nói chuyện với người ở đầu dây bên kia, khi kết thúc cuộc nói chuyện bằng điện thoại bạn quay về “chương trình chính” để tiếp tục tán gẫu
Ví dụ này giải thích chính xác một interrupt tạo ra một tiến trình xử lý như thế nào ? Một chương trình chính đang chạy, thực hiện một vài chức năng nào đó trên mạch điện nhưng khi interrupt xảy ra, chương trình chính sẽ tạm ngưng và ngay lúc đó một thủ tục khác được thực hiện, khi thủ tục này kết thúc con PIC sẽ quay lại chương trình chính
Con PIC có 15 nguồn ngắt, khi ngắt được xảy ra cần : Khai báo ngắt (Set các bit điều khiển
IE tương ứng) và có cờ ngắt tác động (IF), để biết ngắt như thế nào, chúng ta cần xem sơ đồ sau :
Hình 2.11: Giản đồ ngắt Các bit điều khiển ngắt :
Bit GIE : INTCON <7> : Cho phép ngắt toàn cục
Bit PEIE : INTCON <6> : Cho phép ngắt ngoại vi
Bit RBIE : INTCON <3> : Cho phép ngắt PORTB
Bit INTE : INTCON <4> : Cho phép ngắt RB0
Bit TMR0IE : INTCON <5> : Cho phép ngắt Timer0
Bit FEIE : PIE2 <4> : Cho phép ngắt EEPROM
Bit PSPIE : PIE1 <7> : Cho phép ngắt truyền song song
Trang 34 Bit ADIE : PIE1 <6> : Cho phép ngắt chuyển đổi ADC
Bit RCIE : PIE1 <5> : Cho phép ngắt nhận nối tiếp
Bit TXIE : PIE1 <4> : Cho phép ngắt truyền nối tiếp
Bit SSPIE : PIE1 <3> : Cho phép ngắt truyền nhận nối tiếp đang bận
Bit CCP1IE : PIE1 <2> : Cho phép ngắt bộ CCP1
Bit TMR2IE : PIE1 <1> : Cho phép ngắt Timer2
Bit TMR1IE : PIE1 <0> : Cho phép ngắt Timer1
Bit CCP2IE : PIE2 <0> : Cho phép ngắt bộ CCP2
Bit BCLIE : PIE2 <3> : Cho phép ngắt truyền nhận nối tiếp xảy ra
Bit CMIE : PIE2 <6> : Cho phép ngắt bộ so sánh
Các bit cờ ngắt :
Bit RBIF : INTCON <0> : Cờ ngắt PORTB
Bit INTF : INTCON <1> : Cờ ngắt RB0
Bit TMR0IF : INTCON <2> : Cờ ngắt Timer0
Bit FEIF : PIR2 <4> : Cờ ngắt EEPROM
Bit PSPIF : PIR1 <7> : Cờ ngắt truyền song song
Bit ADIF : PIR1 <6> : Cờ ngắt chuyển đổi ADC
Bit RCIF : PIR1 <5> : Cờ ngắt nhận nối tiếp
Bit TXIF : PIR1 <4> : Cờ ngắt truyền nối tiếp
Bit SSPIF : PIR1 <3> : Cờ ngắt truyền nhận nối tiếp đang bận
Bit CCP1IF : PIR1 <2> : Cờ ngắt CCP1
Bit TMR2IF : PIR1 <1> : Cờ ngắt Timer2
Bit TMR1IF : PIR1 <0> : Cờ ngắt Timer1
Bit CCP2IF : PIR2 <0> : Cờ ngắt CCP2
Bit BCLIF : PIR2 <3> : Cờ ngắt truyền nhận nối tiếp xảy ra
Bit CMIF : PIR2 <6> : Cờ ngắt bộ so sánh
=> Dựa vào sơ đồ trên, chúng ta có thể set bit tương ứng để khai báo ngắt
Trang 35 Cấu trúc chương trình có dùng ngắt :
ORG 0000H ; Địa chỉ vector Reset
GOTO MAIN ; Nhảy vào chương trình chính
;………INTERRUPT ROUTINE…………
ORG 04H ; Địa chỉ vector ngắt
Lưu các giá trị vào tạm thời vào Ram nội (nếu các giá trị này thay đổi khi thực thi chương trình ngắt)
2.12 Tập lệnh của Vi xử lý PIC:
2.12.1 Vài nét sơ lược về tập lệnh của Vi xử lý PIC:
Như đã trình bày ở trên PIC là vi điều khiển có tập lệnh rút gọn RISC (Reduced Instruction Set Computer), bao gồm 35 lệnh và có thể được phân ra thành 3 nhóm cơ bản:
Nhóm lệnh thao tác trên bit
Nhóm lệnh thao tác trên byte
Nhóm lệnh điều khiển
Trang 36Đối với dòng vi điều khiển PIC16Fxxx, mỗi lệnh được mã hóa thành 14 bit word, bao gồm các bit opcode (dùng để xác định lệnh nào được mã hóa) và các bit mô tả một hay vài tham số của lệnh Đối với nhóm lệnh thao tác trên byte, ta có 2 tham số f (xác định địa chỉ byte cần thao tác) và d (xác định nơi chứa kết quả thực thi lệnh) Nếu d = 0, kết quả sẽ được đưa vào thanh ghi W Nếu d = 1, kết quả được đưa vào thanh ghi được mô tả bởi tham số f
Hình 2.12.1: Cơ chế mã hóa lệnh của PIC 16Fxxx Đối với nhóm lệnh thao tác trên bit, ta có hai tham số b (xác định bit cần thao tác) và f (xác định địa chỉ byte dữ liệu cần thao tác)
PIC16Fxxx
Đối với nhóm lệnh điều khiển chỉ có một tham số duy nhất là k (k có thể là 8 bit trong trường hợp các lệnh bình thường hay 11 bit trong trường hợp là lệnh CALL và lệnh GOTO) dùng để mô tả đối tượng tác động của vi điều khiển (một label, một hằng số nào đó)
Mỗi lệnh sẽ được vi điều khiển thực thi xong trong vòng một chu kì lệnh, ngoại trừ các lệnh làm thay đổi giá trị bộ đếm chương trình PC cần 2 chu kì lệnh Một chu kì lệnh gồm 4 xung clock của oscillator Ví dụ ta sử dụng oscillator có tần số 4 MHz thì tần số thực thi lệnh sẽ là 4MHz/4 = 1 MHz, như vậy một chu kì lệnh có thời gian 1 uS
Các lệnh thao tác trên một thanh ghi bất kì đều thực hiện cơ chế Read-Modify-Write, tức là thanh ghi sẽ được đọc, dữ liệu được thao tác và kết quả được đưa vào thanh ghi chứa kết quả (nơi chứa kết quả tùy thuộc vào lệnh thực thi và tham số d) Ví dụ như khi thưc thi lệnh
“CLRF PORTB”, vi điều khiển sẽ đọc giá trị thanh ghi PORTB, xóa tất cả các bit và ghi kết quả trở lại thanh ghi PORTB Sau đây ta sẽ đi sâu vào cấu trúc, cú pháp và tác động cụ thể của từng lệnh
Trang 37Tác dụng: thực hiện phép toán AND giữa các giá trị chứa trong hai thanh ghi W và f
Kết quả được đưa vào thanh ghi W nếu
d=0 hoặc thanh ghi f nếu d = 1
Bit trạng thái: Z
Lệnh BCF
Cú pháp: BCF f,b (0 ≤ f ≤ 127, 0 ≤ b ≤ 7)
Tác dụng: xóa bit b trong thanh ghi f về giá trị 0
Bit trạng thái: không có
Lệnh BSF
Cú pháp: BSF f,b (0 ≤ f ≤ 127, 0 ≤ b ≤ 7)
Tác dụng: set bit b trong thanh ghi f
Bit trạng thái: không có
Trang 38 Lệnh BTFSS
Cú pháp: BTFSS f,b (0 ≤ f ≤ 127, 0 ≤ b ≤ 7)
Tác dụng: kiểm tra bit b trong thanh ghi f
Nếu bit b bằng 0, lệnh tiếp theo được thực thi Nếu bit b bằng 1, lệnh tiếp theo được bỏ qua và thay vào đó là lệnh NOP
Bit trạng thái: không có
Bit trạng thái: không có
Trang 39Tác dụng: giá trị thanh ghi f được giảm đi 1 đơn vị Kết quả được đưa vào thanh ghi W nếu d
= 0 hoặc thanh ghi f nếu d = 1
Bit trạng thái: Z
Lệnh DECFSZ
Cú pháp: DECFSZ f,d (0 ≤ f ≤ 127, d∈[0,1])
Tác dụng: gía trị thanh ghi f được giảm 1 đơn vị Nếu kết quả sau khi giảm khác 0,
lệnh tiếp theo được thực thi, nếu kết quả bằng 0, lệnh tiếp theo không được thực thi và thay vào đó là lệnh NOP Kết quả được đưa vào thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d = 1 Bit trạng thái: không có
Lệnh GOTO
Cú pháp: GOTO k (0 ≤ k ≤ 2047)
Tác dụng: nhảy tới một label được định nghĩa bởi tham số k và 2 bit PCLATH <4:3>
Bit trạng thái: không có
Bit trạng thái: không có
Trang 40Tác dụng: thực hiện phép toán OR giữa hai thanh ghi W và f Kết quả được đưa vào thanh ghi
W nếu d=0 hoặc thanh ghi f nếu d=1
Tác dụng : quay trở về chương trình chính từ một chương trình con
Bit trạng thái: không có
Lệnh RRF
Cú pháp: RRF f,d (0 ≤ f ≤ 127, d∈[0,1])
Tác dụng: dịch phải các bit trong thanh ghi f qua cờ carry Kết quả được lưu trong thanh ghi
W nếu d=0 hoặc thanh ghi f nếu d=1