查看: 2185|回复: 3
|
如何让 PIC16F877A 从 sleep() 功能醒来
[复制链接]
|
|
各位大大好, 我用的是 PIC16F877A & CCS Compiler. 程序一开始时 LED OFF, 然后 PIC 进入 sleep() 功能. 当有 data 传送进 RS232 时, 如果收到 data = 0x01, PIC 就会从 sleep() 功能醒来, 如果收到其他 data, PIC 就会返回 sleep() 功能 . 这里有一些疑问想请问各位大大:
1. 我用 Proteus simulate 时, 当 PIC 收到其他 data 返回 sleep() 功能时为什么 LED 没有自动 OFF 呢? 是不是因为它停在 sleep 之前的程序, 醒来时才继续接下来的程序?
2. sleep() 功能到底有什么用? 不是用来省电吗?
我的程序如下:
#include <16F877A.h>
#fuses HS, NOWDT
#use delay(clock = 20000000)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
#define LED PIN_B7
char data;
int1 protocol_correct; // Protocal received status.
short sleep_mode;
#INT_RDA // RS232 Interrupt Service Routine.
void isr_rs232()
{
data=getc();
protocol_correct = TRUE;
}
void main ()
{
protocol_correct = FALSE;
sleep_mode = TRUE;
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
output_low(LED);
while(1)
{
if(protocol_correct == TRUE)
{
if(data == 0x01)
{
output_high(LED); //led on;
protocol_correct = FALSE;
sleep_mode=FALSE;
}
else
{
protocol_correct = FALSE;
sleep_mode=TRUE;
}
}
if(sleep_mode==TRUE) // if sleep flag set
sleep(); // make processor sleep
}
}
[ 本帖最后由 sky_cs1986 于 27-8-2009 12:03 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 27-8-2009 08:56 AM
|
显示全部楼层
原帖由 sky_cs1986 于 26-8-2009 11:59 PM 发表
1. 我用 Proteus simulate 时, 当 PIC 收到其他 data 返回 sleep() 功能时为什么 LED 没有自动 OFF 呢? 是不是因为它停在 sleep 之前的程序, 醒来时才继续接下来的程序?
2. sleep() 功能到底有什么用? 不是用来省电吗?
SLEEP 用来省电功能是没错。
当进入睡眠时,MCU 的输出。输入脚是保持在睡眠前的状态的。
所以当睡眠前你点亮 LED,进入睡眠时,是保持点亮的状态。
睡眠是将你的程序停止,可是 MCU 心脏还是跳动的。 |
|
|
|
|
|
|
|
楼主 |
发表于 27-8-2009 10:21 AM
|
显示全部楼层
原帖由 rothmans 于 27-8-2009 08:56 AM 发表
SLEEP 用来省电功能是没错。
当进入睡眠时,MCU 的输出。输入脚是保持在睡眠前的状态的。
所以当睡眠前你点亮 LED,进入睡眠时,是保持点亮的状态。
睡眠是将你的程序停止,可是 MCU 心脏还是跳动的。
谢谢rothmans大大的回复,解答了我的疑问。我想请问当MCU进入睡眠时,LED是保持点亮的状态,那么MCU输出的voltage & current 会减少吗,还是一样? |
|
|
|
|
|
|
|
楼主 |
发表于 3-9-2009 03:19 PM
|
显示全部楼层
我用了CCS里的例子,用Proteus simulate它是可以work的。
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
// global flag to send processor into sleep mode
short sleep_mode;
// external interrupt when button pushed and released
#INT_EXT
void ext_isr() {
static short button_pressed=FALSE;
if(!button_pressed) // if button action and was not pressed
{
button_pressed=TRUE; // the button is now down
sleep_mode=TRUE; // activate sleep
printf("The processor is now sleeping.\r\n");
ext_int_edge(L_TO_H); // change so interrupts on release
}
else // if button action and was pressed
{
button_pressed=FALSE; // the button is now up
sleep_mode=FALSE; // reset sleep flag
ext_int_edge(H_TO_L); // change so interrupts on press
}
if(!input(PIN_B0)) // keep button action sychronized wth button flag
button_pressed=TRUE;
delay_ms(100); // debounce button
}
// main program that increments counter every second unless sleeping
void main() {
long counter;
sleep_mode=FALSE; // init sleep flag
ext_int_edge(H_TO_L); // init interrupt triggering for button press
enable_interrupts(INT_EXT);// turn on interrupts
enable_interrupts(GLOBAL);
printf("\n\n");
counter=0; // reset the counter
while(TRUE)
{
if(sleep_mode) // if sleep flag set
sleep(); // make processor sleep
printf("The count value is: %5ld \r\n",counter);
counter++; // display count value and increment
delay_ms(1000); // every second
}
} |
|
|
|
|
|
|
| |
本周最热论坛帖子
|