Зарегистрирован: Вт мар 18, 2008 08:25:31 Сообщений: 108 Откуда: Красноярск
Рейтинг сообщения:0
Здравствуйте Все.
Надоело пользоваться сторонними драйверами для работы с 1-wire девайсами. Написал собственные и уперся в проблемку. Мозг порвал на пересчете температуры по формуле из даташа на DS1820. Ни чего не получается. Может кто делал такую обработку САМ на Си под WinAVR (хотя адаптировать не проблема) и может поделиться? Главное только не астму... Мозг не выдержит
_________________ Как зачем мне голова?! Я ей ем!!!
Зарегистрирован: Вт мар 18, 2008 08:25:31 Сообщений: 108 Откуда: Красноярск
Рейтинг сообщения:0
А вот у меня мозг не переваривает. t = temper - 0.25 + ([7]-[6])/[7]
Причем temper = [1]+([0]+1) Методом научного тыканья в небо получилось, что значение [0] надо потом на 16 делить (а написано на 2). Считает до положительную температуру более или менее нормально, а с отрицательными значениями лажа полная. Где то косяк...
_________________ Как зачем мне голова?! Я ей ем!!!
я так понимаю, [7] - это вы так обозначили 7-й принятый байт буффера? так вот, во-первых, [7] = 16 всегда, во-вторых, temper (в ваших обозначениях) нужно округлить до целых, отбросив младший бит.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зарегистрирован: Вт мар 18, 2008 08:25:31 Сообщений: 108 Откуда: Красноярск
Рейтинг сообщения:0
Давайте так:
SCARTCHPAD[0..7]+1(CRC)
[0]- показания температуры 0xFA-0-0x92 (+0-)
[1]- преамбула знак температуры
..
..
..
[6]- REMINE
[7]- PER
[8]-CRC
Как будет формула выглядеть? Если есть - дай глянуть.
_________________ Как зачем мне голова?! Я ей ем!!!
И хочу заметить, дело не так плохо как кажется. Все драйвера для работы с переферией написаны вручную и работают на 5. Ну не выехал. Бывает. Ну коробит меня от кодвижн. Не могу пользовать его библиотеки по некоторым причинам, в следствии чего делаю сам.
_________________ Как зачем мне голова?! Я ей ем!!!
я ничего не имею против самостоятельности, сам не пользую кодвижные либы, сам пишу. но то, что вы творите - это меня удивляет... вроде я вам написал формулу правильную, вы float-ы поприлепили... ничего не понимаю...
Код:
unsigned char SCRATCHPAD[8]; float temp; int *t; read_scratchpad(SCRATCHPAD); // считываем регистры термометра // и вычисляем температуру t = (int*)SCRATCHPAD; temp = (*t >> 1) - 0.25 + (SCRATCHPAD[7]-SCRATCHPAD[6])/SCRATCHPAD[7];
я извиняюсь, конечно - раньше поторопился с советом... надо через указатель первых 2 байта обрабатывать...
по-моему, никакой свистопляски! никаких иных манипуляций...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
у меня на сях реализовано так(наверное коряво, но работает!):
перед всем этим в переменную t записываем данные с датчика. minus индикатор знака (0=+,1=-)
//ув модераторы-ничего не понимаю-вставляю в свое сообщение кусок кода(см файл), а само сообщение после добавления вместо этого кода содержит какуюто кашу, на него не похожую...
Зарегистрирован: Вт мар 18, 2008 08:25:31 Сообщений: 108 Откуда: Красноярск
Рейтинг сообщения:0
Подвела математика… Привык, что при делении в 50 % случаев получаются значения с запятой. Теперь догнал и усвоил. Вроде работает. Код(т) работает СПАСИБО за помощь.
_________________ Как зачем мне голова?! Я ей ем!!!
Зарегистрирован: Вт мар 18, 2008 08:25:31 Сообщений: 108 Откуда: Красноярск
Рейтинг сообщения:0
Еще вопросик. Маленький такой. Как определить устройство DS1820(18B20) или DS19S20? У них классификатор одинаковый ведь 10h, а работают маленько по разному.
_________________ Как зачем мне голова?! Я ей ем!!!
Зарегистрирован: Вт мар 18, 2008 08:25:31 Сообщений: 108 Откуда: Красноярск
Рейтинг сообщения:0
РадиоЛоматель писал(а):
у меня на сях реализовано так(наверное коряво, но работает!): перед всем этим в переменную t записываем данные с датчика. minus индикатор знака (0=+,1=-)
Так я делал, но меня интересовала сама формула из даташа.
Можно и так
Код:
int zhak = 1, temperature = 0x0000; int TempL, TempH;
if (SCRATCHPAD[1]!=0x00){ SCRATCHPAD[0]=0xFF-(SCRATCHPAD[0]-0x01); znak = (-1); }
Еще вопросик. Маленький такой. Как определить устройство DS1820(18B20) или DS19S20? У них классификатор одинаковый ведь 10h, а работают маленько по разному.
отличить можно довольно легко: если внимательно прочитать даташит, то можно заметить, что SCRATCHPAD[4] у DS1820 всегда считывается как 0xFF (это зарезервированный байт), а у DS18B20 - это конфигурационный регистр, в котором старший бит всегда 0.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зарегистрирован: Вт мар 18, 2008 08:25:31 Сообщений: 108 Откуда: Красноярск
Рейтинг сообщения:0
А вот кто скажет что на самих датчиках лазером написано? Что название (модель) понятно, а что дальше? На считанный адрес устройства не похоже. Может кто знает? Просто интересно.
_________________ Как зачем мне голова?! Я ей ем!!!
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения