gpt4 book ai didi

c - 关于SSR切换的问题

转载 作者:行者123 更新时间:2023-11-30 15:56:49 25 4
gpt4 key购买 nike

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

但是,问题是,它会触发 3 次,而不是一次。因此,当没有错误时,它将打开 SSR“ON、OFF、ON”。如果再次按下遥控按钮,SSR 将“OFF、ON、OFF”。如果有任何错误,它将显示“EEE”而不是 1“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

当我按下 Remote 按钮而不按下学习按钮时,Data_Ready 设置为 1。所以只有当我按下 Remote 按钮而不按下学习按钮时才会进行比较。

最佳答案

问题似乎出在

SSR=~SSR;

命令。第一次,初始状态已为OFF。因此,在接收到正确的数据后,它会取消 SSR 使其打开。然后三个时间序列将其再次关闭和打开。这对应于您第一次获得正确结果时的情况。

现在,下次接收到正确的数据时,SSR 会否定之前已经处于 ON 的状态,并且 3 个时序现在将变为 OFF=>ON=>OFF

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

(我没有使用过Keil C,我一直在AVR Studio上对ATMEL uC进行编程,所以我只能对所使用的API进行猜测。但这个答案是我从明显的逻辑中推断出来的)

希望有帮助。

干杯!

<小时/>

更新:

Error[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}

关于c - 关于SSR切换的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com