roboforum.ru

Технический форум по робототехнике.

Проблема со связкой Atmega32 DS18*20 PCF8583

Проблема со связкой Atmega32 DS18*20 PCF8583

Bpyh » 08 сен 2010, 13:13

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



Код: Выделить всёРазвернуть
Do

1wreset                                                     
1wwrite &HCC                                             
1wwrite &H44                                               




Waitms 750



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

Re: Проблема со связкой Atmega32 DS18*20 PCF8583

galex1981 » 08 сен 2010, 15:15

Полностью весь код выложите, тогда может помогу

Re: Проблема со связкой Atmega32 DS18*20 PCF8583

galex1981 » 08 сен 2010, 20:43

Код: Выделить всёРазвернуть
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Вот и вся проблема. При использовании стандартных библиотек для LCD, при использовании Timer1 следует его инициализировать только при непосредственным использованием, или включать LCD при непосредственным использованием, потому как библиотека LCD использует Таймер 1 и ты сам далее в программе его используешь - получается конфликт

Re: Проблема со связкой Atmega32 DS18*20 PCF8583

Bpyh » 08 сен 2010, 21:17

неа не помогло ! и библиотеку отключил и таймер убрал таже фигня . Идет раз два трииииииииии четыре пять.
Последний раз редактировалось EdGull 09 сен 2010, 07:19, всего редактировалось 1 раз.
Причина: Устное предупреждение! Запрещенно цитировать предыдущий пост!


Rambler\'s Top100 Mail.ru counter