PIC16F628A + DS1820 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16F628A + DS1820 (Не работает на железе)
PIC16F628A + DS1820
wolfv Дата: Вс, 04.01.2009, 12:34  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 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(355Kb)
ЯНДЕКС Дата: 04.01.2009
ADMIN Дата: Вс, 04.01.2009, 15:06  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А датчик рабочий? Я так понял это программа из Samples?
wolfv Дата: Вс, 04.01.2009, 20:03  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 11.03.2008

Статус: Offline

Да, из Samples. Датчик менял. Еще пробовал фрагмент кода из примера "U_А_Температуры" тоже не работает.
ADMIN Дата: Вс, 04.01.2009, 20:25  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 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
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

только что нарисовал схемку в протеусе и запустил ваш код работает все правильно.

Попробуй всё и вся... может быть пол...


Сообщение отредактировал demanik - Вс, 04.01.2009, 20:27
ADMIN Дата: Вс, 04.01.2009, 20:29  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Не ну он и говорит, что в протеусе работает
demanik Дата: Вс, 04.01.2009, 21:08  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (basicpic)
Не ну он и говорит, что в протеусе работает

Невнимательно прочитал сообщение sad


Попробуй всё и вся... может быть пол...

wolfv Дата: Вс, 04.01.2009, 21:41  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 11.03.2008

Статус: Offline

Спасибо, попробовал предложный код, не видит датчика ("DS1820 not present" ). sad . Странно, было куплено три новых датчика, один из них нормально работает в схеме с паразитным питанием. Оставшиеся два не работают, по крайней мере в такой схеме.
holyuser Дата: Вс, 04.01.2009, 23:17  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 240
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Я тоже заметил подобное поведение DS18B20, уже писал об этом в одной из соседних тем -
в режиме "parasite power", с кварцевым резонатором на 4.000 MHz, из десяти датчиков нормально работали шесть. На 3.579 и на 4.096 MHz работали все.
При нормальном питании все 1-wire работали нормально при всех частотах генератора пика.
Холод1 Дата: Пн, 05.01.2009, 13:42  |                                                                                                                Сообщение # 10
Группа: Пользователи
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 19.10.2008

Статус: Offline

Привет!
что вы парни мучаетесь, у него в самой программе ошибка smile
в самом начале инецеализации датчика!

Добавлено (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
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 11.03.2008

Статус: Offline

Нет, результат тот же sad
Холод1 Дата: Ср, 07.01.2009, 09:57  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 19.10.2008

Статус: Offline

Я подтягивающий резистор в норме?
я сколько собирал схем с датчиками 1820 и 18В20 железо всё работало.

Добавлено (07.01.2009, 9:57:07)
---------------------------------------------
к стати попробуй поменять вывод порта, у меня как то было такое с А портом.

wolfv Дата: Сб, 10.01.2009, 23:06  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Новенький
Сообщений: 5
Репутация: 0   ±
Замечания:   ±
На сайте с 11.03.2008

Статус: Offline

Проблема решилась установкой кварца на 4.000 MHz. smile Всем спасибо за помощь!
Холод1 Дата: Вс, 11.01.2009, 14:18  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 19.10.2008

Статус: Offline

Странно, у меня так всё работает уже не первый день smile
pic_anton Дата: Ср, 24.02.2010, 21:30  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 63
Репутация: 0   ±
Замечания:   ±
На сайте с 18.02.2010

Статус: Offline

ребята а что так всемс нравиться ds1820 ведь программа большая получается не проще взять аналог типа LM50

Век живи, Век учись, и всего не постичь!!!
Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16F628A + DS1820 (Не работает на железе)
Страница 1 из 212»
Поиск: