備忘録」カテゴリーアーカイブ

【備忘録】pic16f88 ad変換プログラム

研究の過程で、アナログ回路の電圧をパソコンに取り込んで処理する必要が出てきた。大学で学んだことなどを総括すると、picというマイコンと、usb-ioというモジュールを組み合わせて実現できそうだ。picでAD変換を行い、信号をusb-ioでパソコンに取り込む。

さっそく両者を手に入れたが、公務優先ゆえに、手を付けられずにいた。

勤務校も冬休み。ようやく手を付けられるようになった。まずは、pic16f88のプログラミングに挑戦した。初めてのアセンブリ言語。なにから手を付けていいかわからないので、ネットにアップされていた7セグデジタル電圧計のプログラムを解析するところから始めた。1日がかりの作業で何とかプログラムを完成させたのだが、usb-ioと組み合わせて動作を確認してみたところうまくいかない。というか、usb-ioが思うように動かない。

usb-ioの挙動も調べつつ、picのプログラムと電子回路の改良によって、何とか思い通りの動きをするようになった。備忘録としてpicのプログラムを残しておく。

<vmeter.asm>

;—-ヘッダー——————————
LIST P=PIC16F88
INCLUDE __CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_OFF & _WDT_OFF & _INTRC_IO & _PWRTE_ON
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

;—-変数定義—————————-
COUNT EQU H’20’ ;ループカウンタ
TC EQU H’2D’ ;START内のループカウンタ

ORG 0
GOTO START

ORG 4
GOTO START

;—-STARTサブルーチン—-
START
CALL INIT

START1

CALL ADSTART ;AD変換

GOTO START1

;—-INITサブルーチン—-
; 入出力ピン初期化
;——————–
INIT
BCF INTCON, GIE ;INTCONの7ビット目を0に →割り込み禁止

BSF STATUS, RP0 ;STATUSのRP0ビット(6ビット目)を1に →Bank1へ切り替えた

MOVLW B’01010000′ ;2MHz 101
MOVWF OSCCON ;をOSCCONへ→クロック設定

MOVLW B’00000001′ ;(-,RB7, RB6, RA4, RA3, RA2,RA1,RA0)=(-,デ,デ,デ,デ,デ,デ,ア)
MOVWF ANSEL ;をANSELへ

MOVLW B’00000000′ ;RBx=0 出力モード
MOVWF TRISB ;をTRISBへ→ポートBを出力モードに

MOVLW B’00000001′ ;RA0=1 RA0入力 、RAx(x>0)=0 RAx 出力モード
MOVWF TRISA ;をTRISAへ→ポートAの0番を入力モードに

MOVLW B’00001110′ ;AD変換結果を右づめで格納
MOVWF ADCON1 ;をADCON1へ

BSF OPTION_REG, NOT_RBPU ;OPTION_REGの7ビット目を1に→RBプルアップ有効

BCF STATUS, RP0 ;STATUSのRP0ビット(6ビット目)を0に →Bank0へ切り替えた

MOVLW B’00000001′ ;変換クロック÷2(00)、変換チャンネルRA0(000)、まだ変換しない(0)、-、変換使用開始(1)
MOVWF ADCON0 ;をADCON0へ

RETURN

;—-ADSTARTサブルーチン—-
; AD変換データ取得サブルーチン
;————————-
ADSTART
CALL TIME
BSF ADCON0, GO
WAIT
BTFSC ADCON0, GO ;GO→AD変換中は1、終了していれば0でGOTOをスキップ
GOTO WAIT ;プログラムカウンタを減らしてループ

MOVF ADRESH, W ;上位データをWへ
MOVWF PORTB

BSF ADCON0, GO

RETURN

;—-遅延サブルーチン—-
TIME
MOVLW H’25’
MOVWF COUNT
NOP
LOOP
DECFSZ COUNT, F
GOTO LOOP

RETURN

END