;************************************************************************* ; Copyright 2004 Hata Akihiro ; ;  第5章 PICアイデア集 ; 5−10 アナログ・コンパレータを利用した4CH、4ビットA−D ;------------------------------------------------------------------------- ;プログラムの説明 ;<概要> ; アナログ・コンパレータ利用4CH・4ビットA−Dのテストプログラム。 ; ;<動作> ; 1秒周期でRA0・RA1入力をA−D変換する。 ; 各4ビット変換値をポートBの下位と上位に出力する。 ; ;------------------------------------------------------------------------- ; ; 2004/08/23 V1.00 初回リリース ; ; ; ; ;------------------------------------------------------------------------- ; CONFIGRATION FUSE ; WDT:Disable OSC:Int RC Code Protect:OFF Power up timer:ON ; OSCILLATOR ; 4MHz ;************************************************************************* ; LIST P=PIC16F628A, R=DEC ;Target Processor INCLUDE P16F628A.INC ; __CONFIG _BODEN_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT & _CP_OFF & _PWRTE_ON & _DATA_CP_OFF & _LVP_OFF & _MCLRE_OFF __idlocs H'0100' ;V1.00 2004/08/23 ; ;------------------------------------------------------------------------- ; DEFINE I/O Port ;------------------------------------------------------------------------- ; PortA ; RA0 C1 in input Compalator1 input ; RA1 C2 in input Compalator2 input ; RA2 input ; RA3 input ; RA4 input ; RA5 input ; ; PortB ; RB0 LED LSB output Compalator1 ; RB1 LED output ; RB2 LED output ; RB3 LED MSB output ; RB4 LED LSB output Compalator2 ; RB5 LED output ; RB6 LED output ; RB7 LED MSB output ; ;------------------------------------------------------------------------- ; Variables ;------------------------------------------------------------------------- ; ; ; ;------------------------------------------------------------------------- ; Registers ;------------------------------------------------------------------------- ; CNT0 EQU H'20' ; Counter for Wait Time CNT1 EQU H'21' ; Counter for Wait Time CNT2 EQU H'22' ; Counter for Wait Time AD1 EQU H'23' ; AD1 Result AD2 EQU H'24' ; AD2 Result ;------------------------------------------------------------------------- ; Program code ;------------------------------------------------------------------------- ; ORG H'00' ; Power ON GOTO INITIALIZE ; ; ;------------------------------------------------------------------------- ; Initialize ;------------------------------------------------------------------------- INITIALIZE BSF STATUS,RP0 MOVLW B'11111111' ; Set I/O Port INPUT/OUTPUT MOVWF TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'10100000' MOVWF VRCON ; Set VRCON BCF STATUS,RP0 MOVLW B'00000010' MOVWF CMCON ; Set CMCON ;---------------------- ; OUTPUT Initialize ;---------------------- MOVLW B'00000000' MOVWF PORTB ; ;******************************************************* ; MAIN PROGRAM ;******************************************************* MAIN CALL AD_CONV ; Call A-D Conversion Routine SWAPF AD2,W IORWF AD1,W MOVWF PORTB ; Reload A-D Result CALL WAIT1S ; 1sec Wait GOTO MAIN ; ;******************************************************* ; SUBROUTINES ;******************************************************* AD_CONV MOVLW H'A0' BSF STATUS,RP0 ; BANK1 MOVWF VRCON ; Clear Vr BCF STATUS,RP0 ; BANK0 BTFSC CMCON,C1OUT ; Check C1OUT GOTO $+8 BSF STATUS,RP0 ; BANK1 INCF VRCON,F ; Incriment VRCON MOVF VRCON,W BCF STATUS,RP0 ; BANK0 SUBLW H'AF' BTFSS STATUS,Z GOTO $-8 BSF STATUS,RP0 ; BANK1 MOVF VRCON,W BCF STATUS,RP0 ; BANK0 ANDLW H'0F' MOVWF AD1 ; Load Vr to AD1 ; MOVLW H'A0' BSF STATUS,RP0 ; BANK1 MOVWF VRCON ; Clear Vr BCF STATUS,RP0 ; BANK0 BTFSC CMCON,C2OUT ; Check C2OUT GOTO $+8 BSF STATUS,RP0 ; BANK1 INCF VRCON,F ; Incriment VRCON MOVF VRCON,W BCF STATUS,RP0 ; BANK0 SUBLW H'AF' BTFSS STATUS,Z GOTO $-8 BSF STATUS,RP0 ; BANK1 MOVF VRCON,W BCF STATUS,RP0 ; BANK0 ANDLW H'0F' MOVWF AD2 ; Load Vr to AD2 RETURN ; WAIT1M ; 1msec Wait MOVLW 100 MOVWF CNT0 NOP GOTO $+1 GOTO $+1 GOTO $+1 DECFSZ CNT0,F GOTO $-5 RETURN WAIT100M ; 100msec Wait MOVLW 100 MOVWF CNT1 CALL WAIT1M DECFSZ CNT1,F GOTO $-2 RETURN WAIT1S ; 1sec Wait MOVLW 10 MOVWF CNT2 CALL WAIT100M DECFSZ CNT2,F GOTO $-2 RETURN ; END