;---------------------------------------
; SÉRIOVÉ DÁLKOVÉ OVLÁDÁNÍ (sdo) PŘIJÍMAČ
;---------------------------------------
; přenáší se 1B po dvou drátech (zem a data)
; první 4b znamenají kód přístroje, kterého se data týkají
; a druhé 4b jsou vlastní data - tlačítka na portech PA,0 až PA,3
; tlačítko na portu PA,4 je signál pro zapnutí/vypnutí daného přístroje
; při stisku tlačítka PA,4 jsou všechny 4 horní b nastaveny na 1
;---------------------------------------
; princip přenosu:
; v programu přijímače se neustále testuje vstup.
; pokud je v logické jedničce, tak přijímač čeká na dlouhý start impuls (20t).
; po tomto start impulsu je osm kratších pulsů reprezentujících 8 bitů.
; krátký puls (1t) znamená log.0 a delší puls (4t) znamená log.1
; kde t=základní čas čekání vysílače sdo_cek
; sdo_cek přijímače musí být dvojnásobně doluhé než sdo_cek vysílače.
;---------------------------------------
; celý přenos (1B) trvá maximálně 2ms
;---------------------------------------

	INCLUDE		"P16F84.INC"
	LIST 		P=16F84, R=DEC

SWR	EQU		03h
PA	EQU		05h
PB	EQU		06h

c1	EQU		10h		;pomocná proměnná pro čekání
c2	EQU		11h		;pomocná proměnná pro čekání
c3	EQU		12h		;pomocná proměnná pro čekání
sdo_mem	EQU		13h		;paměť přenášených dat
tl	EQU		14h		;příznaky stisknutí tlačítek na vysílači sdo

sdo_in	EQU		0		;port A - vstup pro SDO

	ORG		00h
	GOTO		start

	ORG		04h
	GOTO		prerus

start	BSF		SWR,5		;vstupy/výstupy
	MOVLW		255
	MOVWF		TRISA
	MOVLW		0
	MOVWF		TRISB
	BCF		SWR,5

	CLRF		PB
	CLRF		sdo_mem

start1	CLRWDT

	BTFSC		PA,sdo_in
	CALL		sdo

	MOVFW		sdo_mem
	MOVWF		tl
	MOVWF		PB

	GOTO		start1

;---------------------------------------
; PŘERUŠENÍ
;---------------------------------------

prerus	GOTO		start1

;---------------------------------------
; SDO - sériové dálkové ovládání
;---------------------------------------

sdo	CLRF		sdo_mem

	CALL		sdo_cek		;kontroluje, zda se jedná o dlouhý start impuls
	BTFSS		PA,sdo_in
	GOTO		sdo_err		;pokud ne - jde na sdo_err (return)
	CALL		sdo_cek
	BTFSS		PA,sdo_in
	GOTO		sdo_err
	CALL		sdo_cek
	BTFSS		PA,sdo_in
	GOTO		sdo_err
	CALL		sdo_cek
	BTFSS		PA,sdo_in
	GOTO		sdo_err
sdo_st	BTFSC		PA,sdo_in	;čeká na konec start impulsu
	GOTO		sdo_st

sdo_0	BTFSS		PA,sdo_in	;čeká na začátek impulsu prvního bitu
	GOTO		sdo_0
	CALL		sdo_cek		;čeká čas "2" (2x základní čekání vysílače)
	BTFSC		PA,sdo_in	;pokud stále trvá impuls prvního bitu, tak se jedná o dlouhý impuls
	BSF		sdo_mem,0	;a do bitu 0 v paměti sdo_mem je nastavena jednička
	CALL		sdo_cek
sdo_1	BTFSS		PA,sdo_in	;přenos dalšího bitu...
	GOTO		sdo_1
	CALL		sdo_cek
	BTFSC		PA,sdo_in
	BSF		sdo_mem,1
	CALL		sdo_cek
sdo_2	BTFSS		PA,sdo_in
	GOTO		sdo_2
	CALL		sdo_cek
	BTFSC		PA,sdo_in
	BSF		sdo_mem,2
	CALL		sdo_cek
sdo_3	BTFSS		PA,sdo_in
	GOTO		sdo_3
	CALL		sdo_cek
	BTFSC		PA,sdo_in
	BSF		sdo_mem,3
	CALL		sdo_cek
sdo_4	BTFSS		PA,sdo_in
	GOTO		sdo_4
	CALL		sdo_cek
	BTFSC		PA,sdo_in
	BSF		sdo_mem,4
	CALL		sdo_cek
sdo_5	BTFSS		PA,sdo_in
	GOTO		sdo_5
	CALL		sdo_cek
	BTFSC		PA,sdo_in
	BSF		sdo_mem,5
	CALL		sdo_cek
sdo_6	BTFSS		PA,sdo_in
	GOTO		sdo_6
	CALL		sdo_cek
	BTFSC		PA,sdo_in
	BSF		sdo_mem,6
	CALL		sdo_cek
sdo_7	BTFSS		PA,sdo_in
	GOTO		sdo_7
	CALL		sdo_cek
	BTFSC		PA,sdo_in
	BSF		sdo_mem,7
	CALL		sdo_cek

sdo_err

	RETURN

;---------------------------------------
; SDO - čekání 20ms
;---------------------------------------

sdo_cek	MOVLW		20		;čekání musí být dvojnásobně dlouhé než ve vysílači
	MOVWF		c2
sdo_c2	MOVLW		20		;udává rychlost přenosu (pro 4MHz krystal je 20)
	MOVWF		c1
sdo_c1	DECFSZ		c1,1
	GOTO		sdo_c1
	DECFSZ		c2,1
	GOTO		sdo_c2
	CLRWDT				;vynulování Watch Dog
	RETURN



	END