;*********************************************************** ;VFO-1dds.asm rev1.3 ;TX-88A用8MHz OSC X 6逓倍50MHz VFO ;2009.7.25 ; ;*********************************************************** list p=16f84 INCLUDE __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;******************************************** ; Define Constant or Work ;******************************************** CBLOCK 0X0D DAT_CNT ;Dispaly Data Bits Counter CNT1 ;Timer Counter for CLOCK CNT2 ;Timer Counter for 10usec CNT3 ;Timer Counter for 5msec CNT4 ;Timer Counter for 1sec CNT5 ;Timer Counter for 100usec TEMP ;Tempolary Save Area KEY ;KEY DATA SAVE EN_T0 ;R_ENCODER T0時の状態 EN_T1 ;R_ENCODER T1時の状態 SW_T0 ;SW T0時の状態 F_STEP ;F_STEP 10Hz/100Hz FREQ_FLG ;FREQ CHANG FLG ONOFF_FLG ;VFO ONOFF FLAG A_LO ;FREQ DATA A_LO TO A_TOP A_MD A_HI A_TOP B_LO ;FREQ DATA B_LO TO B_TOP B_MD B_HI B_TOP C_LO ;FREQ DATA C_LO TO C_TOP C_MD C_HI C_TOP CTEMP D_LO ;FREQ DATA D_LO TO D_TOP D_MD D_HI D_TOP STEP_LO STEP_MD STEP_HI ;追加 STEP_LOW_BYTE ; DIGIT12 ;Hz,10Hz桁 DIGIT34 ;100Hz,1kHz桁 DIGIT56 ;10kHz,100kHz桁 DIGIT78 ;1MHz,10MHz桁 DATA_SAVE WORK1 TEMP1 SHIFT ENDC ;******************************** ; Main Routine ;******************************** ORG 0 bcf ONOFF_FLG,0 bsf ONOFF_FLG,1 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALIZATION ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALL PORTA_SET ;PORT INITIALIZATION CALL PORTB_SET CALL DDS_INI ;WAKE-UP DDS(LET OUTPUT ON) CALL FREQ_INI1 ;SET INIT FREQ.8.452.000MHz CALL SEND_DAT ;DATA SEND CALL DAT_X6 CALL DATCNV CALL REG_MOV2 CALL LED_DISP ;*****Main Routine***************** MAIN CALL FSTEP_SW ;SW状態検出 CALL MEMO_SW ;MEMO1,2検出 CALL EN_SCAN ;R_ENCODER UP/DWN 検出 CALL REG_MOV1 ;C_REG TO B_REGへ移動 CALL ONOFF_SW ;VFO ON/OFF検出 CALL FLG_CHK CALL SEND_DAT ;DATA SEND CALL DAT_X6 ;DATA X 6 CALL DATCNV ;BINARY TO BCD CALL REG_MOV2 ;B_REG TO C_REGへ移動 CALL LED_DISP ;LED DISPLAY GOTO MAIN ;------------------------------------------------------------------------------ ;***** Date Send to DDS************ SEND_DAT CALL TXD RETURN ;********** PORT A & B Initialize Routine**************************** PORTA_SET CLRF PORTA CLRF PORTB BSF STATUS,RP0 ;Select bank1 MOVLW b'00000011' ;PortA RA0,RA1入力 他出力 MOVWF TRISA ;にセット BCF STATUS,RP0 ;Select Bank0 RETURN PORTB_SET BSF STATUS,RP0 ;SELECT Bank1 MOVLW b'00001111' ;PortB RB0-3 INPUT, MOVWF TRISB ;SET PORT B BCF STATUS,RP0 ;Select Bank0 RETURN ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DDS INITIALIZE ; COMMAND=1 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DDS_INI CALL TIME5M ;WAIT 5mS CALL TIME5M ;WAIT 5mS CALL TIME5M ;WAIT 5mS ; CALL STROBE_1 ;STROBE=1 (NORMAL STB=1) ;ADDRESS SET CALL BIT1 ;CS0=1 CALL BIT1 ;CS1=1 CALL BIT1 ;CS2=1 ;COMMAND=1:SET DDS OUTPUT=1 CALL BIT1 CALL BIT0 CALL BIT0 CALL BIT0 ;8x3=24BITS FREQ.DATA(DUMMY=00H) MOVLW 00H CALL TX_BYTE MOVLW 00H CALL TX_BYTE MOVLW 00H CALL TX_BYTE ;2BITS DATA=00H CALL BIT0 CALL BIT0 CALL STROBE_0 ;STROBE=0 RETURN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SET INITIAL FREQENCY MEMO1=50,550 MEMO2=50.620MHz ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FREQ_INI1 MOVLW 0x00 ; MOVWF B_TOP ; MOVWF C_TOP MOVLW 0x80 ;SET 8,425,000Hz=808E28H TO DATA_B MOVWF B_HI ; MOVWF C_HI MOVLW 0x8E ; MOVWF B_MD ; MOVWF C_MD MOVLW 0x28 ; MOVWF B_LO ; MOVWF C_LO RETURN FREQ_INI2 MOVLW 0x00 ; MOVWF B_TOP ; MOVWF C_TOP MOVLW 0x80 ;SET 8,436,667Hz=80BBBBH TO DATA_B MOVWF B_HI ; MOVWF C_HI MOVLW 0xBB ; MOVWF B_MD ; MOVWF C_MD MOVLW 0xBB ; MOVWF B_LO ; MOVWF C_LO RETURN ;*********SW設定の検出**************************************************** FSTEP_SW CALL PORTB_SET ;RB0-3入力 RB4-7=出力 MOVLW b'01110000' ;RB7=0設定で74LS244選択 MOVWF PORTB MOVF PORTB,W ;PORTBからSW設定取り込み MOVWF SW_T0 BTFSC SW_T0,0 GOTO FS_6 ;STEP=6Hzへ GOTO FS_44 ;STEP=44Hzへ FS_6 ;周波数ステップ15Hz可変 MOVLW 06H ;6Hz MOVWF F_STEP RETURN FS_44 ;周波数ステップ150Hz可変 MOVLW 2CH ;2CH=44Hz MOVWF F_STEP RETURN ;*********メモリーSW検出*********************************** MEMO_SW CLRF FREQ_FLG ;A BTFSC SW_T0,1 ;1ビット目が0ならMEMO1へ GOTO MEMO2_SET GOTO MEMO1_SET MEMO1_SET ;MEMO1=50.550MHz CALL FREQ_INI1 BSF FREQ_FLG,1 ;1ビット目に1セット RETURN MEMO2_SET ;MEMO2=50.620MHz BTFSC SW_T0,2 ;2ビット目が0ならMEMO2へ RETURN CALL FREQ_INI2 BSF FREQ_FLG,1 ;1ビット目に1セット RETURN ;*********ロータリ−エンコーダー変化検出********************** EN_SCAN MOVF PORTA,W ; MOVWF EN_T0 ;T0時の状態をSAVE EN_SCAN_SUB CALL TIME1M ;1mS WAIT MOVF PORTA,W ;もう一度R_ENの状態を見る MOVWF EN_T1 ;T1時の状態をSAVE XORWF EN_T0,W ;EN_T0とEN__T1を比較して BTFSC STATUS,Z ;変化していたらEN_CHECKへ GOTO F_FLG_RST GOTO EN_CHECK ;********周波数変化フラグリセット********************************** F_FLG_RST BCF FREQ_FLG,0 ; RETURN ;********ロータリーエンコーダー回転方向検出*********************************** EN_CHECK BSF FREQ_FLG,0 ;周波数変化あればフラグセット RLF EN_T0 ;ビットシフト MOVLW 03H ;下位2ビット取り出し ANDWF EN_T0,F ;ビットマスク ANDWF EN_T1,W ADDWF EN_T0,F ;EN_T0とEN_T1を加算して BTFSC EN_T0,1 ;2ビット目が1ならCWへ GOTO EN_CCW ;0ならCCWへ GOTO EN_CW ;*******ロータリーエンコーダー反時計方向回転処理******************************* EN_CCW MOVF F_STEP,W ;STEP周波数をDへ ; MOVLW 0AH MOVWF D_LO MOVLW 0H ; MOVWF D_MD MOVWF D_HI MOVWF D_TOP CALL T_SUB ;減算処理へ RETURN ;*******ロータリーエンコーダー時計方向回転処理*************** EN_CW MOVF F_STEP,W ;STEP周波数をDへ MOVWF D_LO MOVLW 0H ; MOVWF D_MD MOVWF D_HI MOVWF D_TOP CALL T_ADD ;加算処理へ RETURN ;*********VFO ON/OFF_SW検出**************************** ONOFF_SW ; BSF SW_T0,3 BTFSC SW_T0,3 ;4ビット目0ならDDS ONへ GOTO DDS_OFF GOTO DDS_ON DDS_OFF BTFSC ONOFF_FLG,0 ;0ビット目0ならDDS OFFへ RETURN CALL VFO_OFF RETURN DDS_ON BTFSC ONOFF_FLG,1 ;1ビット目0ならDDS ONへ RETURN CALL VFO_ON ;DDS ON RETURN ;*********C_L,M,HとB_L,M.Hの移動************************** REG_MOV1 MOVF C_LO,W ;C_LOの内容をB_LOへ MOVWF B_LO MOVF C_MD,W ;C_MIDの内容をB_MIDへ MOVWF B_MD MOVF C_HI,W ;C_HIの内容をB_HIへ MOVWF B_HI RETURN REG_MOV2 MOVF B_LO,W ;B_LOの内容をC_LOへ MOVWF C_LO MOVF B_MD,W ;B_MIDの内容をC_MIDへ MOVWF C_MD MOVF B_HI,W ;B_HIの内容をC_HIへ MOVWF C_HI RETURN ;*********バイナリ−を6逓倍(2倍+4倍)にする****************** DAT_X6 ;50MHzVFO仕様 8.425MHz X 6=50.550MHzを表示 ;B DATA X 2 MOVF B_LO,W ;B_LOの内容をC_LOへ一旦セーブ MOVWF C_LO MOVF B_MD,W ;B_MIDの内容をC_MIDへ MOVWF C_MD MOVF B_HI,W ;B_HIの内容をC_HIへ MOVWF C_HI BCF STATUS,C RLF C_LO,F RLF C_MD,F RLF C_HI,F BTFSC STATUS,C BSF C_TOP,0 ;CARYをC_TOPにSETする ;C DATA X 2=B DATA X 4 MOVF C_LO,W ;C_LOの内容をD_LOへ一旦セーブ MOVWF D_LO MOVF C_MD,W ;C_MIDの内容をD_MIDへ MOVWF D_MD MOVF C_HI,W ;C_HIの内容をD_HIへ MOVWF D_HI MOVF C_TOP,W ;C_TOPの内容をD_TOPへ MOVWF D_TOP BCF STATUS,C RLF D_LO,F RLF D_MD,F RLF D_HI,F RLF D_TOP ;B DATA X 6=C DATA(BX2) + D DATA(BX4) CALL T_ADD RETURN ;*********周波数変化確認********************************* FLG_CHK BTFSC FREQ_FLG,1 ;MEMO SW設定確認 RETURN BTFSS FREQ_FLG,0 ;R_EN変化確認 GOTO MAIN RETURN ;********* バイナリ−をBCDデータ−に変換******************* DATCNV ;4バイトバイナリ−をBCD変換 BCF STATUS,C MOVLW 020H ;Shift bit Counter MOVWF SHIFT ;Shift 32回 CLRF DIGIT12 CLRF DIGIT34 CLRF DIGIT56 CLRF DIGIT78 CNV_LOOP RLF C_LO,F RLF C_MD,F RLF C_HI,F RLF C_TOP,F RLF DIGIT12,F RLF DIGIT34,F RLF DIGIT56,F RLF DIGIT78,F DECFSZ SHIFT,F GOTO ADJUST RETURN ADJUST MOVF DIGIT12,W CALL ADJBCD MOVWF DIGIT12 MOVF DIGIT34,W CALL ADJBCD MOVWF DIGIT34 MOVF DIGIT56,W CALL ADJBCD MOVWF DIGIT56 MOVF DIGIT78,W CALL ADJBCD MOVWF DIGIT78 GOTO CNV_LOOP ADJBCD MOVWF WORK1 MOVLW 3 ADDWF WORK1,W MOVWF TEMP1 BTFSC TEMP1,3 MOVWF WORK1 MOVLW 030H ADDWF WORK1,W MOVWF TEMP1 BTFSC TEMP1,7 MOVWF WORK1 MOVF WORK1,W RETURN ;***********表示処理ルーチン************************* LED_DISP ; CLRF PORTB MOVLW b'11110000' MOVWF PORTB BSF STATUS,RP0 ;Select bank1 MOVLW b'00000000' ;PortB RB0-7 OUTPUT, MOVWF TRISB ;SET PORT B ; BCF OPTION_REG,NOT_RBPU ;PortB pull-up on BCF STATUS,RP0 ;Select Bank0 ;100Hz_LED1 MOVF DIGIT34,W ;0.1k 1k桁取り出し CALL DISP1 ADDLW B'10000000' ;RB7=1 74244禁止 RB6-4=0 RB0-3 DATA OUT MOVWF PORTB NOP ADDLW B'01110000' ;RB7=1 74244禁止 RB6-4=1 LED1ラッチ MOVWF PORTB ;1kHz_LED2 CALL DISP2 ADDLW B'10010000' ;RB7=1 RB4=1 LED2 LATCH MOVWF PORTB NOP ADDLW B'01100000' ;上位4bit FにしてラッチをH MOVWF PORTB ;10kHz_LED3 MOVF DIGIT56,W ;10k 100k桁取り出し CALL DISP1 ADDLW B'10100000' ;RB7=1 74244禁止 RB5=1 LED3 LATCH MOVWF PORTB NOP ADDLW B'01010000' ;上位4bit FにしてラッチをH MOVWF PORTB ;100kHz_LED4 CALL DISP2 ADDLW B'10110000' ;RB7=1 74244禁止 RB4,5=1 LED4 LATCH MOVWF PORTB NOP ADDLW B'01000000' ;上位4bit FにしてラッチをH MOVWF PORTB ;1MHz_LED5 MOVF DIGIT78,W ;1M,10MHz桁取り出し CALL DISP1 ADDLW B'11000000' ;RB7=1 74244禁止 RB6=1 LED5 LATCH MOVWF PORTB NOP ADDLW B'00110000' ;上位4bit FにしてラッチをH MOVWF PORTB ;10MHz_LED6 CALL DISP2 ADDLW B'11010000' ;RB7=1 74244禁止 RB4,6=1 LED6 LATCH MOVWF PORTB NOP ADDLW B'00100000' ;上位4bit FにしてラッチをH MOVWF PORTB RETURN DISP1 MOVWF DATA_SAVE ;DATA一時保管 ANDLW 0FH ;下位取り出し RETURN DISP2 MOVF DATA_SAVE,W ;下位データ−取り出し SWAPF DATA_SAVE,W ;上位下位入れ替え ANDLW 0FH ;上位取り出し RETURN ; ;******** ADDITION********************************* ; C(32 BITS) +D(32 BITS)= C(32 BITS) ; 1.LOAD 1ST OPERAND IN C_LO,C_MD,C_HI,C_TOP ; 2.LOAD 2ND OPERAND IN D_LO,D_MD,D_HI,D_TOP ; 3.CALL T_ADD ; 4.THE RESULT IS IN C_LO,C_MD,C_HI,D_TOP ; ;******** SUBTRACTION***************************** ; C(32 BITS) -D(32 BITS)= C(32 BITS) ; 1.LOAD 1ST OPERAND IN C_LO,C_MD,C_HI,C_TOP ; 2.LOAD 2ND OPERAND IN D_LO,D_MD,D_HI,D_TOP ; 3.CALL T_SUB ; 4.THE RESULT IS IN C_LO,C_MD,C_HI,C_TOP T_SUB CALL COM32 ;補数計算後、加算することにより減算する CALL T_ADD CALL COM32 BCF STATUS,C BTFSC CTEMP,0 BSF STATUS,C RETLW 0 T_ADD BCF CTEMP,0 MOVF D_LO,W ADDWF C_LO,F MOVLW 01H BTFSC STATUS,C ADDWF C_MD,F BTFSC STATUS,C ADDWF C_HI,F BTFSC STATUS,C ADDWF C_TOP,F BTFSC STATUS,C BSF CTEMP,0 MOVF D_MD,W ADDWF C_MD,F MOVLW 01H BTFSC STATUS,C ADDWF C_HI,F BTFSC STATUS,C ADDWF C_TOP,F BTFSC STATUS,C BSF CTEMP,0 MOVF D_HI,W ADDWF C_HI,F MOVLW 01H BTFSC STATUS,C ADDWF C_TOP,F BTFSC STATUS,C BSF CTEMP,0 MOVF D_TOP,W ADDWF C_TOP,F BTFSC STATUS,C BSF CTEMP,0 BTFSC CTEMP,0 BSF STATUS,C RETLW 0 COM32 COMF D_LO,F COMF D_MD,F COMF D_HI,F COMF D_TOP,F MOVLW 01H ADDWF D_LO,F BTFSC STATUS,C ADDWF D_MD,F BTFSC STATUS,C ADDWF D_HI,F BTFSC STATUS,C ADDWF D_TOP,F retlw 0 ;++++++ TRANSMIT SERIAL DATA TO DDS ++++++++++ ; RA2:DCK(CLOCK) ; RA3:DDT(DATA) ; RA4:DST(STROBE) ;コマンド=C  TXD ; ;ADDRESS SET CALL STROBE_1 ;STROBE=1 (NORMAL STB=1) CALL BIT1 ;CS0=1 CALL BIT1 ;CS1=1 CALL BIT1 ;CS2=1 ;COMMAND=C:WRT TO MEM /OUT TO DDS CALL BIT0 ;LSB CALL BIT0 CALL BIT1 CALL BIT1 ;MSB ;8x3=24BITS FREQ.DATA MOVF B_LO,W CALL TX_BYTE MOVF B_MD,W CALL TX_BYTE MOVF B_HI,W CALL TX_BYTE ;2BITS DATA=00 CALL BIT0 CALL BIT0 CALL STROBE_0 ;STROBE=0 RETURN BIT1 BCF PORTA,2 ;CLK=0 BSF PORTA,3 ;DATA=1 CALL WAIT_CLK_REV RETURN BIT0 BCF PORTA,2 ;CLK=0 BCF PORTA,3 ;DATA=0 CALL WAIT_CLK_REV RETURN STROBE_1 BSF PORTA,4 ;NORMAL STROBE=1 RETURN STROBE_0 BCF PORTA,4 ;RESET STOROBE=0 CALL TIME10 ;WAIT 10uS BSF PORTA,4 ;STROBE=1(NORMAL) RETURN ;*************************************** ;* SENDING 1BYTE DATA IN W-REG TO DDS ;*************************************** TX_BYTE MOVWF TEMP ;save temporaly MOVLW 8H ;8bit counter MOVWF DAT_CNT TX_LP RRF TEMP,F ;Bit shift BTFSS STATUS,C ;0,1 check GOTO TX_0 GOTO TX_1 TX_0 BCF PORTA,2 ;CLK=0 BCF PORTA,3 ;0 send GOTO TX_NEXT TX_1 BCF PORTA,2 ;CLK=0 BSF PORTA,3 ;1 send TX_NEXT CALL WAIT_CLK_REV DECFSZ DAT_CNT,F ;8bits end test GOTO TX_LP ;Not end loop RETURN WAIT_CLK_REV CALL TIME10 ;10uS WAIT BSF PORTA,2 ;CLK REVERSE CALL TIME10 ;10uS WAIT RETURN ;--------------------------------------------------------------------- VFO_OFF ;コマンド=0  出力をOFF ;ADDRESS SET CALL STROBE_1 ;STROBE=1 (NORMAL STB=1) CALL BIT1 ;CS0=1 CALL BIT1 ;CS1=1 CALL BIT1 ;CS2=1 ;COMMAND=0:DDS OUTPUT OFF CALL BIT0 ;LSB CALL BIT0 CALL BIT0 CALL BIT0 ;MSB ;8x3=24BITS FREQ.DATA 以下はダミーデータ MOVLW 0 CALL TX_BYTE MOVLW 0 CALL TX_BYTE MOVLW 0 CALL TX_BYTE ;2BITS DATA=00 CALL BIT0 CALL BIT0 CALL STROBE_0 ;STROBE=0 ;FLG SET BSF ONOFF_FLG,0 ;OFF FLG SET BCF ONOFF_FLG,1 ;ON FLG RESET RETURN ;--------------------------------------------------------------------- VFO_SEL1 ;コマンド=8  MEM1を出力とする設定 ;ADDRESS SET CALL STROBE_1 ;STROBE=1 (NORMAL STB=1) CALL BIT1 ;CS0=1 CALL BIT1 ;CS1=1 CALL BIT1 ;CS2=1 ;COMMAND=0:DDS OUTPUT OFF CALL BIT0 ;LSB CALL BIT0 CALL BIT0 CALL BIT1 ;MSB ;8x3=24BITS FREQ.DATA 以下はダミーデータ MOVLW 0 CALL TX_BYTE MOVLW 0 CALL TX_BYTE MOVLW 0 CALL TX_BYTE ;2BITS DATA=00 CALL BIT0 CALL BIT0 CALL STROBE_0 ;STROBE=0 VFO_ON ;コマンド=1  DDS出力 ON ;ADDRESS SET CALL STROBE_1 ;STROBE=1 (NORMAL STB=1) CALL BIT1 ;CS0=1 CALL BIT1 ;CS1=1 CALL BIT1 ;CS2=1 ;COMMAND=0:DDS OUTPUT OFF CALL BIT1 ;LSB CALL BIT0 CALL BIT0 CALL BIT0 ;MSB ;8x3=24BITS FREQ.DATA 以下はダミーデータ MOVLW 0 CALL TX_BYTE MOVLW 0 CALL TX_BYTE MOVLW 0 CALL TX_BYTE ;2BITS DATA=00 CALL BIT0 CALL BIT0 CALL STROBE_0 ;STROBE=0 ;FLG SET BSF ONOFF_FLG,1 ;ON FLG SET BCF ONOFF_FLG,0 ;OFF FLG RESET CALL SEND_DAT ;DDSへFREQ DATA RETURN ;-------------------------------------------------------------------------------- ;********************************* ; Timer Routine ; TIME10 :10usec ; CLOCK:57usec ;********************************* CLOCK MOVLW 5H MOVWF CNT1 ;2 TIM_LP1 CALL TIME10 ;2+(25+4)x5+1=148 DECFSZ CNT1,F GOTO TIM_LP1 RETURN ;148+1=149x0.4usec=59.6usec CLOCK1 MOVLW 9H MOVWF CNT1 ;2 TIM_LP4 CALL TIME10 ;2+(25+4)x5+1=148 DECFSZ CNT1,F GOTO TIM_LP4 RETURN ;148+1=149x0.4usec=59.6usec TIME10 MOVLW 5H ;+1 MOVWF CNT2 ;1+1=2 TIM_LP2 DECFSZ CNT2,F ;2+4x5+1=23 GOTO TIM_LP2 NOP ;23+1=24 RETURN ;24+1=25x0.4usec=10usec TIME5M MOVLW 2EH MOVWF CNT3 TIM_LP3 CALL CLOCK1 DECFSZ CNT3,F GOTO TIM_LP3 RETURN TIME50 CALL TIME10 CALL TIME10 CALL TIME10 CALL TIME10 CALL TIME10 RETURN TIME1M MOVLW 8H MOVWF CNT4 TIM_LP42 CALL CLOCK DECFSZ CNT4,F GOTO TIM_LP42 RETURN END