LIST P=PIC16F84A ;********************************************************************* ; RF Telecommand - RX-433.92MHz - ASK ; Date: 08.10.2003. V.1.0 ; YT2FSG - Stankovic Goran dipl.ing.el. E-mail: goranstak@gmail.com ;********************************************************************* #include P16F84A.INC __FUSES (_CP_ON & _WDT_ON & _XT_OSC & _PWRTE_ON ) DATA0 equ 0Ch DATA1 equ 0Dh DATA2 equ 0Eh DATA3 equ 0Fh DATA4 equ 10h DATA5 equ 11h DATA6 equ 12h DATA7 equ 13h BR_BIT equ 15h BR_BYTE equ 16h COUNT equ 17h ; loop counter variable MSEC equ 18h SEC equ 19h MIN equ 1Ah SAT equ 1Bh TW equ 1Ch TIMEHI equ 20h TIMELO equ 21h FLEGS equ 2Fh #define _C STATUS,0 #define _Z STATUS,2 #define IN0 PORTA,0 #define IN1 PORTA,1 #define PWM_IN PORTA,2 #define PWM PORTA,3 ;out #define BITE FLEGS,1 PREBIT equ .2 ;******************************************************************************** org 0x00 goto START org 04 ;INTERRUPT retfie ;------------------------------------------------------------ START btfss STATUS,4 ;TO goto Skok_WDT btfss STATUS,3 ;PD goto Skok_WDT ; Power-On Reset call Init_port call Init_data bcf INTCON,RBIF goto MAIN ;------------------------------------------ Skok_WDT call Init_port ;------------------------------------------ MAIN Receive ;Q=4.096MHz/4/256=4000Hz => 0.25ms CLRWDT ;Clear WDT bsf PWM btfsc PWM_IN goto Receive bcf PWM clrf BR_BIT Rise btfsc PWM_IN ;Wait rising egde goto Rise2 call Delay10 ; 24us per cycle call Delay9 incfsz BR_BIT,F ;>6.0ms timeout goto Rise goto Receive Rise2 btfss BR_BIT,7 ;? bit7=1 ok goto Receive ; < 3.0ms timeout ; - - - - - - - - - - - - - - - - - - - - - movlw .32 ;64 ; 8 bit per byte movwf BR_BIT FirstPreload bsf PWM movlw PREBIT movwf TIMEHI goto WHL RNextBit bsf PWM movlw PREBIT-2 movwf TIMEHI WHL incf TIMEHI,F btfsc _Z goto Receive ;>1.2ms timeout btfsc PWM_IN goto WHL bcf PWM movlw PREBIT movwf TIMELO WLL incf TIMELO,F btfsc _Z goto Receive ;>1.2ms timeout btfss PWM_IN goto WLL bsf PWM movf TIMEHI,W subwf TIMELO,F ; ? TIMEHI > TIMELO => _C=0 rrf DATA7,F rrf DATA6,F rrf DATA5,F rrf DATA4,F rrf DATA3,F rrf DATA2,F rrf DATA1,F rrf DATA0,F movlw 0xE0 andwf TIMELO,W ; >200us (32 cycles) btfsc _Z goto Receive ;>no! it' a preamble decfsz BR_BIT,F goto RNextBit movf DATA0,W btfsc IN1 goto IN1_set btfsc IN0 movf DATA1,W goto IN_pres IN1_set movf DATA2,W btfsc IN0 movf DATA3,W IN_pres movwf PORTB goto Receive goto MAIN ;------------------------------------------------------------------------- Delay10 nop Delay9 nop Delay8 nop Delay7 nop Delay6 nop Delay5 nop Delay4 retlw 0 ; 2 call + N nop + 2 retlw ;------------------------------------------------------------------------- Delay_1ms movlw .240 movwf COUNT D_Loop nop decfsz COUNT,F goto D_Loop return ;---------------------------------------------------------------- Init_port clrf STATUS clrf INTCON bsf STATUS, RP0 ; Bank 1 movlw B'00001111' ; Prescaler : 128 for WDT movwf OPTION_REG movlw B'00010111' movwf TRISA ; RA0 1 2 4 input, RA3 outputs movlw 0x00 movwf TRISB ; RB7-0 outputs bcf STATUS, RP0 ; Bank 0 clrf PORTA clrf PORTB return ;------------------------------------------------------------------------- Init_data clrf FLEGS clrf DATA0 clrf DATA1 clrf DATA2 clrf DATA3 clrf DATA4 clrf DATA5 clrf DATA6 clrf DATA7 return ;------------------------------------------------------------------------- END