;-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- ;RX9CBI HF Synthesizer(Sig.generator). Sep'97-Feb'98 ; 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 - 514ИД1 ; 4,5,6 - 555ИД10 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 ;в 514ид1 и 555ид10 и погасить светодиод ;----------------------------------- 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==============================