list p=16F84,t=ON,c=132,n=80,st=off __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC include "P16F84.INC" cblock 0x0C count t1,t2 error_code total_lo,total_hi count_lo,count_hi endc ; /-----<A2D_OUT_BIT ; R ; R Rf ; R ; Rin | ;Vin ----RRRRR---.------>A2D_IN_BIT ; | ; - ; - ; | ; Gnd ; Resistor "Rin" [10K] from unknown voltage to comparator input. ; Resistor "Rf" [10k] from Feedback pin to comparator pin. ; Capacitor Cint from comparator pin to ground.0.56uF mylar film A2D_PORT EQU PORTA A2D_IN_BIT EQU 0 A2D_OUT_BIT EQU 1 ERROR_STUCK_HI EQU 1 ERROR_STUCK_LO EQU 2 ORG 0 ;Reset Vector GOTO Main ORG 4 ;Interrupt Vector Main bsf STATUS,RP0 clrf PORTB ;Make portb i/o pins outputs movlw 1 movwf PORTA bcf STATUS,RP0 clrf error_code start: loop clrf count_lo clrf count_hi call a2d_convert2 movf count_lo,W movwf PORTB goto loop ;-------------------------------------------------------- ; a2d_convert ; ; 2I/O pins a2d_convert: call precharge a2d_loop RLF A2D_PORT,W xorlw 0xff movwf A2D_PORT clrc movlw 1 btfss A2D_PORT,A2D_OUT_BIT addwf count_lo,f skpnc addwf count_hi,f addwf total_lo,f skpnc addwf total_hi,f ; clrf t1 ; decfsz t1,f ; goto $-1 btfss total_hi,4 goto a2d_loop return ;-------------------------------------------------------- ; a2d_convert ; ; I/O pin a2d_convert2: ;Put the A2D_PORT's tris into the FSR so that we can ;access it with out having to do those damn bank selects movlw TRISA movwf FSR movlw 1 clrf count_lo clrf count_hi clrf total_lo clrf total_hi clrf t1 ; Step 1 is the pre-charging cycle where the capacitor ;is made to pass through the low-to-high threshold and ;then again through the high-to-low threshold. ; This ensures that the voltage on the capacitor is the ;same for each time we pass through the algorithm. ;Make the capacitor go through the low to high threshold bsf A2D_PORT,A2D_OUT_BIT bcf INDF,A2D_OUT_BIT a2d2_l1 call delay16 call delay16 call delay16 call delay16 bsf INDF,A2D_OUT_BIT call delay16 btfsc A2D_PORT,A2D_OUT_BIT goto a2d2_l2 bsf A2D_PORT,A2D_OUT_BIT bcf INDF,A2D_OUT_BIT decfsz t1,f goto a2d2_l1 ; movlw ERROR_STUCK_LO ; movwf error_code ; goto display_error ;now pass through the high to low threshold a2d2_l2 clrf t1 bcf A2D_PORT,A2D_OUT_BIT bcf INDF,A2D_OUT_BIT a2d2_l3 call delay16 call delay16 call delay16 call delay16 bsf INDF,A2D_OUT_BIT call delay16 btfss A2D_PORT,A2D_OUT_BIT goto a2d2_l4 bcf A2D_PORT,A2D_OUT_BIT bcf INDF,A2D_OUT_BIT decfsz t1,f goto a2d2_l3 ; movlw ERROR_STUCK_HI ; movwf error_code ; goto display_error a2d2_l4 ;If we get then we've successfully precharged the capacitor ;Also, the capacitor voltage is just below the high-to-low ;threshold (Vil) so let's begin by ramping it positive bsf A2D_PORT,A2D_OUT_BIT bcf INDF,A2D_OUT_BIT a2d2_l5 addwf total_lo,f skpnc addwf total_hi,f btfsc total_hi,0 return call delay16 call delay16 call delay16 call delay16 bsf INDF,A2D_OUT_BIT call delay4 btfss A2D_PORT,A2D_OUT_BIT goto a2d2_low addwf count_lo,F ;The cap voltage is too high bcf A2D_PORT,A2D_OUT_BIT bcf INDF,A2D_OUT_BIT skpnc addwf count_hi,F goto a2d2_l5 a2d2_low ;The cap voltage is too high bsf A2D_PORT,A2D_OUT_BIT bcf INDF,A2D_OUT_BIT goto $+1 goto a2d2_l5 return ;-------------------------------------------------------- ; precharge precharge: movlw 1 clrf total_lo clrf total_hi bcf A2D_PORT,A2D_OUT_BIT ; Make the capacitor voltage go below the trip threshold pc_low_loop btfss A2D_PORT,A2D_IN_BIT goto pc_high addwf total_lo,f skpnc addwf total_hi,f skpc goto pc_low_loop movlw ERROR_STUCK_HI movwf error_code goto display_error ; Now make the capacitor voltage go above the trip threshold pc_high BSF A2D_PORT,A2D_OUT_BIT clrf total_lo clrf total_hi pc_high_loop btfsc A2D_PORT,A2D_IN_BIT goto precharged addwf total_lo,f skpnc addwf total_hi,f skpc goto pc_high_loop movlw ERROR_STUCK_LO movwf error_code goto display_error precharged: clrf total_lo clrf total_hi bcf A2D_PORT,A2D_OUT_BIT return ;-------------------------------------------------------- ; ; error - write an error code to portb. if the error code is ; zero then toggle portb between 0 and 0xff display_error: bsf STATUS,RP0 clrf PORTB ;Make portb i/o pins outputs bcf STATUS,RP0 error_loop: movf error_code,W movwf PORTB skpz goto error_loop ;If the error code is zero, then flash the LEDs call big_delay comf PORTB,f call big_delay goto error_loop big_delay: clrf t1 clrf t2 decfsz t1,f goto $-1 decfsz t2,f goto $-3 return delay16 NOP delay15 NOP delay14 NOP delay13 NOP delay12 NOP delay11 NOP delay10 NOP delay9 NOP delay8 NOP delay7 NOP delay6 NOP delay5 NOP delay4 RETURN END
.