;---------------------------------------
; SÉRIOVÉ DÁLKOVÉ OVLÁDÁNÍ (sdo) VYSÍLAČ
;---------------------------------------
; 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í/opakování
c2	EQU		11h		;pomocná proměnná pro čekání/opakování
c3	EQU		12h		;pomocná proměnná pro čekání/opakování
sdo_mem	EQU		13h		;paměť přenášených dat

sdo_out	EQU		0		;port A - výstup sdo
led	EQU		1		;port A - led

	ORG		00h
	GOTO		start

	ORG		04h
	GOTO		prerus

start	BSF		SWR,5		;vstupy/výstupy
	MOVLW		0		;všechny porty A jsou výstupy
	MOVWF		TRISA
	MOVLW		255		;všechny porty B jsou vstupy
	MOVWF		TRISB
	BCF		SWR,5

	CLRF		PB
	CLRF		sdo_mem

start1	CLRWDT

	CALL		sdo

	GOTO		start1

;---------------------------------------
; PŘERUŠENÍ
;---------------------------------------

prerus	GOTO		start1

;---------------------------------------
; SDO - sériové dálkové ovládání
;---------------------------------------

sdo	CALL		sdo_cek		;čeká než přestanou kmitat tlačítka

	CLRF		sdo_mem		;vymaže paměť pro přenos sdo_mem, aby do ní mohl zapsat aktuální data

	BTFSC		PB,0		;načte tlačítka a uloží je do sdo_mem
	BSF		sdo_mem,0
	BTFSC		PB,1
	BSF		sdo_mem,1
	BTFSC		PB,2
	BSF		sdo_mem,2
	BTFSC		PB,3
	BSF		sdo_mem,3
	BTFSC		PB,4
	BSF		sdo_mem,4
	BTFSC		PB,5
	BSF		sdo_mem,5
	BTFSC		PB,6
	BSF		sdo_mem,6
	BTFSC		PB,7
	BSF		sdo_mem,7

					;konec zjišťování stavu tlačítek, začátek vlastního sdo přenosu


sdo_st0	BSF		PA,led		;rozsvítí led signalizující přenos

	BSF		PA,sdo_out	;dlouhý start impuls dlouhý "20t"  (počet volání sdo_cek)
	MOVLW		20
	MOVWF		c3
sdo_st1	CALL		sdo_cek
	DECFSZ		c3
	GOTO		sdo_st1
	BCF		PA,sdo_out

	CALL		sdo_cek		;logická nula po dobu "4"
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out	;vyslání prvního bitu
	CALL		sdo_cek		;pokud je bit 0, vyšle pouze krátký impuls dlouhý "1t"
	BTFSS		sdo_mem,0	;pokud je bit 1, vyšle dlouhý impuls "4t"
	GOTO		sdo_0
	CALL		sdo_cek
	CALL		sdo_cek
sdo_0	BCF		PA,sdo_out

	CALL		sdo_cek		;vysílá další bit...
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out
	CALL		sdo_cek
	BTFSS		sdo_mem,1
	GOTO		sdo_1
	CALL		sdo_cek
	CALL		sdo_cek
sdo_1	BCF		PA,sdo_out

	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out
	CALL		sdo_cek
	BTFSS		sdo_mem,2
	GOTO		sdo_2
	CALL		sdo_cek
	CALL		sdo_cek
sdo_2	BCF		PA,sdo_out

	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out
	CALL		sdo_cek
	BTFSS		sdo_mem,3
	GOTO		sdo_3
	CALL		sdo_cek
	CALL		sdo_cek
sdo_3	BCF		PA,sdo_out

	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out
	CALL		sdo_cek
	BTFSS		sdo_mem,4
	GOTO		sdo_4
	CALL		sdo_cek
	CALL		sdo_cek
sdo_4	BCF		PA,sdo_out

	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out
	CALL		sdo_cek
	BTFSS		sdo_mem,5
	GOTO		sdo_5
	CALL		sdo_cek
	CALL		sdo_cek
sdo_5	BCF		PA,sdo_out

	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out
	CALL		sdo_cek
	BTFSS		sdo_mem,6
	GOTO		sdo_6
	CALL		sdo_cek
	CALL		sdo_cek
sdo_6	BCF		PA,sdo_out

	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	CALL		sdo_cek
	BSF		PA,sdo_out
	CALL		sdo_cek
	BTFSS		sdo_mem,7
	GOTO		sdo_7
	CALL		sdo_cek
	CALL		sdo_cek
sdo_7	BCF		PA,sdo_out

	BCF		PA,led		;zhasne led signalizující přenos

	RETURN

;---------------------------------------
; SDO - čekání
;---------------------------------------

sdo_cek	MOVLW		10		;čekání musí být polovičně dlouhé než v přijímač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