首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于SSR切换的问题

关于SSR切换的问题
EN

Stack Overflow用户
提问于 2012-06-07 10:16:10
回答 1查看 105关注 0票数 0

我正在使用Keil C编写我的程序。我有一些问题,我已经卡住了很长时间,我的程序将切换到SSR(固态继电器)与遥控器。我的程序如何工作:首先,有一个学习按钮,将学习任何红外信号的遥控器,它将存储在“数据”。当我再次按遥控器时,它会将数据存储到"TempDATA“中。然后我的程序会将两者进行比较,并检查是否有错误。如果没有错误,它将切换SSR,绿色LED将亮起。如果有任何错误,它将亮起红色LED。

然而,问题是,它将触发3次而不是1次。因此,当没有错误时,它将打开SSR‘开,关,开’。如果再次按下遥控器按钮,SSR将“关、开、关”。如果有任何错误,它将显示'EEE‘而不是1 'E’。我该如何解决这个问题?

代码语言:javascript
复制
/***********************Problem Solved************************/

通过在以下位置添加延迟:

代码语言:javascript
复制
while(1)
{  
    if(Data_Ready)                   //Data_Ready = 1
    {
               /*insert delay here*/
               Data_Ready = 0; 
               Result = 1;
               for(j=0;j<30;j++)              
               .
               .
               .

问题就解决了。

代码语言:javascript
复制
/****************************************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。因此,只有当我按下遥控器按钮而没有按下学习按钮时,它才会进行比较。

EN

回答 1

Stack Overflow用户

发布于 2012-06-07 12:43:51

问题似乎出在

代码语言:javascript
复制
SSR=~SSR;

命令。第一次,初始状态已经关闭。因此,一旦接收到正确的数据,它就会否定SSR的启动。然后,三个时间序列使其断断续续。这对应于第一次获得正确结果的情况。

现在,下一次接收到正确的数据时,SSR将取消先前的状态,该状态已经打开,并且3个时间序列现在将为OFF=>ON=>OFF

因此,您可以在这里做的是,在发送下一个开/关序列之前,首先故意将SSR设置为关状态。

但这个答案是我从明显的逻辑中推导出来的)

希望能有所帮助。

干杯!

更新:

ErrorSerialTx('E')是否提供正确的输出?

我假设SSR的值类似于'0‘或'1’或TRUE/FALSE。

因此,在命令SSR=~SSR之前设置SSR=0 (或关闭它),条件是它只在On=>Off=>On触发器的第一个序列上执行。这将需要保存序列状态的全局静态标志。例如,

代码语言:javascript
复制
static int sequence_in_progress = 0;

当接收到信号时: sequence_in_progress +1,它将在每次接收到信号时递增。

现在,如果第一次接收到正确的信号,则可以使用此检查将SSR设置为off:

代码语言:javascript
复制
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}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10924810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档