在子程序延迟前卡住
Stuck before delay in sub program
我的任务是编程两个定时器,我在我的液晶显示器上显示一些东西。我有一个矩阵键盘,我可以输入一些基本的东西,比如数字和一些字母,代码如下:
void keyboard_read()
{
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
digitalWrite(s4, HIGH);
if(digitalRead(r1) == LOW){lcd.print("1"); delay(200);k++;feld[k]=1;}
if(digitalRead(r2) == LOW){lcd.print("4"); delay(200);k++;feld[k]=4;}
if(digitalRead(r3) == LOW){lcd.print("7"); delay(200);k++;feld[k]=7;}
if(digitalRead(r4) == LOW){lcd.print("A"); delay(200);k++;feld[k]='A';}
digitalWrite(s1, HIGH);
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
digitalWrite(s4, HIGH);
if(digitalRead(r1) == LOW){lcd.print("2"); delay(200);k++;feld[k]=2;}
if(digitalRead(r2) == LOW){lcd.print("5"); delay(200);k++;feld[k]=5;}
if(digitalRead(r3) == LOW){lcd.print("8"); delay(200);k++;feld[k]=8;}
if(digitalRead(r4) == LOW){lcd.print("0"); delay(200);k++;feld[k]=0;}
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
digitalWrite(s3, LOW);
digitalWrite(s4, HIGH);
if(digitalRead(r1) == LOW){lcd.print("3"); delay(200);k++;feld[k]=3;}
if(digitalRead(r2) == LOW){lcd.print("6"); delay(200);k++;feld[k]=6;}
if(digitalRead(r3) == LOW){lcd.print("9"); delay(200);k++;feld[k]=9;}
if(digitalRead(r4) == LOW){lcd.print("B"); delay(200);k++;feld[k]='B';}
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
digitalWrite(s4, LOW);
if(digitalRead(r1) == LOW){lcd.print("F"); delay(200);k++;feld[k]='F';}
if(digitalRead(r2) == LOW){lcd.print("E"); delay(200);k++;feld[k]='E';}
if(digitalRead(r3) == LOW){lcd.print("D"); delay(200);k++;feld[k]='D';}
if(digitalRead(r4) == LOW){lcd.print("C"); delay(200);k++;feld[k]='C';}
}
当我输入第一个定时器(Timer0) keyboard_read()工作得很好,但是当我进入第二个定时器(Timer2) keyboard_read()停止在延迟命令。当我尝试将keyboard_read()放入循环()时,它仍然在延迟命令处停止(此时循环中没有此命令)。
Timer0代码:
ISR(TIMER0_COMPA_vect) //Durchlaufendes Menü
{
cnt0++;
//Tastatureingabe_______________________________________________________________
keyboard_read();
if(feld[k]=='A') //Abfrage nach AutoStart
{
lcd.clear(); lcd.setCursor(0,0); lcd.print("AutoStart");
TCCR0B = 0x00; //Timer0 ausschalten
TCCR2B = 0x07; //Timer2 einschalten
}
else if(feld[k]=='E') //Abfrage nach Einstellungen
{
lcd.clear(); lcd.setCursor(0,0); lcd.print("Einstellungen");
TCCR0B = 0x00; //Timer0 ausschalten
//TCCR1B = 0x00; //Timer1 einschalten (not declared yet)
k=0;
}
else if((feld[k]!=NULL)) //Falsche Eingabe Abfrage
{
lcd.clear(); lcd.setCursor(0,0); lcd.print("Falsche Eingabe");
} //other things are not necessary
time2的代码:
ISR(TIMER2_COMPA_vect) //Ausgabe der Parameter
{
cnt2++;
loop();
//Tastatureingabe_________________________________________________________
keyboard_read();
if(feld[k]=='B') //Abfrage nach AutoStart
{
lcd.clear(); lcd.setCursor(0,0); lcd.print("Zuruek");
TCCR0B = 0x0D; //Timer0 einschalten
TCCR2B = 0x00; //Timer2 ausschalten
}
else if((feld[k]!=NULL))
{
lcd.clear(); lcd.setCursor(0,0); lcd.print("Falsche Eingabe");
}
我是否必须在keyboard_read()子程序或计时器中更改某些内容以使其工作?
提前感谢您的帮助。
您可以阅读关于中断的长文章:中断如何在Arduino Uno和类似的板上工作?on Arduino SE
简而言之:
- 中断必须尽可能短。如果你需要延迟,你做错了,你可以稍后在循环中处理它。只需设置一些标志(或者您可以直接使用COMPA溢出标志而不中断,您只需检查此标志并通过将逻辑1写入其中来清除它)
- 你不能使用Arduinos
delay
,因为它需要定时器/计数器0溢出中断运行。所有中断都自动地在ISR处理程序中被阻塞。所以你在等待永远不会发生的变化。 - 你也不能使用任何其他可能依赖于另一个中断的东西。例如Serial。写/打印工作直到发送缓冲区被填满,然后出现死锁。
- 你为什么打电话给
loop()
?在处理程序完成任务后,它将返回到被中断的代码。
相关文章:
- 如何仅为一个函数添加延迟
- 以在Qt中的IF语句中设置时间延迟
- 模板化类中静态成员的延迟初始化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 将自定义函数传递到基抽象类中以延迟执行
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 如何在 c++ 中延迟?
- 如何测量管道延迟?
- 获取毫秒延迟的错误值
- C++异常被捕获延迟,可能导致这种情况的原因是什么?
- 我的子类的属性是延迟初始化的
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 代码战士的延迟
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- C++延迟后的优化器调用函数
- 将作业传递给另一个函数,而不会延迟 arduino
- 延迟 _getch() 输入
- 为什么添加延迟会提高此多线程环境中的数据吞吐量?
- 在子程序延迟前卡住