2014-12-17 3 views
0

Так что микро, которое я использую, является PIC 18F.C-Pic Counter issue

Если установлено Alarm_Status.bits.b3, который по существу является просто переключателем, создается тревога. Первый фрагмент кода работает так, как должно

BS(TRISB,7);        // Bund sw port=input. 
    DelayMs(2);         // will rise is bund SW open 
    if(RB7){ 
     if(Control.bits.BUND_ENABLE){   // if bund alarm enabled 
      if(Alarm_Status.bits.b3){   // if already set 
       DU_Reason.bits.EmergencyDialIn=1; // alarm! 
      } 
     } 
     Alarm_Status.bits.b3=0;     // Bund Sw Open 
    } 
    else Alarm_Status.bits.b3=1;    // Bund Sw Closed 
    BC(TRISB,7); 

Однако я хочу тревожить только если переключатель установлен в течение определенного периода времени вместо того, когда переключатель установлен прямо away.The функция вызывается каждый второй. Может ли кто-нибудь указать мне направление, в котором я ошибаюсь.

 int count = 0; 
     int fixedCount = 20; 
     BS(TRISB,7);       // Bund sw port=input. 
     DelayMs(2);        // will rise is bund SW open 
     if(RB7){         
      if(Control.bits.BUND_ENABLE){  // if bund alarm enabled 
       if(Alarm_Status.bits.b3){  // if already set 
        count +=10;     //count increased by 10 
       } 
        if(count == fixedCount) { 
         DU_Reason.bits.EmergencyDialIn=1;// alarm! 
         count = 0; 
        } 
      } 
      Alarm_Status.bits.b3=0;    // Bund Sw Open 
     } 
     else 
      count = 0; 
      Alarm_Status.bits.b3=1;  // Bund Sw Closed 
      BC(TRISB,7);  
+3

'переменная count' должна быть глобальной. –

+0

«Бунд» не английский, не так ли? Это похоже на важное слово. – unwind

+0

Показывает, что вы знаете, это английский, вы когда-нибудь слышали о датчике привязки, очевидно, нет. Во всяком случае, спасибо Алекс, заявив, что он во всем мире отлично справился. – NewLook

ответ

1

Вы можете сделать это count статическим. Проблема с текущим кодом, после того, как в каждом случае, счетчик получает повторно инициализируется в 0, и, следовательно, он никогда не дойдет до fixedCount

Если изменить код как:

#define FIXED_COUNT 20 //Why to waste memory?? 

void PollSwitch() 
{ 
    static int count = 0; 

    BS(TRISB,7);       // Bund sw port=input. 
    DelayMs(2);        // will rise is bund SW open 

    if(RB7) 
    {         
     if(Control.bits.BUND_ENABLE){    // if bund alarm enabled 
      if(Alarm_Status.bits.b3){  // if already set 
         count +=10;     //count increased by 10 
      } 
      if(count == FIXED_COUNT) { 
       DU_Reason.bits.EmergencyDialIn=1;// alarm! 
       count = 0; 
       Alarm_Status.bits.b3=0;    //Alarm is raised, Open switch 
       } 
     } 
       // Alarm_Status.bits.b3=0;   // Bund Sw Open <<< NOT NEEDED, IMO 
    } 
    else 
    { 
     count = 0; 
     Alarm_Status.bits.b3=1;  // Bund Sw Closed 
    } 
     BC(TRISB,7);  
}