LIST P=PIC16F88; INCLUDE "P16f88.inc" ; あ ; CONFIG1 ; __config 0xFFFF __CONFIG _CONFIG1, _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB0 & _CP_OFF ; CONFIG2 ; __config 0xFFFF __CONFIG _CONFIG2, _FCMEN_ON & _IESO_ON ; errorlevel -302 ; suppress message 302 from list file ;__CONFIG _CCP1_RB0 & _LVP_OFF & _BOREN_ON & _MCLR_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_IO ; INTRC oscillator, RA6 and RA7 are IO pin ; ; ; 7 6 5 4 3 2 1 0 ; PORTA L5 L4 NC L3 L2 L1 AD1 AD0 ; PORTB R5 R4 NC R3 R2 R1 NC TMG ; ; ; ;***** VARIABLE DEFINITIONS (examples) ; ; example of using Shared Uninitialized Data Section W_TEMP EQU 0x70 ; variable used for context saving ST_TMP EQU 0x71 ; variable used for context saving WAIT_CN EQU 0x20 ADO0H EQU 0x21 ADO0L EQU 0x22 ADO1H EQU 0x23 ADO1L EQU 0x24 ADO2H EQU 0x25 ADO2L EQU 0x26 ADCH EQU 0x27 SIGH EQU 0x28 SIGL EQU 0x29 ; ; ; ORG 0 CLRF PCLATH GOTO INIT ; ORG 4 MOVWF W_TEMP MOVF STATUS, W MOVWF ST_TMP ; CALL INT HANDLER HERE MOVF ST_TMP, W MOVWF STATUS SWAPF W_TEMP, F SWAPF W_TEMP, W RETFIE ; ; INIT CLRF STATUS CLRF TMR0 CLRF INTCON ; 割り込み制御レジスタ CLRF PIR1 ; 割り込みフラグ MOVLW B'10000001' MOVWF ADCON0 ; TAD=4us→ADCS="010" ; BSF STATUS, RP0 ; BANK1 MOVLW B'00000011' MOVWF ANSEL ; ANS1-0 = 1(Analog I/O) MOVLW B'10000000' MOVWF ADCON1 ; 右詰め、PCFG="0100" MOVLW B'00100011' ; L5 L4 NC L3 L2 L1 AD1 AD0 MOVWF TRISA MOVLW B'00100010' ; R5 R4 NC R3 R2 R1 NC TMG MOVWF TRISB MOVLW B'01000111' MOVWF OPTION_REG ; TMR0 Prescaler 1:256, weak pull-up ON MOVLW B'01110100' MOVWF OSCCON ; 8MHz BCF STATUS, RP0 ; BANK0 ; ; LOOP BCF PORTB, 0 ; 実行中フラグOFF MOVF TMR0, W BTFSS STATUS, Z ; GOTO LOOP ; wait until TMR0==0(8M÷4÷256÷256=30.5Hz) ; BSF PORTB, 0 ; CALL MAI1 ; MOVLW .85 MOVWF WAIT_CN CALL WAIT_US ; wait 128us ; GOTO LOOP ; 実行中フラグON ; ; MAI1 CLRF ADCH CALL ADSUB ; RA0 ADC INCF ADCH, F CALL ADSUB ; RA1 ADC ; MOVF ADO0L, W MOVWF SIGL MOVF ADO0H, W MOVWF SIGH CALL DBVCAL ; {SIGH, SIGL} => W MOVWF PORTA ; MOVF ADO1L, W MOVWF SIGL MOVF ADO1H, W MOVWF SIGH CALL DBVCAL ; {SIGH, SIGL} => W IORLW 0x01 ; 実行中フラグON MOVWF PORTB ; RETURN ; ; ; AD変換サブルーチン ; ADSUB MOVF ADCH, F BTFSS STATUS, Z GOTO ADSUB1 MOVLW ADO0H MOVWF FSR MOVLW B'10000001' ; CHS="000" GOTO ADSUB3 ADSUB1 MOVLW .1 SUBWF ADCH, W BTFSS STATUS, Z GOTO ADSUB2 MOVLW ADO1H MOVWF FSR MOVLW B'10001001' ; CHS="001" GOTO ADSUB3 ADSUB2 MOVLW ADO2H MOVWF FSR MOVLW B'10011001' ; CHS="011" ADSUB3 MOVWF ADCON0 MOVLW .20 MOVWF WAIT_CN CALL WAIT_US ; wait TACQ(20us) BSF ADCON0, 2 ; 1 => GO ADSUB4 BTFSC ADCON0, 2 GOTO ADSUB4 ; wait GO 1 => 0 MOVF ADRESH, W MOVWF INDF INCF FSR, F BSF STATUS, RP0 ; BANK1 MOVF ADRESL, W BCF STATUS, RP0 ; BANK0 MOVWF INDF RETURN ; ; ; 100mV 140mV 200mVpp ; +6dB 129 182 257 ; 0dB 65 91 129 ; -6dB 32 46 65 ; -12dB 16 23 32 ; -18dB 8 11 16 ; ; ; {SIGH,SIGL}(0-1023) => 5段階PORT I/OパターンをWに入れてリターン ; DBVCAL MOVF SIGH, F BTFSS STATUS, Z GOTO L129 ; SIG >= 256 MOVLW .129 SUBWF SIGL, W BTFSC STATUS, C GOTO L129 ; SIG >= 129 MOVLW .65 SUBWF SIGL, W BTFSC STATUS, C GOTO L065 ; SIG >= 65 MOVLW .16 SUBWF SIGL, W BTFSC STATUS, C GOTO L016 ; SIG >= 16 MOVLW .8 SUBWF SIGL, W BTFSC STATUS, C GOTO L008 ; SIG >= 8 MOVLW B'11011100' ; 7 >= SIG >= 0 RETURN ; L008 MOVLW B'11011000' ; 15 >= SIG >= 8 RETURN ; L016 MOVLW .32 SUBWF SIGL, W BTFSC STATUS, C GOTO L032 MOVLW B'11010000' ; 31 >= SIG >= 16 RETURN ; L032 MOVLW B'11000000' ; 64 >= SIG >= 32 RETURN ; L065 MOVLW B'10000000' ; 128 >= SIG >= 65 RETURN ; L129 MOVLW B'00000000' ; SIG >= 129 RETURN ; ; ; WAIT_US DECFSZ WAIT_CN, F ; 8MHz => 2inst=1us GOTO WAIT_US ; GOTOが2instなので1ループ=1.5us RETURN ; ; END