1
В данном случае, это простейший, входной формирователь, с низким Rвх., но ничто не
мешает заменить его входным формирователем с более высоким Rвх.
Его принципиальную схему Вы можете найти: CD à папка Картинки à файл №86.gif.
При этом, нужно читать не к точке соединения 2-го и 3-го выводов PIC16F84A, а
к точке соединения 5-го и 6-го выводов PIC16F873A.
Рекомендации по настройке такого формирователя Вы найдете в 3-й части
"Самоучителя по программированию PIC контроллеров для начинающих".
Вот и вся доработка принципиальной схемы.
Если кто-то скажет, что это очень сложно, то напоминаю про монастырь и веру в
человечество.
А вот о "программной составляющей" такого сказать нельзя.
Это "иллюстрирует" тот факт, что "центр тяжести МК-дел явно смещен" в сторону этой
сАмой "программной составляющей".
А теперь, по-порядку.
Процедуру, которая реализует функцию частотомера, нужно куда-то "врЕзать".
В рабочий цикл режима ЗАЩИТА ВКЛЮЧЕНА "врезаться" не буду.
Мотивация.
1. Если запретить прерывания на время исполнения процедуры,
реализующей функцию частотомера, то это соответствует сильному
ухудшению инерционности срабатывания защиты.
2. Если разрешить прерывания на время исполнения процедуры,
реализующей функцию частотомера, то верхняя граница диапазона
измеряемых частот "срежется" до примерно 10 Кгц (округлено. Это те частоты,
которые будут замеряться с более-менее приемлемой погрешностью) и возникнут
проблемы, связанные со стабильностью интервала времени измерения (возможны
его "гуляния").
Напоминаю, что период ухода в прерывания составляет 90 мкс.
Значит нужно ориентироваться на наихудшую периодичность опроса состояния
флага T0IF порядка 100 мкс. Вот Вам и "потолок" в 10 Кгц.
Значит, буду "врезАться" в рабочий цикл режима ЗАЩИТА ВЫКЛЮЧЕНА, причем, с
запретом прерываний на время отработки процедуры, реализующей функцию
частотомера (это позволяет максимально реализовать "потенциал частотомера").
То, что это ухудшит инерционность срабатывания защиты от перегрева и защиты от
КЗ, однозначно.
Защита от перегрева достаточно инерционна и поэтому то, что она сработает,
например, на 0,5 сек. или даже на 1 сек. позднее, вполне терпимо.
С защитой от КЗ дела обстоят хуже, но куда деваться?
В данном случае, единственное, что можно сделать, так это только минимизировать
"провал защиты".
Его можно примерно приравнять интервалу времени измерения частоты.
Значит, нужно стремиться его уменьшить. Например, до 0,1 сек.
Это конечно сделать можно, но "шаг" измерения величиной 10 Гц. не вызывает у меня
положительных эмоций.
А вообще, это на любителя. В жизни всякое бывает нужным. Хаять не буду.
Если взять за основу интервал времени измерения 1 сек., то "точностные дела будут
выглядеть" гораздо лучше, но "провал" в 1 сек. это многовато.
Вот и "чеши репу"… Обкуришься думаючи.
В соответствии со своим понятием об оптимальном (на безгрешность не претендую), я
выбрал интервал времени измерения 0,5 сек., с последующим умножением на 2 (сдвиг
влево, на один бит, содержимого многобайтного регистра, в котором "лежит" двоичный
результат текущего измерения частоты).
Точка. Так тому и быть.
Следующий вопрос: "Куда выводить результаты измерения частоты и как это отразится
на том, что есть"?
Напряжение и ток должны контролироваться.
Защита от КЗ, хотя и с хренОвой (извиняюсь за непарламентское выражение)
инерционностью, но должна работать (лучше хоть какая-то защита, чем ее
отсутствие).
2
Температура должна контролироваться (если термодатчик электрически подключен
и включен в настройках).
"Резвость кручения пропеллера" должна зависеть от температуры, и
термозащита должна работать.
Короче, всё то же самое (с поправкой на инерционность срабатывания защит), плюс,
на индикацию должен выводиться результат текущего замера частоты.
Значит, нужно сохранить все упомянутое и "расчистить местечко" для результатов
замеров частоты.
Не нужно быть "гигантом мысли" для того чтобы понять, что их нужно выводить в 1-ю
строку дисплея, взамен информирующей надписи ЗАЩИТА ВЫКЛ. (если термодатчик
работает) или ЗАЩИТА ВЫКЛЮЧЕНА (если термодатчик не работает).
Для удобства пользователя, 8-разрядный результат измерения частоты сформирую не
в виде ХХХХХХХХгц, а в виде ХХ ХХХ ХХХгц, то есть, с "промежутками".
Так как нужно организовать и "промежуток" между показаниями частоты и температуры,
а знакомест всего 16, необходимо t=хх заменить на пробелtхх.
В общем виде, это будет выглядеть так:
ХХ ХХХ ХХХгц tхх
где ХХ ХХХ ХХХ - результат измерения частоты, а хх - результат измерения температуры.
Примечание: сначала, в результат измерения частоты, я хотел вставить
разделительные точки, но потом от этого отказался, так как, на мой взгляд, символы
"пусто" смотрятся симпатичнее. Особенно при нулевых показаниях (незначащие нули
будут гаситься).
Голос из-за кулис: "Ну ладно, шкуру не убитого медведя поделил (подтекст: на
выдумки все горазды), а как конкретно заполучить это счастье"?
Ответ: "заполучать это счастье" нужно строго поэтапно (напоминаю про план, здравый
смысл и их производные).
Для начала, нужно организовать "технологическую" процедуру включения/выключения
частотомера, ведь с этого и начинается "весь сыр-бор".
Пользователь должен сам решать, включить частотомер или его выключить.
Кроме этого, нужно организовать энергонезависимое запоминание соответствующей
настройки.
Под это дело, в меню установки порогов, организован
дополнительный пункт.
На картинке слева изображено, как он выглядит.
После отжатия кнопки Установка порогов, произведенного в
интервале времени "высвечивания" этой надписи, вдруг, откуда не возьмись, появится
тот символ маркера, к которому Вы уже должны привыкнуть.
Он установится в том положении, которое соответствует "старой" (последней) настройке
(она энергонезависимо запоминается).
После "прошивки" ПИКа, маркер установится перед надписью
ВЫКЛ (см. картинку слева).
То есть, частотомер будет выключен, и устройство будет работать
точно так же, как и до введения этого "наворота".
Для того чтобы изменить положение маркера, нужно нажать/отжать всё ту же кнопку
Установка порогов.
Для того чтобы включить частотомер, нужно установить маркер
перед надписью ВКЛ (см. картинку слева).
В дальнейшем, можно сколько угодно раз включать (если он
нужен) и выключать (если он не нужен) частотомер.
Это кому как захочется.
При любом изменении положения маркера, в EEPROM-память данных записывается
соответствующий признак, и вплоть до последующей смены положения маркера,
в 1-й строке дисплея, будет отображаться либо информирующая надпись (если
частотомер выключен), либо результат измерения частоты (если частотомер включен).
После того, как с помощью кнопки Установка порогов, маркер будет установлен перед
нужной надписью, необходимо нажать/отжать кнопку Переключение режимов.
Если частотомер выключен, то произойдет возврат в тот основной режим, из которого
вызывалось меню установки порогов, и устройство будет работать точно так же, как и
до организации этого "наворота".
3
Если частотомер включен, то вне зависимости от того, из какого основного режима
вызывалось меню установки порогов, произойдет возврат в режим ЗАЩИТА
ВЫКЛЮЧЕНА.
Он происходит без отработки сценария-подсказки режима ЗАЩИТА ВЫКЛЮЧЕНА (№2).
В режиме ЗАЩИТА ВЫКЛЮЧЕНА, при условии, что частотомер включен, этот
сценарий-подсказка (№2) игнорируется, а при условии, что частотомер выключен, не
игнорируется (по-моему, это выглядит логично).
Если частотомер включен и производится замер частоты, то Вы
увидите то, что изображено на картинке слева.
Естественно, что показания могут быть и другими.
Если источник сигнала к частотомеру не подключен, то будет "высвечиваться" 0гц., а
все остальные нули будут погашены.
Если необходимо перейти, из режима ЗАЩИТА ВЫКЛЮЧЕНА (с включенным
частотомером), в режим ЗАЩИТА ВКЛЮЧЕНА, то нужно "стандартно" нажать/отжать
кнопку Переключение режимов.
При этом, факт включения частотомера, на работе в режиме ЗАЩИТА ВКЛЮЧЕНА,
никак не отразится.
Нужно перейти "в обратную сторону"?
То же самое (кнопка Переключение режимов).
То есть, в части касающейся "механики" переключений основных режимов, никаких
изменений не произошло.
После смены режима ЗАЩИТА ВКЛЮЧЕНА на ЗАЩИТА ВЫКЛЮЧЕНА
(сценарий-подсказка отрабатываться не будет), опять, откуда не возьмись, "возникнет
визуальный скелет" того, что Вы видите на "вышележащей" картинке.
Давайте разберемся с тем, что Вы на ней видите.
Вы видите результат "комплексного" замера значений напряжения, тока,
температуры и частоты, причем, "всё в одном флаконе" и не "застывшее", а в
динамике. Это достаточно информативно, а заодно и удобно (на мой взгляд).
Частотомер (если он включен), работает автономно, и его работа не зависит
от того, запитывается ли что-то от блока питания или не запитывается.
То есть, можно одновременно и запитывать какое-то устройство, и измерять частоту
сигнала, формируемого другим устройством.
А можно и не запитывать, а только измерять частоту.
Можно и запитать источник сигнала, и измерить его частоту.
Последнее удобно в том случае, если в состав блока питания входит такая
"нужность", как генератор стандартных сигналов или генератор импульсов.
Если они высокочастотные, то можно "сваять" делитель на 10.
Ну и т.д. На мой взгляд, частотомер это "штуковина" нужная.
Лишь бы он был в наличии, а "прислонить его можно к разнообразным стенкам".
В данном случае, "шаг" измерения 2 герца, а "верхний потолок частоты" определяется
быстродействием ПИКа (как минимум, 30 Мгц.).
Немного отклонился от "генеральной линии".
Это для того, чтобы Вы представили себе, о чем ниже пойдет речь.
Теперь нужно разобраться с программной организацией соответствующего пункта меню
установки порогов.
Примечание: имейте в виду, что после возникновения дополнительных
функциональностей, название меню установки порогов стало слегка некорректным,
так как в нем "каждой твари по паре", но раз уж я изначально "привязался" к этому
названию, то пусть оно таким и останется.
Дополнительный пункт меню (под включение/выключение частотомера) я организовал так:
......................................
......................................
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
......................................
......................................
......................................
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
4
; ГРУППА КОМАНД ПРОГРАММНОГО ВКЛЮЧЕНИЯ/ВЫКЛЮЧЕНИЯ ТЕРМОДАТЧИКА.
;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
; Анализ состояния флага блокировки 4-го пункта меню.
;--------------------------------------------------------------------------------
btfsc Flag_1,4 ; Каково состояние флага ?
goto CHASTOTA ; Если поднят, то 4-й пункт меню не выводится
; на индикацию. Если опущен, то выводится.
......................................
......................................
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; ГРУППА КОМАНД ВКЛЮЧЕНИЯ/ВЫКЛЮЧЕНИЯ ЧАСТОТОМЕРА.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
CHASTOTA movlw .36 ; Задание времени (количества циклов)
movwf Temp ; "высвечивания" надписи
; "ЧАСТОТОМЕР/ВКЛ ОТКЛ".
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " ЧАСТОТОМЕР ".
;================================================================================
SNOVA_9 movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
bsf PCLATH,0 ; ПП TEXT_47 находится
; во 2-м блоке 2-й страницы.
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_47 ; для TEXT_47.
call SIMVOL_T_1 ;
decfsz Count,F ;
goto $-5 ;
;================================================================================
; Вывод на индикацию, в 2-ю строку, фиксированной надписи " ВКЛ ОТКЛ ".
;================================================================================
bcf PCLATH,0 ; ПП TEXT_43 находится
; в 1-м блоке 2-й страницы.
movlw b'11000001' ; Выбор 2-го знакоместа.
call ENTER_BF_1 ;
movlw .14 ;
movwf Count ;
movf Count,W ;
sublw .14 ; Аналогично, только
call TEXT_43 ; для TEXT_43.
call SIMVOL_T_1 ;
decfsz Count,F ;
goto $-5 ;
;--------------------------------------------------------------------------------
; Пауза между циклами вывода на индикацию.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Счет циклов.
;--------------------------------------------------------------------------------
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto FREG ; Если отжата, то переход в ПП
; включения/отключения частотомера.
decfsz Temp,F ; Если нажата, то цикл вывода надписи
; "ЧАСТОТОМЕР/ВКЛ. ОТКЛ." повторяется
goto SNOVA_9 ; до тех пор, пока счетчик не обнулится.
; После этого, программа исполняется далее.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; ГРУППА КОМАНД ВОЗВРАТА ИЗ РЕЖИМА.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
......................................
......................................
5
Дополнительный пункт меню установки порогов "врезан в промежуток" между пунктом
включения/выключения термодатчика и пунктом возврата из режима.
Соответственно, с целью обхода 4-го пункта меню (если термодатчик электрически
отключен), команда goto VOZVRAT заменена на команду goto CHASTOTA.
Пункт меню ЧАСТОТОМЕР / ВКЛ ОТКЛ, по сути, повторяет пункт меню
Термодатчик / ВКЛ ОТКЛ, только в приложении к надписи ЧАСТОТОМЕР
(организована дополнительная таблица вычисляемого перехода TEXT_47).
В случае выбора этого пункта меню, осуществляется переход в подпрограмму FREG.
Казалось бы, надпись ВКЛ ОТКЛ на индикацию выводить не нужно, ведь в случае
активности 4-го пункта меню, она выводится на индикацию ранее (зачем
подтверждать?), но это ошибка.
Если не вывести эту надпись на индикацию, то в том случае, если термодатчик
электрически не подключен (4-й пункт меню обходится), в 1-й строке дисплея "заторчит
инородная надпись" предыдущего пункта меню, что формально, не есть "Гитлер капут",
но фактически, является форменным безобразием, терпеть которое нельзя.
Поэтому и есть то, что есть.
Ладушки.
Один "вражина ликвидирован" (можно один раз кратковременно подуть в фанфары).
Пункт меню организован.
Теперь нужно "сваять переключалку/запоминалку".
От такой перспективы, дрожи в коленках вообще нет, так как эта "штуковина"
придумана ранее (имеется в наличии).
То есть, нужно "адаптировать переключалку/запоминалку" пункта Термодатчик ВКЛ ОТКЛ
под пункт ЧАСТОТОМЕР / ВКЛ ОТКЛ, и все дела (второе колесо изобретать не нужно).
В результате этой простой "комбинации из двух пальцев", получилось такое "творение":
......................................
......................................
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
......................................
......................................
......................................
;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
; Подпрограмма включения/отключения частотомера.
;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
FREG call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Чтение, из EEPROM, байта указателя включения/выключения частотомера.
;--------------------------------------------------------------------------------
call READ_F ; Реализация оного.
;--------------------------------------------------------------------------------
; Анализ содержимого указателя включения/выключения частотомера.
;--------------------------------------------------------------------------------
SNOVA_10 btfss Temp_F,0 ; Что в бите №0 ?
goto F_VIKL ; Если 0, то частотомер выключается.
; Если 1, то частотомер включается.
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
; Включение частотомера.
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;-------------------------------------------------------------------
movlw b'11000000' ; 2-я строка, 1-е знакоместо. Адрес 00h.
call ADRES_1 ; Установка адреса.
;-------------------------------------------------------------------
; Вывод на индикацию символа активности (маркера).
;-------------------------------------------------------------------
movlw 0DCh ; Символ ">|"
call SIMVOL_1 ; Вывод этого символа на индикацию.
;-------------------------------------------------------------------
6
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;-------------------------------------------------------------------
movlw b'11001010' ; 2-я строка, 11-е знакоместо. Адрес 0Ah.
call ADRES_1 ; Установка адреса.
;-------------------------------------------------------------------
; Вывод на индикацию символа "пусто".
;-------------------------------------------------------------------
movlw 20h ; Символ "пусто"
call SIMVOL_1 ; Вывод этого символа на индикацию.
;--------------------------------------------------------------------------------
goto OBHOD_6 ; Обход процедуры выключения частотомера.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Выключение частотомера.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;-------------------------------------------------------------------
F_VIKL movlw b'11001010' ; 2-я строка, 11-е знакоместо. Адрес 0Ah.
call ADRES_1 ; Установка адреса.
;-------------------------------------------------------------------
; Вывод на индикацию символа активности (маркера).
;-------------------------------------------------------------------
movlw 0DCh ; Символ ">|"
call SIMVOL_1 ; Вывод этого символа на индикацию.
;-------------------------------------------------------------------
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;-------------------------------------------------------------------
movlw b'11000000' ; 2-я строка, 1-е знакоместо. Адрес 00h.
call ADRES_1 ; Установка адреса.
;-------------------------------------------------------------------
; Вывод на индикацию символа "пусто".
;-------------------------------------------------------------------
movlw 20h ; Символ "пусто"
call SIMVOL_1 ; Вывод этого символа на индикацию.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; Опрос клавиатуры.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; Опрос кнопки "Переключение режимов".
;================================================================================
OBHOD_6 btfsc PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto $+8 ; Если отжата, то переход на опрос кнопки
; "Установка порогов".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Вывод на индикацию фиксированной надписи " СЛУШАЮСЬ и / ПОВИНУЮСЬ! ".
;--------------------------------------------------------------------------------
bcf PCLATH,3 ; Выбор 1-й страницы.
call SL_I_POVIN ; Переход в ПП вывода на индикацию
; этой надписи.
bsf PCLATH,3 ; Выбор 2-й страницы.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов"
; нажата или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
clrf PCLATH ; Выбор 1-го блока 1-й страницы.
goto INKEY ; После отжатия, выход из режима.
;================================================================================
; Опрос кнопки "Установка порогов".
;================================================================================
7
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto SNOVA_10 ; Если отжата, то переход на следующий
; внутренний цикл.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
incf Temp_F,F ; Смена состояния указателя
; включения/выключения частотомера
; (Temp_F + 1 = ...).
;================================================================================
; Запись, в EEPROM-память данных, признака включения/выключения частотомера.
;================================================================================
bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 7 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 07h.
movf Temp_F,W ; Temp_F -> W.
call WRITE ; Переход в элемент ПП записи.
;----------------------------------------------------------------------
; Проверка текущего значения признака включения/выключения частотомера.
;----------------------------------------------------------------------
btfss Temp_F,0 ; Что в бите №0 ?
goto SNOVA_10 ; Если 0 (частотомер выключен), то смена
; режима не производится.
bcf Trig,0 ; Если 1 (частотомер включен),
; то установка режима ЗАЩИТА ВЫКЛЮЧЕНА
call WR_TRIG ; и запись признака этого режима (0) в EEPROM.
;################################################################################
; НИЖНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ.
;################################################################################
......................................
......................................
Организован/"прописан" регистр общего назначения Temp_F.
В его бит №0 записывается признак включения (1) или выключения (0) частотомера.
Вопрос: "Почему нельзя организовать флаг (например, в регистре Flag_1)"?
Ответ: потому, что нужно энергонезависимо запомнить признак включения или
выключения частотомера.
Еще конкретнее: в ячейку EEPROM-памяти нельзя записать отдельный бит.
В нее можно записать только байт. Целиком. Без вариантов.
Это и есть мотивация.
Естественно, что с учетом сказанного, в ПП START, нужно считать, в регистр Temp_F,
байт признака включения/выключения частотомера, а иначе как понять, был ли (на
момент предыдущего выключения питания устройства) частотомер включен или
выключен?
Вот и получается:
......................................
......................................
START
......................................
8
......................................
;ОООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООО
; Идентификация электрического подключения термодатчика.
;ОООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООО
bsf PCLATH,3 ; Выбор текущего блока 2-й страницы.
call DQ_INIT ; Переход в ПП инициализации термодатчика.
;--------------------------------------------------------------------------------
; Чтение, из EEPROM, байта указателя программного
; включения/выключения термодатчика.
;--------------------------------------------------------------------------------
call READ_V_O ; Реализация оного (результат -> Temp_3).
;--------------------------------------------------------------------------------
; Чтение, из EEPROM, байта указателя включения/выключения частотомера.
;--------------------------------------------------------------------------------
call READ_F ; Реализация оного (результат -> Temp_F).
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Термодатчик ".
;================================================================================
movlw high TEXT_19; Выбор
movwf PCLATH ; 2-го блока 1-й страницы.
......................................
......................................
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
......................................
......................................
;================================================================================
; ПП чтения, из EEPROM, байта указателя включения/выключения частотомера.
;================================================================================
READ_F bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 7 ; Выбор ячейки EEPROM с адресом 07h.
call READ ; Переход в элемент ПП чтения.
movwf Temp_F ; Считывание байта, из выбранной ячейки,
; в регистр Temp_F.
bcf Status,RP1 ; Переход в 0-й банк.
return ; Возврат по стеку.
;================================================================================
......................................
......................................
Итак, буду считать, что на момент начала исполнения программы, в бите №0 байта
регистра Temp_F, "лежит" признак включения/выключения частотомера.
В начале ПП FREG, производится чтение байта признака включения/выключения
частотомера (call READ_F).
В принципе, это не обязательно (команду call READ_F можно убрать), так как такое
чтение было произведено в ПП START (на 1-м "витке" полного цикла программы), а в
дальнейшем (от 2-го "витка" и далее), признак включения/выключения частотомера, в
любом случае, оперативно запоминается в регистре Temp_F.
Но я посчитал более надежным считать признак включения/выключения частотомера из
EEPROM-памяти, нежели "уповать" на оперативную память.
От этого на душе спокойнее (она у меня очень привередливая).
Далее, происходит ровным счетом то же самое, что и в случае отработки пункта меню
включения/выключения термодатчика, только работа происходит не с указателем
включения/выключения термодатчика, а с указателем включения/выключения
частотомера (Temp_F), и признак включения/выключения частотомера записывается в
"свою, персональную" ячейку EEPROM-памяти (адрес 07h).
Примечание: после "прошивки" ПИКа, в эту ячейку, по умолчанию, записывается ноль
(частотомер выключен).
В самом конце ПП FREG (после завершения записи, в EEPROM, признака
включения/выключения частотомера), производится анализ текущего состояния указателя
включения/выключения частотомера (btfss Temp_F,0).
9
Если обнаруживается включение частотомера (Temp_F=1), то устройство
"принудительно" подготавливается к переходу в режим ЗАЩИТА ВЫКЛЮЧЕНА
(bcf Trig,0) и признак этого режима записывается в EEPROM-память (call WR_TRIG).
В дальнейшем, после нажатия/отжатия кнопки Переключение режимов, а также и после
выключения/включения питания устройства, будет отрабатываться режим ЗАЩИТА
ВЫКЛЮЧЕНА (без отработки сценария-подсказки).
Если обнаруживается выключение частотомера, то текущий режим не изменяется и в
дальнейшем, после нажатия/отжатия кнопки Переключение режимов, будет
полномасштабно отрабатываться тот основной режим, из которого вызывалось меню
установки порогов.
Еще раз ладушки (можно еще раз дунуть в фанфары).
"Менюшные дела сделаны".
"В сухом осадке", имеют место быть 2 сценария: частотомер включен и
частотомер выключен.
"Рулилкой" этих сценариев является бит №0 регистра Temp_F.
Предположим, что процедура измерения частоты имеется, и она работает так, что не
нарадуешься.
Вопрос: "Куда ее "засунуть"?
Ответ: лучше всего ее "засунуть" на 2-ю страницу памяти программ.
"Места там полно" и "ефрейторский суперзазорище цветет и пахнет".
Авось в дальнейшем пригодится. "Голубые дали" никто не отменял.
Примечание: с точки зрения "человека-калькулятора", сказанное есть идиотизм/маразм.
Эта точка зрения является его архибедой. "Такой солдат никогда не станет хорошим
(а не абы каким) генералом". По той причине, что подсознание не "включено в работу".
Это не мой (надеюсь, что и не Ваш) путь. Он безумно скучен и неказист.
Немного отвлекся (всякие мысли в голову приходят. Иногда в самый неподходящий
момент. Прошу прощения, если ими "достал").
Продолжаю в соответствующем духе (это не для "калькуляторов", а для… Домыслите
сами).
"Матка" сценария ЗАЩИТА ВЫКЛЮЧЕНА, в которой нужно организовать будущую
"свистопляску", "дислоцируется" на 1-й странице памяти программ.
В ней, в зависимости от того, включен частотомер или выключен, нужно организовать
соответствующие обходы.
Я это сделал так:
......................................
......................................
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
; Сценарий "ЗАЩИТА ВЫКЛЮЧЕНА". VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
......................................
......................................
;--------------------------------------------------------------------------------
; Опрос флага наличия/отсутствия термодатчика.
;--------------------------------------------------------------------------------
btfss Flag,1 ; Флаг наличия/отсутствия термодатчика
; поднят или нет ?
goto RABOTA_D ; Если термодатчик подключен, то переход
; в ПП RABOTA_D.
; Если термодатчик отключен, то программа
; исполняется далее.
;--------------------------------------------------------------------------------
; Проверка включения/выключения частотомера.
;--------------------------------------------------------------------------------
btfss Temp_F,0 ; Частотомер включен или выключен ?
goto OBHOD_7 ; Если выключен, то частота не замеряется и
; сценарий-подсказка №2 исполняется.
bsf PCLATH,3 ; Если включен, то выбор 2-й страницы PC.
call ZAMER_F ; Переход в процедуру измерения частоты.
clrf PCLATH ; Установка 1-го блока 1-й страницы.
12
б) Если термодатчик отключен, то символы температуры "уничтожаются" посредством
вывода на индикацию символов "пусто".
Получается
ХХ ХХХ ХХХгц
ХХ ХХХ ХХХ - частота.
Если C=0 (bcf Status,C), то в самый младший разряд результата измерения будут
выводиться четные числа, а если C=1 (bsf Status,C), то нечетные.
Это кому как нравится. Я установил в С ноль.
В любом случае, "шаг" измерения частоты равен двум герцам.
Вот, собственно говоря, и всё.
Остальное стандартно. В том смысле, что "разложено на молекулы" ранее.
Примечание: во избежание теоретически возможного "рака мозга", "через две
ступеньки прыгать" не нужно. Я дружески предупредил.
Ну и последнее.
Для того чтобы свести на нет ошибку первого (после включения питания устройства)
замера частоты, я, в ПП START, заблокировал счетный вход (запрет счета):
18
;================================================================================
START
......................................
......................................
clrf PortA ; Сброс защелок порта А (обеспечение закрытия
; транзистора и блокировки счета).
......................................
......................................
movlw b'11110011' ; RA2 работает на выход, RA3 блокирует счет.
movwf TrisA ; Остальные RA.. работают на вход.
......................................
......................................
20
до 90 градусов, с шагом 1 градус.
Диапазон изменения значений верхнего температурного порога: от 35 градусов
до 95 градусов, с шагом 1 градус.
Все значения верхнего температурного порога, которые превышают значения нижнего
температурного порога менее чем на 5 градусов, автоматически ("принудительно")
фиксируются на уровне Тв. = (Тн. + 5) градусов.
То есть, превышения Tв. над Тн., менее чем на 5 градусов, технически невозможны.
Более - можно.
После достижения минимального значения порогов, все действия, направленные на
дальнейшее их уменьшение, блокируются.
После достижения максимального значения порогов, все действия, направленные на
дальнейшее их увеличение, блокируются.
Диапазон изменения значений КЗ-порога: от 1,0 а. до 9,9 а., с шагом 0,1 а.
После достижения минимального значения КЗ-порога, все действия, направленные на
дальнейшее его уменьшение, блокируются.
После достижения максимального значения КЗ-порога, все действия, направленные
на дальнейшее его увеличение, блокируются.
Функциональность.
Любое изменение функциональности сопровождается надписями, которые отражают
это изменение, а также и подсказками.
После каждого включения питания, производится тест термодатчика на предмет
наличия или отсутствия его электрического подключения.
В зависимости от результатов этого теста, программные процедуры, связанные с
работой термодатчика, либо исполняются (термозащита работает), либо не
исполняются (термозащита не работает).
После окончания теста термодатчика, устройство может работать в одном из двух
основных режимов (ЗАЩИТА ВЫКЛЮЧЕНА и ЗАЩИТА ВКЛЮЧЕНА), с
возможностью "ручного" перехода в меню установки порогов.
В режиме ЗАЩИТА ВЫКЛЮЧЕНА, осуществляются:
- визуальный контроль текущих значений напряжения,
- визуальный контроль текущих значений тока,
- визуальный контроль текущих значений температуры,
- ШИМ-регулирование количества оборотов вентилятора
(в зависимости от температуры),
- защита от перегрева,
- защита от короткого замыкания,
- визуальный контроль текущих значений частоты
(если частотомер включен).
За 3 градуса до срабатывания термозащиты, выдается предупреждение, с визуально-
слуховым указанием количества градусов, оставшихся до срабатывания термозащиты.
После срабатывания термозащиты, на индикацию выводятся текущие значения
температуры и значения обеих термопорогов.
Если, в интервале времени менее 5-ти минут, текущая температура опустится ниже
нижнего температурного порога, происходит авторазблокировка и возврат в режим
ЗАЩИТА ВЫКЛЮЧЕНА.
Блок питания выключается (если используется устройство аварийного отключения БП):
- если сработала защита от короткого замыкания,
- если после срабатывания термозащиты, в течение примерно 5-ти минут,
температура не опустится ниже нижнего температурного порога,
- если после срабатывания термозащиты, температура поднимется более чем
на 3 градуса.
В режиме ЗАЩИТА ВКЛЮЧЕНА, осуществляются:
- визуальный контроль текущих значений напряжения,
- визуальный контроль текущих значений тока,
- защита от превышения порога напряжения,
- защита от превышения порога тока.
После срабатывания защиты по превышению порогов U/I, на индикацию выводится
числовое значение этого превышения с шагом:
21
- для U: 0,4 вольта,
- для I : 0,04 ампера.
Информирующие звуковые сигналы формируются после
- необнаружения электрического или программного подключения
термодатчика,
- срабатывания любого типа защиты,
- приближения к порогу срабатывания термозащиты от 3-х градусов и
менее,
- в случаях изменений числовых значений порогов, задаваемых в первых
трех пунктах меню установки порогов,
Устройство энергонезависимо запоминает:
- текущий режим работы,
- значения текущих порогов напряжения и тока,
- значения нижнего и верхнего температурных порогов,
- значение тока короткого замыкания,
- признак программного включения или выключения термодатчика,
- признак программного включения или выключения частотомера.
После включения питания устройства, эти параметры выставляются автоматически.
После "прошивки" PIC16F873А -I/SP, по умолчанию, выставляются:
- режим ЗАЩИТА ВЫКЛЮЧЕНА,
- порог U = 10,0 в., порог I = 1,00 а.,
- нижний Т-порог = 60 градусов, верхний Т-порог = 80 градусов,
- ток короткого замыкания = 9,9 ампера,
- термодатчик программно включен,
- частотомер программно выключен.
Энергонезависимое запоминание текущего режима работы происходит при каждом
переходе из режима в режим.
Значения остальных параметров пользователь может изменить в меню установки
порогов. При этом они автоматически запоминаются.
В меню установки порогов осуществляются:
- задание значений порогов U/I (защита по превышению порогов U/I),
- задание значений нижнего и верхнего термопорогов (термозащита),
- задание значения КЗ-порога (защита от короткого замыкания),
- программное включение или выключение термодатчика ( если он
электрически подключен),
- программное включение или выключение частотомера,
- возврат из меню в тот основной режим, из которого вызвано меню.
Внутри рабочих циклов обеих основных режимов, пользователь может вручную
отключить нагрузку от блока питания или подключить ее к нему.
Это происходит по "принципу RS-триггера".
Вентилятор.
Имеет место быть ШИМ-регулирование количества оборотов.
После включения питания устройства, вентилятор "разгоняется" до максимального
количества оборотов.
Если термодатчик электрически или программно отключен, то в дальнейшем,
количество оборотов не изменится и будет максимальным (в программе, можно
задать другое их количество).
Если термодатчик электрически и программно подключен, то после "разгона"
вентилятора, количество оборотов уменьшается до значения, определяемого первым
замером температуры.
Этот замер происходит непосредственно перед "влётом" в рабочий цикл любого из
режимов.
В рабочем цикле режима ЗАЩИТА ВКЛЮЧЕНА, количество оборотов и останется
таковым в течение всего времени слежения.
В рабочем цикле режима ЗАЩИТА ВЫКЛЮЧЕНА, количество оборотов вентилятора
будет прямо пропорционально зависеть от текущих значений температуры, которая
периодически замеряется.
В случае срабатывания термозащиты (превышен верхний температурный порог),
вентилятор переводится на максимальное количество оборотов (интенсивное
22
охлаждение).
В случае если в интервале времени менее 5-ти минут, температура опустится ниже
нижнего температурного порога, происходит авторазблокировка, и количество
оборотов вентилятора снова будет зависеть от текущих значений температуры.
Если термодатчик электрически и программно подключен, то в случае срабатывания
защиты от короткого замыкания, количество оборотов зафиксируется на том уровне,
который имел место быть на момент срабатывания этой защиты.
23
"Практикум по конструированию устройств на PIC контроллерах" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru
24