You are on page 1of 31

Vi điều khiển 8 bit CMOS dùng FLASH PIC16F18877

1. Các đặc trưng kỹ thuật của vi điều khiển:

Bộ xử lý (CPU) cấu trúc RISC1 tốc độ cao :


- Hệ lệnh 49 câu lệnh với chu kỳ máy thực hiện 3 xung nhịp, ngoại trừ các câu
lệnh có điều kiện.
- Tốc độ hoạt động2:
+ Tần số dao động tối đa 32MHz
+ Chu kỳ lệnh 125ns
- Có khả năng điều khiển ngắt
- Ngăn xếp 16 mức phần cứng3
- Chế độ địa chỉ hóa bộ nhớ: trực tiếp, gián tiếp, tương đối
Bộ tạo dao động bên trong chính xác:
- Hiệu chuẩn tại nhà máy ±1%
- Lựa chọn tần số hoạt động bằng phần mềm lớn nhất là 32Mhz.
- Bộ khóa pha PLL x2/x4
- Chế độ dao động năng lượng thấp 32Khz
- Kiểm tra lỗi thạch anh.
_________________________________________________________________
1
Hệ lệnh RISC (Reduced instruction set computer) Hệ lệnh rút gọn
Những chương trình trong thực tế thường tốn phần lớn thời gian để thực hiện một
số tác vụ đơn giản, do đó một số nhà nghiên cứu hướng tới việc tối ưu hóa những tác
vụ này. Do xung nhịp của CPU bị giới hạn do công nghệ chế tạo chip, nên nếu tối ưu
lệnh này (có thể bằng cách giảm số lượng phương pháp địa chỉ mà nó hỗ trợ) sẽ khiến
cho toàn bộ tập lệnh được thực thi nhanh hơn nhiều. Mục tiêu của RISC chính là đơn
giản hóa các lệnh, để mỗi lệnh có thể được thực thi trong 1 chu kỳ máy.
2
Tốc độ thực hiện lệnh (Operating speed) phụ thuộc vào tần số xung nhịp đầu vào
(thông thường lấy từ dao động thạch anh) và chu kỳ thục hiện lệnh (Instrution cycle).
Giả sử tần số xung nhịp đầu vào là 20MHz, chu kỳ thực hiện lệnh gồm 4 xung nhịp, ta
có thời gian thực hiện 1 lệnh là 200ns.
3
Số tầng ngăn xếp phần cứng (Level Deep Hardware Stack) thể hiện số lần gọi
hàm lồng bên trong hàm, trong trường hợp số lần gọi hàm lồng vượt quá số tầng ngăn
xếp sẽ dần dần tràn ngăn xếp và chương trình sẽ bị lỗi. Tùy vào loại vi xử lý giá trị
này có thể là 8 hoặc 16.

1
- Chuyển chế độ dao động khi hoạt động với nguồn năng lượng thấp
- Chế độ ngủ tiếp kiệm năng lượng
- Hoạt động nguồn dải rộng (2.3VDC đến 5.5VDC)
- Dải hoạt động với nhiệt độ môi trường công nghiệp (đến 85ºC) và đặc biệt (đến
125ºC).
- Reset khi bật nguồn (POR)
- Bộ định thời bật nguồn (PWRT) và bộ định thời bắt đầu dao động (OST)
- Reset khi nguồn không ổn định (BOR) với chế độ điều khiển mềm.
- Bộ định thời WatchDog với dòng nhỏ dao động bên trong.
- Bộ xóa dồn kênh với điện trở treo các chân đầu vào.
- Bảo vệ khóa chương trình nguồn.
- Khối Flash/EEPROM độ bền cao: 100.00 lần ghi vào Flash và 1.000.000 lần
ghi vào bộ nhớ EEPROM. Thời gian lưu trữ trong Flash và EEPROM là 40
năm.
- Đọc và ghi bộ nhớ chương trình thời gian thực.
- Mạch gỡ rối trong Chip.

Giao tiếp ngoại vi:

- 36 cổng I/O với khả năng điều khiển chiều vào/ra.


+ Giá trị dòng điện cấp và thu dòng (Source/Sink) để điều khiển trực tiếp LED.
+Chân ngắt khi thay đổi trạng thái.
+Lập trình được chế độ treo điện trở xuống đất hoặc lên nguồn.
+Chế độ hoạt động với nguồn năng lượng siêu thấp (ULPWU)
- Khối so sánh Analog:
+ Hai bộ so sánh Analog
+ Lập trình được bộ tạo điện áp chuẩn (Vref) –tính theo % của điện áp nguồn.
+ Tạo điện áp chuẩn cứng (1.024, 2048V và 4.096V)
+ So sánh đầu vào và đầu ra bên ngoài.
+ Chế độ chốt SR.
- Bộ biến đổi ADC
35 kênh ADC có độ phân dải 10 bit, tự động tính trung bình và bộ lọc thông
thấp
- Bộ biến đổi DAC 5 bit
- Timer0: Bộ định thời/ bộ đếm 8 bit với hệ số chia tần số có thể lập trình.

2
- Bộ định thời tăng cường Timer1: Độ phân dải 16bit với hệ số chia tần số có thể
lập trình:
+ Chế độ cổng vào từ bên ngoài
+Có bộ tự dao động bên trong tần số 32Khz chuyên dụng năng lượng thấp
- Bộ định thời 8 bit Timer2.
- Khối PWM, so sánh, lưu giá trị đếm tăng cường (khối ECCP):
+ Bộ lưu giá trị đếm 16bit với độ phân dải max đạt 12.5ns
+Bộ so sánh độ phân dải max 200ns.
+10 bit PWM với số kênh có thể là :1,2,4. Cho phép lập trình giá trị “Dead
Time”, tần số đạt max 20KHz.
+ Bộ điều khiển đầu ra PWM đồng bộ
- Khối PWM, so sánh, lưu giá trị đếm (CCP)
+Bộ lưu giá trị đếm 16 bit với độ phân dải 12.5ns
+Bộ so sánh 16 bit có đô phân dải Max 200ns
+Bộ PWM 10 bit với tần số max 20KHz.
- Khối truyền thông nối tiếp không đồng bộ USART tăng cường:
+Hỗ trợ giao thức RS 485, RS 232 và LIN 2.0
+ Tự động nhận dạng tốc độ truyền
+Tự khởi động khi dùng bit Start
- Bộ hỗ trợ nạp trình trên mạch (ICSP) có 2 chân
- Khối truyền thông nối tiếp đồng bộ (MSSP) hỗ trợ SPI 3 dây (cả 4 chế độ) và
I2C. Chế độ Chủ/tớ (Master/Slave) với địa chỉ I2C lựa chọn.
- Bộ nhớ chương trình (Flash): dung lượng 56KB
- Bộ nhớ dữ liệu SRAM : 4K Byte
EEPROM: 256 Byte
Mức độ tiêu thụ điện năng:

Dòng điện ở chế độ chờ (Standby) 50nA khi dùng nguồn 2.0VDC
Dòng điện khi hoạt động: 11µA khi hoạt động ở tần số 32KHx và nguồn 2.0V
Dòng điện khi hoạt động: 200µA khi hoạt động ở tần số 4MHx và nguồn 2.0V
Dòng điện của WatchDor Timer: 1µA khi dùng nguồn 2.0V
2. Các mạch điều khiển cơ bản
2.1 Mạch xung nhịp:
Với vi xử lý hiện đại mạch xung nhịp của CPU thường lấy từ 3 nguồn:
+ Bộ tạo dao động sử dụng thạch anh bên ngoài, phụ thuộc vào loại thạch anh sử dụng
sẽ tạo ra tần số dao động có độ chính xác phù hợp. Sai số của tần số dao động tính
3
theo đơn vị ppm là số xung sai lệch trên 1 triệu xung phát ra. Ví dụ thạch anh có độ
sai lệch 20ppm có nghĩa là trong 1 triệu xung mạch dao động tạo ra cho phép sai lệch
không quá 20 xung. Có nhiều vi xử lý cho phép 2 nguồn dao động thạch anh độc lập
(nguồn dao động tốc độ cao, ví dụ 20MHz dùng cho CPU thực hiện lệnh tốc độ cao và
32,678 KHz dùng cho đồng hồ thời gian thực hoặc chế độ tiết kiệm năng lượng của
CPU.
+ Bộ tạo dao động dùng mạch RC bên trong vi xử lý. Với mục đích giảm số
lượng lệnh hiện bên ngoài chip, có thể dùng mạch dao động được thiết kế bên trong
chip, việc này cho phép giảm giá thành và tăng tính ổn định của hệ thống (không phải
lo ngại thạch anh bên ngoài hỏng hoặc mạch bên ngoài bị tác động nhiều). Người sử
dụng có thể cài đạt được tần số dao động xung nhịp theo ý muốn trong giải mà nhà
sản xuất quy định, ví dụ trong khoảng từ 32 KHz đến 8 MHz. Tuy nhiên giải pháp này
có nhược điểm là độ chính xác dao động không cao, để nâng cao độ chính xác nhà sản
xuất cho phép hiệu chuẩn tần số dao động, nhưng thông thường sai số tốt nhất đạt
khoảng 0,2%.
- Thời gian khởi động bộ tạo dao động : Khi mới được cấp nguồn, bộ tạo dao
động được kích hoạt nhưng ở giai đoạn đầu tần số dao động chưa ổn định có thể ảnh
hưởng đến sự hoạt động của vi xử lý. Do đó nhà sản xuất đưa ra 1 cơ chế tạo ra 1
khoảng thời gian trước để chắc chắn tần số dao động đã ổn định sau đó mới cấp xung
cho hệ thống. Cơ chế này gọi là bộ định thời gian khởi động tạo dao động (OST-
Oscillator Start-up), thời gian này có thể thay đổi bởi người lập trình để phù hợp với
từng bài toán ứng dụng.
- Chế độ kiểm soát hoạt động của bộ tạo dao động : Do tính chất quan trọng cảu
xung nhịp cấp cho vi xử lý, cần có bộ kiểm soát chất lượng của xung nhịp. Trong
trường hợp phát hiện ra sự bất thường sẽ tự động chuyển sang sử dụng bộ tạo dao
động bên trong, đồng thời báo cho phần mềm lập trình thông qua thanh ghi cờ. Nhờ
đó người lập trình có thể đưa thuật toán khởi động lại bộ tạo dao động ngoài và
chuyển người cấp xung từ dao động bên trong sang dao động bên ngoài đã được khắc
phục.

4
Clock Monitor
Latch
External
S Q
Clock

LFINTOSC
÷ 64 R Q

31 kHz 488Hz
(~32 s)

Sample Clock Clock


FailureDe
tected

Bộ nhận xung nhịp từ ngoài. Vi xử lý có thể nhận xung nhịp từ một mạch tạo xung
khác từ bên ngoài
2.2 Mạch reset vi xử lý
Khi hoạt động vi xử lý có thể bị reset trong các trường hợp sau
+ Khi bật nguồn (Power-on Reset)
+ Nguồn cấp mất ổn định (Brown-Out Reset)
+ Chân Reset bên ngoài (MCLR Reset)
+ Watch Dog Timer Reset (WDT)
+ Lệnh Reset bằng phần mềm
+ Tràn ngăn xếp (Stack Overflow)
+ Tràn bộ đệm ngăn xếp (Stack Underflow)
+ Chế độ nạp chương trình cho chip vi xử lý.

5
ICSP™ ProgrammingMode

RESETInstruction

VPP/MCLR MCLRE

Sleep
WDT
Time-out WDT Device
Window
Violation
Power-on
BORActive
VDD

R
Brown-out Power-up
Reset Timer

PWRTE
LPBOR

Mạch Reset khi bật nguồn (POR) khi bật nguồn, điện áp cấp cho vi xử lý tăng
từ 0 đến điện áp định mức. Mạch POR sẽ giữ vi xử lý ở trạng thái Reset cho đến khi
điện áp nguồn tăng vượt quá 1 giá trị thiết kế trước, ngoài ra tín hiệu Reset được kéo
dài 1 khoảng thời gian đủ để vi xử lý Reset 1 cách chắc chắn nhờ bộ định thời bật
nguồn (Power-up Timer).
Mạch Reset khi nguồn cấp không ổn định. (BOR). Nguòn cấp đóng vai trò quan
trọng tới sự hoạt động ổn định của vi xử lý, trong các vi xư rlý hiện đại có cơ chế
kiểm soát điện áp nguồn khi hệ thống đang hoạt động. Trong trường hợp phát hiện sự
bất thường (điện áp nguồn nhỏ hơn một điện áp đặt trước VBOR ) có thể báo cho phần
mềm lập trình và bắt đầu tiến trình Reset vi xử lý. Khối BOR có 4 chế độ hoạt động:
+ BOR luôn được kích hoạt
+ BOR không hoạt động khi ở chế độ ngủ (Cleep)
+BOR được điều khiển bằng phần mềm
+BOR luôn không hoạt động
Để đảm bảo vi xử lý không bị Reset nhầm, điện áp nguồn trước khi đưa vào bộ
xử lý BOR được lọc chống nhiễu. Đồng thời giá trị điện áp ngưỡng cũng có thể
cài đặt bởi người lập trình.
6
VDD
VBOR

Internal
Reset TPWRT(1)

VDD
VBOR

Internal
Reset

VDD
VBOR

Internal
< TPWRT
Reset TPWRT(1)

TPWRT(1)

Các tình huống hoạt động của mạch BOR


Mạch Reset cứng từ chân ngoài MCLR
Chân bên ngoài MCLR là một chân bên ngoài có thể được lựa chọn để Reset vi xử lý.
Việc cài đặt tính năng này được thực hiện bằng phần mềm (xem cài đặt vùng nhớ cấu
hình Chip CONFIG 2 bit 0). Giả sử được cài đặt khi có mức logic phù hợp (MCLR ở
mức 0) thì vi xử lý sẽ bị Reset.
- Mạch Reset sử dụng WatchDog Timer: Trong trường hợp WatchDog Timer bị tràn
(chương trình có lỗi) sẽ dẫn đên vi xử lý bị Reset (Xem thêm phần WatchDog Timer)
- Lệnh Reset bằng phần mềm: trong chương trình có thể sử dụng câu lệnh Reset đê
khởi động lại vi xử lý.
- Reset do bị tràn ngăn xếp (Overflow stack) hoặc tràn bộ đệm ngăn xếp (underflow
stack): tính năng này cũng cần được sử cho phép bằng phần mềm (cài đặt ở bit 12 của
vùng nhớ cấu hình Chip CONFIG 2). Trường hợp này Reset xảy ra khi:
+ Tràn ngăn xếp: Khi số tầng của ngăn xếp đã đầy (đạt giá trị max mà nhà sản xuất
Chip cho phép, ví dụ với vi xử lý PIC16F18877 là 8) mà vẫn tiếp tục gọi hàm con
(đẩy tiếp địa chỉ vào ngăn xếp)

7
+ Tràn bộ đệm ngăn xếp: Khi năng xếp đã trống (đã lấy hết địa chỉ chương trình từ
ngăn xếp) mà tiếp tục dùng lệnh POP.
- Reset ở chế độ nạp chương trình vào Chip: Khi sử dụng bộ nạp trình cho Chip, vi xử
lý được Reset để chuyển sang chế độ nạp trình.

2.3 Tổ chức bộ nhớ


2.3.1 Các dạng bộ nhớ
Với cấu trúc Harvard, vi xử lý sử dụng đường BUS dữ liệu và địa chỉ cho bộ
nhớ chương trình và dữ liệu riêng biệt, nên cho phép truy nhập trực tiếp bộ nhớ
chương trình từ vùng không gian dữ liệu khi chương trình đang chạy.
Vi điều khiển bao gồm các dạng bộ nhớ như sau:
 Bộ nhớ chương trình:
Bao gồm vùng nhớ cấu hình Chip (Cofiguration Words) và bộ nhớ chương trình
Flash.
Bảo vệ chống truy nhập chương trình đã nạp (Programmable Code Protection)
Để chống sự sao chép chương trình phần mềm đã nạp, khi nạp chương trình bằng bộ
nạp cần bật chế độ bảo vệ chương trình (cài đặt ở bit 0 của vùng nhớ cấu hình Chip
CONFIG 5)
 Bộ nhớ dữ liệu gồm:
- Các thanh ghi dùng chung (Core Registers)
- Các thanh ghi chức năng đặc biệt (Special function Register)
- Bộ nhớ RAM
- Bộ nhớ dữ liệu EEPROM

2.3.2 Tổ chức bộ nhớ.


2.3.2.1. Bộ nhớ chương trình:
Vi điều khiến có bộ đếm chương trình PC 15bit (PC 14:0) địa chỉ hóa 32Kx14
vùng nhớ chương trình.
Vector Reset có địa chỉ tại 0000h và Vector mhắt có địa chỉ 0004h
2.32.2 Bộ nhớ dữ liệu.
Bộ nhớ dữ liệu được phân thành 32 ngăn (Bank), với mỗi Bank là 128 byte bao
gồm cả các thanh ghi chức năng chung (GPR) và các thanh ghi hàm đặc biệt (SFR).
Các thanh ghi hàm chức năng đặc biệt được bố trí ở 32 vị trí đầu tiên của mỗi
Bank. Các thanh ghi dùng chung được dùng giống như RAM tĩnh được bố trí ở 96 vị
trí của mỗi Bank. Vị trí các thanh ghi nằm từ vùng nhớ F0h đến FFh ở Bank 1, 170h

8
đến 17Fh ở Bank 2 và từ 1F0 đến 1FFh ở Bank 3. Con trỏ được địa chỉ hóa ở vùng
70h đến 7Fh ở Bank 0. Tất cả các vùng RAM khác là không dùng tại mỗi Bank và khi
đọc sẽ có giá trị 0.
Thanh ghi BSR dùng để lựa chọn Bank làm việc Mỗi thanh ghi dùng chung được
truy nhập trực tiếp hoặc gián tiếp thông qua thanh ghi lựa chọn dữ liệu (FSR)
Các thanh ghi hàm chức năng đặc biệt:
Đây là các thanh ghi được sử dụng bới CPU và các hàm ngoại vi để điều khiển sự
hoạt động của vi xử lý. Các thanh ghi này là RAM tĩnh.
Các thanh ghi đặc biệt có thể phân loại thành nhóm như sau: Thanh ghi phục vụ
CPU và thanh ghi phục vụ khối ngoại vi.
Thanh ghi trạng thái (STATUS Register)
Thanh ghi trạng thái bao gồm:
- Trạng thái tính toán của khối ALU
- Trạng thái Reset
- Lựa chọn Bank cho bộ nhớ dữ liệu (GPR và SFR)
Khi một lệnh thực hiện có thể làm thanh đổi giá trị các bit trong thanh ghi trạng
thái, giả sử một lệnh làm thai đổi trạng thái các bit Z, C, hoặc DC trong thanh ghi
này thì việc ghi vào bit đó bị cấm. Các bit này có giá trị 1 hoặc 0 là do tác động của
mạch logic bên trong vi xử lý.
Ngoài ra các bit TO và 𝐏𝐃 là các bit chỉ đọc.
Ví dụ lệnh CLRF STATUS sẽ xóa 3 bit cao và Set bit Z. Kết quả thanh ghi
STATUS là 000uu1uu (ở đây u nghĩa là không thay đổi)

Bit 7-5: không sử dụng


Bit 4: TO Bit tràn thời gian
1= Sau khi bật nguồn, lệnh CLRWDT hoặc lệnh SLEEP
0= Xuất hiện tràn thời gian WDT
Bit 3 𝐏𝐃 Bit tắt nguồn
1=Sau khi bật nguồn hoặc bởi lệnh CLRWDT
0= Sau khi thực hiện lênh SLEEP
Bit 2 Z Zero bit
1= Khi kết quả phép toán số học hoặc logic =0
0=Khi kết quả phép toán số học hoặc logic ≠0
Bit 1: DC Bit tràn Digit (Khi thực hiện phép toán cộng và trừ
ADDWF,ADDLW,SUBLW, SUBWF)

9
1= Xuất hiện khi tràn 4 bit thấp
0= Không tràn
Bit 0 C Bit tràn (Khi thực hiện phép toán cộng và trừ)
1= Xuất hiện khi tràn ở bit cao thấp
0= Không tràn

2.4. Cấu hình cho Chip:


Vùng nhớ cấu hình Chip bao gồm các Bit cấu hình cho sự hoạt đông của vi xử lý;
- Lựa chọn các phương án sử dụng xung nhịp cho CPU
- Lựa chọn các phương án kiểm soát sự hoạt động vi xử lý như kiểm soát nguồn cấp,
tràn ngăn xếp Stack, chế đo Reset.
- Lựa chọn phương án sử dụng WatchDog Timer
- Lựa chọn các phương án bảo vệ bộ nhớ
Trong quá trình nạp chương tình các Bit này sẽ được cài đặt dữ liệu theo ý muốn của
người lập trình, và cũng tương tự như bộ nhớ chương trình nó không bị mật dữ liệu
khi cắt nguồn cấp.
Sau đây là các giá trị cài đặt của Vùng nhớ này.
CONFIG1: Tạo xung nhịp
Bit 13 FCMEN: bit cho phép giám sát chất lượng xung nhịp
1= ON : Cho phép Timer FSCM hoạt động
0=OFF: không cho phép timer FSCM hoạt động
Bit 12 không sử dụng
Bit 11:CSWEN Bit cho phép chuyển xung nhịp sau khi xử lý lỗi
1= ON: Cho phép chuyển xung nhịp sau khi xử lý lỗi
0= OFF: Không cho phép.
Bit 10 -9: không sử dụng
Bit 8: CLKOUTENB Bit cho phép cấp xung nhịp ra chân ngoài.
1=OFF: Chế độ cấp xung nhịp ra ngoài bị khóa, chân OSC2 có thể dùng với chức
năng vào/ra thông thường.
0=ON chế độ cấc xung nhịp ra ngoài đuwọc kích hoạt, một tần số FOSC/4 được đưa ra
chân OSC2
Bit 7 Không sử dụng.
Bit 6-4 RST<2:0> : Các Bit cài đặt giá trị xung nhịp sau khi bật nguồn
111= EXT1x Sử dụng tần số bên ngoài EXTOSC hoạt động thông qua việc cài đặt
các bit ở thành ghi FEXTOSC

10
110= HFINT1 sử dụng tần số bên trong HFINTOSC (1 Mhz)
101= LFINT sử dụng tần số bên trong LFINTOSC
100= SOSC sử dụng tần số bên trong SOSC
010= EXTHx sử dụng tần số bên ngoài EXTOSC với hệ số nhân tần 4 lần (4xPLL),
cài đật EXTOSC thông qua việc cài đặt các bit ở thành ghi FEXTOSC
001= HFINTPLL sử dụng tần số bên trong HFINTOSC với bộ nhân tần 2 lần
(2xPLL), khi OSCFRQ=16Mhz và CDIV=1:1 (FOSC=32Mhz)
000=HFINT32 sử dụng tần số bên trong HFINTOSC OSCFRQ=32Mhz và CDIV=1:1
(FOSC=32Mhz).
Bit 2-0 FEXTOSC <2:0> các bit lựa chọn chế độ dao động bên ngoài
111=ECH xung nhịp bên ngoài ECH (tần số cao)
110=ECM xung nhịp bên ngoài ECM (tần số trung bình)
101=ECL xung nhịp bên ngoài ECL (tần số thấp)
100=OFF xung nhịp bên ngoài không sử dụng (chận RA7 có thể dùng làm cổng
vào/ra thông thường.
011= Dự phòng
010= HS Dao động thạch anh HS( tần số cao)
001= XT Dao động thạch anh XT( tần số trung bình)
000= LP Dao động thạch anh LP( tần số thấp)

CONFIG 2 Các bit cài đặt chế độ giám sát hoạt động vi xử lý
Bit 13 DEBUG Bit cho phép chế độ gỡ rối
Với chế độ này từ phần mềm lập trình (hệ phát triển) có thể kiểm soát hoạt
động của vi xử lý từ máy tính lập trình (dừng chương trình- xem các vùng nhớ - kiểm
soạt hoạt động của các câu lệnh…)
1=OFF Không cho phép gỡ rối (các chân giao tiếp phục vụ gỡ rối ICSPCLK và
ICSPDAT có thể dùng làm các chân vào/ra thông thường)
0=ON Cho phép chế độ gỡ rối.
Bit 12 STVREN Bit cho phép Reset khi tràn Stack
1=ON Khi tràn Stack vi xử lý sẽ Reset
0=OFF Khi tràn Stack vi xử lý không bị Reset
Bit 11 PPS1WAY Bit cho phép cài đặt PPSLOCKED 1 hay nhiều lần
PPS là một kỹ thuật cho phép nối các đầu ra hoặc đầu vào của các khối phần chức
chức năng bên trong Chip (như Timer, UART, SPI, ADC …) với các chân bên ngoài
của vi điều khiển.
11
1=ON: Bit PPSLOCKED có thể thay đổi trạng thái chỉ 1 lần
0=OFF Bit PPSLOCKED có thể thay đổi trạng thái nhiều lần
Bit 10: ZCDDIS Bit cấm kiểm tra trạng thái ZCD (Zero – Cross Detect)
ZCD là một kỹ thuật cho phép phát hiện tín hiệu khi qua điểm 0 (điểm đất nguồn), kỹ
thuật này hay dùng trong các bài toán cần đồng bộ pha của tín hiệu.
1=ON ZCD bị cấp
0=OFF ZCD luôn hoạt động
Bit 9: BORV bit lựa chọn điện áp BOR (Brown-out Reset)
BOR là một kỹ thuật kiểm tra điện áp nguồn cấp khi vi xử lý hoạt động (xem thêm ở
phần BOR)
1=LOW Lựa chọn mức điện áp thấp (1.9V)
0 =HIGT Lựa chọn mức điện áp cao (2.7V)
Bit 8: khong sử dụng
Bit 7-6 BOREN<1:0> Các Bit cho phép vi điều khiển Reset khi nguồn cấp mất ổn
định
11= ON Cho phép luôn Reset
10= Sleep Cho phép Reset khi vi điều khiển hoạt động ở chế độ bình thường, không
cho phép ở chế độ Sleep.
01= SBOREN Cho phép Reset nhưng phụ thuộc vào Bit SBSREN (bit này nằm trong
thanh ghi chức năng đặc biệt: có thể thay đổi giá trị khi chương trình đang hoạt động,
tuy nhiên sẽ xóa giá trị khi mất nguồn cấp)
00= OFF Không cho phép Reset.
Bit 1: PWRTE Bit cho phép bộ định thời trễ khi cấp nguồn hoạt động (Power–Up
Timer)
Kỹ thuật này cho phép tạo một khoảng thời gian trễ để bộ tạo dao động và các khối
phần cứng khác hoạt động ổ định trước khi cấp xung nhịp cho vi xử lý.
1=OFF: PWRT bị cấm
0=ON: PWRT cho chép hoạt động.
Bit 0: MCLRE bit cho chép chân MCLR hoạt động
1=ON MCLR chân dùng để Reset Chip
0=OFF MCLR dùng làm chân vao/ra thông thường

CONFIG 3 Điều khiển WatchDog Timer


Bit 13-11 WDTCCS <2:0> Bit lựa chọn xung nhịp đầu vào cho WDT
Bit 13-11 WDTCCS <2:0> Bit lựa chọn xung nhịp đầu vào cho WDT
12
111= Điều khiển bằng phần mềm
110= Dự phòng
…..
010= Dự phòng
001= Xung nhịp đầu vào bằng MFINT OSC/16 (31.25Khz)
000= Xung nhịp đầu vào là LFINTOSC (31Khz)
Bit 10-8 Bit lựa chọn cửa sổ (Window) cho WDT
(Xem thêm phần chức năng WatchDogTimer)

Giá trị Thời gian cửa sổ mở (%)


111 100
110 100
101 75
100 62.5
011 50
010 37.5
001 25
000 12.5

Bit 6-5 WDTE Chế độ hoạt động của WDT


11= WDT hoạt động ngay cả khi ở chế độ Sleep
10= WDT hoạt động khi không ở chế độ Sleep và dừng ở chế độ Sleep
01= WDT đuwọc điều khiển bằng phần mềm bởi các bit SWDTEN của thanh ghi
WDTCON0
00= WDT luôn không hoạt động
Bit 4-0 WDTCPS Các bit lựa chọn chu kỳ WDT

Giá trị Hệ số chia Thời gian


(Fin=31Khz)
11110 25 1ms
….
10011 25 1ms
10010 223 256s
10001 222 128s
10000 221 64s
01111 220 32s
01110 219 16s
01101 218 8s
01100 217 4s
01011 216 2s
01010 215 1s
13
01001 214 512ms
01000 213 256ms
00111 212 128ms
00110 211 64ms
00101 210 32ms
00100 29 16ms
00011 28 8ms
00010 27 4ms
00001 26 2ms
00000 25 1ms

CONFIG 4 Điều khiển bộ nhớ khi nạp chương trình


Bit 13 LVP bit cho phép nạp chương trình điện áp thấp
1= Cho phép
0= Không cho phép (nạp chương trình ở điện áp cao)
Bit 12 SCANE Bit cho phép chế độ quét
Bit 11-2: Không sử dụng
Bit 1-0 WRT<1:0> Các bit khóa chế độ ghi và xóa bộ nhớ chương trình
Nếu không bị khóa thì khi chương trình đang chạy cho phép phần mềm ghi vào bộ
nhớ còn trống trong bộ nhớ chương trình
11= Chế độ ghi bị khóa
10- Vùng nhớ 0000h đến 01FFh khóa ghi dữ liệu, 2000h đến 7FFFh có thể thay đổi
khi dùng thanh ghi EECON
01= Vùng nhớ 0000h đến 03FFh khóa ghi dữ liệu, 4000h đến 7FFFh có thể thay đổi
khi dùng thanh ghi EECON
00=0000h đến 7FFFh khóa ghi dữ liệu

CONFIG 5 Khóa truy nhập dữ liệu từ bên ngoài


Bit 1 CPD Bit khóa dữ liệu bộ nhớ dữ liệu EEPROM
1= Không khóa dữ liệu ở vùng nhớ EEPROM
0=Khóa dữ liệu ở vùng nhớ EEPROM
Bit 0. CP Bit khóa bộ nhớ chương trình
1= Không khóa bộ nhớ chương trình
0=Khóa bộ nhớ chương trình
Lưu ý việc khóa truy nhập dữ liệu từ ngoài (sử dụng bộ nạp trình) không ảnh hưởng
đến phần mềm đang hoạt động trong Chip truy nhập tới tác vùng nhớ này.

14
Bộ nhớ chương trình được mô tả ở hình dưới, trong đó Vector Reset ở địa chỉ 0000h
và Vector ngắt ở địa chỉ 0004h.

PC<14:0>
CALL, CALLW
RETURN,RETLW
15
Stack Level 0
Interrupt,
Stack Level 1

Stack Level 15

Reset Vector
0000h

Interrupt Vector
0004h

0005h

07FFh

0800h

0FFFh

Page 0 1000h
On-chip
Program
17FFh
Memory

3FFFh

4000h

7FFFh

 Các thanh ghi dùng chung (Core Registers) ảnh hướng đến các hoạt động cơ
bản nhất của vi xử lý bao gồm:
- INDF0, INDF1: Quy định cách thức địa chỉ hóa khi truy nhập vùng nhớ -
phương pháp gián tiếp (indirect Addressing)
- PCL: Bộ đếm chương trình (byte thấp)
- STATUS: Thanh ghi trang thai hoạt động vi xử lý
Bit 4 : TO Bit Time-out
1= Sau khi bật nguồn, lệnh CLRWDT hoặc SLEEP
0= WatchDog Timer bị tràn
15
Ví dụ chương trình cài đặt các Bit cấu hình. (Chip PIC 16F877A)

#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)


#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON // Low-Voltage (Single-Supply) In-Circuit Serial
Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming
enabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data
EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write
protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code
protection off)

2.5 Điều khiển ngắt


Ngắt cho phép thực hiện 1 tác vụ phát sinh được ưu tiên hơn so với nhiệm vụ đang
thực hiện thông thường.
Tuy vào cấu trúc của loại vi điều khiển, bảng vector ngắt có thể chia thành 3 dạng:
Chỉ có 1 địa chỉ trả về khi có đòi hỏi ngắt. Tùy thuộc vào loại vi điều khiển có thể
có nhiều đòi hỏi ngắt để đáp ứng yêu cầu hoạt động của các khối phần cứng (ví dụ
Timer, ADC, SPI …), tuy nhiên khi xảy ra ngắt bộ đếm chương trình PC được chỉ đến
1 địa chỉ duy nhất trong bảng Vector ngắt, tức là chỉ một hàm ngắt được gọi.
Trong hàm ngắt này để thực hiện đáp ứng ngắt tương ứng với đòi hỏi ngắt cần
kiểm tra cờ ngắt tương ứng.
Trong trường hợp này, khi một hàm ngắt đang hoạt động sẽ tạm thời dừng cho
phép ngắt, như vậy sẽ không có chế độ ưu tiên ngắt.
Ví dụ với họ vi điều khiển Microchip 8 bit PIC16F, địa chỉ Vector ngắt là 0004h.
static void __interrupt() isr(void) // Hàm ngắt được gọi từ địa chỉ 0004h
{
if(TMR0F) // Khi có đòi hỏi ngắt từ khối Timer0
{
TMR0=0; // Xóa cờ ngắt
16
// Thực hiện đáp ứng ngắt khi Timer0 bị tràn
}
if(ADIF) // Khi có đòi hỏi ngắt từ khối biến đổi ADC
{
ADIF=0; // Xóa cờ ngắt
// Thực hiện đáp ứng ngắt khi ADC biến đổi xong
}
if(INTF) // Khi có đòi hỏi ngắt ngoài
{
INTF=0; // Xóa cờ ngắt
// Thực hiện đáp ứng ngắt
}

Có 2 địa chỉ trả về trong bảng Vector ngắt, trong trường hợp này chia thành địa
chỉ có mức ưu tiên thấp và địa chỉ có mức ưu tiên cao. Khi cài đặt ngắt cần khai báo
mức độ ưu tiên của từng đòi hỏi ngắt. Khi hàm ngắt có mức độ ưu tiên thấp đang hoạt
động cho phép được gọi hàm ngắt cơ mức độ ưu tiên cao hơn. Trong từng hàm ngắt để
xác định đòi hỏi ngắt nào đang được kích hoạt cần kiểm tra cờ ngắt tương ứng.
Ví dụ với họ vi điều khiển Microchip PC18F: địa chỉ Vector ngắt ưu tiên cao ở
0008h và địa chỉ ở mức ưu tiên thấp ở 0018h

#pragma code interruptVectorHigh =0x08


void interruptHandlerHigh(void)
{
_asm
goto Interrupt HandlerHigh
_endasm
}

#pragma code interruptVectorLow =0x18


void interruptHandlerLow(void)
{
_asm
goto Interrupt HandlerLow
_endasm
}
#pragma code
17
#pragma interrupt Interrupt HandlerHigh
void Interrupt HandlerHigh()
{
if(INTCONbits.TMR0IF)
{
INTCONbits.TMR0IF=0; // Xóa cờ ngắt
// Thực hiện đáp ứng ngắt
}
}
#pragma code
#pragma interrupt Interrupt HandlerLow
void Interrupt HandlerLow()
{
if(DataRdyUSART())
{
//Thực hiện đọc dữ liệu từ bộ đệm UART
}
}
Có nhiều địa chỉ trong bảng Vector ngắt. Trong trường hợp này mỗi một đòi hỏi
ngắt sẽ có 1 địa chỉ trả về trong bảng Vector ngắt riêng biệt. mức độ ưu tiên ngắt cũng
có thể khai báo trong quá trình cài đặt ngắt tương ứng.
Ví dụ với họ vi điều khiển Microchip PIC 24F (có 117 đòi hỏi ngắt)

Tên ngắt Địa chỉ trong bảng Vector ngắt


INT0 14h
IC1 16h
OC1 18h
T1 1Ah
DMA0 1Ch
… …
U6E FCh
JTAG FFh

Mỗi một đòi hỏi ngắt sẽ có một hàm ngắt tương ứng để xử lý

Sự hoạt động của quá trình ngắt.


Khi vi xử lý bị Reset tất cả các ngắt điều bị cấm. Để cho phép ngắt hoạt động cần
cài đặt bit ngắt toàn cục và bit ngắt tương ứng với sự kiện cần ngắt. khi xuất hiện 1 đòi

18
hỏi ngắt (cờ ngắt dựng lên 1) và có sự cho phép ngắt đó hoạt động thì quá trình ngắt
diễn ra như sau:
1. Dừng thực hiện câu lệnh hiện tại
2. Giá trị bộ đếm chương trình được cấp vào ngăn xếp.
3. Giá trị các thanh ghi quan trọng (WREG, STATUS, BSR, FSR, PCLATH)
được tự động lưu vào vùng nhớ đặt biệt (Shadow Registers).
4. Bộ đếm chương trình được nạp địa chỉ trong bảng Vector ngắt (tuy vào từng đòi
hỏi ngắt sẽ có giá trị tương ứng trong bảng Vector ngắt)
Quá trình trên phần cứng của vi xử lý thực hiện 1 cách tự động.
Phần mềm của người lập trình cần thực hiện các bước:
5. Tại địa chỉ trong bảng Vector ngắt thực hiện câu lệnh gọi hàm ngắt tương ứng
6. Trong hàm ngắt cần kiểm tra cờ ngắt, xóa cờ ngắt trước khi thoát khỏi hàm ngắt
(nếu không hàm ngắt sẽ tự động gọi lại), dựng lại bit cho phép ngắt (nếu bit này
bị xóa bởi phần cứng)
7. Trong hàm ngắt thực hiện các câu lệnh đáp ứng đòi hỏ ngắt.
8. Khi gắp lệnh RETI (thoát khỏi hàm ngắt), trả lại quyền điều khiển cho phần
cứng.
Tiếp theo phần cứng vi xử lý sẽ thực hiện:
9. Nạp giá trị từ ngăn xếp (giá trị địa chỉ của chương trình chính đang thực hiện
trước đó) vào bộ đếm chương trình PC.
10.Khôi phục lại dữ liệu cho các thanh ghi quan trong được lưu trữ trước đó, nhờ
đó chương trình tiếp tục thực hiện đoạn lệnh trước khi xuất hiện ngắt.

Độ trễ của ngắt.


Độ trễ của ngắt được hiểu là khoảng thời gian từ khi xuất hiện đòi hỏi ngắt đến khi
thực hiện lệnh trong bảng Vector ngắt. Đỗ trễ này nằm trong khoảng từ 3 đến 5 chu
kỳ lệnh.
Hình sau thể hiện một ví dụ về độ trễ của ngắt họ vi điều khiển PIC16F

19
OSC1

Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4

CLKR Interrupt Sampled


during Q1

Interrupt

PC PC-1 PC PC+1 0004h 0005h

Execute 1 Cycle Instruction atPC Inst(PC) NOP NOP Inst(0004h)

Interrupt

GIE PC+1/FSR New PC/


PC 0004h 0005h
ADDR PC+1

Execute 2 Cycle Instruction atPC Inst(PC) NOP NOP Inst(0004h)

Interrupt

GIE
PC-1 PC FSR ADDR PC+1 PC+2 0004h 0005h

Execute 3 Cycle Instruction atPC INST(PC) NOP NOP NOP Inst(0004h) Inst(0005h)

Interrupt

GIE
PC-1 PC FSR ADDR PC+1 PC+2 0004h 0005h

Execute 3 Cycle Instruction at PC INST(PC) NOP NOP NOP NOP Inst(0004h)

Ví dụ các thanh ghi điều khiển ngắt của họ vi điều khiển PIC16F
PIE0 –Thanh ghi cho phép ngắt khối phần cứng ghép nối 0
Bit 7-6 Không sử dụng
Bit 5 TMR0IE Bit cho phép ngắt Timer0 tràn

20
1=Cho phép ngắt TMR0
0=Không cho phép ngắt TMR0
Bit 4 IOCIE Bit cho phép ngắt thay đổi trạng thái cổng vào
1= Cho phép ngắt IOC ( interrupt – on – change)
0=Không cho phép ngắt IOC
Bit 3-1 Không sử dụng
Bit 0 INTIE Bit cho phép ngắt ngoài
1=Cho phép ngắt INT
0=Không cho phép ngắt INT

PIE1 Thanh ghi cho phép ngắt khối phần cứng ghép nối 1
Bit 7 OSFIE Bit cho phép ngắt khi phát hiện lỗi xung nhịp
1=Cho phép ngắt OSF
0=Không cho phép ngắt OSF
Bit 6 CSWIE Bit cho phép ngắt khi chuyển xung nhịp thành công
1=Cho phép ngắt CSW
0=Không cho phép ngắt CSW

Ngắt này xuất hiện trong trường hợp vi xử lý kiểm tra có sự bất bình thường của
xung nhịp từ bộ tạo dao động, sau đó nó sẽ tự động chuyển sang sử dụng bộ tạo
dao động bên trong với tần số thấp hơn, kích hoạt lại bộ tạo dao động bên ngoài và
chuyển thành công sang bộ dao động bên ngoài mà không có lỗi.

Bit 5-2 không sử dụng


Bit 1 ADTIE Bit cho phép ngắt so sánh ngưỡng của bộ ADC
1= Cho phép ngắt
0= cấm ngắt.
Bit 0 ADIE Bit cho phép ngắt biến đổi xong của bộ ADC
1= Cho phép ngắt
0= Cấm ngắt.

Các thanh ghi báo trạng thái ngắt


PIR0 Thanh ghi trạng thái ngắt khối phần cứng ghép nối 0
Bit 7-6 Không sử dụng
21
Bit 5 TMR0IF bit cờ ngắt báo tràn Timer0
1= Thanh ghi TMR0 tràn
0= Thanh ghi TMR0 chưa bị tràn
Bit 4 IOCIF bit cờ ngắt IOC
1= ít nhất trong thanh ghi IOCAF-IOCEF bị dựng lên 1
0= tất cả các giá trị trong các thanh ghi IOCAF-IOCEF đều bằng 0
Bit 3-1 Không sử dụng
Bit 0 INTF Bit cờ ngắt ngoài INT
1= xuất hiện ngắt ngoài (bit này cần được xóa bằng phần mềm)
0= không xuất hiện ngắt ngoài
PIR1 Thanh ghi trạng thái ngắt khối phần cứng ghép nối 1
Bit 7 OSCIF bit cờ ngắt kiểm tra xung nhịp

PIE1: Thanh ghi trạng thái ngắt khối phần cứng ghép nối 1
PIR0: Thanh ghi trạng thái ngắt khối phần cứng ghép nối 0

bit7-6 Không sử dụng


bit5 TMR0IF: Bit cờ ngắt báo tràn Timer0
1 = Thanh ghi TMR0 bị tràn (cần xóa bằng phần mềm)
0 = Thanh ghi TMR0 chưa bị tràn
bit4 IOCIF: Bit cờ ngắt IOC (Interrupt-on-Change Interrupt) (chỉ đọc )
1= ít nhất trong các thanh ghi IOCAF-IOCEF có bit dựng lên 1
0 =Không có bit nào trong các thanh ghi IOCAF-IOCEF dựng lên 1
bit3-1 Không sử dụng
bit0 INTF: Bit cờ ngắt ngoài INT
1 = Xuất hiện ngắt ngoài (cần xóa bằng phần mềm)
0 = Không xuất hiện ngắt ngoài

PIR1: Thanh ghi trạng thái ngắt khối phần cứng ghép nối 1

bit7 OSFIF: Bit cờ ngắt kiểm tra xung nhịp


1= Xuất hiện ngắt do lỗi xung nhịp (cần xóa bằng phần mềm)
0= Không có lỗi
22
bit6 CSWIF: Bit cờ ngắt khi chuyển xung nhịp thành công
1= Báo trạng thái chuyển xung nhịp thành công
0= Chưa xuất hiện việc chuyển xung nhịp
thành công
bit5-2 Không sử dụng
bit1 ADTIF: Bit cờ ngắt so sánh ngưỡng của bộ ADC
1=Giá trị đo của bộ ADC vượt quá ngưỡng cài đặt(cần xóa bằng phần
mềm)
0=Giá trị đo của bộ ADC vẫn nằm trong ngưỡng cài đặt
bit 0 ADIF: Bit cho phép ngắt bộ ADC
1= Bộ ADC đã biến đổi xong
0= Bộ ADC chưa biến đổi xong

2.6 WatchDog Timer


WatchDog Timer (WDT) là một hệ thống định thời sẽ tạo ra tín hiệu Reset vi xử lý
nếu phần mềm lập trình không thực hiện lệnh CLRWDT trong một chu kỳ thời gian
nhất định (thời gian tràn). WatchDog Timer được sử dụng để khôi phục lại hệ thống
trong trường hợp xảy ra lỗi nghiêm trọng không mong đợi.
Windowed WatchDog Timer khác với WatchDog Timer thông thường ở chỗ là lệnh
CLRWDT chỉ được chấp nhận trong một khoảng thời gian định trước (cửa sổ) của
chu kỳ thờ gian tràn.
Các tinh năng hoạt động của WDT gồm:
11.Có thể lựa chọn xung đầu vào cho bộ Timer
12.Có 4 chế độ hoạt động: luôn hoạt động, không hoạt động cở chế độ Sleep, WDT
được điều khiển bằng phần mềm, WDT luôn không hoạt động.
13.Cài đặt chu lỳ thời gian tràn từ 1ms đến 256s
14.Cài đặt thời gian cửa sổ từ 12.5 đến 100% thời gian chu kỳ tràn.
15.Lựa chọn các điều kiện để Reset
16.Có khả năng hoạt động khi ở chế độ Sleep

Bộ WDT sử dụng nguồn xung nhịp độc lập với nguồn dao động cấp xung nhịp cho
CPU, ở đây có thể sử dụng nguồn dao đông bên trong LFINTOSC 31Khz hoặc
MFINTOSC/16 (31.25Khz). Việc lựa chọn này phụ thuộc vào giá trị cài đặt trong biến
WDTCCS <2:0> hoặc WDTCS<2:0>

23
Các chế độ hoạt động của WDT
Khối WDT có 4 chế độ hoạt động phụ thuộc vào sự cài đặt trong biến WDTE<1:0>:
17.WDT luôn hoạt động: Khi các bit WDTE trong phần cấu hình (Config) có giá
trị “11”. Lúc này WDT hoạt động cả ở chế độ “Sleep”
18.WDT ngừng hoạt động ở chế độ “Sleep”: Khi các bit WDTE trong phần cấu
hình (Config) có giá trị “10”. Lúc này WDT hoạt động ngoại trừ ở chế độ
Sleep.
19.WDT được điều khiển bằng phần mềm: Khi các bit WDTE trong phần cấu
hình (Config) có giá trị “01”. Lúc này WDT được điều khiển bởi bit SEN trong
thanh ghi WDTCON0.
20.WDT không hoạt động. Khi các bit WDTE trong phần cấu hình (Config) có giá
trị “00”.

Thời gian tràn bộ đếm WDT.


Các bit WDTPS trong thanh ghi WDTCON0 đặt thời gian tràn từ 1ms đến 256 giây.
Sau khi vi xử lý Reset, thời gian ngầm định được đặt là 2 giây.

Cửa sổ Watchdog Timer


Watchdog Timer cho phép lựa chọn chế độ của sổ thông qua việc cà đặt các bit cấu
hình WDTCWS<2:0> và các bit WINDOW<2:0> trong thanh ghi WDTCON1.
Ở chế độ của sổ, lệnh xóa WDT (CLRWDT) cần được thực hiện trong vùng thời gian
(cửa sổ) được quy định sẵn. Nếu lệnh này được thực hiện ngoài vùng cửa sổ bị coi là
vi phạm và vi xử lý bị Reset tương tự như trường hợp tràn thời gian WDT.

Xóa giá trị trong WDT:


Bộ đếm trong WDT bị xóa trong các trường hợp sau:
21.Vi xử lý Reset
22.Thực hiện lệnh CLRWDT hợp lệ
23.Vi xử lý chuyển sang chế độ “Sleep”
24.Vi xử lý thoát khởi chế độ “Sleep”
25.WDT không hoạt động
26.Trong khoảng thời gian bộ tạo dao động (OST) khởi động.
27.Ghi 1 giá trị bất kỳ vào thanh ghi WDTCON0 và WDTCON1

24
Các thanh ghi điều khiển WDT
WDTCON0: Thanh ghi điều khiển WDT 0
bit7-6 Không sử dụng

bit5-1 WDTPS<4:0>: Các bit lựa chọn hệ số chia thời gian

11111 = Hệ số chia 1:32





10011 = Hệ số chia 1:32
10010 = 1:8388608 (223) ( thời gian tràn 256s )
10001 = 1:4194304 (222) (thời gian tràn 128s )
10000 = 1:2097152 (221) (thời gian tràn 64s )
01111 = 1:1048576 (220) (thời gian tràn 32s)
01110 = 1:524288 (219) (thời gian tràn 16s )
01101 = 1:262144 (218) (thời gian tràn 8s )
01100 = 1:131072 (217) (thời gian tràn 4s )
01011 = 1:65536 ( 2s ) (Giá trị khi vi xử lý Reset)
01010 = 1:32768 (thời gian tràn 1s )
01001 = 1:16384 (thời gian tràn 512 ms)
01000 = 1:8192 (thời gian tràn 256 ms )
00111 = 1:4096 (thời gian tràn 128 ms )
00110 = 1:2048 (thời gian tràn 64 ms)
00101 = 1:1024 (thời gian tràn 32 ms)
00100 = 1:512 (thời gian tràn 16 ms )
00011 = 1:256 (thời gian tràn 8 ms)
00010 = 1:128 (thời gian tràn 4 ms)
00001 = 1:64 (thời gian tràn 2 ms )
00000 = 1:32 (thời gian tràn 1 ms )

bit0 SEN:Bit cho phép/ cấm WDT hoạt động bằng phần mềm
Nếu WDTE<1:0> =1x:
Bit này bị bỏ qua
25
Nếu WDTE<1:0> =01:
1 = WDT hoạt động
0 = WDT bị cấm
Nếu WDTE<1:0> =00:
Bit này bị bỏ qua

WDTCON1: Thanh ghi điều khiển WDT 1

bit7 Không sử dụng

bit6-4 WDTCS<2:0>: Các bit lựa chọn nguồn dao động WDT

111 =Dự phòng





010 =Dự phòng
001 = MFINTOSC/16 (31.25 kHz)
000 = LFINTOSC (31 kHz)
bit3 Không sử dụng

bit2-0 WINDOW<2:0>: Bit lựa chọn cửa sổ WDT

WINDOW Vùng ngoài cửa Vùng trong cửa


<2:0> sổ (tỷ lệ % theo sổ (tỷ lệ % theo
thời gian) thời gian)
111 0 100
110 12.5 87.5
101 25 75
100 37.5 62.5
011 50 50
010 62.5 37.5
001 75 25
000 87.5 12.5

WDTPSL: WDT Thanh ghi byte thấp lựa chọn hệ số chỉa WDT (Chỉ đọc)

26
bit7-0 PSCNT<7:0>: Thanh ghi byte thấp lựa chọn hệ số chỉa WDT

WDTPSH: WDT Thanh ghi byte cao lựa chọn hệ số chỉa WDT (Chỉ đọc)
bit7-0 PSCNT<15:8>: Thanh ghi byte thấp lựa chọn hệ số chỉa WDT

WDTTMR: Thanh ghi giá trị bộ đếm WDT (chỉ đọc)

bit 7 Không sử dụng


bit6-3 WDTTMR<3:0>: Các bit giá trị bộ
đếm
bit 2 STATE: Bit trạng thái kiểm tra giá trị của WDT
1= WDT có giá trị
0= WDT chưa có giá trị
bit1-0 PSCNT<17:16>: Các bit lựa chọn hệ số chia

3. Điều khiển cổng vào/ra:


Các cổng vào ra của vi xử lý bao gồm:
- Cổng vào số (Digtal Input): nhận các tín hiệu có mức Logic từ các thiết bị ngoại
vi như phím bấm, công tắc, trạng thái hoạt động của thiết bị ghép nối. Thông thường
trong vi xử lý sẽ tao ra 1 chu kỳ để đọc các tín hiệu này,thời gian này phụ thuộc vào
nhu cầu về tần xuất cập nhật thông tin từ bên ngoài và tốc độ thực hiện lệnh của vi xử
lý. Dạng cổng vào/ra này được gọi phần mềm điều khiển trực tiếp.
Khi có nhu cầu cập nhật thông tin nhanh gần như tức thời sẽ sử dụng kỹ thuật ngắt
ngoài, lục này nếu có sự thay đổi trạng thái logic của cổng này (sườn lên hoặc sườn
xuống) một hàm ngắt sẽ được gọi để xử lý thông tin này.
Dạng này được gọi là quản lý gián tiếp (qua khối phần cứng trung gian)
- Cổng ra số (Digital Output): Tao ra các tín hiệu có mức Logic phù hợp để đưa ra các
thiết bị ngoại vi như đèn báo, màn hình, rơ le điều khiển, tín hiệu đều khiển.
Tương tự như trên, khi phần mềm quản lý trực tiếp tín hiệu ra sẽ bị giới hạn tần số
do phụ thuộc vào tốc độ thực hiện lệnh của vi xử lý.
Trong trường hợp muốn tăng tần số tín hiệu ra cần sử dụng một khối phần cứng
trung gian (vi dụ như bộ điều chế độ rộng xung PWM), lúc này chân đầu ra sẽ do
phần cứng này trực tiếp điều khiển.
Khi sử dụng các cổng vào/ra này cần lưu ý đến các tham số kỹ thuật (điện áp, dòng
điện định mức, ngưỡng điện áp mức logic 0, mức logic 1, trở kháng đầu vào) trong
tài liệu của nhà sản xuất Chip.

27
- Cổng vào tương tự (Analog Input): Cổng này thường được kết nối với khối phần
cứng ADC hoặc khối so sánh tương tự bên trong Chip vi điều khiển.
- Cổng ra tương tự (Analog Output): Cổng này được kết nối với khối phần cứng
DAC.
- Cổng vào/ra truyền thông: Các cổng này được kết nối với khối phần cứng truyền
thông bên trong Chip như UART, SPI, I2C, USB…
- Cổng vào/ra điều khiển truy nhập bộ nhớ ngoài gồm các đường BUS địa chỉ, dữ
liệu và điều khiển.
Với cách phân loại khác ta có thể chia các chân vào/ra của vi điều khiển thành 2
dạng:
- Phần mềm điều khiển trực tiếp: tức là có thể dùng các câu lệnh truy nhập trực tiếp
các cổng vào/ra. Đặc điểm là tần số của xung tín hiệu thấp (<1Khz) và phụ thuộc vào
tốc độ thực hiện lệnh.
- Phần mềm điều khiển gián tiếp: tức là điều khiển thông qua các khối phần cứng
bên trong Chip (khối PWM, Counter, ADC, UART, SPT, ngắt ngoài …). Đặc điểm là
tần số làm việc cao và chỉ phụ thuộc vào các khối phần cứng. Phần mềm khổng thể
điều khiển mức logic ra của các cổng này, tuy nhên có thể đọc mức logic vào.
Để tiết kiệm, các chân vào/ra của vi điều khiển được thiết kế đa chức năng. Vi dụ 1
chân tại những thời điểm khác nhau vừa là cổng vào, cổng ra, cổng truyền thông, ngắt
ngoài và cổng tín hiệu tương tự. Việc cài đặt chức năng các chân này thông qua các
thanh ghi.
Ví dụ với PORTA của vi điều khiển PIC16F18877 có các thanh ghi điều khiển sự
hoạt động của các cổng vào/ra như sau:
- Thanh ghi PORTA: Giá trị của nó thể hiện mức logic các bit cổng này.
- Thanh ghi LATA (chốt giá trị ra): Điều khiển giá trị mức logic ra, việc chốt dữ
liệu ra có thể sử dụng ở dạng đọc – thay đổi – ghi.
Ví dụ thực hiện lệnh: LATA=LATA&0xF0;
- Thanh ghi TRISA (điều khiển chiều của dữ liệu): sẽ quyết định cổng này là
cổng đầu vào (đặt giá trị 1) hay cổng ra (đặt giá trị 0)
- Thanh ghi ANSELA: Cài đặt cổng Analog, khi 1 bit ANSEL có giá trị 1
(cổng này thành cổng vào Analog) thì bộ đệm đầu vào số bị tách ra, tuy nhên chức
năng cổng ra số vẫn có thể tiếp tục được sử dụng (phụ thuộc vào thanh ghi
TRISA).

28
Đọc LATx
TRISx

D Q

Ghi LATx
Ghi PORTx
CK VDD
Data Register

Data Bus
I/O pin
Đọc PORTx

VSS
kỳAN
Đến khối Analog

- Thanh ghi WPUA: treo điện trở đầu vào, khi bit này ơt mức 1 thf đầu vào
được thiết kế có 1 điện trở treo lên dương nguồn (đảm bảo mức 1 khi đầu vào
này không nối với thiết bị bên ngoài khác). Còn khi bằng 0 thì không có điện
trở treo ở đầu vào này.
- Thanh ghi INLVLA: thay đổi ngưỡng điện áp đầu vào tương thích với dạng
TTL (Tranzitor-tranzitor logic) hay ST (Schmitt Trigger CMOS). Lưu ý chỉ sử
dụng thanh ghi này ở chế độ điều khiển trực tiếp bằng phần mềm. Khi giá trị
thanh ghi này ở mức 1 thì cổng đầu ra ở dạng ST, còn nếu bit này bị xóa thì có
dạng là TTL.
- Thanh ghi SLRCONA: cài đặt tần số hoạt động của cổng, khi ở mức 1 thì
cổng ra bị hạn chế tần số, còn ở mức 0 thì không bị giới hạn (tần số max phụ
thuộc vào công bố của nhà sản xuất Chip)
- Thanh ghi ODCONA: cài đặt cổng ra dạng Open- drain. Khi 1 bit của thanh
ghi ODCONA có giá trị 1 thì cổng đầu ra tương ứng trở thành dạng Open-Drain
(chỉ cho phép nhận dòng), còn khi bit này bị xóa thì cổng đầu ra ở dạng đẩy kéo
(Push-Pull) tiêu chuẩn và cho phép nhận dòng và bơm dòng.

Chương trình ví dụ sử dụng cổng A2 đến A5 là các cổng vào (Input), và công E2 là
cổng ra:

#include <xc.h>
#define Input 1
#define Out 0
#define kb0 PORTAbits.RA2
29
#define kb1 PORTAbits.RA3
#define kb2 PORTAbits.RA4
#define kb3 PORTAbits.RA5

#define Tris_kb0 TRISAbits.TRISA2


#define Tris_kb1 TRISAbits.TRISA3
#define Tris_kb2 TRISAbits.TRISA4
#define Tris_kb3 TRISAbits.TRISA5

#define Led PORTEbits.RE2


#define Tris_Led TRISEbits.TRISE2

unsigned char pre_kb0,pre_kb1,pre_kb2;


unsigned int num;
.int main ()
{
ADCON1 = 0x06;// All Analog Input Disable

Tris_kb0=Input ;
Tris_kb1=Input;
Tris_kb2=Input;
Tris_kb3=Input;
Tris_Led=Out;
while(1)
{
if(kb0)
pre_kb0=1;
if(pre_kb0&&!kb0)
{
Led=0;
pre_kb0=0;
num=0;
}
if(kb1)
pre_kb1=1;
if(pre_kb1&&!kb1)
{
pre_kb1=0;
30
Led=1;
}
} //while
} //main

Khi ấn phím KB0 sẽ xóa giá trị num, Led sẽ sáng.


Khi ấn phím KB1, Led sẽ tắt.
U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
35
RB2
D1 2
RA0/AN0 RB3/PGM
36
LED-RED 3 37
RA1/AN1 RB4
KB0 4 38
RA2/AN2/VREF-/CVREF RB5
KB1 5 39
RA3/AN3/VREF+ RB6/PGC
KB2 6 40
RA4/T0CKI/C1OUT RB7/PGD
KB3 7
RA5/AN4/SS/C2OUT
R12 RC0/T1OSO/T1CKI
15
330 8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19 RD0
16
15
14
13
12

10
11

RD0/PSP0
9

20 RD1
RD1/PSP1
RN1 RD2/PSP2
21 RD2
22 RD3
4.7k RD3/PSP3
27 RD4
RD4/PSP4
RD5
1
2
3
4
5
6
7
8

28
RD5/PSP5
29 RD6
1 RD6/PSP6
30 RD7
2 RD7/PSP7
3 VCC
PIC16F877A
4

RESET
KB0
UP
KB1
DOWN
KB2
MODE
KB3

31

You might also like