;-- http://radiohlam.ru - собери сам, помоги собрать другу ;------------------------------------------------------------------ list p = 12f629 __config 01FC4h ; 01111 11 1 1 0 0 100 - (7,8)защиты памяти нет, (6)сброс по питанию разрешен, ; (5)GP3/-MCLR работает как gp3, (4)PWRT включен, (3)сторожевой таймер - выключен, (2-0)генератор - внутренний ;********* Переменные ************************************ CBLOCK 0x20 ;Начальный адрес блока констант адрес T_Cr ;таймер несущей T_NC ;счетчик количества импульсов в пакете T_0 ;таймер интервала между пакетами LBC ;младший байт посылки MBC ;старший байт посылки ENDC ; ;******** Константы *************************************** Cr1 equ .2 ; длительность 1 несущей Cr0 equ .4 ; длительность 0 несущей NCr equ .32 ; количество импульсов несущей в одном пакете (полбита - 889uS) Sys equ .0 ; номер системы CMD_1 equ .32 ; код команды 1 CMD_2 equ .16 ; код команды 2 CMD_3 equ .33 ; код команды 3 CMD_4 equ .17 ; код команды 4 Status equ 03h ; Регистр выбора банка. GPIO equ 05h ; Регистр управления защелками порта. Cmcon equ 19h ; Регистр Cmcon - компаратора TrisIO equ 05h ; Регистр выбора направления работы выводов порта. INTCON equ 0Bh ; Регистр разрешения(1)/запрета(0) прерываний OSCCAL equ 10h ; Регистр хранения калибровочной константы F equ 1 ; Результат направить в регистр. ;******************************************************** ; Пусть у нас GP0 - выход на транзистор управления светодиода, GP1, GP2, GP4, GP5 - входы ;******************************************************** org 0 ;******** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ******************************************************** ;*** Необходимо помнить, что калибровочные константы стираются при программировании, ********** ;*** поэтому их надо сохранять, OSCCAL хранится по адресу 03FFh, биты калибровки схемы BOR - * ;*** 12-й,13-й биты слова конфигурации (в моем случае BOR - 01, OSCCAL - 3458)***************** start ;****** Калибровка Генератора ***************************************************************** bsf Status,5 ; Call 3FFh ; Загрузить калибровочную константу в w movwf OSCCAL ; ;******** Установка направления работы выводов ************************************************ bcf Status,5 ; перейти в банк 0 clrf GPIO ; инициализация защелок (нули на всех защелках) movlw .7 ; биты 0..2 поднять movwf Cmcon ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых bsf Status,5 ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status) bcf 0x01,7 movlw .62 ; Записать конфигурацию GPIO в аккумулятор (W) .62=00 111110 GP0 - выход, остальные - входы movwf TrisIO ; Скопировать конфигурацию GPIO из W в регистр TrisIO. bcf Status,5 ; Перейти в 0-й банк (установить в 0 5-й бит регистра Status) ;******** ФОРМИРОВАНИЕ СТАРШЕГО БАЙТА ПАКЕТА ************************************************* movlw Sys movwf MBC ;запись в старший разряд кода номера системы bsf MBC,6 ;установка стартбитов bsf MBC,7 ;установка стартбитов ;****** Сканирование клавиатуры ********************************************************************** Scan btfss GPIO,5 ; если на входе GP5 низкий уровень - нажата клавиша 1 goto Tx_CMD1 ; btfss GPIO,2 ; если на входе GP2 низкий уровень - нажата клавиша 2 goto Tx_CMD2 ; btfss GPIO,4 ; если на входе GP4 низкий уровень - нажата клавиша 3 goto Tx_CMD3 ; btfss GPIO,1 ; если на входе GP1 низкий уровень - нажата клавиша 4 goto Tx_CMD4 ; bsf MBC,5 ; установить управляющий бит в 1 (первое нажатие) goto Scan ; ;****** Формирование младшего байта пакета *************************************************** Tx_CMD1 movlw CMD_1 ; movwf LBC ;запись номера команды 1 в младший разряд кода goto TxRC ; ;************************ Tx_CMD2 movlw CMD_2 ; movwf LBC ;запись номера команды 2 в младший разряд кода goto TxRC ; ;************************ Tx_CMD3 movlw CMD_3 ; movwf LBC ;запись номера команды 3 в младший разряд кода goto TxRC ; ;************************ Tx_CMD4 movlw CMD_4 ; movwf LBC ;запись номера команды 4 в младший разряд кода goto TxRC ; ;********************************************************************************************* ;******* Передача пакета RC-5 **************************************************************** TxRC btfsc MBC,7 ; Startbit 1. Если он равен 1, то выполняется Tx_1, call Tx_1 ; если он равен нулю, то выполняется Tx_0 btfss MBC,7 ; аналогично остальные биты call Tx_0 ; ;-------------------------------- btfsc MBC,6 ; Startbit 2 call Tx_1 ; btfss MBC,6 ; call Tx_0 ; ;-------------------------------- btfsc MBC,5 ; Control bit call Tx_1 ; btfss MBC,5 ; call Tx_0 ; ;-------------------------------- btfsc MBC,4 ; System bit 4 call Tx_1 ; btfss MBC,4 ; call Tx_0 ; ;-------------------------------- btfsc MBC,3 ; System bit 3 call Tx_1 ; btfss MBC,3 ; call Tx_0 ; ;-------------------------------- btfsc MBC,2 ;System bit 2 call Tx_1 ; btfss MBC,2 ; call Tx_0 ; ;-------------------------------- btfsc MBC,1 ;System bit 1 call Tx_1 ; btfss MBC,1 ; call Tx_0 ; ;-------------------------------- btfsc MBC,0 ;System bit 0 call Tx_1 ; btfss MBC,0 ; call Tx_0 ; ;-------------------------------- btfsc LBC,5 ;Command bit 5 call Tx_1 ; btfss LBC,5 ; call Tx_0 ; ;-------------------------------- btfsc LBC,4 ;Command bit 4 call Tx_1 ; btfss LBC,4 ; call Tx_0 ; ;-------------------------------- btfsc LBC,3 ;Command bit 3 call Tx_1 ; btfss LBC,3 ; call Tx_0 ; ;-------------------------------- btfsc LBC,2 ;Command bit 2 call Tx_1 ; btfss LBC,2 ; call Tx_0 ; ;-------------------------------- btfsc LBC,1 ;Command bit 1 call Tx_1 ; btfss LBC,1 ; call Tx_0 ; ;-------------------------------- btfsc LBC,0 ;Command bit 0 call Tx_1 ; btfss LBC,0 ; call Tx_0 ; bcf MBC,5 ; признак вторичной посылки ;****** Пауза, равная межпакетному интервалу **************************************************** ;****** Пауза между пакетами равна 50 bit, т.е. надо послать 100 нулевых полубитов (RCN) ******** movlw .99 ; здесь записано 99, а не 100, т.к. далее call стоит раньше декремента movwf T_0 pause call RCN decfsz T_0,F ; декремент T_0 goto pause ; goto Scan ;******** Конец основной программы ********************************************************************** ;-------------------------------------------------------------------------------------------------------- ;******* Подпрограммы передачи битов манчестерским кодом ************************************************ ;******* Передача нуля манчестерским кодом ********************** Tx_0 call RCY ; первые полбита единица call RCN ; вторые полбита ноль return ; ;******* Передача единицы манчестерским кодом ******************* Tx_1 call RCN ; первые полбита ноль call RCY ; вторые полбита единица return ; ;********************************************************************************************* ;***** Подпрограммы формирования и передачи логической единицы и логического нуля *********************** ;***** Передача единичного полубита ****************** RCY movlw NCr ; поместить константу NCr в аккумулятор movwf T_NC ; скопировать содержимое аккумулятора в регистр T_NC Y_001 movlw Cr1 ; поместить константу Cr1 в аккумулятор movwf T_Cr ; поместить содержимое аккумулятора в регистр T_Cr (таймер несущей) bsf GPIO,0 ; установить на выходе защелки GP0 единицу (установить 1 на выходе) Cr1_Y decfsz T_Cr,F ; декремент содержимого регистра T_Cr с ветвлением: если f=0 - результат сохраняется в аккумуляторе, если f=1 - результат ; сохраняется в регистре T_Cr. Если результат не равен 0, то исполняется следующая инструкция, если равен 0, то вместо ; следующей инструкции исполняется nop, а команда исполняется за 2 м.ц. goto Cr1_Y ; переход на метку Cr1_Y bcf GPIO,0 ; Установить на выходе защелки GP0 ноль (установить 0 на выходе) movlw Cr0 ; поместить константу Cr0 в аккумулятор movwf T_Cr ; скопировать содержимое аккумулятора в регистр T_Cr Cr0_Y decfsz T_Cr,F ; goto Cr0_Y ; decfsz T_NC,F ; goto Y_001 ; return ; ;***** Передача нулевого полубита ******************* RCN movlw NCr ; movwf T_NC ; N_001 movlw Cr1 ; movwf T_Cr ; nop ; вместо bsf GPIO nop ; дополнительно Cr1_N decfsz T_Cr,F ; goto Cr1_N ; nop nop ; вместо bсf GPIO nop ; дополнительно movlw Cr0 ; movwf T_Cr ; Cr0_N decfsz T_Cr,F ; goto Cr0_N ; decfsz T_NC,F ; goto N_001 ; return ; ;*********************************************************************************************** end