Терморегулятор на PIC16F676
|
|
brown |
Дата: Пт, 13.08.2010, 23:05 | Сообщение # 16 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
333
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 18.09.2007
Статус:
Offline
|
Уф! жара, не думается... Вот когда-то писал-составлял попробуйте разобраться.
Век живи - век учись! К концу жизни поймешь, что ничего не знаешь...
|
|
|
|
ivan_fd |
Дата: Сб, 14.08.2010, 12:06 | Сообщение # 19 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 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.
|
|
|
|
mikhail09p |
Дата: Сб, 14.08.2010, 16:20 | Сообщение # 22 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (ivan_fd) Quote (mikhail09p)Почему "цифра с точкой"? Я думал точку засветить навсегда. Можно светить и всегда, если индикатор однознаковый, но так не правильно. Куда я в моей схеме подключу точки? Теморегулятор задумывается на температуру 18 - 40 градусов (точность нужна 0.1). Индикатор однознаковый - это после запятой один знак ?
|
|
|
|
ivan_fd |
Дата: Сб, 14.08.2010, 16:38 | Сообщение # 23 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Возьмите сдвиговый регистр, например 74HC595, для его управления хватит 3 портов, и точку будет куда подключить. Quote (mikhail09p) Индикатор однознаковый - это после запятой один знак ? Я имел ввиду индикатор по одной цифре, а не все 4 в одном корпусе.
|
|
|
|
mikhail09p |
Дата: Сб, 14.08.2010, 16:52 | Сообщение # 24 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (ivan_fd) Возьмите сдвиговый регистр, например 74HC595, для его управления хватит 3 портов, и точку будет куда подключить. Регистра нет, а дешифратор есть. Индикаторы однознаковые есть. Сегодня на работе буду пробывать написать программу. Только плохо, там интернета нет... Погодите! Я ж ошибся! Знаков то 3 ! Ещё одна линия нужна для управления нагрузкой! Вот точно, жара - мозги плавятся. Вот исправленая схема.
Сообщение отредактировал
mikhail09p - Сб, 14.08.2010, 16:54
|
|
|
|
ivan_fd |
Дата: Сб, 14.08.2010, 17:14 | Сообщение # 25 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (mikhail09p) Регистра нет, а дешифратор есть. Дело конечно Ваше, но этот регистр, что я Вам написал, стоит 1.20 грн. Тем более в Киеве его найти не проблема вообще.
|
|
|
|
mikhail09p |
Дата: Сб, 14.08.2010, 17:20 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
OffTop Да исправить нельзя. А мне до Киева 600 км, и ничего, все равно этих микросхем валом. Беру в Интернет магазине.
|
|
|
|
mikhail09p |
Дата: Сб, 14.08.2010, 18:16 | Сообщение # 28 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Quote (ivan_fd) А мне до Киева 600 км, и ничего, все равно этих микросхем валом. Беру в Интернет магазине. Я тоже в интернет магазине - только ждать надо. Я в Вороне, а вы в каком, если не секрет? А с другой стороны, всё равно надо разобратся с динамической индикацией. Вот когда индикаторы оживут у меня, то ещё и моргать будут. Но это чуть позже.
|
|
|
|
ivan_fd |
Дата: Сб, 14.08.2010, 20:38 | Сообщение # 29 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
И я в Ворон-е, и в Имрад-е. Разбиратся можно и без триггеров, только что б портов хватало. И что бы глаз не видел мигания разрядов желательно использовать аппаратные прерывания.
|
|
|
|
Dmitry |
Дата: Сб, 14.08.2010, 22:18 | Сообщение # 30 |
Группа:
Пользователи
Ранг:
Могу и подсказать
Сообщений:
157
Замечания:
±
На сайте с 12.05.2009
Статус:
Offline
|
Quote (ivan_fd) Вот по этому мы сначала маскируем 8 бит (целое значение температуры) (Temp_read & $0FF0) и сдвигаем на те 4 бита. И в переменную TempC мы получим целое значение температуры. Ничего не надо маскировать, просто сдинуть вправо на 4 бита и все. Старшие 4 бита всегда нули с ds-ки приходят (для положительных температур), а младшие биты при сдвиге уходят "в никуда".
|
|
|
|