AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
09.10.2018, 04:19
|
#11
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,163
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
|
Re: Вызов функции с массивом
12-12, а чем то множество отдельных светодиодов по сути своей отличается от тех восьми штук, собранных в индикатор?
По сути своей MAX7219 и есть контроллер для зажигания выбранных светодиодов в матрице 8х8.
Просто то множество нужно организовать аналогично первым 3 разрядам индикатора и зажигать соответственно.
А для упрощения использовать массив из 8 байт (unsigned char Data[8]) для хранения там значений для передачи в MAX7219.
В таком варианте функцию Write_MAX7219 можно даже без параметров использовать.
Для отдельных светодиодов вполне можно даже макросы/функции/подпрограммы написать для их зажигания/гашения.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
09.10.2018, 04:25
|
#12
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Вызов функции с массивом
Сообщение от 12-12
|
Да так и есть, там передаётся адрес регистра и данные этого регистра для MAX7219. Саму функцию я уже написал, цифры на семисегментник выводятся нормально, но у меня смешанное подключение, 3 цифры семисегмент. и куча светодиодов. Как столкнулся с зажиганием и погасанием отдельных светодиодов, понял что без массива никак не обойтись.
|
Посмотрите мой проектик,для стм32 правда,но общую картину сможете понять.
http://mcu.goodboard.ru/viewtopic.php?id=139
__________________
Глаза боятся,а руки делают.
|
|
|
|
10.10.2018, 01:23
|
#13
|
Частый гость
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Вызов функции с массивом
Сообщение от mike-y-k
|
а чем то множество отдельных светодиодов по сути своей отличается от тех восьми штук, собранных в индикатор?
|
Отличия в том, что при выводе данных на индикатор, при обновлении цифры, мы посылаем полный байт (код цифры), и нам не важно что было до этого. А в случае с светодиодами, нам всегда нужно знать значение регистра в котором мы хотим зажечь или потушить диод.
|
|
|
|
10.10.2018, 01:37
|
#14
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,440
Сказал спасибо: 97
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: Вызов функции с массивом
Сообщение от 12-12
|
в случае с светодиодами, нам всегда нужно знать значение регистра в котором мы хотим зажечь или потушить диод.
|
Ну так у вас и есть массив DISPLAY, содержимое которого проектируется на светодиоды.
Вот только его не нужно передавать как параметр функции.
Удобно использовать макросы:
PHP код:
|
#define LED1_ON() DISPLAY[5] |= 0b00000001
#define LED1_OFF() DISPLAY[5] &= 0b11111110
|
и в нужном месте писать:
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
10.10.2018, 01:42
|
#15
|
Частый гость
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Вызов функции с массивом
В общем всем спасибо. Вчера всё придумал, очень понравилась мне моя конструкция.
Код:
|
//Передача данных в Max7219 (Adres_Reg - адрес регистра, Data_In_Write - //данные для этого регистра, Led_Flag - флаг работы светодиода (0 - //потушить, 1 - зажечь))
void Write_MAX7219(unsigned char Adres_Reg,unsigned char Data_In_Write,unsigned char Led_Flag)
{
код
}
//Вызовы функции
Write_MAX7219(5,32,1); //зажечь светодиод
_delay_ms(500);
Write_MAX7219(5,32,0); //потушить светодиод
_delay_ms(500);
for(X=4;X‹8;X++) //потушить все светодиоды
{
Write_MAX7219(X,255,0);
} |
Массив уже использовал внутри функции. Эта конструкция работает как со светодиодами, так и с индикаторами, потом просто вынесу в отдельную функцию, разложение числа на цифры.
|
|
|
|
10.10.2018, 08:35
|
#16
|
Прописка
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
|
Re: Вызов функции с массивом
Сорри, не читал всей темы. Так понимаю, речь о матрице 8х8 на MAX7219?
Так вот, зажигать отдельный светодиод - неинтересно, и не имеет практического значение. Полагаю, вы будете матрицу использовать для вывода текста или знаков? Ну. В матрице 8 светодиодов объединены столбиком в целый байт. Ну или строчкой, в зависимости, как повернете её. 8 байтов по 8 светодиодов составляют всю матрицу. Допустим, мы поставили ориентацию байтов - горизонтально. Заполненный
байт 0xFF зажигает горизонтальную строчку из 8 светодиодов.
Передавая последовательно 8 байтов 0xFF, мы зажжем все строчки. Причем, передав очередную строку, мы должны дернуть ногой CS.
Значит, ф-ция работы с матрицей должна состоять из восьми передач полного байта и дергания ногой CS после.
Допустим, у нас есть массив 8 байтов.
char array[8] = {0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF};
напишем ф-цию:
Код:
|
void LoadMatrix(char arr[])
{
for(int i = 0; i ‹ 8; i++)
{
SPISend(arr[i]); // отправляется байт по SPI
SPIWaitEndTransfer(); // ожидание завершения передачи байта
CS_IMPULSE; // импульс на CS
}
} |
Вызов этой ф-ции прост:
LoadMatrix(array);
Так же, предполагаю, что у вас есть несколько таких матриц. Да? И тогда их можно объединить в цепочку, друг за другом. Причем, их так же можно ориентировать как горизонтально, так и вертикально. Самое простое - расположить строки горизонтально. Таким образом, в цепочке будут грузиться сначала строки для всех модулей в цепочке, затем дергаться CS, затем следующая строка, и т.д. до восьмой строки.
Первый байт строки - для последнего модуля в цепочке. Последний байт строки - для первого модуля, от которого начинается загрузка.
А вот как подготовить байты, которые будут загружаться - это другой разговор. Вот тут можно уже как угодно, хоть установкой отдельного бита, хоть как. Обычно, берется массив байтов, представляющий собой шрифт 8х8 или 6х8 - буквы, цифры, знаки. Специальными ф-циями выбирается нужная буква, и считывается из массива шрифта в массив формирования выходной строки для матрицы.
Но это уже тема отдельного разговора.
Последний раз редактировалось Исбанни; 10.10.2018 в 08:40.
|
|
|
Сказали "Спасибо" Исбанни
|
|
|
10.10.2018, 09:20
|
#17
|
Частый гость
Регистрация: 05.06.2007
Сообщений: 30
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Вызов функции с массивом
Сообщение от Исбанни
|
Сорри, не читал всей темы. Так понимаю, речь о матрице 8х8 на MAX7219?
|
Нет, речь шла о смешанном подключении 3х цифр семисегментника и прим. 20 светодиодов к одной микросхеме, причём светодиодами нужно управлять по отдельности, SPI программный.
|
|
|
|
10.10.2018, 10:23
|
#18
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,019
Сказал спасибо: 43
Сказали Спасибо 272 раз(а) в 213 сообщении(ях)
|
Re: Вызов функции с массивом
Я тоже не читал всей темы с начала,
на мой незамутнённый взгляд 20 светодиодов проще кодировать битовой маской uint32 (и написать разные #define для манипуляции с ней) ,
а 3 цифры передать 3 мя отдельными байтами.
Вот и предмета обсуждения больше нет ![Улыбка](images/smilies/icon_smile.gif) .
|
|
|
Сказали "Спасибо" dgrishin
|
|
|
11.10.2018, 05:38
|
#19
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,163
Сказали Спасибо 3,855 раз(а) в 2,926 сообщении(ях)
|
Re: Вызов функции с массивом
12-12, таки в первом приближении именно вариант работы с тем контроллером путём вывода в него сначала 3-х байт для сегментных индикаторов, а потом 5-ти байт с битовыми данными для тех отдельных светодиодов.
Кодировать состояние диодов битами.
Имена для диодов с префиксами LED_ и суффиксами _ON и _OFF вполне в макросы для установки/сброса битов впишутся. Или в define как параметр для функции(й) установки/сброса битов.
Поскольку массив для вывода ну никак не изменяется сам по себе - ничего страшного при таком подходе не произойдёт ![Озадачен](images/smilies/icon_confused.gif)
Для полноты картины можно даже флаг завести для индикации изменений в том массиве и необходимости выполнения той функции Write…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 11.10.2018 в 05:43.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:09.
|
|