Bilaga VII

Assemblerkod till mottagardel till fjärrkontroll

; 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