Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; ПОДПРОГРАММА ПРЕРЫВАНИЯ. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; Процедура сохранения содержимого регистров Status и W.
;================================================================================
; Определение банка, из которого осуществлен уход в прерывание.
;--------------------------------------------------------------------------------
btfsc Status,RP0 ; Из какого банка осуществлен уход
; в прерывание ?
goto BANK_1 ; Если это 1-й банк, то переход на метку
; BANK_1.
; Если это 0-й банк, то программа
; исполняется далее.
Третий вариант.
Например, во время отработки какой-то подпрограммы или группы команд, "лежащей"
на 2-й странице памяти программ, нужно обеспечить уход в прерывания.
Эта ПП или группа команд переносится из 2-й страницы в 1-ю (при этом, группе
команд присваивается статус ПП).
После этого, в ней, совершенно обычнейшим образом, организуется "зона" разрешения
прерываний.
И все дела.
4
При этом, ПП прерывания "остается совершенно нетронутой" и можно уходить в
прерывания как с 0-го банка, так и с 1-го банка.
По сравнению с двумя предыдущими вариантами, "командного проигрыша" нет.
Условно/упрощенно говоря, в этом случае, нужно только организовать переход из
"пункта А" 2-й страницы, в "пункт Б" 1-й страницы (напоминаю про "ефрейторский
суперзазорище"), "зону" разрешения прерываний и возврат из "пункта Б" 1-й страницы
в "пункт А" 2-й страницы.
На мой взгляд, в данном случае, именно этот вариант и является наиболее
предпочтительным (субъективный выбор).
Его и реализовал.
Общее замечание: теоретически, я мог бы "выдать на гора" конечный результат и, как
говорится, будь здоров, но "внутренний цензор" не позволяет.
Говорит: "Придушу если ослушаешься".
Собственно говоря, я и не думаю перечить, так как осознаю его правоту.
И в самом деле, нужно же объяснить людям, почему именно так, а не эдак, а заодно
и показать "кухню" практической работы (без "мыльных пузырей" и "пены").
Последнее - самое главное.
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
...................................
...................................
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; ПП РАБОТЫ С ТЕРМОДАТЧИКОМ. DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; "Администраторская" группа команд.
;================================================================================
TERMO call DQ_INIT ; Инициализация датчика.
;--->Возврат по стеку из ПП DQ_INIT
movlw 0CCh ; Выполнение команды
call WIRE ; "Skip_ROM".
;--->Возврат по стеку из ПП WIRE
movlw 44h ; Выполнение команды
5
call WIRE ; "Start_Conv".
;--->Возврат по стеку из ПП WIRE
;--------------------------------------------------------------------------------
; Анализ состояния флага "одноразовой" задержки.
;--------------------------------------------------------------------------------
btfsc Flag,0 ; Каково состояние флага
; "одноразовой" задержки ?
goto OBHOD_5 ; Если он поднят (1), то обход задержки.
; Если он опущен, то программа
; исполняется далее.
;--------------------------------------------------------------------------------
; "Одноразовая" задержка.
;--------------------------------------------------------------------------------
movlw .100 ; Reg_1=Reg_2=.100
movwf Reg_1 ; Reg_3:
movlw .100 ; .11 и менее -> хрень
movwf Reg_2 ; (2047759м.ц.*0,2=409551,8 мкс.)
movlw .20 ; .12 -> норма
movwf Reg_3 ; (2244881м.ц.*0,2=448976,2 мкс.)
; .20 -> использовано
; (382185м.ц.*0,2=764371,4 мкс.)
decfsz Reg_1,F ;
goto $-1 ; Стандартный,
decfsz Reg_2,F ; 3-байтный,
goto $-3 ; вычитающий
decfsz Reg_3,F ; счетчик.
goto $-5 ;
bsf Flag,0 ; Флаг "одноразовой" задержки поднимается.
;--------------------------------------------------------------------------------
; Ожидание окончания температурного преобразования.
;--------------------------------------------------------------------------------
OBHOD_5 bcf PCLATH,3 ; Выбор 1-й страницы.
call PAUSE_2 ; Переход в ПП PAUSE_2.
;--->Возврат по стеку из ПП PAUSE_2
bsf PCLATH,3 ; Выбор 2-й страницы.
;--------------------------------------------------------------------------------
call DQ_INIT ; Инициализация датчика.
;--->Возврат по стеку из ПП DQ_INIT
movlw 0CCh ; Выполнение команды
call WIRE ; "Skip_ROM".
;--->Возврат по стеку из ПП WIRE
movlw 0BEh ; Выполнение команды
call WIRE ; "Read_Scratchpad".
;--->Возврат по стеку из ПП WIRE
;--------------------------------------------------------------------------------
; Чтение младшего байта температуры.
;--------------------------------------------------------------------------------
...................................
...................................
6
Хорошая была задержка. Интеллектуальная, изящная и уважаемая.
Ну не повезло ей. "Не попала в текущую струю".
Поэтому "убивать" ее рука не поднимается.
Будем считать, что она "ушла в заслуженный отпуск".
Примечание: флаг Flag,0 не удален. Он просто сменил функциональность (см. ниже).
Вместо "плавающей" задержки, применена стандартная, фиксированная задержка.
Ей присвоен статус подпрограммы с названием PAUSE_2, и в полном соответствии со
сказанным выше, она помещена на 1-й странице памяти программ (в нижней "обслуге").
В ПП PAUSE_2, организована "зона" разрешения прерываний.
Далее возникает уважаемый вопрос: "Какой должна быть величина этой задержки"?
И этот вопрос нельзя "непринужденно закидать шапками", так как задержка находится
в "зоне" разрешения прерываний.
То есть, рабочая точка программы будет из нее "отлучаться" с периодичностью
в 100 мкс.
Ранее, был "обнародован" такой практический результат: 100 мкс. = 86 мкс. + 14 мкс.
86 мкс. это приблизительное время отработки ПП прерывания.
14 мкс. это "довесок/хвостик", в течение которого происходит работа в "основном теле"
программы.
То есть, фиксированная задержка, "лежащая" в "зоне" разрешения прерываний, будет
отрабатываться "кусочно-рвано" (не за один, а за несколько приемов).
Соответственно, время отработки такой задержки будет бОльшим, чем ее рассчетное
время.
И тем бОльшим, чем меньшим будет "довесок/хвостик".
Почему?
Потому, что рассчетное время "ориентировано" на отработку задержки за один прием
(уходов в прерывания нет).
Значит, для того чтобы фиксированная задержка, "лежащая" в "зоне" разрешения
прерываний, отрабатывалась в течение заданного интервала времени, нужно сделать
ее меньшей, чем этот заданный интервал времени.
С поправкой на уход в прерывания (на конкретную ПП прерывания).
Вопрос: "Каковым должно быть числовое значение этой поправки (коэффициента)"?
Ответ: К = Tд/Тп
К - поправочный коэффициент.
Тд - время отработки "хвостика/довеска".
Тп - период ухода в прерывания.
Таким образом, в данном случае, К = 14/100 = 0,14
С учетом поправочного коэффициента, упрощенная формула для пересчета времени
фиксированной задержки, "лежащей" в "зоне" разрешения прерываний, будет выглядеть
так: Трасч х К = Tз
Трасч - рассчетное время отработки задержки. То есть, то время задержки (с учетом
уходов в прерывания), которое нужно обеспечить.
К - поправочный коэффициент.
Тз - время отработки задержки, которое нужно задать в программе.
Например, нужно обеспечить время отработки фиксированной задержки, "лежащей" в
"зоне" разрешения прерываний, равное 500 000 мкс. (Трасч).
500 000 мкс. х 0,14 = 70 000 мкс.
Проверка:
500 000 мкс. / 100 мкс. = 5 000 уходов в прерывания.
За счет отработки этих 5 000 прерываний, будет осуществлена задержка величиной
5 000 х 86 мкс. = 430 000 мкс.
А за счет отработки 5 000 "хвостиков/довесков", будет осуществлена задержка
величиной 5 000 х 14 мкс. = 70 000 мкс.
430 000 мкс. + 70 000 мкс. = 500 000 мкс.
Все сходится.
Непосредственно к ПП задержки относится второе (70 000 мкс.).
Значит, нужно "состряпать" фиксированную задержку величиной 70 000 мкс.
То есть, с учетом применяемого кварца (Fкв = 20 Мгц), в программе Николая Марова,
нужно задать
70 000 мкс. х 5 = 350 000 машинных циклов
7
Этому соответствуют константы .136 - .199 - .2 (расположены в порядке возрастания
старшинства).
В данном случае (100=86+14), задержка с такими "параметрами", с учетом того, что
она "лежит" в "зоне" разрешения прерываний, будет отработана примерно за
500 000 мкс.
Точно таким же образом можно рассчитать и Тз для других значений Трасч, а затем
осуществить перевод в машинные циклы.
Что я и сделал для Вашего удобства (см. "вышележащий кусок" программы).
Вопрос: "Какое именно Трасч выбрать"?
Ответ: эту проблему, по причине ее серьезности, нужно капитальнейшим образом
"провентиллировать".
"Провентиллировал" и сильно удивился. Аж "челюсть об пол стукнулась".
Сейчас будет что-то типа детектива (с техническим уклоном).
После практической реализации "вышележащего", "прошивки" ПИКа и включения
"железяки", начала срабатывать защита по превышению верхнего Т-порога
("Караул! Убивают!" и т.д.).
При этом, "высвечивалось" текущее значение температуры равное 85-ти градусам, что
выше верхнего Т-порога, заданного в EEPROM-памяти данных по умолчанию
(80 градусов).
Поэтому и термозащита добросовестно сработала.
Молодец!!! Умница!!! Свое дело четко знает. Казенный хлеб не даром кушает.
И эта "бяка" наблюдалась только в первом цикле сценария-подсказки.
В конце второго цикла этого сценария (после 2-го замера температуры, которая была
в норме), происходила "штатная", автоматическая разблокировка, и в дальнейшем,
"температурные дела" были в полном порядке.
Это что-то подозрительно напоминает.
Вызываю летающую корову по кличке "Термодатчица" и начинаю ее "доить".
Ба … Точно. Показание величиной 85 градусов есть верный признак "глюка"
температурного преобразования.
В том смысле, что оно, в 1-м цикле, "не свершилось как положено".
Но потом-то (от 2-го цикла и далее) свершилось.
Вопрос: "Почему раньше такого не было"?
Ответ: потому, что работала "плавающая" задержка.
Вопрос: "Почему это сейчас имеет место быть"?
Ответ: потому, что работает фиксированная задержка и в наличии имеется классная
"бякозасекалка" (ценой в "литр не даром пролитой крови"), которая четко сработала.
Если бы ее не было, то так и остался бы в неведении.
Ведь что такое 1-й цикл?
Это то, чему обычно не придается значения, ведь потом-то все в полном порядке.
Вроде как и совсем не смертельно, но в данном-то случае, по причине срабатывания
термозащиты, с этим мириться нельзя.
Даже с учетом того, что в дальнейшем произойдет авторазблокировка.
По факту, халтура получается.
Думаю, что пользователю это не понравится (и мне тоже не нравится).
Значит, так дело не пойдет.
Так как стараниями разработчиков, в этом вопросе, имеет место быть полный "туман",
мне вынужденно пришлось поэкспериментировать.
"Стряпаю" еще одну фиксированную задержку, с заведомо большИм временем
отработки (3 байта, "забитые под завязку"), и делаю так, чтобы она отрабатывалась
только при первом (после включения питания) "влете" в ПП TERMO.
Делается это очень просто: при помощи флага Flag,0, ведь он, после отказа от
"плавающей" задержки, "свободен как ветер в поле".
Просто изменяется его функциональность, и все дела.
При первом "влете" в ПП TERMO, в бите №0 регистра Flag "лежит" 0 (все биты этого
регистра, в ПП START, устанавливаются в 0).
Перед началом отработки задержки, состояние этого бита анализируется.
Если он установлен в 0, то задержка отрабатывается (это происходит только при 1-м
"влете").
В конце задержки производится установка Flag,0 в 1.
8
После этого, вплоть до выключения питания, задержка будет обходиться.
После "экспериментального врезания" всего этого "безобразия" в различные "места"
(любопытно же!), выяснилось то, что "вышележащая бяка" не есть результат
неисполнения команд Skip_ROM и Start_Conv.
Они исполняются четко.
"Бяка" есть результат первого, после включения питания, температурного
преобразования.
О причинах оного можно только гадать.
С одной стороны, шунтирующее действие "паразитного" конденсатора, на линию DQ,
вроде как и не при чем (команды Skip_ROM и Start_Conv исполняются), а с другой
стороны, все это "безобразие" сильно смахивает на нечто, связанное с зарядом
изначально разряженного конденсатора (гипотеза).
А именно, если выключить питание, дождаться сброса (BOR) и сразу же после этого
включить питание, то "бяки" не будет, а если выключить питание, достаточно долго
подождать, а затем включить питание, то "бяка" есть.
Поэкспериментировал с величиной этой "одноразовой" задержки.
Выяснилось, что для того чтобы, в 1-м цикле, температурное преобразование
произошло успешно, нужна задержка величиной, примерно, не менее 450 000 мкс.
("пыткам" подвергался тот DS1820, который у меня имеется).
А если учесть разброс параметров и перестраховку разработчиков, то становится
понятным, откуда взялось наихудшее время температурного преобразования величиной
750 мс.
Примерно такое время (с запасом) и выставил.
Обращаю Ваше внимание на то, что речь идет о задержке, которая отрабатывается
один раз (за одно включение питания) и которая не находится в "зоне" разрешения
прерываний (отрабатывается за один прием).
Теперь, направляю орлиный взор на задержку, обеспечивающую "пережидание"
температурного преобразования (ПП PAUSE_2).
Так как, в этих вопросах, я любопытен до совершеннейшего неприличия, то решил
выяснить, каковой именно является минимальная задержка, обеспечивающая
"полноценную" конвертацию.
Начинаю последовательно уменьшать ее значение и смотрю, что из этого выходит.
После того, как я дошел до 1000 мкс., глаза значительно округлились.
После того, как я вообще заблокировал исполнение ПП PAUSE_2 и после этого
увидел точно такое же показание температуры, как и в случае задержки в 750 000
мкс., "моя челюсть стукнулась об пол".
Сначала подумал что грешным делом что-то "напартачил" с "одноразовой" задержкой,
и она исполняется не только в 1-м, но и в каждом цикле.
Блокирую ее исполнение.
После "Караул! Убивают!" (и т.д. В 1-м цикле "высвечиваются" те же 85 градусов) и
и последующей, автоматической разблокировки ("одноразовая" задержка работает четко,
и она "не при чем"), наблюдаю то же самое (конвертация происходит без ошибок).
И это не "мистика", так как, по мере уменьшения величины задержки PAUSE_2,
абсолютно четко наблюдается увеличение скорости смены показаний.
Это что же такое, братцы, получается?
Если обеспечить "одноразовую" задержку величиной 750 000 мкс. (можно и поменьше,
но пусть будет так. Для определенности), то можно сделать "пережидание" интервала
времени температурного преобразования очень малым, вплоть до отказа от такого
"пережидания".
В соответствии с тем, что я наблюдал собственными глазами (и Вы тоже можете это
увидеть), получается именно так.
Но ведь это же существенное увеличения скорости замеров температуры, а
соответственно и уменьшение инерционности срабатывания термозащиты!
И еще "куча полезностей впридачу".
Это же целая "DSтермореволюция"!
Например, за одно и то же время, можно опросить гораздо бОльшее количество
датчиков, чем при "стандартном подходе", или значительно уменьшить время опроса
фиксированного количества датчиков.
9
Сие заявление очень серьезно, и по этой причине, его нужно как следует
"поприслонять к разнообразнейшим стенкам".
Надеюсь что в будущем, коллективными усилиями, мы в этом как следует разберемся.
А пока, делаю интервал времени отработки задержки PAUSE_2 приблизительно равным
200 000 мкс. (с учетом уходов в прерывания).
Так как 200 000 мкс. является "официальным", типовым значением времени "свершения"
температурного преобразования (не могу удержаться от иронии).
С учетом сказанного, эта задержка нужна не столько для обеспечения температурного
преобразования, сколько для задания приемлемой скорости смены показаний и
увеличения соотношения времени нахождения рабочей точки программы в "зонах"
разрешения прерываний к времени ее нахождения в "зонах" запрета прерываний (в
комплексе).
Можно выставить и другую величину этой задержки (для Вашего удобства, некоторые
варианты "разрисованы" в ПП PAUSE_2).
Если задержка большАя (3 константы), то нужно разблокировать те 4 команды,
которые выделены серым цветом, а если малая (1 константа), то нужно
заблокировать еще 4 команды, работающие с регистром Reg_2.
Короче, экспериментируйте. Все условия для этого созданы.
И направление "вектора усилий" обозначено.
В перспективе, используя "вышележащее", имеется вполне реальная возможность
создания быстрых (качественных) "DSтермоподпрограмм".
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
; ПРОЦЕДУРА 1-WIRE ПРОТОКОЛА.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
;...................................
;...................................
11
То есть, пользователю предлагается возможность свободного выбора "того-сего", что,
на мой взгляд, должным образом будет им оценено (для кого работаем?).
А раз это так, то и все средства хороши.
Правда, нужно признать, что такого рода работа есть дополнительный "геморрой" для
конструктора, но это его личные проблемы (а кому сейчас легко?).
Подвиг свершить, это не в свисток дунуть (да здравствует Мюнхаузен!).
Вердикт: так тому и быть.
Реализую.
1-й этап работы
По ехидному (по отношению к проблеме) принципу "раскручивания цепочки", перво-
наперво, нужно "состряпать" дополнительный, 5-й пункт меню выбора порогов, ведь
именно с его выбора и начинается вся "свистопляска".
То есть, нужно организовать вывод на индикацию соответствующей надписи и "уход в
нечто", если кнопка "Установка порогов" отжимается в интервале времени этого
"высвечивания", а также и переход в следующий пункт меню, если эта кнопка не
отжимается.
В данном случае, в 1-й строке ЖК-модуля, это надпись Термодатчик (уже имеется и
ничего выдумывать не нужно), а во 2-й строке, это надпись ВКЛ. ОТКЛ. (а вот ее
нужно организовать).
На мой взгляд, будет логичным вывести на индикацию эту надпись после надписи 3-го
пункта меню, то есть, после надписи Задание порогов / защиты от КЗ.
Таким образом, процедуру вывода на индикацию надписи Термодатчик / ВКЛ. ОТКЛ.
нужно "врезать" между процедурами вывода на индикацию надписей
Задание порогов / защиты от КЗ и Возврат / из режима.
Программно, это выглядит так:
;...................................
;...................................
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ. ###############################################
;################################################################################
;...................................
;...................................
;-----------------------------------
; Надпись " Термодатчик "
;-----------------------------------
TEXT_19 addwf PC,F ; -----"-----
dt 0x20,0x20,0x54,0x65,0x70,0xBC,0x6F,0xE3
dt 0x61,0xBF,0xC0,0xB8,0xBA,0x20,0x20,0x20
;...................................
;...................................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. #########################################
;################################################################################
;...................................
;...................................
;...................................
;...................................
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
;...................................
;...................................
;-----------------------------------
; Надпись " ВКЛ. ОТКЛ."
;-----------------------------------
TEXT_43 addwf PC,F ; -----"-----
dt 0x20,0x42,0x4B,0xA7,0x2E,0x20,0x20,0x20
dt 0x20,0x20,0x20,0x4F,0x54,0x4B,0xA7,0x2E
;...................................
;...................................
;################################################################################
12
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. #########################################
;################################################################################
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; ПП РАБОТЫ С ТЕРМОДАТЧИКОМ. DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
;...................................
;...................................
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; ПП УСТАНОВКИ КЗ-ПОРОГА.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
;...................................
;...................................
;================================================================================
; Анализ состояния флага блокировки 4-го пункта меню.
;================================================================================
btfsc Flag_1,4 ; Каково состояние флага ?
goto VOZVRAT ; Если поднят, то 4-й пункт меню
; не выводится на индикацию.
; Если опущен, то выводится.
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Термодатчик ".
;================================================================================
movlw .35 ; Задание времени (количества циклов)
movwf Temp ; "высвечивания" надписи " Термодатчик ".
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Выключение датчика.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;-------------------------------------------------------------------
DAT_VIKL movlw b'11001010' ;
movwf PortB ; 2-я строка, 11-е знакоместо. Адрес 0Ah.
call ENTER_BF_1 ;
;-------------------------------------------------------------------
; Вывод на индикацию символа активности (маркера).
;-------------------------------------------------------------------
movlw 0DCh ;
movwf PortB ; Вывод на индикацию
bsf PortC,RS ; символа активности ">|".
call ENTER_BF_1 ;
;-------------------------------------------------------------------
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;-------------------------------------------------------------------
movlw b'11000000' ;
movwf PortB ; 2-я строка, 1-е знакоместо. Адрес 00h.
call ENTER_BF_1 ;
;-------------------------------------------------------------------
; Вывод на индикацию символа "пусто".
;-------------------------------------------------------------------
movlw 20h ;
movwf PortB ; Вывод на индикацию
bsf PortC,RS ; символа "пусто".
call ENTER_BF_1 ;
;--------------------------------------------------------------------------------
bsf Flag,1 ; Флаг наличия/отсутствия термодатчика
; поднимается (все переходы в ПП TERMO будут
; обходиться).
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; Опрос клавиатуры.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; Опрос кнопки "Переключение режимов".
;================================================================================
OBHOD_3 btfsc PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto $+9 ; Если отжата, то переход на опрос кнопки
; "Установка порогов".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Вывод на индикацию фиксированной надписи " СЛУШАЮСЬ и / ПОВИНУЮСЬ! ".
;--------------------------------------------------------------------------------
bcf PCLATH,3 ; Выбор 1-й страницы.
call SL_I_POVIN ; Переход в ПП вывода на индикацию
; этой надписи.
;--> Возврат по стеку из ПП SL_I_POVIN.
bsf PCLATH,3 ; Выбор 2-й страницы.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
16
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
clrf PCLATH ; Выбор 1-го блока 1-й страницы.
goto INKEY ; После отжатия, выход из режима.
;================================================================================
; Опрос кнопки "Установка порогов".
;================================================================================
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto SNOVA_8 ; Если отжата, то переход на следующий
; внутренний цикл.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
incf Temp_3,F ; Смена состояния указателя
; включения/выключения
; термодатчика (Temp_3 + 1 = ...).
;================================================================================
; Запись, в EEPROM-память данных, признака включения/выключения термодатчика.
;================================================================================
bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 6 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 06h.
movf Temp_3,W ;
movwf EEData ; Temp_3 -> EEData.
bsf Status,RP0 ; Переход в 3-й банк.
bcf EECon1,7 ; Работа с EEPROM.
bsf EECon1,2 ; Разрешение записи.
movlw 0x55 ; Обязательная
movwf EECon2 ; последовательность
movlw 0xAA ; команд
movwf EECon2 ; записи.
bsf EECon1,1 ; Инициализация записи.
bcf EECon1,2 ; Запрещение записи.
btfsc EECon1,1 ; Запись завершена или нет ?
goto $-1 ; Если не завершена, то "плавающая" задержка.
bcf Status,RP0 ; Если завершена, то
bcf Status,RP1 ; переход в 0-й банк.
goto SNOVA_8 ; Переход на следующий внутренний цикл.
;################################################################################
; НИЖНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ.
;################################################################################
;...................................
;...................................
;================================================================================
17
; Чтение, из EEPROM, байта указателя включения/выключения термодатчика.
;================================================================================
READ_V_O bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 6 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 06h.
bsf Status,RP0 ; Переход в 3-й банк.
bcf EECon1,7 ; Работа с EEPROM.
bsf EECon1,0 ; Инициализация чтения.
bcf Status,RP0 ; Переход во 2-й банк.
movf EEData,W ; Считывание байта, из выбранной ячейки
movwf Temp_3 ; EEPROM, в регистр Temp_3.
bcf Status,RP1 ; Переход в 0-й банк.
return ; Возврат по стеку.
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. ##########################################
;################################################################################
end ; Конец программы.
18
На картинках слева, Вы видите оба варианта
установки маркера.
До тех пор, пока не будет нажата/отжата кнопка
"Переключение режимов", работа будет происходить
во внутреннем цикле ПП T_DATCHIK.
То есть, пока кнопка "Переключение режимов" не
будет нажата/отжата, положение маркера можно изменить какое угодно количество раз
(с помощью кнопки "Установка порогов").
Текущим будет последнее положение маркера.
После отжатия кнопки "Переключение режимов" (на время нажатия, "высвечивается"
надпись СЛУШАЮСЬ и ПОВИНУЮСЬ!), произойдет возврат в тот режим работы, из
которого вызывалось меню выбора порогов.
Итак, теперь можно с комфортом выключить/включить термодатчик, с
энергонезависимым запоминанием факта его включения или выключения.
Второй этап текущей работы завершился.
3-й этап работы
Нужно как-то оповестить пользователя о том, заблокирован ли термодатчик или он
разблокирован. Ведь пользователь вполне может забыть про свои предыдущие
"телодвижения".
Из-за этого, могут быть всяческие "оргнеувязки", вплоть до недовольства по отношению
к конструктору.
Значит, нужно "состряпать" какую-то "напоминалку".
"Стряпаю".
Будет вполне логичным "привязаться", к имеющейся в наличии, процедуре определения
электрического подключения/отключения термодатчика.
То есть, в нее нужно осуществить некую "врезку" ("врезки").
Что и имеет место быть.
Получилось это:
;...................................
;...................................
;ОООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООО
; Проверка наличия/отсутствия отклика от термодатчика.
;ОООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООООО
bsf PCLATH,3 ; Выбор текущего блока 2-й страницы.
call DQ_INIT ; Переход в ПП инициализации термодатчика.
;----> Возврат по стеку из ПП DQ_INIT.
;--------------------------------------------------------------------------------
; Чтение, из EEPROM, байта указателя включения/выключения термодатчика.
;--------------------------------------------------------------------------------
call READ_V_O ; Реализация оного.
;----> Возврат по стеку из ПП READ_V_O.
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Термодатчик ".
;================================================================================
movlw high TEXT_19; Выбор
movwf PCLATH ; 2-го блока 1-й страницы.
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ;
call TEXT_19 ; Аналогично, только
bsf PortC,RS ; для TEXT_19.
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Анализ состояния флага наличия/отсутствия термодатчика.
;--------------------------------------------------------------------------------
btfsc Flag,1 ; Если флаг поднят, выводится надпись
; " ОТКЛЮЧЕН "
19
goto TERMO_OTKL ; Если флаг опущен, выводится надпись
; " ПОДКЛЮЧЕН ".
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " ПОДКЛЮЧЕН ".
;================================================================================
TERMO_VKL movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_20 ; для TEXT_20.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
goto OBHOD_4 ; Переход на метку OBHOD_4 (обход).
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " ОТКЛЮЧЕН ".
;================================================================================
TERMO_OTKL movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_21 ; для TEXT_21.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. ##########################################
;################################################################################
org 801h ; Заполнение 2-й страницы памяти программ
; начинается с 2050-й позиции (см. окно ROM).
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
;...................................
;...................................
;-----------------------------------
; Надпись " ВКЛ. ОТКЛ."
;-----------------------------------
TEXT_43 addwf PC,F ; -----"-----
dt 0x20,0x42,0x4B,0xA7,0x2E,0x20,0x20,0x20
dt 0x20,0x20,0x20,0x4F,0x54,0x4B,0xA7,0x2E
;================================================================================
; Группа подпрограмм табличных, вычисляемых переходов, формирующих фиксированные
; картинки (расположена во 2-м блоке 2-й страницы памяти программ / PCLATH=.9).
;================================================================================
; Надпись "но ЗАБЛОКИРОВАН "
;-----------------------------------
TEXT_44 addwf PC,F ; -----"-----
dt 0xBD,0x6F,0x20,0xA4,0x41,0xA0,0xA7,0x4F
dt 0x4B,0xA5,0x50,0x4F,0x42,0x41,0x48,0x20
;-----------------------------------
; Надпись " в настройках "
;-----------------------------------
TEXT_45 addwf PC,F ; -----"-----
dt 0x20,0x20,0xB3,0x20,0xBD,0x61,0x63,0xBF
dt 0x70,0x6F,0xB9,0xBA,0x61,0x78,0x20,0x20
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. #########################################
;################################################################################
;...................................
21
;...................................
;...................................
;...................................
;################################################################################
; НИЖНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ.
;################################################################################
;...................................
;...................................
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "но ЗАБЛОКИРОВАН ".
;================================================================================
BLOKIR_T movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_44 ; для TEXT_44.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " в настройках ".
;================================================================================
movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_45 ; для TEXT_45.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
return ; Возврат по стеку.
;================================================================================
;...................................
;...................................
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. ##########################################
;################################################################################
end ; Конец программы.
22
(хх - текущее, числовое значение температуры).
2. Если, в настройках, термодатчик заблокирован, то сначала "высветится" надпись
Термодатчик ПОДКЛЮЧЕН
(свидетельствует об электрическом подключении термодатчика), которую будут
"сопровождать" три специфических "писка" (с относительно большими паузами между
ними), после чего "высветится" надпись
но ЗАБЛОКИРОВАН в настройках
(вывод "длинной" надписи в 2 приема).
После этой "предупреждалки", начнется "рабочий"
цикл.
Как это выглядит, видно на картинках слева.
Если, в дальнейшем, работа будет происходить в
режиме выключенной защиты, то в 1-й строке
дисплея "высветится" надпись
ЗАЩИТА ВЫКЛЮЧЕНА.
То есть, результаты несуществующих замеров
температуры (так как ПП TERMO обходится)
визуально отображаться не будут.
Следующий момент.
ПП BLOKIR_T "лежит" на 2-й странице памяти программ.
Под нее организованы две ПП вычисляемых переходов: TEXT_44 и TEXT_45
(выделены фиолетовым цветом).
"По закону жанра" (вычисляемые переходы), эти ПП вынесены в верхнюю "обслугу" 2-й
страницы.
При этом, в общей сложности, имеет место быть 19 подпрограмм вычисляемых
переходов, "лежащих" в двух блоках (одного мало).
В данном случае, просто повезло.
В том смысле, что первая команда ПП TEXT_44 пришлась точно на первую ячейку
2-го блока 2-й страницы (подфартило).
В случае же, если такой фортуны не будет, нужно предпринять меры по "загону этих
двух стад" в свои, отдельные "загоны".
При этом можно либо скорректировать "рабочую" часть той директивы org, которая
имеется (менее 800h делать не нужно. Более - можно), либо, "в районе границы"
между блоками, "настукать" соответствующее количество NOPов, либо "состряпать" еще
одну директиву org, либо в комплексе или в какой-то комбинации.
Есть и еще варианты (все перечислять не стал), но смысл один и тот же
(см. два "стада").
О "вентилляторных делах".
В начале и сценария выключенной защиты, и сценария включенной защиты, имеют
место быть две одинаковые процедуры:
;...................................
;...................................
;--------------------------------------------------------------------------------
24
; Опрос флага наличия/отсутствия термодатчика.
;--------------------------------------------------------------------------------
btfsc Flag,1 ; Флаг наличия/отсутствия термодатчика поднят
; или нет ?
goto $+5 ; Если поднят, то обход ПП работы с датчиком.
; Если нет, то ПП TERMO исполняется.
;--------------------------------------------------------------------------------
; Окончание "разгона" вентиллятора.
;--------------------------------------------------------------------------------
bsf PCLATH,3 ; Выбор текущего блока 2-й страницы.
call TERMO ; Переход в ПП работы с датчиком, с целью
;--> Возврат по стеку из ПП TERMO. ; установки текущих оборотов вентиллятора.
clrf PCLATH ; Выбор 1-го блока 1-й страницы.
goto $+3 ; Обход "разгона" вентиллятора.
;================================================================================
; Перевод вентиллятора на заданное количество оборотов
; (в данном случае, на максимальные).
;================================================================================
movlw .255 ;
movwf CCPR1L ; CCPR1L = 11111111
;...................................
;...................................
О прерываниях.
В начале ПП INKEY, прерывания разрешать нельзя.
Их наоборот нужно запретить.
Причина: в сценарии включенной защиты, до начала циклической ПП слежения,
производится чтение порогов U/I.
А это работа во 2-м и 3-м банках.
К тому же, ПП чтения "лежит" на 2-й странице памяти программ.
А ПП прерывания "ориентирована" на работу с 0-м и 1-м банками и с 1-й страницей
памяти программ.
То есть, в случае включения такой процедуры чтения в "зону" разрешения прерываний,
будет стопроцентный "глюк".
26
"Практикум по конструированию устройств на PIC контроллерах" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru
27