BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

Re: BASCOM AVR в вопросах и ответах

Сообщение WildCat »

edm2007 писал(а):WildCat, поменяйте Time Slot на 30u. Проблем быть не должно, я уже давно так делаю. Если все тайминги по порядку то 30 - 120 - 480 - 30 - 750 - 10.

И еще, откуда Вы берете вот такое:

Код: Выделить всё

Shift B0 , Left , 5
Shift B1 , Left , 3
Почему именно так? Там же просто все, нулевой байт угоняется на 4 бита ВПРАВО (чтобы убрать десятые и оставить только целые), а первый байт угоняется на 4 бита ВЛЕВО. А у Вас как?

Нижайше кланяюсь - тайм слот сменил и все заработало шоколадно!
Пример со сдвигом на 5 и 3 увидел где то раньше в теме и скопировал просто. Но до его проверки все равно не дошло, застрял на уровне байтов :)

Пример не открылся, у меня устаревший протеус :( А код баском глянул - ну ведь одно и то же вроде?

А кто нибудь может рассказать, как брать температуру с повышенной точностью? Т.е. все 12 бит, и округлять до десятых например?
Реклама
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение Igor_67 »

Да, насчет сдвига вправо - влево, edm2007 прав, только сдвигать надо на 4 бита туда и сюда. А вот для чего сделано 5 и 3 бита, я объясню! Дело в том, что по умолчанию тайминг для DS18B20 в Протеусе выставлен на 120us, а с таким значением правильно показывает температуру, только если сдвинуть биты неправильно! Если же все сделать правильно, симуляция в Протеусе будет врать по температуре в 2 раза (в большую сторону). Я сам так раньше поступал, пока товарищ Михаил (edm2007) не рассказал мне про тайминги в Протеусе. :) Теперь с этим проблем нет. А вообще - то, если не требуется проверять совпадение установленной заранее и измеренной температур, то показания в Протеусе, ваще по барабану! Меряет - гуд, отображается, тоже гуд! В реальном железе то будет работать 100%! :) 8)
Цапу крутить надо!!! Ку или не ку?
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

WildCat писал(а):Пример со сдвигом на 5 и 3 увидел где то раньше в теме и скопировал просто.
Такой сдвиг не будет работать в этом коде, да оно и не удивительно. Зачем что-то придумывать если все и так логично и понятно. :)
WildCat писал(а):Пример не открылся, у меня устаревший протеус
Proteus Professional 7.7 SP2.rar
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Igor_67, ну с неправильным сдвигом я понял, но мы же хотим чтобы устройство нормально работало, так что лучше будем писать правильно а в протеусе тайм слот изменим и все. :))
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

Re: BASCOM AVR в вопросах и ответах

Сообщение WildCat »

О, спасибо огромное за сцылку!
Сейчас поставлю.
Так кто нибудь работал с 12битной точностью и считал доли градусов?
Реклама
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

WildCat писал(а): кто нибудь может рассказать, как брать температуру с повышенной точностью? Т.е. все 12 бит, и округлять до десятых например?
Что именно Вы хотите, я не совсем понял... :dont_know: Мы сейчас забираем целую часть, а Вы хотите учитывать десятые и если 25,6 например то выводить 27? Или Вам надо с десятыми выводить? Да это проще простого.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Реклама
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение Igor_67 »

Да там все просто. Просто переменную Т надо взять типа Single. Вернись на страницу назад, я выкладывал код для PCF8583 и термометра DS18B20. Там так и сделано.
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

Re: BASCOM AVR в вопросах и ответах

Сообщение WildCat »

Я хочу выводить именно с десятыми :) Обьявил функцию как Single и возвращаю через нее значение температуры. В нулевом байте видно что последние биты меняются. Как заставить теперь переменную учитывать их и преобразовывать до десятых?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение Igor_67 »

Да она (переменная) так и выводится - с десятыми! В протеусе сделай симуляцию с LCD, сам увидишь! :write:
И зачемтам было объявлять функцию? Достаточно переменной.

Код: Выделить всё

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
Цапу крутить надо!!! Ку или не ку?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Игорь, Вы предлагаете в одну переменную все сливать без сдвига? А выводить потом как? Куда проще все так и оставить, просто переменную еще одну взять и в нее забирать десятые. Будет что-то типа:

Код: Выделить всё

Lcd Sign ; T ; "," ; Des ; Chr(0) ; "C"                                 ' выводим значение на индикацию   
Там в коде только одну строчку дописать... Или это Вы тоже зарезали переменную после запятой? :) Я просто привык десятые отдельно сливать потому как чаще всего термометр на LED индикаторе...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: BASCOM AVR в вопросах и ответах

Сообщение Мурик »

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.
Отображается как положительная температура, так и отрицательная.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

WildCat, вот этот же код, допиленный до десятых. Возможно здесь это и избыточно, но очень хорошо понятно как забрать эти десятые. Это очень поможет при создании термометра на семисегментном индикаторе.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Re: BASCOM AVR в вопросах и ответах

Сообщение kip96 »

А у меня такой код работает:

Код: Выделить всё

I1 = I1 * 10
   I1 = I1 \ 16
   Ss = Str(i1)
  Ss = Format(ss , " 0.0")
  Return

где
Dim I1 As Integer
и
I1 = 1wread(2)
Иногда вместо

Код: Выделить всё

Waitms 750                                               ' Ждем окончания преобразования
удобно использовать
Bitwait PinX , Set
при одном датчике, конечно.
Время существенно сокращается.
И как насчёт:
kip96 писал(а):И вопросы:Как стабильность,(чуствительность к расположению кварца), у меня есть платка с такими часиками, так кварц стоит как обычный кондёр.В протеусе файла нет?И вообщем:В чём отличие (преимущество) между Declare Sub и просто Gosub???
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

Re: BASCOM AVR в вопросах и ответах

Сообщение 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
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: BASCOM AVR в вопросах и ответах

Сообщение Мурик »

WildCat писал(а):А никто не знает, как справиться с проблемами округления?
Выше я выкладывал пример, вот строка округления из него.

Код: Выделить всё

Fusing(lcd_out , "#.#")
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

Re: BASCOM AVR в вопросах и ответах

Сообщение WildCat »

Не, мне надо получить числовое значение, чтобы потом сравнивать точные числа. Нерационально ведь преобразовывать в форматированную строку, а ее обратно в число :)
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

WildCat писал(а):Не, мне надо получить числовое значение, чтобы потом сравнивать точные числа.
Ну накидали Вам целую кучу вариантов, каждый из которых имеет право на жизнь. Пора бы озвучить задание. :)) Я показал как в ОТДЕЛЬНУЮ переменную забрать по маске из младшего байта температуры 4 младших бита (в которых содержатся десятые). Для отображения этого вполне достаточно. Потому мне не совсем понятно, что Вы пытаетесь сделать дальше:

Код: Выделить всё

T = Des / 10
.................
T = T + B0
T = T + B1
Readtemp = Readtemp * T


Вам переменная нужна, которую Вы будете сравнивать с порогом, и которая должна содержать значение с десятыми?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
WildCat
Собутыльник Сэра Мурра
Сообщения: 2918
Зарегистрирован: Вт янв 10, 2006 00:26:45
Откуда: Челябинск

Re: BASCOM AVR в вопросах и ответах

Сообщение WildCat »

Совершенно верно, это будет термостат с точностью до 0.1 градуса. Нужно получать температуру с десятыми долями в одну переменную типа Single.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: BASCOM AVR в вопросах и ответах

Сообщение Мурик »

WildCat писал(а):Совершенно верно, это будет термостат с точностью до 0.1 градуса.
Хм, выше давал ссылку на похожую конструкцию. http://bascom.at.ua/publ/termometr_term ... 1/1-1-0-46
Термостат поддерживает температуру с точностью 0.1 °C.
Почему бы не сделать как там.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Igor_67 писал(а):Да она (переменная) так и выводится - с десятыми! В протеусе сделай симуляцию с LCD, сам увидишь!
Игорь, Ваша переменная забирает только целые, Вы ведь сначала убрали 4 бита десятых сдвигом , и только потом забрали значение. В результате десятые будут затерты. Вы десятые убили сдвигом T = Byte0 / 16. Оно конечно выводит с запятой, но только 15,0 - 16,0 - 17,0... Или у Вас там какой-то секрет ? :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ответить

Вернуться в «AVR»