;
DITAMA 2
;
IR-mottagarprogram
;
Protokollet för mottagning är:
;
Nolla som startbit, 4-bitars sändning och etta som stoppbit
list
p=16c84
include P16C84.INC
; hämta namnen på register och dylikt
TMP
EQU
D'12'
; temporär lagring av tecken i CMPI-macro
N
EQU
D'13'
; tidsvariabel 1 i DELAY
N2
EQU
D'14'
; tidsvariabel 2 i DELAY
TECKENSPAR
EQU
D'15'
; det sända tecknet spars här
;**********************************
;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
CALL
DELAYHALV ;
väntar i ca 260µs så att säkra och se att det är startbiten
; samt att vi testar i mitten på varje sänd bit
BTFSC
PORTB,0
; testar om det verkligen är en nolla
GOTO
SLUT
; hopp till SLUT om det inte är en nolla
; Först sparar vi undan det sända tecknet
CALL
DELAY
; väntar tills nästa tecken kommer
BTFSC
PORTB,0
; kollar om teckenbit är en etta
BSF
TECKENSPAR,0 ; sparar en etta
BTFSS
PORTB,0
; kollar om teckenbit är en nolla
BCF
TECKENSPAR,0 ; sparar en nolla
CALL
DELAY
; väntar tills nästa tecken kommer
BTFSC
PORTB,0
; kollar om teckenbit är en etta
BSF
TECKENSPAR,1 ; sparar en etta
BTFSS
PORTB,0
; kollar om teckenbit är en nolla
BCF
TECKENSPAR,1 ; sparar en nolla
CALL
DELAY
; väntar tills nästa tecken kommer
BTFSC
PORTB,0
; kollar om teckenbit är en etta
BSF
TECKENSPAR,2 ; sparar en etta
BTFSS
PORTB,0
; kollar om teckenbit är en nolla
BCF
TECKENSPAR,2 ; sparar en nolla
CALL
DELAY
; väntar tills nästa tecken kommer
BTFSC
PORTB,0
; kollar om teckenbit är en etta
BSF
TECKENSPAR,3 ; sparar en etta
BTFSS
PORTB,0
; kollar om teckenbit är en nolla
BCF
TECKENSPAR,3 ; sparar en nolla
STOPBIT
BTFSS
PORTB,0
GOTO
STOPBIT
; loop tills det kommer en stopbit dvs etta
; Nu kollar vi vilket tecken som vart sänt
CMPI
B'00000001',TECKENSPAR
; jämför med '0001'
BNE
MOVE_ON1
BCF
PORTA,0
; bit 0 på PORTA blir en nolla
CALL
DELAY; i ca 520µs, för att styr-PICen i digitaldelan ska hinna reagera
BSF
PORTA,0
; återställer biten
GOTO
SLUT
; hopp till slut
MOVE_ON1
CMPI
B'00000010',TECKENSPAR
; jämför med '0010'
BNE
MOVE_ON2
BCF
PORTA,1
; bit 1 på PORTA blir en nolla
CALL
DELAY; i ca 520µs, för att styr-PICen i digitaldelan ska hinna reagera
BSF
PORTA,1
; återställer biten
GOTO
SLUT
; hopp till slut
MOVE_ON2
CMPI
B'00000100',TECKENSPAR
; jämför med '0100'
BNE
MOVE_ON3
BCF
PORTA,2
; bit 2 på PORTA blir en nolla
CALL
DELAY; i ca 520µs, för att
styr-PICen i digitaldelan ska hinna reagera
BSF
PORTA,2
; återställer biten
GOTO
SLUT
; hopp till slut
MOVE_ON3
CMPI
B'00001000',TECKENSPAR
; jämför med '1000'
BNE
SLUT
; hopp till slut
BCF
PORTA,3
; bit 3 på PORTA blir en nolla
CALL
DELAY; i ca 520µs, för att styr-PICen i digitaldelan ska hinna reagera
BSF
PORTA,3
; återställer biten
SLUT
CLRF
TECKENSPAR ;
nollställer variabeln
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******************************
;**********************************************************************
;
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
;**********************************************************************
;
DELAY-subrutin som väntar i ca 260µs vid 4MHz
*
;**********************************************************************
DELAYHALV
MOVLW
D'1'
MOVWF
N2
; N2= 1
; N = 0 NÄR VI KOMMER IN -> 256 VARV I INRE LOOP
PLOOPHALV
DECFSZ
N,F
; STEGA NED N , HOPPA ÖVER OM NOLL
GOTO
PLOOPHALV
DECFSZ
N2,F
GOTO
PLOOPHALV
RETURN
;**********************************************************************
;
Initiering av PICens PORTAR
*
;
PORTB = INPUTS-OUTPUTS, PORTA = OUTPUTS
*
;**********************************************************************
INIT_PIC
BSF
STATUS,RP0
; BANK 1
MOVLW
B'00000001'
; PORTB bit 0=INPUT resten OUTPUT
MOVWF
TRISB
; till datariktningsregistret
MOVLW
B'00000000'
; PORTA = OUTPUT
MOVWF
TRISA
; till datariktningsregistret
BCF
OPTION_REG,INTEDG ; RB0/INT triggar på negativ flank
BCF
STATUS,RP0
; BANK 0 igen
MOVLW
B'11111111'
MOVWF
PORTA
; PORTA ska vara hög vid start
CLRF
TECKENSPAR ;
nollställer variabeln
CLRF
INTCON
; nollställer INTCON
BSF
INTCON,GIE
; Global interrupt enable
BSF
INTCON,INTE ;
RB0/INT interrupt enable
RETURN
; return from subroutin
END