diff --git a/dist/default/production/attiny2313a_thermostat.X.production.hex b/dist/default/production/attiny2313a_thermostat.X.production.hex
index ce9e02e..9ba1b82 100644
--- a/dist/default/production/attiny2313a_thermostat.X.production.hex
+++ b/dist/default/production/attiny2313a_thermostat.X.production.hex
@@ -1,5 +1,5 @@
:020000020000FC
-:0200000068C0D6
+:0200000069C0D5
:0200160018953B
:10001A0015C00F931F932F933F930FB7B49908C03E
:10002A0020916000203009F003C011E010936000B5
@@ -7,53 +7,56 @@
:10004A000F935FB74091670045300CF403C0442713
:10005A0040936700403081F49398949895980EF0F5
:10006A0002C00BE002C000916500002311F0929AD1
-:10007A0001C0929851D1CCD0413041F492989498D1
-:10008A009598939A0091640047D1C2D0423059F4AE
-:10009A00929893989598949A009163003DD1002D77
-:1000AA000F77002EB5D0433039F4929893989498EC
-:1000BA00959A00E031D1ACD04395409367005FBF79
-:1000CA000F915F914F9118950FED0DBF0EE701BB90
-:1000DA0001EC07BB0CE108BB02E000BF05E003BF6F
-:1000EA0009E106BF01E009BF00E20BBF0CE100BD58
-:1000FA0003E309B900E002B908E10AB906E003B965
-:10010A0011241092670000E000936000002700931A
-:10011A006A0000936B0080E090E00091600000307C
-:10012A0079F4E0D070FD969A70FF969867D0FFD068
-:10013A00FED02ED010916A00812F10916B00912F62
-:10014A00013011F4CFD070D0023039F71BE0109390
-:10015A00630010936400109365001093660000001A
-:10016A00DCCFEE24FF1841E1001F111F4A9509F464
-:10017A000895EE1CFF1CE21AF30A20F4E20EF31EA5
-:10018A008894F2CF0894F0CF41503040E8F70895B0
-:10019A000F931F932F933F9355D00CEC802E67D06B
-:1001AA000EEB802E64D0AAE6B0E082D0ABE6B0E0D7
-:1001BA007FD010916A0020916B002F93287F283FEF
-:1001CA0011F0E89409C02F9168941095209531E0B8
-:1001DA00130F30E0231F01C02F91269517952695FE
-:1001EA001795269517952695179510936A002093CB
-:1001FA006B003F912F911F910F9108950F9322D079
-:10020A000CEC802E34D004E4802E31D00F91089566
-:10021A000F930FB800E40EB90BE10DB9769BFDCF31
-:10022A00C09AC0980F9108950F9381D0B29B0196FE
-:10023A00B39B0197B49B01C003C000E00093600028
-:10024A000F910895F894B99A33E04EEB9DDFB9986F
-:10025A0030E04AE899DF05D033E042E395DF78944D
-:10026A000895B19B716002C0B1997E7F08950F9382
-:10027A001F93082D18E0069508F458F0F894B99AD7
-:10028A0030E046E781DFB99830E042E17DDF7894DB
-:10029A000AC0F894B99A30E04AE076DFB99830E0BB
-:1002AA004EE772DF78941A9531F71F910F910895EE
-:1002BA000F931F93002718E0F8940695B99A30E037
-:1002CA004AE062DFB99830E040E15EDFB199006848
-:1002DA0030E04CE659DF1A9581F70C9378941F9118
-:1002EA000F910895F8945F9354E0A3E6B0E08093E9
-:1002FA0061009093620000916100109162002AE00F
-:10030A0030E02FDFED9200936100109362005A955E
-:10031A0091F75F91789408950F931F93E4E7F3E0C0
-:10032A001127E00FF11F04901F910F9108950F9369
-:10033A001F932F932AE01FEF0FEF0A95F1F71A95F3
-:10034A00D9F72A95C1F72F911F910F9108950F930D
-:10035A001F930FEF1FEF1A95000000000000D9F756
-:10036A000A95C1F71F910F910895C0F9A4B0999207
-:06037A0082F880909CBF98
+:10007A0001C0929869D1E4D0413041F492989498A1
+:10008A009598939A009164005FD1DAD0423059F47E
+:10009A00929893989598949A0091630055D1002D5F
+:1000AA000F77002ECDD0433041F4929893989498CC
+:1000BA00959A00916C0048D1C3D04395409367004C
+:1000CA005FBF0F915F914F9118950FED0DBF0EE72E
+:1000DA0001BB01EC07BB0CE108BB02E000BF05E075
+:1000EA0003BF09E106BF01E009BF00E20BBF0CE153
+:1000FA0000BD03E309B900E002B908E10AB906E064
+:10010A0003B911241092670000E0009360000027F1
+:10011A0000936A0000936B0000EF00936C0080E08C
+:10012A0090E000916000003079F4F4D070FD969A66
+:10013A0070FF96987BD013D112D12ED010916A00FD
+:10014A00812F10916B00912F013011F4E3D084D0EC
+:10015A00023039F71BE01093630010936400109388
+:10016A006500109366000000DCCFEE24FF1841E121
+:10017A00001F111F4A9509F40895EE1CFF1CE21A8C
+:10018A00F30A20F4E20EF31E8894F2CF0894F0CF1B
+:10019A0041503040E8F708950F931F932F933F93F0
+:1001AA004F9368D00CEC802E7AD00EEB802E77D04D
+:1001BA00AAE6B0E095D0ABE6B0E092D010916A0022
+:1001CA0020916B002F93287F283F11F0E89409C0F3
+:1001DA002F9168941095209531E0130F30E0231F7A
+:1001EA0001C02F912695179526951795269517954F
+:1001FA002695179530916A000EF43195432F3F707A
+:10020A00432F330F330F330F440F340F3695369580
+:10021A003695369510936A0020936B0030936C00E4
+:10022A004F913F912F911F910F9108950F9322D0D3
+:10023A000CEC802E34D004E4802E31D00F91089536
+:10024A000F930FB800E40EB90BE10DB9769BFDCF01
+:10025A00C09AC0980F9108950F9381D0B29B0196CE
+:10026A00B39B0197B49B01C003C000E000936000F8
+:10027A000F910895F894B99A33E04EEB89DFB99853
+:10028A0030E04AE885DF05D033E042E381DF789445
+:10029A000895B19B716002C0B1997E7F08950F9352
+:1002AA001F93082D18E0069508F458F0F894B99AA7
+:1002BA0030E046E76DDFB99830E042E169DF7894D3
+:1002CA000AC0F894B99A30E04AE062DFB99830E09F
+:1002DA004EE75EDF78941A9531F71F910F910895D2
+:1002EA000F931F93002718E0F8940695B99A30E007
+:1002FA004AE04EDFB99830E040E14ADFB199006840
+:10030A0030E04CE645DF1A9581F70C9378941F91FB
+:10031A000F910895F8945F9354E0A3E6B0E08093B8
+:10032A0061009093620000916100109162002AE0DE
+:10033A0030E01BDFED9200936100109362005A9542
+:10034A0091F75F91789408950F931F93E4EAF3E08D
+:10035A001127E00FF11F04901F910F9108950F9339
+:10036A001F932F932AE01FEF0FEF0A95F1F71A95C3
+:10037A00D9F72A95C1F72F911F910F9108950F93DD
+:10038A001F930FEF1FEF1A95000000000000D9F726
+:10039A000A95C1F71F910F910895C0F9A4B09992D7
+:0603AA0082F880909CBF68
:00000001FF
diff --git a/dist/default/production/attiny2313a_thermostat.X.production.lss b/dist/default/production/attiny2313a_thermostat.X.production.lss
index e80ecf7..1df891f 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 Tue Jun 20 12:55:26 2023
+AVRASM ver. 2.2.7 main.asm Tue Jun 20 22:06:23 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(286): Including file 'div16u.asm'
+main.asm(275): Including file 'div16u.asm'
div16u.asm(22): warning: Register r16 already defined by the .DEF directive
-main.asm(286): 'div16u.asm' included form here
+main.asm(275): 'div16u.asm' included form here
div16u.asm(23): warning: Register r17 already defined by the .DEF directive
-main.asm(286): 'div16u.asm' included form here
+main.asm(275): 'div16u.asm' included form here
div16u.asm(24): warning: Register r16 already defined by the .DEF directive
-main.asm(286): 'div16u.asm' included form here
+main.asm(275): 'div16u.asm' included form here
div16u.asm(25): warning: Register r17 already defined by the .DEF directive
-main.asm(286): 'div16u.asm' included form here
+main.asm(275): 'div16u.asm' included form here
div16u.asm(27): warning: Register r19 already defined by the .DEF directive
-main.asm(286): 'div16u.asm' included form here
+main.asm(275): 'div16u.asm' included form here
div16u.asm(28): warning: Register r20 already defined by the .DEF directive
-main.asm(286): 'div16u.asm' included form here
+main.asm(275): '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(286): Including file 'div16u.asm'
+main.asm(275): Including file 'div16u.asm'
;
@@ -826,8 +826,9 @@ main.asm(286): Including file 'div16u.asm'
000067 CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
000068 SW_FLAGS: .BYTE 1 ; Состояние кнопок
000069 HYSTERESIS: .BYTE 1 ; Отклонение температуры от уставки
-00006a TEMP_L: .BYTE 1
-00006b TEMP_H: .BYTE 1
+00006a TEMP_L: .BYTE 1 ; Младший байт температуры
+00006b TEMP_H: .BYTE 1 ; Старший байт температуры
+00006c TEMP_F: .BYTE 1 ; Дробная часть
;//
@@ -837,7 +838,7 @@ main.asm(286): Including file 'div16u.asm'
//
.ORG 0x00
-000000 c068 rjmp RESET_vect
+000000 c069 rjmp RESET_vect
.ORG 0x000B
; rjmp PCINT0_vect
@@ -917,8 +918,8 @@ main.asm(286): Including file 'div16u.asm'
00003d c001 rjmp PC+2
00003e 9892 cbi PORTD, DIGIT_1_PIN
; lds TEMP_REG_A, DIGITS+2
-00003f d151 rcall DISPLAY_DECODER
-000040 d0cc rcall USI_TRANSMIT
+00003f d169 rcall DISPLAY_DECODER
+000040 d0e4 rcall USI_TRANSMIT
_indicate_2:
000041 3041 cpi r20, 1
@@ -934,8 +935,8 @@ main.asm(286): Including file 'div16u.asm'
; rjmp PC+2
; cbi PORTD, DIGIT_1_PIN
000047 9100 0064 lds TEMP_REG_A, DIGITS+1
-000049 d147 rcall DISPLAY_DECODER
-00004a d0c2 rcall USI_TRANSMIT
+000049 d15f rcall DISPLAY_DECODER
+00004a d0da rcall USI_TRANSMIT
_indicate_3:
00004b 3042 cpi r20, 2
@@ -946,107 +947,95 @@ main.asm(286): Including file 'div16u.asm'
00004f 9895 cbi PORTD, DIGIT_4_PIN
000050 9a94 sbi PORTD, DIGIT_3_PIN
000051 9100 0063 lds TEMP_REG_A, DIGITS
-000053 d13d rcall DISPLAY_DECODER
+000053 d155 rcall DISPLAY_DECODER
; зажигаем точку
000054 2d00 mov r16, r0
000055 770f cbr r16, (1<<7)
000056 2e00 mov r0, r16
-000057 d0b5 rcall USI_TRANSMIT
+000057 d0cd rcall USI_TRANSMIT
_indicate_4:
000058 3043 cpi r20, 3
-000059 f439 brne _indicate_exit
+000059 f441 brne _indicate_exit
00005a 9892 cbi PORTD, DIGIT_1_PIN
00005b 9893 cbi PORTD, DIGIT_2_PIN
00005c 9894 cbi PORTD, DIGIT_3_PIN
00005d 9a95 sbi PORTD, DIGIT_4_PIN
- ; lds TEMP_REG_A, DIGITS
-00005e e000 ldi TEMP_REG_A, 0
-00005f d131 rcall DISPLAY_DECODER
-000060 d0ac rcall USI_TRANSMIT
+00005e 9100 006c lds TEMP_REG_A, TEMP_F
+000060 d148 rcall DISPLAY_DECODER
+000061 d0c3 rcall USI_TRANSMIT
_indicate_exit:
-000061 9543 inc r20
-000062 9340 0067 sts CURRENT_DIGIT, r20
-000064 bf5f out SREG, r21
+000062 9543 inc r20
+000063 9340 0067 sts CURRENT_DIGIT, r20
+000065 bf5f out SREG, r21
-000065 910f pop r16
-000066 915f pop r21
-000067 914f pop r20
-000068 9518 reti
+000066 910f pop r16
+000067 915f pop r21
+000068 914f pop r20
+000069 9518 reti
;//
; **** СТАРТ ПРОГРАММЫ *******************************************
RESET_vect:
-000069 ed0f ldi TEMP_REG_A, LOW(RAMEND)
-00006a bf0d out SPL, TEMP_REG_A
+00006a ed0f ldi TEMP_REG_A, LOW(RAMEND)
+00006b bf0d out SPL, TEMP_REG_A
//
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
MCU_INIT:
; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
-00006b e70e
-00006c bb01 outi r16, DDRD, (1<
@@ -1055,43 +1044,43 @@ main.asm(286): Including file 'div16u.asm'
; **** ГЛАВНЫЙ ЦИКЛ **********************************************
LOOP:
; rcall DISPLAY_UPD_DIGITS
-000092 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК
+000096 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК
_STATE_DEFAULT:
-000094 3000 cpi r16, MCU_STATE_DEFAULT
-000095 f479 brne _STATE_PROGRAM
-000096 d0e0 rcall DISPLAY_UPD_DIGITS
-000097 fd70 sbrc OWFR, OWPRF
-000098 9a96 sbi PORTD, PD6
-000099 ff70 sbrs OWFR, OWPRF
-00009a 9896 cbi PORTD, PD6
+000098 3000 cpi r16, MCU_STATE_DEFAULT
+000099 f479 brne _STATE_PROGRAM
+00009a d0f4 rcall DISPLAY_UPD_DIGITS
+00009b fd70 sbrc OWFR, OWPRF
+00009c 9a96 sbi PORTD, PD6
+00009d ff70 sbrs OWFR, OWPRF
+00009e 9896 cbi PORTD, PD6
-00009b d067 rcall TEMP_CONV
-00009c d0ff rcall DEBOUNCE_SW
-00009d d0fe rcall DEBOUNCE_SW
-00009e d02e rcall TEMP_RD
+00009f d07b rcall TEMP_CONV
+0000a0 d113 rcall DEBOUNCE_SW
+0000a1 d112 rcall DEBOUNCE_SW
+0000a2 d02e rcall TEMP_RD
-00009f 9110 006a lds r17, TEMP_L
-0000a1 2f81 mov DISP_NUM_L, r17
-0000a2 9110 006b lds r17, TEMP_H
-0000a4 2f91 mov DISP_NUM_H, r17
+0000a3 9110 006a lds r17, TEMP_L
+0000a5 2f81 mov DISP_NUM_L, r17
+0000a6 9110 006b lds r17, TEMP_H
+0000a8 2f91 mov DISP_NUM_H, r17
_STATE_PROGRAM:
-0000a5 3001 cpi r16, MCU_STATE_PROGRAM
-0000a6 f411 brne _STATE_ERROR
-0000a7 d0cf rcall DISPLAY_UPD_DIGITS
-0000a8 d070 rcall SW_CHECK_PROCESS
+0000a9 3001 cpi r16, MCU_STATE_PROGRAM
+0000aa f411 brne _STATE_ERROR
+0000ab d0e3 rcall DISPLAY_UPD_DIGITS
+0000ac d084 rcall SW_CHECK_PROCESS
_STATE_ERROR:
-0000a9 3002 cpi r16, MCU_STATE_ERROR
-0000aa f739 brne LOOP
-0000ab e01b ldi r17, 11
-0000ac 9310 0063 sts DIGITS, r17
-0000ae 9310 0064 sts DIGITS+1, r17
-0000b0 9310 0065 sts DIGITS+2, r17
-0000b2 9310 0066 sts DIGITS+3, r17
-0000b4 0000 nop
+0000ad 3002 cpi r16, MCU_STATE_ERROR
+0000ae f739 brne LOOP
+0000af e01b ldi r17, 11
+0000b0 9310 0063 sts DIGITS, r17
+0000b2 9310 0064 sts DIGITS+1, r17
+0000b4 9310 0065 sts DIGITS+2, r17
+0000b6 9310 0066 sts DIGITS+3, r17
+0000b8 0000 nop
-0000b5 cfdc rjmp LOOP
+0000b9 cfdc rjmp LOOP
//
@@ -1129,129 +1118,155 @@ main.asm(286): Including file 'div16u.asm'
;***** Code
div16u:
-0000b6 24ee clr drem16uL ; clear remainder Low byte
-0000b7 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
-0000b8 e141 ldi dcnt16u,17 ; init loop counter
+0000ba 24ee clr drem16uL ; clear remainder Low byte
+0000bb 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
+0000bc e141 ldi dcnt16u,17 ; init loop counter
d16u_1:
-0000b9 1f00 rol dd16uL ; shift left dividend
-0000ba 1f11 rol dd16uH
-0000bb 954a dec dcnt16u ; decrement counter
-0000bc f409 brne d16u_2 ; if done
-0000bd 9508 ret ; return
+0000bd 1f00 rol dd16uL ; shift left dividend
+0000be 1f11 rol dd16uH
+0000bf 954a dec dcnt16u ; decrement counter
+0000c0 f409 brne d16u_2 ; if done
+0000c1 9508 ret ; return
d16u_2:
-0000be 1cee rol drem16uL ; shift dividend into remainder
-0000bf 1cff rol drem16uH
-0000c0 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
-0000c1 0af3 sbc drem16uH,dv16uH
-0000c2 f420 brcc d16u_3 ; if result negative
-0000c3 0ee2 add drem16uL,dv16uL ; restore remainder
-0000c4 1ef3 adc drem16uH,dv16uH
-0000c5 9488 clc ; clear carry to be shifted into result
-0000c6 cff2 rjmp d16u_1 ; else
+0000c2 1cee rol drem16uL ; shift dividend into remainder
+0000c3 1cff rol drem16uH
+0000c4 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
+0000c5 0af3 sbc drem16uH,dv16uH
+0000c6 f420 brcc d16u_3 ; if result negative
+0000c7 0ee2 add drem16uL,dv16uL ; restore remainder
+0000c8 1ef3 adc drem16uH,dv16uH
+0000c9 9488 clc ; clear carry to be shifted into result
+0000ca cff2 rjmp d16u_1 ; else
d16u_3:
-0000c7 9408 sec ; set carry to be shifted into result
-0000c8 cff0
+0000cb 9408 sec ; set carry to be shifted into result
+0000cc cff0
DELAY_LOOP_16:
-0000c9 5041 subi DELAY_8_r, 1
-0000ca 4030 sbci DELAY_16_r, 0
-0000cb f7e8 brcc DELAY_LOOP_16
-0000cc 9508 ret
+0000cd 5041 subi DELAY_8_r, 1
+0000ce 4030 sbci DELAY_16_r, 0
+0000cf f7e8 brcc DELAY_LOOP_16
+0000d0 9508 ret
//
TEMP_RD:
-0000cd 930f push r16
-0000ce 931f push r17
-0000cf 932f push r18
-0000d0 933f push r19
+0000d1 930f push r16
+0000d2 931f push r17
+0000d3 932f push r18
+0000d4 933f push r19
+0000d5 934f push r20
; cli
-0000d1 d055 rcall OW_PRESENCE
-0000d2 ec0c ldi r16, DS18B20_CMD_SKIPROM
-0000d3 2e80 mov OW_CMD_r, r16
-0000d4 d067 rcall OW_SEND_BYTE
+0000d6 d068 rcall OW_PRESENCE
+0000d7 ec0c ldi r16, DS18B20_CMD_SKIPROM
+0000d8 2e80 mov OW_CMD_r, r16
+0000d9 d07a rcall OW_SEND_BYTE
-0000d5 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD
-0000d6 2e80 mov OW_CMD_r, r16
-0000d7 d064 rcall OW_SEND_BYTE
+0000da eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD
+0000db 2e80 mov OW_CMD_r, r16
+0000dc d077 rcall OW_SEND_BYTE
-0000d8 e6aa ldi XL, LOW(TEMP_L)
-0000d9 e0b0 ldi XH, HIGH(TEMP_L)
-0000da d082 rcall OW_RD_BYTE
+0000dd e6aa ldi XL, LOW(TEMP_L)
+0000de e0b0 ldi XH, HIGH(TEMP_L)
+0000df d095 rcall OW_RD_BYTE
-0000db e6ab ldi XL, LOW(TEMP_H)
-0000dc e0b0 ldi XH, HIGH(TEMP_H)
-0000dd d07f rcall OW_RD_BYTE
+0000e0 e6ab ldi XL, LOW(TEMP_H)
+0000e1 e0b0 ldi XH, HIGH(TEMP_H)
+0000e2 d092 rcall OW_RD_BYTE
-0000de 9110 006a lds r17, TEMP_L
-0000e0 9120 006b lds r18, TEMP_H
+0000e3 9110 006a lds r17, TEMP_L
+0000e5 9120 006b lds r18, TEMP_H
-0000e2 932f push r18
-0000e3 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H)
-0000e4 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой
-0000e5 f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число
-0000e6 94e8 clt
-0000e7 c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16)
+0000e7 932f push r18
+0000e8 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H)
+0000e9 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой
+0000ea f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число
+0000eb 94e8 clt
+0000ec c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16)
_TEMP_RD_TO_UNSIGNED:
-0000e8 912f pop r18
-0000e9 9468 set
-0000ea 9510 com r17
-0000eb 9520 com r18
-0000ec e031 ldi r19, 1
-0000ed 0f13 add r17, r19
-0000ee e030 ldi r19, 0
-0000ef 1f23 adc r18, r19
-0000f0 c001 rjmp PC+2
-
+0000ed 912f pop r18
+0000ee 9468 set
+0000ef 9510 com r17
+0000f0 9520 com r18
+0000f1 e031 ldi r19, 1
+0000f2 0f13 add r17, r19
+0000f3 e030 ldi r19, 0
+0000f4 1f23 adc r18, r19
+0000f5 c001 rjmp PC+2
+
_TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4)
-0000f1 912f pop r18
-0000f2 9526 lsr r18
-0000f3 9517 ror r17
-0000f4 9526 lsr r18
-0000f5 9517 ror r17
-0000f6 9526 lsr r18
-0000f7 9517 ror r17
-0000f8 9526 lsr r18
-0000f9 9517 ror r17
- _TEMP_RD_END:
-0000fa 9310 006a sts TEMP_L, r17
-0000fc 9320 006b sts TEMP_H, r18
-
+0000f6 912f pop r18
+0000f7 9526 lsr r18
+0000f8 9517 ror r17
+0000f9 9526 lsr r18
+0000fa 9517 ror r17
+0000fb 9526 lsr r18
+0000fc 9517 ror r17
+0000fd 9526 lsr r18
+0000fe 9517 ror r17
+ _TEMP_RD_END:
+0000ff 9130 006a lds r19, TEMP_L
+000101 f40e brtc PC+2
+000102 9531 neg r19 ; переводим обратно в знаковое число если минус
+
+ ; далее происходит такое для получения дробной части:
+ ; ((n<<3) + (n<<1))>>4 или (n*10)/16
+000103 2f43 mov r20, r19
+000104 703f andi r19, 0x0f
+000105 2f43 mov r20, r19
+000106 0f33 lsl r19
+000107 0f33 lsl r19
+000108 0f33 lsl r19
+
+000109 0f44 lsl r20
+
+00010a 0f34 add r19, r20
+
+00010b 9536 lsr r19
+00010c 9536 lsr r19
+00010d 9536 lsr r19
+00010e 9536 lsr r19
+
+ ; записываем данные
+00010f 9310 006a sts TEMP_L, r17
+000111 9320 006b sts TEMP_H, r18
+000113 9330 006c sts TEMP_F, r19
+
; sei
-0000fe 913f pop r19
-0000ff 912f pop r18
-000100 911f pop r17
-000101 910f pop r16
-000102 9508 ret
+000115 914f pop r20
+000116 913f pop r19
+000117 912f pop r18
+000118 911f pop r17
+000119 910f pop r16
+00011a 9508 ret
;
TEMP_CONV:
-000103 930f push r16
+00011b 930f push r16
; cli
-000104 d022 rcall OW_PRESENCE
-000105 ec0c ldi r16, DS18B20_CMD_SKIPROM
-000106 2e80 mov OW_CMD_r, r16
-000107 d034 rcall OW_SEND_BYTE
+00011c d022 rcall OW_PRESENCE
+00011d ec0c ldi r16, DS18B20_CMD_SKIPROM
+00011e 2e80 mov OW_CMD_r, r16
+00011f d034 rcall OW_SEND_BYTE
-000108 e404 ldi r16, DS18B20_CMD_CONVERTTEMP
-000109 2e80 mov OW_CMD_r, r16
-00010a d031 rcall OW_SEND_BYTE
+000120 e404 ldi r16, DS18B20_CMD_CONVERTTEMP
+000121 2e80 mov OW_CMD_r, r16
+000122 d031 rcall OW_SEND_BYTE
; sei
-00010b 910f pop r16
-00010c 9508 ret
+000123 910f pop r16
+000124 9508 ret
//
//
; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
USI_TRANSMIT:
-00010d 930f push r16
-00010e b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
+000125 930f push r16
+000126 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
-00010f e400 ldi TEMP_REG_A, (1< USI Clock Source Select
; USICLK <--------------> USI Clock Strobe
; USITC <--------------> USI Toggle Clock (Enable clock generation)
-000111 e10b ldi TEMP_REG_A, (1<
+00012d 9ac0 sbi PORTB, USI_LATCH_PIN
+00012e 98c0 cbi PORTB, USI_LATCH_PIN
+00012f 910f pop r16
+000130 9508 ret//
//
SW_CHECK_PROCESS:
-000119 930f push r16
-00011a d081 rcall DEBOUNCE_SW
-00011b 9bb2 sbis SW_PIN, SW_PLUS_PIN
-00011c 9601 adiw DISP_NUM_L, 1
+000131 930f push r16
+000132 d081 rcall DEBOUNCE_SW
+000133 9bb2 sbis SW_PIN, SW_PLUS_PIN
+000134 9601 adiw DISP_NUM_L, 1
-00011d 9bb3 sbis SW_PIN, SW_MINUS_PIN
-00011e 9701 sbiw DISP_NUM_L, 1
+000135 9bb3 sbis SW_PIN, SW_MINUS_PIN
+000136 9701 sbiw DISP_NUM_L, 1
-00011f 9bb4 sbis SW_PIN, SW_SET_PIN
-000120 c001 rjmp _INTO_DEFAULT_STATE
-000121 c003 rjmp _SW_CHECK_PROCESS_END
+000137 9bb4 sbis SW_PIN, SW_SET_PIN
+000138 c001 rjmp _INTO_DEFAULT_STATE
+000139 c003 rjmp _SW_CHECK_PROCESS_END
_INTO_DEFAULT_STATE:
-000122 e000 ldi r16, MCU_STATE_DEFAULT
-000123 9300 0060 sts MCU_STATE, r16
+00013a e000 ldi r16, MCU_STATE_DEFAULT
+00013b 9300 0060 sts MCU_STATE, r16
_SW_CHECK_PROCESS_END:
-000125 910f pop r16
-000126 9508 ret
+00013d 910f pop r16
+00013e 9508 ret
//
@@ -1303,21 +1318,21 @@ main.asm(286): Including file 'div16u.asm'
//
; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ******************************
OW_PRESENCE:
-000127 94f8 cli
-000128 9ab9 ow_pull
-000129 e033
-00012a eb4e
-00012b df9d DELAY16 480
-00012c 98b9 ow_release
-00012d e030
-00012e e84a
-00012f df99 DELAY16 70
-000130 d005 rcall OW_CHECK_PRESENCE
-000131 e033
-000132 e342
-000133 df95 DELAY16 410
-000134 9478 sei
-000135 9508 ret
+00013f 94f8 cli
+000140 9ab9 ow_pull
+000141 e033
+000142 eb4e
+000143 df89 DELAY16 480
+000144 98b9 ow_release
+000145 e030
+000146 e84a
+000147 df85 DELAY16 70
+000148 d005 rcall OW_CHECK_PRESENCE
+000149 e033
+00014a e342
+00014b df81 DELAY16 410
+00014c 9478 sei
+00014d 9508 ret
//
//
@@ -1325,85 +1340,85 @@ main.asm(286): Including file 'div16u.asm'
; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов
;
OW_CHECK_PRESENCE:
-000136 9bb1 sbis OW_PIN, OW_LINE
-000137 6071 sbr OWFR, (1<
//
OW_SEND_BYTE:
-00013c 930f push r16
-00013d 931f push r17
-00013e 2d08 mov r16, OW_CMD_r
-00013f e018 ldi r17, 8
+000154 930f push r16
+000155 931f push r17
+000156 2d08 mov r16, OW_CMD_r
+000157 e018 ldi r17, 8
_OW_SEND_BYTE_LOOP:
-000140 9506 lsr r16
-000141 f408 brcc _OW_SEND_0
-000142 f058 brcs _OW_SEND_1
+000158 9506 lsr r16
+000159 f408 brcc _OW_SEND_0
+00015a f058 brcs _OW_SEND_1
_OW_SEND_0:
-000143 94f8 cli
-000144 9ab9 ow_pull
-000145 e030
-000146 e746
-000147 df81 DELAY16 60
-000148 98b9 ow_release
-000149 e030
-00014a e142
-00014b df7d DELAY16 10
-00014c 9478 sei
-00014d c00a rjmp _OW_SEND_BYTE_END
+00015b 94f8 cli
+00015c 9ab9 ow_pull
+00015d e030
+00015e e746
+00015f df6d DELAY16 60
+000160 98b9 ow_release
+000161 e030
+000162 e142
+000163 df69 DELAY16 10
+000164 9478 sei
+000165 c00a rjmp _OW_SEND_BYTE_END
_OW_SEND_1:
-00014e 94f8 cli
-00014f 9ab9 ow_pull
-000150 e030
-000151 e04a
-000152 df76 DELAY16 6
-000153 98b9 ow_release
-000154 e030
-000155 e74e
-000156 df72 DELAY16 64
-000157 9478 sei
+000166 94f8 cli
+000167 9ab9 ow_pull
+000168 e030
+000169 e04a
+00016a df62 DELAY16 6
+00016b 98b9 ow_release
+00016c e030
+00016d e74e
+00016e df5e DELAY16 64
+00016f 9478 sei
_OW_SEND_BYTE_END:
-000158 951a dec r17
-000159 f731 brne _OW_SEND_BYTE_LOOP
-00015a 911f pop r17
-00015b 910f pop r16
-00015c 9508 ret
+000170 951a dec r17
+000171 f731 brne _OW_SEND_BYTE_LOOP
+000172 911f pop r17
+000173 910f pop r16
+000174 9508 ret
//
//
OW_RD_BYTE:
-00015d 930f push r16
-00015e 931f push r17
-00015f 2700 clr r16
-000160 e018 ldi r17, 8
-000161 94f8 cli
+000175 930f push r16
+000176 931f push r17
+000177 2700 clr r16
+000178 e018 ldi r17, 8
+000179 94f8 cli
_OW_RD_BYTE_LP:
-000162 9506 lsr r16
-000163 9ab9 ow_pull
-000164 e030
-000165 e04a
-000166 df62 DELAY16 6
-000167 98b9 ow_release
-000168 e030
-000169 e140
-00016a df5e DELAY16 9
-00016b 99b1 sbic OW_PIN, OW_LINE
-00016c 6800 sbr r16, (1<<7)
-00016d e030
-00016e e64c
-00016f df59 DELAY16 55
-000170 951a dec r17
-000171 f781 brne _OW_RD_BYTE_LP
-000172 930c st X, r16
-000173 9478 sei
-000174 911f pop r17
-000175 910f pop r16
-000176 9508 ret
+00017a 9506 lsr r16
+00017b 9ab9 ow_pull
+00017c e030
+00017d e04a
+00017e df4e DELAY16 6
+00017f 98b9 ow_release
+000180 e030
+000181 e140
+000182 df4a DELAY16 9
+000183 99b1 sbic OW_PIN, OW_LINE
+000184 6800 sbr r16, (1<<7)
+000185 e030
+000186 e64c
+000187 df45 DELAY16 55
+000188 951a dec r17
+000189 f781 brne _OW_RD_BYTE_LP
+00018a 930c st X, r16
+00018b 9478 sei
+00018c 911f pop r17
+00018d 910f pop r16
+00018e 9508 ret
//
@@ -1415,122 +1430,122 @@ main.asm(286): Including file 'div16u.asm'
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
; путем деления этого числа несколько раз
DISPLAY_UPD_DIGITS:
-000177 94f8 cli
-000178 935f push r21
-000179 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный
+00018f 94f8 cli
+000190 935f push r21
+000191 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный
; инициализация указателя (за каждый проход цикла будет инкрементироваться)
-00017a e6a3 ldi XL, LOW(DIGITS)
-00017b e0b0 ldi XH, HIGH(DIGITS)
+000192 e6a3 ldi XL, LOW(DIGITS)
+000193 e0b0 ldi XH, HIGH(DIGITS)
.equ dividend = SRAM_TEMP_1 ; число которе будем делить
.equ divisor = 10 ; на что делим
; загружаем число которое хотим поделить в адрес SRAM делимого
-00017c 9380 0061 sts dividend, DISP_NUM_L
-00017e 9390 0062 sts dividend+1, DISP_NUM_H
+000194 9380 0061 sts dividend, DISP_NUM_L
+000196 9390 0062 sts dividend+1, DISP_NUM_H
; четыре раза производим деление для получения остатков
DIV_LOOP:
; заполняем нужные регистры
-000180 9100 0061 lds dd16uL, dividend
-000182 9110 0062 lds dd16uH, dividend+1
-000184 e02a ldi dv16uL, LOW(divisor)
-000185 e030 ldi dv16uH, HIGH(divisor)
+000198 9100 0061 lds dd16uL, dividend
+00019a 9110 0062 lds dd16uH, dividend+1
+00019c e02a ldi dv16uL, LOW(divisor)
+00019d e030 ldi dv16uH, HIGH(divisor)
-000186 df2f rcall div16u ; делим
+00019e df1b rcall div16u ; делим
-000187 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его
+00019f 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его
; обновляем делимое
-000188 9300 0061 sts dividend, dres16uL
-00018a 9310 0062 sts dividend+1, dres16uH
+0001a0 9300 0061 sts dividend, dres16uL
+0001a2 9310 0062 sts dividend+1, dres16uH
-00018c 955a dec r21 ; декрементируем счетчик цикла
-00018d f791 brne DIV_LOOP ; делим еще раз если не 0
-00018e 915f pop r21
-00018f 9478 sei
-000190 9508 ret
+0001a4 955a dec r21 ; декрементируем счетчик цикла
+0001a5 f791 brne DIV_LOOP ; делим еще раз если не 0
+0001a6 915f pop r21
+0001a7 9478 sei
+0001a8 9508 ret
//
//
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
DISPLAY_DECODER:
-000191 930f push r16
-000192 931f push r17
-000193 e7e4 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
-000194 e0f3 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
+0001a9 930f push r16
+0001aa 931f push r17
+0001ab eae4 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
+0001ac e0f3 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
-000195 2711 clr TEMP_REG_B
-000196 0fe0 add ZL, TEMP_REG_A
-000197 1ff1 adc ZH, TEMP_REG_B
+0001ad 2711 clr TEMP_REG_B
+0001ae 0fe0 add ZL, TEMP_REG_A
+0001af 1ff1 adc ZH, TEMP_REG_B
-000198 9004 lpm r0, Z
-000199 911f pop r17
-00019a 910f pop r16
-00019b 9508 ret//
+0001b0 9004 lpm r0, Z
+0001b1 911f pop r17
+0001b2 910f pop r16
+0001b3 9508 ret//
//
DEBOUNCE_SW:
-00019c 930f push r16
-00019d 931f push r17
-00019e 932f push r18
+0001b4 930f push r16
+0001b5 931f push r17
+0001b6 932f push r18
-00019f e02a ldi r18, 10
+0001b7 e02a ldi r18, 10
_loop_2:
-0001a0 ef1f ldi r17, 255
+0001b8 ef1f ldi r17, 255
_loop_0:
-0001a1 ef0f ldi r16, 255
+0001b9 ef0f ldi r16, 255
_dec_0:
-0001a2 950a dec r16
-0001a3 f7f1 brne _dec_0
+0001ba 950a dec r16
+0001bb f7f1 brne _dec_0
_loop_1:
-0001a4 951a dec r17
-0001a5 f7d9 brne _loop_0
+0001bc 951a dec r17
+0001bd f7d9 brne _loop_0
_loop_3:
-0001a6 952a dec r18
-0001a7 f7c1 brne _loop_2
+0001be 952a dec r18
+0001bf f7c1 brne _loop_2
-0001a8 912f pop r18
-0001a9 911f pop r17
-0001aa 910f pop r16
-0001ab 9508 ret//
+0001c0 912f pop r18
+0001c1 911f pop r17
+0001c2 910f pop r16
+0001c3 9508 ret//
//
DELAY:
-0001ac 930f push r16
-0001ad 931f push r17
+0001c4 930f push r16
+0001c5 931f push r17
-0001ae ef0f ldi r16, 255
+0001c6 ef0f ldi r16, 255
_DELAY_1:
-0001af ef1f ldi r17, 255
+0001c7 ef1f ldi r17, 255
_DELAY_2:
-0001b0 951a dec r17
-0001b1 0000 nop
-0001b2 0000 nop
-0001b3 0000 nop
-0001b4 f7d9 brne _DELAY_2
+0001c8 951a dec r17
+0001c9 0000 nop
+0001ca 0000 nop
+0001cb 0000 nop
+0001cc f7d9 brne _DELAY_2
-0001b5 950a dec r16
-0001b6 f7c1 brne _DELAY_1
+0001cd 950a dec r16
+0001ce f7c1 brne _DELAY_1
-0001b7 911f pop r17
-0001b8 910f pop r16
-0001b9 9508 ret //
+0001cf 911f pop r17
+0001d0 910f pop r16
+0001d1 9508 ret //
//
DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA
-0001ba f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
-0001bb b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
-0001bc 9299 .DB 0b10011001, 0b10010010 ; 4, 5
-0001bd f882 .DB 0b10000010, 0b11111000 ; 6, 7
-0001be 9080 .DB 0b10000000, 0b10010000 ; 8, 9
-0001bf bf9c .DB 0b10011100, 0b10111111 ; °, -//
+0001d2 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
+0001d3 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
+0001d4 9299 .DB 0b10011001, 0b10010010 ; 4, 5
+0001d5 f882 .DB 0b10000010, 0b11111000 ; 6, 7
+0001d6 9080 .DB 0b10000000, 0b10010000 ; 8, 9
+0001d7 bf9c .DB 0b10011100, 0b10111111 ; °, -//
//
@@ -1558,37 +1573,37 @@ 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: 98 r17: 46 r18: 26 r19: 22 r20: 25
+r13: 0 r14: 5 r15: 5 r16: 100 r17: 46 r18: 26 r19: 36 r20: 31
r21: 8 r22: 0 r23: 4 r24: 5 r25: 3 r26: 3 r27: 3 r28: 0
r29: 0 r30: 2 r31: 2
Registers used: 20 out of 35 (57.1%)
"ATtiny2313A" instruction use summary:
-.lds : 0 .sts : 0 adc : 3 add : 3 adiw : 1 and : 0
-andi : 0 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0
+.lds : 0 .sts : 0 adc : 3 add : 4 adiw : 1 and : 0
+andi : 1 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0
brcc : 3 brcs : 1 break : 0 breq : 3 brge : 1 brhc : 0
brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0
-brne : 16 brpl : 0 brsh : 0 brtc : 0 brts : 1 brvc : 0
+brne : 16 brpl : 0 brsh : 0 brtc : 1 brts : 1 brvc : 0
brvs : 0 bset : 0 bst : 0 cbi : 19 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 : 9 eor : 0 icall : 0 ijmp : 0 in : 2
-inc : 1 ld : 0 ldd : 0 ldi : 69 lds : 12 lpm : 2
-lsl : 0 lsr : 6 mov : 9 movw : 0 neg : 0 nop : 4
-or : 0 ori : 0 out : 19 pop : 28 push : 27 rcall : 36
+inc : 1 ld : 0 ldd : 0 ldi : 69 lds : 14 lpm : 2
+lsl : 4 lsr : 10 mov : 11 movw : 0 neg : 1 nop : 4
+or : 0 ori : 0 out : 19 pop : 29 push : 28 rcall : 36
ret : 14 reti : 3 rjmp : 18 rol : 4 ror : 4 sbc : 1
sbci : 1 sbi : 10 sbic : 3 sbis : 5 sbiw : 1 sbr : 2
sbrc : 1 sbrs : 1 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 : 18 sub : 2 subi : 1
+spm : 0 st : 2 std : 0 sts : 20 sub : 2 subi : 1
swap : 0 tst : 1 wdr : 0
-Instructions used: 52 out of 105 (49.5%)
+Instructions used: 56 out of 105 (53.3%)
"ATtiny2313A" memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
-[.cseg] 0x000000 0x000380 862 12 874 2048 42.7%
-[.dseg] 0x000060 0x00006c 0 12 12 128 9.4%
+[.cseg] 0x000000 0x0003b0 910 12 922 2048 45.0%
+[.dseg] 0x000060 0x00006d 0 13 13 128 10.2%
[.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 f98c689..24f84da 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 Tue Jun 20 12:55:26 2023
+AVRASM ver. 2.2.7 main.asm Tue Jun 20 22:06:23 2023
EQU SIGNATURE_000 0000001e
@@ -529,7 +529,8 @@ DSEG SW_FLAGS 00000068
DSEG HYSTERESIS 00000069
DSEG TEMP_L 0000006a
DSEG TEMP_H 0000006b
-CSEG RESET_vect 00000069
+DSEG TEMP_F 0000006c
+CSEG RESET_vect 0000006a
CSEG TIMER0_COMPA_vect 00000023
CSEG PCINT0_vect 0000000e
CSEG _PCINT0_vect_end 0000001d
@@ -537,22 +538,22 @@ CSEG _INTO_PROGRAM_STATE 0000001a
CSEG _CLR_CURRENT_DIGIT 0000002c
CSEG _indicate_1 0000002f
CSEG _indicate_2 00000041
-CSEG DISPLAY_DECODER 00000191
-CSEG USI_TRANSMIT 0000010d
+CSEG DISPLAY_DECODER 000001a9
+CSEG USI_TRANSMIT 00000125
CSEG _indicate_3 0000004b
CSEG _indicate_4 00000058
-CSEG _indicate_exit 00000061
-CSEG MCU_INIT 0000006b
-CSEG continue 00000085
-CSEG LOOP 00000092
-CSEG _STATE_DEFAULT 00000094
-CSEG _STATE_PROGRAM 000000a5
-CSEG DISPLAY_UPD_DIGITS 00000177
-CSEG TEMP_CONV 00000103
-CSEG DEBOUNCE_SW 0000019c
-CSEG TEMP_RD 000000cd
-CSEG _STATE_ERROR 000000a9
-CSEG SW_CHECK_PROCESS 00000119
+CSEG _indicate_exit 00000062
+CSEG MCU_INIT 0000006c
+CSEG continue 00000086
+CSEG LOOP 00000096
+CSEG _STATE_DEFAULT 00000098
+CSEG _STATE_PROGRAM 000000a9
+CSEG DISPLAY_UPD_DIGITS 0000018f
+CSEG TEMP_CONV 0000011b
+CSEG DEBOUNCE_SW 000001b4
+CSEG TEMP_RD 000000d1
+CSEG _STATE_ERROR 000000ad
+CSEG SW_CHECK_PROCESS 00000131
DEF drem16uL r14
DEF drem16uH r15
DEF dres16uL r16
@@ -562,36 +563,36 @@ DEF dd16uH r17
DEF dv16uL r18
DEF dv16uH r19
DEF dcnt16u r20
-CSEG div16u 000000b6
-CSEG d16u_1 000000b9
-CSEG d16u_2 000000be
-CSEG d16u_3 000000c7
-CSEG DELAY_LOOP_16 000000c9
-CSEG OW_PRESENCE 00000127
-CSEG OW_SEND_BYTE 0000013c
-CSEG OW_RD_BYTE 0000015d
-CSEG _TEMP_RD_TO_UNSIGNED 000000e8
-CSEG _TEMP_RD_CONTINUE 000000f1
-CSEG _TEMP_RD_END 000000fa
-CSEG _USI_TRANSMIT_LOOP 00000112
-CSEG _INTO_DEFAULT_STATE 00000122
-CSEG _SW_CHECK_PROCESS_END 00000125
-CSEG OW_CHECK_PRESENCE 00000136
-CSEG _EXIT 0000013b
-CSEG _OW_SEND_BYTE_LOOP 00000140
-CSEG _OW_SEND_0 00000143
-CSEG _OW_SEND_1 0000014e
-CSEG _OW_SEND_BYTE_END 00000158
-CSEG _OW_RD_BYTE_LP 00000162
+CSEG div16u 000000ba
+CSEG d16u_1 000000bd
+CSEG d16u_2 000000c2
+CSEG d16u_3 000000cb
+CSEG DELAY_LOOP_16 000000cd
+CSEG OW_PRESENCE 0000013f
+CSEG OW_SEND_BYTE 00000154
+CSEG OW_RD_BYTE 00000175
+CSEG _TEMP_RD_TO_UNSIGNED 000000ed
+CSEG _TEMP_RD_CONTINUE 000000f6
+CSEG _TEMP_RD_END 000000ff
+CSEG _USI_TRANSMIT_LOOP 0000012a
+CSEG _INTO_DEFAULT_STATE 0000013a
+CSEG _SW_CHECK_PROCESS_END 0000013d
+CSEG OW_CHECK_PRESENCE 0000014e
+CSEG _EXIT 00000153
+CSEG _OW_SEND_BYTE_LOOP 00000158
+CSEG _OW_SEND_0 0000015b
+CSEG _OW_SEND_1 00000166
+CSEG _OW_SEND_BYTE_END 00000170
+CSEG _OW_RD_BYTE_LP 0000017a
EQU dividend 00000061
EQU divisor 0000000a
-CSEG DIV_LOOP 00000180
-CSEG DISPLAY_SYMBOLS 000001ba
-CSEG _loop_2 000001a0
-CSEG _loop_0 000001a1
-CSEG _dec_0 000001a2
-CSEG _loop_1 000001a4
-CSEG _loop_3 000001a6
-CSEG DELAY 000001ac
-CSEG _DELAY_1 000001af
-CSEG _DELAY_2 000001b0
+CSEG DIV_LOOP 00000198
+CSEG DISPLAY_SYMBOLS 000001d2
+CSEG _loop_2 000001b8
+CSEG _loop_0 000001b9
+CSEG _dec_0 000001ba
+CSEG _loop_1 000001bc
+CSEG _loop_3 000001be
+CSEG DELAY 000001c4
+CSEG _DELAY_1 000001c7
+CSEG _DELAY_2 000001c8
diff --git a/dist/default/production/attiny2313a_thermostat.X.production.obj b/dist/default/production/attiny2313a_thermostat.X.production.obj
index 813160c..a8cd522 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 aa51413..09f14c8 100644
--- a/dist/default/production/attiny2313a_thermostat.X.production.tmp
+++ b/dist/default/production/attiny2313a_thermostat.X.production.tmp
@@ -32,60 +32,61 @@
main.asm29
main.asm30
main.asm31
+ main.asm32
main.asm182
- main.asm87
- main.asm52
- <_PCINT0_vect_end>main.asm77
- <_INTO_PROGRAM_STATE>main.asm73
- <_CLR_CURRENT_DIGIT>main.asm98
- <_indicate_1>main.asm102
- <_indicate_2>main.asm124
- main.asm573
- main.asm382
- <_indicate_3>main.asm141
- <_indicate_4>main.asm157
+ main.asm88
+ main.asm53
+ <_PCINT0_vect_end>main.asm78
+ <_INTO_PROGRAM_STATE>main.asm74
+ <_CLR_CURRENT_DIGIT>main.asm99
+ <_indicate_1>main.asm103
+ <_indicate_2>main.asm125
+ main.asm588
+ main.asm397
+ <_indicate_3>main.asm142
+ <_indicate_4>main.asm158
<_indicate_exit>main.asm170
main.asm188
- main.asm224
- main.asm243
- <_STATE_DEFAULT>main.asm247
- <_STATE_PROGRAM>main.asm266
- main.asm531
- main.asm361
- main.asm590
- main.asm295
- <_STATE_ERROR>main.asm271
- main.asm414
+ main.asm211
+ main.asm232
+ <_STATE_DEFAULT>main.asm236
+ <_STATE_PROGRAM>main.asm255
+ main.asm546
+ main.asm376
+ main.asm605
+ main.asm284
+ <_STATE_ERROR>main.asm260
+ main.asm429
div16u.asm32
div16u.asm36
div16u.asm42
div16u.asm52
- main.asm288
- main.asm439
- main.asm466
- main.asm499
- <_TEMP_RD_TO_UNSIGNED>main.asm329
- <_TEMP_RD_CONTINUE>main.asm340
- <_TEMP_RD_END>main.asm350
- <_USI_TRANSMIT_LOOP>main.asm400
- <_INTO_DEFAULT_STATE>main.asm427
- <_SW_CHECK_PROCESS_END>main.asm430
- main.asm455
- <_EXIT>main.asm461
- <_OW_SEND_BYTE_LOOP>main.asm471
- <_OW_SEND_0>main.asm475
- <_OW_SEND_1>main.asm483
- <_OW_SEND_BYTE_END>main.asm490
- <_OW_RD_BYTE_LP>main.asm505
- main.asm548
- main.asm640
- <_loop_2>main.asm596
- <_loop_0>main.asm598
- <_dec_0>main.asm600
- <_loop_1>main.asm603
- <_loop_3>main.asm606
- main.asm617
- <_DELAY_1>main.asm622
- <_DELAY_2>main.asm624
+ main.asm277
+ main.asm454
+ main.asm481
+ main.asm514
+ <_TEMP_RD_TO_UNSIGNED>main.asm319
+ <_TEMP_RD_CONTINUE>main.asm330
+ <_TEMP_RD_END>main.asm340
+ <_USI_TRANSMIT_LOOP>main.asm415
+ <_INTO_DEFAULT_STATE>main.asm442
+ <_SW_CHECK_PROCESS_END>main.asm445
+ main.asm470
+ <_EXIT>main.asm476
+ <_OW_SEND_BYTE_LOOP>main.asm486
+ <_OW_SEND_0>main.asm490
+ <_OW_SEND_1>main.asm498
+ <_OW_SEND_BYTE_END>main.asm505
+ <_OW_RD_BYTE_LP>main.asm520
+ main.asm563
+ main.asm655
+ <_loop_2>main.asm611
+ <_loop_0>main.asm613
+ <_dec_0>main.asm615
+ <_loop_1>main.asm618
+ <_loop_3>main.asm621
+ main.asm632
+ <_DELAY_1>main.asm637
+ <_DELAY_2>main.asm639
diff --git a/main.asm b/main.asm
index d24a05a..6432593 100644
--- a/main.asm
+++ b/main.asm
@@ -27,8 +27,9 @@ DIGITS: .BYTE 4 ; Ячейки, где хранят
CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
SW_FLAGS: .BYTE 1 ; Состояние кнопок
HYSTERESIS: .BYTE 1 ; Отклонение температуры от уставки
-TEMP_L: .BYTE 1
-TEMP_H: .BYTE 1
+TEMP_L: .BYTE 1 ; Младший байт температуры
+TEMP_H: .BYTE 1 ; Старший байт температуры
+TEMP_F: .BYTE 1 ; Дробная часть
;//
@@ -162,8 +163,7 @@ _indicate_4:
cbi PORTD, DIGIT_2_PIN
cbi PORTD, DIGIT_3_PIN
sbi PORTD, DIGIT_4_PIN
-; lds TEMP_REG_A, DIGITS
- ldi TEMP_REG_A, 0
+ lds TEMP_REG_A, TEMP_F
rcall DISPLAY_DECODER
rcall USI_TRANSMIT
@@ -207,19 +207,6 @@ MCU_INIT:
outi r16, UCSRB, (1<>4 или (n*10)/16
+ mov r20, r19
+ andi r19, 0x0f
+ mov r20, r19
+ lsl r19
+ lsl r19
+ lsl r19
+
+ lsl r20
+
+ add r19, r20
+
+ lsr r19
+ lsr r19
+ lsr r19
+ lsr r19
+
+ ; записываем данные
sts TEMP_L, r17
sts TEMP_H, r18
-
+ sts TEMP_F, r19
+
; sei
+ pop r20
pop r19
pop r18
pop r17
diff --git a/main.hex b/main.hex
index 320f606..469a88e 100644
--- a/main.hex
+++ b/main.hex
@@ -1,59 +1,62 @@
:020000020000FC
-:0200000064C0DA
+:0200000069C0D5
:0200160018953B
:10001A0015C00F931F932F933F930FB7B49908C03E
:10002A0020916000203009F003C011E010936000B5
:10003A000FBF3F912F911F910F9118954F935F9387
:10004A000F935FB74091670045300CF403C0442713
-:10005A0040936700403061F4939894989598009182
-:10006A006500002311F0929A01C0929858D1D3D01A
-:10007A00413041F4929894989598939A009164002B
-:10008A004ED1C9D0423059F4929893989598949A3F
-:10009A000091630044D1002D0F77002EBCD043306D
-:1000AA0039F4929893989498959A00E038D1B3D0FD
-:1000BA004395409367005FBF0F915F914F911895E9
-:1000CA000FED0DBF0EE701BB01EC07BB0CE108BB4E
-:1000DA0002E000BF05E003BF09E106BF01E009BF76
-:1000EA0000E20BBF0CE100BD03E309B900E002B96D
-:1000FA0008E10AB906E003B93BEF387F383F09F057
-:10010A0006C00CEF10E90095109521E0120F11249A
-:10011A001092670000E000936000002700936A00D5
-:10012A0000936B0080E090E000916000003079F469
-:10013A00DCD070FD969A70FF969863D0FBD0FAD007
-:10014A002ED010916A00812F10916B00912F0130EF
-:10015A0011F4CBD06CD0023039F71BE01093630056
-:10016A001093640010936500109366000000DCCFC2
-:10017A00EE24FF1841E1001F111F4A9509F4089562
-:10018A00EE1CFF1CE21AF30A20F4E20EF31E889416
-:10019A00F2CF0894F0CF41503040E8F708950F931A
-:1001AA001F932F933F9351D00CEC802E63D00EEB0C
-:1001BA00802E60D0AAE6B0E07ED0ABE6B0E07BD07D
-:1001CA0010916A0020916B002F93287F283F09F035
-:1001DA0006C02F912095109521E0120F09C02F918A
-:1001EA002695179526951795269517952695179569
-:1001FA0010936A0020936B003F912F911F910F91EA
-:10020A0008950F9322D00CEC802E34D004E4802E73
-:10021A0031D00F9108950F930FB800E40EB90BE196
-:10022A000DB9769BFDCFC09AC0980F9108950F9390
-:10023A0081D0B29B0196B39B0197B49B01C003C0C6
-:10024A0000E0009360000F910895F894B99A33E0A2
-:10025A004EEBA1DFB99830E04AE89DDF05D033E0E4
-:10026A0042E399DF78940895B19B716002C0B19915
-:10027A007E7F08950F931F93082D18E0069508F4C2
-:10028A0058F0F894B99A30E046E785DFB99830E03B
-:10029A0042E181DF78940AC0F894B99A30E04AE0E2
-:1002AA007ADFB99830E04EE776DF78941A9531F71D
-:1002BA001F910F9108950F931F93002718E0F89448
-:1002CA000695B99A30E04AE066DFB99830E040E135
-:1002DA0062DFB199006830E04CE65DDF1A9581F77C
-:1002EA000C9378941F910F910895F8945F9354E0BA
-:1002FA00A3E6B0E0809361009093620000916100F0
-:10030A00109162002AE030E033DFED920093610041
-:10031A00109362005A9591F75F91789408950F931C
-:10032A001F93EAE7F3E01127E00FF11F04901F91F2
-:10033A000F9108950F931F932F932AE01FEF0FEF4A
-:10034A000A95F1F71A95D9F72A95C1F72F911F91B6
-:10035A000F9108950F931F930FEF1FEF1A95000047
-:10036A0000000000D9F70A95C1F71F910F9108956F
-:0C037A00C0F9A4B0999282F880909CBF5A
+:10005A0040936700403081F49398949895980EF0F5
+:10006A0002C00BE002C000916500002311F0929AD1
+:10007A0001C0929869D1E4D0413041F492989498A1
+:10008A009598939A009164005FD1DAD0423059F47E
+:10009A00929893989598949A0091630055D1002D5F
+:1000AA000F77002ECDD0433041F4929893989498CC
+:1000BA00959A00916C0048D1C3D04395409367004C
+:1000CA005FBF0F915F914F9118950FED0DBF0EE72E
+:1000DA0001BB01EC07BB0CE108BB02E000BF05E075
+:1000EA0003BF09E106BF01E009BF00E20BBF0CE153
+:1000FA0000BD03E309B900E002B908E10AB906E064
+:10010A0003B909E0019511241092670000E00093F9
+:10011A006000002700936A0000936B0000EF0093D1
+:10012A006C0080E090E000916000003079F4F2D039
+:10013A0070FD969A70FF969879D011D110D12ED071
+:10014A0010916A00812F10916B00912F013011F4E8
+:10015A00E1D082D0023039F71BE01093630010938C
+:10016A00640010936500109366000000DCCFEE2453
+:10017A00FF1841E1001F111F4A9509F40895EE1C6A
+:10018A00FF1CE21AF30A20F4E20EF31E8894F2CF5F
+:10019A000894F0CF41503040E8F708950F931F9329
+:1001AA002F933F934F9366D00CEC802E78D00EEBB2
+:1001BA00802E75D0AAE6B0E093D0ABE6B0E090D03E
+:1001CA0010916A0020916B002F93287F283F11F02D
+:1001DA00E89409C02F9168941095209531E0130F87
+:1001EA0030E0231F01C02F91269517952695179564
+:1001FA00269517952695179530916A00432F3F70DB
+:10020A00432F330F330F330F440F340F3695369580
+:10021A003695369510936A0020936B0030936C00E4
+:10022A004F913F912F911F910F9108950F9322D0D3
+:10023A000CEC802E34D004E4802E31D00F91089536
+:10024A000F930FB800E40EB90BE10DB9769BFDCF01
+:10025A00C09AC0980F9108950F9381D0B29B0196CE
+:10026A00B39B0197B49B01C003C000E000936000F8
+:10027A000F910895F894B99A33E04EEB8BDFB99851
+:10028A0030E04AE887DF05D033E042E383DF789441
+:10029A000895B19B716002C0B1997E7F08950F9352
+:1002AA001F93082D18E0069508F458F0F894B99AA7
+:1002BA0030E046E76FDFB99830E042E16BDF7894CF
+:1002CA000AC0F894B99A30E04AE064DFB99830E09D
+:1002DA004EE760DF78941A9531F71F910F910895D0
+:1002EA000F931F93002718E0F8940695B99A30E007
+:1002FA004AE050DFB99830E040E14CDFB19900683C
+:10030A0030E04CE647DF1A9581F70C9378941F91F9
+:10031A000F910895F8945F9354E0A3E6B0E08093B8
+:10032A0061009093620000916100109162002AE0DE
+:10033A0030E01DDFED9200936100109362005A9540
+:10034A0091F75F91789408950F931F93E4EAF3E08D
+:10035A001127E00FF11F04901F910F9108950F9339
+:10036A001F932F932AE01FEF0FEF0A95F1F71A95C3
+:10037A00D9F72A95C1F72F911F910F9108950F93DD
+:10038A001F930FEF1FEF1A95000000000000D9F726
+:10039A000A95C1F71F910F910895C0F9A4B09992D7
+:0603AA0082F880909CBF68
:00000001FF