Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вывод данных через LPT порт
 
 автор: Alex   (16.08.2009 в 17:53)   личное сообщение
 
 

Есть поле. В нём 24 символа - 1 и 0, могут быть в разных комбинациях.
Нужно этот код выгнать через LPT порт - ноги 2,3,4
Как это сделать?

  Ответить  
 
 автор: ShadowOfSun   (16.08.2009 в 18:26)   личное сообщение
 
 

Могу предложить только ссылки
http://www.gamedev.ru/code/forum/?id=50627
http://www.snippy.ru/snippet/406-programmirovanie-lpt-porta/
http://lpt-port.narod.ru/5.html
Но твой вопрос больше на хардварный похож
И такие темы обычно на С++ реализуют или Delphi

P. S. вопрос? Робота изобретаешь?

  Ответить  
 
 автор: Alex   (16.08.2009 в 19:02)   личное сообщение
 
 

Спасибо за ссылки - буду изучать. Вторая, по моему, то что нужно
"...И такие темы обычно на С++ реализуют или Delphi..." - знаю , но я в Access "как свинья в апельсинах" , а уж С++ с Delphi - без коментариев...
Не, не робота. Синтезатор частоты на LM7001. Она управляется через LPT порт: "...нам необходимо "послать" в ИМС три байта (24 бита), содержимое которых полностью определяет ее работу"

  Ответить  
 
 автор: ShadowOfSun   (16.08.2009 в 20:47)   личное сообщение
25 Кб.
 
 

Протестируй свеженаваянное (в модуле пропиши правильный путь к библиотеке)
Учитывай особенность записи в свой порт
номера контактов 2;3;4=значение в десятичной системе
значение в контакте 1;1;1=7
значение в контакте 1;1;0=6
значение в контакте 1;0;1=5
значение в контакте 1;0;0=4
значение в контакте 0;1;1=3
значение в контакте 0;1;0=2
значение в контакте 0;0;1=1
значение в контакте 0;0;0=0

  Ответить  
 
 автор: Alex   (20.08.2009 в 12:51)   личное сообщение
 
 

Ваш пример в принципе работает. Я его немножко переделал - но по моему все это не то и не так Если в отправляемой пачке последний символ 1, светодиод (подключал к порту для индикации) так и остается гореть; а в заведомо рабочей управляющей программе он только вспыхивает (1.5мкс наверное)

Господа! Помогите написать программку!
Имеется микросхема синтезатора частоты которая управляется через LPT порт. Для управления необходимо на входы микросхемы CL, Data, CE подать управляющие импульсы (см. рисунок LM7001.jpg)
Последовательность импульсов Data я сделал (см. базу FMAvto.mdb), а вот CL и CE... да еще все это и через порт выгнать... - ниасилил
Я так понимаю что три ножки порта это как раз CL, Data, CE

Посмотрите кому не лень: http://webfile.ru/3853949

  Ответить  
 
 автор: snipe   (20.08.2009 в 14:26)   личное сообщение
 
 

Data вы установили я согласен а вот тактовую частоту CL и разрешение на изменение CE почему-то нет....
более того data выставлена не правильно
LPT параллельный порт при установке числа у него на всех восьми ножках устанавливается чило т.е в вашем случае сказав что нужно установить 1 он на ножки установит 00000001 при 2 00000010
вот тут его и надо ловить т.к. вывод данных у вас последовательный

нужно просто определиться какие цифры ему подсовывать и все....
а циферек всего 4 это 0 , 8, 3, 5 при условии что CE младший разряд а CL старший

  Ответить  
 
 автор: Alex   (20.08.2009 в 15:46)   личное сообщение
 
 

Это Вы сейчас с кем разговаривали? - кажется это я очень глубоко полез, затеяв такой проект не расчитав силёнок

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

Мой адрес: leshke1@pisem.net

  Ответить  
 
 автор: snipe   (20.08.2009 в 19:24)   личное сообщение
 
 

Alex у Вас все получится только ухватите мысль.....
вы сейчас в единицу времени выводите на один провод либо 0 либо 1

проблема в том что вы выводите это значение а оно только либо 1 либо 0

вы на выходе D0 видете мерцание светодиода

по логике Вам нужно еще D1 и D2 а вы к ним подступиться не можете....

по одной простой причине - Вы не уловили то что выдает порт

давайте попробуем вместе

и так имеем 8 проводов и на каждом можем выставить напряжение исходя из двоичной системы соответсвенно максимальное число равно 2 в 8 степени

на этих проводах мы можем выставить любое число из указанного диапазона

нам нужно только три провода(т.е наши числа будут располагаться в диапазоне от 0 до 7)

теперь договоримся о разрядности

старший разряд - это будет CL - тактовая частота
средний разряд - Data
младший разряд -CE

исходя из графика который вы прислали на рис

при изменении данных СЕ должно быть 1
CL должно кувыркаться (если вчера было 1 то сегодня 0 и наоборот)
Data должно иметь значение которое имеет

теперь для того что бы что то получилось вам нужно в цикле передать данные (т.е установить значение порта если вы порту передадите 7 то будет установлено 00000111 (D0 справа)) т.е на все три провода подается напряжение +5 вольт

таким образом вам нужны цифры 3 5 7 0 1

далее все в ваших руках

  Ответить  
 
 автор: Гоблин   (20.08.2009 в 20:13)   личное сообщение
 
 

Чего-то тут видел. Полный набор вот.
http://go.mail.ru/search?q=LPT&old_q=%FD%EB%E5%EA%F2%F0%EE%ED%E8%EA%E0&in=y
http://go.mail.ru/search?lfilter=y&mailru=1&q=LPT

  Ответить  
 
 автор: snipe   (21.08.2009 в 07:47)   личное сообщение
 
 

где то как то так


Function WriteLPT()     'запись в порт
'  Dim cnn As ADODB.Connection
Dim asd(24) As Integer
   Dim TableRec As ADODB.Recordset
   Dim strCurrentConn As String
'  Set cnn = New ADODB.Connection
   Set TableRec = New ADODB.Recordset
   strCurrentConn = CurrentProject.Connection
   
'  Set cnn = CurrentProject.Connection
   TableRec.Open "Send", strCurrentConn
      With TableRec
          .MoveFirst
          Do
             asd(1) = .Fields("D0")
             asd(2) = .Fields("D1")
             asd(3) = .Fields("D2")
             asd(4) = .Fields("D3")
             asd(5) = .Fields("D4")
             asd(6) = .Fields("D5")
             asd(7) = .Fields("D6")
             asd(8) = .Fields("D7")
             asd(9) = .Fields("D8")
             asd(10) = .Fields("D9")
             asd(11) = .Fields("D10")
             asd(12) = .Fields("D11")
             asd(13) = .Fields("D12")
             asd(14) = .Fields("D13")
             asd(15) = .Fields("T0")
             asd(16) = .Fields("T1")
             asd(17) = .Fields("B0")
             asd(18) = .Fields("B1")
             asd(19) = .Fields("B2")
             asd(20) = .Fields("TB")
             asd(21) = .Fields("R0")
             asd(22) = .Fields("R1")
             asd(23) = .Fields("R2")
             asd(24) = .Fields("S")
             .MoveNext
          Loop Until .EOF
      End With
   TableRec.Close
'  cnn.Close
   Set TableRec = Nothing
'  Set cnn = Nothing
Dim CLk As String
Dim signaltxt As String
Dim signalinteger As Integer
CLk = "0"
Out &H378, 0

For i = 1 To 24 Step 1 'я не знаю в какой последовательности должны идти сигналы
'вполне возможно что должно быть и вот так For i = 24 To 1 Step -1

If CLk = "0" Then CLk = "1" 'устраиваем кувыркашки
If CLk = "1" Then CLk = "0"

signaltxt = CLk & asd(i) & "1" 'собираем сигнал
Select Case signaltxt 'ищем числовой аналог
Case "001": signalinteger = 1
Case "011": signalinteger = 3
Case "101": signalinteger = 5
Case "111": signalinteger = 7
End Select
Out &H378, signalinteger 'выпихиваем число в порт
'тут бы по уму паузу воткнуть, а я не помню как это делается (смотрите свой рисунок
' там СL идет с периодичностью 1.5 или более мкс)
Next i
Out &H378, 0 'запрещаем изменение
'сигнал ловить СL на выводе D2, Data-D1, CE-D0  согласно схемы распайки разъема
End Function

  Ответить  
 
 автор: snipe   (21.08.2009 в 08:29)   личное сообщение
 
 

рассмотрел внимательно рисунок сигналов и понял что не правильно собрал сигнал ...
щас переделаю

  Ответить  
 
 автор: snipe   (21.08.2009 в 09:32)   личное сообщение
 
 

вот исправил


Dim CLk As String
Dim signaltxt As String
Dim signalinteger As Integer
Dim i As Integer
Dim fgh As Integer
fgh = 0
CLk = "1"
Out &H378, 0

For i = 1 To 48

If CLk = "0" Then 'устраиваем кувыркашки
CLk = "1"
Else
CLk = "0"
End If

If i / 2 - Int(i / 2) > 0 Then fgh = fgh + 1
signaltxt = CLk & asd(fgh) & "1" 'собираем сигнал
Select Case signaltxt 'ищем числовой аналог
Case "001": signalinteger = 1
Case "011": signalinteger = 3
Case "101": signalinteger = 5
Case "111": signalinteger = 7
End Select

Out &H378, signalinteger 'выпихиваем число в порт
'тут бы по уму паузу воткнуть, а я не помню как это делается (смотрите свой рисунок
' там СL идет с полупериодичностью 1.5 или более мкс)
Next i
Out &H378, 0 'запрещаем изменение
'сигнал ловить СL на выводе D2, Data-D1, CE-D0  согласно схемы распайки разъема

  Ответить  
 
 автор: Alex   (21.08.2009 в 22:30)   личное сообщение
 
 

Большое Вам СПАСИБО! Все работает!
С паузой не получаецо - пробовал так:


Out &H378, signalinteger 'выпихиваем число в порт 
'тут бы по уму паузу воткнуть, а я не помню как это делается (смотрите свой рисунок 
' там СL идет с полупериодичностью 1.5 или более мкс) 
Me.TimerInterval = 15
Next i 
Out &H378, 0 'запрещаем изменение 
'сигнал ловить СL на выводе D2, Data-D1, CE-D0  согласно схемы распайки разъема


ругаецо

  Ответить  
 
 автор: snipe   (22.08.2009 в 02:48)   личное сообщение
 
 

там раньше оператор был кажеться Pause(сколько времени)
но честно не помню.....может гуру подскажут

а на счет me.timerinterval вполне законно ругается Вы из модуля (публичной функции) пытаетесь обратиться к форме - правильно в Вашем случае полное обращение forms![имя формы].timerinterval

вот только толку от этого не будет timerinterval работает только на timer т.е. в timer задается что надо делать а в timerinterval через какое время

  Ответить  
 
 автор: snipe   (22.08.2009 в 12:11)   личное сообщение
 
 

вот раскопал......


... для того, чтобы преостановить выполнение программы на некоторое время можно воспользоваться API функцией:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'Использование:
Call Sleep(10000) ' Пауза на 10 секунд
!!!ОПРОБОВАНО
Прислал Съемщиков Анатолий. Вот так! (06.01.00)

  Ответить  
 
 автор: Alex   (24.08.2009 в 20:15)   личное сообщение
 
 

Ага и я то же самое нашел в Справочнике Разработчика
Поставил паузу 1 миллисекунду - переключения стали более чёткими и качество приема улучшилось Видимо без паузы микруха как то не так тюнер настраивала

  Ответить  
 
 автор: ShadowOfSun   (24.08.2009 в 20:45)   личное сообщение
 
 

Alex
Выложи пожалуйста получившуюся программу на сайт
Вдруг кто-нибудь еще этой темой заинтересуется

  Ответить  
 
 автор: Alex   (24.08.2009 в 21:22)   личное сообщение
 
 

Щас ацкий интерфейс чуть доделаю и выложу

  Ответить  
 
 автор: Alex   (24.08.2009 в 22:02)   личное сообщение
 
 

Вот сваял: http://webfile.ru/3864055 ругайте...
Не могу проверить выход частоты за границы диапазона при щелканьи кнопочками <>
Пишу, например, на кнопочку < :

RF=RF-StepNet
If RF < [Band].Column(9) Then
MsgBox "Достигнута нижняя граница диапазона"
Else
Remote
End If

А сообщение выскакивает при любом значении RF

  Ответить  
 
 автор: Lukas   (24.08.2009 в 23:23)   личное сообщение
 
 


If RF < [Band].Column(9) Then

If RF< CInt([Band].Column(9)) Then ' или CLng или CDbl (смотря в чем RF)
или
If RF< [Band].Column(9)*1
Потому как из Column получаем в тексте, и приходится преобразовывать к числу

  Ответить  
 
 автор: Alex   (25.08.2009 в 08:23)   личное сообщение
 
 

Так вот где собака порылась: CInt или CLng или CDbl (смотря в чем RF)!
Я подозревал... Непонятно почему в форме FMAvto поле Devisor работает нормально - там ведь то же самое Кстати пытался то же самое в другой базе сделать - не работает... мистика

  Ответить  
 
 автор: ShadowOfSun   (24.08.2009 в 23:26)   личное сообщение
 
 

Я тут слегонца упростил функцию вывода
протестируй, плиз

Function WriteLPT()     'запись в порт
   Dim asd(24) As Integer
   Dim TableRec As ADODB.Recordset
   Dim i, fgh, CLk, signalinteger As Integer
   Dim strCurrentConn As String

   Set TableRec = New ADODB.Recordset
   strCurrentConn = CurrentProject.Connection
    
   TableRec.Open "Send", strCurrentConn
      With TableRec
         .MoveFirst
         Do
            For i = 1 To 24
               asd(i) = .Fields(i - 1)
            Next i
            .MoveNext
         Loop Until .EOF
      End With
   TableRec.Close
   Set TableRec = Nothing

   Out &H378, 0

   For i = 2 To 49

      If i Mod 2 Then CLk = 0 Else CLk = 4 'устраиваем кувыркашки
      fgh = i \ 2
      If asd(fgh) = "0" Then signalinteger = 1 Else signalinteger = 3
      signalinteger = signalinteger + CLk

      Out &H378, signalinteger
      Call Sleep(1)   'пауза 1 миллисекунда
   Next i
   Out &H378, 0
End Function

  Ответить  
 
 автор: Lukas   (24.08.2009 в 23:41)   личное сообщение
 
 

1. Alex, а зачем вы сохраняете данные из формы в таблицу запросом, и тут-же добываете их рекордсетом из таблицы в функции?
2. Функцию CurrentPath() можно заменить на свойство CurrentProject.Path.
3. Все функции, работающие с формой переместить из общего модуля Global в модуль класса формы.
Это на беглый взгляд.

  Ответить  
 
 автор: snipe   (25.08.2009 в 06:12)   личное сообщение
 
 

С паузой было все нормально
просто у Вас комп слишком быстрый и на микросхему сигналы приходили быстрее 1.5 мкс отсюда и была не стабильная работа


На открытие формы FMAvto добавить

Out &H378, 0

дабы на микросхему случайно не залезла всякая ерунда

добавить обработчик ошибки при отсутствии .dll а то Акс виснет и остановить его можно только через диспетчер задач

  Ответить  
 
 автор: Alex   (25.08.2009 в 10:14)   личное сообщение
 
 

"добавить обработчик ошибки при отсутствии .dll" - сделано

"На открытие формы FMAvto добавить Out &H378, 0" - ругаецо: "Compile error: Sub or Function not defined"
Тупо добавлял: Out &H378, 0 Может еще чего дописать надо

  Ответить  
 
 автор: Alex   (25.08.2009 в 11:02)   личное сообщение
 
 

"2. Функцию CurrentPath() можно заменить на свойство CurrentProject.Path." - сделано
"3. Все функции, работающие с формой переместить из общего модуля Global в модуль класса формы." - сделано

  Ответить  
 
 автор: Alex   (25.08.2009 в 09:55)   личное сообщение
 
 

автор: ShadowOfSun (24.08.2009 в 23:26) личное сообщение
"Я тут слегонца упростил функцию вывода
протестируй, плиз"

Работает

  Ответить  
 
 автор: snipe   (25.08.2009 в 11:12)   личное сообщение
 
 

Прислушайтесь к совету Lukas .....
Посудите сами все данные у Вас храняться на форме (я про сигнал Data)
форма постоянно открыта т.е считать данные можно в любую секунду

а у Вас получается - Вы запросом удаляете записи в таблице
потом в эту таблицу заносите данные

далее програмно получаете получаете доступ к этой таблице и считываете данные

Может я чего то не увидел...
но почему нельзя просто считать данные с формы (без этого забега по запросам)

если вы не можете придумать как имена полей использовать в циклах то это просто
те имена которые будете использовать обзываете одинаково (Акс сам так поступает - вновь добавленные поля называет например поле265) осталось числовую составляющую проконтролировать что бы были в нужном порядке

добираться до поля в цикле следующим образом forms![имя формы]("имя поля" & i+j)
где i переменная цикла
j сдвиг (ну т.е. если цикл начат с 1 а поля с 249 то сдвиг будет 248)

  Ответить  
 
 автор: Alex   (25.08.2009 в 11:23)   личное сообщение
 
 

Абсолютно согласен! Мучаюсь...

  Ответить  
 
 автор: ShadowOfSun   (25.08.2009 в 11:53)   личное сообщение
 
 

Это уже вопрос из серии философия программирования
Пусть Lukas меня поправит
Если двоичная строка где то высчитывается, можно эту переменную сделать глобальной
И не надо искать по форме, а в функции использовать переменную и mid выбирать кусочки

  Ответить  
 
 автор: Lukas   (25.08.2009 в 12:29)   личное сообщение
12 Кб.
 
 

Можно оформить свойством в модуле класса формы, например.
И выглядеть эта форма может как-то так:

  Ответить  
 
 автор: Alex   (26.08.2009 в 08:56)   личное сообщение
 
 

Красава
А как это вы такую формочку нарисовали?

  Ответить  
 
 автор: Lukas   (26.08.2009 в 11:50)   личное сообщение
 
 

Как-то так

  Ответить  
 
 автор: Alex   (26.08.2009 в 08:57)   личное сообщение
 
 

Чё та сходу не получается ковыряюсь...

  Ответить  
 
 автор: Alex   (08.09.2009 в 17:59)   личное сообщение
19 Кб.
 
 

Ничё ниполучаицо!

  Ответить  
 
 автор: Lukas   (08.09.2009 в 20:56)   личное сообщение
 
 

1. Уж если в обоих модулях описываешь процедуру под одним именем, то:
В обоих модулях добавить:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

2. в Function WriteLPT() модуля LPT:

...
         Do
            For i = 1 To 24
               asd(i) = Forms![FMAvto]("Field" & i + 0)
            Next i
   '         .MoveNext
         Loop Until .EOF
...

откуда компилятору знать про какой-то .EOF?
и зачем цикл Do-Loop? Если бы не ошибка на .EOF этот цикл впал бы в нирвану, вместе с вложенным циклом.
3. Зачем растаскиваешь по полям формы бинарное значение, есть же массив asd(24) /лучше asd(1 To 24)/, его и используй при подготовке и выводе в порт.
А если хочешь посмотреть что в нем, считай данные из него и положи на форму.

  Ответить  
 
 автор: Alex   (08.09.2009 в 21:59)   личное сообщение
16 Кб.
 
 

То есть вот так вот? И все?
Проверить не могу т.к. дома нет ни железяки (приемника), ни LPT порта. Но по крайней мере не ругается...
А как акс узнает что массив asd(1 To 24) это именно те самые поля которые нужно?

Добавлено: НЕТ - НЕ ТАК - НЕ СМОТРИТЕ Щас исправлю

Добавлено: вот - переделал Теперь понял как "...акс узнает что массив asd(1 To 24) это именно те самые поля которые нужно"

  Ответить  
 
 автор: Lukas   (09.09.2009 в 00:20)   личное сообщение
 
 

Еще раз:
Не надо считывать данные с полей формы в массив!!!
Массив заполнять программно!!!
Если не ошибаюсь, изначально там должны быть биты Long числа, преобразованного к двоичному представлению.
Используй функцию преобразования Long числа в массив битов, вначале предыдущего твоего топика есть пример такой функции.
Далее меняешь значения элементов массива как требуется для вывода в порт.
Выводишь в порт тоже из массива.
Если надо смотреть значения элементов массива - выводишь значения из массива на форму.
И перемести все процедуры/функции из общего модуля в модуль формы.

  Ответить  
 
 автор: snipe   (09.09.2009 в 06:09)   личное сообщение
 
 

Как вариант.....

вариант 1
переделайте функцию Remote()...
в конечном итоге она должна выдавать в тексте весь сигнал Data (т.е. в одном слове все 24 символа)......(в первых вариантах вашей проги я это видел - правда вы тогда там сигнал в поле собирали )
далее в функции LPT убрать описание массива, убрать цикл заполнения массива (убрать все что напоминает о массиве) - он там вообще не нужен

с формы убрать поля где прописывались биты сигнала Data (тоже не нужны)
теперь для начала некой переменной uio( String) присваиваем значение функции Remote()
в функции LPT вот эту строку

If asd(fgh) = "0" Then signalinteger = 1 Else signalinteger = 3


заменить примерно на вот это

If Mid(uio,fgh,1) = "0" Then signalinteger = 1 Else signalinteger = 3


возможно что вот на это

If Mid(uio,25-fgh,1) = "0" Then signalinteger = 1 Else signalinteger = 3


вариант 2

тоже самое переделать функцию Remote()

в цикле заполнения массива обращайтесь не к полю, а к переменной uio (см.выше) выдергивая по биту

примерно так

asd(i) = Mid(uio,i,1)


или вот так

asd(i) = Mid(uio,25-i,1)

ну соответственно поля на форме придется убрать-они не нужны

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

По моему мышлению во втором варианте будет более четкий сигнал, но это только догадки

  Ответить  
 
 автор: Alex   (10.09.2009 в 18:12)   личное сообщение
 
 

To Lukas & snipe
Не, отказываться от полей в форме, ну вы поняли, не хочу. Так как есть на данный момент мне удобнее, потом - возможно...
Есть несколько вопросов не по теме:

1. Возможно ли из акса программно крутить виндовый микшер? И не мастер, а регулятор уровня линейного входа?

2. Как сделать постраничное перелистывание списка кнопкой? Ну типа PageUp / PageDown?
Варианты:
SendKeys "PgDn", False
SendKeys "PageDown", False
SendKeys 34, False
SendKeys 0x[22, False
SendKeys 81, False
SendKeys 0x51, False
не работают
Вариант:
Me!Список0 = Me!Список0 + 10 ' 10 - например
Работает, но как то криво

3. Как проверить наличие записи в таблице?
Сделал кнопочку МЕМ - суть ее в том, что при нажатии на нее, запрос на добавление добавляет в таблицу Станции текущую частоту приема. В таблице на поле Частота стоит "повторения не допускаются" Т.е. если нажать МЕМ на имеющейся частоте, то она просто молча не добавляется. А хотелось бы поиметь соответствующее сообщение.

  Ответить  
 
 автор: Alex   (10.09.2009 в 18:36)   личное сообщение
 
 

На данный момент все это выглядит вот так: http://webfile.ru/3910098
Добавил логотипы радиостанций

  Ответить  
 
 автор: Alex   (10.09.2009 в 18:37)   личное сообщение
 
 

"И перемести все процедуры/функции из общего модуля в модуль формы."
После перемещения ругецо - спрашивает кто такой Band...

  Ответить  
 
 автор: ShadowOfSun   (10.09.2009 в 18:51)   личное сообщение
 
 

На первый вопрос держи ссылочку
http://www.sql.ru/forum/actualthread.aspx?bid=22&tid=248037&hl=%e3%f0%ee%ec%ea%ee%f1%f2%fc
громкость микшера
либо так

Option Compare Database
Option Explicit

Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long

Private Type ulLong
    HiWord As Integer
    LoWord As Integer
End Type

Private Type uvLong
    n As Long
End Type

Private ulVol As ulLong
Private uvVol As uvLong

Public Function SetVolume(Volume As Long)
' Максимальное значение параметра Volume = &HFFFF&.
    ulVol.HiWord = (Volume And &H7FFF&) - (Volume And &H8000&)
    ulVol.LoWord = (Volume And &H7FFF&) - (Volume And &H8000&)
   
    LSet uvVol = ulVol
   
    Call waveOutSetVolume(0, uvVol.n)
End Function



на третий вопрос тоже ссылка
http://www.sql.ru/forum/actualthread.aspx?tid=693609

  Ответить  
 
 автор: snipe   (11.09.2009 в 08:23)   личное сообщение
 
 

по поводу постраничного перелистывания

forms![имя списка].ListCount - показывает сколько в текущий момент в списке записей следует учитывать что отсчет идет от 1

конструкция


forms![имя списка]=forms![имя списка].ItemData(M)
'где М - целое положительное число


позволяет переместиться на определенную строчку в списке

следует учитывать, что М ведет отсчет от 0 (т.е. ItemData(0) установит выбор на первой строчке)

осталось только накидать код который будет обрабатывать события ваших кнопок

  Ответить  
 
 автор: snipe   (11.09.2009 в 09:05)   личное сообщение
 
 

Забыл написать...

forms![имя списка].ListIndex - показывает какая строчка выделена

теперь вроде все что вам может понадобиться

  Ответить  
 
 автор: snipe   (11.09.2009 в 10:40)   личное сообщение
 
 

Чета чуть выше я велосипед изобретал....
Me![имя списка].SetFocus
SendKeys "{PGUP}"

ну соответственно
SendKeys "{PGDN}" в другую сторону

  Ответить  
 
 автор: Alex   (13.09.2009 в 16:34)   личное сообщение
 
 

ShadowOfSun
"На первый вопрос держи ссылочку..."

Вот спасибище огромное! При включении/выключении (особенно) и переключении станций в динамиках слышался громкий ПУК. Думал решать проблему на железячном уровне; с помощью этого модуля все оказалось намного проще: перед выполнением Remote загоняю линейный вход в 0, после выполнения - с некоторой задержкой (оптимальной оказалось 200мс) возвращаю желаемый уровень громкости. Отлично все работает!

snipe
Me![имя списка].SetFocus
SendKeys "{PGUP}"

Спасибо! Работает! А у меня такая же конструкция правда без фигурных скобочек не работала

Вот что сейчас имеется: http://webfile.ru/3916791
Осталось сделать "горячие клавиши" ну и может быть, от безделья, какой-нибудь импорт/экспорт списка станций, чтобы при смене версии не терять настройки.

Еще один момент. Программка запускается со скрытым окном и кнопкой закрытия access. Это хорошо. Если пользоваться кнопочкой "свернуть" на форме - она сворачивается в левый нижней угол и прилепляется к панели задач, при восстановлении показывается опять одна форма. Это тоже хорошо. (Ну было б еще лучше, если бы сворачивалась в панель задач, как и все программы... ну это я уже придираюсь и капризничаю - и так хорошо!)
А вот если нажать виндовую кнопочку "свернуть все окна", или щелкнуть по ярлычку в панели задач, тогда она сворачивается полностью и при восстановлении разворачивается вместе с окном access. Это уже плохо. Можно ли как то это побороть?
Lukas показывал тут такую красивую формочку - там, по моему, не было этого недостатка. Файл этот случайно удалил, а скачать больше негде

  Ответить  
 
 автор: Alex   (14.09.2009 в 22:17)   личное сообщение
 
 

Конечно соверсшенству нет предела (оно недостижимо), но, условно, на данный момент, проект считаю законченным: сегодня наконец то все собралось во едино и установилось в машинку - самое интересное, что все это работает
Если кому интересно для чего все это было нужно - вот: http://www.pccar.ru/showthread.php?t=6162&page=7 (пост #70)
ОЧЕНЬ ХОЧЕТСЯ ПОБЛАГОДАРИТЬ ВСЕХ ЗА ПОМОЩЬ В СОЗДАНИИ ПРОГРАММЫ!!!

  Ответить  
 
 автор: ShadowOfSun   (14.09.2009 в 23:58)   личное сообщение
 
 

Очень рад, что у тебя все получилось.
Интересный проект
Удачи на дорогах

  Ответить  
 
 автор: Alex   (17.09.2009 в 09:55)   личное сообщение
 
 

Спасибо!

Добавил регионы: http://webfile.ru/3927306

Теперь осталось все это к GPS прикрутить - чтоб города сами переключались

  Ответить  
 
 автор: snipe   (17.09.2009 в 10:34)   личное сообщение
 
 

Да действительно - колесо придумал ленивый - надоело таскать.....

Надо смотреть что GPS выдает, а потом думать как это переварить

  Ответить  
 
 автор: Alex   (18.09.2009 в 09:57)   личное сообщение
 
 

GPS выдает вот такое: http://webfile.ru/3930439
Да вообще это шутка была Неоправданно сложно да и не нужно - машина ж не самолет.
Да и как привязку к координатам делать? - центр города не подходит... напрашивается квадрат(район)...

  Ответить  
 
 автор: ra4hrz   (05.11.2010 в 01:21)   личное сообщение
122 Кб.
 
 

Здравствуйте, форумчане. С праздниками.
Разговаривал с Алексеем (Alex), которому вы помогали создать прогу для управления синтезатором на LM7000. Он прислал меня к вам.
Хочу только сразу предупредить, я в программировании - дуб, хотя в молодости возился с ZX-Spectrum и даже пытался что-то сочинять на Бейсике. Так что разговаривать на равных с вами о кодах я не смогу.
Проблема в следующем: Я взял за основу прогу Алексея для управления синтезатором LM7000 в трансивере. С полгода работал без проблем. Но возникла мысль уменьшить шаг перестройки синтезатора для расширения возможностей. Для этого нужно ввести сдвиговый регистр на 74НС595. Автор девайса синтезатора общаться отказывается, говоря, что это ему не интересно. Вот, что удалось почерпнуть из форума с ним:
Начало цитаты.
...Не понял, в чем у Вас затруднения? На входе LM-ки тот же сдвиговый регистр, что и 595-й... Единственное, фазы сигналов слегка разнятся, почему у меня и стоит пара инверторов... Ну и, поскольку у LM-ки нет внешнего выхода от последнего разряда, а у 595 есть, то 595 приходится ставить первым... Данные для LM-ки и для 595 в программе "готовятся" по отдельности, а перед выводом "сшиваются" в единое "управляющее слово"...

Т.е. управляющая фраза заливается последовательно, но сначала включается "enable-нога" 595й и скармливаются восемь бит, потом эта упр. нога выключается и 595я остальные биты выпускает на входе QC чтобы они попали на вход Data LM7000, соответственно с включением Enable у LM?

Включенные, как на моей схеме 595 и LM-ка представляют собой "единый" сдвиговый регистр на 32 (если мне не изменяет мой склероз по поводу разрядности регистра LM-ки) разряда... И записываются в него эти 32 бита последовательно непрерывно, именно как в "единый" регистр...
Конец цитаты.
Нужно управлять этими 8 битами так, чтобы при переполнении (или обнулении) регистра увеличивался (или уменьшался) шаг перестройки (переменная RF). Перестраиваться можно кнопочками на форме, или кнопками мыши, или её колёсиком.
Кусок схемы ( не обращайте внимание на СОМ-порт - это просто гнездо от СОМ, управляю через LPT) во вложении, там же сама программа и листинги.
Мужики, помогите.

Андрей.

  Ответить  
 
 автор: snipe   (05.11.2010 в 04:55)   личное сообщение
 
 

как я понял вам нужно выкинуть через LPT порт последовательно 32 бита причем первых 8 на одну микросхему а остальные 24 на другую
если это так
то схематическое решение немного не правильное - из LPT порта надо вытаскивать сигнал по 4 проводам (у Алекса по 3)
CL_K-тактовую частоту
Data_K - собственно сигнал
СE_1-разрешения изменения 1 микросхемы
СE_2 - разрешения изменения 2 микросхемы

при таком решении без разницы в какой последовательности будут стоять регистры сдвига

вообще в радиоэлектронике я тоже полный профан
прошлый раз Алекс прислал схему сигнала(лов) и по ней я ориентировался

  Ответить  
 
 автор: ra4hrz   (05.11.2010 в 10:04)   личное сообщение
 
 

Доброе утро, Snipe.
Да, есть и такая схематика, с раздельными enable. Во вложении рисунок. А почему нельзя по трем проводам? Регистры подключены последовательно. Выход 595 идёт на вход DATA LM-ки, нужно просто, чтобы первыми "вылетали" биты для ЛМ, а затем - для регистра 595. Может и не прав, но мне так кажется. А сигнал разрешения записи - общий для обех микрух, только различаются по фазе (стоят инвертора). И, snipe, управляющее слово постоянно (в смысле, циклически) подаётся на ЛМ-ку или только, если изменились параметры? Можно, наверное, постоянно это не делать, так как регистры в ЛМ и 595 с защелкой. Ещё посылаю во вложении даташит на 595 и небольшую статейку по 595. Ссылка на вложение: http://zalil.ru/29920472

Андрей.

  Ответить  
 
 автор: snipe   (05.11.2010 в 12:10)   личное сообщение
 
 

различатся по фазе
а как вы подадите сигнал запрещающий запись в обе микросхемы

  Ответить  
 
 автор: ra4hrz   (05.11.2010 в 13:55)   личное сообщение
 
 

Слушай, ну я не знаю. Схема, в которой сигнал с 9 ноги регистра 595 идёт на 5 ногу ЛМ-ки, рабочая. Значит как-то можно управлять. Мне, в принципе, без разницы 3 или 4 провода будут идти на управление. Программу только надо как-то изменить.

Да и ещё. Как мне в этой программе организовать опрос 5 (или любой свободной, без разницы куда припаять) ноги порта LPT (на ней периодически будет появляться 0 от внеш. устройства).

  Ответить  
 
 автор: snipe   (05.11.2010 в 14:13)   личное сообщение
 
 

вот и я про то же - загрузили одну микруху переключились потом другую загрузили и запретили ввод инфы и для этого надо два провода


вот как организовать опрос (получение значений из порта)
это не ко мне - не знаю(не разбирался)

разберитесь с тем что надо передать микросхемам
а дальше разберемся

  Ответить  
 
 автор: ra4hrz   (05.11.2010 в 15:50)   личное сообщение
 
 

Автор схемы писал, что управляющее слово одно и длиной 32 бита (8-для 595 и 24-для ЛМ). А что в проге нужно добавить, как это всё организовать?

  Ответить  
 
 автор: snipe   (06.11.2010 в 03:54)   личное сообщение
18 Кб.
 
 

не знаю что писал автор
но когда ему делали выгрузку в LPT порт выгружали слово из 24 бит

вот раскопал =>
на зелененьких проводах всегда установлена 1
если один из проводков (10-13) соединить с землей и потом считать состояние этой части порта то можно получить цифирку (а если подавать данные через шифратор то можно подцепить 16 датчиков)

вот таким кодом
dim statusint as variant
statusint=inp(889)

в начале модуля соответственно прописать
Private Declare Function Inp Lib "C:\WINDOWS\system32\inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer

  Ответить  
 
 автор: Lukas   (05.11.2010 в 14:59)   личное сообщение
32 Кб.
 
 

Я пока не понимаю, что нужно сделать для "...уменьшить шаг перестройки синтезатора...", но
внутри файла "очень не очень".
Чуть пошаманил =>
Проверьте, если работает, будем двигаться дальше.
(особенно работает ли AM интересует)

  Ответить  
 
 автор: ra4hrz   (05.11.2010 в 16:02)   личное сообщение
 
 

Да, здорово Вы её обкорнали, но всё работает, только почему-то сначала нужно Access загрузить и в нём уже открывать. Просто кликая по файлу не получается загрузка.

А насчёт шага перестройки - это так. Положим, к примеру, у нас в 595 регистре слово 00100001, мы нажимаем кнопочку "+" на форме и значение меняется на 00100010, а если на кнопку "-", то 00100000. Только по одному биту - это слишком медленно (шаг маленький). До полного заполнения регистра - 256 шагов, а надо шагов 50-100.
Да, и ещё. Режим АМ не нужен. Синтез работает на FM только. Частота ГУНа 111-114 МГц.

  Ответить  
 
 автор: Lukas   (05.11.2010 в 16:44)   личное сообщение
40 Кб.
 
 

2003 =>
Первый раз открывается невидимым, приходится гасить через диспетчер.
Какое-то "наследство" от исходного файла, не могу избавиться пока.

  Ответить  
 
 автор: Lukas   (05.11.2010 в 16:46)   личное сообщение
 
 

Так чего, АМ вырезать нафиг?

  Ответить  
 
 автор: ra4hrz   (05.11.2010 в 16:59)   личное сообщение
 
 

Да, АМ нафиг не нужен. Можно также минимизировать панель. Оставить только кнопки шага и диапазон из таблицы (там, где 40м, 30м, 80м). А остальные настройки сделать всплывающими.

  Ответить  
 
 автор: Lukas   (05.11.2010 в 17:04)   личное сообщение
 
 

http://www.hiprog.com/forum/files/5638-20090825122949.GIF

  Ответить  
 
 автор: ra4hrz   (05.11.2010 в 17:09)   личное сообщение
7 Кб.
 
 

Что-то типа такого, но это не самое главное.

  Ответить  
 
 автор: Lukas   (06.11.2010 в 16:53)   личное сообщение
69 Кб.
 
 

Поскольку так и не въехал, что нужно изменить,
нарисовал лицо как смог =>
Вот только интересно, работает ли?

ps. У кого нет библиотек LPT порта, кнопки "<", ">", "Play" лучше не давить.

  Ответить  
 
 автор: ra4hrz   (06.11.2010 в 17:57)   личное сообщение
 
 

Да, вполне мордочка, на уровне, всё работает. Порадовала возможность редактирования имиджа.
Lukas, благодарю. А там, внутри, уже 32 бита пересылает?

  Ответить  
 
 автор: Lukas   (06.11.2010 в 18:02)   личное сообщение
 
 

Неа, все как в предыдущем варианте.
Для меня эти "посылаемые биты" темный лес, ночью, зимой.

  Ответить  
 
 автор: snipe   (06.11.2010 в 18:24)   личное сообщение
 
 

да вот для меня тоже
то что отсылается нужно для работы lm7001 а причем тут 595 и почему 32 бита а отсылается 24

  Ответить  
 
 автор: ra4hrz   (06.11.2010 в 20:33)   личное сообщение
95 Кб.
 
 

Да я ж писАл. LM7001 не может работать с мелким шагом перестройки. Поэтому ставят сдвиговый регистр на 74НС595. Существует два способа подключения его. Скажем так, последовательный (когда выход 595 подключают на вход data LM-ки и засылают слово в 32 бита, а сигналы СЕ и CL - запараллелены. Из 32 бит 24 проходят через 595 к ЛМ, а последние 8 остаются в 595) и параллельный ( DATA и CL идут и к 595, и к ЛМ, а сигналом CE выбирается в какую микросхему будет записано управляющее слово. В этом случае посылка сигнала идёт раздельно: сначала 24 бита для ЛМ, затем 8 бит для регистра 595). Рисунки во вложении. Вот этими 8-ю битами и в первом, и во втором случае нужно иметь возможность управлять, т. е. сдвигать регистр вверх-вниз. В 8-ми битовый регистр влезет до заполнения 255 единичек (в десятичной системе). При заполнении всего регистра (на входе: 11111111): в битах для ЛМ должен увеличится на шаг StepNet (словно нажали кнопку ШАГ) переменная RF (из оригинала программы), а регистр 595 - обнулиться и, соответственно, при движении в обратную сторону, при достижении на входе: 00000000 - RF уменьшится на шаг StepNet, а регистр заполнится. На регистре собран ЦАП, который путём увода частоты ( на 1,2 - 1,4 кГц) опорного кварцевого генератора, обеспечит нам мелкий шаг перестройки частоты на выходе синтезатора. Если, что не понятно, спрашивайте.

  Ответить  
 
 автор: Lukas   (06.11.2010 в 21:27)   личное сообщение
 
 

То есть, в одной посылке, за теми 24 битам которые мы засылаем сейчас,
нужно слать еще 8 бит (от 00000000 до 11111111)
1. с "кувыреками" как в оригинале
или
2. без "кувыреков".?

Сначала шлется младший бит, за ним более старшие?

  Ответить  
 
 автор: snipe   (06.11.2010 в 23:01)   личное сообщение
 
 

с кувыреками
сначала старший

мысль такая - пока оставить все как есть
просто надо немного дописать
во вложении есть рисунок 0001.jpg на него и ориентироваться
только сигнал брать с 2 3 4 5 ног lpt порта

'CE1 (pin3 LM7001) > D0 (pin2 LPT)
'Data (pin5 LM7001 pin14 595) > D1 (pin3 LPT)
'CL (pin4 LM7001 pin 11 595) > D2 (pin4 LPT)
'CE2 (pin 12 595) > D3 (pin5 LPT)

далее после того как отработает код алекса
нужно закинуть код для 595 для этого на ce1 подать ноль (запретить запись в регистр) а на се2 подать 1

добавить примерно такой блок

Dim CLk As String
Dim signaltxt As String
Dim signalinteger As Integer
Dim i As Integer
Dim fgh As Integer
fgh = 0
CLk = "1"
Out &H378, 0

For i = 1 To 16

If CLk = "0" Then 'устраиваем кувыркашки
CLk = "1"
Else
CLk = "0"
End If

If i / 2 - Int(i / 2) > 0 Then fgh = fgh + 1
signaltxt = "1" & CLk & asd(fgh) 'собираем сигнал
Select Case signaltxt 'ищем числовой аналог
Case "100": signalinteger = 8
Case "101": signalinteger = 10
Case "110": signalinteger = 12
Case "111": signalinteger = 14
End Select

Out &H378, signalinteger 'выпихиваем число в порт
'Call Sleep(1) 'пауза 1 миллисекунда
Next i

  Ответить  
 
 автор: ra4hrz   (07.11.2010 в 00:10)   личное сообщение
 
 

Господа, ну вам виднее. Я тут туго соображаю. Вот только сейчас до меня дошло, что кувыркашки - это типа тактовой частоты.
Пытался сделать опрос 889 порта, как ты, snipe, посоветовал. Отдельно всё работает. А вот всунуть этот кусочек в прогу основную не получается. Она просто виснет.
Вот текст:

Private Declare Function Inp Lib "C:\WINDOWS\system32\inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer

Dim statusint As Variant
statusint = Inp(889)
If statusint = 95 Then RF = RF + StepNet
Call To_TRX


Это типа внешних кнопок ШАГ. Значение переменной statusint = 95 - это 12 нога LPT на земле.
Что не так сделал?

  Ответить  
 
 автор: Lukas   (07.11.2010 в 00:36)   личное сообщение
 
 

Пишем в порт &H378(888), а считываем с 889.
Это ошибочка или так и надо?

  Ответить  
 
 автор: ra4hrz   (07.11.2010 в 00:56)   личное сообщение
30 Кб.
 
 

Нет, ошибки нет. Всё правильно. Порт 889 свободный, никому не мешает. Вот на него и хочется внешние кнопки повесить. Пробовал в разные места в проге всовывать этот кусочек, но успеха не поимел. То виснет, то просто не обращает внимание. Метод научного тыка не прокатил.
Во вложении - немного юмора.
Завтра я на работе, на сутках, общаться смогу по инету, а вот аппаратно проверить нет.

  Ответить  
 
 автор: snipe   (07.11.2010 в 06:27)   личное сообщение
 
 

там между кнопочкой и разъемом наверное что-то типа триггера поставить надо т.е. нажали кнопочку триггер встал в нужное состояние далее опросили порт 889 считали инфу и через 890 порт скинули состояние триггера до следующего нажатия кнопочки

  Ответить  
 
 автор: ra4hrz   (07.11.2010 в 09:22)   личное сообщение
 
 

Доброе утро.

Да, нет. Триггер нафиг не нужен. Если постоянно будет опрашивать 889 порт, то нажатие кнопки комп не пропустит. Оно всё-таки относительно продолжительное. Прога же постоянно отслеживает изменение переменных. Куда-нибудь туда и всунуть опрос 889 порта и комп поймёт, что замкнуты нужные контакты в порту и выдаст команду на увеличение-уменьшение шага.

  Ответить  
 
 автор: snipe   (07.11.2010 в 10:41)   личное сообщение
 
 

все нормально
на lpt разъем выходит 3 порта 888 889 890
888 и 890 служат для ввода\вывода т.е. к ним можно обратиться inp\out
889 - служит только на ввод инфы
по распайке
порт 888 - 2-9 контакты разъема (слово 8 бит)
порт 889 - 10-13,15 контакты разъема (старший - контакт 15 за остальные 4 бита в следующей последовательности контакты 13, 12, 10, 11)
порт 890- 1, 14,16,17 контакты (слово 8 бит однако используются только 4 младших бита)
контакты 18-25 - земля

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 10:13)   личное сообщение
 
 

Так, всё-таки, в каком месте программы воткнуть мне этот кусочек:

Private Declare Function Inp Lib "C:\WINDOWS\system32\inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer

Dim statusint As Variant
statusint = Inp(889)
If statusint = 95 Then RF = RF + StepNet
Call To_TRX


Что-то ошибку то и дело выдаёт.

  Ответить  
 
 автор: snipe   (08.11.2010 в 11:01)   личное сообщение
 
 

скорее всего так
у формы есть событие таймер
вот в процедуру и запихать это
выставить интервал таймера в милисекундах
и переделать немного код

Dim statusint As Variant
statusint = Inp(889)
If statusint = 95 Then
RF = RF + StepNet
Call To_TRX
end if

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 13:48)   личное сообщение
 
 

Слушай, snipe, у нас с тобой получается беседа англичанина с немцем. Слова похожие, а смысл разный. Ты не забывай, что я немного не в теме. Где этот таймер? У меня вообще программа открывается в Access, а потом коды читаю уже в VB. В нём, в меню HELP читаю, что версия 6.3, но сам VB какой-то обрезанный. В меню File нет преобразования в ехе-файл, на панеле инструментов тоже половины значков нет (в том числе и timer). Это я сравниваю с VB5 и VB6portable, которые у меня есть.
Так, что, извиняй, давай пальцем тыкай.

  Ответить  
 
 автор: snipe   (08.11.2010 в 15:54)   личное сообщение
 
 

извините
я думал Вы знаете

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 16:16)   личное сообщение
 
 

Подскажите, куда мне поместить этот опрос? Два дня пытаюсь в разные части программы вколотить эти строчки. Если в форму LM700x, то не нравится ВБ обращение к длл. Если в LPT, то переменные не находит. Вот, блин, эпидерсия какая. help me.

  Ответить  
 
 автор: час   (08.11.2010 в 16:18)   личное сообщение
 
 

таймер он на панеле контролов(элементов управления) лежит - где кнопки берём, поля, Labels и т.д.
=====================
Положить этот таймер на форму, которая всё время открыт и видна.
в свойствах таймера Interval написать 10 - 10000 - экспериментально
Кликнуть по нему пару раз


Private Sub Timer1_Timer()
'пересчёт нужного
----------
поместить этот опрос
-------------------
End Sub

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 17:02)   личное сообщение
 
 

Так у меня в VB Toolbox не активна. Файл, которым я стартую, имеет расширение .mdb. Открывается Access в нём, при нажатии на Вид, открывается форма (на панеле инструментов Timer нет). Если нажать кнопку Программа, то открывается VB 6.3, но там Toolbox не активен. И чё делать?

  Ответить  
 
 автор: час   (08.11.2010 в 17:22)   личное сообщение
 
 

Думаю............

  Ответить  
 
 автор: час   (08.11.2010 в 17:23)   личное сообщение
 
 

Можно зафигачить на событие - Load (формы)

call функция Бесконечный цикл

Бесконечный цикл()
Do

функция этот опрос ()
функция опрос клавы ()

Loop

end

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 17:26)   личное сообщение
64 Кб.
 
 

Бр-р-р. А нафига бесконечный цикл? Прога и так постоянно выполняется. Я сужу по кнопкам 48 и 49. Значит прога циклически через них проходит. Вот здесь бы где-то (или до, или после кнопочек) и добавить опрос 889 порта. В голове у меня уже каша. Где на форме Form_700x разместить эту строку:
Private Declare Function Inp Lib "C:\WINDOWS\system32\inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer

Без неё проблема с Inp, а с ней - вообще останавливается, предлагает макрос создать. Третий день на месте топчусь.

  Ответить  
 
 автор: час   (08.11.2010 в 19:21)   личное сообщение
 
 

эту строку на самом самом верху
над всеми строками
выше только строка, если таковая имеется (Option Explicit) как то так

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 19:30)   личное сообщение
 
 

Это я знаю, что её обычно там помещают, но если я её прописываю в Form_LM700x, то комп предлагает сразу сотворить макрос. Почему?
Как между собой соединить переменные, находящиеся в разных модулях? То бишь, в одном модуле у меня определена переменная, как мне с ней работать в другом модуле?

  Ответить  
 
 автор: час   (08.11.2010 в 20:02)   личное сообщение
 
 

вместо Private
пиши Public - типа глобальная общедоступная..общественная.....

Public GLB_PATCH_Windows As String ' путь к Windows

Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long' перемещение формы за любую часть

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 20:48)   личное сообщение
57 Кб.
 
 

Так, ЧАС, давай мух от котлет отделим. Если я меняю слово приват на паблик, то получается => см. вложение. Одновременно с выдачей сообщения выделено инверсией номер порта 889 в коде.

А это:


Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long' перемещение формы за любую часть


к чему относится?

  Ответить  
 
 автор: час   (08.11.2010 в 21:28)   личное сообщение
 
 

это пример..... просто
====================
а ты засунь это ни в форму, а в отдельный модуль
вот тада мухи от котлет будут отдельно..........

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 21:36)   личное сообщение
 
 

Засунуть всё или первые две строчки. А остальное в форму?

Option Explicit
Public Declare Function Inp Lib "C:\WINDOWS\system32\inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer

Dim statusint As Variant
statusint = Inp(889)
If statusint = 95 Then RF = RF + StepNet
Call To_TRX
End If

  Ответить  
 
 автор: час   (08.11.2010 в 21:38)   личное сообщение
 
 

Option Explicit
Public Declare Function Inp Lib "C:\WINDOWS\system32\inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
это в модуль

  Ответить  
 
 автор: час   (08.11.2010 в 21:39)   личное сообщение
 
 


Dim statusint As Variant


а это где нибудь в Load form

  Ответить  
 
 автор: час   (08.11.2010 в 21:40)   личное сообщение
 
 


statusint = Inp(889)
If statusint = 95 Then RF = RF + StepNet
Call To_TRX
End If 



а это куда нить - где ты говоришь прога всё время шуршит

  Ответить  
 
 автор: час   (08.11.2010 в 21:42)   личное сообщение
 
 

хотя нужно в модуль тоже
Public statusint As Variant
=============================
извини башка не фурычит ваще - пиду спать..............

  Ответить  
 
 автор: ra4hrz   (08.11.2010 в 21:57)   личное сообщение
 
 

Да, всё ошибок нет, но и желаемого результата тоже. Не увеличивает прога шаг. Ладно завтра посмотрим.

  Ответить  
 
 автор: snipe   (08.11.2010 в 23:20)   личное сообщение
 
 

rf как и stepnet это не переменные
это поля на форме и обращение к ним должно быть соответствующее
или me!rf me!stepnet
или forms![имя формы]![rf] forms![имя формы]![stepnet]

добраться до события таймер
открываете форму в режиме конструктора
наводите курсор на любой контрол (поле например)
давите правую кнопку мыши выбираете свойство
появится панель свойств этого контрола
чуть выше вкладок будет поле со списком
нужно выбрать форма
на вкладке свойства
найдите интервал таймера и установите время в миллисекундах
тут же найдите таймер установите курсор в строку
справа появится две кнопки
первая это поле со списком
кликаем по ней выбираем процедура обработки события
вторая с изображением трех точек кликаем по ней
открывается редактор VBA
вставляем код
перемещаемся в самый верх модуля
видим надпись
Option Compare Database
под нее вставляем декларирование функции из библиотеки inpout32.dll

  Ответить  
 
 автор: snipe   (08.11.2010 в 23:35)   личное сообщение
 
 

чуть выше
на вкладке события а не свойства

теперь разберем ваш код
и то что я вам исправлял
в вашем случае

Dim statusint As Variant
statusint = Inp(889)
If statusint = 95 Then RF = RF + StepNet
Call To_TRX

Call To_TRX находится снаружи условия
значит при любом значении statusint эта функция будет выполняться

в моем случае

Dim statusint As Variant
statusint = Inp(889)
If statusint = 95 Then
RF = RF + StepNet
Call To_TRX
end if

вызов функции находится внутри условия соответственно функция будет выполняться только при наступлении события statusint = 95 - а это между прочим время

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

Dim statusint As Variant
statusint = Inp(889)
If statusint = 95 Then
me!RF = me!RF + me!StepNet
Call To_TRX
end if

  Ответить  
 
 автор: snipe   (09.11.2010 в 00:17)   личное сообщение
61 Кб.
 
 

у меня библиотеки нет - не проверял
вот попробуй =>

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 00:56)   личное сообщение
 
 

Во, уже написАли полно. Сейчас прочту, а пока хочу обрадовать, господа, всё заработало, но только, если нажимать кнопку ШАГ (получается, что вперёд идёт с удвоенным шагом, а назад - стоит на месте). Склоняюсь к мысле, что придётся вводить принудительный цикл для опроса порта 889. Нужно, чтобы постоянно порт опрашивался. Я думал, что если кнопки на форме реагируют без проблем, то прога постоянно по ним елозит. Как определить в каком месте находится выполнение кода проги, как её в этом месте остановить? Что она делает, если нет внешних воздействий?

  Ответить  
 
 автор: snipe   (09.11.2010 в 01:03)   личное сообщение
 
 

с таймером вот так
запускается форма
и через определенные промежутки времени (определяемые интервалом таймера)
отрабатывает код написанный в таймере
т.е. опрашивается порт 889
посмотрите последний пример

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 01:21)   личное сообщение
 
 

Так, таймер запустил, но он бежит при нажатии, а надо, что был единичный импульс на изменение шага. По идее, поставить секунд 5, то бишь 5000 миллисекунд и, наверное, будет ничего. Нет, нифига, 5 секунд не пойдёт. Он после нажатия ждёт 5 сек., а надо, чтобы типа триггера работал. Нажал - шаг увеличился. Уменьшишь время - будешь частоту ловить, а это не есть зер гут.

  Ответить  
 
 автор: snipe   (09.11.2010 в 01:35)   личное сообщение
62 Кб.
 
 

а вот так
=>

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 01:56)   личное сообщение
 
 

Что-то программа не запускается. Я идею понял: воспользоваться булями, да или нет. Должно сработать. Вообще-то, поставил 1 секунду и вполне нормально. Даже появляется дополнительная фишка: быстрое передвижение по частоте, не надо постоянно дрюкать по кнопке. Придётся 4 кнопки ставить: пошагово - вверх-вниз и ускоренно. Да, мужики, Вам респект и уважуха. Скачал, кстати, по ходу пьесы книжечку по VB. Довольно тольково написано.

  Ответить  
 
 автор: snipe   (09.11.2010 в 01:59)   личное сообщение
 
 

зачем 4
можно 2
кратковременное нажатие и удержание
завтра (точнее сегодня) напишу надо перед работой хоть часок поспать

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 02:06)   личное сообщение
 
 

Да, так здорово будет. Пока у меня так всё работает. ОК, спокойных снов. Тоже надо, наверное, в люлю. К тёплой жене под бок. Сам сегодня с суток и ещё не спал. Я, вообще-то, сова по натуре.

PS.
Слушай, пока любовался, как частота туда-сюда бегает, заметил, что комп с периодом, как в проге, винтом крутит (щелкает так: тык-тык, тык-тык и светодиодик моргает). Программу выключаю, вроде по-другому щелкать начинает или мне так кажется?

  Ответить  
 
 автор: snipe   (09.11.2010 в 01:11)   личное сообщение
 
 

чета до меня только сейчас дошло
имеем
три провода (три младших разряда) в порту 888
в которых за 48 полупериодов (шагов цикла) нужно выкинуть слово из 24 бит
т.е.
все время работы цикла на одном проводе удерживаем 1
на другом по нечетным тактам устанавливаем дату (данные)
за первый полупериод тактовую частоту переводим с 0 в 1
во второй полупериод тактовую частоту переводим с 1 в 0
для этого необходимо передавать в порт десятичные 1 3 5 7

а если использовать два порта 888 и 890
например в порт 888 просто передавать на один провод данные
а в порт 890 передавать тактовую частоту и разрешение на изменение
тогда в момент изменения инфы в 890 будет передаваться или 1 или 3
все упростится до следующего
cl=1
for i=1 to 24
Out 888, data ' или 0 или 1
for j=1 to 2
if cl=1 then
cl=3
else
cl=1
end if
Out 890, cl
Call Sleep(2)
next j
next i
Out 888, 0
Out 890, 0

  Ответить  
 
 автор: snipe   (09.11.2010 в 05:28)   личное сообщение
63 Кб.
 
 

вот =>
вроде и нажатие и удержание

  Ответить  
 
 автор: час   (09.11.2010 в 08:19)   личное сообщение
 
 

ни ХР себе в 5 утра!!!!!!!!!!!!!

  Ответить  
 
 автор: snipe   (09.11.2010 в 08:26)   личное сообщение
 
 

час - ты опять забыл что я на 4 часа раньше москвы живу т.е. у нас было 09.28

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 11:08)   личное сообщение
 
 

Всем, здравствуйте.

Так, всё работает.Частота и вверх, и вниз и шагает, и бегает. Единственная хотелка - это, чтобы между шагами и бегом была пауза. То бишь, нажал кнопочку - частота на шаг скаканула, ещё раз нажал - опять на шаг, но, если нажал и держишь кнопку, то частота не сразу начинает бежать, а через хотя бы 1 секунду. Наверное, delay вставить надо между ними.

  Ответить  
 
 автор: snipe   (09.11.2010 в 11:26)   личное сообщение
 
 

я же вам сделал
ну замените цифирку 7 на большую

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 11:38)   личное сообщение
 
 

Это я сразу сделал. Ставил даже 10000 - не помогло. Попробуй сам.

  Ответить  
 
 автор: snipe   (09.11.2010 в 11:41)   личное сообщение
 
 

пришли файлик

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 11:49)   личное сообщение
128 Кб.
 
 

Лови.

  Ответить  
 
 автор: snipe   (09.11.2010 в 12:01)   личное сообщение
 
 


чего творим - то

в вашем случае хоть мульярд ставьте толку не будет

вот

Private Sub Form_Timer()
Dim statusint As Variant
statusint = Inp(889)

If statusint = 95 Then
If takt < 7 Then 'задержка 7*[интервал таймера]
If jkl = False Then
Me!RF = Me!RF + Me!StepNet
Call To_TRX
jkl = True
End If
takt = takt + 1
Else
Me!RF = Me!RF + Me!StepNet
Call To_TRX
takt = takt + 1
End If
Else
If statusint = 255 Then
If takt < 7 Then 'задержка 7*[интервал таймера]
If jkl = False Then
Me!RF = Me!RF - Me!StepNet
Call To_TRX
jkl = True
End If
takt = takt + 1
Else
Me!RF = Me!RF - Me!StepNet
Call To_TRX
takt = takt + 1
End If
Else
jkl = False
takt = 0
End If
End If

End Sub

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 12:07)   личное сообщение
 
 

А-а, понятно, я постоянно счётчик takt сбрасывал в ноль. Вот тупой. Да, сейчас всё ОК. Благодарю.
Ещё не надоело со мной возиться? Это я о тех злополучных 8 битах для 595 регистра.

  Ответить  
 
 автор: час   (09.11.2010 в 13:02)   личное сообщение
 
 

Нифига се Вы наваяли..........123 сообщения - вот это мучения!!!!!!!!!
крута!!!!
======================
Задержка -
не только женщин раздражает
она во всех делах мешает
Замешкался, там, задержался
И без подштанников остался
А то бывает поспешил
Не с той по пьяне согрешил
И в результате - там задержка
Ну типа сексная издержка
А в Вашем случае она
Видать единственно верна!!!!!

  Ответить  
 
 автор: ra4hrz   (09.11.2010 в 14:02)   личное сообщение
 
 

Ну, положим, львиная доля сообщений - это Алекс постарался, а мы так, по-мелочи. Главное - результат достигнут.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList