PIC16F628A + DS1820
|
|
wolfv |
Дата: Вс, 04.01.2009, 12:34 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
А датчик рабочий? Я так понял это программа из Samples?
|
|
|
|
wolfv |
Дата: Вс, 04.01.2009, 20:03 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 11.03.2008
Статус:
Offline
|
Да, из Samples. Датчик менял. Еще пробовал фрагмент кода из примера "U_А_Температуры" тоже не работает.
|
|
|
|
ADMIN |
Дата: Вс, 04.01.2009, 20:25 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 11.03.2008
Статус:
Offline
|
Спасибо, попробовал предложный код, не видит датчика ("DS1820 not present" ). . Странно, было куплено три новых датчика, один из них нормально работает в схеме с паразитным питанием. Оставшиеся два не работают, по крайней мере в такой схеме.
|
|
|
|
holyuser |
Дата: Вс, 04.01.2009, 23:17 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
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 |
Группа:
Пользователи
Ранг:
Начал соображать
Сообщений:
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 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 11.03.2008
Статус:
Offline
|
Нет, результат тот же
|
|
|
|
Холод1 |
Дата: Ср, 07.01.2009, 09:57 | Сообщение # 12 |
Группа:
Пользователи
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 19.10.2008
Статус:
Offline
|
Я подтягивающий резистор в норме? я сколько собирал схем с датчиками 1820 и 18В20 железо всё работало.Добавлено (07.01.2009, 9:57:07) --------------------------------------------- к стати попробуй поменять вывод порта, у меня как то было такое с А портом.
|
|
|
|
wolfv |
Дата: Сб, 10.01.2009, 23:06 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
5
Замечания:
±
На сайте с 11.03.2008
Статус:
Offline
|
Проблема решилась установкой кварца на 4.000 MHz. Всем спасибо за помощь!
|
|
|
|
Холод1 |
Дата: Вс, 11.01.2009, 14:18 | Сообщение # 14 |
Группа:
Пользователи
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 19.10.2008
Статус:
Offline
|
Странно, у меня так всё работает уже не первый день
|
|
|
|
pic_anton |
Дата: Ср, 24.02.2010, 21:30 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
58
Замечания:
±
На сайте с 18.02.2010
Статус:
Offline
|
ребята а что так всемс нравиться ds1820 ведь программа большая получается не проще взять аналог типа LM50
Век живи, Век учись, и всего не постичь!!!
|
|
|
|