diff --git a/definitions.asm b/definitions.asm
index de2c775..e9bd29a 100644
--- a/definitions.asm
+++ b/definitions.asm
@@ -58,4 +58,17 @@
.EQU MCU_STATE_DEFAULT = 0x00 ; Режим измерения температуры и сравнения с заданными параметрами
.EQU MCU_STATE_PROGRAM = 0x01 ; Режим настройки параметров в EEPROM
-.EQU MCU_STATE_ERROR = 0x02 ; Режим ошибки, например когда не подключен датчик
\ No newline at end of file
+.EQU MCU_STATE_ERROR = 0x02 ; Режим ошибки, например когда не подключен датчик
+
+; **** СТАНДАРТНЫЕ ПАРАМЕТРЫ ***********************************
+
+; Отдельно задается целая и дробная часть в точности до десятых
+; Например: 30.5 градусов
+.EQU DEFAULT_SETTING_INT = 29
+.EQU DEFAULT_SETTING_F = 5 // 0.5
+
+.EQU DEFAULT_SETTING_HYST = 5 // 0.5
+
+.EQU HEAT_MODE = 1
+.EQU COOLING_MODE = 0
+.EQU DEFAULT_SETTING_MODE = HEAT_MODE
\ No newline at end of file
diff --git a/dist/default/production/attiny2313a_thermostat.X.production.hex b/dist/default/production/attiny2313a_thermostat.X.production.hex
index 516688e..c61bc10 100644
--- a/dist/default/production/attiny2313a_thermostat.X.production.hex
+++ b/dist/default/production/attiny2313a_thermostat.X.production.hex
@@ -7,59 +7,65 @@
:10004A000F931F935FB74091670045300CF403C0CC
:10005A00442740936700403081F493989498959888
:10006A000EF002C00BE002C000916500002311F0FF
-:10007A00929A01C092986BD1E6D0413081F492985D
+:10007A00929A01C0929898D113D1413081F4929802
:10008A00949895980091640030916500032B11F0C3
-:10009A00939A01C093980091640059D1D4D0423008
-:1000AA0059F4929893989598949A009163004FD135
-:1000BA00002D0F77002EC7D0433041F492989398C1
-:1000CA009498959A00916C0042D1BDD04395409383
+:10009A00939A01C093980091640086D101D14230AD
+:1000AA0059F4929893989598949A009163007CD108
+:1000BA00002D0F77002EF4D0433041F49298939894
+:1000CA009498959A00916B006FD1EAD0439540932A
:1000DA0067005FBF1F910F915F914F9118950FEDC8
:1000EA000DBF0FE701BB01EE07BB0CE108BB02E045
:1000FA0000BF05E003BF09E106BF00E20BBF0CE148
-:10010A0000BD11241092670000E0009360000027F0
-:10011A0000936A0000936B0000EF00936C0022D1F9
-:10012A0080E090E000916000003029F49698F5D0C4
-:10013A0027D001E009BF013019F49698EED08FD08C
-:10014A00023081F7969A1BE01093630010936400C3
-:10015A001093650010936600E5CFEE24FF1841E185
-:10016A00001F111F4A9509F40895EE1CFF1CE21A9C
-:10017A00F30A20F4E20EF31E8894F2CF0894F0CF2B
-:10018A001F9357D052E13DE84DEF0BD108D01091A3
-:10019A006A00812F10916B00912F1F9108950F9380
-:1001AA001F932F933F934F9368D00CEC802E7AD0F5
-:1001BA000EEB802E77D0AAE6B0E095D0ABE6B0E0A1
-:1001CA0092D010916A0020916B002F93287F283FCC
-:1001DA0011F0E89409C02F9168941095209531E0A8
-:1001EA00130F30E0231F01C02F91269517952695EE
-:1001FA001795269517952695179530916A000EF44E
-:10020A003195432F3F70432F330F330F330F440F72
-:10021A00340F369536953695369510936A002093A5
-:10022A006B0030936C004F913F912F911F910F916A
-:10023A0008950F9322D00CEC802E34D004E4802E43
-:10024A0031D00F9108950F930FB800E40EB90BE166
-:10025A000DB9769BFDCFC09AC0980F9108950F9360
-:10026A008CD0B29B0196B39B0197B49B01C003C08B
-:10027A0000E0009360000F910895F894B99A33E072
-:10028A004EEB8BD0B99830E04AE887D005D033E0FE
-:10029A0042E383D078940895B19B716002C0B1990A
-:1002AA007E7F08950F931F93082D18E0069508F492
-:1002BA0058F0F894B99A30E046E76FD0B99830E030
-:1002CA0042E16BD078940AC0F894B99A30E04AE0D7
-:1002DA0064D0B99830E04EE760D078941A9531F737
-:1002EA001F910F9108950F931F93002718E0F89418
-:1002FA000695B99A30E04AE050D0B99830E040E12A
-:10030A004CD0B199006830E04CE647D01A9581F795
-:10031A000C9378941F910F910895F8945F9354E089
-:10032A00A3E6B0E0809361009093620000916100BF
-:10033A00109162002AE030E010DFED920093610034
-:10034A00109362005A9591F75F91789408950F93EC
-:10035A001F93E6EDF3E01127E00FF11F04901F91C0
-:10036A000F910895C59A22D0C5980895C59A1ED0AE
-:10037A001DD01CD01BD0C59808950F931F932F939F
-:10038A002AE01FEF0FEF0A95F1F71A95D9F72A9588
-:10039A00C1F72F911F910F91089541503040E8F70E
-:1003AA000895415030405040E0F708950F931F934D
-:1003BA002F9326E00FEF1FEF1A95F1F70A95D9F759
-:1003CA002A95C1F72F911F910F910895C0F9A4B0F2
-:0803DA00999282F880909CBF0B
+:10010A0000BD11241092670000E0009360000DE129
+:10011A0000936C0005E000936D0005E000936E000B
+:10012A0001E000936F0000270093690000936A00C2
+:10013A0000EF00936B0050D000917000003109F479
+:10014A0005C012E0109360003ED101C038D180E0B2
+:10015A0090E000916000003031F496980BD129D0DC
+:10016A0001E009BF25D0013019F4969803D1A4D033
+:10017A00023079F7969A1BE010936300109364009B
+:10018A001093650010936600E4CFEE24FF1841E156
+:10019A00001F111F4A9509F40895EE1CFF1CE21A6C
+:1001AA00F30A20F4E20EF31E8894F2CF0894F0CFFB
+:1001BA0008951F936BD05CE034E34DEF1FD15CE0F0
+:1001CA0034E34DEF1BD118D010916900812F1091A3
+:1001DA006A00912F1F9108950F937CD00CEC802E0A
+:1001EA008ED00EEB802E8BD0A0E7B0E008E0A8D02E
+:1001FA000A95E9F70F9108950F931F932F933F9351
+:10020A004F9368D00CEC802E7AD00EEB802E77D0EC
+:10021A00A9E6B0E095D0AAE6B0E092D010916900C4
+:10022A0020916A002F93287F283F11F0E89409C093
+:10023A002F9168941095209531E0130F30E0231F19
+:10024A0001C02F91269517952695179526951795EE
+:10025A0026951795309169000EF43195432F3F701A
+:10026A00432F330F330F330F440F340F3695369520
+:10027A00369536951093690020936A0030936B0087
+:10028A004F913F912F911F910F9108950F9322D073
+:10029A000CEC802E34D004E4802E31D00F910895D6
+:1002AA000F930FB800E40EB90BE10DB9769BFDCFA1
+:1002BA00C09AC0980F9108950F938CD0B29B019663
+:1002CA00B39B0197B49B01C003C000E00093600098
+:1002DA000F910895F894B99A33E04EEB8BD0B99800
+:1002EA0030E04AE887D005D033E042E383D07894FF
+:1002FA000895B19B716002C0B1997E7F08950F93F2
+:10030A001F93082D18E0069508F458F0F894B99A46
+:10031A0030E046E76FD0B99830E042E16BD078948C
+:10032A000AC0F894B99A30E04AE064D0B99830E04B
+:10033A004EE760D078941A9531F71F910F9108957E
+:10034A000F931F93002718E0F8940695B99A30E0A6
+:10035A004AE050D0B99830E040E14CD0B1990068F9
+:10036A0030E04CE647D01A9581F70C9378941F91A8
+:10037A000F910895F8945F9354E0A3E6B0E0809358
+:10038A0061009093620000916100109162002AE07E
+:10039A0030E0FBDEED9200936100109362005A9503
+:1003AA0091F75F91789408950F931F93E0E3F4E037
+:1003BA001127E00FF11F04901F910F910895C59A1C
+:1003CA0022D0C5980895C59A1ED01DD01CD01BD026
+:1003DA00C59808950F931F932F932AE01FEF0FEFED
+:1003EA000A95F1F71A95D9F72A95C1F72F911F9116
+:1003FA000F91089541503040E8F708954150304038
+:10040A005040E0F708950F931F932F9326E00FEFC4
+:10041A001FEF1A95F1F70A95D9F72A95C1F72F9187
+:10042A001F910F910895C0F9A4B0999282F8809013
+:02043A009CBF65
:00000001FF
diff --git a/dist/default/production/attiny2313a_thermostat.X.production.lss b/dist/default/production/attiny2313a_thermostat.X.production.lss
index 36c17bb..7167675 100644
--- a/dist/default/production/attiny2313a_thermostat.X.production.lss
+++ b/dist/default/production/attiny2313a_thermostat.X.production.lss
@@ -1,26 +1,26 @@
-AVRASM ver. 2.2.7 main.asm Fri Jun 23 16:35:36 2023
+AVRASM ver. 2.2.7 main.asm Sat Jun 24 17:26:02 2023
[builtin](2): Including file '/home/sergeyyarkov/.mchp_packs/Microchip/ATtiny_DFP/3.0.151/avrasm/inc\tn2313Adef.inc'
main.asm(15): Including file 'definitions.asm'
main.asm(16): Including file 'macros.asm'
-main.asm(265): Including file 'div16u.asm'
+main.asm(294): Including file 'div16u.asm'
div16u.asm(22): warning: Register r16 already defined by the .DEF directive
-main.asm(265): 'div16u.asm' included form here
+main.asm(294): 'div16u.asm' included form here
div16u.asm(23): warning: Register r17 already defined by the .DEF directive
-main.asm(265): 'div16u.asm' included form here
+main.asm(294): 'div16u.asm' included form here
div16u.asm(24): warning: Register r16 already defined by the .DEF directive
-main.asm(265): 'div16u.asm' included form here
+main.asm(294): 'div16u.asm' included form here
div16u.asm(25): warning: Register r17 already defined by the .DEF directive
-main.asm(265): 'div16u.asm' included form here
+main.asm(294): 'div16u.asm' included form here
div16u.asm(27): warning: Register r19 already defined by the .DEF directive
-main.asm(265): 'div16u.asm' included form here
+main.asm(294): 'div16u.asm' included form here
div16u.asm(28): warning: Register r20 already defined by the .DEF directive
-main.asm(265): 'div16u.asm' included form here
+main.asm(294): 'div16u.asm' included form here
[builtin](2): Including file '/home/sergeyyarkov/.mchp_packs/Microchip/ATtiny_DFP/3.0.151/avrasm/inc\tn2313Adef.inc'
main.asm(15): Including file 'definitions.asm'
main.asm(16): Including file 'macros.asm'
-main.asm(265): Including file 'div16u.asm'
+main.asm(294): Including file 'div16u.asm'
;
@@ -796,6 +796,19 @@ main.asm(265): Including file 'div16u.asm'
.EQU MCU_STATE_DEFAULT = 0x00 ; Режим измерения температуры и сравнения с заданными параметрами
.EQU MCU_STATE_PROGRAM = 0x01 ; Режим настройки параметров в EEPROM
+ .EQU MCU_STATE_ERROR = 0x02 ; Режим ошибки, например когда не подключен датчик
+
+ ; **** СТАНДАРТНЫЕ ПАРАМЕТРЫ ***********************************
+
+ ; Отдельно задается целая и дробная часть в точности до десятых
+ ; Например: 30.5 градусов
+ .EQU DEFAULT_SETTING_INT = 29
+ .EQU DEFAULT_SETTING_F = 5 // 0.5
+
+ .EQU DEFAULT_SETTING_HYST = 5 // 0.5
+
+ .EQU HEAT_MODE = 1
+ .EQU COOLING_MODE = 0
.INCLUDE "macros.asm"
ldi @0, @2
@@ -847,10 +860,14 @@ main.asm(265): Including file 'div16u.asm'
000063 DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
000067 CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
000068 SW_FLAGS: .BYTE 1 ; Состояние кнопок
-000069 HYSTERESIS: .BYTE 1 ; Отклонение температуры от уставки
-00006a TEMP_L: .BYTE 1 ; Младший байт температуры
-00006b TEMP_H: .BYTE 1 ; Старший байт температуры
-00006c TEMP_F: .BYTE 1 ; Дробная часть
+000069 TEMP_L: .BYTE 1 ; Младший байт температуры
+00006a TEMP_H: .BYTE 1 ; Старший байт температуры
+00006b TEMP_F: .BYTE 1 ; Дробная часть
+00006c SETTING_INT: .BYTE 1 ; Уставка: целая часть
+00006d SETTING_F: .BYTE 1 ; Уставка: дробная часть
+00006e SETTING_HYST: .BYTE 1 ; Гистерезис: отклонение от уставки
+00006f SETTING_MODE: .BYTE 1 ; Режим работы: '1' - нагрев; '0' - 'охлаждение'
+000070 DEVICE_FAMILY_CODE: .BYTE 1 ; Должно быть 0x10 для DS18B20
;//
@@ -941,8 +958,8 @@ main.asm(265): Including file 'div16u.asm'
00003d 9a92 sbi PORTD, DIGIT_1_PIN
00003e c001 rjmp PC+2
00003f 9892 cbi PORTD, DIGIT_1_PIN
-000040 d16b rcall DISPLAY_DECODER
-000041 d0e6 rcall USI_TRANSMIT
+000040 d198 rcall DISPLAY_DECODER
+000041 d113 rcall USI_TRANSMIT
_indicate_2:
000042 3041 cpi r20, 1
@@ -959,8 +976,8 @@ main.asm(265): Including file 'div16u.asm'
00004e c001 rjmp PC+2
00004f 9893 cbi PORTD, DIGIT_2_PIN
000050 9100 0064 lds TEMP_REG_A, DIGITS+1
-000052 d159 rcall DISPLAY_DECODER
-000053 d0d4 rcall USI_TRANSMIT
+000052 d186 rcall DISPLAY_DECODER
+000053 d101 rcall USI_TRANSMIT
_indicate_3:
000054 3042 cpi r20, 2
@@ -971,12 +988,12 @@ main.asm(265): Including file 'div16u.asm'
000058 9895 cbi PORTD, DIGIT_4_PIN
000059 9a94 sbi PORTD, DIGIT_3_PIN
00005a 9100 0063 lds TEMP_REG_A, DIGITS
-00005c d14f rcall DISPLAY_DECODER
+00005c d17c rcall DISPLAY_DECODER
; зажигаем точку
00005d 2d00 mov r16, r0
00005e 770f cbr r16, (1<<7)
00005f 2e00 mov r0, r16
-000060 d0c7 rcall USI_TRANSMIT
+000060 d0f4 rcall USI_TRANSMIT
_indicate_4:
000061 3043 cpi r20, 3
@@ -986,9 +1003,9 @@ main.asm(265): Including file 'div16u.asm'
000064 9893 cbi PORTD, DIGIT_2_PIN
000065 9894 cbi PORTD, DIGIT_3_PIN
000066 9a95 sbi PORTD, DIGIT_4_PIN
-000067 9100 006c lds TEMP_REG_A, TEMP_F
-000069 d142 rcall DISPLAY_DECODER
-00006a d0bd rcall USI_TRANSMIT
+000067 9100 006b lds TEMP_REG_A, TEMP_F
+000069 d16f rcall DISPLAY_DECODER
+00006a d0ea rcall USI_TRANSMIT
_indicate_exit:
00006b 9543 inc r20
@@ -1010,50 +1027,74 @@ main.asm(265): Including file 'div16u.asm'
//
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
MCU_INIT:
- ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
+ ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
000076 e70f
-000077 bb01 outi r16, DDRD, (1<
@@ -1062,33 +1103,34 @@ main.asm(265): Including file 'div16u.asm'
; **** ГЛАВНЫЙ ЦИКЛ **********************************************
LOOP:
; rcall DISPLAY_UPD_DIGITS
-000097 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК
+0000ae 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК
_STATE_DEFAULT:
-000099 3000 cpi r16, MCU_STATE_DEFAULT
-00009a f429 brne _STATE_PROGRAM
-00009b 9896 cbi LED_ERR_PORT, LED_ERR_PIN
-00009c d0f5 rcall DISPLAY_UPD_DIGITS
-00009d d027 rcall TEMP_UPD
-00009e e001
-00009f bf09 outi r16, TIMSK, (1<
@@ -1126,167 +1168,268 @@ main.asm(265): Including file 'div16u.asm'
;***** Code
div16u:
-0000b2 24ee clr drem16uL ; clear remainder Low byte
-0000b3 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
-0000b4 e141 ldi dcnt16u,17 ; init loop counter
+0000ca 24ee clr drem16uL ; clear remainder Low byte
+0000cb 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
+0000cc e141 ldi dcnt16u,17 ; init loop counter
d16u_1:
-0000b5 1f00 rol dd16uL ; shift left dividend
-0000b6 1f11 rol dd16uH
-0000b7 954a dec dcnt16u ; decrement counter
-0000b8 f409 brne d16u_2 ; if done
-0000b9 9508 ret ; return
+0000cd 1f00 rol dd16uL ; shift left dividend
+0000ce 1f11 rol dd16uH
+0000cf 954a dec dcnt16u ; decrement counter
+0000d0 f409 brne d16u_2 ; if done
+0000d1 9508 ret ; return
d16u_2:
-0000ba 1cee rol drem16uL ; shift dividend into remainder
-0000bb 1cff rol drem16uH
-0000bc 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
-0000bd 0af3 sbc drem16uH,dv16uH
-0000be f420 brcc d16u_3 ; if result negative
-0000bf 0ee2 add drem16uL,dv16uL ; restore remainder
-0000c0 1ef3 adc drem16uH,dv16uH
-0000c1 9488 clc ; clear carry to be shifted into result
-0000c2 cff2 rjmp d16u_1 ; else
+0000d2 1cee rol drem16uL ; shift dividend into remainder
+0000d3 1cff rol drem16uH
+0000d4 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
+0000d5 0af3 sbc drem16uH,dv16uH
+0000d6 f420 brcc d16u_3 ; if result negative
+0000d7 0ee2 add drem16uL,dv16uL ; restore remainder
+0000d8 1ef3 adc drem16uH,dv16uH
+0000d9 9488 clc ; clear carry to be shifted into result
+0000da cff2 rjmp d16u_1 ; else
d16u_3:
-0000c3 9408 sec ; set carry to be shifted into result
-0000c4 cff0
+0000db 9408 sec ; set carry to be shifted into result
+0000dc cff0
+ TEMP_COMPARSION:
+ ; push r16
+ ; push r17
+ ; push r18
+ ; push r19
+ ; push r20
+ ; push r21
+ ; push r22
+ ;
+ ; lds r16, TEMP_L
+ ; lds r17, TEMP_H // всегда 0?
+ ; lds r18, TEMP_F
+ ; lds r19, SETTING_INT
+ ; lds r20, SETTING_F
+ ; lds r21, SETTING_MODE
+ ;
+ ; brtc _START_COMPARSION
+ ; neg r19
+ ;
+ ;_START_COMPARSION:
+ ; tst r21
+ ; brne _HEATING
+ ;_COOLING:
+ ; rjmp _COMPARSION_EXIT
+ ;_HEATING:
+ ; cp r16, r19
+ ; brge _HEATING_GREATER_OR_E ; если целая часть текущей температуры <= уставки - продолжаем сравнение
+ ; brtc PC+3
+ ; relay_off
+ ; rjmp PC+2
+ ; relay_on ; c
+ ; rjmp _COMPARSION_EXIT
+ ;_HEATING_GREATER_OR_E:
+ ; cp r16, r19
+ ; breq _HEATING_GREATER_E
+ ; brtc PC+3
+ ; relay_on
+ ; rjmp PC+2
+ ; relay_off ; c
+ ; rjmp _COMPARSION_EXIT
+ ;_HEATING_GREATER_E:
+ ; brtc PC+3
+ ; relay_off
+ ; rjmp PC+2
+ ; relay_on ; c
+ ; cp r18, r20
+ ; brge PC+2 ; если дробная часть текущей температуры >= уставки - выключаем реле
+ ; rjmp _COMPARSION_EXIT
+ ;_HEATING_GREATER_OR_E_F:
+ ; cp r18, r20
+ ; breq _HEATING_GREATER_E_F
+ ; brtc PC+3
+ ; relay_on
+ ; rjmp PC+2
+ ; relay_off ; c
+ ; rjmp _COMPARSION_EXIT
+ ;_HEATING_GREATER_E_F:
+ ; brtc PC+3
+ ; relay_on
+ ; rjmp PC+2
+ ; relay_off ; c
+ ;
+ ;_COMPARSION_EXIT:
+ ; pop r22
+ ; pop r21
+ ; pop r20
+ ; pop r19
+ ; pop r18
+ ; pop r17
+ ; pop r16
+0000dd 9508 ret
+
//
TEMP_UPD:
-0000c5 931f push r17
-0000c6 d057 rcall TEMP_CONV
-0000c7 e152
-0000c8 e83d
-0000c9 ef4d
-0000ca d10b DELAY24 760000
-0000cb d008 rcall TEMP_RD
+0000de 931f push r17
+0000df d06b rcall TEMP_CONV
+0000e0 e05c
+0000e1 e334
+0000e2 ef4d
+0000e3 d11f DELAY24 500000
+0000e4 e05c
+0000e5 e334
+0000e6 ef4d
+0000e7 d11b DELAY24 500000
+0000e8 d018 rcall TEMP_RD
; обновляем данные в ячейках
-0000cc 9110 006a lds r17, TEMP_L
-0000ce 2f81 mov DISP_NUM_L, r17
-0000cf 9110 006b lds r17, TEMP_H
-0000d1 2f91 mov DISP_NUM_H, r17
-0000d2 911f pop r17
-0000d3 9508 ret//
+0000e9 9110 0069 lds r17, TEMP_L
+0000eb 2f81 mov DISP_NUM_L, r17
+0000ec 9110 006a lds r17, TEMP_H
+0000ee 2f91 mov DISP_NUM_H, r17
+0000ef 911f pop r17
+0000f0 9508 ret
+ //
+
+ //
+ RD_F_CODE:
+0000f1 930f push r16
+
+0000f2 d07c rcall OW_PRESENCE
+0000f3 ec0c ldi r16, DS18B20_CMD_SKIPROM
+0000f4 2e80 mov OW_CMD_r, r16
+0000f5 d08e rcall OW_SEND_BYTE
+
+0000f6 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD
+0000f7 2e80 mov OW_CMD_r, r16
+0000f8 d08b rcall OW_SEND_BYTE
+
+0000f9 e7a0 ldi XL, LOW(DEVICE_FAMILY_CODE)
+0000fa e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE)
+
+0000fb e008 ldi r16, 8
+ _RD_L:
+0000fc d0a8 rcall OW_RD_BYTE
+0000fd 950a dec r16
+0000fe f7e9 brne _RD_L
+
+0000ff 910f pop r16
+000100 9508 ret//
-
//
TEMP_RD:
-0000d4 930f push r16
-0000d5 931f push r17
-0000d6 932f push r18
-0000d7 933f push r19
-0000d8 934f push r20
+000101 930f push r16
+000102 931f push r17
+000103 932f push r18
+000104 933f push r19
+000105 934f push r20
; cli
-0000d9 d068 rcall OW_PRESENCE
-0000da ec0c ldi r16, DS18B20_CMD_SKIPROM
-0000db 2e80 mov OW_CMD_r, r16
-0000dc d07a rcall OW_SEND_BYTE
+000106 d068 rcall OW_PRESENCE
+000107 ec0c ldi r16, DS18B20_CMD_SKIPROM
+000108 2e80 mov OW_CMD_r, r16
+000109 d07a rcall OW_SEND_BYTE
-0000dd eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD
-0000de 2e80 mov OW_CMD_r, r16
-0000df d077 rcall OW_SEND_BYTE
+00010a eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD
+00010b 2e80 mov OW_CMD_r, r16
+00010c d077 rcall OW_SEND_BYTE
-0000e0 e6aa ldi XL, LOW(TEMP_L)
-0000e1 e0b0 ldi XH, HIGH(TEMP_L)
-0000e2 d095 rcall OW_RD_BYTE
+00010d e6a9 ldi XL, LOW(TEMP_L)
+00010e e0b0 ldi XH, HIGH(TEMP_L)
+00010f d095 rcall OW_RD_BYTE
-0000e3 e6ab ldi XL, LOW(TEMP_H)
-0000e4 e0b0 ldi XH, HIGH(TEMP_H)
-0000e5 d092 rcall OW_RD_BYTE
+000110 e6aa ldi XL, LOW(TEMP_H)
+000111 e0b0 ldi XH, HIGH(TEMP_H)
+000112 d092 rcall OW_RD_BYTE
-0000e6 9110 006a lds r17, TEMP_L
-0000e8 9120 006b lds r18, TEMP_H
+000113 9110 0069 lds r17, TEMP_L
+000115 9120 006a lds r18, TEMP_H
-0000ea 932f push r18
-0000eb 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H)
-0000ec 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой
-0000ed f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число
-0000ee 94e8 clt
-0000ef c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16)
+000117 932f push r18
+000118 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H)
+000119 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой
+00011a f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число
+00011b 94e8 clt
+00011c c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16)
_TEMP_RD_TO_UNSIGNED:
-0000f0 912f pop r18
-0000f1 9468 set
-0000f2 9510 com r17
-0000f3 9520 com r18
-0000f4 e031 ldi r19, 1
-0000f5 0f13 add r17, r19
-0000f6 e030 ldi r19, 0
-0000f7 1f23 adc r18, r19
-0000f8 c001 rjmp PC+2
+00011d 912f pop r18
+00011e 9468 set
+00011f 9510 com r17
+000120 9520 com r18
+000121 e031 ldi r19, 1
+000122 0f13 add r17, r19
+000123 e030 ldi r19, 0
+000124 1f23 adc r18, r19
+000125 c001 rjmp PC+2
_TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4)
-0000f9 912f pop r18
-0000fa 9526 lsr r18
-0000fb 9517 ror r17
-0000fc 9526 lsr r18
-0000fd 9517 ror r17
-0000fe 9526 lsr r18
-0000ff 9517 ror r17
-000100 9526 lsr r18
-000101 9517 ror r17
+000126 912f pop r18
+000127 9526 lsr r18
+000128 9517 ror r17
+000129 9526 lsr r18
+00012a 9517 ror r17
+00012b 9526 lsr r18
+00012c 9517 ror r17
+00012d 9526 lsr r18
+00012e 9517 ror r17
_TEMP_RD_END:
-000102 9130 006a lds r19, TEMP_L
-000104 f40e brtc PC+2
-000105 9531 neg r19 ; переводим в беззнаковое число если минус
+00012f 9130 0069 lds r19, TEMP_L
+000131 f40e brtc PC+2
+000132 9531 neg r19 ; переводим в беззнаковое число если минус
; далее происходит такое для получения дробной части:
; ((n<<3) + (n<<1))>>4 или (n*10)/16
-000106 2f43 mov r20, r19
-000107 703f andi r19, 0x0f
-000108 2f43 mov r20, r19
-000109 0f33 lsl r19
-00010a 0f33 lsl r19
-00010b 0f33 lsl r19
+000133 2f43 mov r20, r19
+000134 703f andi r19, 0x0f
+000135 2f43 mov r20, r19
+000136 0f33 lsl r19
+000137 0f33 lsl r19
+000138 0f33 lsl r19
-00010c 0f44 lsl r20
+000139 0f44 lsl r20
-00010d 0f34 add r19, r20
+00013a 0f34 add r19, r20
-00010e 9536 lsr r19
-00010f 9536 lsr r19
-000110 9536 lsr r19
-000111 9536 lsr r19
+00013b 9536 lsr r19
+00013c 9536 lsr r19
+00013d 9536 lsr r19
+00013e 9536 lsr r19
; записываем данные
-000112 9310 006a sts TEMP_L, r17
-000114 9320 006b sts TEMP_H, r18
-000116 9330 006c sts TEMP_F, r19
+00013f 9310 0069 sts TEMP_L, r17
+000141 9320 006a sts TEMP_H, r18
+000143 9330 006b sts TEMP_F, r19
; sei
-000118 914f pop r20
-000119 913f pop r19
-00011a 912f pop r18
-00011b 911f pop r17
-00011c 910f pop r16
-00011d 9508 ret
+000145 914f pop r20
+000146 913f pop r19
+000147 912f pop r18
+000148 911f pop r17
+000149 910f pop r16
+00014a 9508 ret
;
TEMP_CONV:
-00011e 930f push r16
+00014b 930f push r16
; cli
-00011f d022 rcall OW_PRESENCE
-000120 ec0c ldi r16, DS18B20_CMD_SKIPROM
-000121 2e80 mov OW_CMD_r, r16
-000122 d034 rcall OW_SEND_BYTE
+00014c d022 rcall OW_PRESENCE
+00014d ec0c ldi r16, DS18B20_CMD_SKIPROM
+00014e 2e80 mov OW_CMD_r, r16
+00014f d034 rcall OW_SEND_BYTE
-000123 e404 ldi r16, DS18B20_CMD_CONVERTTEMP
-000124 2e80 mov OW_CMD_r, r16
-000125 d031 rcall OW_SEND_BYTE
+000150 e404 ldi r16, DS18B20_CMD_CONVERTTEMP
+000151 2e80 mov OW_CMD_r, r16
+000152 d031 rcall OW_SEND_BYTE
; sei
-000126 910f pop r16
-000127 9508 ret
+000153 910f pop r16
+000154 9508 ret
//
//
; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
USI_TRANSMIT:
-000128 930f push r16
-000129 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
+000155 930f push r16
+000156 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
-00012a e400 ldi TEMP_REG_A, (1< USI Clock Source Select
; USICLK <--------------> USI Clock Strobe
; USITC <--------------> USI Toggle Clock (Enable clock generation)
-00012c e10b ldi TEMP_REG_A, (1<
+00015d 9ac0 sbi PORTB, USI_LATCH_PIN
+00015e 98c0 cbi PORTB, USI_LATCH_PIN
+00015f 910f pop r16
+000160 9508 ret//
//
SW_CHECK_PROCESS:
-000134 930f push r16
-000135 d08c rcall DEBOUNCE_SW
-000136 9bb2 sbis SW_PIN, SW_PLUS_PIN
-000137 9601 adiw DISP_NUM_L, 1
+000161 930f push r16
+000162 d08c rcall DEBOUNCE_SW
+000163 9bb2 sbis SW_PIN, SW_PLUS_PIN
+000164 9601 adiw DISP_NUM_L, 1
-000138 9bb3 sbis SW_PIN, SW_MINUS_PIN
-000139 9701 sbiw DISP_NUM_L, 1
+000165 9bb3 sbis SW_PIN, SW_MINUS_PIN
+000166 9701 sbiw DISP_NUM_L, 1
-00013a 9bb4 sbis SW_PIN, SW_SET_PIN
-00013b c001 rjmp _INTO_DEFAULT_STATE
-00013c c003 rjmp _SW_CHECK_PROCESS_END
+000167 9bb4 sbis SW_PIN, SW_SET_PIN
+000168 c001 rjmp _INTO_DEFAULT_STATE
+000169 c003 rjmp _SW_CHECK_PROCESS_END
_INTO_DEFAULT_STATE:
-00013d e000 ldi r16, MCU_STATE_DEFAULT
-00013e 9300 0060 sts MCU_STATE, r16
+00016a e000 ldi r16, MCU_STATE_DEFAULT
+00016b 9300 0060 sts MCU_STATE, r16
_SW_CHECK_PROCESS_END:
-000140 910f pop r16
-000141 9508 ret
+00016d 910f pop r16
+00016e 9508 ret
//
//
//
; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ******************************
OW_PRESENCE:
-000142 94f8 cli
-000143 9ab9 ow_pull
-000144 e033
-000145 eb4e
-000146 d08b DELAY16 480
-000147 98b9 ow_release
-000148 e030
-000149 e84a
-00014a d087 DELAY16 70
-00014b d005 rcall OW_CHECK_PRESENCE
-00014c e033
-00014d e342
-00014e d083 DELAY16 410
-00014f 9478 sei
-000150 9508 ret
+00016f 94f8 cli
+000170 9ab9 ow_pull
+000171 e033
+000172 eb4e
+000173 d08b DELAY16 480
+000174 98b9 ow_release
+000175 e030
+000176 e84a
+000177 d087 DELAY16 70
+000178 d005 rcall OW_CHECK_PRESENCE
+000179 e033
+00017a e342
+00017b d083 DELAY16 410
+00017c 9478 sei
+00017d 9508 ret
//
//
@@ -1358,85 +1501,85 @@ main.asm(265): Including file 'div16u.asm'
; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов
;
OW_CHECK_PRESENCE:
-000151 9bb1 sbis OW_PIN, OW_LINE
-000152 6071 sbr OWFR, (1<
//
OW_SEND_BYTE:
-000157 930f push r16
-000158 931f push r17
-000159 2d08 mov r16, OW_CMD_r
-00015a e018 ldi r17, 8
+000184 930f push r16
+000185 931f push r17
+000186 2d08 mov r16, OW_CMD_r
+000187 e018 ldi r17, 8
_OW_SEND_BYTE_LOOP:
-00015b 9506 lsr r16
-00015c f408 brcc _OW_SEND_0
-00015d f058 brcs _OW_SEND_1
+000188 9506 lsr r16
+000189 f408 brcc _OW_SEND_0
+00018a f058 brcs _OW_SEND_1
_OW_SEND_0:
-00015e 94f8 cli
-00015f 9ab9 ow_pull
-000160 e030
-000161 e746
-000162 d06f DELAY16 60
-000163 98b9 ow_release
-000164 e030
-000165 e142
-000166 d06b DELAY16 10
-000167 9478 sei
-000168 c00a rjmp _OW_SEND_BYTE_END
+00018b 94f8 cli
+00018c 9ab9 ow_pull
+00018d e030
+00018e e746
+00018f d06f DELAY16 60
+000190 98b9 ow_release
+000191 e030
+000192 e142
+000193 d06b DELAY16 10
+000194 9478 sei
+000195 c00a rjmp _OW_SEND_BYTE_END
_OW_SEND_1:
-000169 94f8 cli
-00016a 9ab9 ow_pull
-00016b e030
-00016c e04a
-00016d d064 DELAY16 6
-00016e 98b9 ow_release
-00016f e030
-000170 e74e
-000171 d060 DELAY16 64
-000172 9478 sei
+000196 94f8 cli
+000197 9ab9 ow_pull
+000198 e030
+000199 e04a
+00019a d064 DELAY16 6
+00019b 98b9 ow_release
+00019c e030
+00019d e74e
+00019e d060 DELAY16 64
+00019f 9478 sei
_OW_SEND_BYTE_END:
-000173 951a dec r17
-000174 f731 brne _OW_SEND_BYTE_LOOP
-000175 911f pop r17
-000176 910f pop r16
-000177 9508 ret
+0001a0 951a dec r17
+0001a1 f731 brne _OW_SEND_BYTE_LOOP
+0001a2 911f pop r17
+0001a3 910f pop r16
+0001a4 9508 ret
//
//
OW_RD_BYTE:
-000178 930f push r16
-000179 931f push r17
-00017a 2700 clr r16
-00017b e018 ldi r17, 8
-00017c 94f8 cli
+0001a5 930f push r16
+0001a6 931f push r17
+0001a7 2700 clr r16
+0001a8 e018 ldi r17, 8
+0001a9 94f8 cli
_OW_RD_BYTE_LP:
-00017d 9506 lsr r16
-00017e 9ab9 ow_pull
-00017f e030
-000180 e04a
-000181 d050 DELAY16 6
-000182 98b9 ow_release
-000183 e030
-000184 e140
-000185 d04c DELAY16 9
-000186 99b1 sbic OW_PIN, OW_LINE
-000187 6800 sbr r16, (1<<7)
-000188 e030
-000189 e64c
-00018a d047 DELAY16 55
-00018b 951a dec r17
-00018c f781 brne _OW_RD_BYTE_LP
-00018d 930c st X, r16
-00018e 9478 sei
-00018f 911f pop r17
-000190 910f pop r16
-000191 9508 ret
+0001aa 9506 lsr r16
+0001ab 9ab9 ow_pull
+0001ac e030
+0001ad e04a
+0001ae d050 DELAY16 6
+0001af 98b9 ow_release
+0001b0 e030
+0001b1 e140
+0001b2 d04c DELAY16 9
+0001b3 99b1 sbic OW_PIN, OW_LINE
+0001b4 6800 sbr r16, (1<<7)
+0001b5 e030
+0001b6 e64c
+0001b7 d047 DELAY16 55
+0001b8 951a dec r17
+0001b9 f781 brne _OW_RD_BYTE_LP
+0001ba 930c st X, r16
+0001bb 9478 sei
+0001bc 911f pop r17
+0001bd 910f pop r16
+0001be 9508 ret
//
@@ -1447,154 +1590,154 @@ main.asm(265): Including file 'div16u.asm'
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
; путем деления этого числа несколько раз
DISPLAY_UPD_DIGITS:
-000192 94f8 cli
-000193 935f push r21
-000194 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный
+0001bf 94f8 cli
+0001c0 935f push r21
+0001c1 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный
; инициализация указателя (за каждый проход цикла будет инкрементироваться)
-000195 e6a3 ldi XL, LOW(DIGITS)
-000196 e0b0 ldi XH, HIGH(DIGITS)
+0001c2 e6a3 ldi XL, LOW(DIGITS)
+0001c3 e0b0 ldi XH, HIGH(DIGITS)
.equ dividend = SRAM_TEMP_1 ; число которе будем делить
.equ divisor = 10 ; на что делим
; загружаем число которое хотим поделить в адрес SRAM делимого
-000197 9380 0061 sts dividend, DISP_NUM_L
-000199 9390 0062 sts dividend+1, DISP_NUM_H
+0001c4 9380 0061 sts dividend, DISP_NUM_L
+0001c6 9390 0062 sts dividend+1, DISP_NUM_H
; четыре раза производим деление для получения остатков
DIV_LOOP:
; заполняем нужные регистры
-00019b 9100 0061 lds dd16uL, dividend
-00019d 9110 0062 lds dd16uH, dividend+1
-00019f e02a ldi dv16uL, LOW(divisor)
-0001a0 e030 ldi dv16uH, HIGH(divisor)
+0001c8 9100 0061 lds dd16uL, dividend
+0001ca 9110 0062 lds dd16uH, dividend+1
+0001cc e02a ldi dv16uL, LOW(divisor)
+0001cd e030 ldi dv16uH, HIGH(divisor)
-0001a1 df10 rcall div16u ; делим
+0001ce defb rcall div16u ; делим
-0001a2 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его
+0001cf 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его
; обновляем делимое
-0001a3 9300 0061 sts dividend, dres16uL
-0001a5 9310 0062 sts dividend+1, dres16uH
+0001d0 9300 0061 sts dividend, dres16uL
+0001d2 9310 0062 sts dividend+1, dres16uH
-0001a7 955a dec r21 ; декрементируем счетчик цикла
-0001a8 f791 brne DIV_LOOP ; делим еще раз если не 0
-0001a9 915f pop r21
-0001aa 9478 sei
-0001ab 9508 ret
+0001d4 955a dec r21 ; декрементируем счетчик цикла
+0001d5 f791 brne DIV_LOOP ; делим еще раз если не 0
+0001d6 915f pop r21
+0001d7 9478 sei
+0001d8 9508 ret
//
//
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
DISPLAY_DECODER:
-0001ac 930f push r16
-0001ad 931f push r17
-0001ae ede6 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
-0001af e0f3 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
+0001d9 930f push r16
+0001da 931f push r17
+0001db e3e0 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
+0001dc e0f4 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
-0001b0 2711 clr TEMP_REG_B
-0001b1 0fe0 add ZL, TEMP_REG_A
-0001b2 1ff1 adc ZH, TEMP_REG_B
+0001dd 2711 clr TEMP_REG_B
+0001de 0fe0 add ZL, TEMP_REG_A
+0001df 1ff1 adc ZH, TEMP_REG_B
-0001b3 9004 lpm r0, Z
-0001b4 911f pop r17
-0001b5 910f pop r16
-0001b6 9508 ret//
+0001e0 9004 lpm r0, Z
+0001e1 911f pop r17
+0001e2 910f pop r16
+0001e3 9508 ret//
//
BEEP_SHORT:
-0001b7 9ac5 sbi BUZZER_PORT, BUZZER_PIN
-0001b8 d022 rcall DELAY
-0001b9 98c5 cbi BUZZER_PORT, BUZZER_PIN
-0001ba 9508 ret
+0001e4 9ac5 sbi BUZZER_PORT, BUZZER_PIN
+0001e5 d022 rcall DELAY
+0001e6 98c5 cbi BUZZER_PORT, BUZZER_PIN
+0001e7 9508 ret
//
//
BEEP_LONG:
-0001bb 9ac5 sbi BUZZER_PORT, BUZZER_PIN
-0001bc d01e rcall DELAY
-0001bd d01d rcall DELAY
-0001be d01c rcall DELAY
-0001bf d01b rcall DELAY
-0001c0 98c5 cbi BUZZER_PORT, BUZZER_PIN
-0001c1 9508 ret//
+0001e8 9ac5 sbi BUZZER_PORT, BUZZER_PIN
+0001e9 d01e rcall DELAY
+0001ea d01d rcall DELAY
+0001eb d01c rcall DELAY
+0001ec d01b rcall DELAY
+0001ed 98c5 cbi BUZZER_PORT, BUZZER_PIN
+0001ee 9508 ret//
//
DEBOUNCE_SW:
-0001c2 930f push r16
-0001c3 931f push r17
-0001c4 932f push r18
+0001ef 930f push r16
+0001f0 931f push r17
+0001f1 932f push r18
-0001c5 e02a ldi r18, 10
+0001f2 e02a ldi r18, 10
_loop_2:
-0001c6 ef1f ldi r17, 255
+0001f3 ef1f ldi r17, 255
_loop_0:
-0001c7 ef0f ldi r16, 255
+0001f4 ef0f ldi r16, 255
_dec_0:
-0001c8 950a dec r16
-0001c9 f7f1 brne _dec_0
+0001f5 950a dec r16
+0001f6 f7f1 brne _dec_0
_loop_1:
-0001ca 951a dec r17
-0001cb f7d9 brne _loop_0
+0001f7 951a dec r17
+0001f8 f7d9 brne _loop_0
_loop_3:
-0001cc 952a dec r18
-0001cd f7c1 brne _loop_2
+0001f9 952a dec r18
+0001fa f7c1 brne _loop_2
-0001ce 912f pop r18
-0001cf 911f pop r17
-0001d0 910f pop r16
-0001d1 9508 ret//
+0001fb 912f pop r18
+0001fc 911f pop r17
+0001fd 910f pop r16
+0001fe 9508 ret//
//
DELAY_LOOP_16:
-0001d2 5041 subi DELAY_8_r, 1
-0001d3 4030 sbci DELAY_16_r, 0
-0001d4 f7e8 brcc DELAY_LOOP_16
-0001d5 9508 ret
+0001ff 5041 subi DELAY_8_r, 1
+000200 4030 sbci DELAY_16_r, 0
+000201 f7e8 brcc DELAY_LOOP_16
+000202 9508 ret
//
DELAY_LOOP_24:
-0001d6 5041 subi DELAY_8_r, 1
-0001d7 4030 sbci DELAY_16_r, 0
-0001d8 4050 sbci DELAY_24_r, 0
-0001d9 f7e0 brcc DELAY_LOOP_24
-0001da 9508 ret
+000203 5041 subi DELAY_8_r, 1
+000204 4030 sbci DELAY_16_r, 0
+000205 4050 sbci DELAY_24_r, 0
+000206 f7e0 brcc DELAY_LOOP_24
+000207 9508 ret
//
DELAY:
-0001db 930f push r16
-0001dc 931f push r17
-0001dd 932f push r18
+000208 930f push r16
+000209 931f push r17
+00020a 932f push r18
-0001de e026 ldi r18, 6
+00020b e026 ldi r18, 6
_DELAY_0:
-0001df ef0f ldi r16, 255
+00020c ef0f ldi r16, 255
_DELAY_1:
-0001e0 ef1f ldi r17, 255
+00020d ef1f ldi r17, 255
_DELAY_2:
-0001e1 951a dec r17
-0001e2 f7f1 brne _DELAY_2
+00020e 951a dec r17
+00020f f7f1 brne _DELAY_2
-0001e3 950a dec r16
-0001e4 f7d9 brne _DELAY_1
-0001e5 952a dec r18
-0001e6 f7c1 brne _DELAY_0
+000210 950a dec r16
+000211 f7d9 brne _DELAY_1
+000212 952a dec r18
+000213 f7c1 brne _DELAY_0
-0001e7 912f pop r18
-0001e8 911f pop r17
-0001e9 910f pop r16
-0001ea 9508 ret //
+000214 912f pop r18
+000215 911f pop r17
+000216 910f pop r16
+000217 9508 ret //
//
DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA
-0001eb f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
-0001ec b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
-0001ed 9299 .DB 0b10011001, 0b10010010 ; 4, 5
-0001ee f882 .DB 0b10000010, 0b11111000 ; 6, 7
-0001ef 9080 .DB 0b10000000, 0b10010000 ; 8, 9
-0001f0 bf9c .DB 0b10011100, 0b10111111 ; °, -//
+000218 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
+000219 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
+00021a 9299 .DB 0b10011001, 0b10010010 ; 4, 5
+00021b f882 .DB 0b10000010, 0b11111000 ; 6, 7
+00021c 9080 .DB 0b10000000, 0b10010000 ; 8, 9
+00021d bf9c .DB 0b10011100, 0b10111111 ; °, -//
//
@@ -1621,9 +1764,9 @@ counted separately from r26..r31 here.
"ATtiny2313A" register use summary:
x : 2 y : 0 z : 1 r0 : 4 r1 : 2 r2 : 0 r3 : 0 r4 : 0
-r5 : 0 r6 : 0 r7 : 0 r8 : 5 r9 : 0 r10: 0 r11: 0 r12: 0
-r13: 0 r14: 5 r15: 5 r16: 94 r17: 50 r18: 30 r19: 40 r20: 33
-r21: 10 r22: 0 r23: 2 r24: 5 r25: 3 r26: 3 r27: 3 r28: 0
+r5 : 0 r6 : 0 r7 : 0 r8 : 7 r9 : 0 r10: 0 r11: 0 r12: 0
+r13: 0 r14: 5 r15: 5 r16: 112 r17: 52 r18: 30 r19: 41 r20: 34
+r21: 11 r22: 0 r23: 2 r24: 5 r25: 3 r26: 4 r27: 4 r28: 0
r29: 0 r30: 2 r31: 2
Registers used: 20 out of 35 (57.1%)
@@ -1632,27 +1775,27 @@ Registers used: 20 out of 35 (57.1%)
andi : 1 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0
brcc : 4 brcs : 1 break : 0 breq : 4 brge : 1 brhc : 0
brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0
-brne : 17 brpl : 0 brsh : 0 brtc : 1 brts : 1 brvc : 0
+brne : 19 brpl : 0 brsh : 0 brtc : 1 brts : 1 brvc : 0
brvs : 0 bset : 0 bst : 0 cbi : 23 cbr : 3 clc : 1
clh : 0 cli : 5 cln : 0 clr : 6 cls : 0 clt : 1
-clv : 0 clz : 0 com : 2 cp : 0 cpc : 0 cpi : 10
-cpse : 0 dec : 10 eor : 0 icall : 0 ijmp : 0 in : 2
-inc : 1 ld : 0 ldd : 0 ldi : 69 lds : 16 lpm : 2
-lsl : 4 lsr : 10 mov : 11 movw : 0 neg : 1 nop : 0
-or : 1 ori : 0 out : 15 pop : 32 push : 31 rcall : 42
-ret : 18 reti : 3 rjmp : 19 rol : 4 ror : 4 sbc : 1
+clv : 0 clz : 0 com : 2 cp : 0 cpc : 0 cpi : 11
+cpse : 0 dec : 11 eor : 0 icall : 0 ijmp : 0 in : 2
+inc : 1 ld : 0 ldd : 0 ldi : 82 lds : 17 lpm : 2
+lsl : 4 lsr : 10 mov : 13 movw : 0 neg : 1 nop : 0
+or : 1 ori : 0 out : 15 pop : 33 push : 32 rcall : 50
+ret : 20 reti : 3 rjmp : 21 rol : 4 ror : 4 sbc : 1
sbci : 3 sbi : 12 sbic : 3 sbis : 5 sbiw : 1 sbr : 2
sbrc : 0 sbrs : 0 sec : 1 seh : 0 sei : 5 sen : 0
ser : 0 ses : 0 set : 1 sev : 0 sez : 0 sleep : 0
-spm : 0 st : 2 std : 0 sts : 20 sub : 2 subi : 2
+spm : 0 st : 2 std : 0 sts : 25 sub : 2 subi : 2
swap : 0 tst : 1 wdr : 0
Instructions used: 54 out of 105 (51.4%)
"ATtiny2313A" memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
-[.cseg] 0x000000 0x0003e2 960 12 972 2048 47.5%
-[.dseg] 0x000060 0x00006d 0 13 13 128 10.2%
+[.cseg] 0x000000 0x00043c 1050 12 1062 2048 51.9%
+[.dseg] 0x000060 0x000071 0 17 17 128 13.3%
[.eseg] 0x000000 0x000000 0 0 0 128 0.0%
Assembly complete, 0 errors, 6 warnings
diff --git a/dist/default/production/attiny2313a_thermostat.X.production.map b/dist/default/production/attiny2313a_thermostat.X.production.map
index 2997244..c953aa9 100644
--- a/dist/default/production/attiny2313a_thermostat.X.production.map
+++ b/dist/default/production/attiny2313a_thermostat.X.production.map
@@ -1,5 +1,5 @@
-AVRASM ver. 2.2.7 main.asm Fri Jun 23 16:35:36 2023
+AVRASM ver. 2.2.7 main.asm Sat Jun 24 17:26:02 2023
EQU SIGNATURE_000 0000001e
@@ -526,15 +526,25 @@ EQU UART_TX_PIN 00000001
EQU MCU_STATE_DEFAULT 00000000
EQU MCU_STATE_PROGRAM 00000001
EQU MCU_STATE_ERROR 00000002
+EQU DEFAULT_SETTING_INT 0000001d
+EQU DEFAULT_SETTING_F 00000005
+EQU DEFAULT_SETTING_HYST 00000005
+EQU HEAT_MODE 00000001
+EQU COOLING_MODE 00000000
+EQU DEFAULT_SETTING_MODE 00000001
DSEG MCU_STATE 00000060
DSEG SRAM_TEMP_1 00000061
DSEG DIGITS 00000063
DSEG CURRENT_DIGIT 00000067
DSEG SW_FLAGS 00000068
-DSEG HYSTERESIS 00000069
-DSEG TEMP_L 0000006a
-DSEG TEMP_H 0000006b
-DSEG TEMP_F 0000006c
+DSEG TEMP_L 00000069
+DSEG TEMP_H 0000006a
+DSEG TEMP_F 0000006b
+DSEG SETTING_INT 0000006c
+DSEG SETTING_F 0000006d
+DSEG SETTING_HYST 0000006e
+DSEG SETTING_MODE 0000006f
+DSEG DEVICE_FAMILY_CODE 00000070
CSEG RESET_vect 00000074
CSEG TIMER0_COMPA_vect 00000023
CSEG PCINT0_vect 0000000e
@@ -543,20 +553,25 @@ CSEG _INTO_PROGRAM_STATE 0000001a
CSEG _CLR_CURRENT_DIGIT 0000002d
CSEG _indicate_1 00000030
CSEG _indicate_2 00000042
-CSEG DISPLAY_DECODER 000001ac
-CSEG USI_TRANSMIT 00000128
+CSEG DISPLAY_DECODER 000001d9
+CSEG USI_TRANSMIT 00000155
CSEG _indicate_3 00000054
CSEG _indicate_4 00000061
CSEG _indicate_exit 0000006b
CSEG MCU_INIT 00000076
-CSEG BEEP_SHORT 000001b7
-CSEG LOOP 00000097
-CSEG _STATE_DEFAULT 00000099
-CSEG _STATE_PROGRAM 000000a0
-CSEG DISPLAY_UPD_DIGITS 00000192
-CSEG TEMP_UPD 000000c5
-CSEG _STATE_ERROR 000000a5
-CSEG SW_CHECK_PROCESS 00000134
+CSEG RD_F_CODE 000000f1
+CSEG ERR_FAMILY_CODE 000000a6
+CSEG START_PROGRAM 000000ab
+CSEG BEEP_LONG 000001e8
+CSEG BEEP_SHORT 000001e4
+CSEG LOOP 000000ae
+CSEG _STATE_DEFAULT 000000b0
+CSEG _STATE_PROGRAM 000000b8
+CSEG DISPLAY_UPD_DIGITS 000001bf
+CSEG TEMP_UPD 000000de
+CSEG TEMP_COMPARSION 000000dd
+CSEG _STATE_ERROR 000000bd
+CSEG SW_CHECK_PROCESS 00000161
DEF drem16uL r14
DEF drem16uH r15
DEF dres16uL r16
@@ -566,42 +581,42 @@ DEF dd16uH r17
DEF dv16uL r18
DEF dv16uH r19
DEF dcnt16u r20
-CSEG div16u 000000b2
-CSEG d16u_1 000000b5
-CSEG d16u_2 000000ba
-CSEG d16u_3 000000c3
-CSEG TEMP_CONV 0000011e
-CSEG DELAY_LOOP_24 000001d6
-CSEG TEMP_RD 000000d4
-CSEG OW_PRESENCE 00000142
-CSEG OW_SEND_BYTE 00000157
-CSEG OW_RD_BYTE 00000178
-CSEG _TEMP_RD_TO_UNSIGNED 000000f0
-CSEG _TEMP_RD_CONTINUE 000000f9
-CSEG _TEMP_RD_END 00000102
-CSEG _USI_TRANSMIT_LOOP 0000012d
-CSEG DEBOUNCE_SW 000001c2
-CSEG _INTO_DEFAULT_STATE 0000013d
-CSEG _SW_CHECK_PROCESS_END 00000140
-CSEG DELAY_LOOP_16 000001d2
-CSEG OW_CHECK_PRESENCE 00000151
-CSEG _EXIT 00000156
-CSEG _OW_SEND_BYTE_LOOP 0000015b
-CSEG _OW_SEND_0 0000015e
-CSEG _OW_SEND_1 00000169
-CSEG _OW_SEND_BYTE_END 00000173
-CSEG _OW_RD_BYTE_LP 0000017d
+CSEG div16u 000000ca
+CSEG d16u_1 000000cd
+CSEG d16u_2 000000d2
+CSEG d16u_3 000000db
+CSEG TEMP_CONV 0000014b
+CSEG DELAY_LOOP_24 00000203
+CSEG TEMP_RD 00000101
+CSEG OW_PRESENCE 0000016f
+CSEG OW_SEND_BYTE 00000184
+CSEG _RD_L 000000fc
+CSEG OW_RD_BYTE 000001a5
+CSEG _TEMP_RD_TO_UNSIGNED 0000011d
+CSEG _TEMP_RD_CONTINUE 00000126
+CSEG _TEMP_RD_END 0000012f
+CSEG _USI_TRANSMIT_LOOP 0000015a
+CSEG DEBOUNCE_SW 000001ef
+CSEG _INTO_DEFAULT_STATE 0000016a
+CSEG _SW_CHECK_PROCESS_END 0000016d
+CSEG DELAY_LOOP_16 000001ff
+CSEG OW_CHECK_PRESENCE 0000017e
+CSEG _EXIT 00000183
+CSEG _OW_SEND_BYTE_LOOP 00000188
+CSEG _OW_SEND_0 0000018b
+CSEG _OW_SEND_1 00000196
+CSEG _OW_SEND_BYTE_END 000001a0
+CSEG _OW_RD_BYTE_LP 000001aa
EQU dividend 00000061
EQU divisor 0000000a
-CSEG DIV_LOOP 0000019b
-CSEG DISPLAY_SYMBOLS 000001eb
-CSEG DELAY 000001db
-CSEG BEEP_LONG 000001bb
-CSEG _loop_2 000001c6
-CSEG _loop_0 000001c7
-CSEG _dec_0 000001c8
-CSEG _loop_1 000001ca
-CSEG _loop_3 000001cc
-CSEG _DELAY_0 000001df
-CSEG _DELAY_1 000001e0
-CSEG _DELAY_2 000001e1
+CSEG DIV_LOOP 000001c8
+CSEG DISPLAY_SYMBOLS 00000218
+CSEG DELAY 00000208
+CSEG _loop_2 000001f3
+CSEG _loop_0 000001f4
+CSEG _dec_0 000001f5
+CSEG _loop_1 000001f7
+CSEG _loop_3 000001f9
+CSEG _DELAY_0 0000020c
+CSEG _DELAY_1 0000020d
+CSEG _DELAY_2 0000020e
diff --git a/dist/default/production/attiny2313a_thermostat.X.production.obj b/dist/default/production/attiny2313a_thermostat.X.production.obj
index a826e10..8f610be 100644
Binary files a/dist/default/production/attiny2313a_thermostat.X.production.obj and b/dist/default/production/attiny2313a_thermostat.X.production.obj differ
diff --git a/dist/default/production/attiny2313a_thermostat.X.production.tmp b/dist/default/production/attiny2313a_thermostat.X.production.tmp
index 2c26816..f57d47f 100644
--- a/dist/default/production/attiny2313a_thermostat.X.production.tmp
+++ b/dist/default/production/attiny2313a_thermostat.X.production.tmp
@@ -29,68 +29,77 @@
main.asm26
main.asm27
main.asm28
- main.asm29
- main.asm30
- main.asm31
- main.asm32
- main.asm185
- main.asm90
- main.asm53
- <_PCINT0_vect_end>main.asm80
- <_INTO_PROGRAM_STATE>main.asm76
- <_CLR_CURRENT_DIGIT>main.asm102
- <_indicate_1>main.asm106
- <_indicate_2>main.asm126
- main.asm583
- main.asm396
- <_indicate_3>main.asm144
- <_indicate_4>main.asm160
- <_indicate_exit>main.asm172
- main.asm191
- main.asm599
- main.asm233
- <_STATE_DEFAULT>main.asm237
- <_STATE_PROGRAM>main.asm244
- main.asm542
- main.asm268
- <_STATE_ERROR>main.asm250
- main.asm427
+ main.asm29
+ main.asm30
+ main.asm31
+ main.asm32
+ main.asm33
+ main.asm34
+ main.asm35
+ main.asm36
+ main.asm189
+ main.asm94
+ main.asm57
+ <_PCINT0_vect_end>main.asm84
+ <_INTO_PROGRAM_STATE>main.asm80
+ <_CLR_CURRENT_DIGIT>main.asm106
+ <_indicate_1>main.asm110
+ <_indicate_2>main.asm130
+ main.asm710
+ main.asm523
+ <_indicate_3>main.asm148
+ <_indicate_4>main.asm164
+ <_indicate_exit>main.asm176
+ main.asm195
+ main.asm386
+ main.asm247
+ main.asm252
+ main.asm734
+ main.asm726
+ main.asm261
+ <_STATE_DEFAULT>main.asm265
+ <_STATE_PROGRAM>main.asm273
+ main.asm669
+ main.asm369
+ main.asm296
+ <_STATE_ERROR>main.asm279
+ main.asm554
div16u.asm32
div16u.asm36
div16u.asm42
div16u.asm52
- main.asm376
- main.asm650
- main.asm284
- main.asm451
- main.asm478
- main.asm511
- <_TEMP_RD_TO_UNSIGNED>main.asm319
- <_TEMP_RD_CONTINUE>main.asm330
- <_TEMP_RD_END>main.asm340
- <_USI_TRANSMIT_LOOP>main.asm414
- main.asm617
- <_INTO_DEFAULT_STATE>main.asm440
- <_SW_CHECK_PROCESS_END>main.asm443
- main.asm643
- main.asm467
- <_EXIT>main.asm473
- <_OW_SEND_BYTE_LOOP>main.asm483
- <_OW_SEND_0>main.asm487
- <_OW_SEND_1>main.asm495
- <_OW_SEND_BYTE_END>main.asm502
- <_OW_RD_BYTE_LP>main.asm517
- main.asm559
- main.asm683
- main.asm658
- main.asm607
- <_loop_2>main.asm623
- <_loop_0>main.asm625
- <_dec_0>main.asm627
- <_loop_1>main.asm630
- <_loop_3>main.asm633
- <_DELAY_0>main.asm664
- <_DELAY_1>main.asm666
- <_DELAY_2>main.asm668
+ main.asm503
+ main.asm777
+ main.asm411
+ main.asm578
+ main.asm605
+ <_RD_L>main.asm402
+ main.asm638
+ <_TEMP_RD_TO_UNSIGNED>main.asm446
+ <_TEMP_RD_CONTINUE>main.asm457
+ <_TEMP_RD_END>main.asm467
+ <_USI_TRANSMIT_LOOP>main.asm541
+ main.asm744
+ <_INTO_DEFAULT_STATE>main.asm567
+ <_SW_CHECK_PROCESS_END>main.asm570
+ main.asm770
+ main.asm594
+ <_EXIT>main.asm600
+ <_OW_SEND_BYTE_LOOP>main.asm610
+ <_OW_SEND_0>main.asm614
+ <_OW_SEND_1>main.asm622
+ <_OW_SEND_BYTE_END>main.asm629
+ <_OW_RD_BYTE_LP>main.asm644
+ main.asm686
+ main.asm810
+ main.asm785
+ <_loop_2>main.asm750
+ <_loop_0>main.asm752
+ <_dec_0>main.asm754
+ <_loop_1>main.asm757
+ <_loop_3>main.asm760
+ <_DELAY_0>main.asm791
+ <_DELAY_1>main.asm793
+ <_DELAY_2>main.asm795
diff --git a/main.asm b/main.asm
index 9dad42c..8a28489 100644
--- a/main.asm
+++ b/main.asm
@@ -26,11 +26,14 @@ SRAM_TEMP_1: .BYTE 2 ; Хранения временно
DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
SW_FLAGS: .BYTE 1 ; Состояние кнопок
-HYSTERESIS: .BYTE 1 ; Отклонение температуры от уставки
TEMP_L: .BYTE 1 ; Младший байт температуры
TEMP_H: .BYTE 1 ; Старший байт температуры
TEMP_F: .BYTE 1 ; Дробная часть
-;SETTING_INT: .BYTE 1 ; Уставка: целая часть
+SETTING_INT: .BYTE 1 ; Уставка: целая часть
+SETTING_F: .BYTE 1 ; Уставка: дробная часть
+SETTING_HYST: .BYTE 1 ; Гистерезис: отклонение от уставки
+SETTING_MODE: .BYTE 1 ; Режим работы: '1' - нагрев; '0' - 'охлаждение'
+DEVICE_FAMILY_CODE: .BYTE 1 ; Должно быть 0x10 для DS18B20
;//
@@ -190,41 +193,65 @@ RESET_vect:
//
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
MCU_INIT:
- ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
- outi r16, DDRD, (1<
@@ -241,7 +268,8 @@ _STATE_DEFAULT:
cbi LED_ERR_PORT, LED_ERR_PIN
rcall DISPLAY_UPD_DIGITS
rcall TEMP_UPD
- outi r16, TIMSK, (1<= уставки - выключаем реле
+; rjmp _COMPARSION_EXIT
+;_HEATING_GREATER_OR_E_F:
+; cp r18, r20
+; breq _HEATING_GREATER_E_F
+; brtc PC+3
+; relay_on
+; rjmp PC+2
+; relay_off ; c
+; rjmp _COMPARSION_EXIT
+;_HEATING_GREATER_E_F:
+; brtc PC+3
+; relay_on
+; rjmp PC+2
+; relay_off ; c
+;
+;_COMPARSION_EXIT:
+; pop r22
+; pop r21
+; pop r20
+; pop r19
+; pop r18
+; pop r17
+; pop r16
+ ret
//
TEMP_UPD:
push r17
rcall TEMP_CONV
- DELAY24 760000
+ DELAY24 500000
+ DELAY24 500000
rcall TEMP_RD
; обновляем данные в ячейках
@@ -281,6 +382,31 @@ TEMP_UPD:
ret
//
+//
+RD_F_CODE:
+ push r16
+
+ rcall OW_PRESENCE
+ ldi r16, DS18B20_CMD_SKIPROM
+ mov OW_CMD_r, r16
+ rcall OW_SEND_BYTE
+
+ ldi r16, DS18B20_CMD_RSCRATCHPAD
+ mov OW_CMD_r, r16
+ rcall OW_SEND_BYTE
+
+ ldi XL, LOW(DEVICE_FAMILY_CODE)
+ ldi XH, HIGH(DEVICE_FAMILY_CODE)
+
+ ldi r16, 8
+_RD_L:
+ rcall OW_RD_BYTE
+ dec r16
+ brne _RD_L
+
+ pop r16
+ ret//
+
//
TEMP_RD:
push r16
diff --git a/main.hex b/main.hex
index c0ad2b7..95b9f48 100644
--- a/main.hex
+++ b/main.hex
@@ -7,59 +7,68 @@
:10004A000F931F935FB74091670045300CF403C0CC
:10005A00442740936700403081F493989498959888
:10006A000EF002C00BE002C000916500002311F0FF
-:10007A00929A01C092986AD1E5D0413081F492985F
+:10007A00929A01C09298B5D130D1413081F49298C8
:10008A00949895980091640030916500032B11F0C3
-:10009A00939A01C093980091640058D1D3D042300A
-:1000AA0059F4929893989598949A009163004ED136
-:1000BA00002D0F77002EC6D0433041F492989398C2
-:1000CA009498959A00916C0041D1BCD04395409385
+:10009A00939A01C0939800916400A3D11ED1423073
+:1000AA0059F4929893989598949A0091630099D1EB
+:1000BA00002D0F77002E11D1433041F49298939876
+:1000CA009498959A00916B008CD107D143954093EF
:1000DA0067005FBF1F910F915F914F9118950FEDC8
:1000EA000DBF0FE701BB01EE07BB0CE108BB02E045
-:1000FA0000BF05E003BF09E106BF01E009BF00E256
-:10010A000BBF0CE100BD37E04EE746D11124109237
-:10011A00670000E000936000002700936A000093E4
-:10012A006B0000EF00936C001CD180E090E000911E
-:10013A006000003071F49698EFD07AD052E13DE831
-:10014A004DEF2ED12BD010916A00812F10916B00A8
-:10015A00912F013019F49698DFD080D0023039F708
-:10016A00969A1BE010936300109364001093650045
-:10017A0010936600DCCFEE24FF1841E1001F111F27
-:10018A004A9509F40895EE1CFF1CE21AF30A20F4BA
-:10019A00E20EF31E8894F2CF0894F0CF0F931F93C8
-:1001AA002F933F934F9368D00CEC802E7AD00EEBAE
-:1001BA00802E77D0AAE6B0E095D0ABE6B0E092D038
-:1001CA0010916A0020916B002F93287F283F11F02D
-:1001DA00E89409C02F9168941095209531E0130F87
-:1001EA0030E0231F01C02F91269517952695179564
-:1001FA00269517952695179530916A000EF4319534
-:10020A00432F3F70432F330F330F330F440F340FF5
-:10021A00369536953695369510936A0020936B007D
-:10022A0030936C004F913F912F911F910F91089538
-:10023A000F9322D00CEC802E34D004E4802E31D0DF
-:10024A000F9108950F930FB800E40EB90BE10DB9A1
-:10025A00769BFDCFC09AC0980F9108950F938CD0CA
-:10026A00B29B0196B39B0197B49B01C003C000E007
-:10027A00009360000F910895F894B99A33E04EEB19
-:10028A008BD0B99830E04AE887D005D033E042E312
-:10029A0083D078940895B19B716002C0B1997E7F32
-:1002AA0008950F931F93082D18E0069508F458F047
-:1002BA00F894B99A30E046E76FD0B99830E042E155
-:1002CA006BD078940AC0F894B99A30E04AE064D0C6
-:1002DA00B99830E04EE760D078941A9531F71F91BB
-:1002EA000F9108950F931F93002718E0F89406952D
-:1002FA00B99A30E04AE050D0B99830E040E14CD0A9
-:10030A00B199006830E04CE647D01A9581F70C9312
-:10031A0078941F910F910895F8945F9354E0A3E69F
-:10032A00B0E08093610090936200009161001091A7
-:10033A0062002AE030E01FDFED9200936100109323
-:10034A0062005A9591F75F91789408950F931F93DD
-:10035A00E4EDF3E01127E00FF11F04901F910F91D4
-:10036A000895C59A22D0C5980895C59A1ED01DD061
-:10037A001CD01BD0C59808950F931F932F932AE082
-:10038A001FEF0FEF0A95F1F71A95D9F72A95C1F7DA
-:10039A002F911F910F91089541503040E8F7089529
-:1003AA00415030405040E0F708950F931F932F9328
-:1003BA0026E00FEF1FEF1A95F1F70A95D9F72A955C
-:1003CA00C1F72F911F910F910895C0F9A4B0999286
-:0603DA0082F880909CBF38
+:1000FA0000BF05E003BF09E106BF00E20BBF0CE148
+:10010A0000BD11241092670000E0009360000FEF19
+:10011A0000936C0005E000936D0005E000936E000B
+:10012A0001E000936F0000270093690000936A00C2
+:10013A0000EF00936B0060D180E090E000916000D6
+:10014A00003031F4969833D161D001E009BF25D04F
+:10015A00013019F496982BD1CCD0023079F7969ABF
+:10016A001BE01093630010936400109365001093D2
+:10017A006600E4CFEE24FF1841E1001F111F4A95E3
+:10018A0009F40895EE1CFF1CE21AF30A20F4E20EA9
+:10019A00F31E8894F2CF0894F0CF0F931F932F93F6
+:1001AA003F934F935F936F930091690010916A0098
+:1001BA0020916B0030916C0040916D0050916F005E
+:1001CA000EF43195552309F419C003172CF416F4CB
+:1001DA00909801C0909A12C0031729F016F4909AC9
+:1001EA0001C090980BC016F4909801C0909A2417F9
+:1001FA000CF404C016F4909A01C090986F915F9124
+:10020A004F913F912F911F910F9108951F935BD0AA
+:10021A005CE034E34DEF0FD15CE034E34DEF0BD1FA
+:10022A0008D010916900812F10916A00912F1F91B7
+:10023A0008950F931F932F933F934F9368D00CEC1D
+:10024A00802E7AD00EEB802E77D0A9E6B0E095D03A
+:10025A00AAE6B0E092D01091690020916A002F932B
+:10026A00287F283F11F0E89409C02F9168941095CF
+:10027A00209531E0130F30E0231F01C02F912695FE
+:10028A0017952695179526951795269517953091C2
+:10029A0069000EF43195432F3F70432F330F330F0C
+:1002AA00330F440F340F369536953695369510939D
+:1002BA00690020936A0030936B004F913F912F9110
+:1002CA001F910F9108950F9322D00CEC802E34D0F9
+:1002DA0004E4802E31D00F9108950F930FB800E4F3
+:1002EA000EB90BE10DB9769BFDCFC09AC0980F915C
+:1002FA0008950F938CD0B29B0196B39B0197B49B40
+:10030A0001C003C000E0009360000F910895F894C3
+:10031A00B99A33E04EEB8BD0B99830E04AE887D0EF
+:10032A0005D033E042E383D078940895B19B71609D
+:10033A0002C0B1997E7F08950F931F93082D18E08C
+:10034A00069508F458F0F894B99A30E046E76FD069
+:10035A00B99830E042E16BD078940AC0F894B99A1F
+:10036A0030E04AE064D0B99830E04EE760D0789443
+:10037A001A9531F71F910F9108950F931F93002734
+:10038A0018E0F8940695B99A30E04AE050D0B99846
+:10039A0030E040E14CD0B199006830E04CE647D0FB
+:1003AA001A9581F70C9378941F910F910895F894F8
+:1003BA005F9354E0A3E6B0E08093610090936200FB
+:1003CA0000916100109162002AE030E0D3DEED92E4
+:1003DA0000936100109362005A9591F75F917894A7
+:1003EA0008950F931F93EAE6F4E01127E00FF11F37
+:1003FA0004901F910F910895C59A22D0C598089527
+:10040A00C59A1ED01DD01CD01BD0C59808950F9335
+:10041A001F932F932AE01FEF0FEF0A95F1F71A9512
+:10042A00D9F72A95C1F72F911F910F91089541503D
+:10043A003040E8F70895415030405040E0F70895C1
+:10044A000F931F932F9326E00FEF1FEF1A95F1F7E3
+:10045A000A95D9F72A95C1F72F911F910F910895FF
+:0C046A00C0F9A4B0999282F880909CBF69
:00000001FF