值在while循环中重置

时间:2016-04-05 11:47:18

标签: c while-loop pic

我对这个编程非常陌生,试图通过使用连接到PIC的按钮来增加,减去和设置警报。问题是在while循环之后计数未保存并且正在重置。   - button1 = ADD,button2 = MINUS,按钮1 + 2 + 3 = ALARM   - 无法弄清楚为什么整体计数被重置为0   - 任何帮助都会很棒

#include <main.h>
#ZERO_RAM

int a = 0;
int state;
char data = 'y';
short int flags[3];
char uart_rd;

void main()
{
    setup_wdt(WDT_1MS); //~1.0 ms reset

    port_a_pullups(0xFF); // Defining PORTA as pullup Resistors

    printf("program start" nr); //<------keeps resetting value to 0 HERE

    while (TRUE) // infinite loop
    {
        if (!input(PIN_A1)) // add button
        {
            if (!flags[0])
            {
                flags[0] = 1;
                a++; // add one to overall count
                printf("ADDED, Total= %dnr", a); // prints count
            }
        }
        else
        {
            flags[0] = 0;
        }
        if (!input(PIN_A2)) // minus button
        {
            if (!flags[1])
            {
                flags[1] = 1;
                a--; // take away 1 from count
                printf("MINUS, Total= %dnr", a); // print count
            }
        }
        else
        {
            flags[1] = 0;
        }
        if ((!input(PIN_A1)) && (!input(PIN_A2)) && (!input(PIN_A3))) // all buttons     equal alarm
        {
            printf("ALARM HAS BEEN SETnr"); // if all buttons are held constant alarm
            // is printed through Terminal
        }
        else
        {
            flags[2] = 0;
            output_high(PIN_A0); // led goes high
            delay_ms(500); // flashing LED every cycle
            output_low(PIN_A0); // led goes low
            printf("Overall Count= %dnr", a); // printf overall count
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您有以下错误:

  • 您永远不会在任何地方初始化flags。当然,标准要求静态存储持续时间变量初始化为零。但是在嵌入式系统中,有一个非常常见的非标准扩展,它从启动代码中删除了“零输出”部分。创建项目时,您经常会选择“最小启动”或“标准C”。因此,在使用它们之前,请始终在运行时手动初始化所​​有变量。强大的嵌入式代码不会对.data.bss段中的变量的默认值做出任何假设。

  • 您尚未实施任何去抖动。请查看一些有关如何阅读嵌入式系统中的按钮的初学者教程,以避免机电信号反弹的问题。信号反弹导致代码flags[0] = 0;被执行。

  • 每当有人按下按钮时,只要按下按钮,增加计数器的条件就会保持为真。微控制器足够快,可以在缓慢的人按下按钮的过程中运行该代码数千次。相反,您应该只在按钮从非活动状态变为活动状态时增加计数器。显然,执行此操作的代码需要在去抖后找到