T
tabassum
Guest
привет будь-хто може змінити цей код. Мені потрібні всі keywork як миттєвий і активний низький ут put.pls змінити його і надіслати мені фото з шестнадцатірічное спасибоСписок P = 16f84
# INCLUDE <p16f84.inc>
__CONFIG _WDT_OFF
І _PWRTE_ON
І _XT_OSC
;------------------------------------------------- ---------------------
; Визначити Констант
;------------------------------------------------- ---------------------
# DEFINE _OUT1_ PORTB, 0
# DEFINE _OUT2_ PORTB, 1
# DEFINE _OUT3_ PORTB, 2
# DEFINE _OUT4_ PORTB, 3
# DEFINE _OUT5_ PORTB, 4
# DEFINE _OUT6_ PORTB, 5
# DEFINE _OUT7_ PORTB, 6
# DEFINE _OUT8_ PORTB, 7
# DEFINE _IRM_ PORTA, 2
Delay_debounce EQU 255
XTAL_FREQ EQU 4000000
CBLOCK 0x0c0
Температура: 1
Temp1: 1
T10msec_Count: 1
DelayCount: 1
BitCount: 1
IRStatusflag: 1
IRCommd: 1
IRDeviceType: 1
OUT1_Delay: 1
OUT2_Delay: 1
OUT3_Delay: 1
OUT4_Delay: 1
OUT5_Delay: 1
OUT6_Delay: 1
OUT7_Delay: 1
OUT8_Delay: 1
ENDC
; *** Bank0/1/2/3 дзеркальний у всіх банках 0x70, 0xF0, 0x170, 0x1F0, 16 байт
CBLOCK 0x08c
Saved_W: 1; мінлива використовується для
зв'язку порятунку
Saved_Status: 1; мінлива використовується для
зв'язку порятунку
Saved_Pclath: 1;
Saved_Fsr: 1;
Table_Temp: 1; таблиці пошуку змінну Temp
ENDC
; *** Bank1 *** 80 байт (0A0h-0EFh)
CBLOCK 0x0A0
ENDC
; *** Bank2 *** 48 байт (120h-14Fh)
CBLOCK 0x120
ENDC
; ************* Bit мінлива визначення ***************************
# DEFINE _DataIN IRStatusflag, 0
# DEFINE _Wait_Tout IRStatusflag, 1
# DEFINE _Bad_Start IRStatusflag, 2
# DEFINE _Bad_DATA IRStatusflag, 3
; ****************** Макро визначень ***************************** ***
;
; PAGE/BANK0/1/2/3 вибирає реєстр банківських 0/1/2/3.
; Залишити встановлений на BANK0 нормально.
BANK0 MACRO
РМДС СТАТУС, RP0; чіткого вибору банку біт
РМДС STATUS, RP1
РМДС STATUS, IRP; чіткі непряма адресація бітних
ENDM
BANK1 MACRO
БСФ СТАТУС, RP0;
РМДС STATUS, RP1;
РМДС STATUS, IRP; чіткі непряма адресація бітних
ENDM
BANK2 MACRO
РМДС СТАТУС, RP0;
БСФ STATUS, RP1
БСФ STATUS, IRP; встановити біт для непряма адресація
ENDM
BANK3 MACRO
БСФ СТАТУС, RP0;
БСФ STATUS, RP1
БСФ STATUS, IRP; встановити біт для непряма адресація
ENDM
; Макроси для доступу до сторінки безпосередньо
PAGE0 MACRO
РМДС PCLATH, 3
РМДС PCLATH, 4
ENDM
Страніца1 MACRO
БСФ PCLATH, 3
РМДС PCLATH, 4
ENDM
Страніца2 MACRO
РМДС PCLATH, 3
БСФ PCLATH, 4
ENDM
PAGE3 MACRO
БСФ PCLATH, 3
БСФ PCLATH, 4
ENDM
;
; PUSH / POP зберегти й відновити W, PCLATH,
статус і FSR регістрів --
; Використано на переривання
в'їзду / виїзду
PUSH MACRO
MOVWF Saved_W; врятувати ж
р.SWAPF STATUS, W; У swapf навчання, на відміну від movf, торкається ніякого статусу бітів, тому вона використовується тут.
CLRF статусу; наборів для BANK0
MOVWF Saved_Status; зберегти статус обл
MOVF PCLATH, W
MOVWF Saved_Pclath; зберегти pclath
CLRF PCLATH
MOVF FSR, W
MOVWF Saved_Fsr; врятувати FSR обл
ENDM
POP MACRO
MOVF Saved_Fsr, W; отримувати збережені FSR обл
MOVWF FSR; відновити
MOVF Saved_Pclath, W; отримувати збережені pclath
MOVWF PCLATH; відновити
SWAPF Saved_Status, W; отримати статус збережений в ж
MOVWF статусу; відновити статус (і банк)
SWAPF Saved_W, F; Перезавантажити самоврядування в змозі встановити біт
SWAPF Saved_W, W і відновити
ENDM
;
; DISABLE_IRQ відключити глобальний IRQ
DISABLE_IRQ MACRO
МІСЦЕВЕ STOP_INT
STOP_INT РМДС INTCON, GIE; відключити глобального переривання
BTFSC INTCON, GIE; чи інваліди
GoTo STOP_INT; Ні, спробуйте ще раз
ENDM
;
; ENABLE_IRQ дозволити глобальної IRQ
ENABLE_IRQ MACRO
БСФ INTCON, GIE; дозволити глобального переривання
ENDM
; ******************* END макро визначень ***************************
;************************************************* *********************
ORG 0x000; процесор скинути вектор
NOP
clrf PCLATH; забезпечити сторінку біт очищений
GoTo ОСНОВНІ; перейти до початку програми
;**************** Interrupt служби звичайних **************************
ORG 0x004; перервати вектор місцезнаходження
PUSH
Chk_Timer0Intr:
btfsc INTCON, T0IF
Телефонуйте IntrTimer0_Service
Chk_Timer0Intr_Finish:
POP
RETFIE; повернення з переривання
;------------------------------------------------- ----------------------------
Основні Зазвичай START HERE
;------------------------------------------------- ----------------------------
ORG 0x0020
MAIN:
;------------------------------------------------- ----------------------------
; Ім `я: Init_Prog
; ЦЕЛЬ: Встановити програму
Примітка: всі порти Initilaize відомим стан до установки підпрограми називаються
;------------------------------------------------- ----------------------------
Init_Prog:
clrf INTCONclrf INDF
Телефонуйте CLEAR_RAMТелефонуйте Init_PortsCLRF PORTB
CLRF PORTA
clrf T10msec_Count
Телефонуйте Init_Timer0
ENABLE_IRQ
;------------------------------------------------- ----------------------------
; Програма петель почніть тут
;------------------------------------------------- ----------------------------
StartLoop:
Телефонуйте Chk_IRStatus
btfsc _Bad_Start
GoTo Init_forNextData
btfsc _Wait_Tout
GoTo Init_forNextData
btfsc _Bad_DATA
GoTo Init_forNextData
btfsc _DataIN
Телефонуйте Chk_DataIN
GoTo StartLoop
Init_forNextData:
movlw d'10 '
movwf Temp1
Load_DelaySmallLoop:
clrf Temp
Delay_Init:
movfw Temp
sublw d'42 '
до
н.е. Delay_Init
decfsz Temp1, F
GoTo Load_DelaySmallLoop
GoTo StartLoop
;------------------------------------------------- ----------------------------
; Interrupt timer0 служби
;------------------------------------------------- ----------------------------
IntrTimer0_Service:
РМДС INTCON, T0IF
incf Temp, F
Delay_10mS_Loop:
incf T10msec_Count, F
movfw T10msec_Count
xorlw d'39 '
BNZ Delay_10mS_Loop_Finish
clrf T10msec_Count
;
Dec_DelayOUT1:
tstf OUT1_Delay
btfss STATUS, Z
decf OUT1_Delay, F
Dec_DelayOUT1_Finish:
;
Dec_DelayOUT2:
tstf OUT2_Delay
btfss STATUS, Z
decf OUT2_Delay, F
Dec_DelayOUT2_Finish:
;
Dec_DelayOUT3:
tstf OUT3_Delay
btfss STATUS, Z
decf OUT3_Delay, F
Dec_DelayOUT3_Finish:
;
Dec_DelayOUT4:
tstf OUT4_Delay
btfss STATUS, Z
decf OUT4_Delay, F
Dec_DelayOUT4_Finish:
;
Dec_DelayOUT5:
tstf OUT5_Delay
btfss STATUS, Z
decf OUT5_Delay, F
Dec_DelayOUT5_Finish:
;
Dec_DelayOUT6:
tstf OUT6_Delay
btfss STATUS, Z
decf OUT6_Delay, F
Dec_DelayOUT6_Finish:
;
Dec_DelayOUT7:
tstf OUT7_Delay
btfss STATUS, Z
decf OUT7_Delay, F
Dec_DelayOUT7_Finish:
;
Dec_DelayOUT8:
tstf OUT8_Delay
btfss STATUS, Z
decf OUT8_Delay, F
Dec_DelayOUT8_Finish:
;Delay_10mS_Loop_Finish:
Повернення
;------------------------------------------------- ----------------------------
; Назва:
День ДАНИХ В
Примітка:
Не догляду DEVICE ДАНИХ
; "1" = 000,0000
; "2" = 000,0001
, 3 "= 000,0010
;------------------------------------------------- ----------------------------
Chk_DataIN:
РМДС _DataIN
;**************** L1 ************LOOP1:
Toggle_OUT1:
movfw IRCommd
xorlw b'00000000 '
BNZ Toggle_OUT2
;
tstf OUT1_Delay
BNZ Toggle_OUT1_Delay
btfsc _OUT1_
GoTo Set_OUT1_LOW
Set_OUT1_HIGH:
BSF _OUT1_
GoTo Toggle_OUT1_Delay
Set_OUT1_LOW:
РМДС _OUT1_
Toggle_OUT1_Delay:
movlw d'10 '
movwf OUT1_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT2:
movfw IRCommd
xorlw b'00000001 '
BNZ Toggle_OUT3
;
tstf OUT2_Delay
BNZ Toggle_OUT2_Delay
;
btfsc _OUT2_
GoTo Set_OUT2_LOW
Set_OUT2_HIGH:
BSF _OUT2_
GoTo Toggle_OUT2_Delay
Set_OUT2_LOW:
РМДС _OUT2_
Toggle_OUT2_Delay:
movlw d'10 '
movwf OUT2_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT3:
movfw IRCommd
xorlw b'00000010 '
BNZ Toggle_OUT4
;
tstf OUT3_Delay
BNZ Toggle_OUT3_Delay
;
btfsc _OUT3_
GoTo Set_OUT3_LOW
Set_OUT3_HIGH:
BSF _OUT3_
GoTo Toggle_OUT3_Delay
Set_OUT3_LOW:
РМДС _OUT3_
Toggle_OUT3_Delay:
movlw d'10 '
movwf OUT3_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT4:
movfw IRCommd
xorlw b'00000011 '
BNZ Toggle_OUT5
;
tstf OUT4_Delay
BNZ Toggle_OUT4_Delay
;
btfsc _OUT4_
GoTo Set_OUT4_LOW
Set_OUT4_HIGH:
BSF _OUT4_
GoTo Toggle_OUT4_Delay
Set_OUT4_LOW:
РМДС _OUT4_
Toggle_OUT4_Delay:
movlw d'10 '
movwf OUT4_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT5:
movfw IRCommd
xorlw b'00000100 '
BNZ Toggle_OUT6
;
tstf OUT5_Delay
BNZ Toggle_OUT5_Delay
;
btfsc _OUT5_
GoTo Set_OUT5_LOW
Set_OUT5_HIGH:
BSF _OUT5_
GoTo Toggle_OUT5_Delay
Set_OUT5_LOW:
РМДС _OUT5_
Toggle_OUT5_Delay:
movlw d'10 '
movwf OUT5_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT6:
movfw IRCommd
xorlw b'00000101 '
BNZ Toggle_OUT7
;
tstf OUT6_Delay
BNZ Toggle_OUT6_Delay
;
btfsc _OUT6_
GoTo Set_OUT6_LOW
Set_OUT6_HIGH:
BSF _OUT6_
GoTo Toggle_OUT6_Delay
Set_OUT6_LOW:
РМДС _OUT6_
Toggle_OUT6_Delay:
movlw d'10 '
movwf OUT6_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT7:
movfw IRCommd
xorlw b'00000110 '
BNZ Toggle_OUT8
;
tstf OUT7_Delay
BNZ Toggle_OUT7_Delay
;
btfsc _OUT7_
GoTo Set_OUT7_LOW
Set_OUT7_HIGH:
BSF _OUT7_
GoTo Toggle_OUT7_Delay
Set_OUT7_LOW:
РМДС _OUT7_
Toggle_OUT7_Delay:
movlw d'10 '
movwf OUT7_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT8:
movfw IRCommd
xorlw b'00000111 '
BNZ Chk_DataIN_Finish
;
tstf OUT8_Delay
BNZ Toggle_OUT8_Delay
;
btfsc _OUT8_
GoTo Set_OUT8_LOW
Set_OUT8_HIGH:
BSF _OUT8_
GoTo Toggle_OUT8_Delay
Set_OUT8_LOW:
РМДС _OUT8_
Toggle_OUT8_Delay:
movlw d'10 '
movwf OUT8_Delay
GoTo Chk_DataIN_Finish
Chk_DataIN_Finish:
CLRF IRCommd
Повернення
;------------------------------------------------- ----------------------------
; ІК Модуль перевірки статусу
;------------------------------------------------- ----------------------------
Chk_IRStatus:
clrf IRStatusflag; Відкритий IR статус прапор
btfsc _IRM_; Падіння краю імпульсу?
GoTo EndChk_IRStatus; <If> НЕ LOW закрийте
Chk_START_PULSE:
clrf Temp
Wait_GoHIGH:
movfw Temp
btfsc _IRM_
GoTo Chk_START_PULSEWidth; <If> _IRM_ Go High потім перевірити імпульсу
sublw d'15 '; MAX зачекати СНВ PULSE = 4 МСМ
до
н.е. Wait_GoHIGH
GoTo Bad_START
Chk_START_PULSEWidth:
sublw d'12 '; <If> Початок імпульсу (<3.06 мс)
BNC Bad_START
movfw Temp
sublw d'6 ', і (> 1,53 мс) It's OK
до
н.е. Bad_START
;
movlw d'12 '; Отримайте 12 біт
movwf BitCount
clrf IRDeviceType; Відкритий ІК пристрої типу байт
clrf IRCommd; Відкритий IR командування байт
;
Get_data:
clrf Temp
Wait_HitoLowEdge:
movfw Temp
btfss _IRM_
GoTo Chk_HIPulseWidth; <If> _IRM_ Go High потім перевірити імпульсу
sublw d'6 '; MAX зачекати ВЕРХОВНОГО PULSE = 1,5 МСМ
до
н.е. Wait_HitoLowEdge
GoTo WaitDATA_Tout
Chk_HIPulseWidth:
sublw d'4 '; <If> Початок імпульсу (<1 мс) і (> 300 нас) It's OK
BNC Bad_DATA
movfw Temp
sublw d'1 '
до
н.е. Bad_DATA
Wait_LowtoHiEdge:
clrf Temp
Wait_LowtoHiEdge1:
movfw Temp
btfsc _IRM_
GoTo Chk_LowPulseWidth; <If> _IRM_ Go High потім перевірити імпульсу
sublw d'10 '; MAX зачекати СНВ PULSE = 2,5 МСМ
до
н.е. Wait_LowtoHiEdge1
GoTo WaitDATA_Tout
Chk_LowPulseWidth:
sublw d'6 '; <If> Низька імпульсу (<1.6 мс) і (> 300 нас) It's OK
BNC Bad_DATA
movfw Temp
sublw d'1 '
до
н.е. Bad_DATA
movfw Temp
sublw d'3 '; <If> Temp> 1020 нам тоді це ще 1 він 0
до
н.е. Clr_C
Set_C
BSF STATUS, C
GoTo Keep_Data
Clr_C
BCF STATUS, C
Keep_Data:
СБР IRDeviceType, F
СБР IRCommd, F
decfsz BitCount, F; зберігати до завершення 12 біт
GoTo get_data
movlw 4
movwf Temp1
Keep_Data1:; Shift 0 = 4 рази
clrc
СБР IRDeviceType, F
СБР IRCommd, F
decfsz Temp1, F
GoTo Keep_Data1
;
rlf IRCommd, W
movlw b'01111111 '
andwf IRCommd, F
rlf IRDeviceType, F
BSF _DataIN
GoTo EndChk_IRStatus
WaitDATA_Tout:
BSF _Wait_Tout
GoTo EndChk_IRStatus
Bad_START:
BSF _Bad_Start
GoTo EndChk_IRStatus
Bad_DATA:
BSF _Bad_DATA
EndChk_IRStatus:
Повернення
;------------------------------------------------- ----------------------------
; CLEAR_RAM - Скинути все загальні цілі ОЗУ до 0
вПримітка!НЕ ясним таймер, додати CLRWDT де це доречно, якщо включена
; Переконайтеся в тому, щоб бути в bank0
;------------------------------------------------- ----------------------------
CLEAR_RAM:
movlw 0x20; початок RAM bank0
movwf FSR
CLEAR_BANK0:
clrf INDF; Відкритий реєстр відзначив бути FSR
incf FSR, F
movlw 0x7F; випробувань, якщо у верхній
пам'яті bank0
subwf FSR, W
BNZ CLEAR_BANK0; Loop поки всі очищено
movlw 0xA0; початок RAM bank1
MOVwf FSR
CLEAR_BANK1:
clrf INDF; Відкритий реєстр відзначив бути FSR
incf FSR, F
movlw 0xEF; випробувань, якщо у верхній
пам'яті bank1
subwf FSR, W
BNZ CLEAR_BANK1; Loop поки всі очищено
BANK2; виберіть bank2 / 3 (з непряма адресація)
movlw 0x20; початок RAM bank2
movwf FSR
CLEAR_BANK2:
clrf INDF; Відкритий реєстр відзначив бути FSR
incf FSR, F
movlw 0x50; випробувань, якщо у верхній
пам'яті bank2
subwf FSR, W
BNZ CLEAR_BANK2; Loop поки всі очищено
BANK0; встановити на bank0
Повернення
;------------------------------------------------- ----------------------------
; Затримка США = 100 (5 (3 * Констант)) * ВАТ / 4
;------------------------------------------------- ----------------------------
Delay_100uS:; Call = 2 циклів
movlw d'31 '; 1 цикл
movwf DelayCount 1; цикл
decfsz DelayCount;
GoTo $ -1; 1 2 циклів
NOP
NOP
Повернення; 2 циклу
;------------------------------------------------- ----------------------------
; Ініціалізація Timer1 переривань (Set переривати кожні 1 мс ВАТ = 4MHz)
; Час петель = 255 * (OSC / 4) = 255 USEC
;------------------------------------------------- ----------------------------
Init_Timer0:
BANK1
movlw b'11000000 '
andwf OPTION_REG, W
movlw b'00001000 '; використання prescalar для Watchdog таймер
iorwf OPTION_REG, F, використання внутрішніх (Fosc / 4), кол
BANK0
movlw b'00100000 '; Включити Timer0 перервати
iorwf INTCON
Повернення
;------------------------------------------------- ----------------------------
; Ініціалізація порту
;------------------------------------------------- ----------------------------
Init_Ports:
BANK1
BSF STATUS, 5; Вибрати банк 1
BCF STATUS, 6
РМДС OPTION_REG, 5; внутрішнього intstruction циклу годинник (CLKOUT)
РМДС OPTION_REG, 7; Включити PORTB виривати;------------------------------------------------- ----------------------------
; Порта Установка RA0-RA5
;------------------------------------------------- ----------------------------
; RA0 (_OUT1_) виступати в якості виведення
; RA1 (_OUT2_) виступати в якості виведення
; RA2 (_OUT3_) виступати в якості виведення
; RA3 (_IRM_) виступати в якості внеску
; RA4 (OUT5) виступати в якості виведення
; RA5 (OUT6) виступати в якості виведення
;------------------------------------------------- ----------------------------
movlw b'00011111 '
movwf TRISA
movlw b'00000000 '
movwf TRISB
BANK0
Повернення
;------------------------------------------------- ----------------------------
Кінець; директиву 'кінець програми'
# INCLUDE <p16f84.inc>
__CONFIG _WDT_OFF
І _PWRTE_ON
І _XT_OSC
;------------------------------------------------- ---------------------
; Визначити Констант
;------------------------------------------------- ---------------------
# DEFINE _OUT1_ PORTB, 0
# DEFINE _OUT2_ PORTB, 1
# DEFINE _OUT3_ PORTB, 2
# DEFINE _OUT4_ PORTB, 3
# DEFINE _OUT5_ PORTB, 4
# DEFINE _OUT6_ PORTB, 5
# DEFINE _OUT7_ PORTB, 6
# DEFINE _OUT8_ PORTB, 7
# DEFINE _IRM_ PORTA, 2
Delay_debounce EQU 255
XTAL_FREQ EQU 4000000
CBLOCK 0x0c0
Температура: 1
Temp1: 1
T10msec_Count: 1
DelayCount: 1
BitCount: 1
IRStatusflag: 1
IRCommd: 1
IRDeviceType: 1
OUT1_Delay: 1
OUT2_Delay: 1
OUT3_Delay: 1
OUT4_Delay: 1
OUT5_Delay: 1
OUT6_Delay: 1
OUT7_Delay: 1
OUT8_Delay: 1
ENDC
; *** Bank0/1/2/3 дзеркальний у всіх банках 0x70, 0xF0, 0x170, 0x1F0, 16 байт
CBLOCK 0x08c
Saved_W: 1; мінлива використовується для
зв'язку порятунку
Saved_Status: 1; мінлива використовується для
зв'язку порятунку
Saved_Pclath: 1;
Saved_Fsr: 1;
Table_Temp: 1; таблиці пошуку змінну Temp
ENDC
; *** Bank1 *** 80 байт (0A0h-0EFh)
CBLOCK 0x0A0
ENDC
; *** Bank2 *** 48 байт (120h-14Fh)
CBLOCK 0x120
ENDC
; ************* Bit мінлива визначення ***************************
# DEFINE _DataIN IRStatusflag, 0
# DEFINE _Wait_Tout IRStatusflag, 1
# DEFINE _Bad_Start IRStatusflag, 2
# DEFINE _Bad_DATA IRStatusflag, 3
; ****************** Макро визначень ***************************** ***
;
; PAGE/BANK0/1/2/3 вибирає реєстр банківських 0/1/2/3.
; Залишити встановлений на BANK0 нормально.
BANK0 MACRO
РМДС СТАТУС, RP0; чіткого вибору банку біт
РМДС STATUS, RP1
РМДС STATUS, IRP; чіткі непряма адресація бітних
ENDM
BANK1 MACRO
БСФ СТАТУС, RP0;
РМДС STATUS, RP1;
РМДС STATUS, IRP; чіткі непряма адресація бітних
ENDM
BANK2 MACRO
РМДС СТАТУС, RP0;
БСФ STATUS, RP1
БСФ STATUS, IRP; встановити біт для непряма адресація
ENDM
BANK3 MACRO
БСФ СТАТУС, RP0;
БСФ STATUS, RP1
БСФ STATUS, IRP; встановити біт для непряма адресація
ENDM
; Макроси для доступу до сторінки безпосередньо
PAGE0 MACRO
РМДС PCLATH, 3
РМДС PCLATH, 4
ENDM
Страніца1 MACRO
БСФ PCLATH, 3
РМДС PCLATH, 4
ENDM
Страніца2 MACRO
РМДС PCLATH, 3
БСФ PCLATH, 4
ENDM
PAGE3 MACRO
БСФ PCLATH, 3
БСФ PCLATH, 4
ENDM
;
; PUSH / POP зберегти й відновити W, PCLATH,
статус і FSR регістрів --
; Використано на переривання
в'їзду / виїзду
PUSH MACRO
MOVWF Saved_W; врятувати ж
р.SWAPF STATUS, W; У swapf навчання, на відміну від movf, торкається ніякого статусу бітів, тому вона використовується тут.
CLRF статусу; наборів для BANK0
MOVWF Saved_Status; зберегти статус обл
MOVF PCLATH, W
MOVWF Saved_Pclath; зберегти pclath
CLRF PCLATH
MOVF FSR, W
MOVWF Saved_Fsr; врятувати FSR обл
ENDM
POP MACRO
MOVF Saved_Fsr, W; отримувати збережені FSR обл
MOVWF FSR; відновити
MOVF Saved_Pclath, W; отримувати збережені pclath
MOVWF PCLATH; відновити
SWAPF Saved_Status, W; отримати статус збережений в ж
MOVWF статусу; відновити статус (і банк)
SWAPF Saved_W, F; Перезавантажити самоврядування в змозі встановити біт
SWAPF Saved_W, W і відновити
ENDM
;
; DISABLE_IRQ відключити глобальний IRQ
DISABLE_IRQ MACRO
МІСЦЕВЕ STOP_INT
STOP_INT РМДС INTCON, GIE; відключити глобального переривання
BTFSC INTCON, GIE; чи інваліди
GoTo STOP_INT; Ні, спробуйте ще раз
ENDM
;
; ENABLE_IRQ дозволити глобальної IRQ
ENABLE_IRQ MACRO
БСФ INTCON, GIE; дозволити глобального переривання
ENDM
; ******************* END макро визначень ***************************
;************************************************* *********************
ORG 0x000; процесор скинути вектор
NOP
clrf PCLATH; забезпечити сторінку біт очищений
GoTo ОСНОВНІ; перейти до початку програми
;**************** Interrupt служби звичайних **************************
ORG 0x004; перервати вектор місцезнаходження
PUSH
Chk_Timer0Intr:
btfsc INTCON, T0IF
Телефонуйте IntrTimer0_Service
Chk_Timer0Intr_Finish:
POP
RETFIE; повернення з переривання
;------------------------------------------------- ----------------------------
Основні Зазвичай START HERE
;------------------------------------------------- ----------------------------
ORG 0x0020
MAIN:
;------------------------------------------------- ----------------------------
; Ім `я: Init_Prog
; ЦЕЛЬ: Встановити програму
Примітка: всі порти Initilaize відомим стан до установки підпрограми називаються
;------------------------------------------------- ----------------------------
Init_Prog:
clrf INTCONclrf INDF
Телефонуйте CLEAR_RAMТелефонуйте Init_PortsCLRF PORTB
CLRF PORTA
clrf T10msec_Count
Телефонуйте Init_Timer0
ENABLE_IRQ
;------------------------------------------------- ----------------------------
; Програма петель почніть тут
;------------------------------------------------- ----------------------------
StartLoop:
Телефонуйте Chk_IRStatus
btfsc _Bad_Start
GoTo Init_forNextData
btfsc _Wait_Tout
GoTo Init_forNextData
btfsc _Bad_DATA
GoTo Init_forNextData
btfsc _DataIN
Телефонуйте Chk_DataIN
GoTo StartLoop
Init_forNextData:
movlw d'10 '
movwf Temp1
Load_DelaySmallLoop:
clrf Temp
Delay_Init:
movfw Temp
sublw d'42 '
до
н.е. Delay_Init
decfsz Temp1, F
GoTo Load_DelaySmallLoop
GoTo StartLoop
;------------------------------------------------- ----------------------------
; Interrupt timer0 служби
;------------------------------------------------- ----------------------------
IntrTimer0_Service:
РМДС INTCON, T0IF
incf Temp, F
Delay_10mS_Loop:
incf T10msec_Count, F
movfw T10msec_Count
xorlw d'39 '
BNZ Delay_10mS_Loop_Finish
clrf T10msec_Count
;
Dec_DelayOUT1:
tstf OUT1_Delay
btfss STATUS, Z
decf OUT1_Delay, F
Dec_DelayOUT1_Finish:
;
Dec_DelayOUT2:
tstf OUT2_Delay
btfss STATUS, Z
decf OUT2_Delay, F
Dec_DelayOUT2_Finish:
;
Dec_DelayOUT3:
tstf OUT3_Delay
btfss STATUS, Z
decf OUT3_Delay, F
Dec_DelayOUT3_Finish:
;
Dec_DelayOUT4:
tstf OUT4_Delay
btfss STATUS, Z
decf OUT4_Delay, F
Dec_DelayOUT4_Finish:
;
Dec_DelayOUT5:
tstf OUT5_Delay
btfss STATUS, Z
decf OUT5_Delay, F
Dec_DelayOUT5_Finish:
;
Dec_DelayOUT6:
tstf OUT6_Delay
btfss STATUS, Z
decf OUT6_Delay, F
Dec_DelayOUT6_Finish:
;
Dec_DelayOUT7:
tstf OUT7_Delay
btfss STATUS, Z
decf OUT7_Delay, F
Dec_DelayOUT7_Finish:
;
Dec_DelayOUT8:
tstf OUT8_Delay
btfss STATUS, Z
decf OUT8_Delay, F
Dec_DelayOUT8_Finish:
;Delay_10mS_Loop_Finish:
Повернення
;------------------------------------------------- ----------------------------
; Назва:
День ДАНИХ В
Примітка:
Не догляду DEVICE ДАНИХ
; "1" = 000,0000
; "2" = 000,0001
, 3 "= 000,0010
;------------------------------------------------- ----------------------------
Chk_DataIN:
РМДС _DataIN
;**************** L1 ************LOOP1:
Toggle_OUT1:
movfw IRCommd
xorlw b'00000000 '
BNZ Toggle_OUT2
;
tstf OUT1_Delay
BNZ Toggle_OUT1_Delay
btfsc _OUT1_
GoTo Set_OUT1_LOW
Set_OUT1_HIGH:
BSF _OUT1_
GoTo Toggle_OUT1_Delay
Set_OUT1_LOW:
РМДС _OUT1_
Toggle_OUT1_Delay:
movlw d'10 '
movwf OUT1_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT2:
movfw IRCommd
xorlw b'00000001 '
BNZ Toggle_OUT3
;
tstf OUT2_Delay
BNZ Toggle_OUT2_Delay
;
btfsc _OUT2_
GoTo Set_OUT2_LOW
Set_OUT2_HIGH:
BSF _OUT2_
GoTo Toggle_OUT2_Delay
Set_OUT2_LOW:
РМДС _OUT2_
Toggle_OUT2_Delay:
movlw d'10 '
movwf OUT2_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT3:
movfw IRCommd
xorlw b'00000010 '
BNZ Toggle_OUT4
;
tstf OUT3_Delay
BNZ Toggle_OUT3_Delay
;
btfsc _OUT3_
GoTo Set_OUT3_LOW
Set_OUT3_HIGH:
BSF _OUT3_
GoTo Toggle_OUT3_Delay
Set_OUT3_LOW:
РМДС _OUT3_
Toggle_OUT3_Delay:
movlw d'10 '
movwf OUT3_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT4:
movfw IRCommd
xorlw b'00000011 '
BNZ Toggle_OUT5
;
tstf OUT4_Delay
BNZ Toggle_OUT4_Delay
;
btfsc _OUT4_
GoTo Set_OUT4_LOW
Set_OUT4_HIGH:
BSF _OUT4_
GoTo Toggle_OUT4_Delay
Set_OUT4_LOW:
РМДС _OUT4_
Toggle_OUT4_Delay:
movlw d'10 '
movwf OUT4_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT5:
movfw IRCommd
xorlw b'00000100 '
BNZ Toggle_OUT6
;
tstf OUT5_Delay
BNZ Toggle_OUT5_Delay
;
btfsc _OUT5_
GoTo Set_OUT5_LOW
Set_OUT5_HIGH:
BSF _OUT5_
GoTo Toggle_OUT5_Delay
Set_OUT5_LOW:
РМДС _OUT5_
Toggle_OUT5_Delay:
movlw d'10 '
movwf OUT5_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT6:
movfw IRCommd
xorlw b'00000101 '
BNZ Toggle_OUT7
;
tstf OUT6_Delay
BNZ Toggle_OUT6_Delay
;
btfsc _OUT6_
GoTo Set_OUT6_LOW
Set_OUT6_HIGH:
BSF _OUT6_
GoTo Toggle_OUT6_Delay
Set_OUT6_LOW:
РМДС _OUT6_
Toggle_OUT6_Delay:
movlw d'10 '
movwf OUT6_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT7:
movfw IRCommd
xorlw b'00000110 '
BNZ Toggle_OUT8
;
tstf OUT7_Delay
BNZ Toggle_OUT7_Delay
;
btfsc _OUT7_
GoTo Set_OUT7_LOW
Set_OUT7_HIGH:
BSF _OUT7_
GoTo Toggle_OUT7_Delay
Set_OUT7_LOW:
РМДС _OUT7_
Toggle_OUT7_Delay:
movlw d'10 '
movwf OUT7_Delay
GoTo Chk_DataIN_Finish
;
Toggle_OUT8:
movfw IRCommd
xorlw b'00000111 '
BNZ Chk_DataIN_Finish
;
tstf OUT8_Delay
BNZ Toggle_OUT8_Delay
;
btfsc _OUT8_
GoTo Set_OUT8_LOW
Set_OUT8_HIGH:
BSF _OUT8_
GoTo Toggle_OUT8_Delay
Set_OUT8_LOW:
РМДС _OUT8_
Toggle_OUT8_Delay:
movlw d'10 '
movwf OUT8_Delay
GoTo Chk_DataIN_Finish
Chk_DataIN_Finish:
CLRF IRCommd
Повернення
;------------------------------------------------- ----------------------------
; ІК Модуль перевірки статусу
;------------------------------------------------- ----------------------------
Chk_IRStatus:
clrf IRStatusflag; Відкритий IR статус прапор
btfsc _IRM_; Падіння краю імпульсу?
GoTo EndChk_IRStatus; <If> НЕ LOW закрийте
Chk_START_PULSE:
clrf Temp
Wait_GoHIGH:
movfw Temp
btfsc _IRM_
GoTo Chk_START_PULSEWidth; <If> _IRM_ Go High потім перевірити імпульсу
sublw d'15 '; MAX зачекати СНВ PULSE = 4 МСМ
до
н.е. Wait_GoHIGH
GoTo Bad_START
Chk_START_PULSEWidth:
sublw d'12 '; <If> Початок імпульсу (<3.06 мс)
BNC Bad_START
movfw Temp
sublw d'6 ', і (> 1,53 мс) It's OK
до
н.е. Bad_START
;
movlw d'12 '; Отримайте 12 біт
movwf BitCount
clrf IRDeviceType; Відкритий ІК пристрої типу байт
clrf IRCommd; Відкритий IR командування байт
;
Get_data:
clrf Temp
Wait_HitoLowEdge:
movfw Temp
btfss _IRM_
GoTo Chk_HIPulseWidth; <If> _IRM_ Go High потім перевірити імпульсу
sublw d'6 '; MAX зачекати ВЕРХОВНОГО PULSE = 1,5 МСМ
до
н.е. Wait_HitoLowEdge
GoTo WaitDATA_Tout
Chk_HIPulseWidth:
sublw d'4 '; <If> Початок імпульсу (<1 мс) і (> 300 нас) It's OK
BNC Bad_DATA
movfw Temp
sublw d'1 '
до
н.е. Bad_DATA
Wait_LowtoHiEdge:
clrf Temp
Wait_LowtoHiEdge1:
movfw Temp
btfsc _IRM_
GoTo Chk_LowPulseWidth; <If> _IRM_ Go High потім перевірити імпульсу
sublw d'10 '; MAX зачекати СНВ PULSE = 2,5 МСМ
до
н.е. Wait_LowtoHiEdge1
GoTo WaitDATA_Tout
Chk_LowPulseWidth:
sublw d'6 '; <If> Низька імпульсу (<1.6 мс) і (> 300 нас) It's OK
BNC Bad_DATA
movfw Temp
sublw d'1 '
до
н.е. Bad_DATA
movfw Temp
sublw d'3 '; <If> Temp> 1020 нам тоді це ще 1 він 0
до
н.е. Clr_C
Set_C
BSF STATUS, C
GoTo Keep_Data
Clr_C
BCF STATUS, C
Keep_Data:
СБР IRDeviceType, F
СБР IRCommd, F
decfsz BitCount, F; зберігати до завершення 12 біт
GoTo get_data
movlw 4
movwf Temp1
Keep_Data1:; Shift 0 = 4 рази
clrc
СБР IRDeviceType, F
СБР IRCommd, F
decfsz Temp1, F
GoTo Keep_Data1
;
rlf IRCommd, W
movlw b'01111111 '
andwf IRCommd, F
rlf IRDeviceType, F
BSF _DataIN
GoTo EndChk_IRStatus
WaitDATA_Tout:
BSF _Wait_Tout
GoTo EndChk_IRStatus
Bad_START:
BSF _Bad_Start
GoTo EndChk_IRStatus
Bad_DATA:
BSF _Bad_DATA
EndChk_IRStatus:
Повернення
;------------------------------------------------- ----------------------------
; CLEAR_RAM - Скинути все загальні цілі ОЗУ до 0
вПримітка!НЕ ясним таймер, додати CLRWDT де це доречно, якщо включена
; Переконайтеся в тому, щоб бути в bank0
;------------------------------------------------- ----------------------------
CLEAR_RAM:
movlw 0x20; початок RAM bank0
movwf FSR
CLEAR_BANK0:
clrf INDF; Відкритий реєстр відзначив бути FSR
incf FSR, F
movlw 0x7F; випробувань, якщо у верхній
пам'яті bank0
subwf FSR, W
BNZ CLEAR_BANK0; Loop поки всі очищено
movlw 0xA0; початок RAM bank1
MOVwf FSR
CLEAR_BANK1:
clrf INDF; Відкритий реєстр відзначив бути FSR
incf FSR, F
movlw 0xEF; випробувань, якщо у верхній
пам'яті bank1
subwf FSR, W
BNZ CLEAR_BANK1; Loop поки всі очищено
BANK2; виберіть bank2 / 3 (з непряма адресація)
movlw 0x20; початок RAM bank2
movwf FSR
CLEAR_BANK2:
clrf INDF; Відкритий реєстр відзначив бути FSR
incf FSR, F
movlw 0x50; випробувань, якщо у верхній
пам'яті bank2
subwf FSR, W
BNZ CLEAR_BANK2; Loop поки всі очищено
BANK0; встановити на bank0
Повернення
;------------------------------------------------- ----------------------------
; Затримка США = 100 (5 (3 * Констант)) * ВАТ / 4
;------------------------------------------------- ----------------------------
Delay_100uS:; Call = 2 циклів
movlw d'31 '; 1 цикл
movwf DelayCount 1; цикл
decfsz DelayCount;
GoTo $ -1; 1 2 циклів
NOP
NOP
Повернення; 2 циклу
;------------------------------------------------- ----------------------------
; Ініціалізація Timer1 переривань (Set переривати кожні 1 мс ВАТ = 4MHz)
; Час петель = 255 * (OSC / 4) = 255 USEC
;------------------------------------------------- ----------------------------
Init_Timer0:
BANK1
movlw b'11000000 '
andwf OPTION_REG, W
movlw b'00001000 '; використання prescalar для Watchdog таймер
iorwf OPTION_REG, F, використання внутрішніх (Fosc / 4), кол
BANK0
movlw b'00100000 '; Включити Timer0 перервати
iorwf INTCON
Повернення
;------------------------------------------------- ----------------------------
; Ініціалізація порту
;------------------------------------------------- ----------------------------
Init_Ports:
BANK1
BSF STATUS, 5; Вибрати банк 1
BCF STATUS, 6
РМДС OPTION_REG, 5; внутрішнього intstruction циклу годинник (CLKOUT)
РМДС OPTION_REG, 7; Включити PORTB виривати;------------------------------------------------- ----------------------------
; Порта Установка RA0-RA5
;------------------------------------------------- ----------------------------
; RA0 (_OUT1_) виступати в якості виведення
; RA1 (_OUT2_) виступати в якості виведення
; RA2 (_OUT3_) виступати в якості виведення
; RA3 (_IRM_) виступати в якості внеску
; RA4 (OUT5) виступати в якості виведення
; RA5 (OUT6) виступати в якості виведення
;------------------------------------------------- ----------------------------
movlw b'00011111 '
movwf TRISA
movlw b'00000000 '
movwf TRISB
BANK0
Повернення
;------------------------------------------------- ----------------------------
Кінець; директиву 'кінець програми'