;*********************************************************** ; 2020.03.27 by JM7OLW ; PIC16F88 ADconverter ; RA0 : analog input ; ADC resolution : 10bit ex.101010101010 ; RA3 : rs232c output ; RS232C : 9600bps 10bytes + CR + LF ex.1010101010 + CR + LF ;*********************************************************** LIST P=PIC16F88 INCLUDE "P16F88.INC" __CONFIG _CONFIG1,_INTRC_IO & _WDT_OFF & _LVP_OFF & _MCLR_OFF TIM1 EQU H'20' TIM2 EQU H'21' TIM3 EQU H'22' ADCDAT EQU H'23' COMDAT EQU H'24' CNT1 EQU H'25' CNT2 EQU H'26' ADCDA2 EQU H'27' ORG 0 GOTO START START BSF STATUS,RP0 ;set bank1 MOVLW H'60' ;clock:8M:70,4M:60,2M:50,1M:40 MOVWF OSCCON MOVLW B'00000001' ;RA0 is Analog I/O(ADC in) MOVWF ANSEL MOVLW B'11100111' ;PORTA 0-7 for input, RA3-4 is output MOVWF TRISA MOVLW B'00000000' ;PORTB 0-7 for output MOVWF TRISB MOVLW B'00000000' ;ADFM:0,ADCS2:0,AVdd,AVss, MOVWF ADCON1 BCF STATUS,RP0 ;set bank0 CLRF PORTB ;RB0-7:0V BCF PORTA,3 ;RA3 : RS232C output BCF PORTA,4 ;RA4 : jikken yo MAIN MOVLW B'11000001' ;=>FRC, ; B'..NNN...' NNN -> ADC RAx input pin no MOVWF ADCON0 ;GO/DONE:0,A/D:ON CALL WAIT_20US ;C charging time BSF ADCON0,GO ;GO=1:A/D converter start MAIN_100 BTFSC ADCON0,GO ;wait end of convert GOTO MAIN_100 MOVF ADRESH,W ;W <- ADRESH MOVWF ADCDAT ; MOVWF PORTB ;output to PORTB BSF STATUS,RP0 ;set bank1 MOVF ADRESL,W ;W <- ADRESL BCF STATUS,RP0 ;set bank0 MOVWF ADCDA2 MOVLW D'8' MOVWF CNT2 MAIN_200 MOVLW H'30' BTFSC ADCDAT,7 MOVLW H'31' MOVWF COMDAT CALL RS232C DECFSZ CNT2 GOTO MAIN_300 GOTO MAIN_400 MAIN_300 RLF ADCDAT,F GOTO MAIN_200 MAIN_400 MOVLW H'30' BTFSC ADCDA2,7 MOVLW H'31' MOVWF COMDAT CALL RS232C MOVLW H'30' BTFSC ADCDA2,6 MOVLW H'31' MOVWF COMDAT CALL RS232C MOVLW H'0D' MOVWF COMDAT CALL RS232C MOVLW H'0A' MOVWF COMDAT CALL RS232C CALL WAIT_1 GOTO MAIN ;********************************************************** RS232C CALL RS232C_H ;START BIT MOVLW D'8' MOVWF CNT1 RS232C_10 BTFSS COMDAT,0 GOTO RS232C_100 CALL RS232C_L GOTO RS232C_100A RS232C_100 CALL RS232C_H RS232C_100A DECFSZ CNT1 GOTO RS232C_200 GOTO RS232C_300 RS232C_200 RRF COMDAT,F GOTO RS232C_10 RS232C_300 CALL RS232C_L ;STOP BIT CALL RS232C_L ;STOP BIT CALL RS232C_L ;STOP BIT CALL RS232C_L ;STOP BIT CALL RS232C_L ;STOP BIT RETURN ;********************************************************** RS232C_H BSF PORTA,3 ; HIGH :bit=0 CALL WAIT_232C RETURN ;********************************************************** RS232C_L BCF PORTA,3 ; LOW :bit=1 CALL WAIT_232C RETURN ;********************************************************** WAIT_232C ;9600BPS 1bit=104usec MOVLW D'2' ; clock=4Mhz -> 1cycle=1usec MOVWF TIM1 WAIT_232C_1 MOVLW D'2' MOVWF TIM2 WAIT_232C_2 MOVLW D'4' MOVWF TIM3 WAIT_232C_3 DECFSZ TIM3,F GOTO WAIT_232C_3 DECFSZ TIM2,F GOTO WAIT_232C_2 DECFSZ TIM1,F GOTO WAIT_232C_1 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP RETURN ;********************************************************** WAIT_20US MOVLW D'2' MOVWF TIM1 WAIT_20US_1 MOVLW D'2' MOVWF TIM2 WAIT_20US_2 MOVLW D'10' MOVWF TIM3 WAIT_20US_3 DECFSZ TIM3,F GOTO WAIT_20US_3 DECFSZ TIM2,F GOTO WAIT_20US_2 DECFSZ TIM1,F GOTO WAIT_20US_1 RETURN ;********************************************************** WAIT MOVLW D'2' MOVWF TIM1 WAIT_1 MOVLW D'2' MOVWF TIM2 WAIT_2 MOVLW D'100' MOVWF TIM3 WAIT_3 DECFSZ TIM3,F GOTO WAIT_3 DECFSZ TIM2,F GOTO WAIT_2 DECFSZ TIM1,F GOTO WAIT_1 RETURN END