PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике


Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике

Сообщений 331 страница 360 из 446

331

Вот что получилось.

Отредактировано max (10.10.2011 15:42:42)

0

332

А где его взять?

Отредактировано ANTON (06.10.2011 19:09:52)

0

333

ANTON написал(а):

А где его взять?

Что?
Девайс?

0

334

Светодиодная матрица - МОДЖЕТ (антигаджет)

0

335

А где его взять?

0

336

ANTON написал(а):

А где его взять?

http://bascom.at.ua/publ/svetodiodnaja_ … t/1-1-0-59

0

337

А само устройство?

0

338

Там есть само устройство - его схема, рисунок печатной платы, прошивка для микроконтроллера и др.
Его нужно собрать самому.

0

339

А где взять печатную плату?

0

340

ANTON написал(а):

А где взять печатную плату?

Сделать самому.
Например, можно взять кусок плотного картона, разместить на нем радиодетали и соединить их согласно схеме.

0

341

max написал(а):

Вот что получилось.

У файла закончился срок хранения. Перезалейте пожалуйста.

0

342

radan написал(а):

У файла закончился срок хранения. Перезалейте пожалуйста.

Перезалил. Только прога не доделанная, времени не хватает.

0

343

Всех С НОВЫМ 2012 ГОДОМ!

0

344

Всех с прошедшими! Не стал создавать новую тему, здесь это тоже пригодится.

Shyra nemestnij написал(а):

Хочу ещё узнать ведутся ли программные доработки и просить автора добавить ручное программирование типа
10000000001
01000000010
00100000100
00010001000
00001010000
00000100000
чтоб файл подгружался отдельно и писался в *.тхт
и кнопку (0) которая сбрасывает движки (эквалайзера) в среднее положение

Речь идет об этом.
Среднее положение я добавил, а вот состальным проблемы. :confused:
Файл загружается, выводится в EditorGadget, а как передать данные в USB я не знаю.
В архиве все файлы. Что мне теперь делать? :dontknow:

0

345

max написал(а):

Файл загружается, выводится в EditorGadget

А для чего его загружать в редактор? Для изменения кода?
Здесь нужно поступить по другому. Прочитать строки из файла и проверить корректность данных (в строке должно быть ровно 11 символов и они должны иметь значение 0 или 1). Далее, нужно эту строку преобразовать в число. Это сделать не сложно, ведь по сути, данные строки, это числа в двоичной системе счисления и с помощью функции Val() достаточно просто преобразуются в десятичные числа.

Код:
String.s="10000000001"
Debug Val("%"+String)

Эти числа сохраняем где-нибудь, скажем, в массиве, типа Word.
После этого у нас уже есть данные, которые можно передать в USB порт помещая их в массив OutBytes() и вызывая процедуру SendDevice().

0

346

Пётр написал(а):

А для чего его загружать в редактор? Для изменения кода?

Что-бы видет какая строка выполняется.

Пётр написал(а):

в строке должно быть ровно 11 символов

А каналов 18. Здесь как быть?

Пётр написал(а):

Эти числа сохраняем где-нибудь, скажем, в массиве, типа Word.

Можно какой-нибудь пример?

0

347

max написал(а):

А каналов 18. Здесь как быть?

Ну пусть будет 18. Просто в примере было 11 символов.

Если 18, то понадобится массив типа Long.

max написал(а):

Можно какой-нибудь пример?

Чего именно? Работы с массивами? Прочитать можно тут. http://www.pure-basic.narod.ru/docs/boo … s_List.htm

0

348

Пётр написал(а):

Чего именно?

Пётр написал(а):

Прочитать строки из файла и проверить корректность данных (в строке должно быть ровно 11 символов и они должны иметь значение 0 или 1)

0

349

Ну примерно так (работу не проверял).
После выполнения процедуры, в списке 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())

0

350

Что-то не могу понять, как этими процедурами пользоватся? Скомпилировал, а в ответ тишина.

0

351

Нужно вызвать процедуру ReadFile_BinString().
В ответ она вернет число -1, если не удалось открыть файл, 0 если все в порядке и число больше нуля, если есть ошибка в строке. Это число будет номером строки с ошибкой.
Если ошибок нет, то в списке, переданном через второй аргумент процедуры, будут числа, которые нужно передавать в USB.

0

352

То-есть ее нужно вызвать после загрузки файла?

0

353

Эта процедура сама загружает файл.

0

354

Получается, что эта продедура загружает только одну строку.
А как сделать, чтобы загружались несколько строк по порядку?

0

355

max написал(а):

Получается, что эта продедура загружает только одну строку.

Пётр написал(а):

Если ошибок нет, то в списке, переданном через второй аргумент процедуры, будут числа, которые нужно передавать в USB.

Загружаются все строки из файла, проверяется корректность данных и если ошибок нет, строка преобразовывается в число и записывается в список. Это происходит со всеми строками файла.

0

356

Пётр написал(а):

строка преобразовывается в число и записывается в список

То-есть это число передаем в 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()

0

357

max написал(а):

Но у меня выводится ноль при таком файле

Правильно.
Ведь в последней строке (нижней) одни нули и именно эта строка была обработана последней и записана элемент списка, который является текущим.
Читать данные из списка нужно так:

Код:
ForEach DataFile()
  Debug DataFile()
Next

0

358

Ясно, спасибо. То-есть надо сделать так:

Код:
ForEach DataFile()
  OutBytes(DataFile())
  SendDevice()
Next

Сколько максимум шагов?
А скорость можно как-то регулировать?

Отредактировано max (17.01.2012 20:04:25)

0

359

max написал(а):

То-есть надо сделать так

Нет, скорее так, потому что за раз передается один байт, а 18 светодиодов это больше двух байт.

Код:
ForEach DataFile()
  Info.l=DataFile()
  For i=0 To 2
    OutBytes(1) = Info  
    SendDevice()
    Info>>8
  Next i
Next
max написал(а):

А скорость можно как-то регулировать?

Смотря как будет все это работать.
Если в отдельном потоке, то перед 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

Эту процедуру нужно вызывать по таймеру. Чем чаще будет вызываться, тем быстрее будет передаваться.

0

360

Буду проогу собирать.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике