Я пытаюсь реализовать 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
ОБНОВЛЕНИЕ
Я попытался запустить свою программу через AVR Studio 5, и проблема не затронула ее.