Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Помогите с 1wire

Сообщений 1 страница 17 из 17

1

Доброго времени суток!
Я от только попал на вас сайт, поэтому прошу не судить строго, если что-то не в ту степь пишу.
Прошу помощи разобрать код. Решил я поработать с извесным всем датчиком ds18b20, я когда-то собирал на нем термометр, но брал готовое ришение, а сейчас хочу сам его освоить. чтоб долго не говорить, вот мой код:

$regfile = "attiny2313.dat"    'соответственно работаю с аttiny2313
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0      'конфигурирую дисплей
Config Lcd = 16 * 2
Config 1wire = Portb.7      'на эту ногу сажу DQ микросхемы
$hwstack = 40     'настройки стека и фрейма, кстати также интересует нужны ли они здесь
$swstack = 16
$framesize = 32
$sim

Initlcd
Cursor Off

Dim B0 As Byte          'задаю переменные
Dim B1 As Byte
Dim T As Byte
Dim T1 As Byte
Dim Z As Byte
Do                                'и так поехали руководясь даташитом
1wreset                    'делаю сброс шины 1wire
1wwrite &HCC           'обращаюсь к нашему датчику
1wwrite &H44            'начинаем измерять т-ру
Waitms 750               'ждем пока он меряет

1wreset                  'снова сброс
1wwrite &HCC         'снова обращение
1wwrite &HBE          'считывае с его памьяти

B0 = 1wread()         'считываю нулевой байт в переменную В0
B1 = 1wread()         'считываю первый байт в переменную B1
'а вот далее пошла математика, которую я не очень понимаю... это сделано по аналогии тех исходников которые я видел
If B1 > 248 Then     'проверка значение первого байта на отрицательную т-ру
B0 = &HFF - B0       'не очень понятное для меня вычисление (но все так делают=)
B1 = &HFF - B1
Z = 2
Else
Z = 1
End If

T = B0 / 16        'сдвигаем В0 байт вправо на 4-и бита
T1 = B1 * 16      'сдвигаем В1 байт влево на 4-и бита
T = T + T1

If Z = 2 Then
T = T + 1
End If
If Z = 1 And T = 0 Then
Z = 0
End If
'дальше все понятно=)
Cls
Lcd "t= "
If Z = 0 Then
Lcd " " ; T ; "'C"
End If
If Z = 1 Then
Lcd "+" ; T ; "'C"
End If
If Z = 2 Then
Lcd "-" ; T ; "'C"
End If
Loop
End

помогите разобрать саму математику, а то народ постоянно "недорасказывает" что там происходит.
ах да, и забыл. Где еще могут быть проблемы... проверяю в протеусе(7.10), баском(2.0.5.0). И фьюзам ничего не делал, так-как не понимаю еще их, а более того как их использовать в протеусе.
Спасибо за внимание.

0

2

Attiny2313. Поумолчанию работает на частоте 4 мегагерца а не  8 мегагерц и убири строку $sim иначе работать небудет. Строка $sim для предназначена для баскомного симулятора . Если незаработает будем разбиратса с матиматекой

0

3

Спасибо, но не помогло, выдает так как и раньше t=-1'C. То есть, строка T = T + 1 делает еденицу, если поставить вместо 1 другое число, то будет отображатся оно... и делает знак минус, значит Z=2. И у сообщении протеуса выдает "logic contention detected on net #00014".

0

4

Исходник

$regfile = "attiny2313.dat"       'соответственно работаю с аttiny2313
  $crystal = 8000000
  $hwstack = 40     'настройки стека и фрейма, кстати также интересует нужны ли они здесь
  $swstack = 16
  $framesize = 32
  $baud = 19200     '4800     '9600     '19200     '38400      '230400

'--------------  Настраиваем шину 1Ware для работы с Ds18b20  ------------------

  Config 1wire = Portb.7       'на эту ногу сажу DQ микросхемы

'-------------  Используемые переменные для работы с Ds18b20  ------------------

  Dim Temp As Integer       ' Температура * 16 в HEX формате
  Dim Температура As Single       ' Готовое значение температуры в цифровом виде
  Dim Готовая_температура_str As String * 10       ' Готовое значение температуры в символьном виде
  Dim Ответ_датчика_ds18b20(9) As Byte At Temp Overlay       ' Массив полученных данных от DS18B20

'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л

'===============================================================================
  Do

    Gosub Запуск_измерения

    Waitms 750      ' Ждём, пока померяется

    Gosub Опрос_ds18b20

    Print Готовая_температура_str

  Loop
End
'===============================================================================

'                        П О Д П Р О Г Р А М М Ы

'===============================================================================

'===============================================================================
  Запуск_измерения:
'-------------------------------------------------------------------------------
    1wreset         ' Занимаем шину 1Ware
    1wwrite &HCC    ' Обращение ко всем датчикам
    1wwrite &H44    ' Запуск измерения всех датчиков
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Опрос_ds18b20:
'-------------------------------------------------------------------------------

    1wreset         ' Занимаем шину 1Ware
    1wwrite &HCC    ' Адресное обращение к Ds18b20
    1wwrite &HBE    ' Команда чтения ОЗУ датчика

    Ответ_датчика_ds18b20(1) = 1wread(9)       ' Принимаем 8 байт данных + 1 байт контрольной суммы

    If Err = 0 Then ' Если получили ответ датчика

        If Ответ_датчика_ds18b20(9) = Crc8(ответ_датчика_ds18b20(1) , 8) Then       ' Проверяем контрольную сумму полученных данных

            Температура = Temp       ' Получаем сырые данные с Ds18b20
            Shift Температура , Right , 4       ' Получаем готовое значение температуры с знаком

          '  Готовая_температура_str = Str(температура)       ' Получаем символьное значение темепературы
            Готовая_температура_str = Fusing(температура , "+&.&&&&")       ' Форматируем данные

          Else

            Готовая_температура_str = "Ошибка CRC"       ' Печатаем ошибку контрольной суммы

        End If

      Else

        Готовая_температура_str = "Нет ответа"       ' Печатаем сообщение, что датчик не ответил

    End If

'-------------------------------------------------------------------------------
  Return
'===============================================================================

Симуляция (Proteus 7.10) + исходник (Bascom 2.0.7.1) - скачать

http://s6.uploads.ru/t/IeEgR.jpg

Отредактировано sasha_1973 (2014-01-18 06:36:35)

+1

5

Кстати, об этом:

sasha_1973 написал(а):

Waitms 750      ' Ждём, пока померяется

Может пригодится тем, кто использует не 12 бит значения и/или критично время ожидания готовности преобразования.

Как известно, чем ниже температура, тем немного быстрее происходит преобразование. Это раз.
Как известно, чем ниже требуемая разрядность значения, тем быстрее происходит преобразование. Это два.
Как известно, DS18B20 по окончании преобразования отдает единицу при чтении с него бита. Это три.
Как известно, BASCOM не имеет команду чтения бита с шины 1wire. Это уже четыре.

У меня в симуляторе не работает фокус с BITWAIT PINX.Y, SET. В железе не пробовал  :disappointed:

А делается это так: запускаем преобразование, а затем циклично читаем байт с датчика. По окончанию преобразования, при чтении байта, датчик начнет отдавать единицы в битах. Другими словами, как только прочитанный байт > 0, преобразование закончено.

Код:
Dim Ds_int As Integer
Dim N As Byte

1wreset Pinc , 0
1wwrite &HCC , 1 , Pinc , 0
1wwrite &H44 , 1 , Pinc , 0
Loop1:
N = 1wread(1 , Pinc , 0)
If N = 0 Then Goto Loop1
1wreset Pinc , 0
1wwrite &HCC , 1 , Pinc , 0
1wwrite &HBE , 1 , Pinc , 0
Ds_int = 1wread(2 , Pinc , 0)

0

6

SIvan написал(а):

запускаем преобразование, а затем циклично читаем байт с датчика

Мне кажется, что рациональность использования подобного метода под вопросом, ведь останавливается работа (кроме прерываний) программы на период ожидания ответа датчика.

Удобнее использовать заведённый на время замера таймер.

0

7

но если не хочется морочиться с прерываниями, метод имеет место.  Добавить флаги на преобразование и опрос. Гонять в общем цикле, после команды преобразования сбрасываем флаг преобр., устанавливаем флаг чтения . Далее читаем байт, если не 0, то читаем датчик, поднимаем флаг преобр, сбрасываем флаг чтения, если 0, то идем дальше (а не назад).

+1

8

Спасибо, sasha_1973, буду разбиратся. Ваша программа, конечно, работает по другому принципу, я разберусь. А от не могли бы Вы все-таки сказать что я не так написал? вот мой исходник + проект в протеусе. http://us.ua/1302690/

0

9

а по Вашей программе... растолкуйте, пожалуйста, некоторые строчки, собственно сами команды.

If Ответ_датчика_ds18b20(9) = Crc8(ответ_датчика_ds18b20(1) , 8) Then     
'Crs8( (),8) я не вкурсе, что это означает           

Shift Температура , Right , 4           
'эта строчка также не очень ясна       

Готовая_температура_str = Fusing(температура , "+&.&&&&")
'Fusing( , "+&.&&&&")   ну и здесь о формате я не догнал.

0

10

Avis_rara написал(а):

If Ответ_датчика_ds18b20(9) = Crc8(ответ_датчика_ds18b20(1) , 8) Then     
'Crs8( (),8) я не вкурсе, что это означает

Проверка контрольной суммы полученных данных с датчика. Датчик отдает 8 байт данных, и девятый байт (контрольная сумма предыдущих восьми).

Температура = Temp       ' Получаем сырые данные с Ds18b20, в переменную Temp собираются оверлеем 0 и 1 байт из 9 байт отправленных датчиком

Shift Температура , Right , 4       Делим на 16 и получаем готовое дробное значение температуры с знаком

Готовая_температура_str = Fusing(температура , "+&.&&&&")       Форматируем данные, как нам удобно, в данном случае без округления, т.е., что получили, то и вывели

Переделанный Ваш вариант - скачать

http://s6.uploads.ru/t/mczeN.jpg

Отредактировано sasha_1973 (2013-12-15 00:51:43)

0

11

Спасибо, заработало. Но я не понял что произошло, единствинная разница из моим кодом это сточка If Z = 2 Then T = T + 2 ; но я также пробывал и ничего не получалось... что не правильно то было, или я что-то в протеусе не так зделал.

0

12

И ели я Вашу програму ставлю у соем проекте протеуса, так же не работает....

0

13

Avis_rara потому что в проете к МК фьюзы не выставлены. камень работает по факту на частоте 500 кГц

0

14

так а где их там выставить, что-то я никак не пойму...
у строчках
cksel fuses   -     (0010) Int. RS Osc. 4Mhz
sut fuses      -     (10)
Да, и у "sasha_1973" точно так же, но там работает..(

0

15

делитель на 8 убрать.

0

16

Просто капец, даже сравнить лень!

http://s6.uploads.ru/t/BXaFI.jpg

0

17

Да сравнивал я... не заметил, просто раньше протеусом не пользовался.
Всем большое спасибо! работает.

0