;--------------------------------------- ; 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