'**************************************************************** '* Name : C_meter.BAS * '* Author : YKV * '* Notice : Copyright (c) 2011 * '* : All Rights Reserved * '* Date : posted 25.04.2012 * '* Version : rev1 * '**************************************************************** DEFINE CONF_WORD = 3FDC ' intoscIO, WDTE, BODEN, no protect, БЕЗ MCLR ! DEFINE OSC 4 ' 4 MHz DEFINE ADC_BITS 10 ' 10 битный ацп DEFINE ADC_CLOCK 3 DEFINE ADC_SAMPLEUS 24 ANSEL = %00010000 ADCON0.7 = 1 CMCON0 =%00000100 ' конф. компаратора VRCON =%10001111 ' его опора INTCON =%11001000 ' прерывания ... PIE1.3 =1 ' ...от компаратора PIE1.0 =1 ' от таймера IOC.3 =1 ' от кнопки T1CON =%00110101 ' установки таймера 1 TRISIO =%00000010 ' GP1 = вход T2CON = %00000110 ' установки таймера 2 CCP1CON = %00111100 ' шим PR2=255 ' период шим a var bit ' для округления adc1 var word adc2 var word b var byte b1 var byte ' диапазон cnf1 var byte ' запоминаем конфигурацию cnf2 var byte cnf3 var byte ctH var word ' время заряда ct_ind var word ' идёт на индикацию ctL var word ' время заряда ct var word d var byte ' VD dtm var word ' время разряда dTMR1H var word ' большое время заряда e var bit k var word: k = 42 ' коэффициент key var byte n var byte p var byte :p =0 ' выбор не завершен q var byte r var word sgn var bit ' признак sgn1 var bit : sgn1 = 0 ' переход на другой резистор main: '******************************************************************************* n = 0 ' сброс high gpio.4:high gpio.0 ' начальный вход high gpio.5 pause 250 low gpio.5 TRISIO.0 =%00000001 b = CMCON0 INTCON.0 =0 PIR1.3 =0 ' обнуляем low gpio.4 ' заряжаем TMR1H =0: TMR1L =0 ' обнуляем таймер sub_main: on interrupt goto t_m ' обработчик goto sub_main '******************************************************************************* t_m: disable ctL = TMR1L: ctH = TMR1H ' запись if PIR1.3 =0 and PIR1.0 =1 then n = n +1 ' подсчёт длительности заряда dTMR1H = ctH + n <<8 ' и пересчёт TMR1H и n, if n >7 then goto sub_main ' слишком долго if n > 0 and sgn1 = 0 then ' 1к p =1 sgn1 =1 goto rtn1 endif if PIR1.3 =1 and PIR1.0 =0 then ' готово p =0 high gpio.4 if gpio.0 = 0 then gpio.0 = 1 ' разряд gosub rslind endif if INTCON.0 =1 and sgn = 0 then goto r_msr ' переход к эпс INTCON.0 =0 PIR1.0 =0 ' сброс resume enable '************************************ rslind: ' обработка результата и назначение признака поддиапазона disable if n = 0 then ct = ctH << 8 +ctL ' 2 байта в dec if n = 0 and ct <= 99*k then ct_ind = ct *10 + 20 ct_ind = ct_ind/k b1 =0 if sgn1 =1 then b1 = 2 ' для индикации endif if n =0 and ct <= 999*k and ct > 99*k then ct_ind = ct/k b1 =1 ' для индикации, if sgn1 =1 then b1 = 3 endif if n =0 and ct > 999*k then b1 = 2 if sgn1 =1 then b1 = 4 ct_ind = ct/k ' 100...156 if ct_ind dig 0 >5 then ' округляем a = 1 else a =0 endif ct_ind = ct_ind/10 ct_ind = ct_ind +a endif if n >0 and n <=7 then b1 = 4 ct_ind = dTMR1H*256 ' 65536 минимально ct_ind = div32 k ct_ind = ct_ind/10 ' 156...1248 dtm = ct_ind ' запомнить if ct_ind >1000 then ct_ind = 1023 ' выход за 10 мф endif if n = 0 and ct <= 199*k and sgn1 =0 then sgn = 1 else sgn = 0 endif gosub O_i resume enable '************************************ rtn1: ' индикация, разряд disable Cnf1 = ANSEL : Cnf2 = TRISIO : cnf3 = gpio ' для тока утечки CMCON0 =7 ANSEL = %00010000 TRISIO =0 high gpio.0 ' РАЗРЯД high gpio.1 ' if p =1 then gosub m_qk ' незакончено поэтому m qk if b1 = 0 then ' отсюда и до m_qk - индикация TRISIO.5 =1 pause 400 endif if b1 =1 then ' КРАСНЫЙ TRISIO.5 = 0 gpio.5 = 1 pause 400 endif if b1 = 2 then ' ЗЕЛЕНЫЙ И КРАСНЫЙ TRISIO.5 =0 for d =0 to 150 gpio.5 = 1 pause 2 gpio.5 = 0 pause 2 next d TRISIO.5 =1 endif if b1 = 3 then ' ЗЕЛЕНЫЙ TRISIO.5 = 0 gpio.5 = 0 endif if b1 =4 then ' ТО КРАСНЫЙ, ТО ЗЕЛЕНЫЙ for d =0 to 7 gpio.5 = 1 pause 250 gpio.5 = 0 pause 250 next d TRISIO.5 =1 endif e = TRISIO.5 ' запомнили TRISIO.5 m_qk: if p =1 then ' если не завершено high gpio.0 pause 100 endif if b1 = 3 then pause (ctH*10 +200) ' пауза endif if b1 = 4 then if dtm*12 > 4000 then pause (dtm*12 -4000) min 7000 'разряд endif CMCON0 =%00000100 ANSEL = Cnf1 : TRISIO = Cnf2 : TRISIO.5 =e if (ctH << 8 +ctL) < 650 and PIR1.3 =1 and sgn1 =1 then sgn1 =0 ' переход вниз n = 0 ' сбросы с p = 0 dTMR1H =0 TRISIO.0 =1 ' отключаем разряд 1к b = CMCON0 PIR1.3 =0: PIR1.0 =0 ' сброс флагов if sgn1 =0 then low gpio.4 ' заряжаем TMR1H =0: TMR1L =0 ' сброс if sgn1 = 1 then low gpio.0 TRISIO.4 =1 endif goto sub_main ' возврат в основной цикл enable '************************************ O_i: disable if ct_ind >1023 then ct_ind =1023 CCP1CON.4 = ct_ind.0 ' бит 0 CCP1CON.5 = ct_ind.1 ' бит 1 ct_ind = ct_ind >>2 CCPR1L = ct_ind gosub rtn1 '************************************* r_msr: disable Cnf1 = ANSEL : Cnf2 = TRISIO : cnf3 = gpio ' что было CMCON0 =%00000111 TRISIO =%11111000 for q = 0 to 4 gpio.0 =0: gpio.1 =0 asm movlw 9 movwf _key decfsz _key,F goto $-1 endasm adcin 3,adc1 adcin 3,adc2 gpio.0 = 1:gpio.1 =1 ' разряд adc1 = 1023 - adc1 ' вычисления adc2 = 1023 - adc2 if adc1 = 0 then r =0 else r =adc1<<1-adc2 endif if adc1<<1 < adc2 then r =0 r = r<<1 ' 5 мв =0,2 if r >90 then r = r*11/10 ' коррекция if r >200 then r = r*21/20 if r >300 then r = r*31/30 if r >500 then r = 1023 CCP1CON.4 = r.0 CCP1CON.5 = r.1 r = r >>2 CCPR1L = r pause 1000 next q CMCON0 =%00000100 ANSEL = %00010000 : TRISIO =%00000010 ' возврат high gpio.4:high gpio.0 ' разряд sgn1 = 0 INTCON.0 =0 ' сброс goto main ' выход в изм. С enable '******************************************************************************* end