Народ! Срочно нужна помощь. Пробую работать с датчиком DS1621. В программе вроде всё как надо, по даташиту. Сделал модель в протеусе, так она не работает. Считывает правильно температуру только один раз! Посмотрите пожалуйста, где мой косяк. Не чего придумать уже не могу. ХЕЛП!!!! [BR]http://zalil.ru/30812192<\/u><\/a>
Пост N: 39
Зарегистрирован: 10.02.11
Откуда: Россия
Рейтинг:
0
Отправлено: 06.04.11 22:07. Заголовок: Во первых, у Вас в п..
Во первых, у Вас в протеусе 876А , а программа под 877А. Это так надо ? Во вторых, что значит 1 раз считывает ? Где Вы это видите/наблюдаете ? У Вас, я вижу, программа зациклина (goto $). Каким образом она должна что-то делать много раз ? Вопрос не понятен, если честно....
Отправлено: 06.04.11 22:16. Заголовок: Alex пишет: Во перв..
Alex пишет:
цитата:
Во первых, у Вас в протеусе 876А , а программа под 877А. Это так надо ? Во вторых, что значит 1 раз считывает ? Где Вы это видите/наблюдаете ? У Вас, я вижу, программа зациклина (goto $). Каким образом она должна что-то делать много раз ? Вопрос не понятен, если честно....
Ой! Поменял на 877... Смысл остался тот же.
Программа задаёт команду StartConvert T, потом пауза, потом 5 раз считывает температуру из датчика и только потом зацикливается. Откройте терминал I2C (правой кнопкой). Первое считывание температуры верное, остальные нет.
Отправлено: 06.04.11 23:18. Заголовок: Alex пишет: Пролист..
Alex пишет:
цитата:
Пролистал Даташит, посомтрел на диаграмму чтения. В ней видно что адрес устройства посылается 2 раза, перед командой чтения температур и перед самим чтением 2-х байт температуры. Эти команды, думаю, должны быть одинаковые. У Вас в одном случае 90, в другом - 91.
Наверно что то не то посмотрели. Вот:
Alex пишет:
цитата:
Второе. Попробуйте после чтения послать команду преобразования, подождать и прочитать температуру заного, и так несколько раз. Т.е. не постоянно "тарабанить" чтение.
цитата: Второе. Попробуйте после чтения послать команду преобразования, подождать и прочитать температуру заного, и так несколько раз. Т.е. не постоянно "тарабанить" чтение.
Пост N: 3
Зарегистрирован: 31.03.11
Откуда: Россия, Москва
Рейтинг:
0
Отправлено: 07.04.11 07:25. Заголовок: Работать с отрицател..
Работать с отрицательными числами нужно в зависимости от целей. Например нужно вывести на индикацию в десятичной форме. Тогда сначала нужно найти модуль и знак. Знак - это старший разряд. А модуль находится как инверсия числа по условию знака. (Если знак минус, то инвертировать). Инверсия в ПИКах - это либо COMF+INCF либо NEGF. При преобразовании в десятичную форму необходимо сначала определиться с множителем. Пример. Нужно вывести с точностью 2 двоичных разряда после точки (0,25 десятичных). Тогда (просто пример) число 10,25 при выводе суть будет 1025 и запятая в середине. 10,25 в двоичном представлении будет 1010.01 Игнорируя двоичную точку, получаем код 101001=41 Вычисляем множитель: 1025/41=25 Несложно догадаться, что для одного двоичного разряда после точки множителем будет 5, а для трех - 125, четырех - 625 и далее аналогично. Теперь если любое округленное до 2 разрядов после точки двоичное число без учета точки домножить на 25 и преобразовать в двоично-десятичную форму, то получится готовое для вывода десятичное число равное исходной двоичной дроби (при этом нужно зажечь запятую перед двумя десятичными разрядами). Когда делается округление исходной двоичной дроби до потребного числа разрядов, то последий отброшенный разряд даст условие инкремента сохраненного числа. Единица в старшем отброшенном разряде потребует инкремента сохраненной части без учета точки (запятой).
Отправлено: 07.04.11 10:11. Заголовок: Alex пишет: Как это..
Alex пишет:
цитата:
Как это так ? 11111111 10000000, после инверсии будет 00000000 01111111, и инкремент (+1) - 00000000 10000000 = 0.5
А понял. Я думал второй байт не трогаем, который указывает на дробную часть.
Получается всё просто, делаем сдвиг влево 2-х байтов. Если в C 0, то температура положительная, можно выводить. Если в С 1, то температура отрицательная, тогда инверсия и инкремент, потом вывод.
Отправлено: 07.04.11 10:21. Заголовок: Alex пишет: Зачем ?..
Alex пишет:
цитата:
Зачем ? Можно просто проверить старший бит.
А посмотрите как работает моя ПП преобразования/вывода числа из поста 357. Ей всё равно сдвиг нужен. Пускай что бы вывести число 25,0 ей нужно входящее число 50. если 25,5 то 51.
Скопируй хоть так "http://ru.wikipedia.org/wiki/Дополнительный_код_(представление_числа)"
Интересная статья.
Спасибо всем, разобрался.
Попробую теперь переделать программу датчика в режим "1 Shot". Замысел такой, программа опроса датчика вызывается циклично через некоторое время (пускай каждые 50мс) из прерывания. ПП датчика считывает флаг Done, если конвертирование завершено, считать новую температуру и снова старт конвертирование температуры. Если нет, то просто выход.
Пост N: 45
Зарегистрирован: 10.02.11
Откуда: Россия
Рейтинг:
0
Отправлено: 07.04.11 13:53. Заголовок: VadimKHL, если собир..
VadimKHL, если собираетесь работать с датчиком и из ОП прерывания и из основного цикла, учтите, что могут возникнуть конфликты, и данные будут записаны/прочитаны не правильно. Я бы не советовал так делать. Правильнее будет выставлять в ОП програмный флаг, а в основном цикле его проверять и сбрасывать. Возможно, я не правильно Вас понял. Тогда извеняюсь.
Отправлено: 07.04.11 14:10. Заголовок: Alex пишет: VadimKH..
Alex пишет:
цитата:
VadimKHL, если собираетесь работать с датчиком и из ОП прерывания и из основного цикла, учтите, что могут возникнуть конфликты, и данные будут записаны/прочитаны не правильно. Я бы не советовал так делать. Правильнее будет выставлять в ОП програмный флаг, а в основном цикле его проверять и сбрасывать. Возможно, я не правильно Вас понял. Тогда извеняюсь.
В моем случае лучше делать из прерывания. Т.к. основная масса программы связана с прерываниями, пульт, энкодер, клавиатура и т.д. А основной цикл программы очень маленький, там просто ПП АЦП по циклу. Так что получается основа моей программы это прерывания. Туда и датчик завожу. Конфликтов не может быть просто так из за прерывания. Эти конфликты возникают при неправильной построенной структуры самой ПП. Это всё учтено.
P.S.: А что же делать с кривой моделью DS1621 в протеусе? Может есть у кого рабочая или решение этой проблемы?
Если модель кривая, то можно отладить на другой модели с аналогичным интерфейсом... с минимумом переделок... я отлаживал работу с TDA7313 вообще на микросхеме памяти, подменив только адрес, определив его просто как #define Adress 0xXX...
Отправлено: 19.04.11 10:29. Заголовок: В железе всё работае..
В железе всё работает как часы. Модель 100% кривая в Протеусе. Не наткнитесь на неё. А то я целый день голову ломал почему криво работает в протеусе, а оказалось всё работает.
Все даты в формате GMT
3 час. Хитов сегодня: 13
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет