kuroの覚え書き

96の個人的覚え書き

AD変換テストプログラム完成



LCD表示できたので次のステップとしてAD変換を試してみる。

アセンブリの際初めて気がついたのだがテキストの改行コードはCR+LFでないとエラーになるらしい。

さすがWINDOWS融通が利かない。


LIST P=PIC16F819
INCLUDE "P16F819.INC"
__CONFIG _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _INTRC_IO & _MCLR_OFF

CBLOCK 020H ;先頭の番地を指定
CNT0 ;LCD用、タイマールーチン兼用
CNT1 ;LCD用、タイマールーチン兼用
DSPDT ;LCD
CNT2 ;タイマールーチン用
CNT3
CNT4
HIGH0 ;AD変換用
LOW0
HIGH1
LOW1
HIGH2
LOW2
FIGCNT ;数字表示ルーチン
WIDTH
ENDC ;定義終わり
LCD_PW EQU 0
LCD_RS EQU 1
LCD_RW EQU 2
LCD_E EQU 3

ORG 0
;メイン
;初期設定
CLRF PORTB ;PORTBをクリア
BSF STATUS,RP0 ;ページ変更(Bank 1へ)
MOVLW 0H ;RBをすべて出力に設定
MOVWF PORTB
MOVLW 070H ;01110000
MOVWF OSCCON ;クロックを8MHzにセット

MOVLW 0H ;00000000
MOVWF ADCON1 ;PORTAのRA0-4をすべてADに

BCF STATUS,RP0 ;ページ変更(Bank 0へ戻す)

MOVLW 081H ;10000001 ADCON1でADCS2=0なのでクロックはFosc/32
MOVWF ADCON0 ;チャンネルは000=CH0 (RA0)に設定

CALL LCD_INI
MAINLP
MOVLW 080H
MOVWF DSPDT
CALL LCD_CMD
;キャラクターコード送信(表示)
MOVLW 'T'
MOVWF DSPDT
CALL LCD_DATA
MOVLW 'E'
MOVWF DSPDT
CALL LCD_DATA
MOVLW 'S'
MOVWF DSPDT
CALL LCD_DATA
MOVLW 'T'
MOVWF DSPDT
CALL LCD_DATA

;データ計測
ADC0 MOVLW 081H ;10000001 ADCON1でADCS2=0なのでクロックはFosc/32
MOVWF ADCON0 ;チャンネルは000=CH0 (RA0)に設定
CALL TIME20U ;20usecウェイト
BSF ADCON0,GO ;AD変換スタート
WTLP0 BTFSC ADCON0,GO ;AD変換が終了するとADCONレジスタのGO(2)が0にリセットされる
GOTO WTLP0
MOVF ADRESH,W ;データの上位バイトを取り出し
MOVWF HIGH0
MOVF ADRESL,W ;データの下位バイトを取り出し
MOVWF LOW0

MOVLW 085H ;LCD表示位置指定
MOVWF DSPDT
CALL LCD_CMD
MOVF HIGH0,W
CALL DISP_DIGIT

CALL TIME1S
CALL LCD_CLR

GOTO MAINLP

;************************************
;数字表示サブルーチン
;変数FIGCNT,WIDTH使用
;LCD制御サブルーチン、タイマーサブルーチンが必要
;************************************
DISP_DIGIT ;3桁に分けて各桁をカウント
CLRF FIGCNT ;FIGCNTをリセット
FIGLOOP100
MOVLW 064H ;100をロードして
SUBWF WIDTH,F ;元のデータから100を引く
BTFSC STATUS,C ;マイナスになるまで繰り返す
GOTO CNTPLUS100
GOTO ENDFIG100
CNTPLUS100
INCF FIGCNT,F ;100の位の数を数える
GOTO FIGLOOP100
ENDFIG100
MOVF FIGCNT,W
CALL DISP_NUM ;100の位の表示
MOVLW 064H ;100をロード
ADDWF WIDTH,F ;マイナスになったWIDTHをプラスに戻す
CLRF FIGCNT ;FIGCNTをリセット
FIGLOOP10
MOVLW 0AH ;10をロードして
SUBWF WIDTH,F ;データから10を引く
BTFSC STATUS,C ;マイナスになるまで繰り返す
GOTO CNTPLUS10
GOTO ENDFIG10
CNTPLUS10
INCF FIGCNT,F ;10の位の数を数える
GOTO FIGLOOP10
ENDFIG10
MOVF FIGCNT,W
CALL DISP_NUM ;10の位の表示
MOVLW 0AH ;10をロード
ADDWF WIDTH,W ;マイナスになったWIDTHをプラスに戻し、Wレジスタにロード
CALL DISP_NUM ;1の位の表示
RETURN
DISP_NUM ADDLW '0' ;ASCIIコードに変換
MOVWF DSPDT ;PIC16F819用に追加
CALL LCD_DATA ;数字の表示
RETURN


;LCD制御サブルーチンFOR PIC16F819
;内蔵オシレータ8MHzで使用
;PORTBのみで制御
;RB0で電源を供給
;定数設定
;LCD_PW EQU 0 ;RB0
;LCD_RS EQU 1 ;RB1
;LCD_RW EQU 2 ;RB2
;LCD_E EQU 3 ;RB3
;使用変数
;DSPDT
;CNT0
;CNT1
;DSPDTに格納された文字をLCDに表示
;基本的使い方は以下の通り
; CALL LCD_INI
; MOVLW LCDのポジション
; MOVWF DSPDT
; CALL LCD_CMD
; MOVLW '文字'
; MOVWF DSPDT
; CALL LCD_DATA

;キャラクターコード送信(表示)サブルーチン
LCD_DATA
CALL LCD_BUSY
BSF PORTB,LCD_RS
BSF PORTB,LCD_E
MOVLW 0FH ;00001111
ANDWF PORTB,1 ;RB4〜7クリア
BTFSC DSPDT,7 ;送信
BSF PORTB,7
BTFSC DSPDT,6
BSF PORTB,6
BTFSC DSPDT,5
BSF PORTB,5
BTFSC DSPDT,4
BSF PORTB,4
BCF PORTB,LCD_E
BCF PORTB,LCD_RS

BSF PORTB,LCD_RS
BSF PORTB,LCD_E
MOVLW 0FH ;00001111
ANDWF PORTB,1 ;RB4〜7クリア
BTFSC DSPDT,3 ;送信
BSF PORTB,7
BTFSC DSPDT,2
BSF PORTB,6
BTFSC DSPDT,1
BSF PORTB,5
BTFSC DSPDT,0
BSF PORTB,4
BCF PORTB,LCD_E
BCF PORTB,LCD_RS
RETURN
;LCD_E送信サブルーチン
LCD_CMD
CALL LCD_BUSY

BSF PORTB,LCD_E
MOVLW 0FH ;00001111
ANDWF PORTB,1 ;RB4〜7クリア
BTFSC DSPDT,7 ;送信
BSF PORTB,7
BTFSC DSPDT,6
BSF PORTB,6
BTFSC DSPDT,5
BSF PORTB,5
BTFSC DSPDT,4
BSF PORTB,4
BCF PORTB,LCD_E

BSF PORTB,LCD_E
MOVLW 0FH ;00001111
ANDWF PORTB,1 ;RB4〜7クリア
BTFSC DSPDT,3 ;送信
BSF PORTB,7
BTFSC DSPDT,2
BSF PORTB,6
BTFSC DSPDT,1
BSF PORTB,5
BTFSC DSPDT,0
BSF PORTB,4
BCF PORTB,LCD_E
RETURN

;LCDジーチェック
LCD_BUSY
BSF STATUS,RP0
MOVLW 080H ;RB7を入力に変更
MOVWF PORTB
BCF STATUS,RP0

BSF PORTB,LCD_RW
BSF PORTB,LCD_E
LP_BZ BTFSC PORTB,7
GOTO LP_BZ
BCF PORTB,LCD_E
BCF PORTB,LCD_RW
BSF STATUS,RP0
MOVLW 0H ;RB7を出力に戻す
MOVWF PORTB
BCF STATUS,RP0
RETURN

;LCD初期化
LCD_INI
CLRF CNT0 ;汎用カウンター0をリセット
MOVLW 080H ;10000000
MOVWF CNT1 ;汎用カウンター1にセット
BSF PORTB,LCD_PW ;LCD電源オン
WAIT0 DECFSZ CNT0,F ;LCD受付OKになる頃まで待つ
GOTO WAIT0
DECFSZ CNT1,F
GOTO WAIT0
MOVLW 029H ;00101001 4ビットモード、+E+PW
MOVWF PORTB
BCF PORTB,LCD_E ;これで4ビットモードになる

MOVLW 028H ;00101000 ファンクションセット設定
MOVWF DSPDT
CALL LCD_CMD
MOVLW 0CH ;00001100 表示オン/オフコントロール
MOVWF DSPDT
CALL LCD_CMD
RETURN
;*****表示クリア*****
LCD_CLR MOVLW 01H
MOVWF DSPDT
CALL LCD_CMD
RETURN
;タイマーサブルーチン8MHzオシレータの場合
;10MHzの場合周期は0.125usec、実行サイクルは0.5usec
;
;20usecサブルーチン
TIME20U MOVLW 09H ;1 9回
MOVWF CNT0 ;1 2
TIMLP0 NOP ;1
DECFSZ CNT0,F ;1
GOTO TIMLP0 ;2 2+4*9-1=37
NOP ;1 38
RETURN ;2 40 40*0.5usec=0.02msec
;0.2msecサブルーチン 400サイクル*0.5usec
TIME02M MOVLW 063H ;1 99回まわす
MOVWF CNT1 ;1 2
TIMLP1 NOP ;1
DECFSZ CNT1,F ;1
GOTO TIMLP1 ;2 2+4*99-1=397
NOP ;1 398
RETURN ;2 400 400*0.5usec=0.2msec
;5msec 10000サイクル
TIME5M MOVLW 019H ;1 25回まわす
MOVWF CNT2 ;1
TIMLP2 CALL TIME02M ;2+400=402
DECFSZ CNT2,F ;1
GOTO TIMLP2 ;2 2+405*25-1=10125
RETURN ;2 10127*0.5= 5.05msec
;50msec 100000
TIME50M MOVLW 0F7H ;247回
MOVWF CNT3 ;ここまでで2サイクル
TIMLP3 CALL TIME02M ;2+400
DECFSZ CNT3,F ;1
GOTO TIMLP3 ;2 2+405*247-1=100036
RETURN ;2 100037*0.5= 50msec
;1sec
TIME1S MOVLW 014H ;20回
MOVWF CNT4 ;50msec * 20
TIMLP4 CALL TIME50M
DECFSZ CNT4,F ;このループは50msec
GOTO TIMLP4
RETURN

END

EEPROMについて

http://cai.cs.shinshu-u.ac.jp/susi/Lecture/microcomp/d_07-08.html