【发布时间】:2016-05-31 15:03:38
【问题描述】:
我正在做一个嵌入式 (avr) 项目,基本上我想根据一个大头针被按下的时间打印出一些不同的东西。我无法弄清楚当值通过时会发生什么并满足沿途的 if 语句(按钮仍被按下,因此计数器递增)。
设置如下:
如果溢出在 7-48 之间(按钮按下 30ms-200ms),打印出一个 '.'
如果溢出大于 48(按钮按下超过 200 毫秒),打印出一个 '-'
如果溢出大于 97(超过 400 毫秒没有按下按钮),打印出一个 ' '
我目前的代码如下:
static inline void isr(char type) {
static unsigned int overflows = 0;
static unsigned char idx = 0;
if (type == 'e') { // edge captured
if (TCCR1B & 0x40) { // rising edge
if (overflows < 7) {
// do nothing
} else if (overflows < 49) {
buffer[idx++] = '.';
size++;
} else {
buffer[idx++] = '-';
size++;
}
}
overflows = 0; // restart counting overflows at each edge
} else { // overflow occured
overflows++;
if (buffer[idx-1] != ' ' && !(TCCR1B & 0x40) && overflows > 97) {
buffer[idx++] = ' ';
size++;
}
}
我不确定这是否正确,因为似乎在“-”之前总会有一个“.”,因为随着溢出值的增加,它满足
有什么想法吗?
【问题讨论】:
-
您是在进行一次测量,将其存储在某处,然后对该值进行逻辑处理吗?还是每次问
if时都在重新测量? -
基本上,当我按下按钮时,它会检测到边缘。只要我按住那个按钮,它就会开始计数。这是一个莫尔斯电码检测器,所以我不想每次按住按钮足够长的时间以获得“-”时打印出“.-”。
-
按钮也会弹跳。当你按下它时,你会得到不止一个你正在检测的边缘。弹跳很快,但微控制器更快,因此它会多次拾取。您可能必须解除按钮的抖动才能执行您想做的事情。
-
好吧,我的问题与 C 如何在 if 语句中执行事物有关。就像我会按住按钮一段时间并希望它在超过 200 毫秒(49 次溢出)时打印出一个“-”,我不希望它也打印出一个“。”因为显然它必须保持在 30-200ms 之间(7-49 溢出)。忽略“溢出”的事情,这与我的时钟速度和计时器大小有关。
-
不要发布伪代码,发布您的实际代码,并提供有关预期和实际行为的信息。