diff --git a/NOTES.md b/NOTES.md index 0f0d3c5..60374e1 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1,2 +1,3 @@ - сделать программу, которая будет сохранять уставку температуры, гистерезис и режим работы в EEPROM - (перед инициализации МК необходимо чтобы данные брались из EEPROM и записывались в соответствующие ячейки) \ No newline at end of file + (перед инициализации МК необходимо чтобы данные брались из EEPROM и записывались в соответствующие ячейки) +- убрать отображение разряда индикатора в режиме программирования устройства на 3 этапе \ No newline at end of file diff --git a/definitions.asm b/definitions.asm index 9169a85..336a25e 100644 --- a/definitions.asm +++ b/definitions.asm @@ -61,10 +61,12 @@ .EQU MCU_STATE_PROGRAM = 0x01 ; Режим настройки параметров в EEPROM .EQU MCU_STATE_ERROR = 0x02 ; Режим ошибки, например когда не подключен датчик +.EQU MIN_HYST = 1 ; минимальный гистерезис который можно выставить - 0.1 +.EQU MAX_HYST = 200 ; максимальный гистерезис который можно выставить - 20 + ; **** СТАНДАРТНЫЕ ПАРАМЕТРЫ *********************************** -; Отдельно задается целая и дробная часть в точности до десятых -.EQU DEFAULT_TEMP = 315 ; 30 градусов +.EQU DEFAULT_TEMP = 300 ; 30 градусов .EQU DEFAULT_HYST = 5 ; 0.5 градусов гистерезис .EQU HEAT_MODE = 1 diff --git a/dist/default/production/attiny2313a_thermostat.X.production.hex b/dist/default/production/attiny2313a_thermostat.X.production.hex index 4feccc2..4ecf332 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.hex +++ b/dist/default/production/attiny2313a_thermostat.X.production.hex @@ -7,25 +7,25 @@ :10003A002F933F934F935F935FB74091670045308B :10004A000CF403C0442740936700403081F493982E :10005A00949895980EF002C00BE002C000916500DA -:10006A00002311F0929A01C09298A3D29BD14130F9 +:10006A00002311F0929A01C09298DAD29BD14130C2 :10007A0081F4929894989598009164003091650063 -:10008A00032B11F0939A01C093980091640091D2C6 +:10008A00032B11F0939A01C0939800916400C8D28F :10009A0089D1423059F4929893989598949A0091FC -:1000AA00630087D2002D0F77002E7CD1433041F4B4 -:1000BA00929893989498959A009166007AD272D100 +:1000AA006300BED2002D0F77002E7CD1433041F47D +:1000BA00929893989498959A00916600B1D272D1C9 :1000CA004395409367005FBF5F914F913F912F9196 :1000DA001F910F9118950FED0DBF0FE701BB01EEB0 -:1000EA0007BB0CE108BB02E000BF05E003BF09E162 +:1000EA0007BB0CE108BB02E000BF05E003BF03E267 :1000FA0006BF00E20BBF0CE100BD03E309B900E053 :10010A0002B908E00AB906E003B91124109267009F -:10011A0000E0009360000BE300936C0001E00093A1 +:10011A0000E0009360000CE200936C0001E00093A1 :10012A006B0005E000936D0001E000936E0000276C :10013A00009368000093690000EF00936A000FEFD4 :10014A00009371006624CED000916F00083209F442 -:10015A0005C012E0109360003ED201C035D280E0A3 -:10016A0090E0009160000BD2003051F496982091F3 +:10015A0005C012E01093600075D201C06CD280E035 +:10016A0090E00091600042D2003051F496982091BC :10017A006A0020936600A7D059D011E019BF38D081 -:10018A00013011F4969842D1023059F7969AE9CF84 +:10018A00013011F4969848D1023059F7969AE9CF7E :10019A00EE24FF1841E1001F111F4A9509F4089542 :1001AA00EE1CFF1CE21AF30A20F4E20EF31E8894F6 :1001BA00F2CF0894F0CFFF1829E0001F2A9509F41E @@ -46,60 +46,67 @@ :1002AA00909801C0909A07C040916E00442311F4BF :1002BA00909A01C090987F915F914F913F912F91B1 :1002CA001F910F9108951F9361D052E135E54DEBCF -:1002DA009DD112D010916800812F10916900912F41 -:1002EA001F9108950F93FDD003E3802E0FD1AFE63F -:1002FA00B0E02BD10F9108950F931F932F933F9343 -:10030A004F93EFD070FF3CC00CEC802EFFD00EEB69 -:10031A00802EFCD0A8E6B0E018D1A9E6B0E015D14D +:1002DA00D4D112D010916800812F10916900912F0A +:1002EA001F9108950F9334D103E3802E46D1AFE6D0 +:1002FA00B0E062D10F9108950F931F932F933F930C +:10030A004F9326D170FF3CC00CEC802E36D10EEBF9 +:10031A00802E33D1A8E6B0E04FD1A9E6B0E04CD1A7 :10032A0010916800209169002F93287F283F11F0CF :10033A00E89407C02F916894109520951F5F2F4F5E :10034A0001C02F91269517952695179526951795ED :10035A0026951795309168000EF43195432F3F701A :10036A00432F330F330F330F440F340F369536951F :10037A0036953695109368002093690030936A0089 -:10038A004F913F912F911F910F9108950F93A9D0EB -:10039A0070FF06C00CEC802EB9D004E4802EB6D0D3 +:10038A004F913F912F911F910F9108950F93E0D0B4 +:10039A0070FF06C00CEC802EF0D004E4802EEDD065 :1003AA000F9108950F930F920FB800E40EB90BE165 :1003BA000DB9769BFDCFC09AC0980F900F91089502 -:1003CA000F93B49B01C014C000917100002309F47B -:1003DA000FC000270093710005D16394162D1430C5 -:1003EA0014F4F2D005C06624F6D010E01093600031 -:1003FA00B49901C009C000917100002309F004C03A -:10040A000FEF00937100EED00F9108950F931F9391 -:10041A002F933F934F93062D002309F002C0639454 -:10042A00D3D0CEDF013019F0023011F154C00000F0 -:10043A00B29B04C000C0B39B08C00DC0D3D01091BA -:10044A006D00139510936D0006C0CCD010916D000D -:10045A001A9510936D000F931F9300916D001AE087 -:10046A00AADE802F9927F09266001F910F9133C060 -:10047A000000B29B04C000C0B39B0FC019C0B2D029 -:10048A0010916C0020916B0031E0130F3327231F6A -:10049A0010936C0020936B000BC0A4D010916C00D9 -:1004AA0020916B001150204010936C0020936B0038 -:1004BA000F931F932F933F9300916C0010916B0041 -:1004CA002AE030E065DE802F912FE09266003F91AE -:1004DA002F911F910F914F913F912F911F910F9142 -:1004EA000895F894B99A33E04EEB8CD0B99830E07D -:1004FA004AE888D005D033E042E384D0789408955E -:10050A00B19B716002C0B1997E7F0895F8940F93F0 -:10051A001F93082D18E0069508F448F0B99A30E0C0 -:10052A0046E770D0B99830E042E16CD008C0B99A79 -:10053A0030E04AE067D0B99830E04EE763D01A95C8 -:10054A0051F71F910F9178940895F8940F931F9380 -:10055A00002718E00695B99A30E04AE053D0B998D6 -:10056A0030E040E14FD0B199006830E04CE64AD023 -:10057A001A9581F70C931F910F91789408950F9310 -:10058A005F9353E0A3E6B0E080936100909362002A -:10059A0000916100109162002AE030E0F9DDED92ED -:1005AA0000936100109362005A9591F75F910F9141 -:1005BA0008950F931F93E0E4F6E01127E00FF11F6F -:1005CA0004901F910F910895C59A53E039EA4DE7B7 -:1005DA001DD0C5980895C59A5CE034E34DEF16D056 -:1005EA00C59808950F931F932F932AE01FEF0FEFDB -:1005FA000A95F1F71A95D9F72A95C1F72F911F9104 -:10060A000F91089541503040E8F708954150304025 -:10061A005040E0F708950F931F932F9326E00FEFB2 -:10062A001FEF1A95F1F70A95D9F72A95C1F72F9175 -:10063A001F910F910895C0F9A4B0999282F8809001 -:04064A009CBFC68902 +:1003CA000F93B49B01C01AC000917100002309F475 +:1003DA0015C00027009371003CD16394162D143088 +:1003EA0014F429D10BC010E019BF929893989498ED +:1003FA009598662427D110E010936000B49901C043 +:10040A0009C000917100002309F004C00FEF0093A6 +:10041A0071001FD10F9108950F931F932F933F934C +:10042A004F93062D002309F002C005D16394C8DF5B +:10043A00013029F0023049F1033031F183C0000064 +:10044A00B29B04C000C0B39B0AC011C002D1109174 +:10045A006D00183C09F0139510936D0008C0F9D08F +:10046A0010916D00113009F01A9510936D000F93D9 +:10047A001F9300916D001AE09EDE802F9927F0925B +:10048A0066001F910F915EC03EC00000B29B04C07F +:10049A0000C0B39B0FC019C0DCD010916C00209132 +:1004AA006B0031E0130F3327231F10936C00209346 +:1004BA006B000BC0CED010916C0020916B001150D4 +:1004CA00204010936C0020936B000F931F932F937F +:1004DA003F9300916C0010916B00212F207811F44A +:1004EA00E89405C06894009510950F5F1F4F2AE0A5 +:1004FA0030E04EDE802F912FE09266003F912F91DF +:10050A001F910F911FC0E894B29B04C000C0B39B17 +:10051A0006C009C09ED011E010936E0004C099D0A5 +:10052A0010E010936E001127812F912F20916E00F9 +:10053A00222309F004C01CE01093660003C01DE0EA +:10054A00109366004F913F912F911F910F9108953B +:10055A00F894B99A33E04EEB8CD0B99830E04AE877 +:10056A0088D005D033E042E384D078940895B19BD3 +:10057A00716002C0B1997E7F0895F8940F931F931A +:10058A00082D18E0069508F448F0B99A30E046E7D5 +:10059A0070D0B99830E042E16CD008C0B99A30E026 +:1005AA004AE067D0B99830E04EE763D01A9551F720 +:1005BA001F910F9178940895F8940F931F93002731 +:1005CA0018E00695B99A30E04AE053D0B99830E07D +:1005DA0040E14FD0B199006830E04CE64AD01A9514 +:1005EA0081F70C931F910F91789408950F935F935D +:1005FA0053E0A3E6B0E0809361009093620000911B +:10060A006100109162002AE030E0C2DDED920093B1 +:10061A006100109362005A9591F75F910F910895C6 +:10062A000F931F93EEEAF6E01127E00FF11F0490F3 +:10063A001F910F910895C59A53E039EA4DE71DD0ED +:10064A00C5980895C59A5CE034E34DEF16D0C59875 +:10065A0008950F931F932F932AE01FEF0FEF0A9528 +:10066A00F1F71A95D9F72A95C1F72F911F910F9192 +:10067A00089541503040E8F70895415030405040C5 +:10068A00E0F708950F931F932F9326E00FEF1FEFC4 +:10069A001A95F1F70A95D9F72A95C1F72F911F9163 +:1006AA000F910895C0F9A4B0999282F880909CBFE6 +:0206BA00C689EF :00000001FF diff --git a/dist/default/production/attiny2313a_thermostat.X.production.lss b/dist/default/production/attiny2313a_thermostat.X.production.lss index 0176919..be49451 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.lss +++ b/dist/default/production/attiny2313a_thermostat.X.production.lss @@ -1,5 +1,5 @@ -AVRASM ver. 2.2.7 main.asm Thu Jun 29 14:17:58 2023 +AVRASM ver. 2.2.7 main.asm Thu Jun 29 22:49:03 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' @@ -831,10 +831,12 @@ main.asm(297): Including file 'mpy16u.asm' .EQU MCU_STATE_PROGRAM = 0x01 ; Режим настройки параметров в EEPROM .EQU MCU_STATE_ERROR = 0x02 ; Режим ошибки, например когда не подключен датчик + .EQU MIN_HYST = 1 ; минимальный гистерезис который можно выставить - 0.1 + .EQU MAX_HYST = 200 ; максимальный гистерезис который можно выставить - 20 + ; **** СТАНДАРТНЫЕ ПАРАМЕТРЫ *********************************** - ; Отдельно задается целая и дробная часть в точности до десятых - .EQU DEFAULT_TEMP = 315 ; 30 градусов + .EQU DEFAULT_TEMP = 300 ; 30 градусов .EQU DEFAULT_HYST = 5 ; 0.5 градусов гистерезис .EQU HEAT_MODE = 1 @@ -872,6 +874,15 @@ main.asm(297): Including file 'mpy16u.asm' .MACRO relay_off cbi RELAY_PORT, RELAY_PIN .ENDMACRO + + ; @0 - младший байт + ; @1 - старший байт + .MACRO com16 + com @0 + com @1 + subi @0, low(-1) + sbci @1, high(-1) + .ENDMACRO .MACRO DELAY16 ldi DELAY_16_r, HIGH(@0*F_CPU/4-2) @@ -959,7 +970,7 @@ main.asm(297): Including file 'mpy16u.asm' 00001f 934f push r20 000020 935f push r21 000021 b75f in r21, SREG - + 000022 9140 0067 lds r20, CURRENT_DIGIT 000024 3045 cpi r20, 5 000025 f40c brge _CLR_CURRENT_DIGIT ; сброс активного разряда если >= 5 @@ -986,7 +997,7 @@ main.asm(297): Including file 'mpy16u.asm' 000037 9a92 sbi PORTD, DIGIT_1_PIN 000038 c001 rjmp PC+2 000039 9892 cbi PORTD, DIGIT_1_PIN -00003a d2a3 rcall DISPLAY_DECODER +00003a d2da rcall DISPLAY_DECODER 00003b d19b rcall USI_TRANSMIT _indicate_2: @@ -1004,19 +1015,19 @@ main.asm(297): Including file 'mpy16u.asm' 000048 c001 rjmp PC+2 000049 9893 cbi PORTD, DIGIT_2_PIN 00004a 9100 0064 lds TEMP_REG_A, DIGITS+1 -00004c d291 rcall DISPLAY_DECODER +00004c d2c8 rcall DISPLAY_DECODER 00004d d189 rcall USI_TRANSMIT - + _indicate_3: 00004e 3042 cpi r20, 2 00004f f459 brne _indicate_4 - + 000050 9892 cbi PORTD, DIGIT_1_PIN 000051 9893 cbi PORTD, DIGIT_2_PIN 000052 9895 cbi PORTD, DIGIT_4_PIN 000053 9a94 sbi PORTD, DIGIT_3_PIN 000054 9100 0063 lds TEMP_REG_A, DIGITS -000056 d287 rcall DISPLAY_DECODER +000056 d2be rcall DISPLAY_DECODER ; зажигаем точку 000057 2d00 mov r16, r0 000058 770f cbr r16, (1<<7) @@ -1032,7 +1043,7 @@ main.asm(297): Including file 'mpy16u.asm' 00005f 9894 cbi PORTD, DIGIT_3_PIN 000060 9a95 sbi PORTD, DIGIT_4_PIN 000061 9100 0066 lds TEMP_REG_A, DIGITS+3 -000063 d27a rcall DISPLAY_DECODER +000063 d2b1 rcall DISPLAY_DECODER 000064 d172 rcall USI_TRANSMIT _indicate_exit: @@ -1071,8 +1082,8 @@ main.asm(297): Including file 'mpy16u.asm' 000079 bf00 outi r16, TCCR0A, (1< @@ -1148,7 +1159,7 @@ main.asm(297): Including file 'mpy16u.asm' ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** LOOP: 0000b6 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК -0000b8 d20b rcall DISPLAY_UPD_DIGITS +0000b8 d242 rcall DISPLAY_UPD_DIGITS _STATE_DEFAULT: 0000b9 3000 cpi r16, MCU_STATE_DEFAULT 0000ba f451 brne _STATE_PROGRAM @@ -1166,7 +1177,7 @@ main.asm(297): Including file 'mpy16u.asm' 0000c5 3001 cpi r16, MCU_STATE_PROGRAM 0000c6 f411 brne _STATE_ERROR 0000c7 9896 cbi LED_ERR_PORT, LED_ERR_PIN -0000c8 d142 rcall REPROGRAM_SETTINGS +0000c8 d148 rcall REPROGRAM_SETTINGS _STATE_ERROR: 0000c9 3002 cpi r16, MCU_STATE_ERROR 0000ca f759 brne LOOP @@ -1465,7 +1476,7 @@ main.asm(297): Including file 'mpy16u.asm' 00016a e152 00016b e535 00016c eb4d -00016d d19d DELAY24 751000 +00016d d1d4 DELAY24 751000 00016e d012 rcall TEMP_RD ; обновляем данные в ячейках @@ -1481,14 +1492,14 @@ main.asm(297): Including file 'mpy16u.asm' RD_F_CODE: 000177 930f push r16 -000178 d0fd rcall OW_PRESENCE +000178 d134 rcall OW_PRESENCE 000179 e303 ldi r16, DS18B20_CMD_READROM 00017a 2e80 mov OW_CMD_r, r16 -00017b d10f rcall OW_SEND_BYTE +00017b d146 rcall OW_SEND_BYTE 00017c e6af ldi XL, LOW(DEVICE_FAMILY_CODE) 00017d e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) -00017e d12b rcall OW_RD_BYTE +00017e d162 rcall OW_RD_BYTE 00017f 910f pop r16 000180 9508 ret// @@ -1501,25 +1512,25 @@ main.asm(297): Including file 'mpy16u.asm' 000184 933f push r19 000185 934f push r20 -000186 d0ef rcall OW_PRESENCE +000186 d126 rcall OW_PRESENCE 000187 ff70 sbrs OWFR, OWPRF 000188 c03c rjmp _TEMP_RD_EXIT 000189 ec0c ldi r16, DS18B20_CMD_SKIPROM 00018a 2e80 mov OW_CMD_r, r16 -00018b d0ff rcall OW_SEND_BYTE +00018b d136 rcall OW_SEND_BYTE 00018c eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD 00018d 2e80 mov OW_CMD_r, r16 -00018e d0fc rcall OW_SEND_BYTE +00018e d133 rcall OW_SEND_BYTE 00018f e6a8 ldi XL, LOW(TEMP_L) 000190 e0b0 ldi XH, HIGH(TEMP_L) -000191 d118 rcall OW_RD_BYTE +000191 d14f rcall OW_RD_BYTE 000192 e6a9 ldi XL, LOW(TEMP_H) 000193 e0b0 ldi XH, HIGH(TEMP_H) -000194 d115 rcall OW_RD_BYTE +000194 d14c rcall OW_RD_BYTE 000195 9110 0068 lds r17, TEMP_L 000197 9120 0069 lds r18, TEMP_H @@ -1593,17 +1604,17 @@ main.asm(297): Including file 'mpy16u.asm' TEMP_CONV: 0001cb 930f push r16 -0001cc d0a9 rcall OW_PRESENCE +0001cc d0e0 rcall OW_PRESENCE 0001cd ff70 sbrs OWFR, OWPRF 0001ce c006 rjmp _TEMP_CONV_EXIT 0001cf ec0c ldi r16, DS18B20_CMD_SKIPROM 0001d0 2e80 mov OW_CMD_r, r16 -0001d1 d0b9 rcall OW_SEND_BYTE +0001d1 d0f0 rcall OW_SEND_BYTE 0001d2 e404 ldi r16, DS18B20_CMD_CONVERTTEMP 0001d3 2e80 mov OW_CMD_r, r16 -0001d4 d0b6 rcall OW_SEND_BYTE +0001d4 d0ed rcall OW_SEND_BYTE _TEMP_CONV_EXIT: 0001d5 910f pop r16 @@ -1650,158 +1661,230 @@ main.asm(297): Including file 'mpy16u.asm' _SW_CHECK_ON_0: 0001e6 9bb4 sbis SW_PIN, SW_SET_PIN 0001e7 c001 rjmp _SW_SET_0 -0001e8 c014 rjmp _SW_CHECK_ON_1 +0001e8 c01a rjmp _SW_CHECK_ON_1 _SW_SET_0: 0001e9 9100 0071 lds r16, SW_DATA 0001eb 2300 tst r16 0001ec f409 brne _SW_SET_FROM_0_TO_1 -0001ed c00f rjmp _SW_CHECK_ON_1 +0001ed c015 rjmp _SW_CHECK_ON_1 _SW_SET_FROM_0_TO_1: 0001ee 2700 clr r16 0001ef 9300 0071 sts SW_DATA, r16 -0001f1 d105 rcall DEBOUNCE_SW +0001f1 d13c rcall DEBOUNCE_SW 0001f2 9463 inc REPROGRAM_STEP_r 0001f3 2d16 mov r17, REPROGRAM_STEP_r 0001f4 3014 cpi r17, 4 0001f5 f414 brge _SAVE_SETTINGS -0001f6 d0f2 rcall BEEP_SHORT -0001f7 c005 rjmp _SW_CHECK_ON_1 +0001f6 d129 rcall BEEP_SHORT +0001f7 c00b rjmp _SW_CHECK_ON_1 _SAVE_SETTINGS: -0001f8 2466 clr REPROGRAM_STEP_r -0001f9 d0f6 rcall BEEP_LONG -0001fa e010 ldi r17, MCU_STATE_DEFAULT -0001fb 9310 0060 sts MCU_STATE, r17 +0001f8 e010 +0001f9 bf19 outi r17, TIMSK, (0< REPROGRAM_SETTINGS: -00020b 930f push r16 -00020c 931f push r17 -00020d 932f push r18 -00020e 933f push r19 -00020f 934f push r20 +000211 930f push r16 +000212 931f push r17 +000213 932f push r18 +000214 933f push r19 +000215 934f push r20 -000210 2d06 mov r16, REPROGRAM_STEP_r -000211 2300 tst r16 -000212 f009 breq _INTO -000213 c002 rjmp _REPROGRAM_SETTINGS_LOOP +000216 2d06 mov r16, REPROGRAM_STEP_r +000217 2300 tst r16 +000218 f009 breq _INTO +000219 c002 rjmp _REPROGRAM_SETTINGS_LOOP _INTO: -000214 9463 inc REPROGRAM_STEP_r -000215 d0d3 rcall BEEP_SHORT +00021a d105 rcall BEEP_SHORT +00021b 9463 inc REPROGRAM_STEP_r _REPROGRAM_SETTINGS_LOOP: -000216 dfce rcall BUTTON_PROCESS +00021c dfc8 rcall BUTTON_PROCESS _CHECK_STEP: -000217 3001 cpi r16, 1 -000218 f019 breq _STEP_1 -000219 3002 cpi r16, 2 -00021a f111 breq _STEP_2 -00021b c054 rjmp _REPROGRAM_SETTINGS_END - +00021d 3001 cpi r16, 1 +00021e f029 breq _STEP_1 +00021f 3002 cpi r16, 2 +000220 f149 breq _STEP_2 +000221 3003 cpi r16, 3 +000222 f131 breq _S3_JMP +000223 c083 rjmp _REPROGRAM_SETTINGS_END + + // _STEP_1: ; установка и отображение гистерезиса -00021c 0000 nop +000224 0000 nop _S1_CHECK_PLUS: -00021d 9bb2 sbis SW_PIN, SW_PLUS_PIN -00021e c004 rjmp _INCREASE_HYST -00021f c000 rjmp _S1_CHECK_MINUS +000225 9bb2 sbis SW_PIN, SW_PLUS_PIN +000226 c004 rjmp _INCREASE_HYST +000227 c000 rjmp _S1_CHECK_MINUS _S1_CHECK_MINUS: -000220 9bb3 sbis SW_PIN, SW_MINUS_PIN -000221 c008 rjmp _DECREASE_HYST -000222 c00d rjmp _SHOW_HYST +000228 9bb3 sbis SW_PIN, SW_MINUS_PIN +000229 c00a rjmp _DECREASE_HYST +00022a c011 rjmp _SHOW_HYST _INCREASE_HYST: -000223 d0d3 rcall DEBOUNCE_SW -000224 9110 006d lds r17, SETTING_HYST -000226 9513 inc r17 -000227 9310 006d sts SETTING_HYST, r17 -000229 c006 rjmp _SHOW_HYST +00022b d102 rcall DEBOUNCE_SW +00022c 9110 006d lds r17, SETTING_HYST +00022e 3c18 cpi r17, MAX_HYST +00022f f009 breq PC+2 +000230 9513 inc r17 +000231 9310 006d sts SETTING_HYST, r17 +000233 c008 rjmp _SHOW_HYST _DECREASE_HYST: -00022a d0cc rcall DEBOUNCE_SW -00022b 9110 006d lds r17, SETTING_HYST -00022d 951a dec r17 -00022e 9310 006d sts SETTING_HYST, r17 +000234 d0f9 rcall DEBOUNCE_SW +000235 9110 006d lds r17, SETTING_HYST +000237 3011 cpi r17, MIN_HYST +000238 f009 breq PC+2 +000239 951a dec r17 +00023a 9310 006d sts SETTING_HYST, r17 _SHOW_HYST: -000230 930f push dd8u -000231 931f push dv8u -000232 9100 006d lds dd8u, SETTING_HYST -000234 e01a ldi dv8u, 10 -000235 deaa rcall div8u -000236 2f80 mov DISP_NUM_L, dres8u -000237 2799 clr DISP_NUM_H ; гистерезис 8 битный так что ноль пишем в старший байт -000238 92f0 0066 sts DIGITS+3, drem8u -00023a 911f pop dv8u -00023b 910f pop dd8u -00023c c033 rjmp _REPROGRAM_SETTINGS_END +00023c 930f push dd8u +00023d 931f push dv8u +00023e 9100 006d lds dd8u, SETTING_HYST +000240 e01a ldi dv8u, 10 +000241 de9e rcall div8u +000242 2f80 mov DISP_NUM_L, dres8u +000243 2799 clr DISP_NUM_H ; гистерезис 8 битный так что ноль пишем в старший байт +000244 92f0 0066 sts DIGITS+3, drem8u +000246 911f pop dv8u +000247 910f pop dd8u +000248 c05e rjmp _REPROGRAM_SETTINGS_END + // + + _S3_JMP: ; просто прыжок на _STEP_3 +000249 c03e rjmp _STEP_3 + // _STEP_2: -00023d 0000 nop +00024a 0000 nop _S2_CHECK_PLUS: -00023e 9bb2 sbis SW_PIN, SW_PLUS_PIN -00023f c004 rjmp _INCREASE_TEMP -000240 c000 rjmp _S2_CHECK_MINUS +00024b 9bb2 sbis SW_PIN, SW_PLUS_PIN +00024c c004 rjmp _INCREASE_TEMP +00024d c000 rjmp _S2_CHECK_MINUS _S2_CHECK_MINUS: -000241 9bb3 sbis SW_PIN, SW_MINUS_PIN -000242 c00f rjmp _DECREASE_TEMP -000243 c019 rjmp _SHOW_TEMP +00024e 9bb3 sbis SW_PIN, SW_MINUS_PIN +00024f c00f rjmp _DECREASE_TEMP +000250 c019 rjmp _SHOW_TEMP _INCREASE_TEMP: -000244 d0b2 rcall DEBOUNCE_SW -000245 9110 006c lds r17, SETTING_TEMP_L -000247 9120 006b lds r18, SETTING_TEMP_H -000249 e031 ldi r19, 1 -00024a 0f13 add r17, r19 -00024b 2733 clr r19 -00024c 1f23 adc r18, r19 -00024d 9310 006c sts SETTING_TEMP_L, r17 -00024f 9320 006b sts SETTING_TEMP_H, r18 -000251 c00b rjmp _SHOW_TEMP +000251 d0dc rcall DEBOUNCE_SW +000252 9110 006c lds r17, SETTING_TEMP_L +000254 9120 006b lds r18, SETTING_TEMP_H +000256 e031 ldi r19, 1 +000257 0f13 add r17, r19 +000258 2733 clr r19 +000259 1f23 adc r18, r19 +00025a 9310 006c sts SETTING_TEMP_L, r17 +00025c 9320 006b sts SETTING_TEMP_H, r18 +00025e c00b rjmp _SHOW_TEMP _DECREASE_TEMP: -000252 d0a4 rcall DEBOUNCE_SW -000253 9110 006c lds r17, SETTING_TEMP_L -000255 9120 006b lds r18, SETTING_TEMP_H -000257 5011 subi r17, 1 -000258 4020 sbci r18, 0 -000259 9310 006c sts SETTING_TEMP_L, r17 -00025b 9320 006b sts SETTING_TEMP_H, r18 +00025f d0ce rcall DEBOUNCE_SW +000260 9110 006c lds r17, SETTING_TEMP_L +000262 9120 006b lds r18, SETTING_TEMP_H +000264 5011 subi r17, 1 +000265 4020 sbci r18, 0 +000266 9310 006c sts SETTING_TEMP_L, r17 +000268 9320 006b sts SETTING_TEMP_H, r18 _SHOW_TEMP: -00025d 930f push dd16uL -00025e 931f push dd16uH -00025f 932f push dv16uL -000260 933f push dv16uH +00026a 930f push dd16uL +00026b 931f push dd16uH +00026c 932f push dv16uL +00026d 933f push dv16uH -000261 9100 006c lds dd16uL, SETTING_TEMP_L -000263 9110 006b lds dd16uH, SETTING_TEMP_H -000265 e02a ldi dv16uL, LOW(10) -000266 e030 ldi dv16uH, HIGH(10) -000267 de65 rcall div16u -000268 2f80 mov DISP_NUM_L, dres16uL -000269 2f91 mov DISP_NUM_H, dres16uH -00026a 92e0 0066 sts DIGITS+3, drem16uL +00026e 9100 006c lds dd16uL, SETTING_TEMP_L +000270 9110 006b lds dd16uH, SETTING_TEMP_H +000272 2f21 mov r18, dd16uH +000273 7820 andi r18, (1<<7) +000274 f411 brne _NEGATE_SET_TEMP +000275 94e8 clt +000276 c005 rjmp _DIVIDE_SET_TEMP + _NEGATE_SET_TEMP: +000277 9468 set +000278 9500 +000279 9510 +00027a 5f0f +00027b 4f1f com16 dd16uL, dd16uH -00026c 913f pop dv16uH -00026d 912f pop dv16uL -00026e 911f pop dd16uH -00026f 910f pop dd16uL + _DIVIDE_SET_TEMP: +00027c e02a ldi dv16uL, LOW(10) +00027d e030 ldi dv16uH, HIGH(10) +00027e de4e rcall div16u +00027f 2f80 mov DISP_NUM_L, dres16uL +000280 2f91 mov DISP_NUM_H, dres16uH +000281 92e0 0066 sts DIGITS+3, drem16uL + +000283 913f pop dv16uH +000284 912f pop dv16uL +000285 911f pop dd16uH +000286 910f pop dd16uL +000287 c01f rjmp _REPROGRAM_SETTINGS_END + // + + // + _STEP_3: +000288 94e8 clt + _S3_CHECK_PLUS: +000289 9bb2 sbis SW_PIN, SW_PLUS_PIN +00028a c004 rjmp _SET_HEAT_MODE +00028b c000 rjmp _S3_CHECK_MINUS + _S3_CHECK_MINUS: +00028c 9bb3 sbis SW_PIN, SW_MINUS_PIN +00028d c006 rjmp _SET_COOLING_MODE +00028e c009 rjmp _SHOW_MODE + _SET_HEAT_MODE: +00028f d09e rcall DEBOUNCE_SW +000290 e011 ldi r17, HEAT_MODE +000291 9310 006e sts SETTING_MODE, r17 +000293 c004 rjmp _SHOW_MODE + _SET_COOLING_MODE: +000294 d099 rcall DEBOUNCE_SW +000295 e010 ldi r17, COOLING_MODE +000296 9310 006e sts SETTING_MODE, r17 + _SHOW_MODE: +000298 2711 clr r17 +000299 2f81 mov DISP_NUM_L, r17 +00029a 2f91 mov DISP_NUM_H, r17 +00029b 9120 006e lds r18, SETTING_MODE +00029d 2322 tst r18 +00029e f009 breq _SHOW_COOLING +00029f c004 rjmp _SHOW_HEATING + + _SHOW_COOLING: +0002a0 e01c ldi r17, 12 +0002a1 9310 0066 sts DIGITS+3, r17 +0002a3 c003 rjmp _REPROGRAM_SETTINGS_END + _SHOW_HEATING: +0002a4 e01d ldi r17, 13 +0002a5 9310 0066 sts DIGITS+3, r17 + // + _REPROGRAM_SETTINGS_END: -000270 914f pop r20 -000271 913f pop r19 -000272 912f pop r18 -000273 911f pop r17 -000274 910f pop r16 -000275 9508 ret +0002a7 914f pop r20 +0002a8 913f pop r19 +0002a9 912f pop r18 +0002aa 911f pop r17 +0002ab 910f pop r16 +0002ac 9508 ret // ;DBG_LED_TOGGLE: @@ -1819,21 +1902,21 @@ main.asm(297): Including file 'mpy16u.asm' // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: -000276 94f8 cli -000277 9ab9 ow_pull -000278 e033 -000279 eb4e -00027a d08c DELAY16 480 -00027b 98b9 ow_release -00027c e030 -00027d e84a -00027e d088 DELAY16 70 -00027f d005 rcall OW_CHECK_PRESENCE -000280 e033 -000281 e342 -000282 d084 DELAY16 410 -000283 9478 sei -000284 9508 ret +0002ad 94f8 cli +0002ae 9ab9 ow_pull +0002af e033 +0002b0 eb4e +0002b1 d08c DELAY16 480 +0002b2 98b9 ow_release +0002b3 e030 +0002b4 e84a +0002b5 d088 DELAY16 70 +0002b6 d005 rcall OW_CHECK_PRESENCE +0002b7 e033 +0002b8 e342 +0002b9 d084 DELAY16 410 +0002ba 9478 sei +0002bb 9508 ret // // @@ -1841,83 +1924,83 @@ main.asm(297): Including file 'mpy16u.asm' ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: -000285 9bb1 sbis OW_PIN, OW_LINE -000286 6071 sbr OWFR, (1< // OW_SEND_BYTE: -00028b 94f8 cli -00028c 930f push r16 -00028d 931f push r17 -00028e 2d08 mov r16, OW_CMD_r -00028f e018 ldi r17, 8 +0002c2 94f8 cli +0002c3 930f push r16 +0002c4 931f push r17 +0002c5 2d08 mov r16, OW_CMD_r +0002c6 e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: -000290 9506 lsr r16 -000291 f408 brcc _OW_SEND_0 -000292 f048 brcs _OW_SEND_1 +0002c7 9506 lsr r16 +0002c8 f408 brcc _OW_SEND_0 +0002c9 f048 brcs _OW_SEND_1 _OW_SEND_0: -000293 9ab9 ow_pull -000294 e030 -000295 e746 -000296 d070 DELAY16 60 -000297 98b9 ow_release -000298 e030 -000299 e142 -00029a d06c DELAY16 10 -00029b c008 rjmp _OW_SEND_BYTE_END +0002ca 9ab9 ow_pull +0002cb e030 +0002cc e746 +0002cd d070 DELAY16 60 +0002ce 98b9 ow_release +0002cf e030 +0002d0 e142 +0002d1 d06c DELAY16 10 +0002d2 c008 rjmp _OW_SEND_BYTE_END _OW_SEND_1: -00029c 9ab9 ow_pull -00029d e030 -00029e e04a -00029f d067 DELAY16 6 -0002a0 98b9 ow_release -0002a1 e030 -0002a2 e74e -0002a3 d063 DELAY16 64 +0002d3 9ab9 ow_pull +0002d4 e030 +0002d5 e04a +0002d6 d067 DELAY16 6 +0002d7 98b9 ow_release +0002d8 e030 +0002d9 e74e +0002da d063 DELAY16 64 _OW_SEND_BYTE_END: -0002a4 951a dec r17 -0002a5 f751 brne _OW_SEND_BYTE_LOOP -0002a6 911f pop r17 -0002a7 910f pop r16 -0002a8 9478 sei -0002a9 9508 ret +0002db 951a dec r17 +0002dc f751 brne _OW_SEND_BYTE_LOOP +0002dd 911f pop r17 +0002de 910f pop r16 +0002df 9478 sei +0002e0 9508 ret // // OW_RD_BYTE: -0002aa 94f8 cli -0002ab 930f push r16 -0002ac 931f push r17 -0002ad 2700 clr r16 -0002ae e018 ldi r17, 8 +0002e1 94f8 cli +0002e2 930f push r16 +0002e3 931f push r17 +0002e4 2700 clr r16 +0002e5 e018 ldi r17, 8 _OW_RD_BYTE_LP: -0002af 9506 lsr r16 -0002b0 9ab9 ow_pull -0002b1 e030 -0002b2 e04a -0002b3 d053 DELAY16 6 -0002b4 98b9 ow_release -0002b5 e030 -0002b6 e140 -0002b7 d04f DELAY16 9 -0002b8 99b1 sbic OW_PIN, OW_LINE -0002b9 6800 sbr r16, (1<<7) -0002ba e030 -0002bb e64c -0002bc d04a DELAY16 55 -0002bd 951a dec r17 -0002be f781 brne _OW_RD_BYTE_LP -0002bf 930c st X, r16 -0002c0 911f pop r17 -0002c1 910f pop r16 -0002c2 9478 sei -0002c3 9508 ret +0002e6 9506 lsr r16 +0002e7 9ab9 ow_pull +0002e8 e030 +0002e9 e04a +0002ea d053 DELAY16 6 +0002eb 98b9 ow_release +0002ec e030 +0002ed e140 +0002ee d04f DELAY16 9 +0002ef 99b1 sbic OW_PIN, OW_LINE +0002f0 6800 sbr r16, (1<<7) +0002f1 e030 +0002f2 e64c +0002f3 d04a DELAY16 55 +0002f4 951a dec r17 +0002f5 f781 brne _OW_RD_BYTE_LP +0002f6 930c st X, r16 +0002f7 911f pop r17 +0002f8 910f pop r16 +0002f9 9478 sei +0002fa 9508 ret // // @@ -1926,171 +2009,176 @@ main.asm(297): Including file 'mpy16u.asm' ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: -0002c4 930f push r16 -0002c5 935f push r21 -0002c6 e053 ldi r21, 3 +0002fb 930f push r16 +0002fc 935f push r21 +0002fd e053 ldi r21, 3 ; инициализация указателя (за каждый проход цикла будет инкрементироваться) -0002c7 e6a3 ldi XL, LOW(DIGITS) -0002c8 e0b0 ldi XH, HIGH(DIGITS) +0002fe e6a3 ldi XL, LOW(DIGITS) +0002ff e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого -0002c9 9380 0061 sts dividend, DISP_NUM_L -0002cb 9390 0062 sts dividend+1, DISP_NUM_H +000300 9380 0061 sts dividend, DISP_NUM_L +000302 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры -0002cd 9100 0061 lds dd16uL, dividend -0002cf 9110 0062 lds dd16uH, dividend+1 -0002d1 e02a ldi dv16uL, LOW(divisor) -0002d2 e030 ldi dv16uH, HIGH(divisor) +000304 9100 0061 lds dd16uL, dividend +000306 9110 0062 lds dd16uH, dividend+1 +000308 e02a ldi dv16uL, LOW(divisor) +000309 e030 ldi dv16uH, HIGH(divisor) -0002d3 ddf9 rcall div16u ; делим +00030a ddc2 rcall div16u ; делим -0002d4 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его +00030b 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое -0002d5 9300 0061 sts dividend, dres16uL -0002d7 9310 0062 sts dividend+1, dres16uH +00030c 9300 0061 sts dividend, dres16uL +00030e 9310 0062 sts dividend+1, dres16uH -0002d9 955a dec r21 ; декрементируем счетчик цикла -0002da f791 brne DIV_LOOP ; делим еще раз если не 0 -0002db 915f pop r21 -0002dc 910f pop r16 -0002dd 9508 ret +000310 955a dec r21 ; декрементируем счетчик цикла +000311 f791 brne DIV_LOOP ; делим еще раз если не 0 +000312 915f pop r21 +000313 910f pop r16 +000314 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: -0002de 930f push r16 -0002df 931f push r17 +000315 930f push r16 +000316 931f push r17 -0002e0 e4e0 ldi ZL, LOW(2*DISPLAY_SYMBOLS) -0002e1 e0f6 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) +000317 eaee ldi ZL, LOW(2*DISPLAY_SYMBOLS) +000318 e0f6 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) -0002e2 2711 clr TEMP_REG_B -0002e3 0fe0 add ZL, TEMP_REG_A -0002e4 1ff1 adc ZH, TEMP_REG_B +000319 2711 clr TEMP_REG_B +00031a 0fe0 add ZL, TEMP_REG_A +00031b 1ff1 adc ZH, TEMP_REG_B -0002e5 9004 lpm r0, Z -0002e6 911f pop r17 -0002e7 910f pop r16 -0002e8 9508 ret +00031c 9004 lpm r0, Z +00031d 911f pop r17 +00031e 910f pop r16 +00031f 9508 ret // // BEEP_SHORT: -0002e9 9ac5 sbi BUZZER_PORT, BUZZER_PIN -0002ea e053 -0002eb ea39 -0002ec e74d -0002ed d01d DELAY24 150000 -0002ee 98c5 cbi BUZZER_PORT, BUZZER_PIN -0002ef 9508 ret +000320 9ac5 sbi BUZZER_PORT, BUZZER_PIN +000321 e053 +000322 ea39 +000323 e74d +000324 d01d DELAY24 150000 +000325 98c5 cbi BUZZER_PORT, BUZZER_PIN +000326 9508 ret // // BEEP_LONG: -0002f0 9ac5 sbi BUZZER_PORT, BUZZER_PIN -0002f1 e05c -0002f2 e334 -0002f3 ef4d -0002f4 d016 DELAY24 500000 -0002f5 98c5 cbi BUZZER_PORT, BUZZER_PIN -0002f6 9508 ret +000327 9ac5 sbi BUZZER_PORT, BUZZER_PIN +000328 e05c +000329 e334 +00032a ef4d +00032b d016 DELAY24 500000 +00032c 98c5 cbi BUZZER_PORT, BUZZER_PIN +00032d 9508 ret // // DEBOUNCE_SW: -0002f7 930f push r16 -0002f8 931f push r17 -0002f9 932f push r18 +00032e 930f push r16 +00032f 931f push r17 +000330 932f push r18 -0002fa e02a ldi r18, 10 +000331 e02a ldi r18, 10 _loop_2: -0002fb ef1f ldi r17, 255 +000332 ef1f ldi r17, 255 _loop_0: -0002fc ef0f ldi r16, 255 +000333 ef0f ldi r16, 255 _dec_0: -0002fd 950a dec r16 -0002fe f7f1 brne _dec_0 +000334 950a dec r16 +000335 f7f1 brne _dec_0 _loop_1: -0002ff 951a dec r17 -000300 f7d9 brne _loop_0 +000336 951a dec r17 +000337 f7d9 brne _loop_0 _loop_3: -000301 952a dec r18 -000302 f7c1 brne _loop_2 +000338 952a dec r18 +000339 f7c1 brne _loop_2 -000303 912f pop r18 -000304 911f pop r17 -000305 910f pop r16 -000306 9508 ret// +00033a 912f pop r18 +00033b 911f pop r17 +00033c 910f pop r16 +00033d 9508 ret// // DELAY_LOOP_16: -000307 5041 subi DELAY_8_r, 1 -000308 4030 sbci DELAY_16_r, 0 -000309 f7e8 brcc DELAY_LOOP_16 -00030a 9508 ret +00033e 5041 subi DELAY_8_r, 1 +00033f 4030 sbci DELAY_16_r, 0 +000340 f7e8 brcc DELAY_LOOP_16 +000341 9508 ret // // DELAY_LOOP_24: -00030b 5041 subi DELAY_8_r, 1 -00030c 4030 sbci DELAY_16_r, 0 -00030d 4050 sbci DELAY_24_r, 0 -00030e f7e0 brcc DELAY_LOOP_24 -00030f 9508 ret +000342 5041 subi DELAY_8_r, 1 +000343 4030 sbci DELAY_16_r, 0 +000344 4050 sbci DELAY_24_r, 0 +000345 f7e0 brcc DELAY_LOOP_24 +000346 9508 ret // // DELAY: -000310 930f push r16 -000311 931f push r17 -000312 932f push r18 +000347 930f push r16 +000348 931f push r17 +000349 932f push r18 -000313 e026 ldi r18, 6 +00034a e026 ldi r18, 6 _DELAY_0: -000314 ef0f ldi r16, 255 +00034b ef0f ldi r16, 255 _DELAY_1: -000315 ef1f ldi r17, 255 +00034c ef1f ldi r17, 255 _DELAY_2: -000316 951a dec r17 -000317 f7f1 brne _DELAY_2 +00034d 951a dec r17 +00034e f7f1 brne _DELAY_2 -000318 950a dec r16 -000319 f7d9 brne _DELAY_1 -00031a 952a dec r18 -00031b f7c1 brne _DELAY_0 +00034f 950a dec r16 +000350 f7d9 brne _DELAY_1 +000351 952a dec r18 +000352 f7c1 brne _DELAY_0 -00031c 912f pop r18 -00031d 911f pop r17 -00031e 910f pop r16 -00031f 9508 ret // +000353 912f pop r18 +000354 911f pop r17 +000355 910f pop r16 +000356 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA -000320 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 -000321 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 -000322 9299 .DB 0b10011001, 0b10010010 ; 4, 5 -000323 f882 .DB 0b10000010, 0b11111000 ; 6, 7 -000324 9080 .DB 0b10000000, 0b10010000 ; 8, 9 -000325 bf9c .DB 0b10011100, 0b10111111 ; °, - -000326 89c6 .DB 0b11000110, 0b10001001 ; C, H +000357 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 +000358 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 +000359 9299 .DB 0b10011001, 0b10010010 ; 4, 5 +00035a f882 .DB 0b10000010, 0b11111000 ; 6, 7 +00035b 9080 .DB 0b10000000, 0b10010000 ; 8, 9 +00035c bf9c .DB 0b10011100, 0b10111111 ; °, - +00035d 89c6 .DB 0b11000110, 0b10001001 ; C, H // // // ; **** СЕГМЕНТ EEPROM ******************************************** - ; .ESEG - ; INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023" + .ESEG + +000000 E_SETTING_TEMP_H: .BYTE 1 +000001 E_SETTING_TEMP_L: .BYTE 1 +000002 E_SETTING_HYST: .BYTE 1 +000003 E_SETTING_MODE: .BYTE 1 +000004 E_FIRST_TIME_RUN: .BYTE 1 ; @@ -2111,37 +2199,37 @@ counted separately from r26..r31 here. "ATtiny2313A" register use summary: x : 2 y : 0 z : 1 r0 : 6 r1 : 2 r2 : 0 r3 : 0 r4 : 0 r5 : 6 r6 : 6 r7 : 0 r8 : 6 r9 : 0 r10: 2 r11: 2 r12: 2 -r13: 2 r14: 6 r15: 11 r16: 162 r17: 92 r18: 51 r19: 55 r20: 53 -r21: 24 r22: 5 r23: 10 r24: 5 r25: 5 r26: 4 r27: 4 r28: 0 +r13: 2 r14: 6 r15: 11 r16: 165 r17: 110 r18: 55 r19: 55 r20: 53 +r21: 24 r22: 5 r23: 10 r24: 6 r25: 6 r26: 4 r27: 4 r28: 0 r29: 0 r30: 2 r31: 2 Registers used: 27 out of 35 (77.1%) "ATtiny2313A" instruction use summary: .lds : 0 .sts : 0 adc : 6 add : 8 adiw : 0 and : 0 -andi : 3 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0 -brcc : 6 brcs : 1 break : 0 breq : 7 brge : 4 brhc : 0 +andi : 4 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0 +brcc : 6 brcs : 1 break : 0 breq : 11 brge : 4 brhc : 0 brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0 -brne : 25 brpl : 0 brsh : 0 brtc : 1 brts : 2 brvc : 0 -brvs : 0 bset : 0 bst : 0 cbi : 25 cbr : 3 clc : 2 -clh : 0 cli : 3 cln : 0 clr : 17 cls : 0 clt : 1 -clv : 0 clz : 0 com : 4 cp : 2 cpc : 2 cpi : 13 +brne : 26 brpl : 0 brsh : 0 brtc : 1 brts : 2 brvc : 0 +brvs : 0 bset : 0 bst : 0 cbi : 29 cbr : 3 clc : 2 +clh : 0 cli : 3 cln : 0 clr : 18 cls : 0 clt : 3 +clv : 0 clz : 0 com : 6 cp : 2 cpc : 2 cpi : 16 cpse : 0 dec : 14 eor : 0 icall : 0 ijmp : 0 in : 4 -inc : 4 ld : 0 ldd : 0 ldi : 94 lds : 38 lpm : 2 -lsl : 4 lsr : 11 mov : 28 movw : 0 neg : 1 nop : 2 -or : 1 ori : 0 out : 20 pop : 57 push : 56 rcall : 62 -ret : 25 reti : 3 rjmp : 48 rol : 6 ror : 9 sbc : 2 -sbci : 6 sbi : 14 sbic : 3 sbis : 8 sbiw : 0 sbr : 2 +inc : 4 ld : 0 ldd : 0 ldi : 99 lds : 39 lpm : 2 +lsl : 4 lsr : 11 mov : 31 movw : 0 neg : 1 nop : 2 +or : 1 ori : 0 out : 21 pop : 57 push : 56 rcall : 64 +ret : 25 reti : 3 rjmp : 58 rol : 6 ror : 9 sbc : 2 +sbci : 7 sbi : 14 sbic : 3 sbis : 10 sbiw : 0 sbr : 2 sbrc : 0 sbrs : 2 sec : 2 seh : 0 sei : 3 sen : 0 -ser : 2 ses : 0 set : 1 sev : 0 sez : 0 sleep : 0 -spm : 0 st : 2 std : 0 sts : 33 sub : 5 subi : 5 -swap : 0 tst : 6 wdr : 0 +ser : 2 ses : 0 set : 2 sev : 0 sez : 0 sleep : 0 +spm : 0 st : 2 std : 0 sts : 37 sub : 5 subi : 6 +swap : 0 tst : 7 wdr : 0 Instructions used: 57 out of 105 (54.3%) "ATtiny2313A" memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- -[.cseg] 0x000000 0x00064e 1580 14 1594 2048 77.8% +[.cseg] 0x000000 0x0006bc 1690 14 1704 2048 83.2% [.dseg] 0x000060 0x000072 0 18 18 128 14.1% -[.eseg] 0x000000 0x000000 0 0 0 128 0.0% +[.eseg] 0x000000 0x000005 0 5 5 128 3.9% Assembly complete, 0 errors, 21 warnings diff --git a/dist/default/production/attiny2313a_thermostat.X.production.map b/dist/default/production/attiny2313a_thermostat.X.production.map index 0b1d957..5722eb8 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 Thu Jun 29 14:17:58 2023 +AVRASM ver. 2.2.7 main.asm Thu Jun 29 22:49:03 2023 EQU SIGNATURE_000 0000001e @@ -527,12 +527,14 @@ EQU UART_TX_PIN 00000001 EQU MCU_STATE_DEFAULT 00000000 EQU MCU_STATE_PROGRAM 00000001 EQU MCU_STATE_ERROR 00000002 -EQU DEFAULT_TEMP 0000013b +EQU MIN_HYST 00000001 +EQU MAX_HYST 000000c8 +EQU DEFAULT_TEMP 0000012c EQU DEFAULT_HYST 00000005 EQU HEAT_MODE 00000001 EQU COOLING_MODE 00000000 EQU DEFAULT_MODE 00000001 -EQU DEFAULT_SETTING_TEMP_L 0000003b +EQU DEFAULT_SETTING_TEMP_L 0000002c EQU DEFAULT_SETTING_TEMP_H 00000001 EQU DEFAULT_SETTING_HYST 00000005 EQU DEFAULT_SETTING_MODE 00000001 @@ -558,7 +560,7 @@ CSEG _INTO_PROGRAM_STATE 00000014 CSEG _CLR_CURRENT_DIGIT 00000027 CSEG _indicate_1 0000002a CSEG _indicate_2 0000003c -CSEG DISPLAY_DECODER 000002de +CSEG DISPLAY_DECODER 00000315 CSEG USI_TRANSMIT 000001d7 CSEG _indicate_3 0000004e CSEG _indicate_4 0000005b @@ -567,17 +569,17 @@ CSEG MCU_INIT 00000072 CSEG RD_F_CODE 00000177 CSEG ERR_FAMILY_CODE 000000ae CSEG START_PROGRAM 000000b3 -CSEG BEEP_LONG 000002f0 -CSEG BEEP_SHORT 000002e9 +CSEG BEEP_LONG 00000327 +CSEG BEEP_SHORT 00000320 CSEG LOOP 000000b6 -CSEG DISPLAY_UPD_DIGITS 000002c4 +CSEG DISPLAY_UPD_DIGITS 000002fb CSEG _STATE_DEFAULT 000000b9 CSEG _STATE_PROGRAM 000000c5 CSEG TEMP_UPD 00000168 CSEG TEMP_COMPARSION 0000011b CSEG TEMP_SEND_UART 000000fd CSEG _STATE_ERROR 000000c9 -CSEG REPROGRAM_SETTINGS 0000020b +CSEG REPROGRAM_SETTINGS 00000211 DEF drem16uL r14 DEF drem16uH r15 DEF dres16uL r16 @@ -626,11 +628,11 @@ CSEG _MIN_THRESHOLD 00000151 CSEG _MAX_THRESHOLD 00000159 CSEG _COMPARSION_EXIT 00000160 CSEG TEMP_CONV 000001cb -CSEG DELAY_LOOP_24 0000030b +CSEG DELAY_LOOP_24 00000342 CSEG TEMP_RD 00000181 -CSEG OW_PRESENCE 00000276 -CSEG OW_SEND_BYTE 0000028b -CSEG OW_RD_BYTE 000002aa +CSEG OW_PRESENCE 000002ad +CSEG OW_SEND_BYTE 000002c2 +CSEG OW_RD_BYTE 000002e1 CSEG _TEMP_RD_EXIT 000001c5 CSEG _TEMP_RD_TO_UNSIGNED 0000019f CSEG _TEMP_RD_CONTINUE 000001a6 @@ -640,47 +642,63 @@ CSEG _USI_TRANSMIT_LOOP 000001dd CSEG BUTTON_PROCESS 000001e5 CSEG _SW_CHECK_ON_0 000001e6 CSEG _SW_SET_0 000001e9 -CSEG _SW_CHECK_ON_1 000001fd +CSEG _SW_CHECK_ON_1 00000203 CSEG _SW_SET_FROM_0_TO_1 000001ee -CSEG DEBOUNCE_SW 000002f7 +CSEG DEBOUNCE_SW 0000032e CSEG _SAVE_SETTINGS 000001f8 -CSEG _SW_SET_1 00000200 -CSEG _BUTTON_PROCESS_END 00000209 -CSEG _SW_SET_FROM_1_TO_0 00000205 -CSEG _INTO 00000214 -CSEG _REPROGRAM_SETTINGS_LOOP 00000216 -CSEG _CHECK_STEP 00000217 -CSEG _STEP_1 0000021c -CSEG _STEP_2 0000023d -CSEG _REPROGRAM_SETTINGS_END 00000270 -CSEG _S1_CHECK_PLUS 0000021d -CSEG _INCREASE_HYST 00000223 -CSEG _S1_CHECK_MINUS 00000220 -CSEG _DECREASE_HYST 0000022a -CSEG _SHOW_HYST 00000230 -CSEG _S2_CHECK_PLUS 0000023e -CSEG _INCREASE_TEMP 00000244 -CSEG _S2_CHECK_MINUS 00000241 -CSEG _DECREASE_TEMP 00000252 -CSEG _SHOW_TEMP 0000025d -CSEG DELAY_LOOP_16 00000307 -CSEG OW_CHECK_PRESENCE 00000285 -CSEG _EXIT 0000028a -CSEG _OW_SEND_BYTE_LOOP 00000290 -CSEG _OW_SEND_0 00000293 -CSEG _OW_SEND_1 0000029c -CSEG _OW_SEND_BYTE_END 000002a4 -CSEG _OW_RD_BYTE_LP 000002af +CSEG _SW_SET_1 00000206 +CSEG _BUTTON_PROCESS_END 0000020f +CSEG _SW_SET_FROM_1_TO_0 0000020b +CSEG _INTO 0000021a +CSEG _REPROGRAM_SETTINGS_LOOP 0000021c +CSEG _CHECK_STEP 0000021d +CSEG _STEP_1 00000224 +CSEG _STEP_2 0000024a +CSEG _S3_JMP 00000249 +CSEG _REPROGRAM_SETTINGS_END 000002a7 +CSEG _S1_CHECK_PLUS 00000225 +CSEG _INCREASE_HYST 0000022b +CSEG _S1_CHECK_MINUS 00000228 +CSEG _DECREASE_HYST 00000234 +CSEG _SHOW_HYST 0000023c +CSEG _STEP_3 00000288 +CSEG _S2_CHECK_PLUS 0000024b +CSEG _INCREASE_TEMP 00000251 +CSEG _S2_CHECK_MINUS 0000024e +CSEG _DECREASE_TEMP 0000025f +CSEG _SHOW_TEMP 0000026a +CSEG _NEGATE_SET_TEMP 00000277 +CSEG _DIVIDE_SET_TEMP 0000027c +CSEG _S3_CHECK_PLUS 00000289 +CSEG _SET_HEAT_MODE 0000028f +CSEG _S3_CHECK_MINUS 0000028c +CSEG _SET_COOLING_MODE 00000294 +CSEG _SHOW_MODE 00000298 +CSEG _SHOW_COOLING 000002a0 +CSEG _SHOW_HEATING 000002a4 +CSEG DELAY_LOOP_16 0000033e +CSEG OW_CHECK_PRESENCE 000002bc +CSEG _EXIT 000002c1 +CSEG _OW_SEND_BYTE_LOOP 000002c7 +CSEG _OW_SEND_0 000002ca +CSEG _OW_SEND_1 000002d3 +CSEG _OW_SEND_BYTE_END 000002db +CSEG _OW_RD_BYTE_LP 000002e6 EQU dividend 00000061 EQU divisor 0000000a -CSEG DIV_LOOP 000002cd -CSEG DISPLAY_SYMBOLS 00000320 -CSEG _loop_2 000002fb -CSEG _loop_0 000002fc -CSEG _dec_0 000002fd -CSEG _loop_1 000002ff -CSEG _loop_3 00000301 -CSEG DELAY 00000310 -CSEG _DELAY_0 00000314 -CSEG _DELAY_1 00000315 -CSEG _DELAY_2 00000316 +CSEG DIV_LOOP 00000304 +CSEG DISPLAY_SYMBOLS 00000357 +CSEG _loop_2 00000332 +CSEG _loop_0 00000333 +CSEG _dec_0 00000334 +CSEG _loop_1 00000336 +CSEG _loop_3 00000338 +CSEG DELAY 00000347 +CSEG _DELAY_0 0000034b +CSEG _DELAY_1 0000034c +CSEG _DELAY_2 0000034d +ESEG E_SETTING_TEMP_H 00000000 +ESEG E_SETTING_TEMP_L 00000001 +ESEG E_SETTING_HYST 00000002 +ESEG E_SETTING_MODE 00000003 +ESEG E_FIRST_TIME_RUN 00000004 diff --git a/dist/default/production/attiny2313a_thermostat.X.production.obj b/dist/default/production/attiny2313a_thermostat.X.production.obj index 5943883..0227def 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 ee61d04..ebd77ba 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.tmp +++ b/dist/default/production/attiny2313a_thermostat.X.production.tmp @@ -48,7 +48,7 @@ <_CLR_CURRENT_DIGIT>main.asm98 <_indicate_1>main.asm102 <_indicate_2>main.asm122 - main.asm926 + main.asm994 main.asm592 <_indicate_3>main.asm140 <_indicate_4>main.asm156 @@ -57,17 +57,17 @@ main.asm458 main.asm254 main.asm259 - main.asm952 - main.asm944 + main.asm1020 + main.asm1012 main.asm266 - main.asm885 + main.asm953 <_STATE_DEFAULT>main.asm269 <_STATE_PROGRAM>main.asm281 main.asm442 main.asm345 main.asm300 <_STATE_ERROR>main.asm286 - main.asm670 + main.asm675 div16u.asm32 div16u.asm36 div16u.asm42 @@ -87,11 +87,11 @@ <_MAX_THRESHOLD>main.asm424 <_COMPARSION_EXIT>main.asm431 main.asm570 - main.asm994 + main.asm1062 main.asm474 - main.asm798 - main.asm825 - main.asm856 + main.asm866 + main.asm893 + main.asm924 <_TEMP_RD_EXIT>main.asm562 <_TEMP_RD_TO_UNSIGNED>main.asm511 <_TEMP_RD_CONTINUE>main.asm524 @@ -101,47 +101,63 @@ main.asm625 <_SW_CHECK_ON_0>main.asm627 <_SW_SET_0>main.asm631 - <_SW_CHECK_ON_1>main.asm651 + <_SW_CHECK_ON_1>main.asm656 <_SW_SET_FROM_0_TO_1>main.asm636 - main.asm960 + main.asm1028 <_SAVE_SETTINGS>main.asm646 - <_SW_SET_1>main.asm655 - <_BUTTON_PROCESS_END>main.asm664 - <_SW_SET_FROM_1_TO_0>main.asm660 - <_INTO>main.asm681 - <_REPROGRAM_SETTINGS_LOOP>main.asm684 - <_CHECK_STEP>main.asm686 - <_STEP_1>main.asm693 - <_STEP_2>main.asm727 - <_REPROGRAM_SETTINGS_END>main.asm775 - <_S1_CHECK_PLUS>main.asm695 - <_INCREASE_HYST>main.asm703 - <_S1_CHECK_MINUS>main.asm699 - <_DECREASE_HYST>main.asm709 - <_SHOW_HYST>main.asm714 - <_S2_CHECK_PLUS>main.asm729 - <_INCREASE_TEMP>main.asm737 - <_S2_CHECK_MINUS>main.asm733 - <_DECREASE_TEMP>main.asm748 - <_SHOW_TEMP>main.asm756 - main.asm986 - main.asm814 - <_EXIT>main.asm820 - <_OW_SEND_BYTE_LOOP>main.asm831 - <_OW_SEND_0>main.asm835 - <_OW_SEND_1>main.asm841 - <_OW_SEND_BYTE_END>main.asm846 - <_OW_RD_BYTE_LP>main.asm862 - main.asm902 - main.asm1028 - <_loop_2>main.asm966 - <_loop_0>main.asm968 - <_dec_0>main.asm970 - <_loop_1>main.asm973 - <_loop_3>main.asm976 - main.asm1003 - <_DELAY_0>main.asm1009 - <_DELAY_1>main.asm1011 - <_DELAY_2>main.asm1013 + <_SW_SET_1>main.asm660 + <_BUTTON_PROCESS_END>main.asm669 + <_SW_SET_FROM_1_TO_0>main.asm665 + <_INTO>main.asm686 + <_REPROGRAM_SETTINGS_LOOP>main.asm689 + <_CHECK_STEP>main.asm691 + <_STEP_1>main.asm701 + <_STEP_2>main.asm744 + <_S3_JMP>main.asm740 + <_REPROGRAM_SETTINGS_END>main.asm843 + <_S1_CHECK_PLUS>main.asm703 + <_INCREASE_HYST>main.asm711 + <_S1_CHECK_MINUS>main.asm707 + <_DECREASE_HYST>main.asm719 + <_SHOW_HYST>main.asm726 + <_STEP_3>main.asm806 + <_S2_CHECK_PLUS>main.asm746 + <_INCREASE_TEMP>main.asm754 + <_S2_CHECK_MINUS>main.asm750 + <_DECREASE_TEMP>main.asm765 + <_SHOW_TEMP>main.asm773 + <_NEGATE_SET_TEMP>main.asm786 + <_DIVIDE_SET_TEMP>main.asm790 + <_S3_CHECK_PLUS>main.asm808 + <_SET_HEAT_MODE>main.asm816 + <_S3_CHECK_MINUS>main.asm812 + <_SET_COOLING_MODE>main.asm821 + <_SHOW_MODE>main.asm825 + <_SHOW_COOLING>main.asm834 + <_SHOW_HEATING>main.asm838 + main.asm1054 + main.asm882 + <_EXIT>main.asm888 + <_OW_SEND_BYTE_LOOP>main.asm899 + <_OW_SEND_0>main.asm903 + <_OW_SEND_1>main.asm909 + <_OW_SEND_BYTE_END>main.asm914 + <_OW_RD_BYTE_LP>main.asm930 + main.asm970 + main.asm1096 + <_loop_2>main.asm1034 + <_loop_0>main.asm1036 + <_dec_0>main.asm1038 + <_loop_1>main.asm1041 + <_loop_3>main.asm1044 + main.asm1071 + <_DELAY_0>main.asm1077 + <_DELAY_1>main.asm1079 + <_DELAY_2>main.asm1081 + main.asm1113 + main.asm1114 + main.asm1115 + main.asm1116 + main.asm1117 diff --git a/macros.asm b/macros.asm index 6a7ed0d..14eb974 100644 --- a/macros.asm +++ b/macros.asm @@ -24,6 +24,15 @@ .MACRO relay_off cbi RELAY_PORT, RELAY_PIN .ENDMACRO + +; @0 - младший байт +; @1 - старший байт +.MACRO com16 + com @0 + com @1 + subi @0, low(-1) + sbci @1, high(-1) +.ENDMACRO .MACRO DELAY16 ldi DELAY_16_r, HIGH(@0*F_CPU/4-2) diff --git a/main.asm b/main.asm index dbc3e61..8282196 100644 --- a/main.asm +++ b/main.asm @@ -89,7 +89,7 @@ TIMER0_COMPA_vect: push r20 push r21 in r21, SREG - + lds r20, CURRENT_DIGIT cpi r20, 5 brge _CLR_CURRENT_DIGIT ; сброс активного разряда если >= 5 @@ -136,11 +136,11 @@ _indicate_2: lds TEMP_REG_A, DIGITS+1 rcall DISPLAY_DECODER rcall USI_TRANSMIT - + _indicate_3: cpi r20, 2 brne _indicate_4 - + cbi PORTD, DIGIT_1_PIN cbi PORTD, DIGIT_2_PIN cbi PORTD, DIGIT_4_PIN @@ -196,7 +196,7 @@ MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 0 (8 бит) ************************* outi r16, TCCR0A, (1< _STEP_1: ; установка и отображение гистерезиса nop _S1_CHECK_PLUS: @@ -703,12 +711,16 @@ _S1_CHECK_MINUS: _INCREASE_HYST: rcall DEBOUNCE_SW lds r17, SETTING_HYST + cpi r17, MAX_HYST + breq PC+2 inc r17 sts SETTING_HYST, r17 rjmp _SHOW_HYST _DECREASE_HYST: rcall DEBOUNCE_SW lds r17, SETTING_HYST + cpi r17, MIN_HYST + breq PC+2 dec r17 sts SETTING_HYST, r17 _SHOW_HYST: @@ -723,7 +735,12 @@ _SHOW_HYST: pop dv8u pop dd8u rjmp _REPROGRAM_SETTINGS_END +// + +_S3_JMP: ; просто прыжок на _STEP_3 + rjmp _STEP_3 +// _STEP_2: nop _S2_CHECK_PLUS: @@ -761,6 +778,16 @@ _SHOW_TEMP: lds dd16uL, SETTING_TEMP_L lds dd16uH, SETTING_TEMP_H + mov r18, dd16uH + andi r18, (1<<7) + brne _NEGATE_SET_TEMP + clt + rjmp _DIVIDE_SET_TEMP +_NEGATE_SET_TEMP: + set + com16 dd16uL, dd16uH + +_DIVIDE_SET_TEMP: ldi dv16uL, LOW(10) ldi dv16uH, HIGH(10) rcall div16u @@ -772,6 +799,47 @@ _SHOW_TEMP: pop dv16uL pop dd16uH pop dd16uL + rjmp _REPROGRAM_SETTINGS_END +// + +// +_STEP_3: + clt +_S3_CHECK_PLUS: + sbis SW_PIN, SW_PLUS_PIN + rjmp _SET_HEAT_MODE + rjmp _S3_CHECK_MINUS +_S3_CHECK_MINUS: + sbis SW_PIN, SW_MINUS_PIN + rjmp _SET_COOLING_MODE + rjmp _SHOW_MODE +_SET_HEAT_MODE: + rcall DEBOUNCE_SW + ldi r17, HEAT_MODE + sts SETTING_MODE, r17 + rjmp _SHOW_MODE +_SET_COOLING_MODE: + rcall DEBOUNCE_SW + ldi r17, COOLING_MODE + sts SETTING_MODE, r17 +_SHOW_MODE: + clr r17 + mov DISP_NUM_L, r17 + mov DISP_NUM_H, r17 + lds r18, SETTING_MODE + tst r18 + breq _SHOW_COOLING + rjmp _SHOW_HEATING + +_SHOW_COOLING: + ldi r17, 12 + sts DIGITS+3, r17 + rjmp _REPROGRAM_SETTINGS_END +_SHOW_HEATING: + ldi r17, 13 + sts DIGITS+3, r17 +// + _REPROGRAM_SETTINGS_END: pop r20 pop r19 @@ -1040,6 +1108,11 @@ DISPLAY_SYMBOLS: // ; **** СЕГМЕНТ EEPROM ******************************************** -; .ESEG -; INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023" +.ESEG + +E_SETTING_TEMP_H: .BYTE 1 +E_SETTING_TEMP_L: .BYTE 1 +E_SETTING_HYST: .BYTE 1 +E_SETTING_MODE: .BYTE 1 +E_FIRST_TIME_RUN: .BYTE 1 ; diff --git a/main.hex b/main.hex index ddfb46e..4ecf332 100644 --- a/main.hex +++ b/main.hex @@ -1,98 +1,112 @@ :020000020000FC -:020000007AC0C4 +:020000006FC0CF :02000800189549 :0200160002C026 -:10001A0018C00F931F932F933F930FB716B3212F37 -:10002A002C71309171002327209371001C7019F4F0 -:10003A0011E0109360000FBF3F912F911F910F9114 -:10004A0018950F931F932F933F934F935F935FB727 -:10005A004091670045300CF403C044274093670081 -:10006A00403081F49398949895980EF002C00BE072 -:10007A0002C000916500002311F0929A01C0929883 -:10008A0060D29BD1413081F49298949895980091CE -:10009A00640030916500032B11F0939A01C0939884 -:1000AA00009164004ED289D1423059F492989398C3 -:1000BA009598949A0091630044D2002D0F77002EF0 -:1000CA007CD1433041F4929893989498959A0091F0 -:1000DA00660037D272D14395409367005FBF5F9144 -:1000EA004F913F912F911F910F9118950FED0DBFD1 -:1000FA000FE701BB01EE07BB0CE108BB02E000BF42 -:10010A0005E003BF09E106BF00E20BBF0CE100BD39 -:10011A0003E309B900E002B908E00AB906E003B945 -:10012A0011241092670000E0009360000CE2009333 -:10013A006C0001E000936B0005E000936D0001E0A4 -:10014A0000936E000027009368000093690000EF97 -:10015A0000936A0000E0009371006624CED00091FB -:10016A006F00083209F405C012E010936000FBD159 -:10017A0001C0F2D180E090E000916000C8D1003067 -:10018A0051F4969820916A0020936600A7D011E056 -:10019A0019BF57D038D0013011F496981CD10230CB -:1001AA0059F7969AE9CFEE24FF1841E1001F111F73 -:1001BA004A9509F40895EE1CFF1CE21AF30A20F48A -:1001CA00E20EF31E8894F2CF0894F0CFFF1829E0CC -:1001DA00001F2A9509F40895FF1CF11A18F4F10E6C -:1001EA008894F6CF0894F4CF5527442760E13695D2 -:1001FA00279510F4400F511F579547953795279526 -:10020A006A95B9F708950F931F9300916800502ECD -:10021A0014D000916A00502E10D000B30170502EF5 -:10022A000CD004E0502E09D00027502E1CE005D037 -:10023A001A95E9F71F910F9108955D9BFECF5CB85F -:10024A0008950F931F932F933F934F935F937F9339 -:10025A0000916800109169002AE030E0C5DF022FA2 -:10026A00132F20916A003327020F131F40916C004D -:10027A0050916B0060916D004F935F937727461BF7 -:10028A00570BB42EA52E5F914F917727460F571F14 -:10029A00D42EC52E0EF004C0009510950F5F1F4F87 -:1002AA00B016A10624F40D151C054CF40FC040919C -:1002BA006E00442311F4909801C0909A07C04091AF -:1002CA006E00442311F4909A01C090987F915F9137 -:1002DA004F913F912F911F910F9108951F9361D0D4 -:1002EA0052E135E54DEB5AD112D010916800812FB9 -:1002FA0010916900912F1F9108950F93BAD003E3CB -:10030A00802ECCD0AFE6B0E0E8D00F9108950F93DD -:10031A001F932F933F934F93ACD070FF3CC00CECCC -:10032A00802EBCD00EEB802EB9D0A8E6B0E0D5D096 -:10033A00A9E6B0E0D2D010916800209169002F930D -:10034A00287F283F11F0E89407C02F9168941095F0 -:10035A0020951F5F2F4F01C02F912695179526953F -:10036A0017952695179526951795309168000EF4DE -:10037A003195432F3F70432F330F330F330F440F01 -:10038A00340F369536953695369510936800209336 -:10039A00690030936A004F913F912F911F910F91FD -:1003AA0008950F9366D070FF06C00CEC802E76D0AD -:1003BA0004E4802E73D00F9108950F930F920FB813 -:1003CA0000E40EB90BE10DB9769BFDCFC09AC09837 -:1003DA000F900F9108950F931F932F93062D0023CB -:1003EA0009F002C06394B8D0013009F00CC00F9331 -:1003FA001F9300916D001AE0E9DE802F9927F09291 -:10040A0066001F910F910091710004FF01C015C091 -:10041A00B49B01C02AC01091710010611093710041 -:10042A00A9D06394162D143011F096D01EC06624FC -:10043A009AD010E01093600018C0B29B03C0B39B1F -:10044A000BC013C057E032E54DEFA8D020916D00E4 -:10045A00239520936D0009C057E032E54DEF9ED0F9 -:10046A0020916D002A9520936D002F911F910F9175 -:10047A000895F894B99A33E04EEB8CD0B99830E0ED -:10048A004AE888D005D033E042E384D078940895CE -:10049A00B19B716002C0B1997E7F0895F8940F9361 -:1004AA001F93082D18E0069508F448F0B99A30E031 -:1004BA0046E770D0B99830E042E16CD008C0B99AEA -:1004CA0030E04AE067D0B99830E04EE763D01A9539 -:1004DA0051F71F910F9178940895F8940F931F93F1 -:1004EA00002718E00695B99A30E04AE053D0B99847 -:1004FA0030E040E14FD0B199006830E04CE64AD094 -:10050A001A9581F70C931F910F91789408950F9380 -:10051A005F9353E0A3E6B0E080936100909362009A -:10052A0000916100109162002AE030E03CDEED9219 -:10053A0000936100109362005A9591F75F910F91B1 -:10054A0008950F931F93E0EDF5E01127E00FF11FD7 -:10055A0004901F910F910895C59A53E039EA4DE727 -:10056A001DD0C5980895C59A5CE034E34DEF16D0C6 -:10057A00C59808950F931F932F932AE01FEF0FEF4B -:10058A000A95F1F71A95D9F72A95C1F72F911F9174 -:10059A000F91089541503040E8F708954150304096 -:1005AA005040E0F708950F931F932F9326E00FEF23 -:1005BA001FEF1A95F1F70A95D9F72A95C1F72F91E6 -:1005CA001F910F910895C0F9A4B0999282F8809072 -:0405DA009CBFC68973 +:10001A000DC00F931F930FB716B31C7019F411E09C +:10002A00109360000FBF1F910F9118950F931F93A4 +:10003A002F933F934F935F935FB74091670045308B +:10004A000CF403C0442740936700403081F493982E +:10005A00949895980EF002C00BE002C000916500DA +:10006A00002311F0929A01C09298DAD29BD14130C2 +:10007A0081F4929894989598009164003091650063 +:10008A00032B11F0939A01C0939800916400C8D28F +:10009A0089D1423059F4929893989598949A0091FC +:1000AA006300BED2002D0F77002E7CD1433041F47D +:1000BA00929893989498959A00916600B1D272D1C9 +:1000CA004395409367005FBF5F914F913F912F9196 +:1000DA001F910F9118950FED0DBF0FE701BB01EEB0 +:1000EA0007BB0CE108BB02E000BF05E003BF03E267 +:1000FA0006BF00E20BBF0CE100BD03E309B900E053 +:10010A0002B908E00AB906E003B91124109267009F +:10011A0000E0009360000CE200936C0001E00093A1 +:10012A006B0005E000936D0001E000936E0000276C +:10013A00009368000093690000EF00936A000FEFD4 +:10014A00009371006624CED000916F00083209F442 +:10015A0005C012E01093600075D201C06CD280E035 +:10016A0090E00091600042D2003051F496982091BC +:10017A006A0020936600A7D059D011E019BF38D081 +:10018A00013011F4969848D1023059F7969AE9CF7E +:10019A00EE24FF1841E1001F111F4A9509F4089542 +:1001AA00EE1CFF1CE21AF30A20F4E20EF31E8894F6 +:1001BA00F2CF0894F0CFFF1829E0001F2A9509F41E +:1001CA000895FF1CF11A18F4F10E8894F6CF0894DA +:1001DA00F4CF5527442760E13695279510F4400F50 +:1001EA00511F57954795379527956A95B9F70895F9 +:1001FA000F931F9300916800502E14D000916A004B +:10020A00502E10D000B30170502E0CD004E0502EA6 +:10021A0009D00027502E1CE005D01A95E9F71F9146 +:10022A000F9108955D9BFECF5CB808950F931F93BD +:10023A002F933F934F935F937F93009168001091A0 +:10024A0069002AE030E0C5DF022F132F20916A00EF +:10025A003327020F131F40916C0050916B0060917D +:10026A006D004F935F937727461B570BB42EA52E2D +:10027A005F914F917727460F571FD42EC52E0EF048 +:10028A0004C0009510950F5F1F4FB016A10624F405 +:10029A000D151C054CF40FC040916E00442311F457 +:1002AA00909801C0909A07C040916E00442311F4BF +:1002BA00909A01C090987F915F914F913F912F91B1 +:1002CA001F910F9108951F9361D052E135E54DEBCF +:1002DA00D4D112D010916800812F10916900912F0A +:1002EA001F9108950F9334D103E3802E46D1AFE6D0 +:1002FA00B0E062D10F9108950F931F932F933F930C +:10030A004F9326D170FF3CC00CEC802E36D10EEBF9 +:10031A00802E33D1A8E6B0E04FD1A9E6B0E04CD1A7 +:10032A0010916800209169002F93287F283F11F0CF +:10033A00E89407C02F916894109520951F5F2F4F5E +:10034A0001C02F91269517952695179526951795ED +:10035A0026951795309168000EF43195432F3F701A +:10036A00432F330F330F330F440F340F369536951F +:10037A0036953695109368002093690030936A0089 +:10038A004F913F912F911F910F9108950F93E0D0B4 +:10039A0070FF06C00CEC802EF0D004E4802EEDD065 +:1003AA000F9108950F930F920FB800E40EB90BE165 +:1003BA000DB9769BFDCFC09AC0980F900F91089502 +:1003CA000F93B49B01C01AC000917100002309F475 +:1003DA0015C00027009371003CD16394162D143088 +:1003EA0014F429D10BC010E019BF929893989498ED +:1003FA009598662427D110E010936000B49901C043 +:10040A0009C000917100002309F004C00FEF0093A6 +:10041A0071001FD10F9108950F931F932F933F934C +:10042A004F93062D002309F002C005D16394C8DF5B +:10043A00013029F0023049F1033031F183C0000064 +:10044A00B29B04C000C0B39B0AC011C002D1109174 +:10045A006D00183C09F0139510936D0008C0F9D08F +:10046A0010916D00113009F01A9510936D000F93D9 +:10047A001F9300916D001AE09EDE802F9927F0925B +:10048A0066001F910F915EC03EC00000B29B04C07F +:10049A0000C0B39B0FC019C0DCD010916C00209132 +:1004AA006B0031E0130F3327231F10936C00209346 +:1004BA006B000BC0CED010916C0020916B001150D4 +:1004CA00204010936C0020936B000F931F932F937F +:1004DA003F9300916C0010916B00212F207811F44A +:1004EA00E89405C06894009510950F5F1F4F2AE0A5 +:1004FA0030E04EDE802F912FE09266003F912F91DF +:10050A001F910F911FC0E894B29B04C000C0B39B17 +:10051A0006C009C09ED011E010936E0004C099D0A5 +:10052A0010E010936E001127812F912F20916E00F9 +:10053A00222309F004C01CE01093660003C01DE0EA +:10054A00109366004F913F912F911F910F9108953B +:10055A00F894B99A33E04EEB8CD0B99830E04AE877 +:10056A0088D005D033E042E384D078940895B19BD3 +:10057A00716002C0B1997E7F0895F8940F931F931A +:10058A00082D18E0069508F448F0B99A30E046E7D5 +:10059A0070D0B99830E042E16CD008C0B99A30E026 +:1005AA004AE067D0B99830E04EE763D01A9551F720 +:1005BA001F910F9178940895F8940F931F93002731 +:1005CA0018E00695B99A30E04AE053D0B99830E07D +:1005DA0040E14FD0B199006830E04CE64AD01A9514 +:1005EA0081F70C931F910F91789408950F935F935D +:1005FA0053E0A3E6B0E0809361009093620000911B +:10060A006100109162002AE030E0C2DDED920093B1 +:10061A006100109362005A9591F75F910F910895C6 +:10062A000F931F93EEEAF6E01127E00FF11F0490F3 +:10063A001F910F910895C59A53E039EA4DE71DD0ED +:10064A00C5980895C59A5CE034E34DEF16D0C59875 +:10065A0008950F931F932F932AE01FEF0FEF0A9528 +:10066A00F1F71A95D9F72A95C1F72F911F910F9192 +:10067A00089541503040E8F70895415030405040C5 +:10068A00E0F708950F931F932F9326E00FEF1FEFC4 +:10069A001A95F1F70A95D9F72A95C1F72F911F9163 +:1006AA000F910895C0F9A4B0999282F880909CBFE6 +:0206BA00C689EF :00000001FF