Я пытаюсь реализовать Charlieplexing на моем Arduino. На данный момент я использую 3 выхода для управления 6 светодиодами, и все работает нормально. Проблема в том, что у меня есть эта вновь появляющаяся ошибка, которая, кажется, приходит и уходит, когда я помещаю задержки в одну из моих функций. Из-за этой ошибки мой последовательный вход (через USB-кабель Arduino) портится, если я помещаю некоторые задержки в более или менее несвязанную функцию.
Я управляю массивом Charlieplexing, отправляя число от 1 до 6 через последовательный порт.
if(Serial.available() > 0)
{
tempChar = 0;
char temp = char(Serial.read());
tempChar = atoi(&temp);
Serial.println(tempChar, DEC);
}
Затем он преобразуется в целое число, которое затем интерпретируется функцией и преобразуется в правильное состояние порта для каждого из трех портов ввода / вывода.
void Charlie(byte input)
{
if(input == 1)
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
digitalWrite(2, 1);
digitalWrite(3, 0);
digitalWrite(4, 0);
}
else if(input == 2)
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT);
digitalWrite(2, 0);
digitalWrite(3, 1);
digitalWrite(4, 0);
}... (continues to input == 6)
Вышеописанное работает очень хорошо, но одновременно включается только один светодиод. Чтобы включить больше, мне нужно будет переключить Arduino между светодиодами, чтобы казалось, что больше включается одновременно.
Для этого я создал новую функцию:
void Range(byte input)
{
if(input == 1)
{
Charlie(1);
}
else if(input == 2)
{
for(byte i = 1; i < 3; i++)
{
Charlie(i);
}
}
else if(input == 3)
{
for(byte i = 1; i < 4; i++)
{
Charlie(i);
delay(4);
}
}... (Continues to input == 6
Здесь возникает проблема. Если я не включаю delay () после вызова моей функции Charlie (), Serial INPUT прерывается. Теперь действительно странная вещь заключается в том, что задержка не должна быть ничем, иначе задержка (0) решит мою проблему.
Когда я посылаю какой-либо вход через последовательный интерфейс, Arduino снова выплевывает его. Поэтому, если я отправлю цифры с 1 по 6, в последовательной консоли это будет выглядеть так:
1 2 3 4 5 6
Это то, что ожидается. Теперь, если я введу функцию Range () без нужных задержек, результат будет выглядеть следующим образом:
15 25 35 45 55 65
Что сломает программу.
Я знаю, что это немного расплывчато, но мне трудно объяснить. Надеюсь, это будет иметь смысл для вас.
Полный код можно найти здесь: http://pastebin.com/t7tdtfid
UPDATE
Я попытался запустить свою программу через AVR Studio 5, и проблема не была затронута.