Пока часы и термо - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Пока часы и термо
Пока часы и термо
mikhail09p Дата: Вс, 05.09.2010, 20:35  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Доброго времени суток, спецы и не очень smile
Такое дело:
Начал делать теморегулятор с привязкой ко времени и столкнулся из неприятным явлением - при выводе в 1 строку выводит иногда пургу, а иногда виснет вовсе! Когда был один термодатчик, то я писал побелы после цифр...
Короче, не пойму, может это Протеус, а то в железе ещё не успел попробывать?

Может, оператор PRINT использует прерывания и кофликтует с прерываниями в программе?
Нашол!!! Нужно так:
If SetupFlag = 1 Then ; чтобы не тратить время процессора, раз в секунду
SetupFlag = 0

Как включить два датчика для обработки одной подпрограммой, не подскажете?

Прикрепления: Vremya.rar(51Kb)

Сообщение отредактировал mikhail09p - Вс, 05.09.2010, 22:11
ЯНДЕКС Дата: 05.09.2010
ivan_fd Дата: Вс, 05.09.2010, 22:30  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 882
Репутация: 47   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (mikhail09p)
Как включить два датчика для обработки одной подпрограммой, не подскажете?

Сначала опрашиваете один датчик, выводите инфу. Потом другой, выводите инфу....
Или Вы хотите поставить 2 датчика на один порт?


Меня все время преследуют умные мысли...но я быстрее!!!
mikhail09p Дата: Вс, 05.09.2010, 22:56  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (ivan_fd)
Сначала опрашиваете один датчик, выводите инфу. Потом другой, выводите инфу.... Или Вы хотите поставить 2 датчика на один порт?

Как в подпрограмме разные порты писать?
А два датчика на один порт сложно? Хотя портов хватает.

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

Статус: Offline

Предлагаю выбросить:
REPEAT ' Начать внутренний цикл
DELAYMS 25 ' Ждать окончания преобразования пока не придет бит,
OREAD DQ, 4, [C] ' сигнализирующий об окончании преобразования
UNTIL C > 0 ' Выйти из цикла если от DS18S20 поступил бит конца преобразования.
А задействовать через таймер отсчет времени преобразования дтчика и тогда читать с него температуру. Так у Вас исчезнет огромная пауза (~750милисекунд!) в программе. Хотя хардварные прерывания игнорируют эту паузу остальная программа будет выполнятся без больших задержек. cool


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

mikhail09p Дата: Вс, 05.09.2010, 23:33  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (demanik)
А задействовать через таймер отсчет времени преобразования дтчика и тогда читать с него температуру.

Просто сделать задержку? А сколько?

И, кроме того, чтение температуры происходит раз в 10 сек. а в жизни поставлю в 20 или 30 сек.

Сообщение отредактировал mikhail09p - Вс, 05.09.2010, 23:39
demanik Дата: Пн, 06.09.2010, 00:25  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (mikhail09p)
Просто сделать задержку? А сколько?

Больше 750 примерно 760-770 милисекунд.
Quote (mikhail09p)
И, кроме того, чтение температуры происходит раз в 10 сек. а в жизни поставлю в 20 или 30 сек

Чем чаще будете опрашивать тем точнее будет теморегулятор. частота зависит от среды, температуру которой собираетесь поддерживать.


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

mikhail09p Дата: Пн, 06.09.2010, 22:01  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Больше 750 примерно 760-770 милисекунд. <br />
Погодите! А куда тогда подевается задержка в 750 мс???
<br /> <br />
Чем чаще будете опрашивать тем точнее будет теморегулятор. частота зависит от среды, температуру которой собираетесь поддерживать.
Поддерживать собираюсь температуру воздуха в доме с помощью газового котла "Житомир". <br />
А насчёт точности - есть мысль сделать несколько опросов и вывести среднеквадратичное значение. Делал кто-нить такое? <p>
И - вопрос остаётся в силе - Как включить два датчика для обработки одной подпрограммой?

Сообщение отредактировал mikhail09p - Пн, 06.09.2010, 22:06
demanik Дата: Пн, 06.09.2010, 22:34  |                                                                                                                Сообщение # 8
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (mikhail09p)
Погодите! А куда тогда подевается задержка в 750 мс???

задержка в 750 мс это время нужно датчику для преобразования температуры. Смотрите документацию на датчик.
Попорядку:
1. посылаем команду начало преобразования датчика1
2. обнуляем переменную счетчика времени преобразования датчика1, эта переменняа инкрементируется по прерыванию таймера
3. посылаем команду начало преобразования датчика2
4. обнуляем переменную счетчика времени преобразования датчика2, эта переменняа инкрементируется по прерыванию таймера

дальше эти четыре пункта игнорируются пока не прочитаем температуру

5. если переменная счетчика времени преобразования датчика1 насчитала больше 760-770 милисекунд посылаем команду читать температуру и принимаем температуру
6. аналогично п.5 только датчика2
7. остальная программа ...
8. переход к п.1
cool


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

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

Статус: Offline

Quote (mikhail09p)
Поддерживать собираюсь температуру воздуха в доме с помощью газового котла "Житомир".

Температура воздуха в комнате меняется сравнительно медленно, Я думаю мерять раз в 5-10секунд не помешает. Я всегда после приема температуры сразу опять запускаю начало преобразования и время опроса получается меньше секунды.

Quote (mikhail09p)
при выводе в 1 строку выводит иногда пургу, а иногда виснет вовсе!

Такая хрень от хардварных прерываний они могут перервать посылку к дисплею в любое время.


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

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

Статус: Offline

Quote (demanik)
5. если переменная счетчика времени преобразования датчика1 насчитала больше 760-770 милисекунд посылаем команду читать температуру и принимаем температуру

Это ж можно сделать спустя секунду - они у нас уже инкременуются! smile
Надо будет завтра попробывать реализовать. Отпадает мой последний вопрос.

Сообщение отредактировал mikhail09p - Пн, 06.09.2010, 22:46
demanik Дата: Пн, 06.09.2010, 22:47  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (mikhail09p)
Как в подпрограмме разные порты писать?

они у вас уже написаны:
SYMBOL DQ = PORTC.0 ' Подключить 1 DS18B20 к выводу PORTc.0
SYMBOL DQ2 =PORTC.1 ' Подключить 2 DS18B20 к выводу PORTc.1


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

mikhail09p Дата: Пн, 06.09.2010, 22:58  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 495
Репутация: 10   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Quote (demanik)
Такая хрень от хардварных прерываний они могут перервать посылку к дисплею в любое время.

А если на время вывода на дисплей запрещать прерывания (DISEBLE), а потом разрешать (ENEBLE) ?

Добавлено (06.09.2010, 22.58.40)
---------------------------------------------

Quote (demanik)
они у вас уже написаны: SYMBOL DQ = PORTC.0 ' Подключить 1 DS18B20 к выводу PORTc.0 SYMBOL DQ2 =PORTC.1 ' Подключить 2 DS18B20 к выводу PORTc.1

Я понял.
demanik Дата: Пн, 06.09.2010, 23:02  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (mikhail09p)
А если на время вывода на дисплей запрещать прерывания (DISEBLE), а потом разрешать (ENEBLE) ?

GIE = 0
PRINT...
GIE = 1

Но точность часов захромает. Проще использовать внешние часы с батарейкой и не будет проблем с пропаданием питания.


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

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

Статус: Offline

Quote (demanik)
1. посылаем команду начало преобразования датчика1 2. обнуляем переменную счетчика времени преобразования датчика1, эта переменняа инкрементируется по прерыванию таймера 3. посылаем команду начало преобразования датчика2 4. обнуляем переменную счетчика времени преобразования датчика2, эта переменняа инкрементируется по прерыванию таймера дальше эти четыре пункта игнорируются пока не прочитаем температуру 5. если переменная счетчика времени преобразования датчика1 насчитала больше 760-770 милисекунд посылаем команду читать температуру и принимаем температуру 6. аналогично п.5 только датчика2 7. остальная программа ... 8. переход к п.1

А ведь между 4 и 5 пунктами можно поместить часть программы. Или есть подводные камни?
demanik Дата: Пн, 06.09.2010, 23:07  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (mikhail09p)
А ведь между 4 и 5 пунктами можно поместить часть программы

Без проблем.


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

Форум Picbasic.ru » Программирование МК » Proton PicBasic » Пока часы и термо
Страница 1 из 212»
Поиск: