Открывалка для теплиц

Здесь обсуждаем устройства на МК и программы для них
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Открывалка для теплиц

Сообщение Mixer »

Идея немного автоматизировать дачный участок возникла еще давно. Для начала решил сделать автоматическое открывание форточек теплицы для проветривания. Пока схема такова:
Изображение

Одновременное нажатие кнопок UP и DOWN переключает режимы: отображение текущей температуры, max и min. При достижении t в теплицы уровня выше max - форточки открываются, при падении ниже min - закрываются. UP увеличивает значение, DOWN уменьшает. RESET перезагружает МК (на первое время, не будет глючить - уберу).
Собственно пару вопросов:
1. Индикация - два 7-ми сегментных индикатора. Для подключения думаю использовать защелку 74HC595 c интерфейсом I2C. Возможно есть варианты проще (кроме напрямую к ногам МК)?
2. Обычно на схемах к кварцу вешают пару конденсаторов - по 1 на каждую ногу. Номиналы разные попадаются - 22pF, 33pF, кто-то так вообще не вешает. Вобщем какой выбрать?
3. С движком еще не определился, но думаю это будет двигатель вольт на 12. Как бы реверс сделать?
4. Минус индикаторов лучше через транзистор сделать или можно напрямую через порт (см. рис. ниже)?
Изображение

Ну и по схеме еще может у кого какие замечания. :roll:
PIC16F628A
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Открывалка для теплиц

Сообщение rhf-admin »

1) Разве бывают 74hc595 с интерфейсом I2C? Это же просто сдвиговый регистр с буфером. Сначала за 8 тактов загружаются данные (последовательная загрузка), потом пином Output Enable разрешаем подачу получившегося сигнала на выходы (паралельный выход). Это кстати и есть самый простой вариант. Можно вместо этого взять 74hc164 - те же яйца, только без output enable. То есть в первом случае выходы можно включить только после того как переслали все 8 бит, а во втором случае выходы будут меняться в процессе передачи и только после пересылки всех 8-ми бит станут такими, какими мы задумали их видеть. Это нам, кстати, совершенно пофиг в случае с индикатором, поскольку если быстро данные засылать, то всё равно будет заметно только конечное состояние выходов. Ещё можно 74hc594, CD4094...
Можно взять микрухи с материнок для управления семисегментниками (не помню Smart что-там), но это будет сложнее, поскольку они уже управляются через интерфейс - smbus (основан на I2C).
2) Вешать надо, это для согласования ёмкости нагрузки генератора. Без них генератор будет нестабилен, при слишком больших ёмкостях он может вообще не стартануть. В некоторых кварцах кондёры уже встроены (такие трех-,четырех- ногие кварцы). Разброс достаточно большой, в доке на контроллер (в разделе про кварц) есть примерные цифры для кварцев на разные частоты. Оба кондёра должны быть одинаковые. Так что вешай хоть на 22, хоть на 33, лишь бы оба одинаковые.
3) Есть варианты. а) Моторчик постоянного тока из игрушки. Реверс - полярность поменял - вот и реверс. Управление - H-мост (можно на транзисторах, а можно микросхемы специальные). Для определения крайних положений (и отключения моторчика) можно концевики какие-нибудь использовать. б) Шаговый двигатель (например из дисковода 3,5"). В этом случае можно обойтись без концевиков. Посчитал сколько надо шагов для перехода из одного крайнего положения в другое и всё. А можно и те же концевики использовать. В дисководе же и микруху управления взять можно и концевики.
4) Зависит от индикатора, точнее от потребляемого им тока. Максимальный входной ток для контроллера - милиампер 20 по-моему. Соответственно, если для свечения одного сегмента надо меньше 20/8=2,5 мА, то можно прямо в контроллер, если больше 2,5 мА - надо через транзистор.
Зачем это вообще? Чтоб не светился всё время? Типа землю оторвал - он и погас? В случае с 74HC595 это можно сделать управляя линией OE. Она по-моему выходы может в z-состояние переводить, что даст такой же эффект, как и отрыв земли от индикатора (светиться ничего не будет). И ещё. Включать/выключать индикаторы (то есть землю отрывать/подключать у индикатора или OE у регистра) обязательно отдельно? А то если для обоих эти сигналы объединить - можно одну ногу МК сэкономить.
С уважением, администрация сайта.
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Открывалка для теплиц

Сообщение Mixer »

1. В какой-то статье автор про I2C на 74HC595 заикнулся. Если верить DS, передача почти такая же, как я на дисплей магнитолы делал. Устанавливается бит данных (DS), щелкаем clock'ом (SRCLK) - и так 8 раз. Щелкаем RCLK - теперь данные на выходе.
2. В режиме XT на 4МГц рекомендуется 15-30пФ. Поставил 2 по 33пФ.
3. От механники будет зависеть. Думаю будет коллекторник, если редукторы хорошие найду. Шаговики тоже есть, но их пока приберегу.
4. Подцеплю транзистор. У FYS-3912BS-21 ток 30мА. Транзистор на землю (точнее на +, т.к. у индикатора общий +) т.к. у регистра всего 8 выводов. Отобразим первую цифру (1й транзистор открыт, 2й закрыт), отобразим вторую (1й закрыт, 2й открыт) ну и так по кругу. Вобщем чтоб цифры не накладывались друг на друга. Либо как вариант поставить 2 регистра - по одному на каждый индикатор, хотя по количеству ног тут тоже самое.
PIC16F628A
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Открывалка для теплиц

Сообщение rhf-admin »

1. Только про OE не забудь. Выходы будут активны только когда на нём низкий уровень, а если высокий, то выходы переводятся в z-состояние.
4. Мне кажется 2 регистра предпочтительнее. Заслал в каждый из них данные и контроллер свободен, пока цифры не изменятся. А так придётся постоянно и довольно быстро слать то одну, то другую цифру, чтобы казалось, что две одновременно отображаются ("по кругу", как ты сам написал).

И ещё одно. По-моему смысл во внешнем кварце есть только в том случае, если ты собираешься режим sleep использовать (для энергосбережения). А так бы и внутренний генератор сгодился.
С уважением, администрация сайта.
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Открывалка для теплиц

Сообщение Mixer »

10 вывод подтянул на VCC, 13 на GND. Посмотрел, есть микрухи в корпусе SO-16, размеры 10 х 4 мм. Есть еще TSSOP16, но его, наверно, фиг припаяешь :lol: Так что думаю поставлю по одному на каждый индикатор.

По поводу кварца. Для интерфейса 1-Wire требуется умещаться в рамки тайм слотов. А внутренний генератор МК чувствителен к температуре за бортом. Внешний кварц в этом случае более стабилен. Температура в теплице в течение суток довольно прилично скачет, боюсь как бы у контроллера от перепада крышу не сорвало (ночью не закроет и все перемерзнет, или днем запрется и все сгорит). Да и режим энергосбережения тоже думаю использовать - раз в 10 минут померял и спать.

Для пущего изврата и просвещения ради решил замутить все на асьме :) Сразу такой вопрос: в DS на 15 странице показана карта памяти МК. Заметил что регистр STATUS располагается по адресам 03h, 83h, 103h и 183h. Для чего так сделано? Если я хочу перейти, допустим, в 1-й банк - в какой регистр мне лезть?

Код: Выделить всё

; RP1 RP0 Банк
;  0   0   0
;  0   1   1
;  1   0   2
;  1   1   3
; нужен допустим 1-й банк, по какому адресу обращаться?
bsf 03h,5
; или
bsf 83h,5
; или
bsf 103h,5
; или
bsf 183h,5
Такие же вещи обнаружил и с другими регистрами, например, PORTB есть по адресу 06h и 106h, TRISB - 86h и 186h. Тут без разницы куда писать или PORTB (106h) чем-то отличается от (06h)?
Еще вопрос по поводу TRISB. Адрес 86h - смещение 06h относительно адреса 1-го банка (80h). Чтобы в него записать, нужно перейти в банк 1 и записать данные в регистр по адресу 06h (со смещением как раз и получится 86h). А нельзя, находясь в нулевом банке обратиться сразу по адресу 86h? Команда BCF вроде позволяет обратиться по адресу от 0 до 127.

И еще - допустим есть какая-то обвязка, например, порт RA0 подтянут к +5 через резистор. На RB0 висит светодиод через резистор. Пока хочу поработать с RB0 (сделать его выходом), остальные порты не хочу задействовать. Как лучше оставшиеся порты настроить - на выход с низким значением (RA0-RA7,RB1-RB7=0) или на вход?
Последний раз редактировалось Mixer 19 июл 2010, 18:46, всего редактировалось 1 раз.
PIC16F628A
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Открывалка для теплиц

Сообщение rhf-admin »

Со сдвиговым регистром не нужно умещаться в рамки тайм-слотов. Он производит сдвиг содержимого и запись в последний разряд нового значения со входа только когда тактовый сигнал проходит. Нет тактового импульса - ничего не произойдёт. Ты можешь на входе выставить бит, подождать 2 часа, сходить покурить, и только потом дернуть clock - произойдёт запись и сдвиг, после этого выставить второй бит и дёрнуть clock через 100 мс - произойдёт сдвиг и запись второго бита. Можешь дёргать clock для разных битов через разные промежутки времени - пофиг, главное что запись происходит только при этом дёрганьи сигнала clock, соответственно, прежде чем его дернуть нужно на входе установить следующий бит. Хотя если использовать режим sleep, то внешний кварц всё равно нужен.

Как ты правильно заметил обращаться можно по адресам до 127, что в шестнадцатиричной системе равно 7Fh, то есть из нулевого банка ты никак не можешь обратиться сразу по адресу 86h, поскольку 86h>7Fh. То есть запись bsf 83h,... и тем более bsf 103h,... неправильна.
У некоторых регистров сквозная адресация для удобства, у регистра STATUS - необходимость, поскольку в нём переключаются банки. Обращаясь в любом банке по адресу 03h мы попадаем в регистр STATUS, хотя обращаясь по адресу 03h из нулевого банка мы фактически обращаемся по адресу 03h, из первого банка фактически обращаемся по адресу 80h+03h=83h, из второго банка фактически обращаемся по адресу 100h+03h=103h и т.д.
Те адреса, которые пишутся в командах - это адреса относительно начала банка, то есть это не абсолютные адреса ячеек памяти, а относительные. То есть если команда выполняется когда установлен первый банк, то к адресам в команде прибавляется 80h, если установлен второй банк, то к адресам прибавляется 100h и т.д.
Если бы регистр STATUS располагался только по адресу 03h, то перейдя из нулевого банка в первый мы никогда бы не смогли вернуться обратно в нулевой, поскольку обращаясь в первом банке по адресу 03h мы фактически обращаемся по адресу 83h (смещение первого банка = 80h + относительный адрес 03h).

В принципе всё просто. Если тебе нужен регистр, который находится не в том банке, в котором ты сейчас находишься, то для доступа к нему сначала нужно переключиться в тот банк, где он находится, а потом обращаться к нему по смещению относительно начала банка. Например, мы находимся в нулевом банке и хотим обратиться к регистру TRISB (адрес 86h, первый банк). Для этого нам надо сначала переключиться в первый банк, а потом обратиться по адресу 06h (смещение относительно 80h).

Если у регистра сквозная адресация через все банки, то к нему можно обращаться по относительному адресу не переключая банки. Например, чтобы перейти из нулевого банка в первый - нужно установитьв единицу бит RP0 (5-й бит регистра STATUS). Это делается командой bsf 03h,5. Для того, чтобы перейти из первого банка в нулевой нужно 5-й бит регистра STATUS сбросить: bcf 03h,5.

Незадействованные и не подключенные порты лучше настроить как выходы, без разницы что туда будет подано (1 или 0), но лучше как выходы. Входы контроллера достаточно высокоомные и если незадействованные входы не подтягивать снаружи к земле или питанию, то туда могут наводиться самые невероятные наводки, что может сказаться на работе контроллера.

P.S. Я тут кой-чего накропал про программирование контроллеров на ассемблере, правда это совсем уж базовый курс, но может что полезное найдёшь:
http://radiohlam.ru/teory/progr_asm_1.htm
http://radiohlam.ru/teory/progr_asm_2.htm
http://radiohlam.ru/teory/progr_asm_3.htm
http://radiohlam.ru/teory/progr_asm_4.htm
http://radiohlam.ru/teory/progr_asm_5.htm
С уважением, администрация сайта.
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Открывалка для теплиц

Сообщение Mixer »

Я имел ввиду DS18S20 - он по протоколу 1-Wire работает.
Вопрос по последовательному подключению регистров через вывод Q7' (pin 9). Вот схема. Если я правильно понял - отправляем мы на DS первого регистра 16 бит и получается - младшие 8 бит (0 - 7) у нас оказываются во втором регистре (снизу), а старшие (8-15) в первом?
rhf-admin писал(а):P.S. Я тут кой-чего накропал про программирование контроллеров на ассемблере, правда это совсем уж базовый курс, но может что полезное найдёшь:
Так я по ним и разбираюсь :D
PIC16F628A
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Открывалка для теплиц

Сообщение rhf-admin »

Точно, там же ещё DS18S20 будет, а я тут на одних регистрах зациклился. Пардон.
Младшие, старшие. Башка кругом. Те биты, которые первыми пошлёшь окажутся во втором регистре (нижнем), следующие 8 бит окажутся в первом регистре (верхнем).
С уважением, администрация сайта.
Mixer
инженер, читатель
инженер, читатель
Сообщения: 70
Зарегистрирован: 27 ноя 2009, 00:45

Re: Открывалка для теплиц

Сообщение Mixer »

Возникла такая проблема, нужно посчитать формулу:
TEMPERATURE = TEMP_READ - 0.25 + (COUNT_PER_C - COUNT_REMAIN) / COUNT_PER_C

COUNT_PER_C как я понял всегда равно 16 или 15. Грубое деление на 16 без остатка я так понял это просто сдвиг вправо на 4 бита. А вот с остатком? Думаю все это дело умножить на 100 и так с этим работать. Или есть более изящный способ?

Второй вопрос - сколько времени занимает выполнение одного слова или цикла для кварца 4Мгц? Ориентируюсь на микрочиповский сайт. Поставил MPLAB 7.42.0.0, не могу найти где там время посмотреть в симуляторе.
PIC16F628A
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Открывалка для теплиц

Сообщение rhf-admin »

1) Более изящного способа я не знаю, иначе придётся с форматами чисел работать, для деления специальные алгоритмы писать, короче гемор жуткий :roll: :roll: :roll:
2) Одна команда выполняется по-моему за 1 или 2 машинных цикла и занимает 1 или 2 мс при тактовой 4 МГц (вроде так). Какие команды выполняются за 1, а какие за 2 м.ц. указано в доке, в том месте, где команды описаны.
У меня MPLAB 5.7.4, там в меню Window есть вкладка Stopwatch... При нажатии на неё появляется окно, в котором по ходу отладки считаются машинные циклы и время выполнения для указанной тактовой частоты. В свойствах проекта (Edit Project-> Development mode Change) на вкладке clock можно задать частоту.
С уважением, администрация сайта.
Ответить

Вернуться в «Устройства на микроконтроллерах»