| PIC16F628A + DS1820 | 
|  | 
| 
 
 
 
 | wolfv | Дата: Вс, 04.01.2009, 12:34  |                                                                                                                Сообщение # 1 |  
 | ![wolfv]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 5
 
 
 Замечания: ± На сайте с 11.03.2008
 
 
 Статус: 
 Offline
 
 | Доброе время суток. Попытался сделать термометр на PIC16F628A, DS1820 вывод на ЖКИ Winstar WH1601. Схема в Proteus работает, хотя есть некая погрешность. При запуске на железе на ЖКИ выдает результат "654.11 С", при этом никак не зависит от температуры датчика. Подскажите пожалуйста в чем ошибка. Код:
  temperature Var Word ' Temperature storage count_remain Var Byte ' Count remaining
 count_per_c Var Byte ' Count per degree C
  DQ1 Var PORTA.0 ' One-wire data pin   Define LCD_DREG PORTB Define LCD_DBIT 4
 Define LCD_RSREG PORTA
 Define LCD_RSBIT 2
 Define LCD_EREG PORTA
 Define LCD_EBIT 3
 define LCD_LINES 1
 DEFINE LCD_BITS 4
 DEFINE LCD_COMMANDUS 2000
 DEFINE LSD_DATAUS 50
  CMCON=7
 TRISB = 0
 
 portb = %11110000	' Выводы, связанные с ЖКИ
 TRISA = %00000011	' A0 A1 на вход
 PORTA.0=1
  OWOut DQ1, 1, [$CC, $44] ' Старт измерения температуры 1
 Pause 1000
  mainloop: OWOut DQ1, 1, [$CC, $44] ' Start temperature conversion
  OWOut DQ1, 1, [$CC, $BE] ' Read the temperature OWIn DQ1, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, count_remain, count_per_c]
  ' Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature) temperature = (((temperature >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
 Lcdout $fe, 1, DEC (temperature / 100), ".", DEC2 temperature, " C"
    Pause 1000 ' Display about once a second Goto mainloop ' Do it forever
  Спасибо Прикрепления: 
						sh.bmp
							(355.1 Kb) |  
 |  |  |  | 
| 
 
 
 
 | ADMIN | Дата: Вс, 04.01.2009, 15:06  |                                                                                                                Сообщение # 2 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 20.08.2007
 
 
 Статус: 
 Offline
 
 | А датчик рабочий? Я так понял это программа из Samples? |  
 |  |  |  | 
| 
 
 
 
 | wolfv | Дата: Вс, 04.01.2009, 20:03  |                                                                                                                Сообщение # 3 |  
 | ![wolfv]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 5
 
 
 Замечания: ± На сайте с 11.03.2008
 
 
 Статус: 
 Offline
 
 | Да, из Samples. Датчик менял. Еще пробовал фрагмент кода из примера "U_А_Температуры" тоже не работает. |  
 |  |  |  | 
| 
 
 
 
 | ADMIN | Дата: Вс, 04.01.2009, 20:25  |                                                                                                                Сообщение # 4 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 20.08.2007
 
 
 Статус: 
 Offline
 
 | Тогда могу предположить, что где-то в железе проблемы. На всякий пожарный, попробуйте такой код.
 
 Code  
 Define LCD_DREG PORTB
 Define LCD_DBIT 4
 Define LCD_RSREG PORTA
 Define LCD_RSBIT 2
 Define LCD_EREG PORTA
 Define LCD_EBIT 3
 
 ' Allocate variables
 command var     byte            ' Storage for command
 i       var     byte            ' Storage for loop counter
 temp    var     word            ' Storage for temperature
 DQ      var     PORTA.0         ' Alias DS1820 data pin
 DQ_DIR  var     TRISA.0         ' Alias DS1820 data direction pin
 
 CMCON = 7              ' Set PORTA and PORTE to digital
 Pause 100               ' Wait for LCD to start
 
 Lcdout $fe, 1, "Temp in degrees C"' Display sign-on message
 
 ' Mainloop to read the temperature and display on LCD
 mainloop:
 Gosub init1820          ' Init the DS1820
 
 command = $cc           ' Issue Skip ROM command
 Gosub write1820
 
 command = $44           ' Start temperature conversion
 Gosub write1820
 
 Pause 1000      ' Wait 2 seconds for conversion to complete
 
 Gosub init1820          ' Do another init
 
 command = $cc           ' Issue Skip ROM command
 Gosub write1820
 
 command = $be           ' Read the temperature
 Gosub write1820
 Gosub read1820
 
 ' Display the decimal temperature
 Lcdout $fe, 1, dec (temp >> 1),".",dec(temp.0 * 5)," degrees C"
 
 Goto mainloop           ' Do it forever
 
 ' Initialize DS1820 and check for presence
 init1820:
 Low DQ                  ' Set the data pin low to init
 Pauseus 500             ' Wait > 480us
 DQ_DIR = 1       ' Release data pin (set to input for high)
 
 Pauseus 100             ' Wait > 60us
 If DQ = 1 Then
 Lcdout $fe, 1, "DS1820 not present"
 Pause 500
 Goto mainloop   ' Try again
 Endif
 Pauseus 400             ' Wait for end of presence pulse
 Return
 
 ' Write "command" byte to the DS1820
 write1820:
 For i = 1 to 8          ' 8 bits to a byte
 If command.0 = 0 Then
 Gosub write0    ' Write a 0 bit
 Else
 Gosub write1    ' Write a 1 bit
 Endif
 command = command >> 1  ' Shift to next bit
 Next i
 Return
 
 ' Write a 0 bit to the DS1820
 write0:
 Low DQ
 Pauseus 60              ' Low for > 60us for 0
 DQ_DIR = 1         ' Release data pin (set to input for high)
 Return
 
 ' Write a 1 bit to the DS1820
 write1:
 Low DQ                  ' Low for < 15us for 1
 @       nop                     ' Delay 1us at 4MHz
 DQ_DIR = 1        ' Release data pin (set to input for high)
 Pauseus 60             ' Use up rest of time slot
 Return
 
 ' Read temperature from the DS1820
 read1820:
 For i = 1 to 16         ' 16 bits to a word
 temp = temp >> 1        ' Shift down bits
 Gosub readbit   ' Get the bit to the top of temp
 Next i
 Return
 
 ' Read a bit from the DS1820
 readbit:
 temp.15 = 1             ' Preset read bit to 1
 Low DQ                  ' Start the time slot
 @       nop                     ' Delay 1us at 4MHz
 DQ_DIR = 1        ' Release data pin (set to input for high)
 If DQ = 0 Then
 temp.15 = 0     ' Set bit to 0
 Endif
 Pauseus 60              ' Wait out rest of time slot
 Return
 
 End
 
 |  
 |  |  |  | 
| 
 
 
 
 | demanik | Дата: Вс, 04.01.2009, 20:25  |                                                                                                                Сообщение # 5 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 448
 
 
 Замечания: ± На сайте с 11.12.2007
 
 
 Статус: 
 Offline
 
 | только что нарисовал схемку в протеусе и запустил ваш код работает все правильно. 
 Попробуй всё и вся... может быть пол...
 
 
   
 Сообщение отредактировал 
 
 demanik - Вс, 04.01.2009, 20:27
 
  |  
 |  |  |  | 
| 
 
 
 
 | ADMIN | Дата: Вс, 04.01.2009, 20:29  |                                                                                                                Сообщение # 6 |  
 |   
 
 Администратор
 
 
  Группа:
  Администраторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 1082
 
 
 Замечания: ± На сайте с 20.08.2007
 
 
 Статус: 
 Offline
 
 | Не ну он и говорит, что в протеусе работает |  
 |  |  |  | 
| 
 
 
 
 | demanik | Дата: Вс, 04.01.2009, 21:08  |                                                                                                                Сообщение # 7 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Помогаю всем
 
  
 Сообщений: 
 
 
 448
 
 
 Замечания: ± На сайте с 11.12.2007
 
 
 Статус: 
 Offline
 
 | Quote (basicpic) Не ну он и говорит, что в протеусе работает Невнимательно прочитал сообщение
   
 Попробуй всё и вся... может быть пол...
 
 
   |  
 |  |  |  | 
| 
 
 
 
 | wolfv | Дата: Вс, 04.01.2009, 21:41  |                                                                                                                Сообщение # 8 |  
 | ![wolfv]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 5
 
 
 Замечания: ± На сайте с 11.03.2008
 
 
 Статус: 
 Offline
 
 | Спасибо, попробовал предложный код, не видит датчика ("DS1820 not present" ).  . Странно, было куплено три новых датчика, один из них нормально работает в схеме с паразитным питанием. Оставшиеся два не работают, по крайней мере в такой схеме. |  
 |  |  |  | 
| 
 
 
 
 | holyuser | Дата: Вс, 04.01.2009, 23:17  |                                                                                                                Сообщение # 9 |  
 | ![holyuser]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Могу и подсказать
 
  
 Сообщений: 
 
 
 228
 
 
 Замечания: ± На сайте с 12.12.2007
 
 
 Статус: 
 Offline
 
 | Я тоже заметил подобное поведение DS18B20, уже писал об этом в одной из соседних тем - в режиме "parasite power", с кварцевым резонатором на 4.000 MHz, из десяти датчиков нормально работали шесть. На 3.579 и на 4.096 MHz работали все.
 При нормальном питании все 1-wire работали нормально при всех частотах генератора пика.
 |  
 |  |  |  | 
| 
 
 
 
 | Холод1 | Дата: Пн, 05.01.2009, 13:42  |                                                                                                                Сообщение # 10 |  
 | ![Холод1]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 35
 
 
 Замечания: ± На сайте с 19.10.2008
 
 
 Статус: 
 Offline
 
 | Привет! что вы парни мучаетесь, у него в самой программе ошибка
   в самом начале инецеализации датчика!
 Добавлено (05.01.2009, 1:42:46)---------------------------------------------
 mainloop: OWOut DQ, 1, [$CC, $44] ' Start temperature conversion
  waitloop: OWIn DQ, 4, [count_remain] ' Check for still busy converting If count_remain = 0 Then waitloop
 OWOut DQ, 1, [$CC, $BE] ' Read the temperature
 OWIn DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, count_remain, count_per_c]
 ' Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature)
 temperature = (((temperature >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
  вот как |  
 |  |  |  | 
| 
 
 
 
 | wolfv | Дата: Пн, 05.01.2009, 23:22  |                                                                                                                Сообщение # 11 |  
 | ![wolfv]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 5
 
 
 Замечания: ± На сайте с 11.03.2008
 
 
 Статус: 
 Offline
 
 | Нет, результат тот же   |  
 |  |  |  | 
| 
 
 
 
 | Холод1 | Дата: Ср, 07.01.2009, 09:57  |                                                                                                                Сообщение # 12 |  
 | ![Холод1]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 35
 
 
 Замечания: ± На сайте с 19.10.2008
 
 
 Статус: 
 Offline
 
 | Я подтягивающий резистор в норме? я сколько собирал схем с датчиками 1820 и 18В20 железо всё работало.
 Добавлено (07.01.2009, 9:57:07)---------------------------------------------
 к стати попробуй поменять вывод порта, у меня как то было такое с А портом.
 |  
 |  |  |  | 
| 
 
 
 
 | wolfv | Дата: Сб, 10.01.2009, 23:06  |                                                                                                                Сообщение # 13 |  
 | ![wolfv]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 5
 
 
 Замечания: ± На сайте с 11.03.2008
 
 
 Статус: 
 Offline
 
 | Проблема решилась установкой кварца на 4.000 MHz.  Всем спасибо за помощь! |  
 |  |  |  | 
| 
 
 
 
 | Холод1 | Дата: Вс, 11.01.2009, 14:18  |                                                                                                                Сообщение # 14 |  
 | ![Холод1]()  
 
 
 
 
  Группа:
  Пользователи
 
  Ранг: 
 
 Начал соображать
 
  
 Сообщений: 
 
 
 35
 
 
 Замечания: ± На сайте с 19.10.2008
 
 
 Статус: 
 Offline
 
 | Странно, у меня так всё работает уже не первый день   |  
 |  |  |  | 
| 
 
 
 
 | pic_anton | Дата: Ср, 24.02.2010, 21:30  |                                                                                                                Сообщение # 15 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Пытаюсь разобраться
 
  
 Сообщений: 
 
 
 58
 
 
 Замечания: ± На сайте с 18.02.2010
 
 
 Статус: 
 Offline
 
 | ребята а что так всемс нравиться ds1820 ведь программа большая получается не проще взять аналог типа LM50 
 Век живи, Век учись, и всего не постичь!!!
 |  
 |  |  |  |