;--------------------------------------------------------------------- ; 周波数カウンタ用8桁LED表示プログラム ; 2010.11 naka ; ; ・電子工作の実験室(後閑氏)の下記ページの表示部のソースを一部流用 ; http://www.picfun.com/equipj45.html ; 汎用8桁周波数カウンタ ; ; 【流用部】 ; ・バイナリ→BCD変換部 ; ・データ受信部 ; ; 【変更点】 ; ・デバイス変更(PIC16F873→PIC16F685) ; ・クロックをクリスタル(10MHz)から内蔵発振(8MHz)に変更 ; ・データ転送速度変更(100us/bit→20us/bit);表示部のちらつき防止の為 ; スタートビットの検出に割り込みを使用 ; ・カウント部の低周波/高周波、ゲートタイム1秒/0.1秒の設定を受信し、 ; それに応じた精度での表示(1桁目、2桁目を 0 の代わりに o 表示) ; ・7セグ表示パターンはデータ受信後に1回のみ作成(ダイナミック表示の都度ではなく) ; ・3桁毎のカンマの代わりに7セグのドット表示 ; ; ; OSC :内蔵発振 8MHz ; PORT: ; (1). RA0,1,4,5,RB4〜7〔出力〕: LEDの桁に対応(アノード側のTr駆動) ; __ __ __ __ __ __ __ __ ; |__| |__| |__| |__| |__| |__| |__| |__| ; |__| |__| |__| |__| |__| |__| |__| |__| ; RB7 RB6 RB5 RB4 RA5 RA4 RA1 RA0 ; ; (2). RC0〜7〔出力〕LEDの各セグメント(カソード) ; RC0:a, RC1:b, RC2:c, RC3:d, RC4:e, RC5:f, RC6,g, RC7.dot ; _a ; f|_g|b ; e|__|c . dot ; d ; ; (3). RA2〔入力〕:シリアル入力 ; ______ ___ ___ ; SDAT |_S_| X | X | ... | X | S | ... ; ; |← |←-------------→|←-| ; |20u| 26bit |20u| ; ; 4byte(26bit)の送信時間 (26 + 2) * 20us = 560us ; ; (4). ICSP: RA0/ICSPDAT ; RA1/ICSPCLK ; RA3/MCLR/VPP ;--------------------------------------------------------------------- ; デバイス定義 ;--------------------------------------------------------------------- LIST P=PIC16F685 INCLUDE "P16F685.INC" __CONFIG _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制 ;--------------------------------------------------------------------- ; 変数レジスタの定義 ;--------------------------------------------------------------------- LEDBUF EQU 20H ; 20H〜27H(数字パターン変換済) COLCNT EQU 28H ; LEDの桁カウンタ FLAG EQU 29H ; DIGIT12 EQU 30H ;Dispaly Data 1,2桁目 DIGIT34 EQU 31H ;Display Data 3,4桁目 DIGIT56 EQU 32H ;Dispaly Data 5,6桁目 DIGIT78 EQU 33H ;Dispaly Data 7,8桁目 CNT1 EQU 34H ;Timer Counter for CLOCK CNT2 EQU 35H ;Timer Counter for 10usec DAT_CNT EQU 36H ; SHIFT EQU 37H ; BLANK EQU 38H ;BLANK flag BYTE0 EQU 39H ;受信データ3バイト目 BYTE1 EQU 3AH ;受信データ2バイト目 BYTE2 EQU 3BH ;受信データ1バイト目 BYTE3 EQU 3CH ;受信データ0バイト目(2ビットのみ) WORK1 EQU 3DH WORK2 EQU 3EH ; BKUPW EQU 50H ; Wレジ待避用 BKUPS EQU 51H ; STATUSレジ待避用 BKUPFR EQU 52H ; FSRレジ待避用 BKUPPCL EQU 53H ; PCLHレジ待避用 ; ;--------------------------------------------------------------------- ; マクロ定義 ;--------------------------------------------------------------------- BANK0 MACRO BCF STATUS,RP0 ;BANK0に切り替える BCF STATUS,RP1 ; ENDM BANK1 MACRO BSF STATUS,RP0 ;BANK1に切り替える BCF STATUS,RP1 ; ENDM BANK2 MACRO BCF STATUS,RP0 ;BANK2に切り替える BSF STATUS,RP1 ; ENDM ;--------------------------------------------------------------------- ; リセットベクタ ;--------------------------------------------------------------------- ORG 00H ; リセット時の飛び込み先 RESET GOTO MAIN ; メイン処理へ ; ORG 04H ; 割り込み時の飛び込み先 GOTO INTRUPT ;--------------------------------------------------------------------- ; メイン処理 ;--------------------------------------------------------------------- MAIN CALL INIT CALL BCD ; 24bit to 8digit BCD CALL BCD2PTN ; 数字パターン変換とゼロサプレス ; MAINLP CALL DSPLED BTFSC FLAG,0 GOTO MAINBCD CALL WAIT1MS ; 1ms GOTO MAINLP MAINBCD ; 約1ms CALL BCD ; 24bit to 8digit BCD CALL BCD2PTN ; 数字パターン変換とゼロサプレス BCF FLAG,0 GOTO MAINLP ; ;--------------------------------------------------------------------- ; BCDを表示パターンに変換 ;--------------------------------------------------------------------- BCD2PTN BSF BLANK,0 SWAPF DIGIT78,W ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF+7 MOVF DIGIT78,W ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF+6 MOVF LEDBUF+6,F ;0でなければdot表示 BTFSS STATUS,Z BSF LEDBUF+6,7 ; SWAPF DIGIT56,W ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF+5 MOVF DIGIT56,W ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF+4 ; SWAPF DIGIT34,W ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF+3 MOVF LEDBUF+3,F ;0でなければdot表示 BTFSS STATUS,Z BSF LEDBUF+3,7 MOVF DIGIT34,W ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF+2 ; SWAPF DIGIT12,W ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF+1 MOVF DIGIT12,W BCF BLANK,0 ; 1桁目はゼロサプレスしない ANDLW H'0F' CALL GET_7SEG MOVWF LEDBUF ; ;----------------------------------------------------------------------- ; 周波数カウント部のプリスケーラ利用時 or ゲート時間0.1秒のとき ; 1桁目、2桁目を 0 ではなく o 表示にする(精度外なので) ;----------------------------------------------------------------------- MOVF BYTE3,W ; 受信BYTE3の下位2ビットがモードビット ANDLW H'03' BTFSC STATUS,Z RETURN SUBLW D'3' BTFSS STATUS,Z GOTO DSP__o DSP_oo ; 1,2桁目をoに置換 MOVLW H'0A' ; H'0A'=10 が o のパターン CALL GET_7SEG MOVWF LEDBUF+1 DSP__o ; 1桁目のみ、oに置換 MOVLW H'0A' ; H'0A'=10 が o のパターン CALL GET_7SEG MOVWF LEDBUF RETURN ;--------------------------------------------------------------------- ; 表示パターン ;--------------------------------------------------------------------- GET_7SEG BTFSS BLANK,0 ;BLANKフラグのチェック GOTO NOTBLNK ;数字表示へ ANDLW 0FH ;0でないか? BTFSC STATUS,Z ;0 check RETLW 0 ;まだ0ならブランクを強制セット BCF BLANK,0 ;0でなければBLANKフラグリセット NOTBLNK ANDLW 0FH ;下位のみ取り出し ADDWF PCL,F ;Add to PC reg ; '.gfedcba' RETLW B'00111111' ; 0 RETLW B'00000110' ; 1 RETLW B'01011011' ; 2 RETLW B'01001111' ; 3 RETLW B'01100110' ; 4 RETLW B'01101101' ; 5 RETLW B'01111101' ; 6 RETLW B'00000111' ; 7 RETLW B'01111111' ; 8 RETLW B'01101111' ; 9 RETLW B'01011100' ; o RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; RETLW B'00000000' ; ; ;--------------------------------------------------------------------- ; 初期化 ;--------------------------------------------------------------------- INIT BCF INTCON,GIE ;全割込み禁止 BANK2 CLRF ANSEL CLRF ANSELH BANK1 MOVLW H'71' MOVWF OSCCON ; 内蔵クロック8MHz MOVLW H'04' ; RA2の割り込みイネーブル MOVWF IOCA MOVLW B'00001100' MOVWF TRISA ; Port AはRA2,3が入力、他は出力 CLRF TRISB ; PORT Bはすべて出力 CLRF TRISC ; PORT Cはすべて出力 BANK0 ; MOVLW H'FF' MOVWF PORTA MOVWF PORTB MOVWF PORTC ; CALL CLRBUF ; LEDバッファクリア CLRF COLCNT CLRF BYTE0 CLRF BYTE1 CLRF BYTE2 CLRF BYTE3 CLRF FLAG ; BSF INTCON,RABIE ; PORTA/B割り込みイネーブル BSF INTCON,GIE ; 割り込み許可 ; RETURN ;--------------------------------------------------------------------- ; 割り込み処理(LED表示) ;--------------------------------------------------------------------- INTRUPT ;レジスタ待避 MOVWF BKUPW ;バックアップ(Wレジ) SWAPF STATUS,W ;バックアップ(STATUSレジ) MOVWF BKUPS MOVF FSR,W ;バックアップ(FSRレジ) MOVWF BKUPFR MOVF PCLATH,W ;バックアップ(PCLATHレジ) MOVWF BKUPPCL ; BCF INTCON,RABIF ;PORTA/B割り込みフラグリセット ; BTFSC PORTA,2 GOTO RSTREG ; CALL RXD ; シリアルデータ受信 ; BSF FLAG,0 ; RSTREG ;レジスタ復元 MOVF BKUPPCL,W ;復元(PCLATHレジ) MOVWF PCLATH MOVF BKUPFR,W ;復元(FSRレジ) MOVWF FSR SWAPF BKUPS,W ;復元(STATUSレジ) MOVWF STATUS SWAPF BKUPW,F ;復元(Wレジ) SWAPF BKUPW,W ; RETFIE ;割り込みから復帰 ;--------------------------------------------------------------------- ; LED表示(1桁毎) ;--------------------------------------------------------------------- DSPLED ; 一旦全ての桁を消灯 MOVLW H'FF' MOVWF PORTA MOVWF PORTB MOVWF PORTC ; 表示桁のアノードをアクティブ(LOW) MOVF COLCNT,W ; CALL GETCOLA ; 現在の表示桁をPORTAビット位置に変換 MOVWF PORTA MOVF COLCNT,W ; CALL GETCOLB ; 現在の表示桁をPORTBビット位置に変換 MOVWF PORTB ; ; 現在の表示桁の値(パターン)を取り出す MOVLW LEDBUF ; LEDの表示バッファ先頭アドレス ADDWF COLCNT,W ; 桁カウンタ加算 MOVWF FSR COMF INDF,W ; 表示する数字パターン MOVWF PORTC ; 表示 ; INCF COLCNT,F BTFSC COLCNT,3 ; COLCNT=8 なら 0に戻す CLRF COLCNT RETURN ; ;----------------------------------------------------------------------- ; 桁位置とPORT対応 ;----------------------------------------------------------------------- GETCOLA ; PORTA用のパターン ANDLW H'07' ADDWF PCL,F RETLW B'11111110' ; A0 RETLW B'11111101' ; A1 RETLW B'11101111' ; A4 RETLW B'11011111' ; A5 RETLW B'11111111' ; - RETLW B'11111111' ; - RETLW B'11111111' ; - RETLW B'11111111' ; - GETCOLB ; PORTB用のパターン ANDLW H'07' ADDWF PCL,F RETLW B'11111111' ; - RETLW B'11111111' ; - RETLW B'11111111' ; - RETLW B'11111111' ; - RETLW B'11101111' ; B4 RETLW B'11011111' ; B5 RETLW B'10111111' ; B6 RETLW B'01111111' ; B7 ; ;-------------------------------------------------------------- ; バッファクリア ;-------------------------------------------------------------- CLRBUF CLRF LEDBUF CLRF LEDBUF+1 CLRF LEDBUF+2 CLRF LEDBUF+3 CLRF LEDBUF+4 CLRF LEDBUF+5 CLRF LEDBUF+6 CLRF LEDBUF+7 RETURN ; ;--------------------------------------------------------------------- ; wait 1msec ;--------------------------------------------------------------------- WAIT1MS ; 1msec MOVLW D'221' MOVWF CNT1 W1MSLP GOTO $+1 GOTO $+1 BTFSC FLAG,0 ; WAIT中にデータ受信割り込み発生なら即リターン RETURN DECFSZ CNT1,F GOTO W1MSLP GOTO $+1 GOTO $+1 GOTO $+1 RETURN ;-------------------------------------------------------------- ;************************************* ; 3バイトバイナリの8桁BCDへの変換 ; マイクロチップ社のアプリケーションノートより ;************************************* BCD BCF STATUS,C ;キャリーリセット MOVLW 018H ;シフトカウンタ初期化 MOVWF SHIFT ;3バイト分32回の指定 CLRF DIGIT12 ;BCDデータエリア初期化 CLRF DIGIT34 CLRF DIGIT56 CLRF DIGIT78 ;**** 変換ループ処理 ********** LOOP RLF BYTE0,F ;shift BYTE to DIGIT RLF BYTE1,F RLF BYTE2,F RLF DIGIT12,F RLF DIGIT34,F RLF DIGIT56,F RLF DIGIT78,F DECFSZ SHIFT,F ;終了か? GOTO ADJST ;BCD調整処理へ RETURN ;***** BCD調整処理 ***** ADJST MOVF DIGIT12,W ;DIGIT12 adjust TO BCD CALL ADJBCD MOVWF DIGIT12 MOVF DIGIT34,W ;DIGIT34 adjust to BCD CALL ADJBCD MOVWF DIGIT34 MOVF DIGIT56,W ;DIGIT56 adjust to BCD CALL ADJBCD MOVWF DIGIT56 MOVF DIGIT78,W ;DIGIT78 adjust to BCD CALL ADJBCD MOVWF DIGIT78 GOTO LOOP ;**** 1桁BCD調整処理 **** ADJBCD MOVWF WORK1 ;save MOVLW 3 ;W+3 ADDWF WORK1,W MOVWF WORK2 BTFSC WORK2,3 ;Test W+3>7 MOVWF WORK1 ;>7 then W+3 else W MOVLW 030H ;W+30 ADDWF WORK1,W MOVWF WORK2 BTFSC WORK2,7 ;Test W+30>7* MOVWF WORK1 ;>70 then W+30 else W MOVF WORK1,W RETURN ;****************************************************************** ; シリアルデータ受信サブルーチン ; 3バイト+2ビットのバイナリデータを受信する ; データは高位バイトの高位ビットから受信する ;****************************************************************** RXD CALL TIME5 ;5.5us MOVLW 1AH ;24+2Bits Counter MOVWF DAT_CNT DAT_LP1 CALL TIME15 ;14.5us BCF STATUS,C RLF BYTE0,F ;全ビット左シフト RLF BYTE1,F ;キャリー経由全ビット左シフト RLF BYTE2,F ; 〃 RLF BYTE3,F ; 〃 BSF BYTE0,0 ;最下位に1をセット BTFSS PORTA,2 ;入力データが1か? BCF BYTE0,0 ;最下位を0に再セット DECFSZ DAT_CNT,F ;24ビット受信完了か GOTO DAT_LP1 ;(249+11)*0.4usec=104usec ; CALL TIME10 ;Stop bit skip(20us) CALL TIME10 CALL TIME10 ;Skew CALL TIME10 RETURN ;************************************** ; Timer Routine ; TIME10 :10usec ;************************************** TIME5 MOVLW 2H ; MOVWF CNT2 ; TIM5_LP2 DECFSZ CNT2,F ; GOTO TIM5_LP2 RETURN ; TIME15 MOVLW 8H ; MOVWF CNT2 ; TIM15_LP2 DECFSZ CNT2,F ; GOTO TIM15_LP2 RETURN ; TIME10 MOVLW 5H ; MOVWF CNT2 ; TIM_LP2 DECFSZ CNT2,F ; GOTO TIM_LP2 RETURN ; ;-------------------------------------------------------------- END