SPI и PT6961
- Войдите на сайт для отправки комментариев
Пт, 21/12/2012 - 12:38
Есть плата с лед матрицей и драйвером PT6961. Не могу разобраться как правильно отправлять данные по SPI на PT6961. Вот код где тупо перебором отправляются данные, матрица зажигается и хаотично мигает по строкам.
#include <SPI.h> const int SSPin = 10; void setup() { pinMode (SSPin, OUTPUT); SPI.begin(); } void loop() { for(int i=0; i<255; i++){ for(int j=0; j<255; j++) digitalPotWrite(i,j); delay(1); } } int digitalPotWrite(int address, int value) { digitalWrite(SSPin,LOW); SPI.transfer(byte(address)); SPI.transfer(byte(value)); digitalWrite(SSPin,HIGH); }
В даташите https://dl.dropbox.com/u/64193121/datasheet_6961.pdf на 13 странице написан алгоритм работы, какие данные посылать. Помогите разобраться, как это в коде для ардуино написать правильно.
Посылаю данные так:
digitalWrite(SSPin,LOW); //command 2 SPI.transfer(byte(0x40)); digitalWrite(SSPin,HIGH); digitalWrite(SSPin,LOW); //command 3 SPI.transfer(byte(0xC0)); digitalWrite(SSPin,HIGH); digitalWrite(SSPin,LOW); //command 1 SPI.transfer(byte(0x03)); digitalWrite(SSPin,HIGH); digitalWrite(SSPin,LOW); //command 4 SPI.transfer(byte(0x00)); digitalWrite(SSPin,HIGH); digitalWrite(SSPin,LOW); //command 1 SPI.transfer(byte(0x03)); digitalWrite(SSPin,HIGH); digitalWrite(SSPin,LOW); //command 4 SPI.transfer(byte(0x08)); digitalWrite(SSPin,HIGH);
Такая запись будет правильная или нет?(после отправки ничего не мигает).
Если вы отправляете только команды без данных то все верно, только преобразование
byte
()
можно убрать потому как 0xC0, 0x03 и т.д. это и есть один байт.Спасибо за ответ. Теперь вопрос как правильно отправлять данные?)
Пишу так:
По идее этот код должен записать хоть что-то, но ничего не происходит =/
Опять преобразовываете байт в байт... изучите Типы данных
Судя по даташиту дисплей нужно для начала проинициализировать, а при при записи чего либо сначала отправляется команда 2 с младшими двумя битами сброшенными в ноль, а только потом команда 3 с адресом.
И еще можно для удобства записывать байт в таком виде B10101010 или 0b10101010
Инициализирую в setup так:
Инициализация проходит вроде бы, так как стирается мусор который остаётся после рендомного прогона.
Пытаюсь отправлять данные вот таким перебором:
Но ничего не происходит =/
Про типы данных понял, просто оставил там преобразование, так как переменная перебиралась внутри цикла в 10м виде, но раз это делать не нужно то уберу.
А какая разница в каком виде она там перебирается?
Ну а если так?
Разницы нету в каком виде она перебирается, думал есть разница в каком виде подсовывать переменную в SPI.transfer()
Ваш код загрузил всё так же молчит почемуто =/
Попробовал, не то всё, не рисуер ничего молчит=/
Вот тут нашёл люди разбираются с pt6961 только там не лед матрица, табло с циферками:http://dangerousprototypes.com/forum/viewtopic.php?t=4541&p=44721
Исправил немного под свою:
Но ничего не показывает, я так понимаю что в массиве там символы, а тут нужно другие данные отправлять, пробую изменить цикл на такой:
по идее должен хотя бы мусор вываливаться но поченмуто ничего не рисует.
но если поменять цикл на такой:
то мусор снова появляется, я так понимаю дело в том что команда 0хс0 для записи не подходит, а нужна какая-то другая.
Добавлю; путём перебора выяснил, что если написать так:
то зажигаются хаотично светодиоды на верхних 4х строках.
Подходят значения от 0х98 до 0х9f разница в том что яркость разная.
в общем разобрался, всё что написано работает, при инициализации нужно отправлять:
а в примере было SPI_MODE2 потому и работало криво, не по даташиту...
Теперь вопрос, как лучше сделать, загнать в массив, то что нужно отправлять, что бы зажечь конкретную точку, и потом рисовать, или можно как то более рационально сделать?
Вот код рабочий, очищает всё, потом зажигает все точки, матрица постепенно заполняется зажёнными светодиодами:
А как у вас работает с LOW и LOW?
Спасибо что заметили ошибку. Они значит по идее и не отправлялись, вернее ерунда отправлялась, закомментировал эти команды, и всё равно оно работает, выходит не сильно нужны они. Поправил немного их, а то во 2й команде тестовый режим был включен, оставил их на всякий случай:
Вот такой код зажигает светодиоды в шахматном порядке:
Немного разобрался как рисовать на этой матрице.
Вот что получилось http://youtu.be/joydxbGU1TI
Код:
Подскажите как к этому лучше прикрутить библиотеку FFT (быстрое преобразование Фурье)?
Уважаемый человек.не поможете ли мне?мне нужно на табло от двд под данным контроллером выводить цифры из переменной.
Вы пробовали мой код заливать где заполняется всё и в шахматном порядке рисуется? если с этим кодом загораются сегменты на индикаторе то нужно просто опытным путём найти какой при каких данных зажигается, как-то так. А вот чтоб циферки писать на таком это нужно наверно типа быблиотеки писать, у меня в этой теме http://arduino.ru/forum/proekty/arduino-pt6961-led-matrix-watch есть код для часиков, вам нужно для своего сегментного индикатора что то похожеее делать.
Урааа))ОТветили!!!я нашел какие байты что зажигают !)методом тыка.Если я вам предоставлю данные вы мне сможете помочь?
я применил самый тупой из всех способ.создал два массива в одном адреса цифр а во втором номера сегментов.и передаю пачкой.может подскажете как упростить?
вы не сможете мне помочь с упрощением этого велосипеда?Я просто недавно начал дуинами заниматься и в этом языке мало понимаю.Особенно с учетом того что до этого был максимум php.А прописывать методом тыка в массив 9999 значений как-то не охота...
Честно говоря у меня у самого в массиве всё забито просто, до лучшего не додумался лень было и знаний нехватка(только для себя под дуины быдлокодил(= ). Зачем 9999 значений в массив? там только цифры 0-9, нужно для одного сегмента нарисовать все, для других там наверно просто сдвигаются значения, по крайней мере я просто сдвигал, но мб и не так.
ну у меня 7 цифр по 7 сегментов.код каждого сегмента выше и у меня значение сегмента если 1 то он появляется на первой цифре а если 14 то на первых двух и т.д. до 255.а если я буду смещать то сначала передастся первое значение сегмента а потом уже второе..и выйдет каша
А как тогда зажечь один сегмент во 2й или 3й цифре без зажигания его в первой? не должно же быть так, что нельзя по отдельности их зажигать. или я не так понял.
Вы не так поняли..Если я допустим первым параметром передам 0хСА.А вторым чило от 1 до 255
то в зависимости от числа будет меняться комбинация горящих сегментов.0хСА это допустим верхние левые сегменты.так вот они в зависимости от второго числа будут менять последовательность.
то в зависимости от числа будет меняться комбинация горящих сегментов.0хСА это допустим верхние левые сегменты.так вот они в зависимости от второго числа будут менять последовательность.
Гыыы я прям реально вижу как у него волосы на голове обуглились от твоего обьяснения.
Я же уже говорил что в данном деле профан.обьяснил то до чего дошел методом тыка.
Здравстуйте, есть индикатор от старого ДВД микросхема.
Что я только не пробовал, не могу понять логику работы.
Код из сообщения 11 отрабатывается и начинают мигать индикаторы сначала верхние сегменты, потом мигание, дальше зажигаются все и т.д.
Код goldpistol из сообщения 17 отображает число 11 в третьем и четвертом разряде
Сам модуль очень похож на http://we.easyelectronics.ru/uploads/images/00/32/70/2012/06/28/d159f3.png
только чип MTC1661 доков нигде не нагуглил вообще.
Буду благодарен за любую помощь, бьюсь с ним уже неделю.
а вы поменяйте int val=11; на int val=10; и отпишите что выйдет
Пробовал менять, отобразил 10 в тех же разрядах что и 11 до этого, они как бы посредине, в 3 и 4 разрядах горели.
Если ставить другие цифры то или ничегоне происходит, или хаос полный. В другой теме српашивал, там сказали что здесь не SPI подключение, а регистр сдвиговый стоит, но приведенный там код вообще ничего не выдал в отличии от приведенных здесь.
Если можно укажите какой нибудь другой способ связи с Вами, а не через форум (или подскажите тут можно отправить личное сообщение, что то я вообще не пойму этого форума) а то ответа ждал неделю. Сейчас больше не могу сказать, потому что все на работе осталось.
Да,конечно.Связывайтесь через вконтакте : http://vk.com/kr_swag_fox
А вы не подскажете мне как сдвигать значения?Пример кодом нужен...Я все по вашим рекомендациям сделал...Прорисовал от 0 до 9 но сдвигать не могу...Вот топик,может подскажете что?
http://arduino.ru/forum/programmirovanie/spipt6961-i-obuglennyi-mozg
Всем привет. подключил семисегментник к arduino UNO DIN - Pin11 (arduino), CLK - Pin12, STB - Pin13, соотвеоствено +5, GND. Заливать пробовал разные скетчи, но толку 0 ((( Т.е. дисплей включается , даже вроде как проходит инициализацию (включается, выключается) полностью, а потом начинает просто мигать хаотично не выдавая никаких данных на сегменты ((( Подскажите, что не так?
Доброго времени суток.
Внесу свои пять копеек.
Индикаторы которые стоят в DVD с общим анодом. Микросхема для общего катода. Поэтому получается, что разряды подключены к Сегментам, а сегменты к Разрядам. Из-за этого путаница.
При засвечивании первого сегмента - подключаете полностью весь разряд, а указывая разряд (по даташиту) вы засвечиваете сегмент. Используйте индикаторы с общим катодом и проблем не будет. отправляйте младшим битом вперед. И перебирайте разряды по очереди.