【发布时间】:2014-12-16 13:25:15
【问题描述】:
我正在尝试使用旋转编码器来控制使用 Atmel (ATmega328P Xplained mini) 微处理器从 0 到 9 计数的 7 段显示器的速度。我的问题是,每当我运行程序时,显示器的计数越来越快,直到你只能看到“8”,有时我似乎可以通过逆时针转动旋转编码器来降低速度,有时根本没有效果。由于我在编程方面没有那么丰富的经验,尤其是这方面的经验,我希望有人有能力并愿意提供帮助。
这是我的代码:
#include <avr/io.h>
void Display (uint8_t x)
{
static uint8_t tabel[] =
{0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000,0b10010000};
PORTD = tabel[x];
}
int GetInput (void)
{
uint8_t x = PINC&1;
uint8_t y = (PINC>>1)&1;
if (x == 0 && y == 0) {return 0; }
else if (x == 1 && y == 0) {return 1;}
else if (x == 0 && y == 1) {return 2;}
else {return 3;}
}
int main(void)
{
DDRD = 0xFF; // set PortD as an output
DDRC = 0x00; // set PortC as an input
PORTB = 0x03; // Activate Pull-up resistors
float d = 9000;
int tick = 0;
int i = 0;
int input, state = 0; // initial state
int oldInput = 0;
while (1)
{
input = GetInput();
if (oldInput == 0 && input == 1)
{
d = (d * 1.1);
//slower
}else if (oldInput == 0 && input == 2)
{
d = (d * 0.9);
//faster
}else if (oldInput == 1 && input == 0)
{
d = (d * 0.9);
//faster
}else if (oldInput == 1 && input == 3)
{
d = (d * 1.1);
//slower
}else if (oldInput == 2 && input == 0)
{
d = (d * 1.1);
//slower
}else if (oldInput == 2 && input == 3)
{
d = (d * 0.9);
//faster
}else if (oldInput == 3 && input == 1)
{
d = (d * 0.9);
//faster
}else if (oldInput == 3 && input == 2)
{
d = (d * 1.1);
//slower
}
oldInput = input;
switch (state)
{
case 0: //ini
Display(0);
state = 1;
break;
case 1: //count
if (i == 9)
{
i = 0;
Display(i);
}
else
{
i++;
Display(i);
}
state = 2;
break;
case 2: // delay
if (tick < d)
{
state = 2;
tick++;
}
else
{
state = 1;
tick = 0;
}
break;
case 3: //reset / destroy
break;
}
}
}
【问题讨论】:
-
micro 会在第一次超时前多次循环运行,每次乘以 0.9 将很快使 d 变为 0。一旦达到 0,无论乘以多少次 1.1它将保持为 0,您将永远不会再在
case 2:中等待。 -
如果您可以解释编码器的位模式的含义以及您希望它们如何影响时序,我可以建议一个替代方案。
-
在每次点击旋转编码器之间,位值都会经过:CW 为 2-3-1-0,CCW 为 1-3-2-0,它应该只是计数,例如顺时针转动时快 10%,逆时针转动时慢 10%。实际上,我只是希望它在每次点击之间更改一次(例如,如果值从 0-1 或 1-0 变化)但是当它不起作用时扩展代码然后我迷路了。
标签: c atmel microprocessors atmelstudio