Code:
;nur azrin hilmi
;gdp 17-telemetr
LIST P=RF675K ; list directive to define processor
#include <RF675K.INC> ; processor specific variable definitions
;**************define variables*********************************
#define sensor GPIO, 1
#define txd GPIO, 2 ; (Output) Transmit Data
#define pb3 GPIO, 3 ; (Input Only) Push button switch GP3
#define pb4 GPIO, 4 ; (Input) Push button switch GP4
#define rfena GPIO, 5 ; (Output) RF Enable
; GPIO Pins = xx543210
; #define gptris b'00011011'
#define TGUARD d'5'
#define exor b'00000000'
#define total d'8'
; #define rtime d'5'
;***************************************************************
org 0x00
goto initialize
org 0x004
movwf w_temp
swapf STATUS,W
bcf STATUS, 5 ;select bank 0
movwf status_temp ;save status register
;***************************************************************
; interrupt service routine (ISR)
; interrupt on change on pin of gpio
movfw GPIO
bcf INTCON,0
;**************************************************************
swapf status_temp,w ;set bank into original state
movwf STATUS
swapf w_temp,F
swapf w_temp,W
retfie
;***************************************************************
WaitxTE
movwf Count2 ; [1]
waitxlp
movlw D'30' ; [1]
movwf Count ; [1]
wait400lp
nop ; [1]
nop ; [1]
decfsz Count,F ; [1]
goto wait400lp ; [2]
; --------
; 79 x 5 = 395us
decfsz Count2,F ; [1]
goto waitxlp ; [2]
retlw 0 ; [2]
; total 2 (call) + W x (395 + 5) + 2 (return)
; w = 1 -> 406us @4MHz
; w = 2 -> 806us @4MHz
;*************************************************************
;initialize pic
;*************************************************************
initialize
;clearing all ports
CLRF nobit
CLRF nobit2
clrf input
clrf store
clrf rotateright
clrf Count
clrf Count2
clrf ltime
clrf rtime
;disable global interrupts during initialization
bcf INTCON,7
;calibrating the internal oscillator
; bsf STATUS,5 ;select bank 1
call 0x3FF
movwf OSCCAL
; bcf STATUS,5
;turn off the comparator
bsf STATUS,5
clrf ANSEL ; clear ansel register
bcf STATUS,5
clrf GPIO ; initialize General Purpose Input Output to 0
;setting gpio register to the cosrresponding io pin
bsf STATUS,5
bsf TRISIO,0
bsf TRISIO,1
bsf TRISIO,4
bcf TRISIO,2
bCf TRISIO,5
bcf STATUS,5 ;select bank 0
;set bit 0:2 at register cmcon ;setting gp2 as digital output |offkan comparator
bsf STATUS,5
bsf CMCON,0
bsf CMCON,1
bsf CMCON,2
BCF STATUS,5
; VRCON register ; CVref circuit powered down,no Idd drain
bsf STATUS,5
bcf VRCON, 7
bcf STATUS,5
;****************************************************************
;****timer1 module gate control**********************************
; disabling timer1
bsf STATUS, 5 ; select Bank 1
movlw b'01000100' ; disable TIMER1
movwf T1CON ;
bcf STATUS, 5 ; select Bank 0
;****************************************************************
;weak pull-up register (wpu)
;each pull-up is automatically turned off when the pin is configured as an output
bsf STATUS,5
movlw b'00010000'
movwf WPU
bcf STATUS,5
;***************set pin for config_address regsiter
;OPTION Register
; OPTION_REG contains control bits to configure:
; Weak pull-ups on GPIO (see also WPU Register above)
; External GP2/INT interrupt
; TMR0
; TMR0/WDT prescaler
bsf STATUS,5 ; ---- Select Bank 1 -----
bcf OPTION_REG, NOT_GPPU ; GPIO pull-ups: enabled
bsf OPTION_REG, INTEDG ; Interrupt Edge: on rising edge of GP2/INT pin
bcf OPTION_REG, T0CS ; TMR0 Clock Source: internal instruction cycle (CLKOUT)
bcf OPTION_REG, T0SE ; TMR0 Source Edge: increment low-to-high transition on GP2/T0CKI pin
bcf OPTION_REG, 3 ; Prescaler Assignment: assigned to TIMER0
; TMR0 Prescaler Rate: 1:2
bcf OPTION_REG, 2 ; Prescaler Rate Select bit 2
bcf OPTION_REG, 1 ; Prescaler Rate Select bit 1
bcf OPTION_REG, 0 ; Prescaler Rate Select bit 0
bcf STATUS, 5 ; ---- Select Bank 0 -----
;***************************************************************
;interrupt on-change register
bsf STATUS,5
movlw b'00011011' ;enable global interrupts in order for the individual pin to be configured(kalo switch
movwf IOC
movlw b'00000000' ;peripheral interrupt register; disable
movwf PIE1
bcf STATUS,5
movlw b'00001000' ;enable interrupt control register
movwf INTCON
;******************************************************************
;MAIN PROGRAM
;*****************************************************************8
MAIN
bsf INTCON,7 ; enable global interrupts
; bsf rfena ; enable transmitter
call BITCHECK
;*****************************************************************
;CHECK INPUT
;*****************************************************************
BITCHECK
btfsc nobit2,3
goto TRANSMIT
movfw GPIO
movwf input
incf nobit2,f
movfw nobit2
movwf nobit
btfsc nobit2,2
goto checkleft ;for bit number 4,5,6,7
goto checkright ;for bit number 1,2,3,8
checkleft
btfsc nobit2,1
goto rleft
btfsc nobit2,0
goto bit5
goto rright1
return;
checkright
btfsc nobit2,3
goto rleft
return;
rright1
movlw d'5'
movwf rtime
return;
rright
decf rtime,f
decfsz nobit
goto rright
; movwf rtime
rotater
rrf input,f
decfsz rtime
goto rotater
movfw input
xorwf store,w
movwf store
goto BITCHECK
return;
bit5
movfw input
xorwf store,w
movwf store
goto BITCHECK
return;
rleft
movfw nobit
movwf ltime
decf ltime
decf ltime
decf ltime
decf ltime
decf ltime
return
rotatel
rlf input,f
decfsz ltime
goto rotatel
movfw input
xorwf store,w
movwf store
goto BITCHECK
return;
TRANSMIT
bsf GPIO,5
; send preamble (50% duty cycle)
Preamble ;send 16 bit
movlw d'16'
movwf BitCount ; init number of preamble bits
PreL
bsf txd ; ON
movlw 1
call WaitxTE ; delay
bcf txd ; OFF
movlw 1
call WaitxTE ; delay
decfsz BitCount,F ; loop
goto PreL
; sync pause
TXloop
movlw d'10'
call WaitxTE ; Theader = 10 x Te
; send 72 bit pattern
movlw store ; lsb first
movwf FSR
TXNextByte
movlw D'8'
movwf BitCount
TXNextBit
rrf INDF,W ; 8 bit rotate | rotate right f through carry
rrf INDF,F ; Carry contain lsb
BC ONE ; branch on carry | goto ONE if bit is set
ZERO ;wave pattern if the bit is zero
movlw 2 ;
movwf TimeHi ; +---+---+ +--
movlw 1 ; | | |
movwf TimeLo ;---+ +---+
goto Trasm_BIT ; | 2Te Te |
ONE ;wave pattern if the bit is one
movlw 1 ;
movwf TimeHi ; +---+ +--
movlw 2 ; | | |
movwf TimeLo ;---+ +---+---+
; | Te 2Te |
Trasm_BIT
bsf txd ; ON
movf TimeHi,W
call WaitxTE
bcf txd ; OFF
movf TimeLo,W
call WaitxTE
decfsz BitCount,F
goto TXNextBit ; loop on bits
; guard time
movlw TGUARD
call WaitxTE
org 0x3ff
retlw 0x80
;----------------------------------------------------------------------
end ; end of program directive
;----------------------------------------------------------------------
Bookmarks