Делаем ИК-пульт ДУ для фотоаппарата

errorlevel 0,-207,-205,-302,-203#include

__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

LED equ 5; ИК-светодиодCFG equ 4; Nikon (1) / Canon (0)

;===============================================================================; Переменные;===============================================================================

CBLOCK 0×020DELDEL_MSIMPCOUNTENDC

;===============================================================================; Сброс;===============================================================================

ORG 0GOTO START

;===============================================================================; Прерывания;===============================================================================

ORG 4RETFIE

;===============================================================================; Подпрограммы;===============================================================================

; Подпрограмма задержки (в микросекундах, 770 мкс max);(Перед вызовом поместить величину задержки в W)DEL_MK MOVWF DELM1 DECFSZ DEL, FGOTO M1RETLW 0

; Подпрограмма задержки (в миллисекундах, 256 мс max);(Перед вызовом поместить величину задержки в W)DEL_M MOVWF DEL_MSMOVLW 0xA5M2 CALL DEL_MKCALL DEL_MKDECFSZ DEL_MS, FGOTO M2RETLW 0

; Подпрограмма вывода импульса для Nikon (заполнение 38,4 кГц);(Перед вызовом поместить длительность импульса в W)NIK MOVWF IMPM3 BCF GPIO, LEDMOVLW 0×02CALL DEL_MKNOPBSF GPIO, LEDMOVLW 0×01CALL DEL_MKNOPDECFSZ IMP, FGOTO M3RETLW 0

; Подпрограмма вывода сигнала для NikonNIKON MOVLW 0×4DCALL NIK; импульс 2 мсMOVLW 0×12CALL DEL_M; пауза 27,8 мсMOVLW 0×47CALL DEL_MKMOVLW 0×0FCALL NIK; импульс 0,4 мсMOVLW 0×01CALL DEL_M; пауза 1,6 мсMOVLW 0×69CALL DEL_MKMOVLW 0×0FCALL NIK; импульс 0,4 мсMOVLW 0×02CALL DEL_M; пауза 3,6 мсMOVLW 0xFFCALL DEL_MKMOVLW 0×0FCALL NIK; импульс 0,4 мсRETLW 0

; Подпрограмма вывода импульса для Canon (заполнение 33 кГц);(Перед вызовом поместить длительность импульса в W)CAN MOVWF IMPM4 BCF GPIO, LEDMOVLW 0×02CALL DEL_MKNOPNOPNOPBSF GPIO, LEDMOVLW 0×01CALL DEL_MKNOPNOPNOPDECFSZ IMP, FGOTO M3RETLW 0

; Подпрограмма вывода сигнала для CanonCANON MOVLW 0×13CALL CAN; импульс 0,5 мсMOVLW 0×05CALL DEL_M; пауза 7,3 мсMOVLW 0×13CALL CAN; импульс 0,5 мсRETLW 0

; Подпрограмма задержки на 1 секунду 0xA1DEL_1S MOVLW 0xFFCALL DEL_MMOVLW 0xFFCALL DEL_MMOVLW 0×88CALL DEL_MRETLW 0

;===============================================================================; Основная программа;===============================================================================

START BCF STATUS, RP0; Выбран банк 0MOVLW B'00000000'MOVWF INTCONMOVLW B'00000111'MOVWF CMCON; Отключаем встроенные компараторы

BSF STATUS, RP0; Выбран банк 1MOVLW B'00000111'MOVWF OPTION_REGCALL 3FFh; Загрузить константу калибровки генератораMOVWF OSCCALMOVLW B'00011111'; Порты (направление)MOVWF TRISIOMOVLW B'00010111'; Подтягивающие резисторыMOVWF WPU

BCF STATUS, RP0; Выбран банк 0

MOVLW B'00100000'; ПортыMOVWF GPIO

;--------------------------

MOVLW 0×12CALL DEL_M

LP1 BTFSS GPIO, CFGCALL CANONBTFSS GPIO, CFGGOTO LP2CALL NIKON

LP2 MOVF GPIO, W; Считать состояние перемычекANDLW B'00000111'ADDLW B'11111000'MOVWF COUNTCOMF COUNT, F

BTFSC STATUS, Z; Выключение, если нетSLEEP

MOVF COUNT, WXORLW 0×01; Включен 1 таймингBTFSC STATUS, ZGOTO SET2

MOVF COUNT, WXORLW 0×02; Включен 2 таймингBTFSC STATUS, ZGOTO SET4

MOVF COUNT, WXORLW 0×03; Включен 3 таймингBTFSC STATUS, ZGOTO SET8

MOVF COUNT, WXORLW 0×04; Включен 4 таймингBTFSC STATUS, ZGOTO SET15

MOVF COUNT, WXORLW 0×05; Включен 5 таймингBTFSC STATUS, ZGOTO SET30

MOVF COUNT, WXORLW 0×06; Включен 6 таймингBTFSC STATUS, ZGOTO SET1M

GOTO SET2M; Включен 7 тайминг

SET2 MOVLW 0×02GOTO TIME

SET4 MOVLW 0×04GOTO TIME

SET8 MOVLW 0×08GOTO TIME

SET15 MOVLW 0×0FGOTO TIME

SET30 MOVLW 0×1EGOTO TIME

SET1M MOVLW 0×3CGOTO TIME

SET2M MOVLW 0×78GOTO TIME

TIME MOVWF COUNTLP3 CALL DEL_1S

DECFSZ COUNT, FGOTO LP3

GOTO LP1

END

© Habrahabr.ru