; PIC terminal v1.01

;A KÖVETKEZŐ, MEGJEGYZÉSEKKEL BŐSÉGESEN ELLÁTOTT PROGRAM-
;LISTA AZOKNAK KÍVÁN SEGÍTSÉGET NYÚJTANI, AKIK NEM CSAK 
;HASZNÁLNI AKARJÁK AZ LDR-KEY LETÖLTŐT, HANEM A MŰKÖDÉ-
;SÉT MEG IS AKARJÁK ÉRTENI. A LETÖLTŐ HASZNÁLATÁHOZ EZT A
;PROGRAMOT KELL A KIVÁLASZTOTT PIC16F8XX TOK ELSŐ HÁROM
;PROGRAMHELYÉRE ÉS A LEGVÉGÉBE (AZ UTOLSÓ 256 SZÓBA) 
;BEÉGETNI. EZ AKÁR A PICSTART PLUS AKÁR A MPLAB-ICD 
;DEBUGERREL MEGTEHETŐ.
;
;A DEFINICIÓBAN MEGADOTT LÁBHOZ ÉS A TÁPFESZÜLTSÉGHEZ 
;(+5V, GND) CSATLAKOZTATOTT LDR-KEY MÁR HASZNÁLHATÓ A 
;PC SOROS VONALÁN KERESZTÜL A DWNLDR.EXE WINDOWS-OS PROGRAM
;FELHASZNÁLÁSÁVAL  
;
;---------------[A LETÖLTŐ MŰKÖDÉSE RÖVIDEN]-------------------
;
;MIVEL A FLASH PROGRAM-MEMÓRIAHELYEK PROGRAMOZÁSA HOSSZÚ IDEIG 
;TART EZÉRT A BEÉGETENDŐ ADATOKAT TARTALMAZÓ HEX FÁJLT VAGY 
;OLYAN LASSAN TÖLTJÜK LE, HOGY KÖZBEN LEGYEN ELÉG IDŐ A SZAVAK 
;PROGRAMOZÁSÁRA, VAGY MINDIG EGY SORT NAGY SEBESSÉGGEL EGY 
;PUFFERBE LETÖLTJÜK, MAJD EZT A SORT A PUFFERBŐL ÉGETJÜK BE.
;AZ LDR-KEY EZ UTÓBBI MEGOLDÁST HASZNÁLJA.

;A PROGRAM MEGÉRTÉSÉHEZ AZ MPASM PIC ASSEMBELER ALAPFOKÚ
;ISMERETE SZÜKSÉGES
;
;ÜDVÖZLETTEL, A PROGRAM KÉSZÍTŐI:

;KÜLLŐS MÁTÉ ÉS DR. KÓNYA LÁSZLÓ (ÉS A MICROCHIP FEJLESZTŐI..;-))
;================================================================
	LIST P=16F877	; PROCESSZOR TÍPUS
;(AZ MPLAB OTIONS > DEVELOPMENT MODE... MENÜJÉNEK PROCESSOR 
;BEÁLLÍTÁSA FELÜLBIRÁLJA!)
;
;-----------------[ MONITOR KEZDŐCIM PROCESSZORTIPUSOKNÁL ]------ 
IFDEF	TEST
#DEFINE		MONITOR		0X1E00
INCLUDE "P16F877.INC"
ELSE
  IFDEF __16F870
    #DEFINE	MONITOR		0X0700
    INCLUDE "P16F870.INC"
  ENDIF
  IFDEF __16F871
    #DEFINE	MONITOR		0X0700
    INCLUDE "P16F871.INC"
  ENDIF
  IFDEF __16F872
    #DEFINE	MONITOR		0X0700
    INCLUDE "P16F872.INC"
  ENDIF
  IFDEF __16F873
    #DEFINE	MONITOR		0X0F00
    INCLUDE "P16F873.INC"
  ENDIF
  IFDEF __16F874
    #DEFINE	MONITOR		0X0F00
    INCLUDE "P16F874.INC"
  ENDIF
  IFDEF __16F876
    #DEFINE	MONITOR		0X1F00
    INCLUDE "P16F876.INC"
  ENDIF
  IFDEF __16F877
    #DEFINE	MONITOR		0X1F00
    INCLUDE "P16F877.INC"
  ENDIF
ENDIF
;A LETÖLTÖTT PROGRAM NEM HASZNALHATJA A CONFIG DIREKTIVÁT!!!
;AZÉRT MERT AZT MOST FIXEN BEÁLLÍTJUK. HA A BEÁLLÍTÁS NEM JÓ
;A LETÖLTŐ BEÉGETÉSE ELŐTT ITT KELL MÓDOSÍTANI! 
	__CONFIG	_CP_OFF&_DEBUG_OFF&_WRT_ENABLE_ON&_CPD_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC  
;
;-----------------[ DEFINICIÓK ]-------------------------------------

;#DEFINE		TEST		; DEBUG HASZNÁLATÁHOZ
;AZ ELŐZŐ SORRA CSAK A FEJLESZTÉS IDEJÉN VOLT SZÜKSÉG

#DEFINE		COMM_PIN	PORTB,7	; KOMMUNIKÁCIÓS PORTLÁB

;!!!	A FELHASZNÁLÓNAK EZT KELL "TESTRE SZABNIA"	!!!
;EZ A SOR MONDJA MEG, HOGY MELYIK LÁBAT SZERETNÉNK FELHASZNÁLNI
;-----------------[ VÁLTOZÓK ]---------------------------------------
;A LETÖLTŐ MŰKÖDÉSEKOR HASZNÁLTAK, KÜLÖNBEN SZABADON HASZNÁLHATÓK A
;FELHASZNÁLÓI PROGRAMBAN

BUFFER	EQU	0X20	;PUFFER A LETOLTOTT HEX REKORDOKNAK

;A 70H...7FH CÍMEN LÉVŐ REGISZTEREK MINDEN LAPRÓL ELÉRHETŐK (KÖZÖS)
CBLOCK	0X73		;DEFINICIOK A KOZOS ADATTERULETRE
	RXBYTE		;SOROS VONALON VETT ADATBÁJT
	BITCOUNTER	;BITSZÁMLÁLÓ A SOROS VÉTELHEZ
	HBITTIMEL	;BITIDŐ IDŐZÍTÉS
	HBITTIMEH	;     "
	TEMP		;SEGÉDVÁLTOZÓ
	TEMP1		;   "
	BYTECOUNT	;A REKORDBAN LÉVŐ BÁJTOK SZÁMA
	ADDRH		;LETÖLTÉSI CÍM FELSŐ BÁJTJA
	ADDRL		;LETÖLTÉSI CÍM ALSÓ BÁJTJA
	RECTYPE		;A LETÖLTÖTT REKORD TÍPUSA
	HEXDATAH	;A BEÍRANDÓ PROGRAMSZÓ FELSŐ FELE
	HEXDATAL	;A BEÍRANDÓ PROGRAMSZÓ ALSÓ FELE
	LINECHECKSUM	;A REKORD ELLENÖRZŐ ÖSSZEGE
ENDC
;===================[ P R O G R A M  T E R Ü L E T E ]==============
;
	ORG	0X0000		;RESET UTÁN INNEN INDUL
IFDEF	TEST
	NOP			;HA MPLAB-ICD DEBUG VAN
ENDIF
	LGOTO	START		;UGRAS A LETÖLTŐBE
;===================[IDE FOG TÖLTŐDNI A FELHASZNÁLÓI PROGRAM!]======
USER_PROGRAM:			;0003 CIMEN VAN!
INTERRUPT:			;ITT KEZDŐDIK A MEGSZAKÍTÁSI PROGRAM
;EBBEN AZ ESETBEN A FELHASZNÁLÓI PROGRAM FELÉPÍTÉSE:
;	ORG	3
;	GOTO	MAIN	;UGRÁS A FŐPROGRAMBA
;	GOTO	IT_SERV		;MEGSZAKÍTÁS KISZOLGÁLÁS,
;MAIN:				;IDE JÖHET A FŐPROGRAM				
;
;===================[ MONITOR - LETÖLTŐ ]===========================
;
	ORG	MONITOR		;A MEMÓRIA UTOLSO 256 SZAVA
DOWNLOAD_ERROR:			;LETÖLTÉSI HIBA KEZELÉSE
	BCF	COMM_PIN	; 
	BANKSEL	TRISA		;BANK1 VÁLASZTÁS
	BCF	COMM_PIN	;LED FOLYAMATOSAN VILÁGÍT
	GOTO	$		;VÉGTELEN CIKLUS RESET GOMBIG
;-------------------------------------------------------------------
START:	
	BTFSS	COMM_PIN	;GOMBOT NYOMTAK?
	GOTO	WAIT_RELEASE	;IGEN, VÁRJUK HOGY ELENGEDJÉK
	CLRF	PCLATH		;RESETKOR NEM NYOMTÁK MEG A AZ LDR-KEY
				;GOMBJÁT, ELSŐ LAP KIVÁLASZTÁSA
	GOTO	USER_PROGRAM	;ÉS UGRÁS A LETÖLTÖTT PROGRAMRA	
WAIT_RELEASE:	
	BTFSS	COMM_PIN	;A GOMB ELENGEDÉS VIZSGÁLATA
	GOTO	WAIT_RELEASE	;MÉG NEM
	MOVLW	0X02		;A LED KETTŐT FOG
	CALL	LED_BLINKING	;VILLANNI
;
;------------------[ BITIDŐ MÉRÉSE TMR1 MODULLAL ]-----------------
;
	CALL	SET_DELAY	;BITIDŐ MÉRÉS
	MOVLW	B'00001011'	;COMPARE CCP1IF SET TMR1 RESET
	MOVWF	CCP1CON		;CCP1 MODUL KONFIGURÁLÁSA
;
;------------------[ EZ A TÉNYLEGES LETÖLTŐRÉSZ KEZDETE]-----------
;
	CALL	DOWNLOADCODE	;FAJL LETÖLTÉS
	XORLW	0X00		;W=0, HA HIBÁTLAN
	BTFSS	STATUS,Z	
	GOTO	DOWNLOAD_ERROR	;HIBÁNÁL A LED FOLYAMATOSAN VILÁGIT
	MOVLW	0X03		;HÁRMAT VILLAN = SIKERES LETÖLTÉS
	CALL	LED_BLINKING
	GOTO	$		;ITT KERING, RESET-RE INDUL A PROG.
;
;===================[ S Z U B R U T I N O K ]======================
;
;------------------[LED-ET VILLOGTATÓ RUTIN ]----------------------
;W-BEN VAN, HOGY HÁNYAT VILLANJON 
LED_BLINKING:	
	MOVWF	BITCOUNTER	;VILLANÁSOK SZÁMA
	BSF	COMM_PIN	;KIMENETI TÁROLÓ=1
	BANKSEL	TRISA		;BANK1
	BCF	COMM_PIN	;A LÁB KIMENET LESZ
	BANKSEL	PORTA		;BANK0	;LÁB MAGAS SZINTŰ
BLINKING_LOOP:
	CALL	PAUSE		;SW IDŐZITÉS
	BCF	COMM_PIN	;VILÁGÍT
	CALL	PAUSE		;VÁR
	CALL	PAUSE		;VÁR
	BSF	COMM_PIN	;NEM VILÁGÍT
	DECFSZ	BITCOUNTER
	GOTO	BLINKING_LOOP	;
	BANKSEL	TRISA		;LÁB BEMENET
	BSF	COMM_PIN	;LESZ ISMÉT
	BANKSEL	PORTA		;A LÁB BEMENET A LETÖLTÉSHEZ
	RETURN
;---------------------[ SW KÉSLELTETÉS ]--------------------------
PAUSE:	CLRF	TEMP
	CLRF	TEMP1
LOOP1:	NOP		;65536 CIKLUS
	NOP
	NOP
	DECFSZ	TEMP1
	GOTO	LOOP1
	DECFSZ	TEMP
	GOTO	LOOP1
	RETURN
;-------------------[ HEX FÁJLT LETÖLTŐ ÉS BEÉGETŐ RUTIN ]---------
;A LETÖLTŐ A MICROCHIP TB25 ALKALMAZÁSI MEGJEGYZÉSBEN VOLT LEÍRVA
;AZ EREDETI PROGRAMRÉSZEKRE A MEGHAGYOTT ANGOL NYELVŰ SZÖVEG UTAL
DOWNLOADCODE:		;SW USART PC SOROS VONALÁRÓL VÉTEL
	BANKSEL	PORTA
RECORD_BEGIN
	CALL	RECEIVE_RECORD	;EGY REKORD BEOLVASÁSA SOROSRÓL
DCSTART				;ÉS FELDOLGOZÁSA
	CALL	GETBYTE		;ITT MÁR A PUFFERBEN VAN A REKORD
	SUBLW	':'		;WAIT FOR COLON
	BTFSS	STATUS,Z
	GOTO	DCSTART

	CALL	GETHEX8		;READ BYTE COUNT
	MOVWF	BYTECOUNT	;STORE IN REGISTER
	MOVWF	LINECHECKSUM	;STORE IN LINE CHECKSUM
	BCF	STATUS,C
	RRF	BYTECOUNT,F	;DIVIDE BYTE COUNTER BY 2 TO GET WORDS
	CALL	GETHEX8		;READ HIGH BYTE OF 16-BIT ADDRESS
	MOVWF	ADDRH
	ADDWF	LINECHECKSUM,F	;ADD HIGH BYTE TO LINE CHECKSUM
	CALL	GETHEX8		;READ LOW BYTE OF 16-BIT ADDRESS
	MOVWF	ADDRL
	ADDWF	LINECHECKSUM,F	;ADD LOW BYTE TO LINE CHECKSUM
CONTINUE:
	CALL	GETHEX8		;READ RECORD TYPE
	MOVWF	RECTYPE
	ADDWF	LINECHECKSUM,F	;ADD TO LINE CHECKSUM
DATAREC				;DATA RECEPTION
	MOVF	RECTYPE,F	;CHECK FOR DATA RECORD (0H)
	BTFSS	STATUS,Z
	GOTO	ENDOFFILEREC	;OTHERWISE CHECK FOR EOF
	BCF	STATUS,C
	RRF	ADDRH
	RRF	ADDRL
;--------------------[ CÍMELLENŐRZÉS ]-----------------------------
;A LETÖLTŐ NEM ENGEDI MEG, HOGY AZ ÁLTALA HASZNÁLT TERÜLETRE ÍRJUNK,
;MÉG HA EZ IS LENNE A HEX REKORDBAN 
	MOVLW	HIGH MONITOR	;
	XORWF	ADDRH,W
	BTFSC	STATUS,Z
	RETLW	0X02		;HA A MONITORRA AKAR ÍRNI HIBA
	MOVF	ADDRH,F		;EZ AZ UTOLSÓ 256 SZÓ
	BTFSS	STATUS,Z
	GOTO	DRLOOP
	MOVLW	LOW USER_PROGRAM;HA AZ 00...02 HELYRE AKAR IRNI, HIBA
	SUBWF	ADDRL,W
	BTFSS	STATUS,C	;
	RETLW	0X02		;02 HIBAKÓD: ROSSZ HELYRE ÍRÁS
;--------------------[ PROGRAM ÍRÁSA FLASH-BE ]--------------------
DRLOOP	
	MOVF	BYTECOUNT,F	;CHECK FOR BYTECOUNT = 0
	BTFSC	STATUS,Z
	GOTO	DRCKCHECKSUM	;IF ZERO, GOTO CHECKSUM VALIDATION
	CALL	GETHEX8		;READ LOWER BYTE OF DATA (2 CHARACTERS)
	MOVWF	HEXDATAL	;ADD RECEIVED DATA TO CHECKSUM
	ADDWF	LINECHECKSUM,F
	CALL	GETHEX8		;READ UPPER BYTE OF DATA (2 CHARACTERS)
	MOVWF	HEXDATAH	;ADD RECEIVED DATA TO CHECKSUM
	ADDWF	LINECHECKSUM,F
WRITEDATASEQUENCE		;WRITE SEQUENCE TO INTERNAL PROG. MEM FLASH
	BANKSEL	EEADRH
	MOVF	ADDRH,W		;WRITE ADDRESS TO EEADRH:EEADR REGISTERS
	MOVWF	EEADRH
	MOVF	ADDRL,W
	MOVWF	EEADR
	MOVF	HEXDATAH,W	;WRITE DATA TO EEDATH:EEDATA REGISTERS
	MOVWF	EEDATH
	MOVF	HEXDATAL,W
	MOVWF	EEDATA
	BANKSEL	EECON1		;WRITE SEQUENCE
	BSF	EECON1,EEPGD	;SET EEPGD TO INDICATE PROGRAM MEMORY
	BSF	EECON1,WREN	;ENABLE WRITES TO MEMORY
	BCF	INTCON,GIE	;MAKE SURE INTERRUPTS ARE DISABLED
	MOVLW	0X55		;REQUIRED WRITE SEQUENCE
	MOVWF	EECON2
	MOVLW	0XAA
	MOVWF	EECON2
	BSF	EECON1,WR	;START INTERNAL WRITE CYCLE
	NOP
	NOP
	BCF	EECON1,WREN	;DISABLE WRITES
	BANKSEL	EECON1		;READ SEQUENCE
	BSF	EECON1,EEPGD	;SET EEPGD TO INDICATE PROGRAM MEMORY
	BSF	EECON1,RD	;ENABLE READS FROM MEMORY
	BCF	STATUS,RP0
	NOP
	MOVF	EEDATH,W	;COMPARE MEMORY VALUE TO HEXDATAH:HEXDATAL
	SUBWF	HEXDATAH,W
	BTFSS	STATUS,Z
	RETLW	0XFF		;IF UPPER BYTE NOT EQUAL, RETURN FFH
	MOVF	EEDATA,W	;TO INDICATE PROGRAMMING FAILURE
	SUBWF	HEXDATAL,W
	BTFSS	STATUS,Z
	RETLW	0XFF		;IF LOWER BYTE NOT EQUAL, RETURN FFH
				;TO INDICATE PROGRAMMING FAILURE
	INCF	ADDRL,F		;INCREMENT ADDRESS FOR NEXT ITERATION
	BTFSC	STATUS,Z
	INCF	ADDRH,F
	DECF	BYTECOUNT,F	;DECREMENT BYTE COUNT
	GOTO	DRLOOP		;GO BACK TO CHECK FOR BYTECOUNT = 0
;----------------[ELLENÖRZŐ ÖSSZEG ELLENŐRZÉSE ]---------------------
DRCKCHECKSUM			;CHECKSUM VERIFICATION
	CALL	GETHEX8		;READ IN CHECKSUM
	ADDWF	LINECHECKSUM,W	;ADD TO CALCULATED CHECKSUM
	BTFSS	STATUS,Z	;RESULT SHOULD BE 0
	RETLW	1		;IF NOT RETURN 1 TO INDICATE CHECKSUM FAIL
	GOTO	RECORD_BEGIN	;DO IT AGAIN
ENDOFFILEREC			;END OF FILE RECORD (01H)
	DECF	RECTYPE,W	;IF EOF RECORD, DECREMENT SHOULD = 0
	BTFSS	STATUS,Z
	GOTO	RECORD_BEGIN	;NOT VALID RECORD TYPE, WAIT FOR NEXT :
	CALL	GETHEX8		;READ IN CHECKSUM
	ADDWF	LINECHECKSUM,W	;ADD TO CALCULATED CHECKSUM
	BTFSS	STATUS,Z	;RESULT SHOULD BE 0
	RETLW	1		;IF NOT RETURN 1 TO INDICATE CHECKSUM FAIL
	RETLW	0		;OTHERWISE RETURN 0 TO INDICATE SUCCESS
;
;--------------------[ HEXA BÁJT BEOLVASÁS ]---------------------
GETHEX8				;THIS FUNCTION USES THE USART
	CALL	GETBYTE		;READ A CHARACTER FROM THE USART
	CALL	ASCII2HEX	;CONVERT THE CHARACTER TO BINARY
	MOVWF	TEMP		;STORE RESULT IN HIGH NIBBLE
	SWAPF	TEMP,F
	CALL	GETBYTE		;READ A CHARACTER FROM THE USART
	CALL	ASCII2HEX	;CONVERT THE CHARACTER TO BINARY
	IORWF	TEMP,F		;STORE RESULT IN LOW NIBBLE
	MOVF	TEMP,W		;MOVE RESULT INTO WREG
	RETURN
;--------------------[ KONVERTÁLÁS ] ----------------------------
ASCII2HEX			;CONVERT VALUE TO BINARY
	MOVWF	TEMP1		;SUBTRACT ASCII 0 FROM NUMBER
	MOVLW	'0'
	SUBWF	TEMP1,F
	MOVLW	0XF0		;IF NUMBER IS 0-9 RESULT, UPPER NIBBLE
	ANDWF	TEMP1,W		;SHOULD BE ZERO
	BTFSC	STATUS,Z
	GOTO	ASCIIOUT
	MOVLW	'A'-'0'-0X0A	;OTHERWISE, NUMBER IS A - F, SO
	SUBWF	TEMP1,F		;SUBTRACT OFF ADDITIONAL AMOUNT
ASCIIOUT
	MOVF	TEMP1,W		;VALUE SHOULD BE 0 - 15
	RETURN
;--------------------[ EGY BÁJT OLVASÁSA A PUFFERBŐL W-BE ]-----
GETBYTE
	BANKSEL PORTA
	MOVF	INDF,W
	INCF	FSR
	RETURN
;--------------------[ EGY REKORD BEOLVASÁSA A PUFFERBE ]-------
RECEIVE_RECORD:	
	MOVLW	BUFFER		;PUFFER KEZDŐCÍM
	MOVWF	FSR
NEXT_BYTE:
	CALL	RECEIVE_BYTE	;EGY BÁJT A SOROS VONALRÓL
	MOVF	RXBYTE,W
	MOVWF	INDF
	INCF	FSR,F
	MOVLW	0X0D		;WAIT FOR 0X0D
	SUBWF	RXBYTE,W	;A REKORDOT 0D TERMINÁLJA
	BTFSS	STATUS,Z
	GOTO	NEXT_BYTE
	MOVLW	BUFFER
	MOVWF	FSR
	RETURN
;--------------------[ BITIDŐ MEGHATÁROZÁSA ]-------------------
;KARAKTER: 0000111111 = START(0)-00011111-STOP(1)
;A NYOLC NULLA IDOTARTAMÁT MÉRJÜK 
SET_DELAY:
	CLRF	T1CON			
	CLRF	TMR1L
	CLRF	TMR1H
WAIT_LLEVEL:
	BTFSC	COMM_PIN	;MAGAS SZINT?
	GOTO	WAIT_LLEVEL	;IGEN	
	BSF	T1CON,TMR1ON	;NEM, MÉRÉS INDUL
WAIT_HLEVEL:
	BTFSS	COMM_PIN	;MÉRÉS MÍG ALACSONY
	GOTO	WAIT_HLEVEL
	BCF	T1CON,TMR1ON	;MÉRÉS ÁLLJ
	BCF	STATUS,C
	RRF	TMR1H,F		;NULLIDŐ/2
	RRF	TMR1L,F
	BCF	STATUS,C
	RRF	TMR1H,W
	MOVWF	CCPR1H		;NULLIDŐ/4=BITIDŐ
	RRF	TMR1L,W
	MOVWF	CCPR1L		;BITIDO CCP-BE
	BCF	STATUS,C		
	RRF	CCPR1H,W		
	MOVWF	HBITTIMEH	;NULLIDO/8=FÉL BITIDŐ
	COMF	HBITTIMEH,F	;KOMPLEMENS KÉPZÉS
	RRF	CCPR1L,W
	MOVWF	HBITTIMEL
	COMF	HBITTIMEL,W	;FÉL BITIDO KOMPLEMENSE
	ADDLW	0X06		;KETTES KOMLEMENS +5 IDOZITESKORREKCIO
	MOVWF	HBITTIMEL
	BTFSC	STATUS,C
	INCF	HBITTIMEH	
	RETURN
;-----------------[BÁJT VÉTELE SOROS VONALON ] -------------------
RECEIVE_BYTE:
	BCF	T1CON,TMR1ON
	MOVLW	0X08
	MOVWF	BITCOUNTER
	MOVF	HBITTIMEL,W	;TIMER FELTOLTESE
	MOVWF	TMR1L
	MOVF	HBITTIMEH,W
	MOVWF	TMR1H
WAIT_SILENCE:
	BTFSS	COMM_PIN	;VÁRAKOZÁS HA ALACSONY
	GOTO	WAIT_SILENCE
WAIT_STARTBIT:
	BTFSC	COMM_PIN	;VÁRAKOZÁS HA MAGAS
	GOTO	WAIT_STARTBIT
	BSF	T1CON,TMR1ON	;STARTBIT JÖTT TIMER INDUL
NEXT_BIT:			;
	CALL	DELAY		;ELŐSZÖR MÁSFÉL BITIDŐNYI KÉSLEL!
	BCF	STATUS,C
	BTFSC	COMM_PIN
	BSF	STATUS,C
	RRF	RXBYTE
	DECFSZ	BITCOUNTER
	GOTO	NEXT_BIT
	RETURN
;--------------------[BITIDŐNYI KÉSLELTETÉS ]---------------------
DELAY:
	BCF	PIR1,CCP1IF
WAIT_CCP:	
	BTFSS	PIR1,CCP1IF
	GOTO	WAIT_CCP
	RETURN
;=================================================================
	END
