Страница 1 из 1

Термометр на Ds18B20

Добавлено: Вс май 28, 2017 16:08:28
Pjerlukashev
Всем привет! Только начинаю программировать МК. Пытаюсь сделать термометр на ATmega8 и DS18B20. Делаю в Bascom, а не на Си. Мк не видит датчик, т.е. на шине 1 wire все время логическая единица, на экране 127. Подтяжка шины к питанию есть. Датчик на шине один. Пробовал подключать к ногам 9 и 10 (порт B6 и B7). Пробовал менять сам датчик. Ставил в две разные схемы с 16*2 экраном и с трехразрядным динамическим индикатором. Все одно и то же. Подскажите, может есть кака-то особенность, 1-wire работает не на всех портах, или еще что-то, м.б фьюзы. Читал много статей в инете про подключение, везде написано что подключается просто. Код брал отсюда http://cxem.net/mc/mc181.php

Re: Термометр на Ds18B20

Добавлено: Пн май 29, 2017 03:42:23
Ivanoff-iv
собери вхему в протеусе - там и детали исправные и схему на обозрение выложить проще

Re: Термометр на Ds18B20

Добавлено: Пн май 29, 2017 12:18:52
Мурлокотам
Для начала выложите СВОЮ схему и СВОЙ код, а не ссылки на сторонние ресурсы.
Схему желательно в графическом формате, а не файл "Протеуса" - он не у всех есть. Код - просто текст, а не файл с раcширением bas.

Re: Код программы

Добавлено: Вт май 30, 2017 22:16:37
Pjerlukashev
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Portd = Output
Config Portc = Output
Config Portb.0 = Output
Config 1wire = Portb.7




Declare Sub Disp
Declare Sub Temp

Dim Value As String * 3
Dim Value1 As String * 3
Dim Digit As String * 1
Dim Screen As Integer


Dim Screen1 As Byte
Dim Screen2 As Byte
Dim Screen3 As Byte
Dim Pos As Byte
Dim Length As Byte
Dim X As Byte

Dim A As Byte
Dim B As Byte
Dim C As Byte

'Const Startt = &H44
'Const Readt = &HBE
'Const Status = &B00011111
'Const Skiprom = &HCC



Dim Znak As Byte


Pos = 1
Length = 1
Portd.4 = 1
Portd.7 = 1
Portb.0 = 1
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
Portd.6 = 1

Portc.3 = 0
Portc.4 = 0
Portc.5 = 0
Screen = 0
X = 0



Do

X = X + 1
If X = 100 Then
Portc.5 = 0
Call Temp
X = 0

Else
End If


Call Disp

If Znak = 128 Then
Screen1 = 10
Else
End If

If Screen1 = 0 Then


Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 1

Elseif Screen1 = 1 Then

Portd.4 = 1
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
Elseif Screen1 = 2 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 1
Portc.2 = 0
Portd.2 = 0
Portd.5 = 1
Portd.3 = 0

Elseif Screen1 = 3 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 1
Portd.3 = 0
Elseif Screen1 = 4 Then

Portd.4 = 1
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0
Elseif Screen1 = 5 Then

Portd.4 = 0
Portd.7 = 1
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0

Elseif Screen1 = 6 Then

Portd.4 = 0
Portd.7 = 1
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 0
Elseif Screen1 = 7 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
Elseif Screen1 = 8 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 0
Elseif Screen1 = 9 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0
Elseif Screen1 = 10 Then

Portd.4 = 1
Portd.7 = 1
Portb.0 = 1
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 0
Elseif Screen1 = 11 Then

Portd.4 = 1
Portd.7 = 1
Portb.0 = 1
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
End If

Portc.3 = 1
Portc.4 = 0
Portc.5 = 0

Waitms 3

If Screen2 = 0 Then


Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 1

Elseif Screen2 = 1 Then

Portd.4 = 1
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
Elseif Screen2 = 2 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 1
Portc.2 = 0
Portd.2 = 0
Portd.5 = 1
Portd.3 = 0

Elseif Screen2 = 3 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 1
Portd.3 = 0
Elseif Screen2 = 4 Then

Portd.4 = 1
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0
Elseif Screen2 = 5 Then

Portd.4 = 0
Portd.7 = 1
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0

Elseif Screen2 = 6 Then

Portd.4 = 0
Portd.7 = 1
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 0
Elseif Screen2 = 7 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
Elseif Screen2 = 8 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 0
Elseif Screen2 = 9 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0
Elseif Screen2 = 10 Then

Portd.4 = 1
Portd.7 = 1
Portb.0 = 1
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
End If

Portc.3 = 0
Portc.4 = 1
Portc.5 = 0

Waitms 3

If Screen3 = 0 Then


Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 1

Elseif Screen3 = 1 Then

Portd.4 = 1
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
Elseif Screen3 = 2 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 1
Portc.2 = 0
Portd.2 = 0
Portd.5 = 1
Portd.3 = 0

Elseif Screen3 = 3 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 1
Portd.3 = 0
Elseif Screen3 = 4 Then

Portd.4 = 1
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0
Elseif Screen3 = 5 Then

Portd.4 = 0
Portd.7 = 1
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0

Elseif Screen3 = 6 Then

Portd.4 = 0
Portd.7 = 1
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 0
Elseif Screen3 = 7 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
Elseif Screen3 = 8 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 0
Elseif Screen3 = 9 Then

Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 1
Portd.5 = 0
Portd.3 = 0
Elseif Screen3 = 10 Then

Portd.4 = 1
Portd.7 = 1
Portb.0 = 1
Portc.2 = 1
Portd.2 = 1
Portd.5 = 1
Portd.3 = 1
End If

Portc.3 = 0
Portc.4 = 0
Portc.5 = 1

Waitms 3


Loop

Sub Temp

1wreset


If Err = 1 Then

Screen = 888
Exit Sub
Else
End If
1wwrite &HCC , 1
1wwrite &H44 , 1
Waitms 750
1wreset
1wwrite &HCC , 1

1wwrite &HBE
A = 1wread(1)
B = 1wread(1)
1wreset




A = A And &B11110000
Shift A , Right , 4

B = B And &B00001111

Shift B , Left , 4

C = A + B


Znak = C And &B10000000


Screen = C And &B01111111


End Sub


Sub Disp
Value = Str(screen)
Value1 = Format(value , “000”)

Digit = Mid(value1 , Pos , Length)
Screen1 = Val(digit)

Pos = Pos + 1

Digit = Mid(value1 , Pos , Length)
Screen2 = Val(digit)

Pos = Pos + 1

Digit = Mid(value1 , Pos , Length)
Screen3 = Val(digit)
Pos = 1

End Sub


End

Добавлено after 3 minutes 31 second:
Re: Термометр на Ds18B20
Термодатчик подключал так же, как в этой схеме:

Re: Термометр на Ds18B20

Добавлено: Чт июн 01, 2017 09:27:30
Мурлокотам
Во-первых, судя по схеме и коду, у вас используется внутренний RC-генератор, максимальная частота которого 8 МГц, а в коде прописано
$crystal = 16000000
Непорядок. Исходя из этого компилятор рассчитывает все временные параметры. Исправляйте.
Во-вторых, UART у вас, похоже, тоже не используется. Тогда есть смысл отдать весь порт D под управление сегментами индикатора,
а порт C - под управление разрядами. Получилось бы значительно проще - не было бы вот этой бесконечной вереницы:
Portd.4 = 0
Portd.7 = 0
Portb.0 = 0
Portc.2 = 0
Portd.2 = 0
Portd.5 = 0
Portd.3 = 1
Почитайте про динамическую индикацию хотя бы здесь
В дальнейшее я особо не вникал, но вот здесь
X = X + 1
If X = 100 Then
Portc.5 = 0
Call Temp
X = 0

Else
End If
"Else" - не нужно. И далее в аналогичных конструкциях тоже. "Else" необходимо в тех случаях, когда при несоблюдении условий, указанных после "If", нужно пропустить действия, указанные после "Then" и перейти к другим действиям, которые описаны после "Else". Например:
If A=10 Then
Set Portb.0
Else
Incr A
End If
Это все в Helpe описано. Еще хорошо описано в книге "СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ
BASCOM-8051", автор Кулиш М.Л.
СпойлерIF, ELSE , ELSEIF, END IF
Действие: Проверить условия, в результате которых выполняются или пропускаются указанные действия.
Производится проверка значений и сравнение всех типов переменных, включая значения
отдельных битов одно-, двух- и четырехбайтных переменных!!!
Синтаксис: 1-я конструкция. Исполняется действие Action 1 если выполнено условие expression 1:
IF expression 1 THEN
‘Action 1
END IF
2-я конструкция. Исполняется действие Action 1 если выполнено условие expression 1 и Action 2
если не выполнено:
IF expression 1 THEN
‘Action 1
ELSE
‘Action 2
END IF
3-я конструкция. Исполняется Action 1, если выполнено условие expression 1, Action 2 если не
выполнено, однако при условии выполнения expression 2, и Action 3, если не выполнено ни одно
из предыдущих условий. Может быть задано несколько проверок дополнительных условий:
IF expression 1 THEN
‘Action 1
ELSEIF expression 2 THEN
‘Action 2
ELSE
‘Action 3
END IF
Пример 1: DIM A AS INTEGER
A = 10
IF A = 10 THEN ‘проверка
PRINT « This part is executed.» ‘это отпечатается
ELSE PRINT « This will never be executed.»
THEN
PRINT «BIT 15 IS SET»
END IF
REM Пример использования в одной строке
IF THEN IF A.15 = 0 THEN PRINT «BIT 15=0»
ELSE PRINT «BIT 15=1»
END IF
Пример 2: Dim X As Integer
‘новая возможность проверки – сравнение со значением символа
If X = "A" Then 'when X = 65 the test will pass
Пример 3: ‘новая возможность проверки – запись опертора в одну строку
If X = 10 Then Goto M1 Else Goto M2

Re: Термометр на Ds18B20

Добавлено: Пт июн 02, 2017 22:15:24
Мурик
Два варианта термометров.