2. MOVWF PORTB
2.13.2 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.
- reset 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).
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.
- 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 Hình 2.21 Mạch reset qua pin
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 pin
Power-on reset (POR): Đây là xung reset do vi điều khiển tạo ra khi phát hiện nguồn cung cấp VDD. Khi hoạt động ở chế độ bình thường, vi điều khiển cần được đảm bảo các thơng số về dịng điện, điện áp để hoạt động bình thường. Nhưng nếu các tham số này khơng được đảm bảo, xung reset do POR tạo ra sẽ đưa vi điều khiển về trạng thái reset và chỉ tiếp tục hoạt động khi nào các tham số trên được đảm bảo.
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 ko di 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 thi 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 ny đ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.
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:
- POR tác động.
- 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 (nếu được cho phép) tạo ra khoảng thời gian delay bằng 1024 chu kì xung của oscillator để ổn định tần số của oscillator.
- Đế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.
Hình 2.22 Sơ đồ các chế độ reset của PIC16F877A.
2.13.3 Ngắt
PIC16F877A cĩ đến 15 nguồn tạo ra hoạt động ngắt được điều khiển bởi thanh ghi INTCON (bit GIE). Bên cạnh đĩ mỗi ngắt cịn cĩ một bit điều khiển và cờ ngắt riêng. Các cờ ngắt vẫn được set bình thường khi thỏa mãn điều kiện ngắt xảy ra bất chấp trạng thái của bit GIE, tuy nhiên hoạt động ngắt vẫn phụ thuơc vào bit GIE và các bit điều khiển khác. Bit điều khiển ngắt RB0/INT và TMR0 nằm trong thanh ghi INTCON, thanh ghi này cịn chứa bit cho phép các ngắt ngoại vi PEIE. Bit điều khiển các ngắt nằm trong thanh ghi PIE1 và PIE2. Cờ ngắt của các ngắt nằm trong thanh ghi PIR1 và PIR2.
Trong một thời điểm chỉ cĩ một chương trình ngắt được thực thi, chương trình ngắt được kết thúc bằng lệnh RETFIE. Khi chương trình ngắt được thực thi, bit GIE tự
động được xĩa, địa chỉ lệnh tiếp theo của chương trình chính được cất vào trong bộ nhớ Stack và bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h. Lệnh RETFIE được dùng để thốt khỏi chương trình ngắt và quay trở về chương trình chính, đồng thời bit GIE cũng sẽ được set để cho phép các ngắt hoạt động trở lại. Các cờ hiệu được dùng để kiểm tra ngắt nào đang xảy ra và phải được xĩa bằng chương trình trước khi cho phép ngắt tiếp tục hoạt động trở lại để ta cĩ thể phát hiện được thời điểm tiếp theo mà ngắt xảy ra.
Đối với các ngắt ngoại vi như ngắt từ chân INT hay ngắt từ sự thay đổi trạng thái các pin của PORTB (PORTB Interrupt on change), việc xác định ngắt nào xảy ra cần 3 hoặc 4 chu kì lệnh tùy thuộc vào thời điểm xảy ra ngắt.
Cần chú ý là trong quá trình thực thi ngắt, chỉ cĩ giá trị của bộ đếm chương trình được cất vào trong Stack, trong khi một số thanh ghi quan trọng sẽ khơng được cất và cĩ thể bị thay đổi giá trị trong quá trình thực thi chương trình ngắt. Điều này nên được xử lí bằng chương trình để tránh hiện tượng trên xảy ra.
Hình 2.23 Sơ đồ logic của tất cả các ngắt trong vi điều khiển PIC16F877A.
Ngắt INT
Ngắt này dựa trên sự thay đổi trạng thái của pin RB0/INT. Cạnh tác động gây ra ngắt cĩ thể là cạnh lên hay cạnh xuống và được điều khiển bởi bit INTEDG (thanh ghi OPTION_REG <6>). Khi cĩ cạnh tác động thích hợp xuất hiện tại pin RB0/INT, cờ ngắt INTF được set bất chấp trạng thái các bit điều khiển GIE và PEIE. Ngắt này cĩ khả năng đánh thức vi điều khiển từ chế độ sleep nếu bit cho phép ngắt được set trước khi lệnh SLEEP được thực thi.
Ngắt do sự thay đổi trạng thái các pin tring portb
Các pin PORTB<7:4> được dùng cho ngắt này và được điều khiển bởi bit RBI(thanh ghi INTCON<4>). Cờ ngắt của ngắt này là bit RBIF .