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 tượng sau:
+ Tác động của reset ngoại vi thông qua chân MCLR. + 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 chân INT).
Các bit PD và TO được dùng để 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 vi điều khiển. Bit PD được thiết lập khi vi điều khiển được cấp nguồn và được reset về 0 khi vi điều khiển ở chế độ sleep. Bit TO được reset về 0 khi WDT tác động do bộ đếm bị tràn.
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:
+ Đọc hay ghi dữ liệu thông qua PSP (Parallel Slave Port). + Ngắt Timer1 khi hoạt động ở chế độ đếm bất đồng bộ. + Ngắt CCP khi hoạt động ở chế độ Capture.
+ Các hiện tượng đặc biệt làm reset Timer1 khi hoạt động ở chế độ đếm bất đồng bộ dùng nguồn xung clock ở bên ngoài).
+ Ngắt SSP khi bit Start/Stop được phát hiện.
+ SSP hoạt động ở chế độ Slave mode khi truyền hoặc nhận dữ liệu.
+ Tác động của USART từ các chân RX hay TX khi hoạt động ở chế độ Slave mode đồng bộ.
+ Khối chuyển đổi A/D khi nguồn xung clock hoạt động ở dạng RC. + Hoàn tất quá trình ghi vào EEPROM.
+ Ngõ ra bộ so sánh thay đổi trạng thái.
Các tác động ngoại vi khác không có tác dụng đánh thức vi điều khiển vì khi ở chế độ sleep các xung clock cung cấp cho vi điều khiển ngưng hoạt động. Bên cạnh đó cần cho phép các ngắt hoạt động trước khi lệnh SLEEP được thực thi để bảo đảm tác động của các ngắt. 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. Nếu bit GIE mang giá trị 0, vi điều khiển sẽ thực thi lệnh tiếp theo sau lệnh SLEEP của chương trình (vì chương trình ngắt không được cho phép thực thi). 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 thi lệnh tiếp theo của chương trình và sau đó nhảy tới địa chỉ chứa chương trình ngắt (0004h). Trong trường hợp lệnh tiếp theo không đóng vai trò quan trọng trong chương trình, ta cần đặt thêm lệnh NOP sau lệnh SLEEP để bỏ qua tác động của lệnh này, đồng thời giúp ta dễ dàng hơn trong việc kiểm soát hoạt động của chương trình ngắt. Tuy nhiên cũng có một số điểm cần lưu ý như sau:
Nếu ngắt xảy ra trước khi lệnh SLEEP được thực thi, lệnh SLEEP sẽ không được thực thi và thay vào đó là lệnh NOP, đồng thời các tác động của lệnh SLEEP cũng sẽ được bỏ qua.
Nếu ngắt xảy ra trong khi hay sau khi lệnh SLEEP được thực thi, vi điều khiển lập tức được đánh thức từ chế độ sleep, và lệnh SLEEP sẽ được thực thi ngay sau khi vi điều khiển được đánh thức.
Để kiểm tra xem lệnh SLEEP đã được thực thi hay chưa, ta kiểm tra bit PD . Nếu bit PD vẫn mang giá trị 1 tức là lệnh SLEEP đã không được thực thi và thay vào đó là lệnh NOP. Bên cạnh đó ta cần xóa WDT để chắc chắn rằng WDT đã được xóa trước khi thực thi lệnh SLEEP, qua đó cho phép ta xác định được thời điểm vi điều khiển được đánh thức do tác động của WDT.