;*************************************************************************
; FILE: sirc_vevo.asm
; AUTH: Nigel_Goodwin & Jpocok
; DATE: 2010-06-08
; DESC: SIRC IR jelének vétele, LED-ek bekapcsolása.
; NOTE: Tested on 16F628A
;*************************************************************************
     PROCESSOR 16F628A        ; Processzor típusát közli az assemblerrel.
     INCLUDE P16F628A.INC     ; Alapértelmezett beállítások a chip-hez.
     ERRORLEVEL 0,-302        ; Elnyomja a bank-váltás üzeneteit.
     ERRORLEVEL 0,-306        ; Elnyomja a lapváltás üzeneteit.
     RADIX HEX                ; Alapértelmezett számformátum.
     __IDLOCS H'0100'
     __config 0x2118          ; Konfigurációs értékek.
                              ; (_BODEN_OFF _WDT_OFF _LVP_OFF _MCLRE_OFF)
                              ; (_INTRC_OSC_NOCLKOUT)

     cblock  0x20             ; Az általános célú regiszterek kezdőcíme.
             count1           ; Számlálók a késleltető rutinhoz.
             counta
             countb
             LoX
             Bit_Cntr         ; Bit számláló.
             Cmd_Byte         ; Parancs byte.
             Dev_Byte         ; Eszköz byte.
             Flags
             Flags2
             tmp1             ; Átmeneti tárolás.
             tmp2
             tmp3
     endc

LEDPORT  Equ PORTB            ; LEDPORT = 'PORTB'.
LEDTRIS  Equ TRISB            ; A TRIS regiszter állandója.
LED1     Equ 0                ; LED-ek konstansai.
LED2     Equ 1
LED3     Equ 2
LED4     Equ 3

IR_PORT  Equ PORTA            ; PortA az IR-eszköz portja.
IR_TRIS  Equ TRISA
IR_In    Equ 0x02             ; Bemenet hozzárendelése az IR-adatokhoz.

ErrFlag  Equ 0x00             ; Zászlók a fogadott bit kezeléséhez.
StrtFlag Equ 0x01
One      Equ 0x02
Zero     Equ 0x03
New      Equ 0x07             ; Zászló a lenyomott gombhoz.

TV_ID    Equ 0x01             ; TV eszköz azonosítója.
ProgUp   Equ d'16'            ; Nyomógombokhoz tartozó kódok.
ProgDn   Equ d'17'
VolUp    Equ d'18'
VolDn    Equ d'19'

     org     0x0000           ; beállítja a kezdőcímet
                              ; itt indul a program futása

Start
     movlw   0x07             ; Kikapcsoljuk a komparátort
     movwf   CMCON            ; (így a 16F84-re hasonlít).

Initialise
     clrf    PORTA
     clrf    PORTB
     clrf    Flags
     clrf    Dev_Byte
     clrf    Cmd_Byte

SetPorts
     bsf     STATUS,RP0       ; Kiválasztjuk a Register Page 1-et.
     movlw   0x00             ; LEDPORT összes kapuja kimenet.
     movwf   LEDTRIS
     movlw   0xFF             ; IR port összes kapuja bemenet.
     movwf   IR_TRIS
     bcf     STATUS,RP0       ; Vissza a Register Page 0-ra.
     clrf    LEDPORT          ; összes kimenet törlése (L szint)
     call    Kesleltet255     ; Várakozás az IR vevő modul kikapcsolására.

Main
     call    ReadIR           ; Beolvassa az IR-jelet.
     call    ProcKeys         ; Feldolgozza a vett parancsokat.
     goto    Main             ; Végtelen ciklus.

ProcKeys                      ; A vett parancs feldolgozása.
     btfss   Flags2,New
     retlw   0x00             ; Ha nincs gombnyomás, visszatér.
     movlw   TV_ID            ; Ellenőrzi a TV azonosító kódját.
     subwf   Dev_Byte,W
     btfss   STATUS,Z
     retlw   0x00             ; Helytelen kód esetén visszatérés.

LED_1
     movlw   ProgUp           ; 1. kód (ProgUp = 16) tesztelése.
     subwf   Cmd_Byte,w
     btfss   STATUS,Z
     goto    LED_2            ; Ha nem jó a kód, ugrás a LED2-re.

     movf    LEDPORT,W        ; Olvassa PortA-t (a LED státusza miatt),
     movwf   tmp3             ; majd átmeneti regiszterben tárolja.
     btfss   tmp3,LED1        ; Teszteli a visszaadott LED-bitet.
     bsf     LEDPORT,LED1     ; Bekapcsolja a LED-et...
     btfsc   tmp3,LED1
     bcf     LEDPORT,LED1     ; ...vagy kikapcsolja a LED-et.
     bcf     Flags2,New       ; Törli a New zászlót.
     retlw   0x00

LED_2
     movlw   ProgDn           ; 2. kód (ProgDn = 17) tesztelése.
     subwf   Cmd_Byte,w
     btfss   STATUS,Z
     goto    LED_3

     movf    LEDPORT,W
     movwf   tmp3
     btfss   tmp3,LED2
     bsf     LEDPORT,LED2
     btfsc   tmp3,LED2
     bcf     LEDPORT,LED2
     bcf     Flags2,New
     retlw   0x00

LED_3
     movlw   VolUp            ; 3. kód (VolUp = 18) tesztelése.
     subwf   Cmd_Byte,w
     btfss   STATUS,Z
     goto    LED_4

     movf    LEDPORT,W
     movwf   tmp3
     btfss   tmp3,LED3
     bsf     LEDPORT,LED3
     btfsc   tmp3,LED3
     bcf     LEDPORT,LED3
     bcf     Flags2,New
     retlw   0x00

LED_4
     movlw   VolDn            ; 4. kód (VolDn = 19) tesztelése.
     subwf   Cmd_Byte,w
     btfss   STATUS,Z
     retlw   0x00             ; Ha hibás a kód, visszatérés.

     movf    LEDPORT,W
     movwf   tmp3
     btfss   tmp3,LED4
     bsf     LEDPORT,LED4
     btfsc   tmp3,LED4
     bcf     LEDPORT,LED4
     bcf     Flags2,New
     retlw   0x00


; IR rutinok.

; IR-jel olvasása.
ReadIR
     call    Read_Pulse
     btfss   Flags,StrtFlag
     goto    ReadIR           ; Start-impulzusra vár (2.4ms).

Get_Data
     movlw   0x07             ; Előkészíti 7 bit beolvasását.
     movwf   Bit_Cntr
     clrf    Cmd_Byte
Next_RcvBit2
     call    Read_Pulse
     btfsc   Flags,StrtFlag   ; Eltérő Start bit esetén vége.
     goto    ReadIR
     btfsc   Flags,ErrFlag    ; Ha hiba, vége.
     goto    ReadIR

     bcf     STATUS,C
     btfss   Flags,Zero
     bsf     STATUS,C
     rrf     Cmd_Byte,f
     decfsz  Bit_Cntr,f
     goto    Next_RcvBit2

     rrf     Cmd_Byte,f       ; Rendezi a 7 bites csoportot.

Get_Cmd
     movlw   0x05             ; Előkészíti 5 bit beolvasását.
     movwf   Bit_Cntr
     clrf    Dev_Byte
Next_RcvBit
     call    Read_Pulse
     btfsc   Flags,StrtFlag   ; Eltérő Start bit esetén vége.
     goto    ReadIR
     btfsc   Flags,ErrFlag    ; Ha hiba, vége.
     goto    ReadIR

     bcf     STATUS,C
     btfss   Flags,Zero
     bsf     STATUS,C
     rrf     Dev_Byte,f
     decfsz  Bit_Cntr,f
     goto    Next_RcvBit

     rrf     Dev_Byte,f       ; Rendezi az 5 bites csoportot.
     rrf     Dev_Byte,f
     rrf     Dev_Byte,f

     retlw  0x00
; IR-jel olvasás vége.

; Az impulzusszélesség olvasása értéket ad a StrtFlag, One, Zero, vagy
; ErrFlg zászlók valamelyikének.
; Az IR-vevő kimenete alapvetően magas. Ha jelet fogad, alacsonyra vált.

Read_Pulse
     clrf   LoX
     btfss  IR_PORT,IR_In     ; Amíg magas, várakozik.
     goto   $-1
     clrf   tmp1
     movlw  0xC0              ; Késleltetés annak eldöntésére, hogy
     movwf  tmp2              ; történt-e újabb gombnyomás.

Still_High
     btfss   IR_PORT,IR_In    ; Várakozik, míg alacsonyra vált.
     goto    Next
     incfsz  tmp1,f
     goto    Still_High
     incfsz  tmp2,f
     goto    Still_High
     bsf     Flags2,New       ; Ha nem volt gombnyomás,
     goto    Still_High       ; beállítja a New zászlót.

Next
     nop
     nop
     nop
     nop
     nop                      ; Időt biztosít az impulzus 8 bitesre
     nop                      ; alakításához.
     nop
     nop
     nop
     nop
     nop
     nop
     incf    LoX,f
     btfss   IR_PORT,IR_In
     goto    Next             ; Ciklus ismétlése, míg újra magas nem lesz.

; Impulzus-felmérés.
; Ha Zero, One, Start, vagy Error, akkor tesztel.  
Chk_Pulse
     clrf    Flags

TryError
     movf   LoX,W             ; Ha az impulzus túl kicsi, ellenőriz.
     addlw  d'255' - d'20'    ; if LoX <= 20
     btfsc  STATUS,C
     goto   TryZero
     bsf    Flags,ErrFlag     ; Ha hibát talál, beállítja a zászlót.
     retlw  0x00

TryZero
     movf    LoX,W            ; Ha zéró, ellenőriz.
     addlw   d'255' - d'60'   ; if LoX <= 60
     btfsc   STATUS,C
     goto    TryOne
     bsf     Flags,Zero       ; Ha zérót talál, beállítja a zászlót.
     retlw   0x00

TryOne
     movf    LoX,W            ; Ha egy, ellenőriz.
     addlw   d'255' - d'112'  ; if LoX <= 112
     btfsc   STATUS,C
     goto    TryStart
     bsf     Flags,One        ; Ha egyet talál, beállítja a zászlót.
     retlw   0x00

TryStart
     movf    LoX,W            ; Ha start, ellenőriz.
     addlw   d'255' - d'180'  ; if LoX <= 180
     btfsc   STATUS,C
     goto    NoMatch
     bsf     Flags,StrtFlag   ; Start impulzust talált.
     retlw   0x00
NoMatch                       ; Túl hosszú impulzus.
     bsf     Flags,ErrFlag    ; Hibát talált, beállítja zászlót.
     retlw   0x00

; Impulzus-felmérés vége.


; Késleltető rutinok.

Kesleltet255
     movlw   0xff             ; A késleltetés 255ms.
     goto    K0
Kesleltet100
     movlw   d'100'           ; A késleltetés 100ms.
     goto    K0
Kesleltet50
     movlw   d'50'            ; A késleltetés 50ms.
     goto    K0
Kesleltet20
     movlw   d'20'            ; A késleltetés 20ms.
     goto    K0
Kesleltet5
     movlw   0x05             ; A késleltetés 5.000 ms (4 MHz órajel).
K0
     movwf   count1
K1
     movlw   0xC7             ; A késleltetés 1ms.
     movwf   counta
     movlw   0x01
     movwf   countb
Kesleltet_0
     decfsz  counta,f
     goto    $+2
     decfsz  countb,f
     goto    Kesleltet_0

     decfsz  count1,f
     goto    K1
     retlw   0x00

; Késleltető rutinok vége.

     end