【问题标题】:I cannot get the led to blink 6 times, then terminate the program in C我无法让 LED 闪烁 6 次,然后在 C 中终止程序
【发布时间】:2015-02-08 04:42:30
【问题描述】:

为什么 exit() 不适用于 PIC16f877?

#include <htc.h>
#include <pic16f877.h>
#include <stdlib.h>

#define _XTAL_FREQ 4e6

int main(void){
    int count;
    int max_count = 6;
    TRISD = 0xBF;
    for (count=0; count<max_count; ++count){
        PORTD   = 0x40;
        __delay_ms(500);
        PORTD   = 0x00;
        __delay_ms(500);
    }
    exit(0);
}

错误信息:

Error   [482] lab1_home.obj; 20. symbol "_exit" is defined more than once in "startup.obj"
Error   [482] lab1_home.obj; 20. symbol "_exit" is defined more than once in "startup.obj"

这些代码程序编译成功的原因是什么,但是led一直在闪烁?

尝试1:

#include <htc.h>
#include <pic16f877.h>

#define _XTAL_FREQ 4e6

void main(void){
    int count;
    int max_count = 6;
    TRISD = 0xBF;
    for (count=0; count<max_count; ++count){
        PORTD   = 0x40;
        __delay_ms(500);
        PORTD   = 0x00;
        __delay_ms(500);
    }
    return;
}

尝试2:

#include <htc.h>
#include <pic16f877.h>
#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ 4e6

int main(void){
    int count = 0;
    int max_count = 6;
    TRISD = 0xBF;
    do {
        count++;
        PORTD   = 0x40;
        __delay_ms(500);
        PORTD   = 0x00;
        __delay_ms(500);
    } while ( count != max_count );
    abort;
}

循环没有退出吗?还是我试图终止程序的方式错误?我还考虑了另外一件事……WDT 与这个循环永远重复有什么关系吗?

【问题讨论】:

  • 你的第二个循环没有初始化count,所以它有一个不确定的值。这就是为什么你有一个无限循环。第一个问题是多重定义的符号。坚持使用第一个版本并弄清楚为什么exit 被多次定义(检查你的标题)。最后,您不需要显式中止或退出;让 main 完成。
  • 而不是 exit(0);在 int main() 你可以做 return 0;
  • 要诊断问题,在程序结束时,您可以将 PORTD 设置回输入 (TRISD=0xff;) 并添加 2 秒的延迟。看看会发生什么
  • 我想我在这里找到了答案:What happens when an embedded program finishes?
  • 又是我的错...是SLEEP() ...

标签: c pic terminate


【解决方案1】:

这段代码成功调用了 sleep 函数并退出了无限循环(感谢@francis):

#include <htc.h>
#include <pic16f877.h>

#define _XTAL_FREQ 4e6
#define SLEEP() asm("sleep")

int main(void){
    int count = 0;
    int max_count = 6;
    TRISD = 0xBF;
    while(count<max_count){
        count++;
        PORTD   = 0x40;
        __delay_ms(500);
        PORTD   = 0x00;
        __delay_ms(500);
    }
    SLEEP();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2014-03-19
    • 2015-03-24
    • 2015-12-04
    相关资源
    最近更新 更多