Страница 83 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 11:51:36
WildCat
edm2007 писал(а):WildCat, поменяйте Time Slot на 30u. Проблем быть не должно, я уже давно так делаю. Если все тайминги по порядку то 30 - 120 - 480 - 30 - 750 - 10.
И еще, откуда Вы берете вот такое:
Почему именно так? Там же просто все, нулевой байт угоняется на 4 бита ВПРАВО (чтобы убрать десятые и оставить только целые), а первый байт угоняется на 4 бита ВЛЕВО. А у Вас как?
Нижайше кланяюсь - тайм слот сменил и все заработало шоколадно!
Пример со сдвигом на 5 и 3 увидел где то раньше в теме и скопировал просто. Но до его проверки все равно не дошло, застрял на уровне байтов
Пример не открылся, у меня устаревший протеус

А код баском глянул - ну ведь одно и то же вроде?
А кто нибудь может рассказать, как брать температуру с повышенной точностью? Т.е. все 12 бит, и округлять до десятых например?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 11:58:41
Igor_67
Да, насчет сдвига вправо - влево,
edm2007 прав, только сдвигать надо на 4 бита туда и сюда. А вот для чего сделано 5 и 3 бита, я объясню! Дело в том, что по умолчанию тайминг для DS18B20 в Протеусе выставлен на 120us, а с таким значением правильно показывает температуру, только если сдвинуть биты неправильно! Если же все сделать правильно, симуляция в Протеусе будет врать по температуре в 2 раза (в большую сторону). Я сам так раньше поступал, пока товарищ Михаил (
edm2007) не рассказал мне про тайминги в Протеусе.

Теперь с этим проблем нет. А вообще - то, если не требуется проверять совпадение установленной заранее и измеренной температур, то показания в Протеусе, ваще по барабану! Меряет - гуд, отображается, тоже гуд! В реальном железе то будет работать 100%!

Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 11:59:28
edm2007
WildCat писал(а):Пример со сдвигом на 5 и 3 увидел где то раньше в теме и скопировал просто.
Такой сдвиг не будет работать в этом коде, да оно и не удивительно. Зачем что-то придумывать если все и так логично и понятно.
WildCat писал(а):Пример не открылся, у меня устаревший протеус
Proteus Professional 7.7 SP2.rar
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:02:14
edm2007
Igor_67, ну с неправильным сдвигом я понял, но мы же хотим чтобы устройство нормально работало, так что лучше будем писать правильно а в протеусе тайм слот изменим и все.

Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:04:20
WildCat
О, спасибо огромное за сцылку!
Сейчас поставлю.
Так кто нибудь работал с 12битной точностью и считал доли градусов?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:05:01
edm2007
WildCat писал(а): кто нибудь может рассказать, как брать температуру с повышенной точностью? Т.е. все 12 бит, и округлять до десятых например?
Что именно Вы хотите, я не совсем понял...

Мы сейчас забираем целую часть, а Вы хотите учитывать десятые и если 25,6 например то выводить 27? Или Вам надо с десятыми выводить? Да это проще простого.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:07:19
Igor_67
Да там все просто. Просто переменную Т надо взять типа Single. Вернись на страницу назад, я выкладывал код для PCF8583 и термометра DS18B20. Там так и сделано.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:13:13
WildCat
Я хочу выводить именно с десятыми

Обьявил функцию как Single и возвращаю через нее значение температуры. В нулевом байте видно что последние биты меняются. Как заставить теперь переменную учитывать их и преобразовывать до десятых?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:16:02
Igor_67
Да она (переменная) так и выводится - с десятыми! В протеусе сделай симуляцию с LCD, сам увидишь!

И зачемтам было объявлять функцию? Достаточно переменной.
Код: Выделить всё
Dim T As Single , T2 As Single
Dim Byte0 As Byte , Byte1 As Byte
Dim Flag As Bit
...
...
...
Do
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread() ' Читаем первый байт
If Byte1 >= 248 Then ' Проверяем на отрицательную температуру.
Byte0 = &HFF - Byte0 ' 248 в десятичном - 11111000 в двоичном.
Byte1 = &HFF - Byte1 ' Если температура отрицательная - вычитаем из &HFF
Znak = "-"
Else
Znak = "+"
End If
T = Byte0 / 16
T2 = Byte1 * 16
T = T + T2
Call Gettime()
Cls
Locate 1 , 1
Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) ; " " ; Znak ; T ; Chr(0) ; "C"
Waitms 250
Loop
End
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:36:45
edm2007
Игорь, Вы предлагаете в одну переменную все сливать без сдвига? А выводить потом как? Куда проще все так и оставить, просто переменную еще одну взять и в нее забирать десятые. Будет что-то типа:
Код: Выделить всё
Lcd Sign ; T ; "," ; Des ; Chr(0) ; "C" ' выводим значение на индикацию
Там в коде только одну строчку дописать... Или это Вы тоже зарезали переменную после запятой?

Я просто привык десятые отдельно сливать потому как чаще всего термометр на LED индикаторе...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:48:40
Мурик
WildCat писал(а):
Так кто нибудь работал с 12битной точностью и считал доли градусов?
Вот пример
http://bascom.at.ua/publ/termometr_term ... 1/1-1-0-46
Там отображаются данные на индикаторе с точностью до десятых долей градуса.
Вывод данных на индикатор
Код: Выделить всё
' Отображение данных на индикаторе.
Sub Thermo_lcd(thermo As Integer)
Local Lcd_out As Single
Cls
Lcd_out = Thermo / 16
Lcd "Thermo: " ; Fusing(lcd_out , "#.#") ; Chr(1) ; "C"
End Sub
В переменной thermo, 2 байта температуры, прочитанные из датчика DS18B20.
Отображается как положительная температура, так и отрицательная.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 12:51:03
edm2007
WildCat, вот этот же код, допиленный до десятых. Возможно здесь это и избыточно, но очень хорошо понятно как забрать эти десятые. Это очень поможет при создании термометра на семисегментном индикаторе.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 19:05:02
kip96
А у меня такой код работает:
Код: Выделить всё
I1 = I1 * 10
I1 = I1 \ 16
Ss = Str(i1)
Ss = Format(ss , " 0.0")
Return
где
Dim I1 As Integer
и
I1 = 1wread(2)
Иногда вместо
удобно использовать
Bitwait PinX , Set
при одном датчике, конечно.
Время существенно сокращается.
И как насчёт:
kip96 писал(а):И вопросы:Как стабильность,(чуствительность к расположению кварца), у меня есть платка с такими часиками, так кварц стоит как обычный кондёр.В протеусе файла нет?И вообщем:В чём отличие (преимущество) между Declare Sub и просто Gosub???
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 21:23:40
WildCat
А никто не знает, как справиться с проблемами округления? Десятичные доли считываются нормально, но когда суммируются с целыми, получается иррациональная дробь. Например при температуре 1.2 десятичная выводится 2, но в целом температура выводится 1.199999925
Код: Выделить всё
If B1 >= 248 Then
B0 = &HFF - B0
B1 = &HFF - B1
Readtemp = -1
Else
Readtemp = 1
End If
Des = B0 And &B00001111 ' получаем дробную часть температуры
Des = Des * 10 ' расчитываем дробную часть
Des = Des / 16
Shift B0 , Right , 4
Shift B1 , Left , 4
T = Des / 10
Cls
Lcd "des " ; Des
Wait 1
T = T + B0
T = T + B1
Readtemp = Readtemp * T
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 21:35:50
Мурик
WildCat писал(а):А никто не знает, как справиться с проблемами округления?
Выше я выкладывал пример, вот строка округления из него.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб май 14, 2011 21:38:49
WildCat
Не, мне надо получить числовое значение, чтобы потом сравнивать точные числа. Нерационально ведь преобразовывать в форматированную строку, а ее обратно в число

Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 15, 2011 13:01:07
edm2007
WildCat писал(а):Не, мне надо получить числовое значение, чтобы потом сравнивать точные числа.
Ну накидали Вам целую кучу вариантов, каждый из которых имеет право на жизнь. Пора бы озвучить задание.

Я показал как в ОТДЕЛЬНУЮ переменную забрать по маске из младшего байта температуры 4 младших бита (в которых содержатся десятые). Для отображения этого вполне достаточно. Потому мне не совсем понятно, что Вы пытаетесь сделать дальше:
Код: Выделить всё
T = Des / 10
.................
T = T + B0
T = T + B1
Readtemp = Readtemp * T
Вам переменная нужна, которую Вы будете сравнивать с порогом, и которая должна содержать значение с десятыми?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 15, 2011 13:09:04
WildCat
Совершенно верно, это будет термостат с точностью до 0.1 градуса. Нужно получать температуру с десятыми долями в одну переменную типа Single.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 15, 2011 13:19:38
Мурик
WildCat писал(а):Совершенно верно, это будет термостат с точностью до 0.1 градуса.
Хм, выше давал ссылку на похожую конструкцию.
http://bascom.at.ua/publ/termometr_term ... 1/1-1-0-46
Термостат поддерживает температуру с точностью 0.1 °C.
Почему бы не сделать как там.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Вс май 15, 2011 14:10:24
edm2007
Igor_67 писал(а):Да она (переменная) так и выводится - с десятыми! В протеусе сделай симуляцию с LCD, сам увидишь!
Игорь, Ваша переменная забирает только целые, Вы ведь сначала убрали 4 бита десятых сдвигом , и только потом забрали значение. В результате десятые будут затерты. Вы десятые убили сдвигом T = Byte0 / 16. Оно конечно выводит с запятой, но только 15,0 - 16,0 - 17,0... Или у Вас там какой-то секрет ?
