AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
17.07.2016, 12:23
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Каскадное включение max7219
Здравствуйте, уважаемые форумчане.
Больше недели бьюсь над светодиодными матрицами на базе max7219. У меня их 4 штуки, подключенных каскадом, ьатрицы самодельные. В ардуино всё работает как надо. Но я решил написать библиотеки на Си под cvavr. В итоге с одной матрицей всё нормально, в каскаде всё дублируется. Пробовал с пустыми пакетами - результат тот же.
Я взял логический анализатор, взял программу на ардуино, считал байты по spi, написал инициализацию для каскадов - в итоге на ардуино работает, на си - дублирует картинку на все матрицы.
Кто работал на си с max72xx поделитесь опытом.
Прикреплю свои библиотеки ниже.
Последний раз редактировалось Andrejchukov; 19.07.2016 в 21:47.
|
|
|
|
17.07.2016, 18:43
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Каскадное включение max7219
Странный малость код...
На Вашем месте я бы делал проще:
Код:
|
// Объявляем массив в котором будут храниться разряды:
char digits[32];
// Матрицы должны быть составлены так:
[01234567][8-15][16-23][24-31]
// Отправляем их:
void max7219_light(unsigned char light) {
int i;
for (i=0;i‹8;i++) {
spi_write_word(i‹‹8|digits[24+i]);
spi_write_word(i‹‹8|digits[16+i]);
spi_write_word(i‹‹8|digits[8+i]);
spi_write_word(i‹‹8|digits[i]);
};
}; |
Поясню. Если у Вас чипы расположены, как рекомендует мануал, цепочкой, то первый пакет данных в итоге окажется в последнем чипе, а последний - в первом.
Первым параметром передаётся номер знакоместа. Могу ошибиться и цифры у Вас окажутся развёрнуты относительно порядка индикаторов. Но, думаю, с этим уже справитесь самостоятельно.
И, как бы, всё. Больше никаких переделок на первый взгляд делать не нужно.
Старые данные (которые были в регистрах ДО новых) будут просто вытолкнуты.
|
|
|
|
19.07.2016, 01:07
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Re: Каскадное включение max7219
[QUOTE=-Alan-;1043661]Странный малость код...
На Вашем месте я бы делал проще:
Код:
|
// Объявляем массив в котором будут храниться разряды:
char digits[32];
// Матрицы должны быть составлены так:
[01234567][8-15][16-23][24-31]
// Отправляем их:
void max7219_light(unsigned char light) {
int i;
for (i=0;i‹8;i++) {
spi_write_word(i‹‹8|digits[24+i]);
spi_write_word(i‹‹8|digits[16+i]);
spi_write_word(i‹‹8|digits[8+i]);
spi_write_word(i‹‹8|digits[i]);
};
}; |
Спасибо за ваш ответ. Но всёравно мне немного не понятно (так как в программировании я пока ноль).
Я так понимаю, ваш пример для семи сегментных матриц (это не суть вопроса, принцип их работы тот же, что и у матриц 8x8 ). Дело вот в чём: инициализацию матриц я уже переписал (в архиве в шапке темы первый сырой вариант, я потом посмотрел анализатором, как это делает ардуиновский скетч, затем проверил тем же анализатором, как это делает моя программа, на спи выходят идентичные пакеты) в основном цикле я отправляются четыре пакета (например: три пакета 0х0000, затем пакет с номером строки и байтом сегментов (напр 0х01FF), на первом круге основного цикла у меня заполняется нужный столбец нужной матрицы, затем на втором круге начинает заполняться тот же столбец во всех остальных матрицах. Проверяют анализатором, на spi в цикле четыре пакета 0х0000, 0х0000, 0х0000, 0х01FF (всё как и задумано). Может быть я ошибаюсь, но первый пакет должен заполнить последнюю матрицу, второй - пред последнюю, третий - вторую, четвёртый - первую. А потом всё сначала. Пустые пакеты по идее должны идти в матрицы, состояние которых мне не нужно менять в данный момент.
P.S. моя функция light всего лишь выставляла яркость матриц. Инициализация у меня тоже работает, как я понимаю, раз матрицы хоть и криво но работают.
Последний раз редактировалось Andrejchukov; 19.07.2016 в 12:11.
|
|
|
|
19.07.2016, 15:22
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Каскадное включение max7219
Я пролистал немного мануал по самим микросхемам.
И вот что получается. Если отправить посылку вида
НомерЦифры/ВключённыеРазряды (0x01|0xFF) - Зажигаем в 1-м разряде (не нулевом, а именно первом, это второе знакоместо) 8 и точку. '8.', а сразу за этим - например, (0x01|0x00) - Полностью гасим знакоместо, то первая команда окажется во второй микросхеме, а вторая - в первой. Аналогично, по сути, работают сдвиговые регистры типа 74HC595 (только сигнал записи нужно ещё передать).
Таким образом, в том коде, что привёл я, данные будут передаваться сразу на всю линейку от 4-й микросхемы к первой. За один цикл из цифр числа Пи:
3,14159265 35897932 38462643 38327950 (3, будут находиться в одном знакоместе!)
Будут переданы:
-› '3', '3', '3', '3,' (First Word)
-› '8', '8', '5', '1'
И так далее. Самая первая переданая посылка будет загружена в последний чип в 0-е знакоместо.
Во всяком случае, у меня такое предположение.
Кстати, ещё забыл одну строку:
Код:
|
for (i=0;i‹8;i++) {
spi_write_word(i‹‹8|digits[24+i]);
spi_write_word(i‹‹8|digits[16+i]);
spi_write_word(i‹‹8|digits[8+i]);
spi_write_word(i‹‹8|digits[i]);
// Вот здесь должна быть команда, дёргающая пин /CS чипов!
// Например, такая:
PORTA &= ~0x01;
PORTA |= 0x01;
// PORTA.0 (нулевой пин) будет подключен к общим пинам микросхем /CS. Например.
}; |
Да, я пролистал более подробно инструкцию к микросхемам. Именно по спаду на пине CS данные из буфера загружаются в регистры чипа. Так что, нужно будет пользоваться этим пином. Иначе не будет корректно работать.
Мой код в прошлом примере будет просто гонять байты через микросхемы. Теперь - будет записывать.
Я предполагаю. Протестировать не на чем.
|
|
|
|
19.07.2016, 16:32
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Re: Каскадное включение max7219
Сообщение от -Alan-
|
Код:
|
for (i=0;i‹8;i++) {
spi_write_word(i‹‹8|digits[24+i]);
spi_write_word(i‹‹8|digits[16+i]);
spi_write_word(i‹‹8|digits[8+i]);
spi_write_word(i‹‹8|digits[i]);
// Вот здесь должна быть команда, дёргающая пин /CS чипов!
// Например, такая:
PORTA &= ~0x01;
PORTA |= 0x01;
// PORTA.0 (нулевой пин) будет подключен к общим пинам микросхем /CS. Например.
}; |
|
Попробовал ваш код, результат, к сожалению, тот же (на картинке). Все матрицы дублируют изображение. Код взял полностью ваш, только CS у меня на порте B(исправил естественно), хотя у меня SPI аппаратный, та CS сам дёргается после отсылки байта (в моём случае слова).
|
|
|
|
19.07.2016, 16:58
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Re: Каскадное включение max7219
Вот для примера прилагаю картинки работы кода Ардуино (светятся две точки на разных матрицах) и работы моей программы на код вижене (на всех матрицах одно и то же) и картинка из анализатора (пакеты spi идентичные, отличаются только скоростями, т.к. ардуино использует программный spi, который я тоже, кстати, пробовал с тем же результатом). Плата на atmega128 одна и та же. ![Бьюсь об стену](images/smilies/icon_obstenu.gif) Парадокс?
Я стал подумывать на свой spi, взял программный (выдрал из axlib для студии) - то же самое, менял скорость передачи - бесполезно.
Последний раз редактировалось Andrejchukov; 19.07.2016 в 17:01.
|
|
|
|
19.07.2016, 17:58
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Re: Каскадное включение max7219
Кажись, я сам допёр, в чём дело. Я сравнил пакеты данных (из предыдущего своего сообщения) и понял, что в ардуино cs дёргается между пакетами данных, а у меня- после каждого слова, что защёлкивает сдвиговый регистр, и данные перемещаются пословно в каждую матрицу. ![Очень смешно](images/smilies/icon_veryhappy.gif) Попробую переписать протокол spi.
|
|
|
|
19.07.2016, 18:34
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Каскадное включение max7219
Дайте, пожалуйста, схему и модель матрицы ![Улыбка](images/smilies/icon_smile.gif) .
|
|
|
|
19.07.2016, 18:46
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Каскадное включение max7219
Вероятно такое решение: во все микросхемы/регистры записываете одно и то же число. В Вашей микросхеме сигнал CS# называется LOAD - записывает последние 16 бит во внутренние регистры и, соответственно, показывает их.
|
|
|
|
19.07.2016, 18:52
|
|
Частый гость
Регистрация: 28.02.2011
Сообщений: 33
Сказал спасибо: 1
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Re: Каскадное включение max7219
Сообщение от Signalshik2
|
Дайте, пожалуйста, схему и модель матрицы .
|
Led матрицы 1088BS, к матрице подключено так:
max72xx // LED
SEG DP Anod1
SEG A Anod2
SEG B Anod3
SEG C Anod4
SEG D Anod5
SEG E Anod6
SEG F Anod7
SEG G Anod8
DIG0 Katod1
DIG1 Katod2
DIG2 Katod3
DIG3 Katod4
DIG4 Katod5
DIG5 Katod6
DIG6 Katod7
DIG7 Katod8
CS и CLK в кучу, DIN первой матрицы к MOSI микроконтроллёра, DOUT первой матрицы на DIN второй и т д. Линия CS и контакты ISET подтянуты на плюс через 10 килоом. Приложу плату в LAYOUT6.
Плата у меня односторонняя, там оооочень много перемычек, и надо на пол миллиметра развести матрицы между собой.
Схему рисовал сходу из головы.
Последний раз редактировалось Andrejchukov; 19.07.2016 в 18:58.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:26.
|
|