MAX7219 с массивом 8digit 7seg

У меня есть беспокойство по поводу обработки порта библиотеки. Я успешно использовал прямую манипуляцию направлением порта в предыдущих проектах, но здесь, похоже, есть проблема.

// This code mostly taken from the example
#include "LedControl.h"

LedControl lc=LedControl(11,13,10,1);
//LedControl lc=LedControl(12,11,10,1); // original
// pin 12 is connected to the DIN pin (now MOSI 11)
// pin 11 is connected to the CLK pin (now SCK 13)
// pin 10 is connected to the CS pin  (now SS 10)
// 1 as we are only using 1 MAX7219

// I am actually using all arduino pins except 12 for my project
#define PD_MSK  B11111100 // Data pins PD2..7 (pins2..7)
#define PB_MSK  B00000011 // Data pins PB0,1 (pins8,9)
#define PC_MSK  B00001111 // Data pins PC0..3 (pins 14..17)

void setup()
{
// set pins 2..9 as inputs  
  DDRD = DDRD & !PD_MSK; // работает нормально
  DDRB = DDRB & !PB_MSK; // настройка портов D,B входов *** не работает с этим
 // pinMode(8, INPUT); //*** работает с этим
  //pinMode(9, INPUT); //*** работает с этим

  DDRC = DDRC | PC_MSK; // настройка PortC0..3 в качестве выходов
  PORTC |= 0x0F; // set PortC0..3 high (default)

  // ноль относится к числу MAX7219, он равен нулю для 1 чипа
  lc.shutdown(0,false);// выключите энергосбережение, включите дисплей
  lc.setIntensity(0,8);// устанавливает яркость (0~15 возможных значений)
  lc.clearDisplay(0);// очистить экран

}
void loop()
{
  //числа от 7 до 0
  for (int a=0; a<8; a++)
  {
    lc.setDigit(0,a,a,false);
  }

  delay(1000);

  //отображение номера 8 на всех сегментах
  for (int a=0; a<8; a++)
  {
    lc.setDigit(0,a,8,false);
  }
  delay(1000);

  // номера от 7 до 0 в обратном порядке
  for (int a=8; a>=0; a--)
  {
    lc.setDigit(0,a,a,false);
    //delay(100);
  }
  delay(1000);

}

Настройка направления прямого порта, похоже, не позволяет библиотеке работать, в то время как команды pinMode, выполняющие ту же работу, делают это. Я отмечаю, что библиотека использует программное обеспечение SPI, но я хотел бы использовать аппаратное обеспечение, если это возможно. Я, конечно, использовал аппаратный SPI с частыми изменениями направления порта на оставшихся выводах для других проектов. Есть ли какое-нибудь понимание того, почему возникает эта проблема?

- Спасибо.

, 👍0

Обсуждение

Какая связь между "библиотека не работает, если я настраиваю порты вручную" и "я хотел бы использовать аппаратный SPI"?, @the busybee

Поскольку большинство библиотек выпускаются с открытым исходным кодом, заглядывали ли вы в их исходники? Этот открыт? Если да, то что показало ваше исследование?, @the busybee

Тот самый ! является логическим оператором. Побитовый вариант-это ~, @KIIV

Однако после запуска/перезапуска DDRx очищаются и настраиваются как входы, так что я не вижу никакого смысла в этих &=, @KIIV

Что говорит "LedControl.h" о том, что вы используете аппаратный SPI против программного SPI?, @CrossRoads


1 ответ


-1

Как всегда, я рекомендую старый RTFM (прочитайте чертово руководство) библиотеки LedControl.h.
В FAQ его четко указано:

Почему вы не используете аппаратную SPI-шину Arduino?

Когда я писал первую версию библиотеки , я мало что знал о процессорах Arduino или AVR в целом, и я ничего не знал о написании кода для аппаратной SPI-шины на ATmega. Но я знал, как работает протокол SPI и как я мог бы заставить это работать, используя простые команды digitalWrite (). Я обнаружил, что код библиотеки достаточно быстр для обычных случаев использования, поэтому нет необходимости в высокоскоростной связи.

Другими сильными сторонами в пользу (по общему признанию, тривиального) дизайна кода являются следующие: Используйте любые три свободных вывода ввода - вывода вашей платы для аппаратного обеспечения - Простая отладка. Намного проще, чем управлять 3 различными устройствами SPI подключенная к той же аппаратной шине библиотека легко переносима на другие платформы, так как использует только две очень простые функции из языка Arduino

Таким образом, с помощью этой библиотеки вы явно никогда не использовали аппаратный SPI (хотя вы могли бы использовать контакты, но только с помощью программного обеспечения).

,

В ответе № 2 указывалось, что я использовал неверного оператора для задания направления порта. (! вместо ~ - побитового.), @Ardathome

В ответе № 2 указывалось, что я использовал неверного оператора для задания направления порта. (! вместо ~ - побитового.) Моя ошибка! Я хочу использовать аппаратный SPI в своем конечном проекте (это был просто тест), так как это может быть быстрее. Я использовал эту библиотеку, чтобы убедиться, что внешнее оборудование работает-оно работает и сейчас. Использование разных контактов не имеет никакой пользы в моем случае, поэтому я, вероятно, напишу свой собственный (аппаратный) драйвер SPI. У меня уже есть система управления направлением портов для создания 8 - битной шины ввода-вывода для использования с другим внешним оборудованием-если я правильно скопирую ее на этот раз. Спасибо всем, кто нашел время и нашел мою ошибку., @Ardathome