Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik, ivan_fd  
Терморегулятор на PIC16F676
brown Дата: Пт, 13.08.2010, 23:05  |                                                                                                                Сообщение # 16
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Линии 0,1 порта С будут работать на вход и мешать не будут работающим на выход. А полученную цифру разряда сдвинте в лево на два разряда и передавайте в порт.

display1:
Cifra = LookUpL s,[%0000,%0001,%0010,%0011,%0100,%0101,%0110,%0111,%1000,%1001]
Cifra << 2
PORTC=Cifra
Return


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
Сообщение отредактировал brown - Пт, 13.08.2010, 23:19
mikhail09p Дата: Пт, 13.08.2010, 23:31  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Это сдвинуть для того, чтобы не мешать линиям 0,1 порта С, я правильно понял?
А вот как выделить 3 цифры - две целых и одну после запятой? Вот код получения температуры с датчика.

TERMO_Convert:

OWrite DQ, 1, [$CC,$44] ' Послать датчику DS18B20 команду старта измерения температуры
Repeat ' Начать внутренний цикл
DelayMS 25 ' Ждать окончания преобразования пока не придет бит,
ORead DQ, 4, [C] ' сигнализирующий об окончании преобразования
Until C > 0 ' Выйти из цикла если от DS18B20 поступил бит конца преобразования.
OWrite DQ, 1, [$CC,$BE] ' Послать команду чтения из ОЗУ датчика DS18B20 значения температуры
ORead DQ, 2, [R_Temp.LowByte, R_Temp.HighByte] ' Прочитать значение температуры и записать полученные два байта данных в переменную R_Temp типа Dword, младщий байт в R_Temp.LowByte и старший байт в R_Temp.HighByte
Temp = R_Temp
TempIND = Temp /16
If R_Temp > 64654 Then TempIND = Temp / 16 - 4095.93

brown Дата: Сб, 14.08.2010, 00:12  |                                                                                                                Сообщение # 18
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 333
Репутация: 12   ±
Замечания:   ±
На сайте с 18.09.2007

Статус: Offline

Уф! жара, не думается...
Вот когда-то писал-составлял попробуйте разобраться.
Прикрепления: Temp_7disp11.bas (7.3 Kb)


Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
ivan_fd Дата: Сб, 14.08.2010, 12:06  |                                                                                                                Сообщение # 19
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Смотрите пример роботы с ds1820, с примеров Протона.

И с проекта который я вам уже давал, процедура преобразования полученных значений.

Code
                    'Процедура перетворення температури
'******************************************************************************************************
     If Temp_read.11 = 1 Then  'Температура мінусова
         Sign = "-"
         Temp_read = ~Temp_read + 1  
     Else
         Sign = "+"
     EndIf
     TempC  = (Temp_read & $0FF0) >> 4  
     Float1 = Temp_read.LowByte & $0F
     Float0 = LookUpL Float1, [0,1,1,2,2,3,4,4,5,6,6,7,7,8,9,9]
     TemperC = (TempC * 10) + Float0
     Return

Потом выводим на дисплей.

DigitDisp = TemperC Dig 0 'Третя цифра
GoSub LOOK
CifraX = Cifra

DigitDisp = TemperC Dig 1 ' Как раз цифра с точкой как Вы и хотели.
GoSub LOOK
CifraX = Cifra + 128

DigitDisp = TemperC Dig 2 'Перша цифра
GoSub LOOK
CifraX = Cifra

mikhail09p Дата: Сб, 14.08.2010, 14:45  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
  
TempC  = (Temp_read & $0FF0) >> 4     
Float1 = Temp_read.LowByte & $0F      
Float0 = LookUpL Float1, [0,1,1,2,2,3,4,4,5,6,6,7,7,8,9,9]      
TemperC = (TempC * 10) + Float0

Почему сдвиг на 4?
Float0 - это после точки?

DigitDisp = TemperC Dig 1 ' Как раз цифра с точкой как Вы и хотели.

Почему "цифра с точкой"? Я думал точку засветить навсегда.

CifraX = Cifra + 128

Почему +128 ?

ivan_fd Дата: Сб, 14.08.2010, 16:07  |                                                                                                                Сообщение # 21
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Смотрите, как это я понимаю.

Quote (mikhail09p)
Почему сдвиг на 4?

Результат температуры в памяти термометра занимает 16 бит, разрешающая способность, в нашем случаи 12 бит.
Первые 4 бита в младшем разряде - это есть десятые градуса (бит3 - 0.5)(бит2 - 0.25)(бит1 - 0.125)(бит0 - 0.0625).
Вот по этому мы сначала маскируем 8 бит (целое значение температуры) (Temp_read & $0FF0) и сдвигаем на те 4 бита.
И в переменную TempC мы получим целое значение температуры.

Quote (mikhail09p)
Float0 - это после точки?

Да это после точки.

Quote (mikhail09p)
Почему "цифра с точкой"? Я думал точку засветить навсегда.

Можно светить и всегда, если индикатор однознаковый, но так не правильно.

Quote (mikhail09p)

CifraX = Cifra + 128

Почему +128 ?

Для индикатора с общим катодом, если вы получили код символа, и хотите чтобы отобразилась и точка, нужно прибавить 128.
С общим анодом нужно отнять 128.

ЯНДЕКС Дата: 14.08.2010
mikhail09p Дата: Сб, 14.08.2010, 16:20  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
Quote (mikhail09p)Почему "цифра с точкой"? Я думал точку засветить навсегда. Можно светить и всегда, если индикатор однознаковый, но так не правильно.

Куда я в моей схеме подключу точки?
Теморегулятор задумывается на температуру 18 - 40 градусов (точность нужна 0.1).
Индикатор однознаковый - это после запятой один знак ?

ivan_fd Дата: Сб, 14.08.2010, 16:38  |                                                                                                                Сообщение # 23
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Возьмите сдвиговый регистр, например 74HC595, для его управления хватит 3 портов, и точку будет куда подключить.
Quote (mikhail09p)
Индикатор однознаковый - это после запятой один знак ?

Я имел ввиду индикатор по одной цифре, а не все 4 в одном корпусе.

mikhail09p Дата: Сб, 14.08.2010, 16:52  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
Возьмите сдвиговый регистр, например 74HC595, для его управления хватит 3 портов, и точку будет куда подключить.

Регистра нет, а дешифратор есть.
Индикаторы однознаковые есть.
Сегодня на работе буду пробывать написать программу. Только плохо, там интернета нет...
Погодите! Я ж ошибся! Знаков то 3 ! Ещё одна линия нужна для управления нагрузкой!
Вот точно, жара - мозги плавятся.
Вот исправленая схема.

Прикрепления: 8358075.dsn (86.9 Kb)

Сообщение отредактировал mikhail09p - Сб, 14.08.2010, 16:54
ivan_fd Дата: Сб, 14.08.2010, 17:14  |                                                                                                                Сообщение # 25
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (mikhail09p)
Регистра нет, а дешифратор есть.

Дело конечно Ваше, но этот регистр, что я Вам написал, стоит 1.20 грн.
Тем более в Киеве его найти не проблема вообще.

mikhail09p Дата: Сб, 14.08.2010, 17:20  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
Дело конечно Ваше, но этот регистр, что я Вам написал, стоит 1.20 грн. Тем более в Киеве его найти не проблема вообще.

Да мне до Киева 6 часов ехать! Щас исправлю.
А не знаю, как исправить.

Сообщение отредактировал mikhail09p - Сб, 14.08.2010, 17:23
ivan_fd Дата: Сб, 14.08.2010, 17:40  |                                                                                                                Сообщение # 27
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

OffTop

Да исправить нельзя.

А мне до Киева 600 км, и ничего, все равно этих микросхем валом.

Беру в Интернет магазине.

mikhail09p Дата: Сб, 14.08.2010, 18:16  |                                                                                                                Сообщение # 28
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
А мне до Киева 600 км, и ничего, все равно этих микросхем валом. Беру в Интернет магазине.

Я тоже в интернет магазине - только ждать надо. Я в Вороне, а вы в каком, если не секрет?
А с другой стороны, всё равно надо разобратся с динамической индикацией. Вот когда индикаторы оживут у меня, то ещё и моргать будут. Но это чуть позже.
ivan_fd Дата: Сб, 14.08.2010, 20:38  |                                                                                                                Сообщение # 29
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

И я в Ворон-е, и в Имрад-е.

Разбиратся можно и без триггеров, только что б портов хватало. И что бы глаз не видел мигания разрядов желательно использовать
аппаратные прерывания.
Dmitry Дата: Сб, 14.08.2010, 22:18  |                                                                                                                Сообщение # 30
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 157
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (ivan_fd)
Вот по этому мы сначала маскируем 8 бит (целое значение температуры) (Temp_read & $0FF0) и сдвигаем на те 4 бита. И в переменную TempC мы получим целое значение температуры.

Ничего не надо маскировать, просто сдинуть вправо на 4 бита и все. Старшие 4 бита всегда нули с ds-ки приходят (для положительных температур), а младшие биты при сдвиге уходят "в никуда".
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: