;16F877のAD変換 ;AN0 = A ;AN1 = D ;AN2 = D ;AN3 = D ;AN4 = D ;********************************************* ;AD変換の説明 ;********************************************* ;1.ADモジュールの構成を設定 (初期化処理) ; どのピンでAD変換するか決める。→ADCON1 ; AD変換のスイッチをオンにする。→ADCON0 ;2.AD変換の準備のため待つ。 ; 入力取得時間経過を待つ 20μ秒 ;3.変換をはじめる。 ; ADCON0のGOを1にするとAD変換が始まる。 ;4.変換が終わったか調べる。 ; AD変換が終わるとADCON0のGOが0になるので比較演算等の処理をするのはそれからにする。 ;5.変換結果を読み込む。 ; 変換結果がADRESHとADRESLに入っているので、どこか他の場所に移す。 ;********************************************* LIST P=PIC16F876 INCLUDE "P16f876.inc" __CONFIG _HS_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF ;********************************************* CBLOCK 024h TIMCNT ;タイマ用カウンタ TIM2CNT TIM5CNT TIM1CNT ADHK_H ;AD変換の値(上の8ビット) ADHK_L ;AD変換の値(下の8ビット) PORTB_OUT ENDC ;********************************************************* ORG 0 ;********************************************************* ;<ここで1番> SET_IO ;初期処理 ; BSF STATUS,RP0 ;これからピンの設定をする。 ; BCF INTCON,GIE ;(割り込み禁止) ; MOVLW 0EH ; MOVWF ADCON1 ;RA0のみアナログ、(ADFM=0(結果左詰)) ; MOVLW 07H ; MOVWF OPTION_REG ;(内部クロック、プリスケーラ1:256) ; MOVLW 01H ; MOVWF TRISA ;ポートAのRA0は入力、他は出力 ; CLRF TRISB ;ポートBを出力モードに設定 ; CLRF TRISC ;ポートCを出力モードに設定 ; BCF STATUS,RP0 ;これでピンの設定は終わり。 ; MOVLW 080H ;A/Dコンバータをオフにする。 ; MOVWF ADCON0 ;ADCON0に080hを書き込むとオフになる。 BCF STATUS,RP0 ; BCF STATUS,RP1 ; この2行でバンク0にする。 CLRF PORTB ; ポートBをOFFする CLRF PORTC ; ポートCをOFFする MOVLW B'00000001';A/Dコンバータの設定。 MOVWF ADCON0 ; BSF STATUS,RP0 ; バンク1に切り替える CLRF TRISB ;ポートBを出力モードに設定 CLRF TRISC ;ポートCを出力モードに設定 MOVLW B'00001110'; 左詰め  MOVWF ADCON1 ; RA0のみアナログ Fosc/2 BCF STATUS,RP0 ; バンク0に戻す ;************************************************************ ADSTART ;A/D変換をはじめる。 ; MOVLW 081H ;(Fosc/32,ch0,A/D on) ; MOVWF ADCON0 ;ADCON0に081hを書き込むとオンになる。 BSF ADCON0,GO ;AD変換スタート WAITE BTFSC ADCON0,GO ;AD変換が終わるとADCON0のGOが0になるので調べている。 GOTO WAITE ;終わっていないなら前に戻る。 ;<ここで2番> ; CALL TIM20 ;20μsec待ち = AD変換には時間が必要。 ;<ここで3番> ; BSF ADCON0,GO ;AD変換スタート ;WAITE ;AD変換結果待ち ;<ここで4番> ; BTFSC ADCON0,GO ;AD変換が終わるとADCON0のGOが0になるので調べている。 ; GOTO WAITE ;終わっていないなら前に戻る。 ;<ここで5番> ;AD変換された値を読み込む。 ; MOVF ADRESH,W ;(AD上位ビット(左詰め)) ; MOVWF ADHK_H ; BSF STATUS,RP0 ;(バンク1へ切替) ; MOVF ADRESL,W ; BCF STATUS,RP0 ;(バンク0に戻す) ; MOVWF ADHK_L ;************************************************************ ;AD変換の結果はADHK_HとADHK_Lに入ってる。 ;ここからメインの処理を書く。 ; MOVF ADHK_L,W ; MOVWF PORTB MOVFW ADRESH ; AD変換の上位8ビットをWに代入 MOVWF PORTB ; ポートBに出力 GOTO ADSTART ;************************************************************ TIM20 ;約20μSECタイマ MOVLW 012H MOVWF TIMCNT TIMLP DECFSZ TIMCNT,F GOTO TIMLP RETURN TIM02 ;約0.2mSECタイマ MOVLW 0FFH MOVWF TIM2CNT TIM2LP NOP DECFSZ TIM2CNT,F GOTO TIM2LP RETURN ;********************************************************* END