From ee8940e01c5f22b1e4e6bfafa050599e9c2f64ac Mon Sep 17 00:00:00 2001 From: sergeyyarkov Date: Tue, 20 Jun 2023 22:06:48 +0300 Subject: [PATCH] support signed and unsigned fractional part --- .../attiny2313a_thermostat.X.production.hex | 103 +-- .../attiny2313a_thermostat.X.production.lss | 771 +++++++++--------- .../attiny2313a_thermostat.X.production.map | 95 +-- .../attiny2313a_thermostat.X.production.obj | Bin 4093 -> 4309 bytes .../attiny2313a_thermostat.X.production.tmp | 97 +-- main.asm | 55 +- main.hex | 107 +-- 7 files changed, 633 insertions(+), 595 deletions(-) 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 813160c344f33c13bcf4b4640cbdec11e577c531..a8cd5228c8ac5b2ae2b75d3ab42ba7e9a9cf7781 100644 GIT binary patch literal 4309 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 A@c;k- literal 4093 zcmXBW2Y6J)8piQ=4vW%@fD}<8AWca&bZjJ4rS~Q!Ap{aIg(Or(LJ>Q%Y!*UL5kx@& zDWVWj6YI6JT+3Cjnhhf01q3x3EWrJL+2>(Se*2wsX1*zB2C4o+NiAwtPaHowX2gs+ zsVR9e1JmzLC8*LgsUv@Dhnh*9LEX|Ok{{Fy)|a}2`oUIG56~bOC-npkgMFl4;HrZ> z(;GC}ctA=7jZ14teL<5zjMN`ot)wWL`iTr6((HUqX&`7`T1^@RT0|O3gTXby2GS7F z(%v#$TS61V!F2%|9RXSeNMj_336R(*aD9MhMuXPYi!q>0kS8aCw!!JrByfXuXEJDa zkjP!2eIP-a3OZ2A>Nd_5@>bT9R!EYKrTTgnDKEiw=E3UJAx^cHhuxVa6N zT*@uy8%lZL)}nRNd~jQ-lNNy63yIi7_c=OBS_~4xA4^L>qMxZ*3i?)n`#?W?I3M)4 z3`tu9EW;IGU=hi$27@e(hbVVgHw||lWwIUygTrr0kANZmzS0^nw1Po?91OFX?akpf z2v{SmW~`A#w8cM-vik&?GltYK=ICwGdN9`3U?FAPLgs5D7$3`}h%zDkva|_I^!JmV z0+T9wOPj%DYjg{^%NpGZrdYq80aJ^pe;b$<;qn}1`q6l4J4g!el6HXP5EbqOGlB^c zLDFJE4Kqtv2D?G3t+72|R)EM}Fgq|p+6U5X)$IrAXL;rzm{U?$It1pPWV+vQ%>7|5 zhKw^@N+_9!uZ$wAybj+Xk?g~KJBE1?PkI~Vlu(BuH&R`C2jrDhi(-B`AJMx+7L;5O z#li@`-lHrk;g(_XF<$=wEGc1)8Sb&RJ_Pr^&Mm{zAE@vXa9=TR8J0!3^(n|NCJn># zauPcNRutEYVr7Iz!$ejU^Sa^wwhg6n-dw$oPuLoMz{b$x@+BL-KxAzc>jH#-rv$A+LxG>m1xl!5vGgZc zAC5?Wfejb4rN2R85i9KSxNse*QQ{h-SI;+ir z269Y?o+i~QY>8Vg$AD<7-C|l&(htIPLdo9w0$UgRsD(tt& z)kI#>tSAof!!_md@{w=lnuAx`{_NBB;9#@MKD7pi$`gHR1BzS8ryIblts45&4jc{* z_Q~e#wThZPHcsjFPz_(z3Gzlu>ba3fNlWUv36!=t=BqkW-mLYTkNr}5t0KmyIPi8o zZrN15a~-$h!Mg)RD7%K8wwlvwS|c1z`Dn zak`$IrSYZR>IVK3W}GdbuTH!m*Asjl*(=uzd=p+F*Bkuz#7?6}atWZ^R*T`7rP>$#u&jezKXAMc=nsBm=XV3Zi2}Mj5S%QnDK`k5 z;y`qR!A}KgaznuXLbNp$oDR{%FmNUkFE<>Vt=~v)1o%1Pmm3MrwQ3_b3Y=%}aihU6 zR^d4CYp9*vc<@`OsoVrmVUda8cZ*B{e^|s0)=G=m!Fs_WQ^21VnF{{0bvPaTZGAWV z6C|-DaMAj1xWxJHQovaO}Nq7VvDAXM<`s%X5G)+*&RJRJW6 zmd$G*_SE1g;>tEg;SX1r<6Lp^Ru6}r>+(b2D7uz~qUctzNUnrux?38hpvR_ta_@tl zN%Q1B0KH1t20sM7H*)JEaPzYJaqCWdCISYR z(=Wr2vZYZBwSJXT;jq$La>u}MYr>Y!2y5a;9v*40p8%sG44q+g8Oz2n#+o<@#@aKd zz_^o4fnj`EP81WY3C=+`G1NltG?-M$GCl()+m~_{+-0-;Gnirnbq-9mfvN!0Y@mJz z)7x|TgOX$eRSA+U)eB&TjTmR8OR=2)ruCVY&p#m5ayHB=n-Rrq%lRUaG<)U}NH0%_ zVouq#DCXJ>UZ%pk(a|asX_ zoHFi#b!X*u1`qNvdVcVb)nj;={m|o-agSI%hDSq_<#h#*RR-jB18V~GqC0rp`rZSq zwVw6_0p`@Z9js$cy*?m#^0>SNP!Rb|ULpv!Zz!)HSYJOPuRqw(>KAzfK;c@Syg^{2 z4dxx7$OiLHu*sSj44$wiI40ba*2GBg6laq+3T(D6j{#4ggYt(lBJ(h-T_ z1RS!~?*YZu`n}-QKTGAU0EhQ(leZGQwr-=mRp9jtE9Bh|-dLM2Z#5_>c|zU;%1BPn zj7`qXP+VG8MrvGcYR>G`#fy`3=4LI3i_J($%buQ{oH92zZdiIsPF6}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