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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » два датчика ds18b20 на одном порту


два датчика ds18b20 на одном порту

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

1

нужна помощь !
нужно термостат привязать к датчику с правом выбора в меню номера датчика.  т.е.  чтоб один работал как термометр а второй термостат с изменением номера датчика в меню.

Код:
'*****************************************************************************
'*                                             *
'* Chip:  ATMEGA 8 - 16                                                      *
'* Freq:  8.0000 Mhz                                                         *
'* МАРТ 2013 года.                                                           *
'*****************************************************************************
$regfile = "m8def.dat"
$crystal = 8000000
'############################ Конфигурация_ЖКИ #################################
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portc.2 , Db6 = Portc.5 , Db5 = Portc.3 , Db4 = Portc.4 , E = Portc.0 , Rs = Portc.1
Cursor Off
'------------------------------Порты--------------------------------------------
Config Portd = Output
Config Portb = Input
Config Portc = Output
Config Sda = Portb.6
Config Scl = Portb.7
Config Clock = User
Config Date = Dmy , Separator = .
Config 1wire = Portb.0
Config Adc = Single , Prescaler = 128 , Reference = Avcc
On Adc
Config Timer1 = Timer , Prescale = 64                       'конфигурируем таймер и ставим его делитель 64. таймер будет переполнятся 2 раза в секунду
On Timer1 Pulse:                                            'при переполнении таймера запустить подпрограмму Pulse
Enable Interrupts                                           'разрешить прерывания
Enable Timer1                                               'разрешить таймер1
Set Portb.2
Set Portb.3
Set Portb.4
Set Portb.5

Cn Alias Pinb.2                                             'Вниз
Cv Alias Pinb.4                                             'Вверх
Vv Alias Pinb.5                                             'Ввод
M Alias Pinb.3                                              'Меню

Light Alias Portd.0                                         'свет
Air Alias Portd.1                                           'воздух
Filter Alias Portd.2                                        'фильтр
Corm Alias Portd.3                                          'кормушка
Cooler Alias Portd.4                                        'охладитель
Heater Alias Portd.5                                        'нагрев
Uflight Alias Portd.6                                       'уф-лампа
Rezerv Alias Portd.7                                        'резерв
'--------------------------------Константы--------------------------------------
Const Ds1307w = &HD0                                        'бит записи
Const Ds1307r = &HD1
Const Ds18b20_id = &H28
'--------------------------- символы -------------------------------------------
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           'градус
Deflcdchar 1 , 4 , 14 , 31 , 31 , 17 , 21 , 17 , 31         ' домик
Deflcdchar 2 , 32 , 32 , 32 , 32 , 17 , 17 , 31 , 31        ' аквариум
Deflcdchar 3 , 31 , 27 , 10 , 11 , 10 , 11 , 10 , 15        'охлаждение
Deflcdchar 4 , 30 , 10 , 26 , 10 , 26 , 10 , 27 , 31        'нагрев
Deflcdchar 5 , 32 , 4 , 4 , 31 , 4 , 4 , 32 , 32
Deflcdchar 6 , 32 , 2 , 20 , 14 , 5 , 8 , 32 , 32
Deflcdchar 7 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32
Deflcdchar 8 , 32 , 17 , 10 , 4 , 10 , 17 , 32 , 32
Deflcdchar 9 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32
Deflcdchar 10 , 32 , 8 , 5 , 14 , 20 , 2 , 32 , 32


'---------------------------------- ПЕРЕМЕННЫЕ --------------------------------
Dim Weekday As Byte
'--------задаем переменные------------------
Dim S05 As Byte
Dim W As Word
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Sign As String * 1
Dim T As Byte
Dim T1 As Single
Dim T2 As Integer
Dim Ttemp As Byte
Dim Hh As Byte
Dim Mm As Byte
Dim X As Byte
Dim Tt As Byte
Dim Aa As Byte
Dim Xp As Byte
Dim H1 As Byte
Dim Min1 As Byte
Dim J1 As Byte
Dim Star As Byte



                    'температура
Dim Tz As Integer , Tz1 As Integer , _mm As Byte
Dim Dt As Integer
Dim _dt As Byte
Dim T_cool As Integer , T_cool_off As Byte
Dim Heater_off As Byte
Dim Ds As Byte

Dim Ee_dt As Eram Integer
Dim Ee_tz As Eram Integer
Dim Ee_mtemp As Eram Integer
Dim Ee_cool As Eram Integer
Dim Ee_ds As Eram Byte






'-------------------------- Декларирование подпрограмм ------------------------
  Declare Sub Termostat
  Declare Sub Enterdatetime()
  Declare Sub Getkey()
  Declare Sub Menu()






 Heater_off = 1
 Cooler = 0
'-----------считываем 64 битные номера датчиков----------------
 Cls
W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Do
 Dsid2(1) = 1wsearchnext()
Loop Until Err = 1
Cls
'_________________________основной цикл программы________________________________________________________
Do
  Gosub Getdatetime
Locate 1 , 1
 Lcd Time$ ; "."

  'If S05 >= 6 Then                                          'если щетчик таймер насчитал 3 секунды (таймер срабатывает 2 раза в секунду при 8 мГц
'S05 = 0                                                     'обнуляем щетчик таймер
Gosub Convallt                                              'переходим на подпрограмму подачи запросов в датчик температуры
1wverify Dsid1(1)
X = 1
  Locate 1 , 10                                             'указываем куда вывести на дисплей
Lcd Chr(01) ; Sign ; T ; "." ; Mm ; Chr(00)                 'выводим целую часть потом рисуем точку потом десятую часть температуры
Gosub Temperature                                           'переходим на подпрограмму подсчета и вывода температуры на дисплей

1wverify Dsid2(1)
X = 2
   Locate 2 , 10                                            'указываем куда вывести на дисплей
Lcd Chr(02) ; Sign ; T ; "." ; Mm ; Chr(00)                 'выводим целую часть потом рисуем точку потом десятую часть температуры
Gosub Temperature


Gosub Termostat


    If M = 0 Then                                           'кнопка входа в меню
   Menu
      End If


    Loop
End


Getdatetime:
 I2cstart                                                   ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return
Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return
End








'_________________________________________________________________________________
Convallt:
 1wreset                                                    ' reset the bus
 1wwrite &HCC                                               ' skip rom
 1wwrite &H44
  Waitms 750
Return                                                      ' возврат в основной цикл на место, откуда пришли
'----------------
Temperature:
If Err = 0 Then
1wwrite &HBE
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
If Byte1 > 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &H101 - Byte0
Byte1 = &HFF - Byte1
Sign = "-"
Else
Sign = "+"
End If
T1 = Byte0 / 16                                             ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                                             ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T = T1 + T2
Hh = Fix(t1)                                                'отсекаем от температуры все после запятой
Ttemp = T1 * 10                                             '
Mm = Ttemp Mod 10                                           'берем десятичную часть температуры


End If
Return
'-----------------
  Pulse:                                                    'подпрограмма обработки переполнения таймера1
Incr S05                                                    ' S05 = S05+1
Return




'########################### Меню ввода данных #################################
'_______________________________Установка часов_________________________________
Sub Enterdatetime
Cls
   Aa = 0
   Xp = _hour
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 1 , 1
   Lcd "©cїaЅoієa Аacoі"
   Locate 2 , 1
   Lcd "АacГ:" ; Xp
   Getkey
   H1 = Xp
Loop Until Aa = 1
'--------------------------------Установка минут--------------------------------
   Cls
   Aa = 0
   Xp = _min
   Do
   If Xp > 59 Then Xp = 0
   If Xp < 0 Then Xp = 59
   Locate 1 , 1
   Lcd "©cїaЅoієa Аacoі"
   Locate 2 , 1
   Lcd "јёЅyїГ:" ; Xp
   Getkey
   Min1 = Xp
   Loop Until Aa = 1
   _hour = H1
   _min = Min1
   _sec = 0
   Gosub Settime



  '--------------------------------выбор термодатчика---------------------------
 Cls
   Aa = 0
   Xp = Ee_ds
   Do
   If Xp > 2 Then Xp = 0
   If Xp < 0 Then Xp = 2
   Locate 1 , 2
   Lcd "їepјoгaїАёє"
   Locate 2 , 1
   Lcd "гaїАёє:" ; Xp
   Getkey
   Ds = Xp
   Loop Until Aa = 1
   Ee_ds = Ds




 '--------------------------------Установка термостата---------------------------
 Cls
   Aa = 0
   Xp = Ee_tz
   Do
   If Xp > 50 Then Xp = 0
   If Xp < 0 Then Xp = 50
   Locate 1 , 2
   Lcd "OІoґpeі"
   Locate 2 , 1
   Lcd "Ўpaгycoі:" ; Xp
   Getkey
   Tz = Xp
   Loop Until Aa = 1
   Ee_tz = Tz

 '--------------------------------Установка Гистерезиса--------------------------
Cls
   Aa = 0
   Xp = Ee_dt
   Do
    If Xp > 10 Then Xp = 0
    If Xp < 0 Then Xp = 10
     Locate 1 , 2
     Lcd "Ўёcїepe·ёc"
     Locate 2 , 1
     Lcd "Ўpaгycoі:" ; Xp
   Getkey
    Dt = Xp
    Loop Until Aa = 1
   Ee_dt = Dt
'---------------------Утановка  охлаждения-------------------------------
Cls
   Aa = 0
   Xp = Ee_cool
   Do
    If Xp > 100 Then Xp = 30
    If Xp < 0 Then Xp = 100
     Locate 1 , 2
     Lcd "Ox»a¶гeЅёe"
     Locate 2 , 1
     Lcd "Ўpaгycoі:" ; Xp
   Getkey
   T_cool = Xp
     Loop Until Aa = 1
   Ee_cool = T_cool

   End Sub
 '######################### Меню опроса кнопок ##################################
Sub Getkey()
   Waitms 300
   If Cv = 0 Then Incr Xp
   If Cn = 0 Then Decr Xp
   If Vv = 0 Then
   Aa = 1
   Else
   Aa = 0
   End If

    End Sub

Sub Menu()
Aa = 0
Xp = 0
Getkey
Enterdatetime
Cls
Locate 1 , 2
Lcd "OK!"
Waitms 500
 Cls
Locate 2 , 6
Lcd "OK!"
Waitms 500
Cls

Locate 1 , 10
Lcd "OK!"
Waitms 500
 Cls
Locate 2 , 14
Lcd "OK!"
Waitms 500
Cls
   End Sub
   Return

  '####################### Условие работы термостата #############################
Sub Termostat

   Tz = Ee_tz
   Dt = Ee_dt
   _dt = 1 + Dt
   Tz1 = Tz - _dt
   T_cool = Ee_cool
      T_cool_off = T_cool - _dt
   If T <= Tz1 And Heater_off = 1 Then
    Heater = 1
      Locate 2 , 1
      Lcd Chr(04)
      End If
   If T => T_cool And Heater_off = 1 Then
    Cooler = 1
      Locate 2 , 1
      Lcd Chr(03)
      End If
    If T => Tz Or Heater_off = 0 Then Heater = 0
    If T <= T_cool_off Or Heater_off = 0 Then Cooler = 0
    If Heater = 0 And Cooler = 0 Then
     Locate 2 , 1
    Lcd "."
    End If
     End Sub




End

0

2

Непонятен вопрос. Я сейчас как раз пишу программу для устройства с тремя датчиками на одном порту. В протеусе, по крайней мере, работает без проблем. При первом включении на железе, нужно будет подключать по одному датчику. Контроллер поочередно их записывает в EEPROM. Что нужно ВАМ делать с датчиками?

0

3

ёёёёёёНу если я вас правельно понял , то вот первый же сайт в поиске не проверял , но всеже вот на нашем сайте человек подключал целых 8 датчиков Ссылка , но самый простой вариант подключить второй датчик а другую ногу и отдельно его опрашивать , неужто  не одного свободного порта неосталось.
Если я не прав , объясните в чем.

0

4

опрос двух датчиков происходит и температура  считывается, но надо чтоб срабатывал термостат только от одного датчика а второй остался термометром и из меню можно поменять датчики местами а не на  объектах контроля (один показывает температуру в комнате а другой регулирует температуру в аквариуме) . проц задействован по полной, 1 нога есть резервная pinb1, для дальнейшей модернизации,

0

5

Код:
Dim Dsid_tmp(8)
Dim N as Byte

'------------ Меняем датчики местами
For N=1 to 8
Dsid_tmp(N) = Dsid1(N)
Dsid1(N) = Dsid2(N)
Dsid2(N) = Dsid_tmp(N)
Next N

Ну и далее запрограммировать режимы (термостат, измерение), если они (режимы) тоже будут меняться местами.

Отредактировано SIvan (2013-10-10 20:51:08)

0

6

спасибо. буду пробовать потом отпишусь

0

7

http://s4.uploads.ru/t/BrfJF.png
с заменой датчиков не получилось,( не силен еще в этом) сделал на разные входа и все работает, теперь проблема с курсором в меню , как его совместить с регурируемым символом?

Отредактировано driaman (2013-10-11 20:33:48)

0

8

А что именно не получилось?

Курсор на дисплее устанавливается в нужное место с помощью Locate. Но это уже не по теме.

0

9

термостат прыгает с одного датчика на другой и обратно, меня устроило на другой ноге и выбирать ничего не надо,
locate  ставит курсор на заданное  начальное знакоместо но как его объеденить с выводимыми данными или сделать мигание изненяемого знакоместа?

0

10

Что должно служить командой на замену датчиков?

Cursor on, blink - курсор будет мигать. Поставьте его (курсор) в нужное место, тем самым обозначив значение, которое собираетесь менять. Поменяли значение? Передвинули курсор в следующую позицию. Мигание символа в BASCOM штатно не предусмотрено.

Отредактировано SIvan (2013-10-12 19:40:13)

0

11

спасибо, разобрался

0

12

а отличие показаний двух датчиков на 0.3 это нормально или проблемма в проге? в протеусе норма а в железе расхождение на 0.3 градуса.

0

13

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

а отличие показаний двух датчиков на 0.3 это нормально или проблемма в проге? в протеусе норма а в железе расхождение на 0.3 градуса.

До 0.5 нормально- заводская точность калибровки. Ну и не факт, что одинаковые условия-  чтобы сравнить связываю между собой в термопасте медной проволокой и сую в медную трубку, а весь бутер уже в воду )

0

14

ясно, спасибо .  просто один запаян на плате а второй на разъеме но два корпуса вместе соеденены для проверки. хота 0.3 роли в процессе не играют.

0

15

при работе двух датчиков замечено перескакивание секунд на часах через секунду, т.е. 01 02 04 06 .07 09 11 и т.д .... при отключении одного датчика програмно все работает нормально , можно как-то исправить или нет?

Код:
'* Chip:  ATMEGA 8 - 16                                                      *
'* Freq:  8.0000 Mhz                                                         *
'* сентябрь 2013 года.                                                       *
'*****************************************************************************
$regfile = "m8def.dat"
$crystal = 8000000
'############################ Конфигурация_ЖКИ #################################
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portc.2 , Db6 = Portc.5 , Db5 = Portc.3 , Db4 = Portc.4 , E = Portc.0 , Rs = Portc.1
Cursor Off
'------------------------------Порты--------------------------------------------
Config Portd = Output
Config Portb = Input
Config Portc = Output
Config Sda = Portb.7
Config Scl = Portb.6
Config Clock = User
Config Adc = Single , Prescaler = 128 , Reference = Avcc
Start Adc
Set Portb.2
Set Portb.3
Set Portb.4
Set Portb.5
Cn Alias Pinb.4                                             'Вниз
Cv Alias Pinb.2                                             'Вверх
Vv Alias Pinb.5                                             'Ввод
M Alias Pinb.3                                              'Меню
Uf Alias Portd.1                                            'уф-лампа
Filter Alias Portd.2                                        'фильтр
Air Alias Portd.3                                           'воздух
Heater Alias Portd.4                                        'нагрев
Light Alias Portd.5                                         'свет
Cooler Alias Portd.6                                        'охладитель
Corm Alias Portd.7                                          'кормушка
'--------------------------------Константы--------------------------------------
Const Ds1307w = &HD0                                        'бит записи
Const Ds1307r = &HD1
'---------------------------------- ПЕРЕМЕННЫЕ --------------------------------
                           'Общие переменные
Dim Bweekday As Byte                                        'чтение дня недели
Dim Strweekday As String * 11                               'отображение дня недели
Dim Weekday As Byte                                         'неделя
Dim J1 As Byte                                              'год
Dim M1 As Byte                                              'месяц
Dim D1 As Byte                                              'день
Dim H1 As Byte                                              'час
Dim Mi As Byte                                              'минуты
Dim Aa As Byte                                              'переменные меню
Dim Xp As Byte                                              'переменные меню                                          '
                           'Переменные для работы
Dim H_on As Byte                                            'освещение
Dim H_off As Byte                                           'освещение
Dim Ee_h_on As Eram Byte                                    'освещение
Dim Ee_h_off As Eram Byte                                   'освещение

Dim Foto As Integer                                         'фотодатчик
Dim Foto_on As Byte                                         'фотодатчик
Dim Foto_off As Byte                                        'фотодатчик
Dim Ee_foto_on As Eram Byte                                 'фотодатчик
Dim Ee_foto_off As Eram Byte                                'фотодатчик

Dim Air_on As Byte                                          'компрессор
Dim Air_off As Byte                                         'компрессор
Dim Ee_air_on As Eram Byte                                  'компрессор
Dim Ee_air_off As Eram Byte                                 'компрессор


Dim Corm_on As Byte                                         'кормушка
Dim Corm_off As Byte                                        'кормушка
Dim Corn As Bit                                             'кормушка
Dim Ee_corm_on As Eram Byte                                 'кормушка
Dim Ee_corm_off As Eram Byte                                'кормушка

Dim Uf_d As Byte                                            'уф.лампа
Dim Uf_on As Byte                                           'уф.лампа
Dim Uf_off As Byte                                          'уф.лампа
Dim Ee_uf_on As Eram Byte                                   'уф.лампа
Dim Ee_uf_off As Eram Byte                                  'уф.лампа
Dim Ee_uf_1 As Eram Byte                                    'уф.лампа
Dim Ee_uf_2 As Eram Byte                                    'уф.лампа
Dim Ee_uf_3 As Eram Byte                                    'уф.лампа
Dim Ee_uf_4 As Eram Byte                                    'уф.лампа
Dim Ee_uf_5 As Eram Byte                                    'уф.лампа
Dim Ee_uf_6 As Eram Byte                                    'уф.лампа
Dim Ee_uf_7 As Eram Byte                                    'уф.лампа

Dim _min_real As Byte                                       'фильтр
Dim _min_temp As Byte                                       'фильтр
Dim T_filter_off As Integer                                 'фильтр
Dim T_fil As Byte                                           'фильтр

                           'температурный датчик
Dim Ba0 As Byte                                             '
Dim Ba1 As Byte                                             '
Dim Bb0 As Byte                                             '
Dim Bb1 As Byte

Dim Ta0 As String * 1
Dim Tb0 As String * 1
Dim Ta1 As Single                                           'термо-1
Dim Tb1 As Single                                           'термо-2
Dim Ta2 As Byte                                             '
Dim Tb2 As Byte                                             '
Dim Ta3 As Byte                                             '
Dim Tb3 As Byte                                             '
Dim Ttempa As Byte                                          '
Dim Ttempb As Byte                                          '
Dim Hha As Byte                                             '
Dim Hhb As Byte                                             '
Dim Mma As Byte                                             '
Dim Mmb As Byte                                             '

Dim Tz As Byte                                              'термостат
Dim Tz1 As Byte                                             'термостат

Dim Dt As Byte                                              'гистерезис
Dim Dt1 As Byte                                             'гистерезис
Dim Eedt As Eram Byte                                       'гистерезис

Dim T_cool As Byte                                          'охлаждение
Dim T_cool_off As Byte                                      'охлаждение
Dim Ee_cool As Eram Byte                                    'охлаждение

Dim Heater_off As Byte                                      'нагреватель
Dim Eetemp As Eram Byte                                     'термостат                                '

'-------------------------- Декларирование подпрограмм ------------------------
Declare Sub Getdatetime                                     ' чтение ds1307
Declare Sub Enterdatetime()
Declare Sub Getkey()                                        ' кнопки
Declare Sub Menu()                                          ' меню
Declare Sub Temperatura                                     ' чтение температуры
Declare Sub Termostat                                       ' термостат
Declare Sub Light_set                                       ' освещение
Declare Sub Air_set                                         ' компрессор
Declare Sub Uf_set                                          ' уф.лампа
Declare Sub Corm_set                                        ' кормушка
Declare Sub Filter_set                                      ' фильтр
Declare Sub Tfil                                            ' фильтр-стоп
'-------------------------- символы---------------------------------------------
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           'градус
Deflcdchar 1 , 29 , 23 , 23 , 19 , 23 , 23 , 17 , 31        'нагрев
Deflcdchar 2 , 31 , 29 , 5 , 27 , 20 , 23 , 31 , 31         'охлаждение
Deflcdchar 3 , 32 , 4 , 21 , 14 , 27 , 14 , 21 , 4          'Солнышко
Deflcdchar 4 , 15 , 19 , 25 , 25 , 25 , 25 , 25 , 19        'Луна
Deflcdchar 5 , 2 , 20 , 10 , 5 , 8 , 32 , 17 , 31           'фильтр
Deflcdchar 6 , 31 , 10 , 17 , 4 , 17 , 10 , 27 , 31         'УФ
Deflcdchar 7 , 32 , 2 , 26 , 4 , 11 , 8 , 32 , 32           'компрессор
'------------------------------ НАЧАЛО РАБОТЫ -------------------------------
Heater_off = 1
T_filter_off = 0
T_fil = 0
Heater = 0
Light = 0
Air = 0
Cooler = 0
'################################### заставка #################################
 Cls
 Locate 1 , 3
   Lcd "AєіapёyјЅГ№"
    Waitms 200
   Locate 2 , 1
   Lcd "KoЅїpo»»ep-8.v.4"
   Waitms 500
  Cls
'##################### Основной цикл программы #################################
Do
Bweekday = Dayofweek()
Strweekday = Lookupstr(bweekday , Weekdays)
Locate 2 , 1
Lcd Strweekday
 Locate 1 , 1
      Lcd Time$                                             'вывод часов
Gosub Temperatura
    Locate 1 , 11                                           'указываем куда вывести на дисплей
      Lcd Ta0 ; Ta3 ; . ; Mma ; Chr(0)
    Locate 2 , 11                                           'указываем куда вывести на дисплей
      Lcd Tb0 ; Tb3 ; . ; Mmb ; Chr(0)
     If M = 0 Then                                          'кнопка входа в меню
   Menu
        End If
   Call Termostat
   Call Light_set
   Call Air_set
   Call Uf_set
   Call Corm_set
   Call Filter_set
  Loop
End
'##################### Чтение/запись времени в RTC #############################
Getdatetime:
 I2cstart                                                   ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
  Return
Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
  Return
  End
'************************************ Дни недели *******************************
Weekdays:
Data "ЁoЅг."                                                'Понед.
Data "Bїop."                                                'Вторник
Data "Cpeг."                                                'Среда
Data "«eїі."                                                'Четверг
Data "ЁЗїЅ."                                                'Пятница
Data "CyІІ."                                                'Суббота
Data "Bocє."                                                'Воскр.
'########################## Процедура чтения температуры #######################
 Temperatura:
   Config 1wire = Portb.1
  1wreset                                                   'Проверим отклик термометра
1wwrite &HCC
1wwrite &H44
      Waitms 750                                            '
1wreset
1wwrite &HCC
1wwrite &HBE                                                '
Ba0 = 1wread()                                              '
Ba1 = 1wread()                                              '
If Ba1 > 248 Then                                           '
Ba0 = &H101 - Ba0
Ba1 = &HFF - Ba1
Ta0 = "-"
   Else
Ta0 = "+"
      End If
Ta1 = Ba0 / 16                                              '  (2*2*2*2=16)
Ta2 = Ba1 * 16                                              '  (2*2*2*2=16)
Ta3 = Ta1 + Ta2
Hha = Fix(ta1)                                              '
Ttempa = Ta1 * 10                                           '
Mma = Ttempa Mod 10


   Config 1wire = Portb.0
  1wreset                                                   'Проверим отклик термометра
 If Err = 1 Then                                            'Если не ответил
   Heater_off = 0
  Else
  Heater_off = 1
1wwrite &HCC
1wwrite &H44
   Waitms 750                                               '
1wreset
1wwrite &HCC
1wwrite &HBE                                                '
Bb0 = 1wread()                                              '
Bb1 = 1wread()                                              '
If Bb1 > 248 Then                                           '
Bb0 = &H101 - Bb0
Bb1 = &HFF - Bb1
Tb0 = "-"
   Else
Tb0 = "+"
      End If
Tb1 = Bb0 / 16                                              '  (2*2*2*2=16)
Tb2 = Bb1 * 16                                              '  (2*2*2*2=16)
Tb3 = Tb1 + Tb2
Hhb = Fix(tb1)                                              '
Ttempb = Tb1 * 10                                           '
Mmb = Ttempb Mod 10
      End If
  Return
'########################### Меню ввода данных #################################
Sub Enterdatetime
'_______________________________Установка часов_________________________________
Cls
   Aa = 0
   Xp = _hour
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 1 , 5
   Lcd "«AC®:MҐH"
   Locate 2 , 7
   Lcd Xp
   Getkey
   H1 = Xp
Loop Until Aa = 1
   Aa = 0
   Xp = _min
Do
   If Xp > 59 Then Xp = 0
   If Xp < 0 Then Xp = 59
   Locate 2 , 9
   Lcd ":" ; Xp
   Getkey
   Mi = Xp
   Loop Until Aa = 1
   _hour = H1
   _min = Mi
   _sec = 0
   Gosub Settime
'--------------------------------Установка даты--------------------------------
   Cls
   Aa = 0
   Xp = _day
Do
   If Xp > 31 Then Xp = 1
   If Xp < 1 Then Xp = 31
   Locate 1 , 2
   Lcd "аEHb:MEC:ЎOа"
   Locate 2 , 5
   Lcd Xp
   Getkey
   D1 = Xp
   Loop Until Aa = 1
   Aa = 0
   Xp = _month
 Do
   If Xp > 12 Then Xp = 03
   If Xp < 01 Then Xp = 12
   Locate 2 , 7
   Lcd ":" ; Xp
   Getkey
   M1 = Xp
   Loop Until Aa = 1
   Aa = 0
   Xp = _year
Do
   If Xp > 50 Then Xp = 13
   If Xp < 13 Then Xp = 50
   Locate 2 , 10
   Lcd ":" ; Xp
   Getkey
   J1 = Xp
   Loop Until Aa = 1
   _year = J1
   _month = M1
   _day = D1
Gosub Setdate
 '--------------------------------Установка термостата---------------------------
 Cls
   Aa = 0
   Xp = Eetemp
Do
   If Xp > 50 Then Xp = 20
   If Xp < 0 Then Xp = 50
   Locate 1 , 6
   Lcd "OІoґpeі"
   Locate 2 , 8
   Lcd Xp ; Chr(0)
   Getkey
   Loop Until Aa = 1
   Eetemp = Xp
'--------------------------------Установка Гистерезиса--------------------------
Cls
   Aa = 0
   Xp = Eedt
Do
    If Xp > 10 Then Xp = 1
    If Xp < 0 Then Xp = 10
     Locate 1 , 4
     Lcd "Ўёcїepe·ёc"
     Locate 2 , 8
     Lcd Xp ; Chr(0)
   Getkey
    Loop Until Aa = 1
   Eedt = Xp
'---------------------Утановка работы охлаждения-------------------------------
Cls
   Aa = 0
   Xp = Ee_cool
Do
    If Xp > 100 Then Xp = 30
    If Xp < 0 Then Xp = 100
     Locate 1 , 4
     Lcd "Ox»a¶гeЅёe"
     Locate 2 , 8
     Lcd Xp ; Chr(0)
   Getkey
     Loop Until Aa = 1
   Ee_cool = Xp
'--------------------- Утановка работы освещения  --------------------------
Cls
   Aa = 0
   Xp = Ee_h_on
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 1 , 2
   Lcd "Cіeї-Bє»-BГє»"
   Locate 2 , 8
   Lcd Xp ; " :"
   Getkey
   Loop Until Aa = 1
   Ee_h_on = Xp
      Aa = 0
   Xp = Ee_h_off
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 2 , 12
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_h_off = Xp
'--------------------- Утановка  фотодатчика  --------------------------
Cls
Aa = 0
   Xp = Ee_foto_on
Do
   If Xp > 10 Then Xp = 0
   If Xp < 0 Then Xp = 10
   Locate 1 , 2
   Lcd "дoїo-Bє»-BГє»"
   Locate 2 , 8
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_foto_on = Xp
Aa = 0
   Xp = Ee_foto_off
Do
   If Xp > 10 Then Xp = 0
   If Xp < 0 Then Xp = 9
   Locate 2 , 10
   Lcd ": " ; Xp
   Getkey
   Loop Until Aa = 1
   Ee_foto_off = Xp
 '--------------------- Утановка работы компресора  ------------------------
Cls
Aa = 0
   Xp = Ee_air_on
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 1 , 4
   Lcd "Koјѕpeccop"
   Locate 2 , 2
   Lcd "Bє»:" ; Xp
   Getkey
   Loop Until Aa = 1
   Ee_air_on = Xp
Aa = 0
   Xp = Ee_air_off
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 2 , 9
   Lcd "BГє»:" ; Xp
   Getkey
   Loop Until Aa = 1
   Ee_air_off = Xp
'--------------------- Утановка работы уф.лампа  --------------------------
Cls
Aa = 0
   Xp = Ee_uf_on
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 1 , 3
   Lcd "©Є-Bє»-BГє»"
   Locate 2 , 6
   Lcd Xp ; " :"
   Getkey
   Loop Until Aa = 1
   Ee_uf_on = Xp
Aa = 0
   Xp = Ee_uf_off
Do
   If Xp > 23 Then Xp = 0
   If Xp < 0 Then Xp = 23
   Locate 2 , 11
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_off = Xp
'--------------------
   Cls
Aa = 0
   Xp = Ee_uf_2
Do
   If Xp > 1 Then Xp = 0
   If Xp < 0 Then Xp = 1
   Locate 1 , 1
   Lcd "©Є:Ё/B/C/«/Ё/C/B"
   Locate 2 , 4
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_2 = Xp
Aa = 0
   Xp = Ee_uf_3
Do
   If Xp > 1 Then Xp = 0
   If Xp < 0 Then Xp = 1
   Locate 2 , 6
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_3 = Xp
Aa = 0
   Xp = Ee_uf_4
Do
   If Xp > 1 Then Xp = 0
   If Xp < 0 Then Xp = 1
   Locate 2 , 8
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_4 = Xp
Aa = 0
   Xp = Ee_uf_5
Do
   If Xp > 1 Then Xp = 0
   If Xp < 0 Then Xp = 1
   Locate 2 , 10
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_5 = Xp
Aa = 0
   Xp = Ee_uf_6
Do
   If Xp > 1 Then Xp = 0
   If Xp < 0 Then Xp = 1
   Locate 2 , 12
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_6 = Xp
Aa = 0
   Xp = Ee_uf_7
Do
   If Xp > 1 Then Xp = 0
   If Xp < 0 Then Xp = 1
   Locate 2 , 14
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_7 = Xp
Aa = 0
   Xp = Ee_uf_1
Do
   If Xp > 1 Then Xp = 0
   If Xp < 0 Then Xp = 1
   Locate 2 , 16
   Lcd Xp
   Getkey
   Loop Until Aa = 1
   Ee_uf_1 = Xp
'--------------------- Утановка времени работы кормушки ------------------------
Cls
Aa = 0
   Xp = Ee_corm_off
Do
   If Xp > 10 Then Xp = 0
   If Xp < 0 Then Xp = 10
   Locate 1 , 5
   Lcd "KopјyБєa"
   Locate 2 , 6
   Lcd Xp ; " Ceє."
   Getkey
   Loop Until Aa = 1
   Ee_corm_off = Xp
   End Sub
'######################### Меню опроса кнопок ##################################
Sub Getkey()
   Waitms 400
   If Cv = 0 Then Incr Xp
   If Cn = 0 Then Decr Xp
   If Vv = 0 Then
   Aa = 1
   Else
   Aa = 0
   End If
End Sub
'-------------------------------------------------------------------------------
Sub Menu()
Aa = 0
Xp = 0
Getkey
Enterdatetime
Cls
Locate 1 , 3
      Lcd "Aєіa-8.v.4"
Waitms 800
Cls
   End Sub
   Return
'####################### Условие работы термостата #############################
Sub Termostat
   Tz = Eetemp
   Dt = Eedt
   Dt1 = 1 + Dt
   Tz1 = Tz - Dt1
   T_cool = Ee_cool
      T_cool_off = T_cool - Dt1
If Tb3 <= Tz1 And Heater_off = 1 Then
 Heater = 1
      Locate 2 , 10
            Lcd Chr(1)
      End If
If Tb3 => T_cool And Heater_off = 1 Then
Cooler = 1
      Locate 2 , 10
            Lcd Chr(2)
      End If
If Tb3 => Tz Or Heater_off = 0 Then Heater = 0
   If Tb3 <= T_cool_off Or Heater_off = 0 Then Cooler = 0
    If Heater = 0 And Cooler = 0 Then
     Locate 2 , 10
            Lcd "."
    End If
     End Sub
'######################## Условие работы освещения #############################
Sub Light_set
    Foto = Getadc(7) \ 10
    Foto_on = 10 * Ee_foto_on
    Foto_off = 10 * Ee_foto_off
    H_on = Ee_h_on                                          ' читаем время включения с ЕЕПРОМ
    H_off = Ee_h_off
If Foto => Foto_on And _hour >= H_on And _hour < H_off Then
    Light = 1
    Locate 1 , 10
         Lcd Chr(3)
    End If
If Foto <= Foto_off Or _hour => H_off Then
    Light = 0
    Locate 1 , 10
         Lcd Chr(4)
   End If
        End Sub
'######################## Условие работы компресора ############################
Sub Air_set
    Air_on = Ee_air_on                                      ' читаем время включения с ЕЕПРОМ
    Air_off = Ee_air_off                                    ' читаем время выключения с ЕЕПРОМ
If _hour >= Air_on And _hour < Air_off Then
 Air = 1
    Locate 2 , 6
         Lcd Chr(7)
    Else
    Air = 0
    Locate 2 , 6
         Lcd "."
   End If
        End Sub
'######################## Условие работы уф.лампы ##############################
Sub Uf_set
    If Weekday = 1 Then Uf_d = Ee_uf_1
    If Weekday = 2 Then Uf_d = Ee_uf_2
    If Weekday = 3 Then Uf_d = Ee_uf_3
    If Weekday = 4 Then Uf_d = Ee_uf_4
    If Weekday = 5 Then Uf_d = Ee_uf_5
    If Weekday = 6 Then Uf_d = Ee_uf_6
    If Weekday = 7 Then Uf_d = Ee_uf_7
 Uf_on = Ee_uf_on                                           ' читаем время включения с ЕЕПРОМ
 Uf_off = Ee_uf_off                                         ' читаем время выключения с ЕЕПРОМ
If _hour >= Uf_on And T_filter_off = 0 And _hour < Uf_off And Uf_d = 1 Then
    Uf = 1
    Locate 2 , 7
         Lcd Chr(6)
    Else
    Uf = 0
    Locate 2 , 7
         Lcd "."
   End If
        End Sub
'######################## Условие работы кормушки ##############################
  Sub Corm_set
   Corm_off = Ee_corm_off
If _hour = 7 Or _hour = 19 And _sec < Corm_off And Corn = 0 And _min = 0 Then
   Corm = 1
    Else
     Corm = 0
    End If
    If _sec = Corm_off Then
   Corn = 1
   Else
   Corn = 0
   End If
'#################### остановка фильтра во время кормления #####################
   If Corm = 1 Then
   T_filter_off = 20
   End If
If T_fil => 2 Then
   T_filter_off = 0 : T_fil = 0
  End If
End Sub
'######################## Условие работы фильтра ###############################
Sub Filter_set
      _min_real = _min
If _min_real <> _min_temp Then
   Decr T_filter_off : _min_temp = _min_real
   End If
If T_filter_off <= 0 Then
    T_filter_off = 0
   End If
    If T_filter_off = 0 Then
    Filter = 1
       Locate 2 , 8
            Lcd Chr(5)
     Else
    Filter = 0
      Locate 2 , 8
            Lcd "."
       End If
End Sub

Отредактировано driaman (2013-11-03 14:14:57)

0

16

Это нормально, т.к. в опросе датчиков  есть "Waitms 750", вот и считай, что при опросе датчиков МК отдыхает 1,5 сек, но часы то идут, поэтому когда он начинает снова опрашивать RTC, то время уже убежало, относительно прошлого опроса. Я решаю этот вопрос с помощью таймера, т.е. делаю опрос каждую 5-ю секунду, причем посылаю запрос на преобразование температуры на каждой 3-й секунде. Очень удобно, рекомендую. Кстати, если таймеров не хватает, ну еще что-нибудь считают, то можно использовать 7 вывод RTC и цепанув его на, INT0 например, ловить внешние прерывание каждую секунду и вести счет)) Но это если совсем не хватает таймеров или флеша)))

Отредактировано Алексей bird (2013-11-03 14:49:10)

0

17

У меня тоже есть вопрос по похожей тематике. У меня не хватает ног у атмеги8 для всех моих задумок, и думаю куда можно еще прицепить три канала для опроса датчиков DS18B20, ну чтобы они никому не мешали ну и им никто не мешал. Варианты такие: порт LCD, порт RXD/TXD(используется для связи двух МК, через преобразователь в 485 шину), есть еще порт для опроса кнопок, сделанный по вот такому способу http://easyelectronics.ru/podklyuchenie … strax.html Есть у кого похожий опыт?)))

Отредактировано Алексей bird (2013-11-06 07:32:07)

0

18

спасибо за разъяснение, в принципе на работу устройства не влияет а сидеть и следить за циферками никто не будет.
тоже пробовал датчики на один порт вешать но они мешают при работе на исполнение термостата, если не хватает ног то можно меню постоить на одном порту через резисторы, в нете встречал такую схему .

уменьшил 750 на 450 и все заработало как часики.. и показания не разбегаются.

Отредактировано driaman (2013-11-03 17:18:13)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » два датчика ds18b20 на одном порту