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