Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
, необходимо - в "шапке" программы, назначить вектор прерывания, - назначить источник прерывания ( INTCON ), - определить активный фронт прерывания ( OPTION ), - создать "зону" разрешения прерываний, - вначале ППпрерыванияib, сохранить, а в конце ПП прерывания , восстановить содержимое регистров STATUS и W , - перед осуществлением возврата из ПП прерывания , сбросить флаг прерывания выбранного источника прерываний, - в самом конце ПП прерывания , исполнить команду. Итак, уходим в прерывание Сразу возникает вопрос "Что там будем делать "? Исходя из того, что рабочая точка программы должна находиться в ПП прерывания все время, пока приемник фиксирует наличие несущей (управляющий сигнал "несущая есть "), вывод напрашивается сам по себе в ПП прерывания , нужно "закольцевать " рабочую точку программы в "вечном кольце ", то есть, сделать то, чем мы уже занимались раньше При этом, нужно организовать проверку типа "несущая есть / нет ?" (опрос клавиатуры, с уходом рабочей точки программы в циклическую ПП задержки (при наличии несущей, основой которой является многоразрядный счетчики выходом из нее при "пропадании " несущей Ранее мы рассматривали работу вычитающего счетчика Теперь же, в обучающих целях, а заодно и для разнообразия, сделаю этот счетчик комбинированным, то есть, вычитающе - суммирующим (забегаю вперед счетчик - двухразрядный ). В "основном телепрограммы, сначала, нужно произвести подготовительные операции ( ПП START ). Необходимо чем- то переключать направления ретрансляции, следовательно, нужно создать нечто типа "триггера ", который управлял бы сменой "раскладок " частот Состояние этого "триггера " должно периодически опрашиваться, ив зависимости от этого, должен быть осуществлен переход на ту или иную раскладку частот Пусть опрос состояния "триггера " будет производиться сразу после ПП START , а изменение его состояния - в конце цикла "основного тела " программы (а можно и наоборот ). Между этим опросом и этим изменением, в простейшем случае (без учета специфики управляемого устройства, нужно сформировать "сплошную зону " разрешения прерываний, но этого делать нельзя последующей причине "Раскладки " частот переключаются в синтезаторе частот ретранслятора Vertex-7000VXR, который, также как и любой синтезатор частот, является инерционным устройством То есть, переход с одной раскладки частот на другую, занимает некоторое время, ив это время возникают переходные помехи, наличие которых обусловлено переходными процессами в кольце фазовой автоподстройки частоты синтезатора частот 138 Эти помехи могут "трансформироваться " в "паразитный " сигнал управления "несущая есть ", что может привести к уходу в прерывания без фактического наличия несущей Для того чтобы избавиться от этой неприятности, нужно "переждать ", пока не закончатся переходные процессы в кольце фазовой автоподстройки частоты синтезатора частот Таким образом, речь идет о том , что после выбора направления ретрансляции ( переключения "раскладок " частот, необходимо, на некоторое время, "закольцевать " рабочую точку программы в ПП задержки То есть, сначала нужно сформировать некий защитный интервал времени, а только после этого формировать "зону " разрешения прерываний В целях обеспечения приемлемой инерционности обнаружения несущей, "зона " разрешения прерываний также должна иметь некоторую протяженность во времени Следовательно , в этой "зоне " должна располагаться ПП задержки с калиброванным временем задержки Если в течение этого времени на выводе RB0/INT возникнет активный перепад (несущая есть, то процесс сканирования прекратится, так как рабочая точка программы "улетит " в ПП прерывания и будет "крутиться " там в "вечном кольце " до тех пор, пока не "пропадет " несущая Если это случится, то произойдет возврат из прерывания, и сканирование возобновится Теперь можно составлять блок - схему программы И принципиальную схему устройства тоже можно составить Определяемся с выводами портов 139 Порт А не задействуем, порт В задействуем Входом внешнего прерывания INT является вывод, следовательно, вывод RB0/INT необходимо настроить на работу "на вход ". Примечание : никакой другой вывод порта (любого) нельзя назначить входом внешнего прерывания, так как этот вид прерываний "жестко привязан " именно к выводу RB0 Так как управляющий сигнал "несущая есть / нет " поступает на вывод RB0/INT с выхода каскада с открытым коллектором, то необходимо включить подтягивающие резисторы порта В В этом случае, подтягивающий резистор вывода RB0/INT будет являться коллекторной нагрузкой каскада с открытым коллектором Экспериментально проверяю состояние каскада с открытым коллектором при отсутствии несущей транзистор закрыта при ее наличии, открыт, что с учетом подтягивающего резистора вывода, соответствует единичному уровню, если несущей нет, и нулевому уровню, если она есть Берем на заметку При составлении программы, это потребуется Выходом управления переключением направлений ретрансляций (раскладки частот) можно назначить любой из оставшихся выводов порта В Пусть им будет, например, вывод RB2 Этот вывод нужно настроить на работу "на выход ". Остальная часть принципиальной схемы практически такая же, как у устройства формирования тонального вызова с частотой 1450 Гц Пояснение : в ретрансляторе Vertex-7000VXR, для дистанционного переключения пар частот ( одна частота - приемная, другая - передающая, на разъем выведено 4 цепи (переключение пар частот производится в инвертированном , весовом, параллельном коде. Таким образом, можно осуществить переключения между 16- ю парами частотно нам необходимо переключаться только между двумя парами частот, следовательно, под это дело, можно задействовать только один младший разряд (они подключен к выводу RB2 ), а остальные 3 разряда запараллелить и "подать " на них единицу, то есть, подключить их к 4- му выводу В этом случае, переключения будут производиться между 1- ми 2- м каналами (1- й и 2- й парами частот. 1- му каналу соответствует единица на выводе, а 2- му каналу, ноль на выводе RB2 В принципиальной схеме, c целью упрощения ее восприятия, я не показал описанных выше соединений (но они должны быть. Просто имейте это ввиду Принципиальную схему устройства вообще можно предельно упростить, если запитаться отцепи ретранслятора 140 В этом случае, стабилизатор на 142 ЕН 5 можно убрать, но придется "лезть " в ретранслятор и делать отвод от +5v. А теперь можно прикинуть стоимость этого устройства (25- штырьковый разъем - компьютерный. В 250 руб уложился (по ценам на комплектующие, которые имели место быть на момент "ваяния этой железяки "). Файл текста программы под это устройство называется (находится в папке " Тексты программ. Программа выглядит так ;******************************************************************************** ; Retr_1.asm ВАРИАНТ С ПРЕРЫВАНИЯМИ ; Сканер для ретранслятора VERTEX-7000VXR. ; Автор Корабельников Евгений Александрович г . Липецк декабрь г. ; E-mail: karabea@lipetsk.ru http://ikarab.narod.ru ;******************************************************************************** ; Позволяет перевести VERTEX-7000VXR и другие подобные ретрансляторы из режима односторонней ретрансляции в режим двухсторонней ретрансляции без потери качества работы. ;******************************************************************************** ; Используется микроконтроллер PIC16F84A. Частота кварца кГц. ;******************************************************************************** LIST p=16F84a ; Используется PIC16F84A. __CONFIG 03FF5H ; WDT включен, бит защиты не установлен. ;================================================================================ ; Определение положения регистров специального назначения. ;================================================================================ OptionR equ 01h ; Option - банк Status equ 03h ; Регистр Status PortB equ 06h ; Порт B TrisB equ 06h ; Tris B - Банк IntCon equ 0Bh ; Регистр IntCon ;================================================================================ ; Определение названия и положения регистров общего назначения. ;================================================================================ Trigg equ 0Ch ; Переключатель направления ретрансляции. W_Temp equ 0Eh ; Регистр сохранения содержимого W в ; прерываниях. Stat_Temp equ 0Fh ; Регистр сохранения содержимого STATUS в ; прерываниях. SecH equ 1Eh ; Старший байт счетчика времени сканирования. SecL equ 1Fh ; Младший байт счетчика времени сканирования equ 1Ch ; Старший байт счетчика защитного интервала ; времени. SecL_1 equ 1Dh ; Младший байт счетчика защитного интервала ; времени. SecH_2 equ 1Ah ; Старший байт счетчика задержки рабочей точки ; программы в прерывании . SecL_2 equ 1Bh ; Младший байт счетчика задержки рабочей точки ; программы в прерывании . ;================================================================================ ; Определение места размещения результатов операций. ;================================================================================ W equ 0 ; Результат направить в аккумулятор . F equ 1 ; Результат направить в регистр . ;================================================================================ ; Определение положения флагов и бита выбора банка в регистре STATUS. ;================================================================================ RP0 equ 5 ; Бит выбора банка. ;================================================================================ ; Точка входа в программу . ;================================================================================ 141 org 0 ; Начать выполнение программы с нулевого goto START ; адреса PC. ;================================================================================ ; Точка входа в прерывание . ;================================================================================ org 4 ; Назначение вектора прерывания (назначается, ; если в программе используются прерывания. ;================================================================================ ; Объем программы 63 слова в памяти программ. ;******************************************************************************** ;******************************************************************************** ; НАЧАЛО ПРЕРЫВАНИЯ . ;================================================================================ ; Сохранение содержимого регистров STATUS и W в ОЗУ . ;-------------------------------------------------------------------------------- INT movwf W_Temp ; Скопировать содержимое регистра W ; в регистр W_Temp. movf Status,W ; Скопировать содержимое регистра Status ; в регистр W. movwf Stat_Temp ; Скопировать содержимое регистра W ; в регистр Stat_Temp. ;-------------------------------------------------------------------------------- ; Проверка наличия несущей (опрос клавиатуры. ;-------------------------------------------------------------------------------- CYCLE btfsc PortB,0 ; Проверка состояния нулевого бита ; регистра PortB. goto EndInt ; Если он =1 (несущей нетто уход ; в ПП выхода из прерывания. ; Если он =0 (несущая есть, то программа ; исполняется далее. ;-------------------------------------------------------------------------------- ; Формирование времени одного цикла задержки рабочей точки программы в прерывании ;-------------------------------------------------------------------------------- movlw .250 ; Закладка константы .250 в регистр W. movwf SecH_2 ; Копирование .250 из регистра W ; в регистр SecH_2. movlw .120 ; Закладка константы .120 в регистр W. movwf SecL_2 ; Копирование .120 из регистра W ; в регистр SecL_2. PAUSE_2 clrwdt ; Сброс WDT. decfsz SecL_2,F ; Декремент содержимого младшего разряда ; счетчика SecL_2. goto PAUSE_2 ; Если результат декремента не =0, то переход ; в ПП PAUSE_2. incfsz SecH_2,F ; Если результат декремента =0, то инкремент ; старшего разряда счетчика SecH_2. goto PAUSE_2 ; Если результат инкремента не, то переход ; в ПП PAUSE_2. goto CYCLE ; Если результат инкремента =0, то переход наследующий цикл задержки рабочей точки ; программы в прерывании . ;================================================================================ ; Восстановление содержимого регистров STATUS и W с последующим выходом из прерывания. ;-------------------------------------------------------------------------------- EndInt bcf IntCon,1 ; Сброс флага прерывания по INT. movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp ; в регистр W. movwf Status ; Скопировать содержимое регистра W ; в регистр Status. swapf W_Temp,F ; Поменять местами старший и младший полубайты ; регистра W_Temp с сохранением результата ; операции в нем же. swapf W_Temp,W ; Поменять местами старший и младший полубайты ; регистра W_Temp с сохранением результата 142 ; операции в регистре W. retfie ; Возврат из прерывания по стеку. ;******************************************************************************** ; КОНЕЦ ПРЕРЫВАНИЯ ;******************************************************************************** ;******************************************************************************** ; СКАНИРОВАНИЕ ; Подготовительные операции. ;-------------------------------------------------------------------------------- START clrf IntCon ; Запретить все прерывания. clrwdt ; Сбросить сторожевой таймер WDT. bsf Status,RP0 ; Установить банк 1. movlw .1 ; RB0 работает на вход movwf TrisB ; остальные - на выход. movlw .0 ; Включить подтягивающие резисторы порта В . movwf OptionR ; На входе INT прерывания - по заднему фронту bcf Status,RP0 ; Установить банк 0. ;-------------------------------------------------------------------------------- ; Выбор направления ретрансляции. ;-------------------------------------------------------------------------------- TRIGGER btfsc Trigg,0 ; Проверка значения нулевого бита ; регистра Trigg. goto Metka148 ; Если это значение =1, то переход ; наметку Если это значение =0, то программа ; исполняется далее. movlw .251 ; Закладка константы .251 (1111 1011) ; в регистр W. movwf PortB ; Копирование .251 из регистра W ; в регистр PortB (выбор прямого направления ; ретрансляции ПРМ -X, ПРД -Y). goto Metka_1 ; Безусловный переход наметку Закладка константы .255 (1111 1111) ; в регистр W. movwf PortB ; Копирование .255 из регистра W ; в регистр PortB (выбор обратного направления ; ретрансляции ПРМ -Y, ПРД -X). ;-------------------------------------------------------------------------------- ; Формирование защитного интервала времени (ожидание окончания переходных процессов, возникающих при смене направлений ретрансляции) равного, ; примерно, 60 мс. ;-------------------------------------------------------------------------------- Metka_1 movlw .197 ; Закладка в регистр W константы .197 movwf SecH_1 ; Копирование константы .197 из регистра W ; в регистр SecH_1. movlw .121 ; Закладка в регистр W константы .121 movwf SecL_1 ; Копирование константы .121 из регистра W ; в регистр SecL_1. PAUSE_D clrwdt ; Сброс WDT. decfsz SecL_1,F ; Декремент содержимого младшего разряда ; счетчика SecL_1. goto PAUSE_D |