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