1 cyklus = 1,0850694us
databit bit p1.7 ;pin,na kterem je TM
led bit p1.6 ;pin,na kterem je LED dioda
org 0
jmp zacatek
org 30H
zacatek: mov sp,#35H
clr rs0 ;banka 0
clr rs1
mov scon,#01010000B ;nastaveni ser.linky+casovace1
mov tmod,#00100000B ;19200 bps,8 databit,1 stopbit,bez parity
mov 87H,#10000000B ;casovac1 - mod2,serlink - mod 1
mov th1,#253
setb ea ;povoleni vsech preruseni
setb et1
setb tr1 ;spusteni casovace1
start: call touchreset ;volani procedury-test pritomnosti TM
jc pritomen ;pokud je TM pripojen,pokracuje rozsvicenim
jmp start LED...,jinak nadale testuje pritomnost TM
pritomen: clr led ;rozsviti LED
clr c ;nuluje priznak pritomnosti TM
setb rs0 ;banka 1
mov a,#33H ;vysle prikaz pro cteni ROM kodu
call touchbyte
mov a,#0FFH ;nastavi port jako prijimaci po celou dobu
;cteni
call touchbyte ;v acc je family kod
cjne a,#01H,nenikod ;cteni pokracuje pouze s DS1990A
mov a,#0FFH ;nastavi port jako prijimaci
call touchbyte ;v acc je 1.byte,1.znak-dolni pulbyte
call prevod ;volani prevodu bin na ascii kod
mov r0,b ;do r0 prvni znak serioveho cisla (zprava)
mov r1,a ;do r1 druhy znak serioveho cisla
mov a,#0FFH
call touchbyte ;v acc je 2.byte
call prevod
mov r2,b ;do r2 treti znak
mov r3,a ;do r3 ctvrty znak
mov a,#0FFH
call touchbyte ;v acc je 3.byte
call prevod
mov r4,b ;do r4 paty znak
mov r5,a ;do r5 sesty znak
mov a,#0FFH
call touchbyte ;v acc je 4.byte
call prevod
mov r6,b ;do r6 sedmy znak
mov r7,a ;do r7 osmy znak
setb rs1 ;banka 3
mov a,#0FFH
call touchbyte ;v acc je 5.byte
call prevod
mov r0,b ;do r0 devaty znak
mov r1,a ;do r1 desaty znak
mov a,#0FFH
call touchbyte ;v acc je 6.byte
call prevod
mov r2,b ;do r2 jedenacty znak
mov r3,a ;do r3 dvanacty znak
mov a,#0FFH
call touchbyte ;v acc je CRC
clr rs1
clr rs0 ;banka 0
clr c ;nuluje priznak pritomnosti TM
call vysilani ;volani procedury ser.vysilani
jmp start ;test dalsiho TM
nenikod: clr c ;nuluje priznak pritomnosti TM
jmp start
;
;procedura touchreset vysle do TM RESET Pulse a ceka na odpoved v podobe ;Presence Pulsu od TM. Pokud je TM pritomen,nastavi C,jinak ho nuluje.
;
touchreset: push b ;uchova b a acc
push a
mov a,#4 ;pocet opakovani smycky
clr databit ;zacatek Reset Pulsu
mov b,#221 ;zpozdeni 480us, po tuto dobu pridrzi pin
djnz b,$ ; v nule
setb databit ;pin do jednicky,konec Reset pulsu
mov b,#6 ;casovy interval pro zpozdeni
clr c ;nuluje priznak pritomnosti TM
waitlow: jb databit,wh ;skok na wh,kdyz je pin v jednicce (tzn. po
;Reset pulsu)
djnz b,waitlow ;ceka po dobu 3360us na prejiti pinu do 1
djnz a,waitlow
jmp short ;pin nepresel do 1,TM neni pritomen
wh: mov b,#111 ;interval 240us pro detekci Presence pulsu
hl: orl c,/databit ;nastavi C,pokud se behem intervalu dostane
;pin do nuly(to je Presence puls)
djnz b,hl
short: pop a ;obnovi puvodni b a acc
pop b
ret
;
;procedura vysila obsah acc do TM a soucasne od nej prijima 1 byte opet do
;acc
;
touchbyte: push b ;uchova b
mov b,#8 ;pocitadlo 8 bitu
smycka: rrc a ;vysilany bit do C
call jedenbit ;volani-odeslani jednoho bitu
djnz b,smycka ;dalsi bit k odeslani
rrc a ;posledni prijaty bit do acc
pop b ;obnovi b
ret
jedenbit: clr databit ;zacatek time slotu
nop ;zpozdeni pres 4us,zajisti,aby nulu TM
nop ;bezpecne zaregistrovalo(min.1us)
nop
nop
mov databit,c ;vysle bit do TM
nop ;zpozdeni 6,5us pred ctenim bitu z TM
nop ;aby se dodrzel interval 15us pro precteni
nop ;spravne hodnoty
nop
nop
nop
mov c,databit ;precte bit z TM (min.15us po zacatku time
;slotu)
push b ;uchova b
mov b,#12H ;zpozdeni 41us do konce time slotu
djnz b,$ ;celkem tedy neco pres 60us(time slot)
pop b ;obnovi b
setb databit ;konec time slotu
ret
;
;
vysilani: setb rs0 ;banka 3
setb rs1
clr ti ;nuluje priznak prazdneho vysilaciho registru
mov sbuf,r3 ;vyslat r3 - dvanacty znak ser.cisla
jnb ti,$ ;ceka,dokud se korektne neodvysila
clr ti ;nuluje priznak odvysilaneho bytu
mov sbuf,r2
jnb ti,$
clr ti
mov sbuf,r1
jnb ti,$
clr ti
mov sbuf,r0
jnb ti,$
clr ti
clr rs1
clr ti
mov sbuf,r7
jnb ti,$
clr ti
mov sbuf,r6
jnb ti,$
clr ti
mov sbuf,r5
jnb ti,$
clr ti
mov sbuf,r4
jnb ti,$
clr ti
mov sbuf,r3
jnb ti,$
clr ti
mov sbuf,r2
jnb ti,$
clr ti
mov sbuf,r1
jnb ti,$
clr ti
mov sbuf,r0 ;vysle r0 - prvni znak ser.cisla
jnb ti,$
clr ti
clr rs0 ;banka 0
clr rs1
;zpozdeni pro zpozdene zhasnuti LED priblizne 280ms
mov r0,#255 ;konstanty zpozdeni
nic2: mov r1,#255
nic1: nop
djnz r1,nic1 ;vnorene smycky
djnz r0,nic2
setb led ;zhasne LED
ret
;v acc je horni pulbyte,v b je dolni pulbyte
;prevod binarniho cisla v acc na ASCII znak do acc (puvod - www.8052.com)
prevod:
mov b,a ;kopie acc do b
anl a,#00fh ;maska,ponecha pouze dolni pulbyte
add a,#090h ;pricte 144
da a ;dekadicka korekce
addc a,#040h ;pricte 64
da a ;dekadicka korekce
xch a,b ;prohodi a<>b
swap a ;prohodi dolni a horni pulbyte acc
anl a,#00fh
add a,#090h
da a
addc a,#040h
da a
ret
end