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

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

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

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



ds1621

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

1

Что-то не вижу ничего по поводу температурного датчика DS1621.Никто не подключал?Нашел на просторах интернета кусок кода.Но вот одна проблемка.Все отлично показывает но только плюсовой диапазон температур.Не знаю как показывать отрицательную.

$crystal = 4000000
$regfile = "m8def.dat"
Dim Tempmsb As Integer
Dim Templsb As Integer
Dim Th As Byte
Dim Tl As Byte
Dim Confg As Byte
Dim Count As Byte
Dim Slope As Byte

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.7 , Rs = Portb.6

Config Lcd = 16 * 2

Deflcdchar 0 , 14 , 17 , 17 , 17 , 14 , 32 , 32 , 32        'degree
Deflcdchar 1 , 4 , 14 , 31 , 32 , 32 , 32 , 32 , 32         'up
Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 31 , 14 , 4         'down
Deflcdchar 3 , 32 , 32 , 32 , 31 , 31 , 32 , 32 , 32        'equal

Config Sda = Portc.4
Config Scl = Portc.5

Cls
Cursor Off

'write TH
I2cstart
I2cwbyte &H90
I2cwbyte &HA1
I2cwbyte 25
I2cstop
'--------------
'write TL
I2cstart
I2cwbyte &H90
I2cwbyte &HA2
I2cwbyte 20
I2cstop
'--------------
'read TH
I2cstart
I2cwbyte &H90
I2cwbyte &HA1
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Th , Nack
I2cstop
'--------------
'read TL
I2cstart
I2cwbyte &H90
I2cwbyte &HA2
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Tl , Nack
I2cstop
'--------------
'read config
I2cstart
I2cwbyte &H90
I2cwbyte &HAC
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Confg , Nack
I2cstop
'--------------
Goto Loop
'read counter
Readcnt:
I2cstart
I2cwbyte &H90
I2cwbyte &HA8
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Count , Nack
I2cstop
Return
'--------------
'read slope
Readslp:
I2cstart
I2cwbyte &H90
I2cwbyte &HA9
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Slope , Nack
I2cstop
Return
'--------------

Loop:

'start convert
I2cstart
I2cwbyte &H90
I2cwbyte &HEE
I2cstop
'-------------
'read temperature
I2cstart
I2cwbyte &H90
I2cwbyte &HAA
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Tempmsb , Ack
I2crbyte Templsb , Nack
I2cstop
'read config
I2cstart
I2cwbyte &H90
I2cwbyte &HAC
I2cstop

I2cstart
I2cwbyte &H91
I2crbyte Confg , Nack
I2cstop
If Templsb = 128 Then Templsb = 5 Else Templsb = 0
'--------------

Wait 1
Locate 1 , 1
Lcd Tempmsb ; "," ; Templsb ; Chr(0) ; "C" ; " ****"
'If Confg = 8 Then Lcd Chr(3)



Goto Loop

0

2

единичку десятичную или двоичную.Как это инвертируем.

0

3

инверсия - был 0 стал 1, был 1 стал 0.....Ну пожалуйста, хватит нас мучать такими ужасными вопросами.

0

4

Return
'--------------

Loop:

'start convert
I2cstart

Странно если программа говоришь рабочая - тогда бочку качу на компилятор. Ну как же так... Оператор позволять ставить как МЕТКУ в программе.
Либо все это жутчайше глючит либо величайшим программистом писано

0

5

If Templsb = 128 Then Templsb = 5 Else Templsb = 0
If Tempmsb > 125 Then Toggle Tempmsb
If Templsb = 0 Then Tempmsb = Tempmsb + 1

Какая-то ерунда получается.Отрицательную температуру показывает как надо, но теперь плюсовую врет на 1 градус.Причем если например +1,5 то все правильно так и показывает, а если +2,0 , то получается почему-то +3,0. Где ошибка?

0

6

да, так работает правильно. Выручили.Спасибо. А вообще даташит на русском языке не встречался никому?

Отредактировано jimbaton (2009-12-11 19:52:57)

0

7

Подсказали бы каким образом читать с одной шины несколько датчиков?Уменя сейчас А0,А1,А2 соединены на землю, второи я соединю все на +5в, а дальше что?

0

8

ну во первых недостаточное знание англииского (поэтому и ищу даташит на русском), а во вторых недостаточен опыт в программировании.Да про термостат я уже посмотрел что кое что можно оттуда убрать.Заимусь этим.

Отредактировано jimbaton (2009-12-13 12:23:08)

0

9

Вот что у меня получилось.Убрал термостат и код стал намного легче.МК читает 2 датчика. Но есть одно "НО". Когда включаю, сначала показывает 0, потом температуру 1-го датчика, а потом и 2-го датчика.

$crystal = 4000000
$regfile = "m8def.dat"
Dim Tempmsb1 As Byte
Dim Templsb1 As Byte
Dim Sign1 As String * 1

Dim Tempmsb2 As Byte
Dim Templsb2 As Byte
Dim Sign2 As String * 1

Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Config Lcd = 16 * 2

Config Sda = Portc.4
Config Scl = Portc.5

Cls
Cursor Off

'**********************************************************************************
'*********************************1st_sensor****************************************
'**********************************************************************************
'*************************A0=+5v, A1=+5V, A2=+5V**********************************
'**********************************************************************************

1st_sensor:
'start convert
I2cstart
I2cwbyte &B10011110
I2cwbyte &HEE
I2cstop
'-------------
'read temperature
I2cstart
I2cwbyte &B10011110
I2cwbyte &HAA
I2cstop

I2cstart
I2cwbyte &B10011111
I2crbyte Tempmsb1 , Ack
I2crbyte Templsb1 , Nack
I2cstop

If Templsb1 = 128 Then Templsb1 = 5 Else Templsb1 = 0
If Tempmsb1 > 125 Then
Sign1 = "-"
End If

If Tempmsb1 <= 125 Then
Sign1 = "+"
End If

If Tempmsb1 > 125 Then
   Toggle Tempmsb1
   If Templsb1 = 0 Then Tempmsb1 = Tempmsb1 + 1
End If
'--------------
Waitms 760

Locate 1 , 1
Lcd Sign1 ; Tempmsb1 ; "," ; Templsb1 ; Chr(0) ; "C"

Wait 3

'**********************************************************************************
'*********************************2nd_sensor****************************************
'**********************************************************************************
'*************************A0=+5v, A1=Gnd, A2=+5V**********************************
'**********************************************************************************

2nd_sensor:
'start convert
I2cstart
I2cwbyte &B10011010
I2cwbyte &HEE
I2cstop
'-------------
'read temperature
I2cstart
I2cwbyte &B10011010
I2cwbyte &HAA
I2cstop

I2cstart
I2cwbyte &B10011011
I2crbyte Tempmsb2 , Ack
I2crbyte Templsb2 , Nack
I2cstop

If Templsb2 = 128 Then Templsb2 = 5 Else Templsb2 = 0

If Tempmsb2 > 125 Then
Sign2 = "-"
End If

If Tempmsb2 <= 125 Then
Sign2 = "+"
End If

If Tempmsb2 > 125 Then
   Toggle Tempmsb2
   If Templsb2 = 0 Then Tempmsb2 = Tempmsb2 + 1
End If
'--------------

Waitms 760
Locate 1 , 1
Lcd Sign2 ; Tempmsb2 ; "," ; Templsb2 ; Chr(0) ; "C"

Wait 3

Goto 1st_sensor

Отредактировано jimbaton (2009-12-13 17:06:22)

0

10

2 Mrshilov

Ваш код выглядит довольно изящно. Подкупает.
Пробовал его в протеусе - тишина. Не поможете разобраться?
зы Предыдущий код с Вашими правками в протеусе работает нормально.

0