2012-06-07 46 views
0

我正在使用Keil C編寫我的程序。我遇到了一些問題,我被拖了很多年,我的程序會用遙控器切換SSR(固態繼電器)。我的程序如何工作:首先,有一個學習按鈕,它將學習遙控器的任何紅外信號,並將它存儲在「數據」中。當我再次按下遙控器時,它會將數據存儲到「TempDATA」中。然後我的程序會比較兩者並檢查是否有錯誤。如果沒有錯誤,它將切換SSR並且綠色LED將亮起。如果有任何錯誤,它將打開紅色LED。關於切換SSR的問題

但問題是,它會觸發3次而不是一次。所以,當沒有錯誤時,它會打開SSR'ON,OFF,ON'。如果再次按下遙控器按鈕,則SSR將「關閉,開啓,關閉」。如果有任何錯誤,它將顯示'EEE'而不是'E'。我如何解決這個問題?

/***********************Problem Solved************************/ 

通過在添加延遲:

while(1) 
{ 
    if(Data_Ready)     //Data_Ready = 1 
    { 
       /*insert delay here*/ 
       Data_Ready = 0; 
       Result = 1; 
       for(j=0;j<30;j++)    
       . 
       . 
       . 

的問題就解決了。

/****************************************MAIN*******************************************/ 
void main(void) 
{ 
unsigned char Result=0; 
unsigned int j; 
unsigned int x =0;        
TMOD = 0x21;   //Enable Timer 1 for 2nd Serial Port & Timer0 
TH1 = 0xFD;   //9600 Baud Rate 
SCON0 = 0x50;   
SSR = 0; 
Learn = 0;   
RedLED = 0;   
GreenLED= 0; 

IE = 0x84;   //Enable External Interrupt 1               
IT1 = 1;    //Set External Interrupt 1 to Edge Triggered. 



while(1) 
{ 
    if(Data_Ready)     //Data_Ready = 1 
    { 
     Data_Ready = 0; 
     Result = 1; 
     for(j=0;j<30;j++)    //Loop 30 times 
     { 
      if(DATA[j] != TempDATA[j]) //Compare DATA to TempDATA 
      { 
       Result = 0;  
       break;     //break from loop 
      }    
     }//end for 

     if(Result)     
     { 
      Result = 0; 
      GreenLED = 1;   //Turn ON GreenLED 
      RedLED = 0;    //Turn OFF RedLED 

      SSR = ~SSR;    //Toggle SSR to ON and OFF 


      SerialTx('S'); 
      SerialTx('S'); 
      SerialTx('R'); 

     } 
     else 
     { 
      Result = 0; 
      RedLED = 1;    //Turn ON RedLED 
      GreenLED = 0;   //Turn OFF GreenLED 

      SerialTx('E');   //Print E on MTK to show Error  
     } 

    }//end if 
}//end while 

}//end main 

當我按下遙控器按鈕而沒有按下「學習」按鈕時,Data_Ready被設置爲1。所以它只會比較我按遙控器按鈕時沒有按下「學習」按鈕。

+0

你嘗試過在調試器中運行? –

+0

@MitchWheat是的,它工作得很好。 – xrainxfallx

+0

作爲一邊,請不要評論一個循環「//循環30次」 –

回答

1

這個問題似乎是與

SSR=~SSR; 

命令。第一次,初始狀態已經關閉。因此,在接收到正確的數據時,它會使SSR無效。然後三個時間序列再次將其關閉並打開。這對應於您獲得正確結果時的第一次情況。

現在,當接收正確的數據在接下來的時間,SSR否定了以前的狀態,這是已經打開和3時間序列現在是OFF => ON => OFF

所以,你能做些什麼在這裏是在發送下一個ON/OFF序列之前首先有意將SSR設置爲OFF狀態。

(我沒有使用Keil C語言,我已經在AVR Studio的工作了編程ATMEL UCS,所以所使用的API的我只能做猜測。但是,這個答案是我從表觀邏輯推導)

希望能幫助到你。

乾杯!


更新:

沒有錯誤[SerialTx( 'E')給出正確的輸出?

我假設SSR的值爲'0'或'1'或TRUE/FALSE。

因此,在命令SSR =〜SSR之前設置SSR = 0(或關閉它的東西),條件是它僅在On => Off => On觸發器的第一個序列上執行。這需要一個全局靜態標誌來保存序列的狀態。例如,

static int sequence_in_progress = 0; 
當信號被接收

:sequence_in_progress 1 它將被每個接收到信號的時間遞增。

現在,這可以作爲一個檢查,如果接收到的第一次正確的信號設置SSR爲關:

if(sequence_in_progress==1) 
{ SSR=0; //Or something that turns it off} 

if(sequence_in_progress==3) 
{sequence_in_progress=0;//reset it to zero every time your code finishes processing} 
+0

即使將SSR的設置清除爲0,問題仍然存在。我忘記了一個重要的部分,那就是Error [SerialTx('E')]也會觸發3次。 – xrainxfallx

+0

在我的答案中檢查更新,它使用全局標誌來維持迭代狀態,並在第一次接收到信號時有條件地將SSR設置爲OFF。 – Anshul

+0

看來,如果我加了一個很長的延遲(10s),它只會觸發一次。我認爲問題在於切換SSR。 – xrainxfallx