Страница 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
Мурик
Два варианта термометров.