GIÁO TRÌNH VI ĐIỀU KHIỂN DRAFT ĐƢỜNG KHÁNH SƠN Trang 1 MỤC LỤC MỤC LỤC 1 DANH MỤC HÌNH ẢNH 3 LỜI NÓI ĐẦU 5 Chƣơng 1 TỔNG QUAN VỀ VI ĐIỀU KHIỂN 6 1 1 Khái quát về vi điều khiển 6 1 2 Phân loại vi điều.
TỔNG QUAN VỀ VI ĐIỀU KHIỂN
Khái quát về vi điều khiển
Khái niệm vi xử lý và vi điều khiển
Vi xử lý là thuật ngữ chung trong lĩnh vực công nghệ vi điện tử, mô tả kỹ thuật tích hợp các thành phần xử lý theo chương trình vào các thiết bị khác nhau Trong giai đoạn đầu của sự phát triển, các chip chỉ tích hợp các phần cứng thiết yếu như CPU và mạch giao tiếp, trong khi các thành phần khác như bộ nhớ vẫn phải ghép nối ngoài, gọi là ngoại vi Nhờ tiến bộ vượt bậc của công nghệ tích hợp, các ngoại vi đã được tích hợp vào bên trong IC, hình thành các “vi điều khiển” tích hợp đầy đủ các thành phần cần thiết để điều khiển các thiết bị điện tử, nâng cao hiệu suất và khả năng ứng dụng của các hệ thống vi xử lý.
Vi xử lý là trung tâm xử lý dữ liệu chính của hệ thống, có khả năng thực hiện các phép tính như cộng, trừ, nhân, chia và so sánh Các khối chức năng của vi xử lý bao gồm lấy dữ liệu, xử lý dữ liệu và xuất kết quả ra ngoài sau khi xử lý Tuy nhiên, vi xử lý không thể giao tiếp trực tiếp với các thiết bị ngoại vi mà chỉ nhận và xử lý dữ liệu dựa trên chương trình điều khiển Chương trình này điều phối các mạch logic để vi xử lý hoạt động theo yêu cầu, đảm bảo thực hiện các tác vụ cần thiết một cách chính xác và hiệu quả.
Chương trình gồm các lệnh xử lý dữ liệu được lưu trữ trong bộ nhớ, thực hiện theo trình tự nhận lệnh, giải mã và thực thi lệnh Để điều khiển các thiết bị cuối như động cơ hoặc hiển thị ký tự, vi xử lý cần tích hợp các mạch điện giao tiếp ngoài (thiết bị I/O hoặc ngoại vi) Vi xử lý hoạt động hiệu quả hơn khi là thành phần của hệ thống máy tính lớn, phức tạp, đòi hỏi xử lý các phép tính nhanh và lượng lớn dữ liệu Các hệ thống tự động trong công nghiệp, tổng đài điện thoại, robot hoạt động phức tạp đều dựa trên sự kết hợp giữa vi xử lý và các thiết bị ngoại vi để đảm bảo hiệu quả vận hành cao.
Vi xử lý vượt trội về khả năng tính toán, xử lý và linh hoạt thay đổi chương trình phù hợp với các hệ thống lớn và các bài toán phức tạp Tuy nhiên, đối với các ứng dụng nhỏ, việc tích hợp vi xử lý yêu cầu các khối mạch điện giao tiếp phức tạp, gồm bộ nhớ, mạch điều khiển ngoại vi và các thành phần liên kết với vi xử lý Điều này đòi hỏi nhà thiết kế phải có kiến thức sâu rộng về các thành phần như vi xử lý, bộ nhớ và thiết bị ngoại vi để xây dựng hệ thống đúng chức năng Hệ thống này thường phức tạp, chiếm nhiều không gian, gây khó khăn về mặt kỹ thuật và làm tăng chi phí sản phẩm cuối cùng Do đó, việc ứng dụng trong các hệ thống nhỏ trở nên không khả thi do giá thành cao và yêu cầu cao về trình độ thiết kế.
Vi điều khiển (Microcontroller) là một IC duy nhất tích hợp bộ nhớ và mạch giao tiếp ngoại vi cùng với vi xử lý, giúp tối ưu hóa khả năng hoạt động của thiết bị Với cấu trúc phần cứng đơn giản hơn, vi điều khiển mang lại khả năng điều khiển và xử lý dữ liệu hiệu quả như vi xử lý, nhưng phù hợp hơn cho các ứng dụng cần tích hợp dễ dàng và tiết kiệm không gian.
Vi điều khiển mang lại sự tiện lợi vượt trội cho người dùng nhờ vào khả năng giao tiếp trực tiếp với các thiết bị bên ngoài và cấu trúc mạch điện đơn giản hơn, giúp giảm thiểu kiến thức cần thiết so với sử dụng vi xử lý Dù phần cứng của vi điều khiển được thiết kế dễ dàng sử dụng hơn, nhưng khả năng xử lý của nó có giới hạn về tốc độ và dung lượng chương trình, phù hợp cho các ứng dụng đơn giản Với mức giá phải chăng và độ phổ biến cao, vi điều khiển thường được áp dụng trong các hệ thống cần tính toán không phức tạp, mang lại hiệu quả kinh tế và dễ dàng triển khai trong nhiều lĩnh vực.
Năm 1976, Intel giới thiệu bộ vi điều khiển 8748, mở đầu cho họ vi điều khiển MCS-48 với khả năng xử lý và kích thước được nâng cao Đến năm 1980, Intel phát hành chip 8051 — bộ vi điều khiển đầu tiên thuộc họ MCS-51, trở thành tiêu chuẩn công nghệ cho nhiều vi điều khiển sau này Các hãng sản xuất khác lần lượt ra mắt nhiều dòng vi điều khiển với tính năng cải tiến đáng kể, góp phần thúc đẩy sự phát triển của ngành công nghiệp tự động hóa và điều khiển nhờ các dòng chip tiên tiến này.
Phân loại vi điều khiển và ứng dụng
Dựa vào độ dài của các thanh ghi và các lệnh của vi điều khiển mà người ta chia ra các loại vi điều khiển 8 bit, 16 bit, hay 32 bit
Các loại vi điều khiển 16 bit có độ dài lệnh lớn hơn, khiến các tập lệnh phong phú và đa dạng hơn so với vi điều khiển 8 bit Tuy nhiên, hầu hết các chương trình viết cho vi điều khiển 16 bit vẫn có thể được thực hiện trên vi điều khiển 8 bit bằng cách sử dụng chương trình phù hợp.
Kiến trúc CISC (Complex Instruction Set Computer) và RISC (Reduced Instruction Set Computer)
Vi điều khiển CISC có tập lệnh phức tạp và số lượng lớn các lệnh, giúp lập trình viên linh hoạt và dễ dàng hơn trong việc viết chương trình Trong khi đó, vi điều khiển RISC sở hữu tập lệnh đơn giản với ít lệnh hơn, yêu cầu phần cứng ít hơn, chi phí thấp và hoạt động nhanh hơn so với CISC Tuy nhiên, để sử dụng RISC hiệu quả, người lập trình cần viết các chương trình phức tạp hơn và sử dụng nhiều lệnh hơn.
Kiến trúc Harvard và kiến trúc Vonneumann
Kiến trúc Harvard sử dụng bộ nhớ riêng biệt cho mã lệnh và dữ liệu, giúp quá trình truyền nhận dữ liệu trở nên nhanh chóng và hiệu quả hơn Trong khi đó, kiến trúc Von Neumann dùng chung bộ nhớ cho cả chương trình và dữ liệu, giúp giảm kích thước và chi phí của vi điều khiển.
Một số loại vi điều khiển có trên thị trường:
Họ vi điều khiển MCS-51 do Intel sản xuất lần đầu vào năm 1980 là các IC thiết kế cho các ứng dụng điều khiển, tạo thành hệ thống vi xử lý hoàn chỉnh gồm CPU, bộ nhớ, mạch giao tiếp và điều khiển ngắt MCS-51 sử dụng cơ chế CISC, với các lệnh có độ dài và thời gian thực thi khác nhau, trong đó có các lệnh điều khiển xuất/nhập tác động đến từng bit Bộ vi điều khiển đầu tiên của họ là 8051, với bộ nhớ ROM 4KB và RAM 128 byte, còn 8031 thì không có ROM nội, cần sử dụng bộ nhớ ngoài Sau này, nhiều nhà sản xuất như Siemens, Fujitsu đã phát triển các phiên bản khác của vi điều khiển MCS-51 phù hợp với đa dạng ứng dụng.
MCS-51 là dòng vi điều khiển được cấp phép làm nhà cung cấp thứ hai, bao gồm nhiều phiên bản khác nhau, mỗi phiên bản đều có thêm các thanh ghi điều khiển để nâng cao chức năng hoạt động của hệ thống Trong đó, AT89C51 là một trong những dòng vi điều khiển nổi bật do Atmel sản xuất, sử dụng công nghệ CMOS tiên tiến, đảm bảo hiệu suất bền bỉ và tiêu thụ điện năng thấp.
AVR là kiến trúc Harvard sửa đổi 8-bit RISC đơn chip vi điều khiển được phát triển bởi Atmel vào năm 1996 Các vi điều khiển AVR là một trong những họ đầu tiên sử dụng on-chip bộ nhớ flash để lưu trữ chương trình, khác với các loại ROM, EPROM hoặc EEPROM dùng cho vi điều khiển khác thời điểm đó Đây là kiến trúc Modified Harvard với chương trình và dữ liệu được lưu trữ trong các hệ thống bộ nhớ riêng biệt, nằm trong không gian địa chỉ khác nhau, nhưng vẫn có thể đọc ghi dữ liệu bằng các lệnh đặc biệt.
PIC là họ vi điều khiển RISC do công ty Microchip Technology sản xuất, nổi bật với khả năng tối ưu hóa hiệu suất và tiêu thụ năng lượng Dòng PIC đầu tiên là PIC1650, được phát triển bởi bộ phận Microelectronics Division của General Instrument, đánh dấu bước khởi đầu cho sự phổ biến của dòng vi điều khiển PIC trên thị trường.
PIC bắt nguồn từ chữ viết tắt của "Programmable Intelligent Computer" (Máy tính khả trình thông minh), là sản phẩm đầu tiên của hãng General Instruments mang tên PIC1650 PIC1650 ban đầu được sử dụng để giao tiếp với các thiết bị ngoại vi cho máy chủ 16 bit CP1600, khiến người ta còn gọi PIC với tên gọi liên quan đến chức năng này.
PIC (Peripheral Interface Controller - Bộ điều khiển giao tiếp ngoại vi) là vi điều khiển 8-bit được phát triển từ năm 1975 nhằm hỗ trợ hoạt động xuất nhập cho CPU CP1600, vốn có hiệu suất tốt nhưng kém về khả năng giao tiếp PIC sử dụng microcode đơn giản lưu trong ROM và có kiến trúc RISC thực sự, vận hành một lệnh trong một chu kỳ máy, giúp tối ưu hiệu năng Năm 1985, sau khi General Instruments bán bộ phận vi điện tử của mình và hầu hết các dự án bị hủy bỏ, PIC vẫn tiếp tục phát triển và được bổ sung EEPROM để trở thành bộ điều khiển vào ra khả trình Hiện nay, nhiều dòng PIC đã tích hợp sẵn các module ngoại vi như USART, PWM, ADC, cùng bộ nhớ chương trình từ 512 Word đến 32K Word, đáp ứng đa dạng nhu cầu ứng dụng.
Vi điều khiển là thành phần chính trong thiết kế các loại máy tính nhúng, giúp tối ưu hóa hoạt động của các thiết bị tự động thông minh ngày nay Máy tính nhúng xuất hiện trong hầu hết các thiết bị tự động, từ đó nâng cao hiệu suất và khả năng tự vận hành Sử dụng vi điều khiển, chúng ta có thể thiết kế bộ điều khiển cho các sản phẩm như hệ thống tự động hóa nhà thông minh, thiết bị công nghiệp, ô tô và các thiết bị điện tử tiêu dùng, mang lại giải pháp công nghệ tiên tiến và tiết kiệm năng lượng.
Trong các sản phẩm dân dụng:
- Nhà thông minh: Cửa tự động, khóa số, tự động điều tiết ánh sáng thông minh (bật/tắt đèn theo thời gian, theo cường độ ánh sáng, )
- Điều khiển các thiết bịt từ xa (qua điều khiển, qua tiếng vỗ tay, )
- Điều tiết hơi ẩm, điều tiết nhiệt độ, điều tiết không khí, gió
- Hệ thống vệ sinh thông minh,
- Các loại biển quảng cáo nháy chữ
- Quảng cáo ma trận LED (một màu, 3 màu, đa màu)
- Điều khiển máy cuốn bạt quảng cáo,
Các máy móc dân dụng
- Máy điều tiết độ ẩm cho vườn cây
- Buồng ấp trứng gà/vịt
- Đồng hồ số, đồng hồ số có điều khiển theo thời gian
Các sản phẩm giải trí
- Đầu thu kỹ thuật số, đầu thu set-top-box,
Trong các thiết bị y tế:
- Máy móc thiết bị hỗ trợ: máy đo nhịp tim, máy đo đường huyết, máy huyết áp, điện tim đồ, điện não đồ,…
- Máy chụp chiếu (city, X-quang, )
Các sản phẩm công nghiệp:
- Điều khiển số (PID, mờ, ) ĐƯỜNG KHÁNH SƠN Trang 11
- Đo lường (đo điện áp, đo dòng điện, áp suất, nhiệt độ, )
- Cân băng tải, cân toa xe, cân ô tô,
- Máy cán thép: điều khiển động cơ máy cán, điều khiển máy quấn thép,
- Làm bộ điều khiển trung tâm cho Robot
- Ổn định tốc độ động cơ
- Đếm sản phẩm của 1 nhà máy, xí nghiệp,…
- Máy vận hành tự động (dạng CNC).
Sơ đồ khối của một vi điều khiển
Các hoạt động trong các vi điều khiển diễn ra với tốc độ cao và độ phức tạp tương đối thấp, giúp chúng thực hiện các nhiệm vụ một cách hiệu quả Một vi điều khiển gồm các thành phần chính như bộ xử lý trung tâm (CPU), bộ nhớ lưu trữ, các bộ phận ngoại vi và các cổng vào ra (I/O), góp phần tối ưu hóa hiệu suất hoạt động Nhờ cấu trúc đơn giản cùng khả năng thực hiện các tác vụ nhanh chóng, vi điều khiển ngày càng phổ biến trong các hệ thống điều khiển tự động và thiết bị điện tử thông minh.
Hình 1.1: Cấu trúc chung họ vi điều khiển
ROM là bộ nhớ dùng để lưu giữ chương trình, chứa các bảng số liệu, tham số hệ thống và dữ liệu cố định của hệ thống Trong quá trình hoạt động, nội dung của ROM là cố định và không thể thay đổi, chỉ khi ở chế độ xóa hoặc nạp chương trình mới, nội dung ROM mới có thể được cập nhật.
RAM (bộ nhớ truy cập ngẫu nhiên) là loại bộ nhớ dùng để lưu trữ tạm thời dữ liệu và các kết quả trung gian trong quá trình hoạt động của bộ vi điều khiển Nội dung của RAM sẽ bị xóa hết khi nguồn cung cấp bị tắt, giúp hệ thống hoạt động hiệu quả và dễ dàng quản lý dữ liệu tạm thời.
Các thanh ghi chức năng đặc biệt (SFR)
Thanh ghi chức năng đặc biệt (Special Function Registers) là một phần của bộ nhớ RAM, được nhà sản xuất định trước mục đích sử dụng và không thể thay đổi Các bit của chúng liên kết vật lý với các mạch trong vi điều khiển như bộ chuyển đổi A/D, modul truyền thông nối tiếp, góp phần quan trọng vào hoạt động của hệ thống Mỗi sự thay đổi trạng thái của các bit trong thanh ghi đặc biệt đều tác động trực tiếp đến hoạt động của vi điều khiển hoặc các vi mạch liên quan.
Bộ đếm chương trình (PC: Program Counter)
Bộ đếm chương trình chứa địa chỉ của ô nhớ chứa lệnh tiếp theo sẽ được kích hoạt để xác định phần tử tiếp theo của chương trình Sau mỗi lệnh thực thi, giá trị của bộ đếm chương trình được tăng lên 1, giúp trình xử lý biết vị trí của lệnh tiếp theo cần thực hiện Nhờ cơ chế này, chương trình có thể thực hiện tuần tự các lệnh một cách chính xác và điều khiển luồng thực thi một cách có hệ thống.
Central Processor Unit (CPU) là bộ não của hệ thống, chịu trách nhiệm điều khiển và giám sát tất cả các hoạt động bên trong vi điều khiển CPU hoạt động như trung tâm điều phối, không bị người dùng can thiệp, đảm bảo các quá trình vận hành diễn ra trơn tru và chính xác Với vai trò quan trọng này, CPU đóng vai trò then chốt trong việc đảm bảo hiệu suất và độ ổn định của hệ thống.
Các cổng vào/ra (I/O ports) là thành phần thiết yếu giúp vi điều khiển kết nối và giao tiếp với các thiết bị ngoại vi Mỗi vi điều khiển có các thanh ghi (gọi là cổng) được kết nối trực tiếp với các chân của vi điều khiển, cho phép truyền dữ liệu một cách linh hoạt Cổng vào/ra (I/O port) có khả năng thay đổi chức năng và chiều dữ liệu theo yêu cầu của người dùng, giúp mở rộng khả năng hoạt động của hệ thống vi điều khiển.
Bộ dao động hoạt động như nhạc trưởng trong vi điều khiển, có nhiệm vụ đồng bộ hóa hoạt động của các mạch bên trong Được chế tạo từ thạch anh hoặc gốm để đảm bảo ổn định tần số, bộ dao động giữ vai trò thiết yếu trong việc duy trì nhịp độ hoạt động chính xác của vi điều khiển Các lệnh không thực thi theo tốc độ của bộ dao động mà thường chậm hơn do mỗi câu lệnh qua nhiều bước thực hiện Mỗi loại vi điều khiển yêu cầu số chu kỳ khác nhau để hoàn thành một lệnh, do đó, tần số của bộ dao động ảnh hưởng trực tiếp đến tốc độ xử lý của hệ thống.
Bộ định thời/đếm (Timers/Counters)
Hầu hết các chương trình đều sử dụng các bộ định thời để kiểm soát hoạt động của hệ thống Các bộ định thời thường là các thanh ghi SFR 8 hoặc 16 bit, trong đó giá trị luôn tăng lên sau mỗi xung dao động clock Khi thanh ghi tràn về giới hạn, một ngắt sẽ được phát sinh để xử lý các sự kiện liên quan Điều này giúp hệ thống thực hiện đúng thời gian và đáp ứng chính xác các yêu cầu của ứng dụng.
ADC (Analog-to-digital converter) ĐƯỜNG KHÁNH SƠN Trang 13
Bộ phận chuyển đổi tín hiệu analog sang tín hiệu kỹ thuật số (ADC) là thành phần quan trọng trong vi điều khiển, giúp chuyển đổi các tín hiệu ngoài vào dưới dạng analog thành tín hiệu digital phù hợp với vi xử lý Khi các tín hiệu bên ngoài đi vào vi điều khiển, chúng thường ở dạng analog, đòi hỏi quá trình chuyển đổi để vi điều kiện hiểu và xử lý chính xác hơn ADC đóng vai trò then chốt trong việc chuyển đổi này, đảm bảo dữ liệu chính xác và hiệu quả cho các ứng dụng điều khiển tự động.
KIẾN TRÚC VI ĐIỀU KHIỂN
Khái quát chung
Hiện nay, trên thị trường có nhiều họ vi điều khiển như 8051, Motorola 68HC, AVR, ARM, Tuy nhiên, trong giáo trình này, chúng tôi sẽ tập trung giới thiệu về vi điều khiển PIC do các nguyên nhân đặc thù khiến nó trở thành lựa chọn phù hợp cho học tập và ứng dụng.
Họ vi điều khiển này dễ dàng tìm mua tại thị trường Việt Nam với mức giá hợp lý Sản phẩm sở hữu đầy đủ các tính năng cần thiết để hoạt động độc lập, phù hợp cho các dự án tự chế và ứng dụng công nghiệp.
Họ vi điều khiển PIC hiện đang được sử dụng rộng rãi tại Việt Nam và trên toàn thế giới, giúp các người dùng dễ dàng trong việc nghiên cứu và phát triển các ứng dụng Sự phổ biến của họ vi điều khiển này tạo điều kiện thuận lợi cho việc truy cập lượng lớn tài liệu, các dự án mở đã thành công, cũng như dễ dàng trao đổi, học hỏi và nhận sự hướng dẫn khi gặp khó khăn trong quá trình làm việc.
Sự hỗ trợ của nhà sản xuất về trình biên dịch, các công cụ lập trình, nạp chương trình từ đơn giản đến phức tạp,…
Các tính năng đa dạng của vi điều khiển PIC, và các tính năng này không ngừng đƣợc phát triển.
Giới thiệu vi điều khiển PIC 16F877A
Vi điều khiển thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ dài 14bit, mỗi lệnh được thực thi trong một chu kỳ xung clock Tốc độ hoạt động tối đa của vi điều khiển là 20 MHz, với thời gian của một chu kỳ lệnh là 200ns Bộ nhớ chương trình của vi điều khiển có dung lượng 8K x 14 bit, trong khi bộ nhớ dữ liệu gồm RAM 368 x 8 byte và EEPROM cũng có dung lượng 256 x 8 byte.
Số PORT I/O là 5 với 33 pin I/O Có 8 kênh chuyển đổi A/D
Các đặc tính ngoại vi bao gồm các khối chức năng sau:
- Timer 0: bộ đếm 8 bit với bộ chia tần số 8 bit
Timer 1 là bộ đếm 16 bit tích hợp bộ chia tần số, giúp thực hiện chức năng đếm dựa trên xung clock ngoại vi Điều này cho phép Timer 1 hoạt động chính xác ngay cả khi vi điều khiển ở chế độ ngủ (sleep mode), tiết kiệm năng lượng và duy trì các phép đo thời gian quan trọng.
- Timer 2: 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ỉ ĐƯỜNG KHÁNH SƠN Trang 15
- Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển
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
- Có thể hoạt động với nhiều dạng Oscillator khác nhau ĐƯỜNG KHÁNH SƠN Trang 16
CÁC DẠNG SƠ ĐỒ CHÂN VI ĐIỀU KHIỂN PIC16F877A
Hình 2.1: Các dạng sơ đồ chân của vi điều khiển PIC16F877A/ PIC16F874A ĐƯỜNG KHÁNH SƠN Trang 17
SƠ ĐỒ KHỐI VI ĐIỀU KHIỂN PIC16F877A
Hình 2.2: Sơ đồ khối của vi điều khiển PIC16F877A
- Khối ALU – Arithmetic Logic Unit
- Khối bộ nhớ chứa chương trình – Flash Program Memory
- Khối bộ nhớ chứa dữ liệu EPROM – Data EPROM
- Khối bộ nhớ file thanh ghi RAM – RAM file Register
- Khối giải mã lệnh và điều khiển – Instruction Decode Control ĐƯỜNG KHÁNH SƠN Trang 18
- Khối thanh ghi đặc biệt
- Khối giao tiếp nối tiếp
- Khối chuyển đổi tín hiệu tương tự sang số - ADC
- Khối các port xuất nhập
CHỨC NĂNG CÁC CHÂN CỦA PIC16F877A
Hình 2.3: Chức năng các chân của vi điều khiển PIC16F877A
• Chân OSC1/CLK1(13): ngõ vào kết nối với dao động thạch anh hoặc ngõ vào nhận xung clock từ bên ngoài
• Chân OSC2/CLK2(14): ngõ ra dao động thạch anh hoặc ngõ ra cấp xung clock
• Chân MCLR V / pp (1) có 2 chức năng:
MCLR : ngõ vào reset tích cực ở mức thấp
V pp : ngõ vào nhận điện áp lập trình khi lập trình cho PIC
• Chân RA0/AN0(2), RA1/AN1(3), RA2/AN2(3): có 2 chức năng
RA0,1,2: xuất/ nhập số ĐƯỜNG KHÁNH SƠN Trang 19
AN 0,1,2: ngõ vào tương tự của kênh thứ 0,1,2
Chân RA2/AN2/VREF-/CVREF+(4) là các chân sử dụng để xuất nhập số liệu hoặc ngõ vào tín hiệu tương tự của kênh thứ hai Chân này còn đóng vai trò là ngõ vào điện áp chuẩn thấp hoặc ngõ vào điện áp chuẩn cao của bộ AD, giúp thiết lập và điều chỉnh các mức điện áp chuẩn cho phép đo lường chính xác trong hệ thống.
• Chân RA3/AN3/VREF+(5): xuất nhập số/ ngõ vào tương tự kênh 3/ ngõ vào điện áp chuẩn (cao) của bộ AD
• Chân RA4/TOCK1/C1OUT(6): xuất nhập số/ ngõ vào xung clock bên ngoài cho Timer 0/ ngõ ra bộ so sánh 1
• Chân RA5/AN4/ SS / C2OUT(7): xuất nhập số/ ngõ vào tương tự kênh 4/ ngõ vào chọn lựa SPI phụ/ ngõ ra bộ so sánh 2
• Chân RB0/INT (33): xuất nhập số/ ngõ vào tín hiệu ngắt ngoài
• Chân RB1(34), RB2(35): xuất nhập số
• Chân RB3/PGM(36): xuất nhập số/ cho phép lập trình điện áp thấp ICSP
• Chân RB4(37), RB5(38): xuất nhập số
• Chân RB6/PGC(39): xuất nhấp số/ mạch gỡ rối và xung clock lập trình ICSP
• Chân RB7/PGD(40): xuất nhập số/ mạch gỡ rối và dữ liệu lập trình ICSP
• Chân RC0/T1OCO/T1CKI(15): xuất nhập số/ ngõ vào bộ giao động Timer 1/ngõ vào xung clock bên ngoài Timer 1
• Chân RC1/T1OSI/CCP2(16) : xuất nhập số/ ngõ vào bộ dao động Timer 1/ngõ vào Capture2, ngõ ra compare2, ngõ ra PWM2
• Chân RC2/CCP1(17): xuất nhập số/ ngõ vào Capture1 ,ngõ ra compare1, ngõ ra PWM1
Chân RC3/SCK/SCL(18) có chức năng xuất nhập số/ngõ vào xung clock nối tiếp đồng bộ, phù hợp cho các giao thức SPI và I2C Ngõ ra của chân này có thể hoạt động theo chế độ SPI hoặc chế độ I2C, tùy thuộc vào cấu hình và ứng dụng của thiết bị Đây là chân quan trọng trong việc điều khiển truyền dữ liệu đồng bộ giữa các linh kiện điện tử.
• Chân RC4/SDI/SDA(23): xuất nhập số/ dữ liệu vào SPI/ xuất nhập dữ liệu I2C
• Chân RC5/SDO(24): xuất nhập số/ dữ liệu ra SPI
• Chân RC6/TX/CK(25): xuất nhập số/ truyền bất đồng bộ USART/ xung đồng bộ USART
• Chân RC7/RX/DT(26): xuất nhập số/ nhận bất đồng bộ USART
• Chân RD0-7/PSP0-7(19-30): xuất nhập số/ dữ liệu port song song ĐƯỜNG KHÁNH SƠN Trang 20
• Chân RE0/ RD /AN5(8): xuất nhập số/ điều khiển port song song/ ngõ vào tương tự 5
• Chân RE1/ WR /AN6(9): xuất nhập số/ điều khiển ghi port song song/ ngõ vào tương tự kênh thứ 6
• Chân RE2/ CS /AN7(10): xuất nhấp số/ Chân chọn lụa điều khiển port song song/ ngõ vào tương tự kênh thứ 7
• Chân VDD(11, 32) và VSS(12, 31): là các chân nguồn của PIC.
Tổ chức bộ nhớ
Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình (Program memory) và bộ nhớ dữ liệu (Data Memory)
Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ flash có dung lượng 8K word (mỗi word gồm 14 bit) Bộ nhớ này được chia thành nhiều trang, từ trang 0 đến trang 3, giúp quản lý và truy cập dữ liệu dễ dàng hơn trong quá trình lập trình.
Bộ nhớ chương trình có khả năng chứa đến 8.192 lệnh, vì mỗi lệnh đã được mã hóa với dung lượng 1 từ (14 bit) Để mã hóa chính xác địa chỉ của bộ nhớ 8K từ, bộ đếm chương trình (PC) cần có dung lượng 13 bit (PC ) Điều này giúp đảm bảo việc truy cập và quản lý địa chỉ trong bộ nhớ được chính xác và hiệu quả.
Khi vi điều khiển được reset, bộ đếm chương trình sẽ tự động nhảy đến địa chỉ 0000h (Reset vector) để bắt đầu thực thi Trong trường hợp xảy ra ngắt, bộ đếm chương trình sẽ chuyển đến địa chỉ 0004h (Interrupt vector) để xử lý các yêu cầu ngắt Điều này giúp đảm bảo quá trình khởi động và xử lý ngắt diễn ra chính xác và hiệu quả.
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, trong khi bộ nhớ stack sẽ được đề cập rõ hơn trong phần sau của nội dung.
Hình 2.4: Bộ nhớ chương trình PIC16F877A
Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia thành nhiều bank, trong đó PIC16F877A có tổng cộng 4 bank mỗi bank có dung lượng 128 byte Mỗi bank chứa các thanh ghi đặc biệt SFR (Special Function Register) nằm ở vùng địa chỉ thấp và các thanh ghi mục đích chung GPR (General Purpose Register) ở vùng địa chỉ còn lại trong cùng bank Các thanh ghi SFR quan trọng như thanh ghi STATUS được đặt ở tất cả các bank để thuận tiện trong quá trình truy xuất và giảm thiểu số lệnh trong chương trình.
Sơ đồ cụ thể của bộ nhớ dữ liệu PIC16F877A nhƣ sau: ĐƯỜNG KHÁNH SƠN Trang 22
Hình 2.5: Bộ nhớ dữ liệu PIC16F877A
2.3.2.1 Thanh ghi chức năng đặc biệt SFR Đây là các thanh ghi đƣợc sử dụng bởi CPU hoặc đƣợc dùng để thiết lập và điều khiển các khối chức năng đƣợc tích hợp bên trong vi điều khiển Có thể phân thanh ghi SFR làm hai loại: thanh ghi SFR liên quan đến các chức năng bên trong (CPU) và thanh ghi SFR dùng để thiết lập và điều khiển các khối chức năng bên ngoài (ví dụ nhƣ ADC, PWM, …) Phần này sẽ đề cập đến các thanh ghi liên quan đến các chức năng bên trong Các thanh ghi dùng để thiết lập và điều khiển các khối chức năng sẽ đƣợc nhắc đến khi ta đề cập đến các khối chức năng đó ĐƯỜNG KHÁNH SƠN Trang 23
Thanh ghi STATUS (03h, 83h, 103h, 183h) lưu trữ kết quả thực hiện phép toán của khối ALU, trạng thái reset của hệ thống và các bit chọn bank cần truy xuất trong bộ nhớ dữ liệu, đóng vai trò quan trọng trong quá trình xử lý dữ liệu và điều hướng bộ nhớ.
Thanh ghi OPTION_REG (81h, 181h) cho phép đọc và ghi, kiểm soát chức năng pull-up của các chân PORTB, và thiết lập các tham số liên quan đến xung tác động, cạnh tác động của ngắt ngoại vi, cùng bộ đếm Timer 0 Đây là các thiết lập quan trọng giúp tối ưu hóa hoạt động của vi điều khiển trong các ứng dụng khác nhau.
Thanh ghi INTCON (0Bh, 8Bh, 10Bh, 18Bh) là các thanh ghi cho phép đọc và ghi, chứa các bit điều khiển và các bit cờ hiệu quan trọng trong việc quản lý hoạt động của vi điều khiển Những bit trong thanh ghi này kiểm soát các sự kiện như tràn timer 0, ngắt ngoài RB0/INT, và ngắt theo chế độ on-change tại các chân của PORTB Nhờ vào việc thiết lập và đọc các bit trong INTCON, người dùng có thể dễ dàng xử lý các ngắt và sự kiện ngoại vi, tăng tính linh hoạt và hiệu quả cho hệ thống điều khiển.
Thanh ghi PIE1(8Ch): chứa các bit điều khiển chi tiết các ngắt của các khối chức năng ngoại vi
Thanh ghi PIR1(0Ch) lưu trữ cờ ngắt của các khối chức năng ngoại vi, cho phép xác định các sự kiện ngắt xảy ra Các ngắt này chỉ được phép hoạt động khi các bit điều khiển trong thanh ghi PIE1 đã được kích hoạt, đảm bảo quản lý chính xác các ngắt ngoại vi trên hệ thống.
Thanh ghi PIE2 (8Dh) chứa các bit điều khiển các ngắt của các khối chức năng như CCP2, SSP bus, ngắt của bộ so sánh và ngắt ghi vào bộ nhớ EEPROM, đóng vai trò quan trọng trong quản lý các ngắt của hệ thống.
Thanh ghi PIR2(0Dh) lưu trữ các cờ ngắt của các khối chức năng ngoại vi, giúp quản lý và xử lý các sự kiện ngắt từ các thiết bị ngoại vi một cách hiệu quả Các ngắt trong thanh ghi này được kích hoạt hoặc vô hiệu hóa thông qua các bit điều khiển trong thanh ghi PIE2, đảm bảo sự kiểm soát chính xác trong quá trình vận hành hệ thống.
Thanh ghi PCON(8Eh): chứa các cờ hiệu cho biết trạng thái các chế độ reset của vi điều khiển
2.3.2.2 Thanh ghi mục đích chung GPR
Các thanh ghi này có thể truy cập trực tiếp hoặc gián tiếp thông qua thanh ghi FSR (File Select Register), là các thanh ghi dữ liệu thông thường dùng để lưu trữ biến số, hằng số, kết quả hoặc tham số phục vụ chương trình Người dùng có thể tùy biến các thanh ghi này theo mục đích của chương trình để đáp ứng các yêu cầu xử lý dữ liệu khác nhau.
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 thực hiện lệnh CALL hoặc xảy ra ngắt, giá trị của bộ đếm chương trình PC tự động được lưu vào stack để đảm bảo trạng thái của chương trình được lưu trữ chính xác Các lệnh như RETURN, RETLW, hay RETFIE sẽ tự động lấy giá trị PC từ trong stack, giúp vi điều khiển tiếp tục thực thi chương trình theo trình tự đã định trước.
Bộ nhớ Stack trong vi điều khiển PIC họ 16F87xA có khả năng lưu trữ 8 địa chỉ, hoạt động theo cơ chế xoay vòng để tối ưu hóa bộ nhớ Khi bộ nhớ Stack đầy, giá trị mới sẽ ghi đè lên giá trị cũ theo quy trình lặp vòng, cụ thể là giá trị lần thứ 9 sẽ ghi đè lên giá trị ban đầu, và giá trị lần thứ 10 sẽ thay thế cho giá trị đã được lưu từ lần thứ 2, đảm bảo hiệu quả trong quản lý bộ nhớ trong các ứng dụng điều khiển tự động.
Các cổng xuất nhập của PIC 16F877A
Cổng xuất nhập (I/O port) là phương tiện chính để vi điều khiển tương tác với thế giới bên ngoài, giúp thể hiện rõ chức năng của vi điều khiển thông qua các hoạt động đa dạng.
Cổng xuất nhập của vi điều khiển gồm nhiều chân I/O, với số lượng tùy thuộc vào cách bố trí và chức năng của từng loại vi điều khiển Một số chân còn có thêm các chức năng khác do đặc tính giao tiếp ngoại vi tích hợp sẵn, giúp thể hiện các tác động của ngoại vi ra bên ngoài Chức năng của từng chân xuất nhập có thể được xác lập và điều khiển dễ dàng thông qua các thanh ghi SFR liên quan, mở rộng khả năng điều khiển và tùy biến của hệ thống.
Vi điều khiển PIC16F877A sở hữu 5 cổng xuất nhập chính gồm PORTA, PORTB, PORTC, PORTD và PORTE, đảm bảo khả năng điều khiển linh hoạt các thiết bị ngoại vi Mỗi cổng có cấu trúc và chức năng riêng biệt, sẽ được trình bày chi tiết trong phần tiếp theo để người dùng hiểu rõ cách sử dụng và ứng dụng của từng cổng trong dự án điều khiển tự động Việc nắm vững cấu trúc và chức năng các cổng này là yếu tố quan trọng để tối ưu hoá hiệu quả lập trình và vận hành của vi điều khiển PIC16F877A trong các dự án điện tử và tự động hóa.
PORTA (RPA) gồm 6 chân I/O, là các chân “hai chiều” (bidirectional pin) có thể vừa xuất vừa nhập dữ liệu, giúp tăng tính linh hoạt trong thiết kế mạch Chức năng của các chân I/O này được kiểm soát bởi thanh ghi TRISA tại địa chỉ 85h, cho phép người dùng xác định chân nào là input hoặc output phù hợp với yêu cầu của dự án Để đặt chức năng của một chân trong PORTA thành input, ta cần thiết lập phù hợp trong thanh ghi TRISA, đảm bảo hoạt động chính xác và hiệu quả của hệ thống.
Trong điều khiển các chân của bộ vi điều khiển, bit "set" trong thanh ghi TRISA được sử dụng để chỉ định chân đó là đầu vào (input), còn để thiết lập chân đó là đầu ra (output), ta "clear" bit điều khiển tương ứng trong TRISA Thao tác này áp dụng tương tự cho các PORT và các thanh ghi điều khiển liên quan như TRISB, TRISC, TRISD, và TRISE, giúp quản lý dễ dàng các chân của các port khác nhau trên vi điều khiển.
PORTA serves as an output port for the ADC module, the comparator, and provides analog and clock input connections for Timer 0 Additionally, it functions as an input for the MSSP (Master Synchronous Serial Port) communication interface These features will be explained in more detail in the subsequent sections.
Các thanh ghi SFR liên quan đến PORTA bao gồm:
- PORTA (địa chỉ 05h) : chứa giá trị các pin trong PORTA
- TRISA (địa chỉ 85h) : điều khiển xuất nhập
- CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh
- CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển bộ so sánh điện áp
- ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển bộ ADC ĐƯỜNG KHÁNH SƠN Trang 26
PORTB (RPB) gồm 8 chân I/O, được điều khiển bởi thanh ghi TRISB, giúp quản lý hướng nhập xuất dữ liệu Một số chân của PORTB còn được sử dụng trong quá trình nạp chương trình cho vi điều khiển với các chế độ khác nhau Ngoài ra, PORTB còn liên quan đến ngắt ngoại vi và bộ đếm thời gian Timer 0, hỗ trợ các chức năng ứng dụng phức tạp PORTB còn tích hợp chức năng điện trở kéo lên, được điều khiển linh hoạt bởi chương trình để đảm bảo tín hiệu ổn định và phù hợp với thiết kế hệ thống.
Các thanh ghi SFR liên quan đến PORTB bao gồm:
- PORTB (địa chỉ 06h,106h) : chứa giá trị các pin trong PORTB
- TRISB (địa chỉ 86h,186h) : điều khiển xuất nhập
- OPTION_REG (địa chỉ 81h,181h) : điều khiển ngắt ngoại vi và bộ Timer 0
PORTC (RPC) gồm 8 chân I/O, dễ dàng điều khiển qua thanh ghi TRISC Ngoài ra, PORTC còn tích hợp các chân chức năng quan trọng của bộ so sánh, bộ Timer 1, bộ PWM giúp nâng cao khả năng xử lý tín hiệu Các chân này còn hỗ trợ các chuẩn giao tiếp nối tiếp như I2C, SPI, SSP và USART, giúp mở rộng khả năng kết nối và giao tiếp của vi điều khiển trong các dự án điện tử và tự động hóa.
Các thanh ghi điều khiển liên quan đến PORTC:
- PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORTC
- TRISC (địa chỉ 87h) : điều khiển xuất nhập
PORTD (RPD) gồm 8 chân I/O, thanh ghi điều khiển xuất nhập tương ứng là TRISD PORTD còn là cổng xuất dữ liệu của chuẩn giao tiếp PSP (Parallel Slave Port)
Các thanh ghi liên quan đến PORTD bao gồm:
- Thanh ghi PORTD : chứa giá trị các pin trong PORTD
- Thanh ghi TRISD : điều khiển xuất nhập
PORTE (RPE) gồm 3 chân I/O, trong đó thanh ghi điều khiển xuất nhập là TRISE, giúp quản lý hoạt động của các chân này Các chân của PORTE có khả năng nhận tín hiệu vào (ngõ vào analog), mở rộng tính năng xử lý đa dạng của hệ thống Ngoài ra, PORTE còn đảm nhiệm chức năng điều khiển trong chuẩn giao tiếp PSP, góp phần nâng cao khả năng kết nối và truyền dữ liệu hiệu quả cho hệ thống của bạn.
Các thanh ghi liên quan đến PORTE bao gồm:
- PORTE : chứa giá trị các chân trong PORTE
- TRISE : điều khiển xuất nhập và xác lập các thông số cho chuẩn giao tiếp PSP
- ADCON1 : thanh ghi điều khiển khối ADC ĐƯỜNG KHÁNH SƠN Trang 27
Hoạt động 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)
MCLR reset trong quá trình hoạt động
MCLR 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
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 TO và PD thể hiện trạng thái hoạt động và trạng thái reset của vi điều khiển, đồng thời được điều khiển bởi CPU để đảm bảo quá trình khởi động và vận hành hệ thống chính xác.
Khi pin MCLR ở mức logic thấp, vi điều khiển sẽ được reset, giúp khởi động lại hệ thống hiệu quả Tín hiệu reset này cần được cung cấp bởi một mạch ngoại vi với các yêu cầu cụ thể, đảm bảo tín hiệu đủ mạnh và ổn định để thực hiện chức năng reset chính xác Việc kiểm soát pin MCLR đúng cách là yếu tố quan trọng trong quá trình lập trình và hoạt động của vi điều khiển, giúp duy trì độ tin cậy của hệ thống.
Không nên nối pin MCLR trực tiếp đến nguồn VDD để tránh gây hỏng hóc cho vi điều khiển R1 phải có giá trị nhỏ hơn 40 K ohm để đảm bảo các đặc tính điện tử của vi điều khiển hoạt động ổn định Đồng thời, R2 cần có giá trị lớn hơn 1 K ohm nhằm hạn chế dòng điện đi vào vi điều khiển, bảo vệ mạch khỏi quá tải.
Hình 2.6: Mạch reset qua pin MCLR
MCLR 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 pin MCLR
Power-on reset (POR) là xung reset do vi điều khiển tạo ra khi phát hiện nguồn cung cấp VDD, giúp đảm bảo các tham số về dòng điện và điện áp để vi điều khiển hoạt động bình thường Khi các tham số này không đảm bảo, xung reset POR sẽ đưa vi điều khiển trở về trạng thái reset, chỉ cho phép hoạt động lại khi các tham số đã ổn định.
Power-up Timer (PWRT) là bộ định thời hoạt động dựa vào mạch RC bên trong vi điều khiển, có tác dụng đảm bảo thiết bị chuẩn bị hoạt động đúng cách sau khi khởi động Khi PWRT được kích hoạt, nó sẽ đưa vi điều khiển về trạng thái reset, giúp ổn định quá trình khởi động và tránh các lỗi không mong muốn Việc sử dụng PWRT trong thiết kế vi điều khiển giúp tăng độ ổn định và an toàn cho hệ thống trong quá trình vận hành.
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
Sau khi PWRT ngừng tác động, oscillator duy trì 1024 chu kỳ xung để đảm bảo tính ổn định của tín hiệu Tác động của OST còn ảnh hưởng đến quá trình reset POR và khi vi điều khiển được đánh thức từ chế độ sleep, giúp duy trì hoạt động ổn định của hệ thống Chức năng OST chủ yếu tác động trên các loại oscillator như XT, HS và LP, đảm bảo hệ thống hoạt động chính xác và tin cậy.
Brown-out reset (BOR) xảy ra khi điện áp VDD giảm xuống dưới mức VBOR (khoảng 4V) và duy trì trong hơn thời gian tối đa TBOR (khoảng 100 us), dẫn đến vi điều khiển được kích hoạt và đưa về trạng thái reset BOR Nếu điện áp sụt giảm xuống dưới VBOR trong thời gian ngắn hơn TBOR, vi điều khiển không bị reset Khi nguồn cung cấp đủ điện áp, PWRT được kích hoạt để tạo một khoảng trễ khoảng 72ms, nhưng nếu trong khoảng thời gian này điện áp giảm xuống dưới VBOR, BOR reset sẽ được kích hoạt trở lại Lưu ý rằng khi BOR reset được phép, PWRT vẫn hoạt động bất chấp trạng thái của bit PWRT.
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:
PWRT (nếu đƣợc cho phép hoạt động) tạo ra khoảng thời gian delay TPWRT để ổn định nguồn cung cấp
OST, khi được phép hoạt động, tạo ra khoảng thời gian delay 1024 chu kỳ xung của oscillator nhằm ổn định tần số của ổn áp Sau khoảng thời gian này, vi điều khiển mới bắt đầu hoạt động bình thường, đảm bảo tín hiệu ổn định để xử lý các lệnh Thẻ ghi điều khiển và trạng thái nguồn cung cấp cho vi điều khiển được lưu trong thanh ghi PCON, giúp kiểm soát và quản lý nguồn năng lượng hiệu quả (ĐƯỜNG KHÁNH SƠN, Trang 29)
Hình 2.7: Sơ đồ các chế độ reset của PIC 16F877A
Chế độ tiết kiệm năng lƣợng
Khi lệnh SLEEP được thực thi, vi điều khiển chuyển sang chế độ tiết kiệm năng lượng, trong đó bộ đếm của WDT bị xóa nhưng WDT vẫn tiếp tục hoạt động Đồng thời, bit PD (STATUS) được reset về 0 và bit TO được thiết lập, oscillator ngừng tác động và các PORT giữ nguyên trạng thái ban đầu, giúp giảm tiêu thụ điện năng mà vẫn duy trì được các chức năng cần thiết.
Khi vi điều khiển ở chế độ ngủ (SLEEP), dòng điện cung cấp rất thấp, do đó cần thực hiện các bước cần thiết trước khi đưa vi điều khiển vào chế độ SLEEP để đảm bảo hoạt động chính xác Điều này giúp giảm tiêu thụ năng lượng hiệu quả và duy trì các chức năng quan trọng của hệ thống Việc chuẩn bị trước khi chuyển sang chế độ SLEEP là bước quan trọng để tối ưu hoá hiệu suất hoạt động của dự án của bạn.
- Đƣa tất cả các pin về trạng thái VDD hoặc VSS
Trong thiết kế hệ thống, cần đảm bảo rằng không có mạch ngoại vi nào được điều khiển bởi dòng điện của vi điều khiển, vì dòng điện nhỏ không đủ khả năng cung cấp năng lượng cần thiết để các mạch ngoại vi hoạt động hiệu quả Việc này giúp duy trì hoạt động ổn định của toàn bộ hệ thống và tránh gây quá tải cho vi điều khiển Tiếp xúc trực tiếp giữa dòng điện của vi điều khiển và các mạch ngoại vi có thể dẫn đến lỗi hoặc hỏng hóc, do đó cần sử dụng các phương pháp cách ly phù hợp như transistor hoặc relay Bảo đảm dòng điện cung cấp cho các mạch ngoại vi phù hợp là yếu tố quan trọng để đảm bảo hiệu suất và độ bền của hệ thống điện tử.
- Tạm ngƣng hoạt động của khối A/D và không cho phép các xung clock từ bên ngoài tác động vào vi điều khiển
- Để ý đến chức năng kéo lên điện trở ở PORTB
- Pin MCLR phải ở mức logic cao
“ĐÁNH THỨC” VI ĐIỀU KHIỂN
Vi điều khiển có thể được “đánh thức” dưới tác động của một trong số các hiện ĐƯỜNG KHÁNH SƠN Trang 30 tƣợng sau:
- Tác động của reset ngoại vi thông qua pin
- Tác động của WDT khi bị tràn
- Tác động từ các ngắt ngoại vi từ PORTB (PORTB Interrupt on change hoặc pin INT)
Các bit PD và TO thể hiện trạng thái của vi điều khiển và phát hiện nguồn tác động làm reset thiết bị Khi vi điều khiển được cấp nguồn, các bit này sẽ được thiết lập, còn khi ở chế độ ngủ (sleep), chúng sẽ được reset về 0 Ngoài ra, các bit này cũng được reset về 0 khi WDT (Watchdog Timer) tác động do bộ đếm bị tràn, giúp theo dõi và xử lý các trạng thái reset một cách chính xác.
Ngoài ra còn có một số nguồn tác động khác từ các chức năng ngoại vi bao gồm:
1) Đọc hay ghi dữ liệu thông qua PSP (Parallel Slave Port)
2) Ngắt Timer 1 khi hoạt động ở chế độ đếm bất đồng bộ
3) Ngắt CCP khi hoạt động ở chế độ Capture
4) Các hiện tƣợng đặc biệt làm reset Timer 1 khi hoạt động ở chế độ đếm bất đồng
5) bộ dùng nguồn xung clock ở bên ngoài)
6) Ngắt SSP khi bit Start/Stop đƣợc phát hiện
7) SSP hoạt động ở chế độ Slave mode khi truyền hoặc nhận dữ liệu
8) Tác động của USART từ các pin RX hay TX khi hoạt động ở chế độ Slavemode đồng bộ
9) Khối chuyển đổi A/D khi nguồn xung clock hoạt động ở dạng RC
10) Hoàn tất quá trình ghi vào EEPROM
11) Ngõ ra bộ so sánh thay đổi trạng thái
Các tác động ngoại vi khác không làm thức tỉnh vi điều khiển khi ở chế độ sleep, vì các xung clock cung cấp cho vi điều khiển vẫn hoạt động trong trạng thái này Đồng thời, cần phải cho phép các ngắt hoạt động trước khi lệnh SLEEP được thực thi để đảm bảo các tác động của ngắt được thực hiện đúng.
Việc đánh thức vi điều khiển từ các ngắt vẫn được thực thi bất chấp trạng thái của bit GIE Khi bit GIE bằng 0, vi điều khiển sẽ tiếp tục thực thi lệnh sau lệnh SLEEP của chương trình vì chế độ ngắt bị vô hiệu hóa Ngược lại, nếu bit GIE đã được thiết lập trước khi lệnh SLEEP được thực thi, vi điều khiển sẽ thực hiện lệnh tiếp theo rồi nhảy đến địa chỉ chứa chương trình ngắt (0004h).
Trong các trường hợp lệnh tiếp theo không ảnh hưởng quan trọng đến chương trình, nên đặt lệnh NOP sau lệnh SLEEP để bỏ qua tác động của lệnh này, giúp kiểm soát hoạt động của chương trình ngắt dễ dàng hơn Tuy nhiên, cần lưu ý rằng việc sử dụng lệnh NOP sau SLEEP cần cân nhắc kỹ để đảm bảo hiệu quả hoạt động của hệ thống.
Nếu ngắt xảy ra trước khi lệnh SLEEP được thực thi, lệnh SLEEP không được thực hiện và thay vào đó là lệnh NOP, đồng thời các tác động của lệnh SLEEP cũng sẽ bị bỏ qua Điều này đảm bảo quá trình thực thi của hệ thống diễn ra chính xác và hiệu quả.
Khi ngắt xảy ra trong hoặc sau khi lệnh SLEEP được thực thi, vi xử lý sẽ nhanh chóng tỉnh dậy từ chế độ ngủ và lệnh SLEEP sẽ tiếp tục được thực hiện ngay sau đó Để kiểm tra xem lệnh SLEEP đã được thực thi hay chưa, ta kiểm tra bit PD; nếu bit này vẫn giữ giá trị 1, điều đó có nghĩa là lệnh SLEEP chưa được thực thi và hệ thống đã thực hiện lệnh NOP thay thế.
Để đảm bảo thời điểm vi điều khiển được đánh thức bởi WDT, chúng ta cần xóa WDT trước khi thực hiện lệnh SLEEP Việc này giúp xác định chính xác thời điểm WDT đã bị tắt, từ đó kiểm soát tốt hơn quá trình thức dậy của hệ thống khi có tác động từ WDT.
PIC16F877A có khả năng sử dụng một trong 4 loại oscillator, đó là:
- XT: Thạch anh bình thường
Mạch RC (Resistor/Capacitor) tạo ra dao động nhờ vào các thành phần điện trở và tụ điện, phù hợp cho các ứng dụng không cần tần số cao Đối với các loại oscillator LP, HS, XT, chúng được kết nối vào vi điều khiển qua các chân OSC1/CLKI và OSC2/CLKO để cung cấp xung đồng bộ Trong các ứng dụng không yêu cầu tốc độ cao, mạch oscillator RC có thể làm nguồn xung hoạt động cho vi điều khiển Tần số dao động do mạch RC tạo ra phụ thuộc vào giá trị điện áp, điện trở, tụ điện, đồng thời còn bị ảnh hưởng bởi các yếu tố như nhiệt độ, chất lượng linh kiện qua các chân OSC1/CLKI và OSC2/CLKO.
Các linh kiện sử dụng cho mạch RC oscillator phải bảo đảm các giá trị sau:
3 K < REXT< 100 K CEXT >20 pF ĐƯỜNG KHÁNH SƠN Trang 32
LẬP TRÌNH CHO VI ĐIỀU KHIỂN
Giới thiệu các phần mềm lập trình và mô phỏng
Vi điều khiển là một IC lập trình, yêu cầu lập trình trước khi sử dụng để điều khiển các thiết bị điện tử Mỗi phần cứng cần có chương trình phù hợp để hoạt động chính xác Do đó, người lập trình cần hiểu rõ cấu tạo phần cứng và các yêu cầu của mạch điện để viết chương trình hiệu quả.
Chương trình là tập hợp các lệnh được sắp xếp theo trình tự hợp lý nhằm giải quyết các yêu cầu của người lập trình Tập hợp các lệnh này gọi là tập lệnh, giúp thực thi các nhiệm vụ một cách có tổ chức và hiệu quả.
Lệnh của vi điều khiển là các số nhị phân 8 bit, còn gọi là mã máy, có phạm vi từ 00000000b đến 11111111b Các mã lệnh này được lưu trữ trong ROM, đóng vai trò quan trọng trong quá trình điều khiển thiết bị Khi thực thi chương trình, vi điều khiển sẽ đọc, giải mã và thực hiện các lệnh dựa trên các mã nhị phân này, đảm bảo hoạt động chính xác và hiệu quả.
Vi điều khiển sử dụng các lệnh dạng số nhị phân dài và khó nhớ, gây khó khăn trong việc gỡ lỗi chương trình khi gặp lỗi Để giải quyết vấn đề này, máy tính hỗ trợ người viết chương trình bằng cách dùng các ngôn ngữ lập trình cấp cao, giúp viết mã dễ hiểu và quản lý hơn Sau khi hoàn tất, các trình biên dịch tự động chuyển các câu lệnh cấp cao thành mã máy phù hợp với vi điều khiển Các mã máy này sau đó được lưu trữ trong bộ nhớ ROM của vi điều khiển để thực thi chương trình Tuy nhiên, máy tính không thể trực tiếp thực thi các mã máy này do chúng không tương thích phần cứng, yêu cầu các chương trình mô phỏng riêng để vận hành.
Chương trình cho vi điều khiển có thể viết bằng Assembly, C++,C,Visual Basic, hoặc bằng các ngôn ngữ cấp cao khác
Assembly là ngôn ngữ lập trình cấp thấp giúp mỗi lệnh chương trình tương ứng với một lệnh mà bộ xử lý có thể thực hiện, mang lại mã gọn, ít chiếm dụng bộ nhớ và hoạt động với tốc độ nhanh hơn so với ngôn ngữ bậc cao Đây là ngôn ngữ gần với ngôn ngữ máy, cần chuyển đổi sang mã máy của vi điều khiển qua chương trình dịch Assembler, như Macro Assembler Các mã lệnh sau khi dịch sẽ được nạp vào ROM của vi điều khiển để thực hiện chức năng, giúp tối ưu hiệu suất và hiệu quả hoạt động của các thiết bị điện tử.
Để soạn thảo chương trình, bạn có thể sử dụng Notepad hoặc các phần mềm soạn thảo hỗ trợ sử dụng bộ ký tự ASCII và lưu với đuôi "tên.asm" Ngoài ra, có thể sử dụng các phần mềm tích hợp sẵn chương trình dịch Assembler dành riêng cho vi điều khiển, phù hợp với các họ vi điều khiển khác nhau, như lập trình cho AVR bằng BascomAVR, CodevisionAVR, hay WinAVR; lập trình cho PIC bằng CCS, MPLAB, PIC C compiler; hoặc cho vi điều khiển 8051 bằng Keil C Hầu hết các trình biên dịch đều tích hợp sẵn chương trình nạp chip hỗ trợ nhiều loại mạch nạp, và trong trường hợp cần thiết, bạn có thể sử dụng các phần mềm nạp khác để nạp chương trình dễ dàng hơn.
Trình biên dịch, ngôn ngữ lập trình cho vi điều khiển
Ngôn ngữ lập trình cho vi điều khiển PIC có 2 loại:
- Ngôn ngữ lập trình cấp thấp-Hợp ngữ: có phần mềm MPLAB
Ngôn ngữ lập trình bậc cao, như CCS, HTPIC, PIC BASIC, được phát triển dựa trên ngôn ngữ C, giúp người học và lập trình viên hiểu rõ cấu trúc bên trong của vi điều khiển PIC và tối ưu hóa bộ nhớ chương trình Mặc dù hợp ngữ giúp tối ưu bộ nhớ nhưng phương pháp này khá khó khăn và hạn chế trong việc phát triển ứng dụng, đồng thời tốn nhiều thời gian Chính vì vậy, giáo trình này tập trung vào sử dụng ngôn ngữ bậc cao, cụ thể là CCS, để nghiên cứu và phát triển các ứng dụng trên PIC một cách dễ dàng và hiệu quả hơn Ưu điểm của CCS là giúp lập trình viên dễ dàng viết và tối ưu mã nguồn, từ đó nâng cao hiệu suất phát triển các ứng dụng điều khiển vi xử lý PIC.
- Kế thừa tất cả đặc điểm của ngôn ngữ C- là ngôn ngữ cơ bản, quen thuộc mà sinh viên đã đƣợc đào tạo
Để nâng cao hiệu quả trong lập trình vi điều khiển PIC, chúng tôi đã xây dựng sẵn các hàm chức năng đặc biệt như ADC, PWM, RS232 và SPI, giúp người dùng dễ dàng tích hợp và sử dụng các khối chức năng này trong dự án của mình Việc chuẩn bị sẵn các hàm này không những tiết kiệm thời gian phát triển mà còn đảm bảo tính ổn định và chính xác khi điều khiển các thiết bị ngoại vi của PIC Các hàm đã được tối ưu hóa để phù hợp với các yêu cầu của vi điều khiển PIC, giúp lập trình viên dễ dàng thao tác và nâng cao hiệu suất của hệ thống Đây là giải pháp tối ưu cho quá trình phát triển các ứng dụng tự động hóa, đo lường và điều khiển dựa trên vi điều khiển PIC.
- Có khả năng kết hợp với ngôn ngữ hợp ngữ, tạo sự mềm dẻo trong phát triển ứng dụng
- Khả năng phát triển, nâng cấp ứng dụng là dễ dàng
- Ngày càng đƣợc cập nhật với nhiều tính năng ƣu việt và hiệu quả hơn ĐƯỜNG KHÁNH SƠN Trang 35
Ví dụ về một chương trình viết trên ngôn ngữ CCS:
// Đây là chú thích chương trình
//Bắt đầu các chỉ thị tiền xử lý của chương trình
#include // cho file định nghĩa thiết bị16f877a.h vào chương trình
#fuses HS,NOLVP,NOWDT// Cấu hình cho vi điều khiển PIC
#use delay (clock@00000) // dùng thạch anh tần số4MHz
// Khai báo biến hằng byte const MAP[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //==========================================//==========================================// Bắt đầu chương trình con hiển thị void display(int n)
Dưới đây là đoạn nội dung đã được chỉnh sửa, phù hợp với quy định về SEO và đảm bảo tính mạch lạc của đoạn văn:Chương trình bắt đầu bằng việc khai báo biến `b` để lưu giá trị điều khiển, sau đó gán giá trị cho biến này dựa trên chức năng của mảng `MAP` và phép XOR với 0x00 Nếu phần chục của số `n` bằng 0, biến `b` sẽ được gán giá trị 0xff để đảm bảo đúng logic điều khiển Hàm `output_b(b)` được sử dụng để xuất giá trị ra cổng B, giúp điều khiển hiệu quả các thiết bị liên quan Tiếp theo, chương trình đẩy chân RA4 xuống mức thấp bằng hàm `output_low(PIN_A4)`, tạo độ trễ 2ms bằng `delay_ms(2)`, rồi đưa chân RA4 lên mức cao bằng `output_high(PIN_A4)` Quá trình này được lặp lại cho phần đơn vị của số `n` bằng cách gán giá trị từ mảng `MAP` kèm phép XOR, rồi điều khiển chân RA5 cũng qua các hàm `output_low`, `delay_ms`, và `output_high` Điều này đảm bảo hoạt động chính xác của mạch điều khiển dựa trên dữ liệu số và các tín hiệu GPIO.
// Kết thúc chương trình con hiển thị
//===========================================// Bắt đầu chương trình chính
// Đây là nơi vi điều khiển bắt đầu chạy lệnh
//=========================================== void main() ĐƯỜNG KHÁNH SƠN Trang 36
{ int i,count; count=0; while(TRUE)
{ for (i=0;i