Bilaga
VIII
Assemblerkod
till sändardel till fjärrkontroll
;
DITAMA 2
;
IR-sändarprogram
;
Protokollet för sändning är:
;
Nolla som startbit, 4-bitars sändning och etta som stoppbit
list
P=16F84
include P16F84.INC
; hämta namnen på register och dylikt
TMP
EQU
D'12'
KNAPPTRYCK
EQU
D'13'
N
EQU
D'14'
N2
EQU
D'15'
;**********************************
;Lite
olika MAKRON
*
;**********************************
CMPI
MACRO
a,b
; CMPI
a,b (b-a)
MOVFW
b
; flyttar b till W-reg
MOVWF
TMP
; flyttar W-reg till TMP
MOVLW
a
; flyttar a till W-reg
SUBWF
TMP,F
; b-a görs, resultat i TMP, b ändras ej
ENDM
; END MACRO
BNE
MACRO
label
; BNE
label
BTFSS
STATUS,Z
; hoppa förbi nästa instruktion
GOTO
label
; om Z=1
ENDM
BEQ
MACRO
label
; BNE
label
BTFSC
STATUS,Z
; hoppa förbi nästa instruktion
GOTO
label
; om Z=1
ENDM
;*********MACRO
SLUT***********************************
ORG
0
GOTO
MAIN
; hoppa över interruptrutinen
;**********************************************************************
; Här
börjar INTERRUPTRUTINEN
*
;**********************************************************************
ORG
4
; här börjar interruptrutinen
INTERRUPT
BSF
PORTA,1
; Power till 555an
CALL
LDELAY
; delay för ev kontaktstudsar
; samt att 555an hinner starta upp
MOVFW
PORTB
; flyttar in PORTB i W-reg
MOVWF
KNAPPTRYCK ; flyttar in nedtryckt knapp i variabel
CMPI
B'11100000',KNAPPTRYCK; Jämför nedtryckt knapp med knapp 1
BNE
MOVE_ON1
CALL
SÄND_1a
; sänder etta
MOVE_ON1
CMPI
B'11010000',KNAPPTRYCK; Jämför nedtryckt knapp med knapp 2
BNE
MOVE_ON2
CALL
SÄND_2a
; sänder tvåa
MOVE_ON2
CMPI
B'10110000',KNAPPTRYCK; Jämför nedtryckt knapp med knapp 3
BNE
MOVE_ON3
CALL
SÄND_3a
; sänder trea
MOVE_ON3
CMPI
B'01110000',KNAPPTRYCK ; Jämför nedtryckt knapp med knapp 4
BNE
KONTROLL
CALL
SÄND_4a
; sänder fyra
KONTROLL
CLRF
PORTA
; nollställer PORTA igen
IGEN
CMPI
B'11110000',PORTB ; kontrollerar så att knapp är uppsläppt
BNE
IGEN
; om knapp är nedtryckt görs en loop
BCF
INTCON,RBIF ;
tillåter avbrott igen bit 7-4
CLRF
KNAPPTRYCK ;
nollställer KNAPPTRYCK
RETFIE
;**********************INTERRUPT
SLUT******************************
;**********************************************************************
; Här
börjar MAIN
*
;**********************************************************************
MAIN
CALL
INIT_PIC
; initiering av PIcen
SOV
SLEEP
; Sleep-mode tills knapptryckning
NOP
; ingenting skall göras INNAN hopp till avbrottsrutin
GOTO
SOV
; hopp till SOV EFTER avbrottsrutin
;**********************MAIN
SLUT******************************
;**********************************************************************
;
Subrutiner som sänder iväg nedtryckt knapp seriellt
*
;
OBS!!! Alla bitarna är inverterade eftersom mottagaren inverterar.
*
; Därför
är alla BSF egentligen 0:or och BCF egentligen 1:or
*
;**********************************************************************
SÄND_1a
; sänder: 0-1000-1
BSF
PORTA,0
; startbit=0
CALL
DELAY
; i ca 520µs
BCF
PORTA,0
; 1
CALL
DELAY
BSF
PORTA,0
; 0
CALL
DELAY
CALL
DELAY
; 0
CALL
DELAY
; 0
BCF
PORTA,0
; Stoppbit=1
RETURN
SÄND_2a
; sänder: 0-0100-1
BSF
PORTA,0
; startbit=0
CALL
DELAY
; i ca 520µs
CALL
DELAY
; 0
BCF
PORTA,0
; 1
CALL
DELAY
BSF
PORTA,0
; 0
CALL
DELAY
CALL
DELAY
; 0
BCF
PORTA,0
; Stoppbit=1
RETURN
SÄND_3a
; sänder: 0-0010-1
BSF
PORTA,0
; startbit=0
CALL
DELAY
; i ca 520µs
CALL
DELAY
; 0
CALL
DELAY
; 0
BCF
PORTA,0
; 1
CALL
DELAY
BSF
PORTA,0
; 0
CALL
DELAY
BCF
PORTA,0
; Stoppbit=1
RETURN
SÄND_4a
; sänder: 0-0001-1
BSF
PORTA,0
; startbit=0
CALL
DELAY
; i ca 520µs
CALL
DELAY
; 0
CALL
DELAY
; 0
CALL
DELAY
; 0
BCF
PORTA,0
; 1
; Stoppbit=1
RETURN
;**********************************************************************
;
DELAY-subrutin som väntar i ca 520µs vid 4MHz
*
;**********************************************************************
DELAY
MOVLW
D'2'
MOVWF
N2
; N2= 2
; N = 0 NÄR VI KOMMER IN -> 256 VARV I INRE LOOP
PLOOP
DECFSZ
N,F
; STEGA NED N , HOPPA ÖVER OM NOLL
GOTO
PLOOP
DECFSZ
N2,F
GOTO
PLOOP
RETURN
; Längre
delay i ca 10ms
LDELAY
MOVLW
D'40'
MOVWF
N2
; N2= 40
; N = 0 NÄR VI KOMMER IN -> 256 VARV I INRE LOOP
LLOOP
DECFSZ
N,F
; STEGA NED N , HOPPA ÖVER OM NOLL
GOTO
LLOOP
DECFSZ
N2,F
GOTO
LLOOP
RETURN
;**********************************************************************
;
Initiering av PICens PORTAR
*
;
PORTB = INPUTS-OUTPUTS, PORTA = OUTPUTS
*
;**********************************************************************
INIT_PIC
BSF
STATUS,RP0
; BANK 1
MOVLW
H'F0'
; PORTB bit 7-4: INPUT, bit 3-0: OUTPUT
MOVWF
TRISB
; till datariktningsregistret
MOVLW
H'00'
; PORTA = OUTPUT
MOVWF
TRISA
; till datariktningsregistret
BCF
STATUS,RP0
; BANK 0 igen
CLRF
PORTA
; sätter PORTA till låg vid start
CLRF
N
; nollställer N
CLRF
KNAPPTRYCK ;
nollställer KNAPPTRYCK
CLRF
INTCON
; nollställer INTCON
BSF
INTCON,GIE
; Global interrupt enable
BSF
INTCON,RBIE ;
PORTB interrupt enable
RETURN
; return from subroutin
END