Чарлиплекс с Ардуино - PullRequest
       33

Чарлиплекс с Ардуино

0 голосов
/ 23 марта 2012

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

1 Ответ

1 голос
/ 25 марта 2012

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

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

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

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

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

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

...