Чарлиплексирование с Arduino

Я пытаюсь реализовать 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, и проблема не затронула ее.


person drblah    schedule 22.03.2012    source источник
comment
Что вы точно имеете в виду под запуском через AVR Studio? Тогда вы настраиваете код на простой C? Если да, пожалуйста, также вставьте этот код.   -  person A.H.    schedule 25.03.2012


Ответы (1)


Первое, что нужно исправить, это:

char temp = char(Serial.read());
/*byte*/ tempChar = atoi(&temp);

Функциям atoi нужен массив char с завершением \0. В вашем случае вам может повезти, если где-то после вашего единственного символа есть 0-байт. И поскольку вы не знаете, что компилятор поставил после вашей переменной temp, и когда эта неизвестная вещь меняет свое состояние, вы...

Поэтому, пожалуйста, попробуйте этот код:

char temp = char(Serial.read());
tempChar = temp - '0';

Затем сообщите, помогло ли это.

person A.H.    schedule 25.03.2012