DEVICE 16F876 DECLARE XTAL 4 'OSC = 4 МГц DECLARE ADIN_RES 10 'Задать разрядность встроенного АЦП (16F876 имеет 10-ти разрядный АЦП) DECLARE ADIN_STIME 50 'Задержка на время преобразования АЦП: 50 мкс(uS) OPTION_REG.7 = 0 'Подтягивающие резисторы на PortB TRISA=%00000111 TRISB=%11110000 TRISC=%00000000 ADCON1=%10000010 PORTC=0 '0 на PORTC, пока идёт иниц.ЖКИ и прочие установки SYMBOL Lcd_CE= PORTB.0 SYMBOL Lcd_DC= PORTB.1 SYMBOL Lcd_DIN=PORTB.2 SYMBOL Lcd_CLK=PORTB.3 SYMBOL Protect=PORTC.3 'отсюда уходит сигнал защиты на БЗ SYMBOL LedV=PORTC.1 'сюда подключён HL1 SYMBOL LedA=PORTC.2 'сюда подключён HL2 SYMBOL Beep=PORTC.0 'сюда выводится звук SYMBOL SetButton=PORTB.7 'основная кнопка установок SYMBOL SbrosButton=PORTB.6 'Этой кнопкой низким уровнем сбрасывается защита. SYMBOL JumpA=PORTB.5 'Перемычка: её положение определяет сигнал защиты на порту 'штатный режим - сигнал защиты равен положению перемычки 'перегрузка - сигнал защиты обратный положению перемычки SYMBOL JumpV=PORTB.4 'Перемычка: её положение определяет сигнал защиты на порту 'штатный режим - сигнал защиты равен положению перемычки 'перегрузка - сигнал защиты обратный положению перемычки SYMBOL KorBit=PORTC.5 'Бит коррекции при нулевом токе. KorBit=0 DIM i AS BYTE 'счётчик DIM k AS BYTE 'счётчик DIM Rows AS BYTE DIM Pos AS WORD DIM PosY AS Pos.LOWBYTE DIM PosX AS Pos.HIGHBYTE DIM Mode AS BIT 'Бит инвертирования: 0-нормальные буквы, 1-инвертированные DIM adcV AS WORD 'вольты в виде 0...1023 DIM adcA AS WORD 'амперы в виде 0...1023 DIM sbros AS BIT 'От её знач. зависит способ сброса защиты: '0 - автоматически через 4 сек при возврате в допустимые пределы, '1- кнопкой DIM LongPress AS 20 'константа задержки нажатия кнопки DIM Press AS BYTE 'переменная-счетчик нажатия кнопки для ввода значений DIM Vover AS WORD 'Порог срабатывания защиты по НАПРЯЖЕНИЮ DIM Aover AS WORD 'Порог срабатывания защиты по ТОКУ DIM Vz AS BYTE 'U защиты DIM Az AS BYTE 'I защиты DIM Akor AS BYTE 'автоматическая установка нуля измеряемого тока т.к. на выходе LM358 'есть малое напряжение при отсутствии нагрузки DIM Vmax AS BYTE DIM Amax AS BYTE DIM VAX AS BYTE 'подменный для Vmax,Amax,Vz,Az DIM ButtonCount AS BYTE 'счётчик количества длинных нажатий кнопки DIM V AS WORD 'вольты выражены 3500 по умолчанию DIM A AS WORD 'амперы выражены 1000 по умолчанию DIM SbrosCount AS BYTE 'счётчик циклов (4max=4сек) при сбросе защиты "АВТОМАТИЧЕСКИ" DIM Ainv AS BIT DIM Vinv AS BIT DIM Cifra AS BYTE DIM Draw AS BYTE DIM d AS BYTE DIM p AS BYTE DIM z[252] AS BYTE 'основной массив DIM x[48] AS BYTE DIM Joker[6] AS BYTE DIM Nalad[5] AS BYTE DIM Nal_Bit AS BIT DIM q AS WORD 'переменная-джокер DIM qH AS q.HIGHBYTE DIM qL AS q.LOWBYTE INCLUDE "Massiv.inc" 'чтение данных из EEPROM, запись так: EWRITE 0,[Vmax, Amax, Vz, Az, sbros] Vmax=EREAD 0 'BYTE Amax=EREAD 1 'BYTE Vz=EREAD 2 'byte Az=EREAD 3 'byte sbros=EREAD 4 'bit Akor=EREAD 5 'Величина коррекции при I=0 учитывается каждый раз при включении Прибора 'По умолчанию 'Vmax=35 'BYTE 'Amax=10 'BYTE 'Vz=35 'byte 'Az=10 'byte 'sbros=1 'bit кнопкой 'Akor=0 'byte. Величина коррекции при I=0 учитывается каждый раз при включении Прибора 'По умолчанию IF Vmax > 61 THEN Vmax=35 IF Amax > 21 THEN Amax=10 IF Vz > Vmax THEN Vz=Vmax IF Az > Amax THEN Az=Amax GOSUB VAover Mode=0 'Normal ButtonCount=0 Ainv=0 Vinv=0 'protect=0 'sbros=0 'Отладка: 0-сброс автоматически, 1-кнопкой SbrosButton GOSUB Lcd_Init 'SHOUT Lcd_DIN, Lcd_CLK, MSBFIRST, [$21,$C8,$06,$13,$20,$0C] GOSUB Lcd_Clear DELAYMS 20 GOSUB Lcd_StartData Main: Press=0 WHILE SetButton=0 IF Press < 255 THEN INC Press DELAYMS 50 IF Press > LongPress THEN Mode=0 IF Nal_Bit=0 THEN GOSUB Lcd_Clear IF ButtonCount = 0 THEN GOSUB Lcd_Naladka ELSE PosX=66 GOSUB Lcd_GotoXY STR Nalad = 0,$10,$20,$10,$08',0'галочка GOSUB Lcd_Nalad ENDIF Nal_Bit=1 END IF WEND IF Nal_Bit=1 THEN IF Press > 0 THEN GOSUB Naladka GOTO Main ENDIF SbrosCount=0 more: 'считывание показаний АЦП в виде 0...1023 adcV=ADIN 0 adcA=ADIN 1 IF adcV = 0 THEN V=0 Akor=adcA ELSE INC adcV ' q= adcV * 10 */ Vc '1024*10*875/256=35000; 1023*10*875/256=34965(.82); 1022*10*875/256=34931.64 q= adcV * Vmax */ 250 adcV= q/10 '3496(5); IF q DIG 0 > 4 THEN INC adcV 'округление по правилам математики qH= ADIN 2 'Падение напряжения на датчике тока в виде 0...1023 qH= qH >> 1 V = adcV - qH 'V = V - (qH >> 1) ENDIF IF adcA > Akor THEN INC adcA ' q= adcA * 10 */ Ac q= adcA * Amax */ 250 A= q/10 IF q DIG 0 > 4 THEN INC A ELSE A=0 ENDIF alarm: Pos=$1800 'PosY=0: PosX=24 i=JumpV GOSUB Kak_Jump PosX=48 i=JumpA GOSUB Kak_Jump PosX=72 GOSUB Lcd_GotoXY '--------Volt-------- Mode=Vinv Pos=$0001 'PosX=0: PosY=1 GOSUB Lcd_GotoXY q=V GOSUB Lcd_4Up i=0 GOSUB Lcd_DrawX 'Полуторная В верх GOSUB Lcd_4Down i=12 GOSUB Lcd_DrawX 'Полуторная В низ '---------Amper-------- Mode=Ainv PosY=3 GOSUB Lcd_GotoXY q=A GOSUB Lcd_4Up i=24 GOSUB Lcd_DrawX 'Полуторная A верх GOSUB Lcd_4Down i=36 GOSUB Lcd_DrawX 'Полуторная A низ '----------Pa----------------- q = V * A '3496 * 1245 = 4352520 (34.96 * 12.45 = 435.2520) q = DIV32 1000 '4352520/1000=4352 (4352.520) Mode=0 Pos=$1305 'PosX=19: PosY=5 GOSUB Lcd_GotoXY k=4 WHILE k > 0 GOSUB Kak_Cifra 'Cifra = q DIG k GOSUB Lcd_DrawCifra DEC k WEND SHOUT Lcd_DIN, Lcd_CLK, 1, [$00, $40, $00] GOSUB Kak_Cifra GOSUB Lcd_DrawCifra '--------Проверки----------------- PosY=0 IF adcV >= Vover THEN Protect=0 GOSUB Lcd_Protect LedV=JumpV GOSUB Lcd_LedV SOUND Beep,[105,10,106,10] Vinv = ~Vinv ELSE IF A >= Aover THEN Protect=0 GOSUB Lcd_Protect LedA=JumpA GOSUB Lcd_LedA SOUND Beep,[112,10,110,10] Ainv = ~Ainv ELSE Protect=1 GOSUB Lcd_Protect LedV=~JumpV LedA=~JumpA GOSUB Lcd_LedV GOSUB Lcd_LedA Vinv=0 Ainv=0 ENDIF ENDIF IF Protect=0 THEN DELAYMS 500 IF sbros=0 THEN '0-сброс автоматически INC SbrosCount IF SbrosCount < 8 THEN GOTO alarm ELSE '1-сброс кнопкой IF SbrosButton=1 THEN GOTO alarm ENDIF ENDIF IF KorBit=0 THEN EWRITE 5,[Akor] 'запись Akor в EEPROM после проверки на 0 KorBit=1 'присваиваем 1, чтобы больше не писать в EEPROM до следующего включения Прибора GOTO Main 'в начало цикла '------------------Блок подпрограмм:-------------------------- Lcd_GotoXY: Lcd_DC=0 SHOUT Lcd_DIN, Lcd_CLK, MSBFIRST, [128 + PosX , 64 + PosY] Lcd_DC=1 RETURN Lcd_ShoutByte: IF Mode=1 THEN Draw = ~Draw SHOUT Lcd_DIN, Lcd_CLK, MSBFIRST, [Draw] INC i RETURN Lcd_Joker: SHOUT Lcd_DIN, Lcd_CLK, MSBFIRST, [STR Joker] RETURN Lcd_Nalad: SHOUT Lcd_DIN, Lcd_CLK, MSBFIRST, [STR Nalad] RETURN Kak_Jump: IF i = 0 THEN STR Joker= $60, $7E, $02, $02, $7E, $60'перемычка зам ELSE STR Joker= $60, $6F, $01, $01, $6F, $60'перемычка раз ENDIF GOSUB Lcd_GotoXY GOSUB Lcd_Joker RETURN Lcd_Adres: WHILE i < Rows Draw = CREAD Adres + i GOSUB Lcd_ShoutByte WEND RETURN Lcd_DrawZ: 'Рисует Rows/6 символов величиной 8х6 WHILE i < Rows 'Rows - Кол-во выв байтов, для выв 1 символа=5, 2х=5+6 и тд +6 Draw = z[i] 'i - Переменная-счётчик BYTE, должна быть определена выше GOSUB Lcd_ShoutByte WEND RETURN Lcd_DrawX: Rows = i + 12 WHILE i < Rows Draw = x[i] GOSUB Lcd_ShoutByte WEND RETURN Kak_Level: IF i = 0 THEN STR Nalad = $10, $30, $7F, $30, $10 ELSE STR Nalad = $04, $06, $7F, $06, $04 ENDIF GOSUB Lcd_GotoXY GOSUB Lcd_Nalad RETURN Lcd_Protect: PosX=72 i = Protect GOSUB Kak_Level RETURN Lcd_LedV: PosX=31 i = LedV GOSUB Kak_Level RETURN Lcd_LedA: PosX=55 i = LedA GOSUB Kak_Level RETURN Kak_Cifra: Cifra = q DIG k RETURN Lcd_DrawCifra: i = Cifra * 6 Rows = i + 6 GOSUB Lcd_Adres 'Draw = CREAD Adres + i RETURN Lcd_Dig: DEC k GOSUB Kak_Cifra i = Cifra * 12 i = i + d 'd = 0 или 120 Rows= i + 12 GOSUB Lcd_DrawZ RETURN Lcd_4Dig: k=4 GOSUB Lcd_Dig GOSUB Lcd_Dig i = p '5 пустых Rows= i + 5 GOSUB Lcd_DrawZ GOSUB Lcd_Dig GOSUB Lcd_Dig RETURN Lcd_4Up: d=0 p=240 GOSUB Lcd_4Dig RETURN Lcd_4Down: INC PosY GOSUB Lcd_GotoXY d=120 p=246 GOSUB Lcd_4Dig RETURN kak_sbros: PosY=5 i=60 IF sbros=1 THEN i=72 Rows= i + 12 GOSUB Lcd_GotoXY GOSUB Lcd_Adres 'Draw = CREAD Adres + i RETURN Dig_VAX: GOSUB Lcd_GotoXY Cifra= VAX DIG 1: GOSUB Lcd_DrawCifra Cifra= VAX DIG 0: GOSUB Lcd_DrawCifra RETURN Dig_Vmax: PosY=1 VAX=Vmax GOSUB Dig_VAX RETURN Dig_Vz: PosY=2 VAX=Vz GOSUB Dig_VAX RETURN Dig_Amax: PosY=3 VAX=Amax GOSUB Dig_VAX RETURN Dig_Az: PosY=4 VAX=Az GOSUB Dig_VAX RETURN Lcd_StartData: Pos=0 GOSUB Lcd_GotoXY STR Joker = $00,$7F,$09,$19,$29,$46 'R GOSUB Lcd_Joker STR Joker = $00,$3E,$41,$41,$41,$22 'C GOSUB Lcd_Joker PosX=18 i=84 FOR k=0 TO 2 Rows = i + 6 GOSUB Lcd_GotoXY GOSUB Lcd_Adres PosX= PosX + 24 NEXT Pos=$0105 'PosX=1 : PosY=5 GOSUB Lcd_GotoXY STR Joker = 0,$7E,$12,$12,$12,$0C'P GOSUB Lcd_Joker STR Joker = 0,$20,$54,$54,$78,0'a GOSUB Lcd_Joker STR Joker = $00, $28, $28, $28, $28, $00'= GOSUB Lcd_Joker PosX=53 GOSUB Lcd_GotoXY STR Joker = $7E, $4A, $4A, $4A, $34, $00'B GOSUB Lcd_Joker STR Joker = $04, $04, $7C, $04, $04, $00'т ' STR Joker = $10,0,$7C,$12,$12,$7C 'A GOSUB Lcd_Joker PosX=72 GOSUB Dig_Vmax GOSUB Dig_Vz GOSUB Dig_Amax GOSUB Dig_Az GOSUB kak_sbros RETURN Lcd_Init: Lcd_CE=0 Lcd_DC=0 ' $21: LCD EXTENDED COMMANDS ' $C8: SET LCD Vop (CONTRAST)$C8 ' $04: SET TEMP COEFFICENT ' $13: LCD BIAS MODE 1:48 ' $20: LCD STANDARD COMMANDS ' $0C: LCD IN NORMAL MODE STR Joker= $21,$C8,$06,$13,$20,$0C GOSUB Lcd_Joker RETURN Lcd_Clear: Lcd_DC=1 STR Joker= 0,0,0,0,0,0 k=0 WHILE k < 84 GOSUB Lcd_Joker INC k WEND RETURN VAover: Vover=Vz * 100 Aover=Az * 100 RETURN '-------Процедуры для режима "НАЛАДКА"----------- Draw_a_neg: STR Joker = $7F,$43,$6D,$6D,$43,$7F GOSUB Lcd_Joker RETURN SetPosY: INC PosY GOSUB Lcd_GotoXY RETURN Draw_Comma: STR Joker = 0, $A0, $60, 0, 0, 0 ', GOSUB Lcd_Joker RETURN Draw_a: STR Joker = 0,$20,$54,$54,$54,$78 'a GOSUB Lcd_Joker RETURN Draw_c: STR Joker = 0,$38,$44,$44,$44,$44 'с GOSUB Lcd_Joker RETURN Draw_m: STR Joker = 0,$7C,$08,$10,$08,$7C 'м GOSUB Lcd_Joker RETURN Draw_i: STR Joker = 0,$7C,$20,$10,$08,$7C 'и GOSUB Lcd_Joker RETURN Draw_Zashit: STR Joker = 0, $44, $44, $54, $54, $28 'з GOSUB Lcd_Joker GOSUB Draw_a STR Joker = 0, $7C, $40, $78, $40, $FC 'щ GOSUB Lcd_Joker GOSUB Draw_i STR Joker = 0, $04, $04, $7C, $04, $04 'т GOSUB Lcd_Joker RETURN Draw_MAKSIM: GOSUB Draw_m GOSUB Draw_a STR Joker = 0,$7C,$10,$10,$28,$44 'к GOSUB Lcd_Joker GOSUB Draw_c GOSUB Draw_i GOSUB Draw_m GOSUB Draw_Comma 'запятая RETURN Draw_ZASHITY: GOSUB Draw_Zashit STR Joker = 0, $7C, $50, $20, $00, $7C 'ы GOSUB Lcd_Joker GOSUB Draw_Comma 'запятая RETURN Lcd_Naladka: PosX=12 : PosY=0 GOSUB Lcd_GotoXY STR Joker = $7F,$41,$77,$77,$41,$7F 'Н GOSUB Lcd_Joker GOSUB Draw_a_neg 'А STR Joker = $7F,$5F,$63,$7D,$41,$7F 'Л GOSUB Lcd_Joker GOSUB Draw_a_neg 'А STR Joker = $7F,$4F,$63,$6D,$61,$4F 'Д GOSUB Lcd_Joker STR Joker = $7F,$41,$77,$6B,$5D,$7F 'К GOSUB Lcd_Joker GOSUB Draw_a_neg 'А PosX=1 GOSUB SetPosY STR Joker = $02,$FE,$FE,$02,$00,$00: GOSUB Lcd_Joker STR Nalad = $02,$FE,$FE,$02,$00: GOSUB Lcd_Nalad GOSUB Draw_MAKSIM STR Joker = $00,$02,$FE,$FE,$86,$86: GOSUB Lcd_Joker STR Nalad = $86,$86,$7C,$38,$00: GOSUB Lcd_Nalad GOSUB SetPosY STR Joker = $00,$1F,$3F,$60,$60,$60: GOSUB Lcd_Joker STR Nalad = $60,$3F,$1F,$00,$00: GOSUB Lcd_Nalad GOSUB Draw_ZASHITY STR Joker = $00,$40,$7F,$7F,$60,$60: GOSUB Lcd_Joker STR Nalad = $60,$60,$3F,$1E,$00: GOSUB Lcd_Nalad GOSUB SetPosY STR Joker = $00,$00,$02,$02,$FE,$FE: GOSUB Lcd_Joker STR Nalad = $02,$02,$00,$00,$00: GOSUB Lcd_Nalad GOSUB Draw_MAKSIM STR Joker = $00,$00,$F0,$F8,$0C,$06: GOSUB Lcd_Joker STR Nalad = $06,$0C,$F8,$F0,$00: GOSUB Lcd_Nalad GOSUB SetPosY STR Joker = $00,$00,$40,$40,$7F,$7F: GOSUB Lcd_Joker STR Nalad = $40,$40,$00,$00,$00: GOSUB Lcd_Nalad GOSUB Draw_ZASHITY STR Joker = $00,$40,$7F,$7F,$42,$02: GOSUB Lcd_Joker STR Nalad = $02,$42,$7F,$7F,$40: GOSUB Lcd_Nalad GOSUB SetPosY GOSUB Draw_c STR Joker = 0,$38,$54,$54,$56,$20 'б GOSUB Lcd_Joker STR Joker = 0,$FC,$24,$24,$24,$18 'р GOSUB Lcd_Joker STR Joker = 0,$38,$44,$44,$44,$38 'о GOSUB Lcd_Joker GOSUB Draw_c SHOUT Lcd_DIN, Lcd_CLK, MSBFIRST,[0,0,0,0] GOSUB Draw_Zashit PosX=72 GOSUB Dig_Vmax GOSUB Dig_Vz GOSUB Dig_Amax GOSUB Dig_Az GOSUB kak_sbros RETURN Naladka: PosX=72 '<<<<<< IF Press > LongPress THEN GOSUB Dig_Vmax GOSUB Dig_Vz GOSUB Dig_Amax GOSUB Dig_Az GOSUB kak_sbros Mode=1 INC ButtonCount ON ButtonCount GOTO more,k01,k02,k03,k04,k05,exit exit: EWRITE 0,[Vmax, Amax, Vz, Az, sbros] ButtonCount=0 Nal_Bit=0 Mode=0 GOSUB Lcd_Clear GOSUB Lcd_StartData GOTO more k01: GOSUB Dig_Vmax GOSUB Dig_Vmax GOTO Main k02: GOSUB Dig_Vz GOSUB Dig_Vz GOTO Main k03: GOSUB Dig_Amax GOSUB Dig_Amax GOTO Main k04: GOSUB Dig_Az GOSUB Dig_Az GOTO Main k05: GOSUB kak_sbros GOSUB kak_sbros 'вернуть обратно если глюк не пропадёт и попробовать другое ELSE Mode=1 ON ButtonCount GOTO alarm,k1,k2,k3,k4,k5 k1: INC Vmax IF Vmax > 61 THEN Vmax=5 GOSUB Dig_Vmax GOTO Main k2: INC Vz IF Vz > Vmax THEN Vz=1 GOSUB Dig_Vz GOSUB VAover GOTO Main k3: INC Amax IF Amax > 21 THEN Amax=2 GOSUB Dig_Amax GOTO Main k4: INC Az IF Az > Amax THEN Az=1 GOSUB Dig_Az GOSUB VAover GOTO Main k5: sbros = ~sbros GOSUB kak_sbros GOSUB kak_sbros ENDIF RETURN 'stop Adres: CDATA $00, $3C, $42, $42, $3C, $00, _ '0(0-5) $00, $00, $44, $7E, $40, $00, _ '1(6-11) $00, $44, $62, $52, $4C, $00, _ '2(12-17) $00, $42, $4A, $4A, $34, $00, _ '3(18-23) $00, $1E, $10, $10, $7E, $00, _ '4(24-29) $00, $4E, $4A, $4A, $32, $00, _ '5(30-35) $00, $3C, $4A, $4A, $30, $00, _ '6(36-41) $00, $02, $72, $0A, $06, $00, _ '7(42-47) $00, $34, $4A, $4A, $34, $00, _ '8(48-53) $00, $0C, $52, $52, $3C, $00, _ '9(54-59) ' $00,$04,$48,$50,$60,$78, $00,$1E,$06,$0A,$12,$20, _ '(60-71)стрелки тудасюда $08, $04, $7E, $44, $48, $40, $02, $12, $22, $7E, $20, $10, _ ' $00,$00,$1C,$22,$41,$5D, $5D,$41,$22,$1C,$00,$00, _ '(72-83)кнопка $00,$00,$38,$44,$82,$BA, $BA,$82,$44,$38,$00,$00, _ ' $00,$00,$1C,$22,$41,$5D, $41,$22,$1C,$00,$00,$00, _ $00, $42, $7F, $40, $00, $00, _ '(84-89)1 $42, $61, $51, $49, $46, $00, _ '(90-95)2 $22, $41, $49, $49, $36, $00', _ '(96-101)3 ' $00,$7F,$09,$19,$29,$46,$00,$3E,$41,$41,$41,$22', _ '(84-95)RC ' $00,$7E,$12,$12,$12,$0C, 0,$20,$54,$54,$78, 0,$28,$28,$28,$28', _ '(114-129)Pa= ' 0,$7E,$4A,$4A,$34,0, $10,0,$7C,$12,$12,$7C', _ '(130-141)BA ' 0, $A0, $60, 0, 0, 0', _ ',(142-147) ' 0, $38, $44, $44, $44, $44, _ 'с(148-153) ' 0, $44, $44, $54, $54, $28, _ 'з(154) ' 0, $20, $54, $54, $54, $78, _ 'a ' 0, $7C, $40, $78, $40, $FC, _ 'щ ' 0, $7C, $20, $10, $08, $7C, _ 'и ' 0, $04, $04, $7C, $04, $04', _ 'т(183) ' 0, $7C, $50, $20, $00, $7C', _ 'ы(184-189) ' 0,$7C,$08,$10,$08,$7C, 0,$20,$54,$54,$54,$78, 0,$7C,$10,$10,$28,$44', _'мак(190-207) ' 0,$7C,$20,$10,$08,$7C, 0,$7C,$08,$10,$08,$7C', _ 'им(208-219) ' 0,$38,$54,$54,$56,$20, 0,$FC,$24,$24,$24,$18, 0,$38,$44,$44,$44,$38', _'бро(220-237) ' $7F,$43,$6D,$6D,$43,$7F, _ 'А негатив(238-243)'убрать ' $10,$20,$10,$08, _ 'галочка(244-247)'убрать ' 0,0,0,0,0,0 '248-253'убрать END