Вопрос по MAX7219/7221

Kruppa
Offline
Зарегистрирован: 18.12.2015

Доброе утро! 

Подскажите, пожалуйста, как вручную, без библиотеки работать со сдвиговыми регистрами, как пример на MAX 7219?

У нас есть входы:

1. din

2. CS

3. CLK

 

Как мне правильно подавать логические сигналы, чтоб  выводить какую-то информацию, любую? 

Как пример, сделал небольшой код. Но как я понимаю, соврешенно неправильный)))

int dIn = 10;
int clk = 10;


void setup() {
  // put your setup code here, to run once:
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);


}

  void loop() {
digitalWrite(clk, LOW);
digitalWrite(clk, HIGH);
    
digitalWrite(dIn, HIGH);
digitalWrite(dIn, HIGH);
digitalWrite(dIn, HIGH);
digitalWrite(dIn, HIGH);
digitalWrite(dIn, HIGH);
digitalWrite(dIn, HIGH);
digitalWrite(dIn, HIGH);
digitalWrite(dIn, HIGH);

digitalWrite(dIn, LOW);
digitalWrite(dIn, LOW);
digitalWrite(dIn, LOW);
digitalWrite(dIn, LOW);
digitalWrite(dIn, LOW);
digitalWrite(dIn, LOW);
digitalWrite(dIn, LOW);
digitalWrite(dIn, LOW);

digitalWrite(clk, LOW);
digitalWrite(clk, HIGH);

}

 

Kruppa
Offline
Зарегистрирован: 18.12.2015
Неправильно написал сверху, сразу правлю =
 
 
int dIn = 10;
int clk = 11;
 
strarbit
Offline
Зарегистрирован: 12.06.2016
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы чего хотите?

1) руками (без библиотеки) пользоваться аппаратным SPI?

2) сделать программный SPI с помощью функции shifOut?

3) не использовать shifOut, а сделать всё совсем вручную (типа для изучения)?

Kruppa
Offline
Зарегистрирован: 18.12.2015

Спасибо! Но я так понимаю, что ShiftOut - таже самая библиотечная функция.

Т.е. по сути, упрощенный вариант кода (чтоб не задумываться).

Или я ошибаюсь?

Kruppa
Offline
Зарегистрирован: 18.12.2015

"3) не использовать shifOut, а сделать всё совсем вручную (типа для изучения)?"

Да именно)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, откуда мне знаь, ошибаетесь Вы или нет.

Протокол SPI в контроллере есть аппаратный. Его можно использовать, но для него нужны строго определённые пины. Если пины заняты, то его можно моделировать программно (существенно медленнее, но для светодиодов за глаза хватит). Дла программного моделирования есть функция shiftOut. Она простая как валенок, её текст есть в поставке IDE, можно посмотреть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Или, может Вам пофигу как именно использовать SPI, а Вам нужно саму MAX программировать "без библиотеки"? Так это элементарно - у неё там 14 регисторов и всё программирование состоит в том, чтобы загнать пару "адрес регистра" и "значение для записи в регистр". Больше там ничего нет.

Kruppa
Offline
Зарегистрирован: 18.12.2015

Может быть. А можете пример привести, как так "загнать" можно?

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Kruppa, а зачем это Вам?

Если нужно воспользоваться протоколом SPI, то Вам уже порекомендовали два варианта: аппаратный и программный.

Если интересно, как они устроены внутри, в комплекте со средой Arduino IDE поставляются исходники, которые моржно посмотреть.

Если интересно самому сделать с нуля, то читайте дэйташит.

Чего именно Вы хотите? Или Вам нужно просто "поговорить", не хватает общения?

Kruppa
Offline
Зарегистрирован: 18.12.2015

andriano, Да, не хватает. Только общения со специалистами.

 

Kruppa
Offline
Зарегистрирован: 18.12.2015

ЕвгенийП​, можете пример привести, пожалуйста, как загнать пару "адрес регистра" и "значение для записи в регистр"?

Заранее спасибо

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
Kruppa
Offline
Зарегистрирован: 18.12.2015

andriano​ , даташит я и сам могу найти.

И вопрос я задал не Вам. Спасибо за понимание.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kruppa пишет:

andriano, Да, не хватает. Только общения со специалистами.

 

Зря Вы так. Не зная-то людей!

Kruppa
Offline
Зарегистрирован: 18.12.2015

       ЕвгенийП, может быть и зря. Но он тоже хорош. Не вникая в тему сразу "в даташит посылает". Нехорошо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kruppa пишет:

ЕвгенийП​, можете пример привести, пожалуйста, как загнать пару "адрес регистра" и "значение для записи в регистр"?

Да, пример-то могу. только Вы не сказали что у Вас за Ардуина. Пример для uno/nano. Если у Вас Mega - сами себе злобный Буратино, этот пример не заработает, а переписывать я уже, простите, не буду - надо было говорить сразу :)))

Пример включает режим проверки экрана на битые светодиоды - т.е. MAХ7219 зажигает их все. По идее все должны светиться. Этот режим включается записью 1 в регистр 15. Вот в примере это и делается. Сначала Максу передаётся номер регистра (15), а потом 1 для записи в него.

Как видите, в примере вообще никакие библиотеки не используются. 

/////////////////////////
//
// Используется аппаратный SPI
//
//	Arduino (Uno, Nano и т.п.) 
//
//	СОЕДИНЕНИЕ
//  MAX7219        Arduino
//   CLK             13
//   DIN             11
//   LOAD(CS)        10
//
//   Присоединение MAX7219 к индикатору как обычно, по даташиту
//
#define	CLK_P		13
#define	MOSI_P	11
#define	SS_P		10

void setup(void) {
	//
	// Инициализация пинов
	pinMode(CLK_P, OUTPUT);
	pinMode(MOSI_P, OUTPUT);
	pinMode(SS_P, OUTPUT);
	digitalWrite(CLK_P, LOW);
	digitalWrite(MOSI_P, LOW);
	digitalWrite(SS_P, HIGH);
	//
	// Подготовка SPI к работе
	SPCR = bit(SPE) | bit(MSTR);	// SPI, режим master
	SPSR = bit(SPI2X);				// скорость (f_osc / 2)
	//
	// Включаем тестовый режим MAX7219 (чтобы засветилось всё, что может)
	// Для этого в регистр 15 нужно записать 1
	//
	// Выбор устройства SPI (начало связи)
	digitalWrite(SS_P, LOW);
	//
	// Сначала передаём в MAX7219 номер регистра (15)
	SPDR = 15; 
	while (!(SPSR & bit(SPIF)));
	//
	// Теперь передаём в MAX7219 данные для записи в регистр (1)
	SPDR = 1; 
	while (!(SPSR & bit(SPIF)));
	//
	// Завершение связи
	digitalWrite(SS_P, HIGH);
	//
	// Если соединено всё правильно, то на экране должны засветиться все сегменты и все точки - 
	// это тестовый режим экрана для проверки на битые светодиоды.
	//
}

void loop(void){}

Пример проверен, работает. Так что если что не так, сначала ищите ошибки в соединениях, а потом уж постите сюда отчёт о проблеме.

Kruppa
Offline
Зарегистрирован: 18.12.2015

       ЕвгенийП, спасибо за помощь!