16f876a & ds18b20
|
|
hopi |
Дата: Чт, 03.02.2011, 15:31 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 09.12.2008
Статус:
Offline
|
Здраствуйте.Вытащил кусочек программы из более большой программы,т.к. нужно считывать температуру с датчика. По программе все более менее понятно!Косяк наверное в процедуре опроса датчика. Понятно откуда берется "-" и 65535($ffff) , или быть может 18b20 ничего не "отдает" ??? Sign = "-" TempC = ($FFFF - R_Temp + 1)/16 но почему темп не отображается???? Подскажите что не так.Заранее спасибо. ЖК в Протеусе7.7 выдает: -0.00 в дес.вид 1111111111111111 в дв. виде Вот исходник: DQ VAR PORTC.0 ' 18B20 Data Pin R_Temp VAR WORD ' RAW Temperature TempC VAR WORD ' Integer part of temp in deg C TempC1 VAR WORD ' Decimal part ColdBit VAR R_Temp.Bit11 ' Sign-Bit for +/- Temp. (1 - minus, 0 - plus) Sign VAR BYTE ' +/- sign TRISC = %11111111 ' Set PORTÑ to all input LCDOUT $FE, 1 main: LCDOUT $FE, $80, 5, Sign, DEC2 TempC, ".", DEC1 TempC1, 3, 4 LCDOUT $FE,$c0, bin R_Temp gosub calctemp GOTO main calctemp: OWOUT DQ, 1, [$CC, $44] ' Skip ROM & start conversion OWOUT DQ, 1, [$CC, $BE] ' Skip ROM & read temperature OWIN DQ, 2, [R_Temp.Lowbyte, R_Temp.Highbyte] gosub selsign return selsign: IF ColdBit = 1 THEN ' Below "0" deg C Sign = "-" TempC = ($FFFF - R_Temp + 1)/16 TempC1 = ($FFFF - R_Temp + 1)//16 TempC1 = TempC1*625/1000 ELSE Sign = "+" TempC = R_Temp/16 TempC1 = R_Temp//16 TempC1 = TempC1*625/1000 enDIF RETURN END
|
|
|
|
Matrix252005 |
Дата: Чт, 03.02.2011, 16:15 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Приятного времени суток. hopi, попробуйте так: if ColdBit1 <> 1 then ' расчет положительного значения tempcel1 = temptemp1 / 16 ' расчет целого числа t tempdes1 = (temptemp1 // 16) * 10 / 16 ' расчет дес числа t else ' расчет отрицательного значения tempcel1 = 65535 - temptemp1 tempdat1 = tempcel1 + 1 tempcel1 = tempdat1 / 16 tempdes1 = ((tempdat1 + 1) // 16) * 10 / 16 endif Замените все после "selsign:" и подставьте свои переменные
THE TRUTH IS OUT THERE.
С уважением, Николай.
Сообщение отредактировал
Matrix252005 - Чт, 03.02.2011, 16:21
|
|
|
|
hopi |
Дата: Чт, 03.02.2011, 16:54 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 09.12.2008
Статус:
Offline
|
Николай, получилось вот так,если я Вас правильно понял НО! в протеусе опять тоже самое, только без "-" И САМОЕ ИНТЕРЕСНОЕ что после 3х мин эмуляции показания начинают бегать ОТ и ДО(тоже самое было и в первом варианте программы) ColdBit1 VAR temptemp1.bit11 ' Sign-Bit for +/- Temp. (1 - minus, 0 - plus) Sign VAR BYTE tempcel1 var word tempdes1 var word tempdat1 var word temptemp1 var word TRISC = %11111111 ' Set PORTÑ to all input LCDOUT $FE, 1 main: LCDOUT $FE, $80, 5, Sign, DEC2 TempCel1, ".", DEC1 Tempdes1, 3, 4 LCDOUT $FE,$c0, bin temptemp1 gosub calctemp GOTO main calctemp: OWOUT DQ, 1, [$CC, $44] ' Skip ROM & start conversion OWOUT DQ, 1, [$CC, $BE] ' Skip ROM & read temperature OWIN DQ, 2, [temptemp1.Lowbyte, temptemp1.Highbyte] gosub selsign return selsign: if ColdBit1 <> 1 then tempcel1 = temptemp1 / 16 tempdes1 = (temptemp1 // 16) * 10 / 16 else tempcel1 = 65535 - temptemp1 tempdat1 = tempcel1 + 1 tempcel1 = tempdat1 / 16 tempdes1 = ((tempdat1 + 1) // 16) * 10 / 16 endif return end
|
|
|
|
Matrix252005 |
Дата: Чт, 03.02.2011, 17:01 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Вы не могли бы выложить весь проект??? (схему + исходник)
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
Matrix252005 |
Дата: Чт, 03.02.2011, 17:14 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
hopi, посмотрите и проверьте...
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
hopi |
Дата: Чт, 03.02.2011, 17:32 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 09.12.2008
Статус:
Offline
|
Вот программа с предложенным изменением. Приложение - скриншот работы схемы в протеусе. @ DEVICE PIC16F876a,HS_OSC DEFINE OSC 8 ' Oscillator freq. 8 MHz DEFINE LCD_DREG PORTB ' LCD Data port DEFINE LCD_DBIT 0 ' Starting Data bit DEFINE LCD_RSREG PORTB ' LCD Register Select port DEFINE LCD_RSBIT 4 ' LCD Register Select bit DEFINE LCD_EREG PORTB ' LCD Enable port DEFINE LCD_EBIT 5 ' LCD Enable bit DEFINE LCD_BITS 4 ' LCD bus size PAUSE 100 ' Wait for LCD to startup DQ VAR PORTC.0 ' Outside 18B20 Data Pin 'R_Temp VAR WORD ' RAW Temperature 'TempC VAR WORD ' Integer part of temp in deg C 'TempC1 VAR WORD ' Decimal part 'ColdBit VAR R_Temp.Bit11 ColdBit1 VAR temptemp1.bit11 ' Sign-Bit for +/- Temp. (1 - minus, 0 - plus) Sign VAR BYTE tempcel1 var word tempdes1 var word tempdat1 var word temptemp1 var word TRISC = %11111111 ' Set PORTÑ to all input LCDOUT $FE, 1 main: LCDOUT $FE, $80, 5, Sign, DEC2 TempCel1, ".", DEC1 Tempdes1, 3, 4 LCDOUT $FE,$c0, bin temptemp1 gosub calctemp GOTO main calctemp: OWOUT DQ, 1, [$CC, $44] ' Skip ROM & start conversion OWOUT DQ, 1, [$CC, $BE] ' Skip ROM & read temperature OWIN DQ, 2, [temptemp1.Lowbyte, temptemp1.Highbyte] gosub selsign return selsign: if ColdBit1 <> 1 then tempcel1 = temptemp1 / 16 tempdes1 = (temptemp1 // 16) * 10 / 16 else tempcel1 = 65535 - temptemp1 tempdat1 = tempcel1 + 1 tempcel1 = tempdat1 / 16 tempdes1 = ((tempdat1 + 1) // 16) * 10 / 16 endif return end Добавлено (03.02.2011, 17.32.14) --------------------------------------------- схема не вставляется
|
|
|
|
Matrix252005 |
Дата: Чт, 03.02.2011, 17:33 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
А где файл "DSN"??? Какой Вы используете экран??? Вы пробовали то, что я Вам скинул???
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
hopi |
Дата: Чт, 03.02.2011, 17:41 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 09.12.2008
Статус:
Offline
|
Николай! Ваш вариант работает!!!!!!! Иду разбираться))) СПАСИБО
Сообщение отредактировал
hopi - Чт, 03.02.2011, 17:43
|
|
|
|
Matrix252005 |
Дата: Чт, 03.02.2011, 17:42 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
То что Вам нужно???
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
hopi |
Дата: Чт, 03.02.2011, 17:45 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 09.12.2008
Статус:
Offline
|
Пока что этого хватит. Посмотрим как на готовом устройстве будет работать
|
|
|
|
Matrix252005 |
Дата: Чт, 03.02.2011, 17:46 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
636
Замечания:
±
На сайте с 12.10.2007
Статус:
Offline
|
Должно быть все
THE TRUTH IS OUT THERE.
С уважением, Николай.
|
|
|
|
rvstar |
Дата: Пт, 04.02.2011, 23:32 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
69
Замечания:
±
На сайте с 09.10.2007
Статус:
Offline
|
Попробуйте вытащить отсюда. программа под 876А, 100 % рабочая, сделано несколько сотен проектов Добавлено (04.02.2011, 23.32.51) --------------------------------------------- P.S. На сигнальную ногу датчика надо подвесить подтягивающий резистор 4К7
|
|
|
|
hopi |
Дата: Пн, 07.02.2011, 11:58 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
12
Замечания:
±
На сайте с 09.12.2008
Статус:
Offline
|
обязательно гляну.спасибо
|
|
|
|
Legioner |
Дата: Пн, 27.11.2017, 05:15 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
39
Замечания:
±
На сайте с 22.08.2015
Статус:
Offline
|
доброго дня, имеется проект на двух датчиках ds18b20 и pic16f876 все работает нормально, решил организовать что бы при одном из отключенном датчике на дисплей выводилась надпись "обрыв". но при экспериментах выяснился такой факт. При отключении первого датчика на дисплее отображается температура обоих датчиков 0,1 а при отключении второго датчика на дисплей выводится значение 4095. прошу подсказки и указание на мои кривые руки. За код сильно не пинайте я только учусь. Отрывок из кода прилагаю. Код DEFINE OSC 8 'Назначение частоты генератора 8 МГц define LCD_DREG PORTB 'Порт данных ЖКИ define LCD_DBIT 0 'Вывод порта Бит данных ЖКИ define LCD_RSREG PORTB 'Управление линией RS define LCD_RSBIT 4 'Вывод порта линией RS define LCD_EREG PORTB 'Управление линией E define LCD_EBIT 5 'Вывод порта линией E define LCD_BITS 4 'Разрядность шины данных define LCD_LINES 2 'Количество строк ЖКИ define LCD_COMMANDUS 2000 'Задержка перед посылкой данных define LCD_DATAUS 50 'Задержка перед посылкой данных define I2C_SDA PORTC.4 'Подключение часов к порту С define I2C_SCL PORTC.3 'Подключение часов к порту С '******************************************************************************* TRISB = %11000000 'Установка порта В c 0 по 5 в состояние выхода а с 6 по 7 как вход TRISC = %11111100 'Установка порта C в состояние выхода '******************************************************************************* TempDat1 VAR WORD ' RAW Temperature readings * TempCel1 VAR WORD ' Переменная для температура целое значение дачик №1 * TempDes1 VAR WORD ' Переменная для температура десят значение дачик №1 * TempTemp1 VAR WORD ' Переменная для температура временное значение дачик №1 * Busy1 VAR BIT ' Busy Status-Bit * Comm_Pin1 VAR portB.6 ' Переменная к какому выходу подключен датчик №1 * ColdBit1 VAR TempTemp1.Bit11' Отрицательное значение температуры датчика №1 * '******************************************************************************* TempDat2 VAR WORD ' RAW Temperature readings * TempCel2 VAR WORD ' Переменная для температура целое значение дачик №2 * TempDes2 VAR WORD ' Переменная для температура десят значение дачик №2 * TempTemp2 VAR WORD ' Переменная для температура временное значение дачик №2* Busy2 VAR BIT ' Busy Status-Bit * Comm_Pin2 VAR portB.7 ' Переменная к какому выходу подключен датчик №2 * ColdBit2 VAR TempTemp1.Bit11' Отрицательное значение температуры датчика №2 * '******************************************************************************* main: ind = 1 gosub Temp 'Перейти в подпрограмму Тemperatura 'Задержка 20 мс gosub Temp1 'Перейти в подпрограмму Temperatura1 ind = 0 lcdout $FE,1 lcdout $FE,$0C,"Temp: ",dec tempcel1,",",dec tempdes1," ",dec tempcel2,",",dec tempdes2 pause 500 '******************************************************************************* Temp: 'Начало подпрограммы Temperatura OWOUT Comm_Pin1, 1, [$CC, $44] Wait_Up: OWIN Comm_Pin1, 4, [Busy1] '* if busy1 = 0 then goto wait_Up endif '* OWOUT Comm_Pin1, 1, [$CC, $BE] OWIN Comm_Pin1, 2, [TempTemp1.Lowbyte, TempTemp1.Highbyte] if ColdBit1 <> 1 then tempcel1 = temptemp1 / 16 tempdes1 = (temptemp1 // 16) * 10 / 16 else tempcel1 = 65535 - temptemp1 tempdat1 = tempcel1 + 1 tempcel1 = tempdat1 / 16 tempdes1 = ((tempdat1 + 1) // 16) * 10 / 16 endif RETURN '******************************************************************************* Temp1: 'Начало подпрограммы Temperatura1 OWOUT Comm_Pin2, 1, [$CC, $44] '* Wait_Up1: OWIN Comm_Pin2, 4, [Busy2] '* if busy2 = 0 then goto wait_Up1 endif '* OWOUT Comm_Pin2, 1, [$CC, $BE] OWIN Comm_Pin2, 2, [TempTemp2.Lowbyte, TempTemp2.Highbyte] if ColdBit2 <> 1 then tempcel2 = temptemp2 / 16 tempdes2 = (temptemp2 // 16) * 10 / 16 else tempcel2 = 65535 - temptemp1 tempdat2 = tempcel2 + 1 tempcel2 = tempdat2 / 16 tempdes2 = ((tempdat2 + 1) // 16) * 10 / 16 endif RETURN Добавлено (27.11.2017, 05:15) --------------------------------------------- Ребята здесь есть кто живой???
|
|
|
|
xvovanx |
Дата: Пн, 27.11.2017, 09:22 | Сообщение # 15 |
Группа:
Модераторы
Ранг:
Помогаю всем
Сообщений:
332
Замечания:
±
На сайте с 02.05.2013
Статус:
Offline
|
Цитата Legioner ( ) Ребята здесь есть кто живой??? Ответил в другой теме про DS18B20
|
|
|
|