-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgo_esr_1.17_2023_UTF8.asm
2054 lines (1808 loc) · 75.4 KB
/
go_esr_1.17_2023_UTF8.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;
; Russian capacitance and ESR meter for electrolytic capacitors
; Измеритель емкости и ESR электролитических конденсаторов (https://pro-radio.online/measure/3288/)
; C/ESR meter (метр)
;
; Autor (Автор) Gints Oleg (Гинц Олег) http://www.rlc-esr.ru/index.php/ru/izmeritel-s-i-esr
; Version (Версия) 1.01
; Date (Дата) 20/04/2007
;
; The program uses fragments of the FLC meter code (В программе использованы фрагменты кода измерителя FLC)
; Alexander Buevsky, Minsk, Bielorrusia (Александра Буевского, г.Минск, Беларусь)
;
; Program update (Доработка программы) Misyuta Gennady (Мисюта Геннадий)
; Version (Версия) 1.17
; Date (Дата) 18/10/2019
; - added battery charge indicator
; - added correction constant for the minimum capacitance of the capacitor
; - added ESR and Cx software filters for more stable display readings
;
; Microchip Assembler (MPASM) languaje, not MPLAB XC8 PIC Assembler (pic-as)
; Added english comments to mains sections by Jorge Rivera in June 2023
; See https://github.com/latchdevel/C_ESR_METER
;
; MICROCONTROLLER PIC16F876A OUTPUTS ASSIGNMENT (НАЗНАЧЕНИЕ ВЫВОДОВ КОНТРОЛЛЕРА PIC16F876A)
;*******************************************************************************************
; PIN * NAME * FUNCTION (НОГА * ИМЯ * НАЗНАЧЕНИЕ)
;*******************************************************************************************
; 1 * MCLR/Vpp * Reset (Сброс)
; 2 * RA0/AN0 * ADC to measure U330 (выход ДУ) (Ку=330)
; 3 * RA1/AN1 * ADC to measure U33 (выход ДУ) (Ку=33)
; 4 * RA2/AN2/Vref- * Button key Menu/Set Кн. Set coeff./Set "0"
; 5 * RA3/AN3/Vref+ * ADC to battery voltage monitoring (Контроль напряжения батареи) v1.17
; 6 * RA4/T0CKI * Button key + (plus/test) Кн.+/Test
; 7 * RA5/AN4/SS * Button key - (minus) Кн.-
; 8 * Vss * GND
; 9 * OSC1/CLKIN * Quartz 20 MHz (Кварц 20 МГц)
; 10 * OSC2/CLKOUT * Quartz 20 MHz (Кварц 20 МГц)
; 11 * RC0/T1OSO/T1CKI * Charge Cx I=10mA (charge when LOW) (Заряд Сх)
; 12 * RC1/T1OSI/CCP2 * Discharge Cx (Разряд Сх)
; 13 * RC2/CCP1 * Upper charging level comparator Cx (LOW if U33>2.0v) (Компаратор верхнего уровня зарядки Сх)
; 14 * RC3/SCK/SCL * In_N_Gnd "-" to the ground "R" remote control (вх."-" на землю)
; 15 * RC4/SDI/SDA * In_P_Cx "+" to Сх
; 16 * RC5/SDO * In_N_Cx "-" to Сх
; 17 * RC6/TX/CK * Lower charge level comparator Cx (LOW if U33>1.0v) (Компаратор нижнего уровня зарядки Сх)
; 18 * RC7/RX/DT * Unused
; 19 * Vss * +5V
; 20 * Vdd * GND
; 21 * RB0/INT * LCD_D4
; 22 * RB1 * LCD_D5
; 23 * RB2 * LCD_D6
; 24 * RB3/PGM * LCD_D7
; 25 * RB4 * LCD_R/S
; 26 * RB5 * LCD_E
; 27 * RB6/PGC * Unused
; 28 * RB7/PGD * Unused
;****************************************************************************************
list p=PIC16F876a
#include P16F876a.inc ;20.000 MHz
__CONFIG _CP_OFF & _BODEN_OFF & _HS_OSC & _WRT_OFF & _WDT_OFF & _PWRTE_ON & _DEBUG_OFF & _CPD_OFF & _LVP_OFF
Port_A_Config equ b'11111111' ;ADCs and button keys (all inputs)
;Port A bit equates ||||||
; |||||·- RA0 ADC to measure U330
; ||||·-- RA1 ADC to measure U33
Kn_Set equ 2; |||·--- RA2 Button key Menu/Set
; ||·---- RA3 ADC to measure battery voltage (v1.17)
Kn_Plus equ 4; |·----- RA4 Button key + (plus/test)
Kn_Minus equ 5; ·------ RA5 Button key - (minus)
Port_B_Config equ b'11000000' ;Display LCD 16x2 (4-bit mode outputs)
;Port B bit equates ||||||||
; |||||||·- RB0 LCD Data bit 4
; ||||||·-- RB1 LCD Data bit 5
; |||||·--- RB2 LCD Data bit 6
; ||||·---- RB3 LCD Data bit 7
; |||·----- RB4 LCD Register Select (R/S)
LCD_E equ 5;||·------ RB5 LCD Enable (E)
; |·------- RB6 (unused)
; ·-------- RB7 (unused)
Port_C_Config equ b'11000100' ;Manage outpus to Cap and inputs from external LM393 comparator
;Port C bit equates ||||||||
Cap_Charge equ 0;|||||||·- RC0 Cap_Charge Output Cap charge when LOW "C"
Cap_Discharge equ 1;||||||·-- RC1 Cap_Discharge Output Cap discharge when HIGH "D"
Comp_Up equ 2;|||||·--- RC2 Comp_Up Input LOW if U33 > 2.0v
In_N_Gnd equ 3;||||·---- RC3 In_N_Gnd Output RC3-GND- "R" (remote control)
In_P_Cx equ 4;|||·----- RC4 In_P_Cx Output RC4-CX "+"
In_N_Cx equ 5;||·------ RC5 In_N_Cx Output RC5-CX "-"
Comp_Low equ 6;|·------- RC6 Comp_Low Input LOW if U33 > 1.0v
; ·-------- RC7 (unused) Input (unused)
;Port C cap states -+R DC
ESR_ready equ b'00110011' ;Discharge, "+" and "-" Remote control on Cx (вкл. разряд, "+" и "-" ДУ на Cx)
ESR_start equ b'00110000' ;Charge, "+" and "-" Remote control on Cx (вкл. заряд, "+" и "-" ДУ на Cx)
Cap_ready equ b'00011011' ;Discharge, "-" Remote control to ground, "+" to Cx (вкл. разряд, "-" ДУ на землю, "+" на Cx)
Cap_start equ b'00011000' ;Charge, "-" Remote control to ground, "+" to Cx (вкл. заряд, "-" ДУ на землю, "+" на Cx)
Cap_start2 equ b'00110000' ;Charge, "-" Remote control on Cx, "+" on Cx (вкл. заряд, "-" ДУ на Cx, "+" на Cx)
;Register bits flags (биты регистра)
TIMEOUT equ 0 ;for the allotted time, the measurements did not wait for the end of the charge
;за отведенное время измерения не дождались окончания заряда
INSIGZERO equ 1 ;leading zeros (незначащие нули)
POINT equ 2 ;decimal point (десятичная точка)
DISCHARGE equ 3 ;value check. digits when outputting (проверку знач. разрядов при выводе)
CHECK10OM equ 4 ;check 10 ohm (10 Ом)
SAVECONST equ 5 ;constant change flag (флаг изменения константы)
;Register bits Flag_Key (биты регистра)
STARTSETKEY equ 0 ;flag for pressing the SET button in constant mode (флаг нажатия SET кнопки в режиме констант)
_BAT_MAX equ 3
_BAT_1 equ 4
_BAT_2 equ 5
_BAT_3 equ 6
_BAT_MIN equ 7
Max_Count equ .50 ;maximum number (1 byte, max 256) of TMR0 overflows when counting
;count step - 0.2 µs, 65536*0.2=13107.2 µs - one overflow
;or at I=10mA 15 counts/uF 65536/15=4369 uF - one overflow
;Let Cx max=150000uF, 150000/4369=34
;Taking into account the charge time to the lower limit, the constant must be doubled
;максимальное число (1 байт, не более 256) переполнений TMR0 при счете
;шаг счета - 0.2 мкс, 65536*0.2=13107.2 мкс - одно переполнение
;или при I=10mA 15 отсчетов/мкФ 65536/15=4369 мкф - одно переполнение
;Пусть Сх мах=150000мкФ, 150000/4369=34
;Учитывая время заряда до нижней границы константу надо удвоить
KEY_FAST equ .3 ;time of the pressed button to switch to the fast counting mode, seconds
;время нажатой кнопки для перехода в быстрый режим счёта, секунд
;****************************************************************************************
cblock 0x35 ;0x20-0x34 for FLOATING POINT LIBRARY "math16.inc" (fp24.a16)
U330_L ;0x35 Output voltage DU, Ku=330, low byte (Напряжение с выхода ДУ, Ку=330, младший байт)
U330_H ;0x36 Output voltage DU, Ku=330, high byte (Напряжение с выхода ДУ, Ку=330, старший байт)
U33_L ;0x37 Output voltage DU, Ku=33, low byte (Напряжение с выхода ДУ, Ку=33, младший байт)
U33_H ;0x38 Output voltage DU, Ku=33, high byte (Напряжение с выхода ДУ, Ку=33, старший байт)
TMR1_Count ;0x39 Overflow counter TMR1 (Счетчик переполнений TMR1)
TMR0_Count ;0x3A Overflow counter TMR0 (Счетчик переполнений TMR0)
Max_ADC_Count ;0x3B ADC overshoot counter>=0x300 with multiple ESR measurements (Счетчик превышений АЦП>=0x300 при многократном измерении ESR)
Key_Press_Time ;0x3C button hold time counter (счётчик времени удержания нажатой кнопки)
Bat_sign ;0x3D current battery icon on the display (текущий значёк заряда батареи на дисплее)
Flags ;0x3E
Flag_Key ;0x3F flag buttons (флаг кнопок)
;Data blocks (Блоки данных)
Dly0 ;0x40 Stores 3 bytes of data for the delay count
Dly1 ;0x41 Dly0 is the least significant byte
Dly2 ;0x42 while Dly3 is the most significant byte
Temp ;0x43
Temp1 ;0x44
Temp2 ;0x45
Temp3 ;0x46
Temp4 ;0x47
Count1 ;0x48
Count2 ;0x49
T0 ;0x4A
T1 ;0x4B
;Data blocks (Блоки данных)
T2 ;0x4C high byte (Старший байт)
T3 ;0x4D
T4 ;0x4E
T5 ;0x4F low byte (Младший байт)
AX ;0x50 high byte
A0 ;0x51
A1 ;0x52
A2 ;0x53 low byte
A3 ;0x54
A4 ;0x55
A5 ;0x56
BCD0 ;0x57 low byte
BCD1 ;0x58
BCD2 ;0x59
BCD3 ;0x5A
BCD4 ;0x5B high byte
EE_ADR ;0x5C auxiliary cell for working with EEPROM (вспомогательная ячейка для работы с EEPROM)
EE_DATA ;0x5D
NZ ;0x5E number of significant digits when displayed on the indicator (число значащих разрядов при выводе на индикатор)
NC ;0x5F constant number (номер константы)
Const_ADR ;0x60 address of constant in EEPROM (адрес константы в EEPROM)
Index_Buf_Cx ;0x61 pointer to the address of the oldest dimension in the buffer Buf_Cx (указатель на адрес самого старого измерение в буфере Buf_Cx)
Buf_Cx_1 :3 ;0x62 0x63 0x64 capacitance measurement buffer (буфер измерения ёмкости)
Buf_Cx_2 :3 ;0x65 0x66 0x67
Buf_Cx_3 :3 ;0x68 0x69 0x6A
endc
;for filter Cx constants (для фильтра Cx константы)
BUF_Cx_COUNT_MAX equ 3 ;number of measurements in buffer Buf_Cx (количество измерений в буфере Buf_Cx)
BUF_CX_END equ Buf_Cx_1+(BUF_Cx_COUNT_MAX*3)
;for ESR filter constants and variables (для фильтра ESR константы и переменные)
FILTER_CYCLE_MAX equ 4 ;number of median filter cycles (power-of-2 multiple) (количество циклов медианного фильтра (кратно степени 2))
Filter_cycle equ Temp1
BUF_COUNT_MAX equ 5 ;the size of each of the median filter buffers (размер каждого из буферов медианного фильтра)
Buf_Count equ Temp2
BUF_START_U330 equ 0x20
BUF_START_U33 equ 0x2A
MEDIAN_U330 equ BUF_START_U330+BUF_COUNT_MAX
MEDIAN_U33 equ BUF_START_U33+BUF_COUNT_MAX
;copies of registers upon entering the interrupt (available from any bank 0x70...0x7F) (копии регистров при входе в прерывание (доступны из любого банка 0x70...0x7F))
cblock 0x7F-3
W_TEMP ;save context on interrupts (сохранение контекста при прерываниях)
STATUS_TEMP
PCLATH_TEMP
endc
;=========================
; MACROS (МАКРОСЫ)
;=========================
bank0 macro
bcf STATUS, RP0
endm
;----------------------------------------------------------------
bank1 macro
bsf STATUS, RP0
endm
;----------------------------------------------------------------
Dly24 MACRO DLY
;Take the delay value argument from the macro, precalculate
;the required 3 RAM values and load the The RAM values Dly2,Dly1
;and Dly0.
banksel Dly0
movlw DLY & H'FF'
movwf Dly0
movlw DLY >>D'08' & H'FF'
movwf Dly1
movlw DLY >>D'16' & H'FF'
movwf Dly2
;Bytes are shifted and anded by the assembler to make user
;calculations easier.
endm
;==========================
ORG 0x2100 ; EEPROM area (Область EEPROM)
;Data ; Address in EEPROM (Данные ; Адрес в EEPROM)
;correction factors for: (корректирующие коэффициенты для)
USR_1 DE 0x00, 0x00, 0x03, 0xE8 ; 1000 - limit 1 ohm (предела 1 Ом)
USR_10 DE 0x00, 0x00, 0x03, 0xE8 ; 1000 - limit 10 ohm (предела 10 Ом)
USR_Cx DE 0x00, 0x00, 0x03, 0xE8 ; 1000 - capacitance measurements (измерения емкости)
USR_1_Cx DE 0x00, 0x00, 0x03, 0xE8 ; 1000 - capacitance measurements 1uF (измерения емкости 1 мкф)
;numbers in FLOATING POINT LIBRARY format
U0_ESR_1 DE 0x81, 0x40, 0x00, 0x00 ; 6 - "0" at the limit of 1 ohm (на пределе 1 Ом)
U0_ESR_10 DE 0x7F, 0x00, 0x00, 0x00 ; 1 - "0" at the limit of 10 ohm (на пределе 10 Ом)
;multipliers for calculations: (множители для расчето)
M_ESR_1 DE 0x75, 0x40, 0x30, 0x0C ; 1/682 = 0x7540300C -> 0.00146627 (0.001466275659824047) in Microchip 24-bit format (в формате Microchip 24-bit)
M_ESR_10 DE 0x78, 0x74, 0x89, 0x8D ; 1/67 = 0x7874898D -> 0.0149253 (0.014925373134328358) in Microchip 24-bit format (в формате Microchip 24-bit)
M_Cx DE 0x74, 0x2E, 0xC3, 0x3E ; 1/(15*100) = 0x742EC33E -> 0.000666666 (0.000666666666666666) in Microchip 24-bit format (в формате Microchip 24-bit)
;coarse correction for, for example, 10000uF (коррекция грубая для, например, 10000 мкф)
add_Cx DE 0x88, 0x7A, 0x00, 0x00 ; 1000 Correction accurate for 1uF in Microchip 24-bit format (коррекция точная для 1 мкф) (в формате Microchip 24-bit)
;==========================
org 0x700 ; last 256 bytes of page 1 of program memory (последние 256 байт 1-й страницы памяти программ)
Table addwf PCL,F
omega dt b'00000000' ;omega sign "Ω" character (знак омега)
dt b'00001110'
dt b'00010001'
dt b'00010001'
dt b'00010001'
dt b'00001010'
dt b'00011011'
dt b'00000000'
mu dt b'00000000' ;mu sign "μ" character for prefix micro, which represents one millionth, or 10E−6.
dt b'00000000'
dt b'00010010'
dt b'00010010'
dt b'00010010'
dt b'00011110'
dt b'00010001'
dt b'00010000'
bat_max dt b'00000000' ;sign batt max (знак макс. бат.)
dt b'00001110'
dt b'00011111'
dt b'00011111'
dt b'00011111'
dt b'00011111'
dt b'00011111'
dt b'00000000'
bat_1 dt b'00000000' ;sign batt (знак бат.)
dt b'00001110'
dt b'00010001'
dt b'00011111'
dt b'00011111'
dt b'00011111'
dt b'00011111'
dt b'00000000'
bat_2 dt b'00000000' ;sign batt (знак бат.)
dt b'00001110'
dt b'00010001'
dt b'00010001'
dt b'00011111'
dt b'00011111'
dt b'00011111'
dt b'00000000'
bat_3 dt b'00000000' ;sign batt (знак бат.)
dt b'00001110'
dt b'00010001'
dt b'00010001'
dt b'00010001'
dt b'00011111'
dt b'00011111'
dt b'00000000'
bat_min dt b'00000000' ;sign batt (знак бат.)
dt b'00001110'
dt b'00010001'
dt b'00010001'
dt b'00010001'
dt b'00010001'
dt b'00011111'
dt b'00000000'
_Const dt "Coeff. for",0
_ESR dt "ESR",0
_Cx dt " Cx ",0
_Time_out dt " Cx ---",0
_1_ohm dt " 1 ",1,0
_10_ohm dt " 10 ",1,0
_tst_1 dt "1",1,"=",0
_tst_10 dt " 10",1,"=",0
_write_U0 dt "U0 ---> EEPROM ",0
;_ready dt "It is ready!",0
_save_const dt "Save Constant",0
_1_Cx dt " C min",0
;*******************************************************************************
; PROGRAM START (НАЧАЛО ПРОГРАММЫ)
;*******************************************************************************
org 0x00
nop ;for MPLAB-ICD2
goto init
;------------------ Interrupt ------------------
org 0x004
save_context
movwf W_TEMP ;save W
swapf STATUS,W ;swap STATUS, W
clrf STATUS
movwf STATUS_TEMP ;save status
movf PCLATH,W
movwf PCLATH_TEMP ;save PCLFTH
bank0
TMR0_INT
btfss INTCON,T0IF ;TMR0 overflow?
goto TMR1_INT ;if not overflow jump to TMR1_INT
bcf INTCON,T0IF ;clear interrupt flag
decfsz TMR0_Count ;Decrement TMR0_Count and skip if zero
goto restore_context
goto Time_out ;TMR0_Count=0
TMR1_INT
btfss PIR1,TMR1IF
goto restore_context
bcf PIR1, TMR1IF ;clear the timer overflow flag (очищаем флаг переполнения таймера)
incfsz TMR1_Count,F
goto restore_context
Time_out
bcf T1CON, TMR1ON ;stop TMR1 (остановить TMR1)
bcf INTCON,GIE ;disable interrupts (запрещаем прерывания)
bsf Flags,TIMEOUT ;Time out
;for the allotted time, the measurements did not wait for the end of the charge
;за отведенное время измерения не дождались окончания заряда
clrf TMR1_Count
restore_context
movf PCLATH_TEMP,W
movwf PCLATH
swapf STATUS_TEMP,W ;fetch status, reswap nibbles
movwf STATUS ;restore status
swapf W_TEMP,F ;swap nibbles in preparation
swapf W_TEMP,W ;for the swap restoration of w
retfie ;return from interrupt
;-----------------------------------------------
init
bank0
clrf Flags
clrf Flag_Key
clrf INTCON
clrf PCLATH
clrf PORTA
clrf PORTB
movlw ESR_ready ;incl. discharge, "+" and "-" remote control on Cx (вкл. разряд, "+" и "-" ДУ на Сх)
movwf PORTC
bank1
movlw Port_A_Config
movwf TRISA
; ADC initialization (инициализация АЦП)
movlw b'10000100' ;right justify, Vdd, Vss, AN0, AN1, AN3 (правое выравнивание, Vdd, Vss, AN0, AN1, AN3)
movwf ADCON1
movlw Port_B_Config
movwf TRISB
movlw Port_C_Config
movwf TRISC
; LCD initialization to 4-bit mode (Инициализация LCD в 4-х битный режим)
InitLCD
call Delay_5_ms
call Delay_5_ms
call Delay_5_ms ;pause 15 ms after power on (пауза 15 мс после вкл питания)
bank0
movlw 3
movwf Count1
movwf PORTB
SetLoop
bsf PORTB,LCD_E ;send 0x30 command 3 times to initialize LCD (для инициализации LCD 3 раза посылается команда 0x30)
nop
nop
nop
bcf PORTB,LCD_E
call Delay_5_ms
decfsz Count1,f
goto SetLoop
movlw 2 ;4-x битный
movwf PORTB
call Send
movlw 28 ;4-х битный, 2 строки, 5х7
call CmdLCD
movlw 0C ;Включить дисплей
call CmdLCD
movlw 6
call CmdLCD
call Load_ZG ;Загрузить символы мю и омега
call ClrDSP ;Очистить дисплей
;--------------------------------------------------
clrf Key_Press_Time
btfsc PORTA, Kn_Set ;was the SET button pressed when the power was turned on? (кнопка SET нажата при включении питания?)
goto Main
;------------ режим установки констант ------------
movlw 3
movwf NC
Const_Loop
C_Kn_Set
btfsc PORTA, Kn_Set
goto C_Kn_Set_open ;waiting for the SET button to be released (ждем отпускания кнопки SET)
btfsc Flag_Key,STARTSETKEY
goto C_Kn_Set
;первоначальный момент нажатия кнопки SET
bsf Flag_Key,STARTSETKEY
btfsc Flags,SAVECONST ;флаг изменения константы
goto C_Kn_Set_save ;константа изменилась, надо сохранить
;выбор следующей константы
; incf NC,w
; xorlw b'00000011'
; btfss STATUS,Z
; xorlw b'00000011' ;максимально 3 константы
; movwf NC
incf NC,f
btfsc NC,2
bcf NC,2 ;максимально 4 константы
goto c_1
C_Kn_Set_save
call Save_Const ;константа изменилась, надо сохранить
call ClrDSP
movlw LOW _save_const ;сообщение на дисплее
call Read_String
call Delay_1_sec
goto c_1
C_Kn_Set_open
bcf Flag_Key,STARTSETKEY
C_Kn_Plus
movlw KEY_FAST*2
movwf Key_Press_Time ;начальная установка времени нажатой кнопки
C_Kn_Plus_L1
btfsc PORTA, Kn_Plus
goto C_Kn_Minus
call IncB
goto C_Kn_Plus_L1
C_Kn_Minus
movlw KEY_FAST*2
movwf Key_Press_Time ;начальная установка времени нажатой кнопки
C_Kn_Minus_L1
btfsc PORTA, Kn_Minus
goto Const_Loop
call DecB
goto C_Kn_Minus_L1
goto Const_Loop
;-------------------------------------------------------
c_1
bcf Flags,SAVECONST ;Очищаем флаг изменения константы
call ClrDSP ;Очистить дисплей
movlw LOW _Const
call Read_String
movlw HIGH $
movwf PCLATH
movf NC,W
addwf PCL,F ;табличный переход
goto const_1_ohm ;+0
goto const_10_ohm ;+1
goto const_Cx ;+2
goto const_1_Cx ;+3
c_2
call ShowX
goto Const_Loop
;-------------------------------------------------------
const_1_ohm
movlw LOW USR_1
movwf Const_ADR
call EEPROM_To_B
movlw LOW _1_ohm
call Read_String
goto c_2
;-------------------------------------------------------
const_10_ohm
movlw LOW USR_10
movwf Const_ADR
call EEPROM_To_B
movlw LOW _10_ohm
call Read_String
goto c_2
;-------------------------------------------------------
const_1_Cx
movlw LOW USR_1_Cx
movwf Const_ADR
call EEPROM_To_B
movlw LOW _1_Cx
call Read_String
goto c_2
;-------------------------------------------------------
const_Cx
movlw LOW USR_Cx
movwf Const_ADR
call EEPROM_To_B
movlw LOW _Cx
call Read_String
goto c_2
;===========================================================
Main
call TMR1_init
call TMR0_init ;TMR0 to prevent freezes when measuring capacitance
;TMR0 для предотвращения зависаний при измерении емкости
call Cx_clear ;clear Cx buffer (очистить буфер Cx)
;------------
ESR_measure
clrf U330_H
clrf U330_L
clrf U33_H
clrf U33_L
clrf Max_ADC_Count
movlw FILTER_CYCLE_MAX
movwf Filter_cycle
btfsc PORTA, Kn_Plus ;if the plus button is pressed (если нажата кнопка 'плюс')
goto ADC_Start
;------------ ESR measurement without filtering, directly from the ADC (измерение ESR без фильтрации, прямо с АЦП)
movlw ESR_start ;incl. charge, "+" and "-" remote control on Cx (вкл. заряд, "+" и "-" ДУ на Сх)
movwf PORTC
movlw 0x4 ;Delay 3.6 ms (18 cycles) for the end of the transition processes - PICK UP!!!
call Delay_go ;Задержка 3.6мкс (18 циклов) для окончания перех.процессов - ПОДОБРАТЬ!!!
bcf PORTC, In_P_Cx ;turn off Szap from Cx (отключаем Сзап от Сх)
nop ;delay one op (4 cycles @20Mhz 200ns)
bsf PORTC, Cap_Charge ;off Isar. (выкл. Iзар.)
call ADC_U330
movf ADRESH,w
movwf U330_H
bank1
movf ADRESL,W
bank0
movwf U330_L
call ADC_U33
movlw Cap_ready ;incl. discharge, "-" remote control to ground, "+" to Cx (вкл. разряд, "-" ДУ на землю, "+" на Сх)
movwf PORTC
movf ADRESH,w
movwf U33_H
bank1
movf ADRESL,W
bank0
movwf U33_L
goto ADC_End
;------------
ADC_Start
movlw BUF_COUNT_MAX
movwf Buf_Count
;clear buffers U330 and U33 (очистить буферы U330 и U33)
movlw .20
movwf Temp
movlw BUF_START_U330+.20
movwf FSR
ADC_Clear
decf FSR,f
clrf INDF
decfsz Temp,f
goto ADC_Clear
;------------ ESR measurement (Измерение ESR) ------------
ADC_Loop
movlw ESR_start ;incl. charge, "+" and "-" remote control on Cx (вкл. заряд, "+" и "-" ДУ на Сх)
movwf PORTC
movlw 0x4 ;Delay 3.6 ms (18 cycles) for the end of the transition processes - PICK UP!!!
;Задержка 3.6мкс (18 циклов) для окончания перех.процессов - ПОДОБРАТЬ!!!
call Delay_go
bcf PORTC, In_P_Cx ;turn off Szap from Cx (отключаем Сзап от Сх)
nop ;delay one op (4 cycles @20Mhz 200ns)
bsf PORTC, Cap_Charge ;off Isar. (выкл. Iзар.)
;------------
;collect ADC measurement data (собираем данные измерений АЦП)
call ADC_U330
;save the measurement result to the beginning of the buffer (сохраняем результат измерений в начало буфера)
movlw BUF_START_U330
movwf FSR
movf ADRESH,w
movwf INDF
incf FSR,f
bank1
movf ADRESL,W
bank0
movwf INDF
call ADC_U33
movlw Cap_ready ;incl. discharge, "-" remote control to ground, "+" to Cx (вкл. разряд, "-" ДУ на землю, "+" на Сх)
movwf PORTC
;save the measurement result to the beginning of the buffer (сохраняем результат измерений в начало буфера)
movlw BUF_START_U33
movwf FSR
movf ADRESH,w
movwf INDF
incf FSR,f
bank1
movf ADRESL,W
bank0
movwf INDF
;buffer sorting U330 (сортировка буфера U330)
movlw BUF_START_U330
call Buf_Sorting
;buffer sorting U330 (сортировка буфера U33)
movlw BUF_START_U33
call Buf_Sorting
call Delay_200_us
call Delay_200_us
;make several measurements to fill and sort buffers U330 and U33
;делаем несколько измерений для заполнения и сортировки буферов U330 и U33
decfsz Buf_Count,f
goto ADC_Loop
;add all U330 measurements to the median (складываем все измерения U330 с медианой)
movlw LOW MEDIAN_U330
movwf FSR
movf INDF,w ;INDF(LOW MEDIAN_U330)
decf FSR,f
addwf U330_L,f
movf INDF,w ;INDF(HIGH MEDIAN_U330)
btfsc STATUS,C
incfsz INDF,w ;INDF(HIGH MEDIAN_U330)
addwf U330_H,f
;add all U33 measurements to the median (складываем все измерения U33 с медианой)
movlw LOW MEDIAN_U33
movwf FSR
movf INDF,w ;INDF(LOW MEDIAN_U33)
decf FSR,f
addwf U33_L,f
movf INDF,w ;INDF(HIGH MEDIAN_U33)
btfsc STATUS,C
incfsz INDF,w ;INDF(HIGH MEDIAN_U33)
addwf U33_H,f
decfsz Filter_cycle,f
goto ADC_Start
ADC_ROUND_U330 ; unused label
;------------
;find the average for U330 and round the result (находим среднее для U330 и округление результата)
bcf STATUS,C
movlw b'11110000'
andwf U330_L,f
rrf U330_H,f ;divide by 2 (делим на 2)
rrf U330_L,f
rrf U330_H,f ;divide by 4 (делим на 4)
rrf U330_L,f
btfss STATUS,C
goto ADC_ROUND_U33
incf U330_H,f ;rounding, +1 to U330 (округление, +1 к U330)
incfsz U330_L,f
decf U330_H,f
ADC_ROUND_U33
;find the average for U33 and round the result (находим среднее для U33 и округление результата)
bcf STATUS,C
movlw b'11110000'
andwf U33_L,f
rrf U33_H,f ;divide by 2 (делим на 2)
rrf U33_L,f
rrf U33_H,f ;divide by 2 (делим на 4)
rrf U33_L,f
btfss STATUS,C
goto ADC_End
incf U33_H,f ;rounding, +1 to U33 (округление, +1 к U33)
incfsz U33_L,f
decf U33_H,f
ADC_End
;------------ If ESR>10 ohm, no capacitance measurement -----------------
;------------ Если ESR>10 Ом, измерение емкости не выполняем ------------
clrf Flags
; ; "Reparando de todo" Youtube channel force Cx measurement.
; movlw 0x03
; subwf U33_H,W ;if ADC readings>=0x300 (768) (если показания АЦП>=0x300 (768))
; btfss STATUS,C
; goto Cx_start ;switch to capacitance measurement (переход на измерение емкости)
; bsf Flags,TIMEOUT ;raise the Time Out flag (взводим флаг Time Out)
; goto Cx_end
;------------ Skip capacitance measurement for ESR DEBUG
; goto Disp_ESR
;------------ Capacitor capacitance measurement ---------
;------------ Измерение емкости конденсатора ------------
Cx_start
movlw Cap_ready ;incl. discharge, "-" remote control to ground, "+" to Cx (вкл. разряд, "-" ДУ на землю, "+" на Сх)
movwf PORTC
;reset timers to initial state (сбросить таймеры в исходное состояние)
clrf TMR0
movlw Max_Count ;.50 maximum number of TMR0 overflows when counting
movwf TMR0_Count ;initial value of overflow counter TMR0 (начальное значение счетчика переполнений TMR0)
clrf TMR1L
clrf TMR1H
clrf TMR1_Count
bsf INTCON,GIE ;enable interrupts (разрешить прерывания)
Cx_0
btfsc Flags,TIMEOUT ;checking the Time Out flag (проверка флага Time Out)
goto Cx_end
btfss PORTC, Comp_Low ;1 - Cx is discharged (Comp_Low = 1 -> U33 < 1.0v) (1 - Cx разрядился)
goto Cx_0 ;wait again 200 µs (ждем снова 200 мкс)
call Delay_200_us ;delay to be sure (для надежности еще задержка)
call Delay_200_us
movlw 0x03
subwf U330_H,W ;if ADC readings>=0x300 (768) (если показания АЦП>=0x300 (768))
btfss STATUS,C ;those. ESR>1 Ohm, capacitance is measured with ESR compensation (т.е. ESR>1 Ом, емкость измеряем с компенсацией ESR)
goto Cx_1
movlw Cap_start2 ;incl. charge, "-" RC on Cx, "+" on (вкл. заряд, "-" ДУ на Cx, "+" на Сх)
movwf PORTC
movlw 0x4 ;Delay 3.6 us (18 cycles) for charge C on the "-" input of the remote control (Задержка 3.6мкс (18 циклов) для заряда С на "-" входе ДУ)
call Delay_go
bcf PORTC,In_N_Cx ;turn off the "-" remote control input from Cxx (отключаем "-" вход ДУ от Сх)
goto Cx_2
Cx_1
movlw Cap_start ;incluido carga, "-" control remoto a tierra, "+" a Cx (вкл. заряд, "-" ДУ на землю, "+" на Сх)
movwf PORTC
Cx_2 ;wait until U33 > 1.0v and start timer-1
btfsc Flags,TIMEOUT ;checking the Time Out flag (проверка флага Time Out)
goto Cx_end
btfsc PORTC, Comp_Low ;0 - Cx charged to the lower limit (U33 > 1.0v) (0 - Cx зарядился до нижней границы)
goto Cx_2
bsf T1CON, TMR1ON ;start timer TMR1 (запускаем таймер TMR1)
Cx_3 ;wait until U33 > 2.0v and stop timer-1
btfss PORTC,Comp_Up ;0 - Cx charged to the upper limit (U33 > 2.0v) (0 - Cx зарядился до верхней границы)
bcf T1CON, TMR1ON ;stop TMR1 (остановить TMR1)
btfss PORTC,Comp_Up ;0 - Cx charged to the upper limit (U33 > 2.0v) (0 - Cx зарядился до верхней границы)
bcf T1CON, TMR1ON ;stop TMR1 (остановить TMR1)
btfss PORTC,Comp_Up ;0 - Cx charged to the upper limit (U33 > 2.0v) (0 - Cx зарядился до верхней границы)
bcf T1CON, TMR1ON ;stop TMR1 (остановить TMR1)
btfss PORTC,Comp_Up ;0 - Cx charged to the upper limit (U33 > 2.0v) (0 - Cx зарядился до верхней границы)
bcf T1CON, TMR1ON ;stop TMR1 (остановить TMR1)
btfss PORTC,Comp_Up ;0 - Cx charged to the upper limit (U33 > 2.0v) (0 - Cx зарядился до верхней границы)
bcf T1CON, TMR1ON ;stop TMR1(остановить TMR1)
btfsc Flags,TIMEOUT ;Comprobación de la bandera de tiempo de espera (проверка флага Time Out)
goto Cx_end
btfsc PORTC,Comp_Up ;0 - Cx charged to the upper limit (U33 > 2.0v) (0 - Cx зарядился до верхней границы)
goto Cx_3
bcf T1CON, TMR1ON ;stop TMR1 (остановить TMR1)
;--------------------------------------------------------
Cx_end
bcf INTCON,GIE ;disable interrupts (запрещаем прерывания)
movlw Cap_ready ;discharge, "-" remote control to ground, "+" to Cx (вкл. разряд, "-" ДУ на землю, "+" на Сх)
movwf PORTC
;--------------------------------------------------------
;We display the result on the indicator (Выводим результат на индикатор)
call ClrDSP ;clear display (Очистить дисплей)
btfss Flags,TIMEOUT ;Checking for timeout flag
goto Disp_Cx ;If not timeout jump tp display Cx
movlw LOW _Time_out ;If timeout flag is set
call Read_String ;show Cx --- timeout
call Cx_clear ;clear Cx buffer (очистить буфер Cx)
goto Disp_ESR ;skip display Cx, jump to display ESR
;--------------------------------------------------------
Disp_Cx
;load new measurement data into median filter Cx, removing oldest measurement
;загрузить новые данные измерений в медианный фильтр Cx, удалив самое старое измерение
movf Index_Buf_Cx,w
movwf FSR
movf TMR1_Count,w
movwf INDF
incf FSR,f
movf TMR1H,w
movwf INDF
incf FSR,f
movf TMR1L,w
movwf INDF
;move the pointer to the next old buffer element (перевести указатель следующий старый элемент буфера)
movlw .3 ;bytes in one dimension (байт в одном измерении)
addwf Index_Buf_Cx,f
movlw BUF_CX_END
subwf Index_Buf_Cx,w
movlw Buf_Cx_1
btfsc STATUS,C
movwf Index_Buf_Cx ;pointer to the beginning of the buffer (it is looped) (указатель на начало буфера (он закольцован))
;sort and filter result back to TMR1_Count, TMR1H, TMR1L (сортировка и результат фильтра назад в TMR1_Count, TMR1H, TMR1L)
call Buf_Sorting_Cx
;------------
movlw LOW _Cx
call Read_String
movlw LOW USR_1_Cx
call EEPROM_To_A ;A = USR_1_Cx
call FLO2424 ;Integer to float conversion --> A = float(A)
movlw LOW add_Cx
call EEPROM_To_B ;B = add_Cx
call FPS24 ;A = A - B --> A = float(USR_1_Cx) - add_Cx
call BEQUA ;B = A --> B = float(USR_1_Cx) - add_Cx
clrf AEXP ;A = TMR1_Count, TMR1H, TMR1L
movf TMR1_Count,W
movwf AARGB0
movf TMR1H,W
movwf AARGB1
movf TMR1L,W
movwf AARGB2
btfsc PORTA, Kn_Plus ;If the plus button is pressed, then the test output
goto Calc_Cx
call BCD ;Если нажата кнопка плюс, то тестовый вывод
movlw BCD4 ;timer without processing (таймера без обработки)
call Disp_Full
goto Disp_ESR
Calc_Cx
call FLO2424 ;Integer to float conversion A = float(A) --> A = integer(AARGB0, AARGB1, AARGB2)
call FPA24 ;A = A + B
;A = float(integer(TMR1_Count,TMR1H,TMR1L)) + float(USR_1_Cx) - add_Cx
movlw low M_Cx
call EEPROM_To_B ;B = M_Cx
call FPM24 ;A = A * B
;A = (float(integer(TMR1_Count,TMR1H,TMR1L)) + float(USR_1_Cx) - add_Cx) * M_Cx
movlw low USR_Cx
call X_To_B ;review needed
;round up (округлить)
movlw 0x7E
movwf BEXP
movlw 0x00
movwf BARGB0
movlw 0x00
movwf BARGB1 ; B = 0.5
bcf FPFLAGS,RND
call FPA24 ; A = A + 0.5 (Round)
call INT2424 ; Float to INT rounded to nearest whole number (Float в INT c округлением до ближайшего целого числа)
clrf AEXP
call BCD
bsf Flags,INSIGZERO ;do not display leading zeros (не выводить лидирующие нули)
movlw 3
movwf NZ ;number of significant digits, the rest will be 0 (число значащих разрядов, остальные будут 0)
bsf Flags,DISCHARGE ;enable value checking. discharges at output (включить проверку знач. разрядов при выводе)
movlw BCD3
call DispBCD
movlw BCD3 ;показания увеличены в 10 раз,
call DispBCD ;здесь сотни тысяч мкФ
movlw BCD2 ;десятки тысяч мкФ
call DispBCD
movlw BCD2 ;тысячи мкФ
call DispBCD
; если впереди были одни нули, разделитель не выводим
btfsc Flags,INSIGZERO
goto next_1
movlw " " ;разделитель тысяч
call CharLCD
next_1
movlw BCD1 ;сотни мкФ
call DispBCD
btfsc Flags,INSIGZERO ;до сотен небыло значащих цифр,
bsf Flags,POINT ;будем выводить десятые доли мкФ
movlw BCD1 ;десятки мкФ
call DispBCD
bcf Flags,INSIGZERO ;проверка на =0 не нужна, выводим все подряд
movlw BCD0 ;единицы мкФ
call DispBCD
btfss Flags,POINT ;нужен ли вывод десятичной точки
goto next_2 ;нет
bcf Flags,POINT ;да
call DispDot ;десятичная точка
movlw BCD0 ;десятые мкФ
call DispBCD
next_2
call DispSP
movlw 2 ;код мю
call CharLCD
movlw "F"
call CharLCD
;----------------------------
Disp_ESR
btfss PORTA, Kn_Plus ;if the plus button is pressed (если нажата кнопка 'плюс')
goto tst_ESR ;ESR measurement without filtering, directly from the ADC (измерение ESR без фильтрации, прямо с АЦП)
bcf Flags,CHECK10OM ;clear flag more than 10 ohms (сброс флага больше 10 Ом)
movlw 0x03
subwf U330_H,W ;if ADC readings>=0x0300 (768) (если показания АЦП>=0x300 (768))
;btfsc STATUS,C ;check the second channel (10 Ohm) (проверяем второй канал (10 Ом))
;if ADC readings>=0x0377 (880) check the second channel (10 Ohm)
btfss STATUS,C
goto chk_10
movlw 0x70
subwf U330_L,W
btfsc STATUS,C
goto chk_10
;Channel 1 ohm (Канал 1 Ом)
call ClrA
movf U330_H,W ;amplifier Ku=330, limit 1 ohm (усилитель Ку=330, предел 1 Ом)
movwf AARGB0
movf U330_L,W
movwf AARGB1
call FLO1624 ;to 24 bit floating point
movlw low U0_ESR_1
call EEPROM_To_B