RT-3 dla telemetrii
Przetworniki kБta RCN-619

Przetwornik kБta RCN-619

Miejsce mocowania przetwornika kata na osi Жwiata

Miejsce mocowania przetwornika kata na osi deklinacji
Program do doczytu pozycji z przetwornika kБta RCN-619 i do konwersji
z kodowania Gray'a do kodowania binarnego
;###############################################################
;######## RCN619 serial Absolude Encoder (19bits) #######
;######## PPH WObit - Grzegorz Szymanski Poznan 94.01.18 #######
;###############################################################
;RAM-RAM-RAM-RAM-RAM-RAM-RAM-RAM
;0FE00h-0FE30h= STACK
org 0FE30h ;internal RAM area
WYSWIETL ds 32
CRC16 ds 2
CZAS ds 2
GRAY ds 3 ;19bits < 3B
ds 1
bin ds 3
ds 1
bcd ds 6
help ds 6
Bd ds 1 ;0->4800Bd,9600,19200,3->38400Bd
parity ds 1
BUFOR1 ds 4 ;gotowe +CRC
BUFOR ds 4 ;transmitowane
ile ds 2
;RAM-RAM-RAM-RAM-RAM-RAM-RAM-RAM
;###############################
;VECTOR-VECTOR-VECTOR-VECTOR-VEC
org 0
dw BEGIN
dw NMI
dw INT0
dw INT1
dw INT2
dw WATCH_DOG
dw LICZ_BAZ
dw TIMER0
dw TIMER1
dw TIMER2
org 1Ah
dw CRF00
dw CRF01
dw CRF10
dw CRF11
dw SEF
dw SRF
dw STF
;VECTOR-VECTOR-VECTOR-VECTOR-VEC
;###############################
org 0B0h
dm 'interface RCN619 - serial 19bits Absolute Encoder '
dm 'opracowal Grzegorz Szymanski, Poznan 1994 '
org 100h
;BEGIN-BEGIN-BEGIN-BEGIN-BEGIN-B
BEGIN movw SP,#STACK
call !SetUp
set1 P0.0 ;b0-CLK(out)
; call !rd_Bd ;zachowan apredkosc bodowa w EEPROMie
mov Bd,#0 ;0->4800Bd,9600,19200,3->38400Bd
;wydaje sie byc bardziej sensowne, gdy po kazdym restarcie za robocza predkosc
;bodowa przyjeta bedzie czestotliwosc najnizsza (ktora HOST moze dowolnie
;zmieniac). Ma to decydujace znaczenie w przypadku max czestotliwosci roboczej
;i pogorszenia sie warunkow transmisji - moze wtedy okazac sie, ze nie jest
;mozliwe skontaktowanie sie z NECiem i obnizenie predkosci transmisji.
call !setCOM
ei
call !LCDinst
call !WIZYTOWKA
; . . . . . . . . . . . . . . . .
loop
call !rdGRAY ;czytaj RCN
call !testPARITY
bnz $loop
call !GRAYbin ;uproszczone
call !doTransmisji ;pozycja +CRC ->BUFOR1
call !binBCD
call !BCDlcd
call !napis1
br $loop
; . . . . . . . . . . . . . . . .
doTransmisji ;pozycja + CRC ->BUFOR1
movw CRC16,#0
mov A,bin+0
call !DO_CRC
mov A,bin+1
call !DO_CRC
mov A,bin+2
call !DO_CRC
di
movw BUFOR1+0,bin+0
mov BUFOR1+2,bin+2
mov BUFOR1+3,CRC16
ei
ret
;---------------------------------
DO_CRC ;modyfikuje CRC16 w zaleznosci od A
; . . . . . . . .
DIVH equ 84h ;8408h CRC-CCITT
DIVL equ 08h ;A001h CRC-16
;0F01h CRC-12
;0080h LRC-8
; . . . . . . . .
mov r3,#8 ;shift
mov r4,r1 ;r4=DATA
movw AX,CRC16 ;rp0=CRC16 (r0-LOW, r1-HIGH)
CRC_LOOP rorc r4,1 ;DATA lsb -> CY
bc $CRC_H
bf X.0,$CRCok ;jest 0, bylo 0 (X.0==CRC.0)
br $CRCxor ;jest 0, bylo 1
CRC_H bf X.0,$CRCxor ;jest 1, bylo 0
CRCok shrw rp0,1 ;tylko shift CRC16
br $CRC_W
CRCxor shrw rp0,1 ;shift CRC16 (bez CY)
xor A,#DIVH ;CRC16 xor DIV
xch r0,r1
xor A,#DIVL
xch r0,r1
CRC_W dbnz B,$CRC_LOOP ;repeat for 8 bits
movw CRC16,AX
ret
;================================
setCOM
mov SCM,#01111001b ;asynchro,1STOP, 8bits, parzystosc
cmp Bd,#3 :? 38400
bnz $nie38
mov BRG,#39 ;38400
mov SCC,#0
bz $setCOMend
nie38 cmp Bd,#2 :? 19200
bnz $nie19
mov BRG,#78 ;19200
mov SCC,#0
bz $setCOMend
nie19 cmp Bd,#1 :? 9600
bnz $nie96
mov BRG,#78 ;9600
mov SCC,#1
bz $setCOMend
nie96 mov BRG,#78 ;4800
mov SCC,#2
setCOMend mov SEIC,#00000011b ;priorytet=3 - ERROR
mov SRIC,#00000011b ;priorytet=3 - RECIVE
mov STIC,#00000011b ;priorytet=3 - TRANSMIT
ret
;---------------------------------
testPARITY
mov help,#0
mov A,GRAY+2
call !licz1 ;ile '1' w A tyle inc help
mov A,GRAY+1
call !licz1
mov A,GRAY+0
call !licz1
mov A,help
xor A,parity
and A,#1
cmp A,#0
ret
;---------------------------------
licz1 mov r2,#8 ;ile '1' w A tyle inc help
licz2 rorc r1,1
bnc $licz3
inc help
licz3 dbnz C,$licz2
ret
;---------------------------------
rdGRAY ;czytaj RCN
di
mov r4,#0
mov r5,#0
mov r6,#0 ;r6r5r4 <-gray
clr1 P0.0 ;CLK
nop
nop ;t1(0.5-2.5us)
mov r2,#3 ;first BYTE
rdGRAY1 set1 P0.0 ;CLK
clr1 P0.0 ;CLK
mov1 CY,P0.1 ;DATA
rolc r6,1
dbnz C,$rdGRAY1
mov r2,#8 ;second BYTE
rdGRAY2 set1 P0.0 ;CLK
clr1 P0.0 ;CLK
mov1 CY,P0.1 ;DATA
rolc r5,1
dbnz C,$rdGRAY2
mov r2,#8 ;last BYTE + parity
rdGRAY3 set1 P0.0 ;CLK
clr1 P0.0 ;CLK
mov1 CY,P0.1 ;DATA
rolc r4,1
dbnz C,$rdGRAY3
set1 P0.0 ;CLK
clr1 P0.0 ;CLK
mov1 CY,P0.1 ;DATA
mov1 parity.0,CY ;parity bit
set1 P0.0
mov r1,r4
mov GRAY+0,A
mov r1,r5
mov GRAY+1,A
mov r1,r6
mov GRAY+2,A
ei
ret
;---------------------------------
GRAYbin
;algorytm GRAY->bin:
;1\ GRAY*maska
;2\ wynik=0
;3\ GRAYmsb->CY
;4\ CY->shiftWYNIK (lsb->msb)
;5\ WYNIK.0->CY
;6\ xor1 CY,GRAYn+1
;7\ CY->shiftWYNIK (lsb->msb)
;pkt 5\6\7 n razy
mov bin+0,gray+0
mov bin+1,gray+1
mov bin+2,gray+2
ret
; . . . . . . . . . . . . . .
and GRAY+2,#07h ;19 bits
mov r2,#0 ;LSB
mov r3,#0
mov r4,#0 ;MSB
mov1 CY,GRAY+2.2 ;GRAYmsb->CY
rolc r4,1 ;CY->shiftWYNIK (lsb->msb)
mov1 CY,0FEF4h.0 ;last bit->CY
xor1 CY,GRAY+2.1 ;xor1 CY,GRAYn+1
rolc r4,1 ;CY->shiftWYNIK (lsb->msb)
mov1 CY,0FEF4h.0
xor1 CY,GRAY+2.0
rolc r4,1
mov1 CY,0FEF4h.0
xor1 CY,GRAY+1.7
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+1.6
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+1.5
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+1.4
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+1.3
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+1.2
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+1.1
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+1.0
rolc r3,1
mov1 CY,0FEF3h.0
xor1 CY,GRAY+0.7
rolc r2,1
mov1 CY,0FEF2h.0
xor1 CY,GRAY+0.6
rolc r2,1
mov1 CY,0FEF2h.0
xor1 CY,GRAY+0.5
rolc r2,1
mov1 CY,0FEF2h.0
xor1 CY,GRAY+0.4
rolc r2,1
mov1 CY,0FEF2h.0
xor1 CY,GRAY+0.3
rolc r2,1
mov1 CY,0FEF2h.0
xor1 CY,GRAY+0.2
rolc r2,1
mov1 CY,0FEF2h.0
xor1 CY,GRAY+0.1
rolc r2,1
mov1 CY,0FEF2h.0
xor1 CY,GRAY+0.0
rolc r2,1
mov r1,r2
mov bin+0,A
mov r1,r3
mov bin+1,A
mov r1,r4
mov bin+2,A
ret
;---------------------------------
;BEGIN-BEGIN-BEGIN-BEGIN-BEGIN-B
NMI
INT0
INT1
LICZ_BAZ
TIMER1
TIMER2
CRF00
CRF10
CRF01
CRF11
SEF
ei
reti
;BEGIN-BEGIN-BEGIN-BEGIN-BEGIN-B
;###############################
;TABLE-TABLE-TABLE-TABLE-TABLE-T
wobit dm 'RCN619 interface'
dm ' PPH WObit P-n '
kkkk dm 'RCN619 = 123456'
dm ' '
;TABLE-TABLE-TABLE-TABLE-TABLE-T
;###############################
;EQU-EQU-EQU-EQU-EQU-EQU-EQU-EQU
STACK equ 0FE30h ;top of stack
LCD_C equ 0FD00h ;GAL16V8
LCD equ LCD_C+1
;EQU-EQU-EQU-EQU-EQU-EQU-EQU-EQU
;###############################
;SetUp-SetUp-SetUp-SetUp-SetUp-S
SetUp
mov r2,#80h ;zerowanie RAMu
movw DE,#STACK
mov r1,#0
movm [DE+],A
;general
mov STBC,#00000000b ;NORMAL MODE
mov WDM, #00000010b ;STOP,20ms,prioryty WDM 1 SCK
mov PMC3,#00001111b ;UDC0 & UDC1
mov PM3 ,#00001111b
; mov PM5, #00000000b
; mov INTM,#00000000b ;\ dla INTx i INTy
; mov EXIC0,#00000001b ;priorytet 1
; mov EXIC1,#00000001b
; mov EXIC2,#00000001b
;timer
mov TMC0,#00000000b ;stop,6MHz/6,wielokrot.
movw MD0L,#10000
movw TM0L,#10000 ;10ms
mov TMIC0,#00000010b ;vector int, priorytet=2
set1 TMC0.7 ;timer0 enable
ei
ret
;SetUp-SetUp-SetUp-SetUp-SetUp-S
;###############################
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
LCDinst mov A,MM
mov r0,r1
or MM,#20h ;2 wait state - spowolnienie taktu
mov r1,#38h ;inicjalizacja LCD
mov !LCD_C,A
call !delay1600
mov r1,#38h ;ponowne wywolanie inicjalizacji
mov !LCD_C,A
call !delay1600
mov r1,#00001101b ;display on ,kursor off, blink
mov !LCD_C,A
call !delay40
mov r1,#02h ;return home
mov !LCD_C,A
call !delay1600
mov r1,#01h ;clear LCD
mov !LCD_C,A
call !delay1600
mov r1,r0
mov MM,A ;odtworzenie MM
ret
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
;-------------------------------
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
delay40 push rp1
mov r2,#16 ;;32 ;2x wiekszy od minimalnej poprawnej wartosci
del401 dbnz C,$del401
pop rp1
ret
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
;-------------------------------
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
delay1600 mov r2,#40 ;1600uS
delay16_1 call !delay40
dbnz C,$delay16_1
ret
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
;-------------------------------
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
;wypisanie napisu na LCD, 16 znakow (linia1)
NAPIS1 mov r2,#16
movw HL,#WYSWIETL
mov A,MM
mov r0,r1
or MM,#20h ;2 wait state
mov r1,#00001100b ;display on ,kursor off, no blink
mov !LCD_C,A
call !delay40
mov r1,#128
mov !LCD_C,A ;adres LCD low
call !delay40
nap_l1 mov A,[HL+]
mov !LCD,A
call !delay40
dbnz C,$nap_l1
call !delay40
mov r1,#00001101b ;display on ,kursor off, blink
mov !LCD_C,A
call !delay40
mov r1,r0
mov MM,A ;odtworzenie MM
ret
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
;-------------------------------
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
;wypisanie napisu na LCD, 16 znakow (linia2)
NAPIS2 mov r2,#16
movw HL,#WYSWIETL+16
mov A,MM
mov r0,r1
or MM,#20h ;2 wait state
mov r1,#00001100b ;display on ,kursor off, no blink
mov !LCD_C,A
call !delay40
mov r1,#128+40
mov !LCD_C,A ;adres LCD low
call !delay40
nap_l12 mov A,[HL+]
mov !LCD,A
call !delay40
dbnz C,$nap_l12
call !delay40
mov r1,#00001101b ;display on ,kursor off, blink
mov !LCD_C,A
call !delay40
mov r1,r0
mov MM,A ;odtworzenie MM
ret
;LCD-LCD-LCD-LCD-LCD-LCD-LCD-LCD
;###############################
;CZAS-CZAS-CZAS-CZAS-CZAS-CZAS-C
WIZYTOWKA mov r2,#32
movw HL,#wobit
movw DE,#WYSWIETL
movbk [DE+],[HL+]
call !NAPIS1
call !NAPIS2
WIZYT1 cmpw CZAS,#200
bnz $WIZYT1 ;wait 3 sek
movw CZAS,#0
mov r2,#32
movw HL,#kkkk
movw DE,#WYSWIETL
movbk [DE+],[HL+]
call !NAPIS1
call !NAPIS2
ret
;CZAS-CZAS-CZAS-CZAS-CZAS-CZAS-C
;---------------------------------
BCDlcd movw rp6,#BCD
movw rp7,#WYSWIETL+15
mov r2,#6
BCDlcd1 mov r1,#'0'
add A,[DE+]
mov [HL-],A
dbnz C,$BCDlcd1
ret
;---------------------------------
AX2BCD movw rp6,rp0 ;AX(bin) ->AX(bcd) [rp0,rp1,rp2,rp3,rp6]
movw rp0,#0 ;rp6 0 mlodsze
movw rp1,#1000
divux rp1 ;rp0rp6:rp1 ->rp0rp6 reszta -> rp1
movw rp2,rp6 ;(r5r4) r4=*1000
movw rp6,rp1
movw rp1,#100
divux rp1 ;rp0rp6:rp1 ->rp0rp6 reszta -> rp1
movw rp3,rp6 ;(r7r6) r6=*100
movw rp0,rp1
mov r2,#10
divuw r2 ;rp0/r2=>rp0, r2=reszta=*1, r0=*10
shl r0,4
add r0,r2 ;X=*10/*1
mov r1,r4
shl r1,4
add r1,r6 ;A=*1000/*100
ret
;===============================
binBCD movw AX,bin+0
movw rp1,rp0
mov A,bin+2
mov r0,r1
mov r1,#0 ;rp0rp1-> bcd-> rp5rp4 (r11r10r9r8) [BCD]
movw rp6,rp1
movw rp1,#10000
divux rp1 ;rp0rp6/rp1=>rp0rp6 R=rp1
push rp6 ;rp1 = x*1000 + x*100 + x*10 + x*1
xchw rp0,rp1 ;rp6 = x*1000000 + x*100000 + x*10000 + x*10000
call !AX2BCD ;4 mlodsze digity
movw rp4,rp0 ;rp4 = wynik 4 mlodszych digitow
pop rp0 ;rp6->rp0
call !AX2BCD ;4 starsze digity
movw rp2,rp4
movw rp3,rp0 ;wynik -> (r7r6r5r4)
mov r1,r4
and A,#0Fh
mov BCD+0,A
mov r1,r4
shr r1,4
mov BCD+1,A
mov r1,r5
and A,#0Fh
mov BCD+2,A
mov r1,r5
shr r1,4
mov BCD+3,A
mov r1,r6
and A,#0Fh
mov BCD+4,A
mov r1,r6
shr r1,4
mov BCD+5,A
ret
;---------------------------------
;ллллллллллллллллллллллллллллл
SRF push rp0
mov A,RxB
cmp A,#0 :? zadanie pozycji
bnz $SRF1
movw BUFOR+0,BUFOR1+0 ;zadanie pozycji
movw BUFOR+2,BUFOR1+2
movw ile,#BUFOR+1
mov A,BUFOR+0
mov TxB,A
set1 SCM.7 ;start TxD
br $SRFend
SRF1 cmp A,#80h ;? set 4800Bd
bnz $SRF2
mov Bd,#0 ;0->4800Bd,9600,19200,3->38400Bd
call !setCOM
br $SRFend
SRF2 cmp A,#81h ;? set 9600Bd
bnz $SRF3
mov Bd,#1 ;0->4800Bd,9600,19200,3->38400Bd
call !setCOM
br $SRFend
SRF3 cmp A,#82h ;? set 19200Bd
bnz $SRF4
mov Bd,#2 ;0->4800Bd,9600,19200,3->38400Bd
call !setCOM
br $SRFend
SRF4 cmp A,#83h ;? set 38400Bd
bnz $SRFend
mov Bd,#3 ;0->4800Bd,9600,19200,3->38400Bd
call !setCOM
br $SRFend
SRFend pop rp0
ei
reti
;ллллллллллллллллллллллллллллл
INT2
ei
reti
;ллллллллллллллллллллллллллллл
TIMER0 ei ;<10ms> (sekundy, keybord, ..
incw CZAS
mov WDM,#94h ;start WatchDog (5.5ms - 87ms)
not1 P3.5 ;PWM1 - MAX690 WachDog
reti
;ллллллллллллллллллллллллллллл
STF push rp0\rp7
cmpw ile,#BUFOR+4
bz $STFend
movw AX,ile
movw rp7,rp0
mov A,[hl]
mov TxB,A
incw ile
STFend pop rp0\rp7
ei
reti
;ллллллллллллллллллллллллллллл
WATCH_DOG
mov PSWL,#0
mov PSWH,#0
mov CCW,#0
mov WDM,#0
mov INTM,#0
mov CRIC00,#01000001b
mov CRIC01,#01000001b
mov ADIC, #01000111b
mov SEIC, #01000011b
mov SRIC, #01000011b
mov STIC, #01110011b
mov TMIC0, #01000100b
ZWOLN mov A,ISPR
cmp A,#0
bz $ZWOL_OK
movw rp0,#ZWOLN
push rp0 ;zakonczenie nieskonczonych przewan
reti
ZWOL_OK br !BEGIN
;ллллллллллллллллллллллллллллл
;ллллллллллллллллллллллллллллл
;ллллллллллллллллллллллллллллл
;ллллллллллллллллллллллллллллл
end
end
end
end
Wejscia:
INT2 -
P0.1 - DATA
Wyjscia:
P0.0 - CLK