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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Проблема со сборкой LCD DS18*20 PCF8538 тормоза секунд исчезает датчик


Проблема со сборкой LCD DS18*20 PCF8538 тормоза секунд исчезает датчик

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

1

Собственно проблема у меня такая когда на LCD отображаю 2 штуки ds18B20  , 2 штуки ds18S20 + PCF8538 (время формата ##:##:##) секунды как бы подтормаживают ,
а если менять задержку Waitms 750 на 250 (150) тормоза исчезают но 1 из 4 температурников пропадает .
Как я понял всё это как раз из за этой задержки так вот как побороть тормоза секунд и проблему с датчиком.

Код:
Do

1wreset                                                     
1wwrite &HCC                                              
1wwrite &H44                                               

[color=red]Waitms 750[/color]

Call Gettime
Text = Bcd(h) + ":" + Bcd(m) + ":" + Bcd(s)

Locate 1 , 1
Lcd Text


    1wverify Dsid1(1)
    1wwrite &HBE
    Sc(1) = 1wread(9)                                       
    If Sc(9) = Crc8(sc(1) , 8) Then

          If Dsid1(1) = 16 Then
          Dg = Decigrades(sc(9))                            
          End If

          If Dsid1(1) = 40 Then
          Dg = Decigrades2(sc(9))                           
          End If

    Ss = Str(dg)
    Ss = Format(ss , " 0.0")
    Locate 2 , 1
    Lcd "1 - " ; Ss ; Chr(0) ;
  End If


    1wverify Dsid2(1)
    1wwrite &HBE
    Sc(1) = 1wread(9)                                       
    If Sc(9) = Crc8(sc(1) , 8) Then
          If Dsid2(1) = 16 Then
          Dg = Decigrades(sc(9))                            
          End If

          If Dsid2(1) = 40 Then
          Dg = Decigrades2(sc(9))                          
          End If
    Ss = Str(dg)
    Ss = Format(ss , " 0.0")
    Locate 2 , 12
    Lcd "2 - " ; Ss ; Chr(0) ;
    End If


    1wverify Dsid3(1)
    1wwrite &HBE
    Sc(1) = 1wread(9)                                       
    If Sc(9) = Crc8(sc(1) , 8) Then
           If Dsid3(1) = 16 Then
          Dg = Decigrades(sc(9))                            
          End If

          If Dsid3(1) = 40 Then
          Dg = Decigrades2(sc(9))                           
          End If
    Ss = Str(dg)
    Ss = Format(ss , " 0.0")
    Locate 3 , 1
    Lcd "3 - " ; Ss ; Chr(0) ;
    End If



    1wverify Dsid4(1)
    1wwrite &HBE
    Sc(1) = 1wread(9)                                       
    If Sc(9) = Crc8(sc(1) , 8) Then
          If Dsid4(1) = 16 Then
          Dg = Decigrades(sc(9))                            
          End If

          If Dsid4(1) = 40 Then
          Dg = Decigrades2(sc(9))                           
          End If
    Ss = Str(dg)
    Ss = Format(ss , " 0.0")
    Locate 3 , 12
    Lcd "4 - " ; Ss ; Chr(0) ;
    End If
Loop


'get time




Sub Gettime
    Dim Dum As Byte
    I2cstart                                                'generate start
    I2cwbyte 160                                            'write addres of PCF8583
    I2cwbyte 2                                              'select second register
    I2cstart                                                'generate repeated start
    I2cwbyte 161                                            'write address for reading info
    I2crbyte S , Ack                                        'read seconds
    I2crbyte M , Ack                                        'read minuts
    I2crbyte H , Ack                                        'read hours
    I2crbyte Yd , Ack                                       'read year and days
    I2crbyte Wm , Nack                                      'read weekday and month
    I2cstop                                                 'generate stop


End Sub






Sub Settime(s As Byte , M As Byte , H As Byte , D As Byte , Month As Byte)
    'values are stored as BCD values so convert the values first
    S = Makebcd(s)                                          'seconds
    M = Makebcd(m)                                          'minuts
    H = Makebcd(h)                                          'hours
    D = Makebcd(d)                                          'days
    Month = Makebcd(month)                                  'months

    I2cstart                                                'generate start
    I2cwbyte 160                                            'write address
    I2cwbyte 0                                              'select control register
    I2cwbyte 8                                              'set year and day bit for masking
    I2cstop                                                 'generate stop


    I2cstart                                                'generate start
    I2cwbyte 160                                            'write mode
    I2cwbyte 2                                              'select seconds Register
    I2cwbyte S                                              'write seconds
    I2cwbyte M                                              'write minuts
    I2cwbyte H                                              'write hours
    I2cwbyte D                                              'write days
    I2cwbyte Month                                          'write months
    I2cstop
End Sub


'DS18b20


Function Decigrades2(byval Sc(9) As Byte)
 Decigrades2 = 0
 Decigrades2 = Makeint(sc(1) , Sc(2))
 Decigrades2 = Decigrades2 * 10
 Decigrades2 = Decigrades2 / 16
End Function


'DS18s20

Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer
Tmp = Sc(1) And 1                                           ' 0.1C precision
 If Tmp = 1 Then Decr Sc(1)
 T = Makeint(sc(1) , Sc(2))
 'Print Hex(t)
 'Print T

 T = T * 50                                                 'here we calculate the 1/10 precision like
 T = T - 25                                                 'DS18S20 data sheet
 T1 = Sc(8) - Sc(7)
 T1 = T1 * 100
 T1 = T1 / Sc(8)
 T = T + T1
 Decigrades = T / 10
'As integer, this routine gives T*10, with 1/10 degree precision
End Function

0

2

Не используй задержку (Waitms).
В место этого, настрой один из таймеров на время, примерно 800 мс и в ПП событий таймера, выставляй флаг.
В основном цикле, контроллируй этот флаг и как только он будет установлен - сбрасывай его и читай инфу с датчиков.

0

3

Ок попробую разобраться  это код собрал из того что было и того  что знал .
с таймерами пока не связывался или не вникал (сам незнаю).

0

4

или отображение инфы поставь на таймер. к примеру чтоб 2 раза в секунду инфа отображалась

Код:
Config Timer1 = Timer , Prescale = 8 : On Timer1 Bootons : ' подбери это Prescale = 8 значение опытным путем чтоб и не мигало и не тормозило.
     Enable Interrupts                                      'разрешаем прерывания
     Enable Timer1
do
'читаешь температуру 
loop

Bootons :
lcd "температура"
return

Отредактировано Pasha (2010-09-09 02:00:19)

0

5

Вобщем попробовал делать как посоветовал Pasha не вышло ни чё  . То ли я не так прописал .

Отредактировано Dimaska (2010-09-09 12:27:19)

0

6

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

или отображение инфы поставь на таймер

Там ведь ещё нужно разрешить работу таймера и разрешить прерывания!

Dimaska, в этой теме есть проект USB термометра, в котором используется принцип опроса датчика, описаный мною во втром посте этой темы.
Посмоти как там организован опрос датчика без использования задержки, в место которой использован таймер.

0

7

Пётр написал(а):

Там ведь ещё нужно разрешить работу таймера и разрешить прерывания!

исправил

0

8

Пётр
спасибо за подсказку.

Отредактировано Dimaska (2010-09-09 12:36:52)

0

9

Ещё раз всем спасибо за подсказки.
Ссегодня посветил 4 часа разборкам с таймером пытался понять почему 1 из 4 датчиков не успевает отработать в итоге выяснилось что  он битый
но как то странно битый  если делать опрос
вот в таком виде

Код:
1wreset                                                     
1wwrite &HCC                                            
1wwrite &H44
waitms 750

Все датчики отробатывают нормльно

если делать  так

Код:
Config Timer1 = Timer , Prescale = 1024 : On Timer1 Temperature :       
Enable Interrupts 
Enable Timer1

Do
'Тут выводим время и все датчики
loop
end
'Тут всё что касается DS18*20
Temperature:
Timer1 = 5
1wreset                                                     
1wwrite &HCC                                            
1wwrite &H44
1wreset
Return

то как раз этот битый датчик не пашет .

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

0


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » Проблема со сборкой LCD DS18*20 PCF8538 тормоза секунд исчезает датчик