Вот что получилось.
Отредактировано max (10.10.2011 15:42:42)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
Вот что получилось.
Отредактировано max (10.10.2011 15:42:42)
А где его взять?
Отредактировано ANTON (06.10.2011 19:09:52)
А где его взять?
Что?
Девайс?
Светодиодная матрица - МОДЖЕТ (антигаджет)
А где его взять?
А где его взять?
А само устройство?
Там есть само устройство - его схема, рисунок печатной платы, прошивка для микроконтроллера и др.
Его нужно собрать самому.
А где взять печатную плату?
А где взять печатную плату?
Сделать самому.
Например, можно взять кусок плотного картона, разместить на нем радиодетали и соединить их согласно схеме.
Вот что получилось.
У файла закончился срок хранения. Перезалейте пожалуйста.
У файла закончился срок хранения. Перезалейте пожалуйста.
Перезалил. Только прога не доделанная, времени не хватает.
Всех С НОВЫМ 2012 ГОДОМ!
Всех с прошедшими! Не стал создавать новую тему, здесь это тоже пригодится.
Хочу ещё узнать ведутся ли программные доработки и просить автора добавить ручное программирование типа
10000000001
01000000010
00100000100
00010001000
00001010000
00000100000
чтоб файл подгружался отдельно и писался в *.тхт
и кнопку (0) которая сбрасывает движки (эквалайзера) в среднее положение
Речь идет об этом.
Среднее положение я добавил, а вот состальным проблемы.
Файл загружается, выводится в EditorGadget, а как передать данные в USB я не знаю.
В архиве все файлы. Что мне теперь делать?
Файл загружается, выводится в EditorGadget
А для чего его загружать в редактор? Для изменения кода?
Здесь нужно поступить по другому. Прочитать строки из файла и проверить корректность данных (в строке должно быть ровно 11 символов и они должны иметь значение 0 или 1). Далее, нужно эту строку преобразовать в число. Это сделать не сложно, ведь по сути, данные строки, это числа в двоичной системе счисления и с помощью функции Val() достаточно просто преобразуются в десятичные числа.
String.s="10000000001" Debug Val("%"+String)
Эти числа сохраняем где-нибудь, скажем, в массиве, типа Word.
После этого у нас уже есть данные, которые можно передать в USB порт помещая их в массив OutBytes() и вызывая процедуру SendDevice().
А для чего его загружать в редактор? Для изменения кода?
Что-бы видет какая строка выполняется.
в строке должно быть ровно 11 символов
А каналов 18. Здесь как быть?
Эти числа сохраняем где-нибудь, скажем, в массиве, типа Word.
Можно какой-нибудь пример?
А каналов 18. Здесь как быть?
Ну пусть будет 18. Просто в примере было 11 символов.
Если 18, то понадобится массив типа Long.
Можно какой-нибудь пример?
Чего именно? Работы с массивами? Прочитать можно тут. http://www.pure-basic.narod.ru/docs/boo … s_List.htm
Чего именно?
Прочитать строки из файла и проверить корректность данных (в строке должно быть ровно 11 символов и они должны иметь значение 0 или 1)
Ну примерно так (работу не проверял).
После выполнения процедуры, в списке DataFile() будут данные из файла, переведенный в десятичный формат.
Procedure.b TestBin_String(String.s) Protected Result.b, Len, i, Char.s Result = #True Len=Len(String) For i=1 To Len Char=Mid(String, i, 1) If Char<>"0" And Char<>"1" Result = #False Break EndIf Next i ProcedureReturn Result EndProcedure Procedure ReadFile_BinString(File.s, List Info.l()) Protected FileID, Number, String.s, ErrNumber ClearList(Info()) Number=0 ErrNumber=0 FileID=ReadFile(#PB_Any, File) If FileID While Eof(FileID) = 0 Number+1 String = ReadString(FileID) If Len(String)=18 If TestBin_String(String)=#True ; Нет ошибок в строке If AddElement(Info()) Info()=Val("%"+String) EndIf Else ErrNumber=Number ; В строке есть запрещенный символ. Break EndIf Else ErrNumber=Number ; Длина строки не равна 18 символов. Break EndIf Wend CloseFile(FileID) Else ErrNumber=-1 ; Ошибка открытия файла. EndIf ProcedureReturn ErrNumber EndProcedure NewList DataFile.l() ReadFile_BinString("C:\Test.txt", DataFile())
Что-то не могу понять, как этими процедурами пользоватся? Скомпилировал, а в ответ тишина.
Нужно вызвать процедуру ReadFile_BinString().
В ответ она вернет число -1, если не удалось открыть файл, 0 если все в порядке и число больше нуля, если есть ошибка в строке. Это число будет номером строки с ошибкой.
Если ошибок нет, то в списке, переданном через второй аргумент процедуры, будут числа, которые нужно передавать в USB.
То-есть ее нужно вызвать после загрузки файла?
Эта процедура сама загружает файл.
Получается, что эта продедура загружает только одну строку.
А как сделать, чтобы загружались несколько строк по порядку?
Получается, что эта продедура загружает только одну строку.
Если ошибок нет, то в списке, переданном через второй аргумент процедуры, будут числа, которые нужно передавать в USB.
Загружаются все строки из файла, проверяется корректность данных и если ошибок нет, строка преобразовывается в число и записывается в список. Это происходит со всеми строками файла.
строка преобразовывается в число и записывается в список
То-есть это число передаем в USB и светодиоды светят как в файле?
Но у меня выводится ноль при таком файле:
100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000
Сам код:
Procedure.b TestBin_String(String.s) Protected Result.b, Len, i, Char.s Result = #True Len=Len(String) For i=1 To Len Char=Mid(String, i, 1) If Char<>"0" And Char<>"1" Result = #False Break EndIf Next i ProcedureReturn Result EndProcedure Procedure ReadFile_BinString(File.s, List Info.l()) Protected FileID, Number, String.s, ErrNumber ClearList(Info()) Number=0 ErrNumber=0 FileID=ReadFile(#PB_Any, File) If FileID While Eof(FileID) = 0 Number+1 String = ReadString(FileID) If Len(String)=18 If TestBin_String(String)=#True ; Нет ошибок в строке If AddElement(Info()) Info()=Val("%"+String) EndIf Else ErrNumber=Number ; В строке есть запрещенный символ. Break EndIf Else ErrNumber=Number ; Длина строки не равна 18 символов. Break EndIf Wend CloseFile(FileID) Else ErrNumber=-1 ; Ошибка открытия файла. EndIf ProcedureReturn ErrNumber EndProcedure NewList DataFile.l() ReadFile_BinString("C:\123.txt", DataFile()) Debug DataFile()
Но у меня выводится ноль при таком файле
Правильно.
Ведь в последней строке (нижней) одни нули и именно эта строка была обработана последней и записана элемент списка, который является текущим.
Читать данные из списка нужно так:
ForEach DataFile() Debug DataFile() Next
Ясно, спасибо. То-есть надо сделать так:
ForEach DataFile() OutBytes(DataFile()) SendDevice() Next
Сколько максимум шагов?
А скорость можно как-то регулировать?
Отредактировано max (17.01.2012 20:04:25)
То-есть надо сделать так
Нет, скорее так, потому что за раз передается один байт, а 18 светодиодов это больше двух байт.
ForEach DataFile() Info.l=DataFile() For i=0 To 2 OutBytes(1) = Info SendDevice() Info>>8 Next i Next
А скорость можно как-то регулировать?
Смотря как будет все это работать.
Если в отдельном потоке, то перед Next нужно поставить Delay() с требуемым значением, а если по таймеру (скорее всего, в код не вникал), то нужно немного изменить конструкцию кода.
Procedure Timer_10() Shared DataFile() Static ListPos Protected ListSize, Info.l, i ListSize=ListSize(DataFile()) If ListSize>0 If ListPos > ListSize-1 ListPos=0 EndIf SelectElement(DataFile(), ListPos) Info=DataFile() For i=0 To 2 OutBytes(1) = Info SendDevice() Info>>8 Next i ListPos+1 EndIf EndProcedure
Эту процедуру нужно вызывать по таймеру. Чем чаще будет вызываться, тем быстрее будет передаваться.
Буду проогу собирать.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике