     AD9850
 - . , RX9CBI.
.   . 1/2002 .

;-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
;RX9CBI  HF Synthesizer(Sig.generator). 
; 
; DDS AD9850   F clk= 83,88608 MHz
; Controller PIC16C55   F XTosc=4MHz    WDT Off
; Mike Kislinsky
; rx9cbi@narod.ru  rx9cbi@qsl.net 
;--------------------------------------------
	list p=16C55
;****Register Definition**** 
port_a  equ     5       
port_b  equ     6
port_c  equ     7
;---------------------------------------------
flag    equ     8    ;Flags:
;----flag bits-------------
goi3    equ     2    ;+/-100kHz  Up/Dwn
push    equ     3    ;  
car     equ     4    ;  BCDSub  BCDAdd
;---------------------------------------------
count   equ     9    ;temp bit counter in `Send`
difb1   equ     0A   ;\ 
difb2   equ     0B   ;/     b
kncount equ     0C   ;   Disp
step    equ     0D   ;  0=10 1=50 2=100Hz  
temp    equ     0E   
scan    equ     0F   ;  10
i1      equ     10   ;\ F bcd ( )
i2      equ     11   ;   |
i3      equ     12   ;   | 
i4      equ     13   ;/
b1      equ     14   ; \ F hex (  DDS)
b2      equ     15   ;   |
b3      equ     16   ;   /
difi1   equ     17   ;    i
temp2   equ     1A   ; 
oldval  equ     1B   ;  -\\- 
scled   equ     1C   ; 
led     equ     1D   ; : 
;---led's bit Definition -------
S10     equ     7    ;  10Hz
S50     equ     6    ; 50Hz
S100    equ     5    ; 100Hz 
;----port A - ----------------------------
;              0, 1 -     
;----port B - ---------------------------
;            0,1,2,3 -  5141
;            4,5,6  - 55510
onled   equ     7   ; 
;----port C--------------------------------
kn1     equ     0   ;   1...7
kn2     equ     1   ;      -//-      8...14
dat     equ     5   ;|  DDS
clk     equ     6   ;|
str     equ     7   ;|
;******************************************************
	org     0
	goto	PWRUP
;===4    !=====\   0FF====
Tabval  addwf   2      ;(r)   PC
	retlw   0       ;0   00 00    old
	retlw   2       ;1   00 01   +
	retlw   1       ;2   00 10   -
	retlw   0       ;3   00 11    ???
	retlw   1       ;4   01 00   -
	retlw   0       ;5   01 01    old
	retlw   0       ;6   01 10    ???
	retlw   2       ;7   01 11   +
	retlw   2       ;8   10 00   +
	retlw   0       ;9   10 01    ???
	retlw   0       ;a   10 10    old
	retlw   1       ;b   10 11   -
	retlw   0       ;c   11 00    ???
	retlw   1       ;d   11 01   -
	retlw   2       ;e   11 10   +
	retlw   0       ;f   11 11    old
;====    DDS ===================
F_ud    call    Zbyte  ;  =00
	movf    b1,w
	call    Send   ;1 
	movf    b2,w
	call    Send   ;2
	movf    b3,w
	call    Send   ;3
	call    Zbyte  ;  =00
	bsf     port_c,str  ;_- 
	bcf     port_c,str  ;  -_
	retlw   0
;===  1   DDS=====
Send    movwf   temp      ;  temp
	clrf    count     ;
	bsf     count,3   ;set 08
	bcf     3,0       ;reset `c`
next    bcf     port_c,dat
	rrf     temp,f    ; 
	btfsc   3,0       ;c=1?
	bsf     port_c,dat
	bsf     port_c,clk    ;_-CLK 
	bcf     port_c,clk    ;  -_
	decfsz  count,f
	goto    next
	bcf     port_c,dat
	retlw   0
;=====byte00====================================
Zbyte   bcf     port_c,dat  ; must be zero!
	bsf     port_c,clk  ;1
	bcf     port_c,clk  ;   
	bsf     port_c,clk  ;2
	bcf     port_c,clk  ;
	bsf     port_c,clk  ;3
	bcf     port_c,clk  ;
	bsf     port_c,clk  ;4
	bcf     port_c,clk  ;
	bsf     port_c,clk  ;5
	bcf     port_c,clk  ;
	bsf     port_c,clk  ;6
	bcf     port_c,clk  ;
	bsf     port_c,clk  ;7
	bcf     port_c,clk  ;
	bsf     port_c,clk  ;8
	bcf     port_c,clk  ;
	retlw   0
;#############################################################
PWRUP   movlw   b'000111' ;.p    Timer 
	option            ;1us*256=256us  TMR: 256*256=65,536 mS
;---------------------------------------------
	clrf    port_b
	clrf    port_c
	movlw   b'1111' 
	tris    port_a     ;p    
	movlw   b'00000000' 
	tris    port_b     ; B  
	movlw   b'00000011' 
	tris    port_c     ; C 0;1  
	clrf    step       ;step 10Hz
	clrf    led
	bsf     led,S10    ; 10Hz
	clrf    flag
;=== - AD9850 =====================
Idds    bsf     port_c,str  ; _-_
	bcf     port_c,str  ;
	bsf     port_c,clk  ;CLK   _-_
	bcf     port_c,clk  ;
	bsf     port_c,str  ; _-_
	bcf     port_c,str  ;
	call    Zbyte
	bsf     port_c,str  ; _-_
	bcf     port_c,str  ;
	clrf    i1     ; F 
	clrf    i2     ; 
	movlw   40
	movwf   i3
	clrf    i4
	incf    i4     ;1 40 00 00 = 14MHz
	movlw   80     ;   AD9850
	movwf   b1
	movlw   0B9    ;
	movwf   b2
	movlw   2A     ;
	movwf   b3     ; 14MHz=2AB980    (1e8480=10MHz)
	call    F_ud
;========7=4===========
Disp    movlw   7
	movwf   scan     ;    (7 1)
	movlw   b'10000000'
	movwf   scled    ;  
	decf    kncount  ;   
;-----    (13h...10h)--
Indik   incf    scan,w   ;+1     
	movwf   temp     ;                     
	bcf     3,0      ;C
	rrf     temp     ;/2
	movlw   0F       ;.!
	addwf   temp,w   ;scan`+
	movwf   4        ; FSR
;----------- -------------------        
	clrf    temp
	swapf   scan,w   ;scan (7...1)  
	movwf   temp     ;    temp (10,20...70)
;----------- (r)   ------------------
	btfss   scan,0   ;    
	swapf   0,w      ; scan   swap
	btfsc   scan,0
	movf    0,w      ; FSR
	andlw   0F       ;   
	iorwf   temp,w   ;temp OR w
;-----------------------------------
Topor   movwf   port_b   ; 5141  55510   
;-----------------------------------        
	clrf    1             ;timer reset
;-----  ------------------
	movf    scled,w       ;10000000 rrf to 00000010
	andwf   led,w         ;maskout
	btfss   3,2           ;z?
	bsf     port_b,onled  ; no.ON
	bcf     3,0           ;
	rrf     scled,f       ;shift mask for next cicle
;---- -----1  Indik-----<0FF--
	btfss   flag,push   ;   .?
	goto    Kno         ;   
	movf    kncount,f   ;   
	btfss   3,2         ;z. kncount=0?
	goto    Tune        ; .             
	bcf     flag,push   ; .  .
Kno     btfsc   port_c,kn1
	goto    Kn2
	bsf     flag,push   ; .
	movlw   .13         ;        !
	movwf   kncount     ; . 
	movf    scan,w
	addwf   2        ; PC+scan    <0FF  
	nop              ;0  
;---  ----
	nop            ;1 *   
	nop            ;2 *
	nop            ;3 *      
	goto    Left   ;4    
	goto    Right  ;5  
	goto    Dwn    ;6 100 kHz 
	goto    Up     ;7 100 kHz 
Kn2     btfsc   port_c,kn2
	goto    Tune    ;    
	bsf     flag,push   ;.  .
	movlw   .14         ;    (2 )   !
	movwf   kncount     ;
	movf    scan,w
	addwf   2        ; PC+scan
	nop
;---  -----
	nop              ;1 *
	nop              ;2 *
	nop              ;3 *
	nop              ;4 *
	nop              ;5 *
	nop              ;6 *
	goto    Step     ;7  
;===  =====1  =============
Dwn     movlw   20       ;5   100kHz down
	movwf   difb1
	movlw   4E
	movwf   difb2    ;4e20 
	bsf     flag,goi3   ; . +1  3- 
	goto    Sub
;==================================
Up      movlw   20       ;6   100kHz up
	movwf   difb1
	movlw   4E
	movwf   difb2    ;4e20 
	bsf     flag,goi3
	goto    Add
;================================    
Step    btfsc   step,1   ;2?  
	goto    St2      ; yes
	btfsc   step,0   ;1?     
	goto    St1      ; yes
	incf    step     ;0
	bcf     led,S10
	bsf     led,S50
	goto    Time
St1     incf    step
	bcf     led,S50
	bsf     led,S100
	goto    Time
St2     clrf    step
	bcf     led,S100
	bsf     led,S10
	goto    Time
;==== ========================
Tune    movf    port_a,w   
	andlw   3          ;AND 000000nn
	movwf   temp2      ;
	bcf     3,0        ;   
	rlf     oldval,f   ;  
	rlf     oldval,w   ; 0000xx00
	iorwf   temp2,w     ;OR  - 000000nn
	call    Tabval
	movwf   temp       ;-    temp
	movf    temp2,w      ;0/?.  
	movwf   oldval       ;          
	btfsc   temp,0     ;0=old or ???   1=-  2=+
	goto    Left       ;-
	btfsc   temp,1     ;   2?
	goto    Right      ;+  
;---    3-4mS-----------
Time    movlw   .12    ;    !
	subwf   1,w
	btfss   3,0    ; ?
	goto    Tune   ;.  
Ind3    movlw   .14    ;  
	subwf   1,w
	btfss   3,0    ;c    ?
	goto    Ind3
	decfsz  scan    ; .  scan-1
	goto    Indik    ; . 
	goto    Disp
;=====  =====================
Left    btfsc   step,1
	goto    Le100    ;  100Hz
	btfsc   step,0
	goto    Le50     ;50Hz
	movlw   2        ;10Hz
	movwf   difb1
	clrf    difb2    ;0002 
	clrf    difi1
	incf    difi1    ;1
	goto    Sub
Le100   movlw   14       ;100Hz
	movwf   difb1
	clrf    difb2    ;0014 
	movlw   10
	movwf   difi1    ;10
	goto    Sub
Le50    movlw   0A       ;50Hz
	movwf   difb1
	clrf    difb2    ;000A 
	movlw   5
	movwf   difi1    ;5
	goto    Sub
;=================================
Right   btfsc   step,1
	goto    Ri100    ;  100Hz
	btfsc   step,0
	goto    Ri50     ;50Hz
	movlw   2        ;10Hz
	movwf   difb1
	clrf    difb2    ;0002 
	clrf    difi1
	incf    difi1    ;1
	goto    Add
Ri100   movlw   14       ;100Hz
	movwf   difb1
	clrf    difb2    ;0014 
	movlw   10
	movwf   difi1    ;10
	goto    Add
Ri50    movlw   0A       ;50Hz
	movwf   difb1
	clrf    difb2    ;000A 
	movlw   5
	movwf   difi1    ;5
	goto    Add
;===========================================
;-_-_- 3  _-_-_-_-_-
Sub     movf    difb1,w
	subwf   b1
	btfsc   3,0   ;c
	goto    Su1   ;  cary -  
	movlw   1
	subwf   b2    ; 
	btfss   3,0   ;c     \/
	decf    b3
Su1     movf    difb2,w
	subwf   b2
	btfss   3,0   ;c
	decf    b3    
;              
;--***BCD Subtraction ***Microchip Math Library-
BCDSub  btfsc   flag,goi3  ; 100kHz?
	goto    BcdSub3    ;   
	bcf     flag,car
	movf    difi1,w
	subwf   i1, F
	btfsc   3,0         ;C?       
	bsf     flag,car
	btfss   3,1         ;DC
	goto    adjst1
	btfss   i1,3        ; Adjust LSD of Result
	goto    Over1
	btfsc   i1,2
	goto    adjst1      ; Adjust LSD of Result
	btfss   i1,1
	goto    Over1       ; No : Go for MSD
adjst1  movlw   6
	subwf   i1, F
Over1   btfss   flag,car     ; CY = 0 ?
	goto    adjst2       ; Yes, adjust MSD of result
	bcf     flag,car
	btfss   i1,7         ; No, test for MSD >9
	goto    Ove
	btfsc   i1,6
	goto    adjst2
	btfss   i1,5
	goto    Ove
adjst2  movlw   60            ; add 6 to MSD
	subwf   i1, F
	bcf     flag,car
	btfss   3,0           ;C test if underflow
	GOTO    EndSub
	goto    BcdSub2
Ove     btfss   flag,car
	GOTO    EndSub    ;
;---2 -----------   ---
BcdSub2 bcf     flag,car
	movlw   1
	subwf   i2, F
	btfsc   3,0        ;C?       
	bsf     flag,car
	btfss   3,1        ;DC
	goto    adjst12
	btfss   i2,3          ; Adjust LSD of Result
	goto    Over12
	btfsc   i2,2
	goto    adjst12       ; Adjust LSD of Result
	btfss   i2,1
	goto    Over12      ; No : Go for MSD
adjst12 movlw   6
	subwf   i2, F
Over12  btfss   flag,car        ; CY = 0 ?
	goto    adjst22         ; Yes, adjust MSD of result
	bcf     flag,car
	btfss   i2,7         ; No, test for MSD >9
	goto    Ove2
	btfsc   i2,6
	goto    adjst22
	btfss   i2,5
	goto    Ove2
adjst22 movlw   60              ; add 6 to MSD
	subwf   i2, F
	bcf     flag,car
	btfss   3,0             ;C test if underflow
	GOTO    EndSub
	goto    BcdSub3
Ove2    btfss   flag,car
	GOTO    EndSub
;----3 -------------------------
BcdSub3 bcf     flag,car
	movlw   1          ;1 =100 kHz
	subwf   i3, F
	btfsc   3,0        ;C?       
	bsf     flag,car
	btfss   3,1        ;DC
	goto    adjst13
	btfss   i3,3         ; Adjust LSD of Result
	goto    Over13
	btfsc   i3,2
	goto    adjst13       ; Adjust LSD of Result
	btfss   i3,1
	goto    Over13        ; No : Go for MSD
adjst13 movlw   6
	subwf   i3, F
Over13  btfss   flag,car        ; CY = 0 ?
	goto    adjst23         ; Yes, adjust MSD of result
	bcf     flag,car
	btfss   i3,7         ; No, test for MSD >9
	goto    Ove3
	btfsc   i3,6
	goto    adjst23
	btfss   i3,5
	goto    Ove3
adjst23 movlw   60              ; add 6 to MSD
	subwf   i3, F
	bcf     flag,car
	btfss   3,0             ;C test if underflow
	GOTO    EndSub
	goto    BcdSub4
Ove3    btfss   flag,car
	GOTO    EndSub
;---4  (=0...3)------
BcdSub4 decf    i4        ;i4 = 0...2
EndSub  bcf     flag,goi3
	call    F_ud
	GOTO    Time
;==== 3-    b====
Add     movf    difb1,w
	addwf   b1
	btfss   3,0   ;c
	goto    Ad1
	incf    b2
	btfsc   3,2   ;z
	incf    b3
Ad1     movf    difb2,w
	addwf   b2
	btfsc   3,0
	incf    b3
; xx      movf    difb3,w
; xx      addwf   b3
;----*** Unsigned BCD Addition ***
BCDAdd  btfsc   flag,goi3  ;  100kHz? 
	goto    BcdAdd3    ; yes
	bcf     flag,car
	movf    difi1,w
	addwf   i1,F   ;do binary addition
	btfsc   3,0        ;C?
	bsf     flag,car   ;    ""
	btfsc   3,1        ;DC ?
	goto    adjust     ;   adjust LSD
	movlw   6
	addwf   i1,F    ; Test for LSD > 9 (by adding 6
	btfsc   3,0        ;C?
	bsf     flag,car   ;  ""
	btfss   3,1        ;  & checking Digit Carry
	subwf   i1,F    ; LSD < 9 , so get back original value.
	goto    over1
adjust  movlw   6
	addwf   i1,F
over1   movlw   60         ;add 6 to MSD
	addwf   i1,F
	btfsc   3,0        ;C?
	goto    BcdAdd2
	btfsc   flag,car
	goto    BcdAdd2
	subwf   i1,F      ;-60H
	GOTO    EndAdd
;--  ------------------ 
BcdAdd2 bcf     flag,car
	movlw   1
	addwf   i2,F        ;do addition
	btfsc   3,0         ;C?
	bsf     flag,car   ;    ""
	btfsc   3,1        ;DC ?
	goto    adj2       ;   adjust LSD
	movlw   6
	addwf   i2,F       ; Test for LSD > 9 ( by adding 6
	btfsc   3,0        ;C?
	bsf     flag,car   ;  ""
	btfss   3,1        ;  & checking Digit Carry
	subwf   i2,F       ; LSD < 9 , so get back original value.
	goto    over2
adj2    movlw   6
	addwf   i2,F
over2   movlw   60         ;add 6 to MSD
	addwf   i2,F
	btfsc   3,0        ;C?
	goto    BcdAdd3
	btfsc   flag,car
	goto    BcdAdd3
	subwf   i2,F    ;-60H
	GOTO    EndAdd
;-- 3 ----------------
BcdAdd3 bcf     flag,car
	movlw   1         ;1 = 100 kHz
	addwf   i3,F       ;do addition 1       
	btfsc   3,1        ;DC ?
	goto    adj3       ;   adjust LSD
	movlw   6
	addwf   i3,F       ; Test for LSD > 9 ( by adding 6
	btfsc   3,0        ;C?
	bsf     flag,car   ;  ""
	btfss   3,1        ;  & checking Digit Carry
	subwf   i3,F       ; LSD < 9 , so get back original value.
	goto    over3
adj3    movlw   6
	addwf   i3,F
over3   movlw   60         ;add 6 to MSD
	addwf   i3,F
	btfsc   3,0        ;C?
	goto    BcdAdd4
	btfsc   flag,car
	goto    BcdAdd4
	subwf   i3,F    ;-60H
	GOTO    EndAdd
;--  4  (=0,1,2)-------------------
BcdAdd4 incf    i4,F     ;do addition 1
EndAdd  bcf     flag,goi3 
	call    F_ud
	GOTO    Time
;**************************************************************       
;	org     1ff   ;pic16c55
;	goto    PWRUP
	end
;================THE END=====================
