Giới thiệu
PIC18F4550 có chế độ tắt nguồn để giảm mức tiêu thụ điện năng khi vi điều khiển không hoạt động. Hầu hết các ứng dụng như điện thoại di động, máy tính xách tay đều dựa vào chế độ ngủ tạm ngưng hầu hết hoặc tất cả các hoạt động của vi điều khiển để giảm thiểu mức tiêu thụ điện năng. Chế độ ngủ là cần thiết cho các ứng dụng như vậy vì đây là những thiết bị hoạt động bằng pin giúp tiêu thụ ít năng lượng hơn
.
Khái niệm về chế độ Ngủ
Trong chế độ ngủ PIC18F4550, bộ dao động thiết bị bị tắt.
Vì vậy, không có đồng hồ hệ thống nào đang xảy ra trong thiết bị. Điều này giữ PIC ở trạng thái tiêu thụ điện năng thấp.
Nhập PIC18F4550 vào chế độ Ngủ
Để vào PIC18F4550 ở chế độ ngủ,
- xóa bit IDLEN trong thanh ghi OSCCON .
Bit IDLEN:
0 = bật chế độ ngủ
1 = bật chế độ chờ
2. Và thực thi lệnh SLEEP .
Điều này ngăn chặn tất cả các đồng hồ và dao động như hình dưới đây
Nếu WDT (Watchdog Timer) được bật thì nguồn INTRC có tần số 31 KHz được bật.
Nếu bộ dao động Timer1 được kích hoạt, nó cũng sẽ tiếp tục chạy.
Wake-up PIC18F4550 từ chế độ ngủ
PIC18F4550 có thể thức dậy từ chế độ ngủ bằng các sự kiện như
- Làm gián đoạn
- Cài lại
- WDT hết giờ
Ngắt là bất kỳ nguồn ngắt như ngắt bên ngoài, gián đoạn hẹn giờ, ngắt usart, adc ngắt vv có thể gây ra vi điều khiển PIC để thoát khỏi chế độ ngủ.
Bit IDLEN không bị ảnh hưởng bởi việc đánh thức có nghĩa là nó sẽ vẫn là 0.
Thí dụ
Hãy phát triển một ứng dụng đơn giản trong đó chúng tôi buộc PIC18F4550 phải vào chế độ ngủ hoặc thoát khỏi chế độ ngủ bằng cách sử dụng ngắt bên ngoài.
Sơ đồ
- Khi vi điều khiển PIC ở chế độ bình thường, nó sẽ bắt đầu nhấp nháy đèn LED và bằng cách cho ngắt bên ngoài nó sẽ ở chế độ ngủ và đèn LED sẽ ngừng nhấp nháy.
- Khi vi điều khiển PIC đang ở chế độ ngủ, sau khi cung cấp ngắt bên ngoài nó sẽ thức dậy và bắt đầu nhấp nháy đèn LED một lần nữa.
Chương trình
#include <pic18f4550.h>
#include "osc_config.h"
#define LED LATD
void MSdelay(unsigned int);
int flag;
void main()
{
TRISD=0;
TRISBbits.RB0=1; /* Set PORTB.0 as input*/
OSCCON=0x72; /* Internal osc. freq. 8MHz with IDLEN=0,
enabling IDLEN enables sleep mode */
INTCON2=0x00; /* INT0 negative edge interrupt selected */
INTCONbits.INT0IF=0; /* Clear INT0 interrupt flag */
INTCONbits.INT0IE=1; /* Enable INTOIF interrupt */
INTCONbits.GIE=1; /* Enable global interrupt */
flag = 0;
LED = 0; /* Turn OFF led initially */
while(!flag)
{
LED = ~LED; /* Blink LED continuously */
MSdelay(300);
}
SLEEP(); /* Enter in sleep mode */
}
void interrupt ISR()
{
flag = ~flag;
INTCONbits.INT0IF=0;
}
void MSdelay(unsigned int val)
{
unsigned int i,j;
for(i=0;i<val;i++)
for(j=0;j<165;j++);
}
Code mô phỏng
Tệp đính kèm
Không có nhận xét nào:
Đăng nhận xét