На уровне моего понимания к коду претензий нет. Но попробуй добавить контрольные распечатки к каждому действию. И если есть осциллограф, пробник, посмотри - проскакивают ли импульсы. Не стесняйся вставлять паузы - 1-wire допускает. Кстати, можно ли endif не ставить в таком синтаксисе? Я знаю, что бейсик не C, но все же?
в таком синтаксе, если условие записано в одну строку, на Visual Basic-е end if можно и не ставить - тут как мне кажется дело в другом, после команды F0h и перед посыланием двух бит в ds1990a должно быть ещё что-то, это что-то или пауза или ещё какой-то бит, так или иначе в документации к ds1990a об этом ничего не сказано - я так понимаю специально не сказано! Мол дескать догадаетесь сами, если конечно не застрелитесь!
другом, после команды F0h и перед посыланием двух бит в ds1990a должно быть ещё что-то, это что-то или пауза или ещё какой-то бит, так или иначе в документации к ds1990a об этом ничего не сказано - я так понимаю специально не сказано! Мол дескать догадаетесь сами, если конечно не застрелитесь!
Прими, что даташит верен. это работает и проверено многими, в том числе и мной, и неоднократно. потому я и советую проконтролировать чтобы БИТЫ посылались строго: ни одного лишнего, ни одного пропущенного. Например, вначале, у меня создалось впечатление, что нет подтверждения бита после чтения двух бит. Потому что чтение - это запись 1. Поэтому прочитанную последовательность 10 10 11 - можно рассмотреть так: 101 011 - т.е. если действительно невыполняется DSOutBit - все происходит верно - передача 1/подтверждение 1, передача 0/подтверждение 1. Может тип данных не сравнивается? хм... хотя если ты получаешь "отвалился" - похоже что сравнивается.
КТО БУДЕТ ЧИТАТЬ ТО, ЧТО МЫ ЗАПИСАЛИ????????????????? После DSoutBit - надо сбросить принятые данные! Изучи внимательнее функцию DSOutByte. особенно тот момент где про эхо.
КТО БУДЕТ ЧИТАТЬ ТО, ЧТО МЫ ЗАПИСАЛИ????????????????? После DSoutBit - надо сбросить принятые данные! Изучи внимательнее функцию DSOutByte. особенно тот момент где про эхо.
Код:
Dim R(64) Dim By(64)
Text1.Text = "" Call DSReset 'даём сброс Call DSOutByte(&HF0) 'даём команду поиска ROM
For i% = 0 To 63
R(i%) = DSInTwoBit
If R(i%) = 1 Then Call DSOutBit(True) By(i%) = 1 mscDev.InBufferCount = 0 'чистим входной буфер Do 'чистим выходной буфер Loop Until mscDev.OutBufferCount = 0 End If
If R(i%) = 2 Then Call DSOutBit(False) By(i%) = 0 mscDev.InBufferCount = 0 ' чистим входной буфер Do ' чистим выходной буфер Loop Until mscDev.OutBufferCount = 0 End If
If R(i%) = 3 Then MsgBox "Отвалилась!" Exit For End If Next i%
For i% = 0 To 63 Debug.Print By(i%); Next i%
чистил я и входной и выходной буфер и до записи двух бит и после, оставлял чистку только входного буфера, оставлял чистку только выходного буфера - всё равно результат один и тот же - первый раз функция DSInTwoBit возвращает 1 - подтверждаю 1, втророй раз опять единицу, опять подтверждаю - третий раз возвращает твёрдую "3" - ну тут приехали...
Кстати таблетка жива и здорова - другие программы ищут её по F0h на 5 с плюсом - быстренько так обнаруживают, аж зло берёт!
P.S. уже бьюсь головой о стену... ещё немножко и пробью дыру к соседям!
Не пользуй функцию DSoutBit. Напиши другую функцию которая посылает один бит и давит эхо. Примерно так как я сделал из DSInByte поменяв 7 на 1 в циклах, только здесь надо чтобы тело цикла выполнялось только 1 раз. Например так: (я тупо выбросил цикл и 7 поменял на 0)
Код:
Private Sub DSendBit(DSBit As Boolean) 'подпрограмма вывода бита If DSBit Then mscDev.Output = Chr$(&HFF) 'передаем 1 Else mscDev.Output = Chr$(&H0) 'передаем 0 End If Do 'ждем когда выходной буфер очистится Loop Until mscDev.OutBufferCount = 0 TMInTime# = Now + TimeSerial(0, 0, 1) / 18 ' 1/18 секунды на ответ Do 'ждем когда придет все эхо, с учетом тайм-аута Loop Until (mscDev.InBufferCount > 0) Or (TMInTime# < Now) mscDev.InBufferCount = 0 'обнуляем эхо в приемном буфере End Sub
Замени в предыдущем примере DSOutBit на DSendBit - imho должно заработать.
Не пользуй функцию DSoutBit. Напиши другую функцию которая посылает один бит и давит эхо. Примерно так как я сделал из DSInByte поменяв 7 на 1 в циклах, только здесь надо чтобы тело цикла выполнялось только 1 раз. Например так: (я тупо выбросил цикл и 7 поменял на 0) Замени в предыдущем примере DSOutBit на DSendBit - imho должно заработать.
Дорогой uldemir!!! Я не знаю, что ты такое сделал - НО ВСЁ ЗАРАБОТАЛООООООО!!!!!!!!!!!!!!!! УРААААААААААА!!!!!!!!!!!! Ты маг и волшебник!!!!!!!!!!! С этой минуты я нарекаю тебя МАСТЕРОМ-СЕНСЕЕМ по Visual Basic 6.0!!! Спасибо тебе огромное!!! За тебя дружище!!!
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения