diff --git a/definitions.asm b/definitions.asm index fde983e..5c0717e 100644 --- a/definitions.asm +++ b/definitions.asm @@ -63,12 +63,15 @@ ; **** СТАНДАРТНЫЕ ПАРАМЕТРЫ *********************************** ; Отдельно задается целая и дробная часть в точности до десятых -; Например: 30.5 градусов -.EQU DEFAULT_SETTING_INT = 0 -.EQU DEFAULT_SETTING_F = 5 // 0.5 - -.EQU DEFAULT_SETTING_HYST = 15 // 1.5 +.EQU DEFAULT_TEMP = 150 ; 30.5 градусов +.EQU DEFAULT_HYST = 8 ; 1.2 градуса гистерезис .EQU HEAT_MODE = 1 .EQU COOLING_MODE = 0 -.EQU DEFAULT_SETTING_MODE = HEAT_MODE \ No newline at end of file +.EQU DEFAULT_MODE = HEAT_MODE + + +.EQU DEFAULT_SETTING_TEMP_L = LOW(DEFAULT_TEMP) +.EQU DEFAULT_SETTING_TEMP_H = HIGH(DEFAULT_TEMP) +.EQU DEFAULT_SETTING_HYST = DEFAULT_HYST +.EQU DEFAULT_SETTING_MODE = DEFAULT_MODE \ No newline at end of file diff --git a/dist/default/production/attiny2313a_thermostat.X.production.hex b/dist/default/production/attiny2313a_thermostat.X.production.hex index 4b33515..4e8ef8d 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.hex +++ b/dist/default/production/attiny2313a_thermostat.X.production.hex @@ -7,68 +7,76 @@ :10004A000F931F935FB74091670045300CF403C0CC :10005A00442740936700403081F493989498959888 :10006A000EF002C00BE002C000916500002311F0FF -:10007A00929A01C09298B0D12BD1413081F49298D2 +:10007A00929A01C09298F0D16BD1413081F4929852 :10008A00949895980091640030916500032B11F0C3 -:10009A00939A01C09398009164009ED119D142307D -:1000AA0059F4929893989598949A0091630094D1F0 -:1000BA00002D0F77002E0CD1433041F4929893987B -:1000CA009498959A00916B0087D102D143954093F9 +:10009A00939A01C0939800916400DED159D14230FD +:1000AA0059F4929893989598949A00916300D4D1B0 +:1000BA00002D0F77002E4CD1433041F4929893983B +:1000CA009498959A00916B00C7D142D14395409379 :1000DA0067005FBF1F910F915F914F9118950FEDC8 :1000EA000DBF0FE701BB01EE07BB0CE108BB02E045 :1000FA0000BF05E003BF09E106BF00E20BBF0CE148 -:10010A0000BD11241092670000E00093600000E037 -:10011A0000936C0005E000936D000FE000936E0001 +:10010A0000BD11241092670000E00093600006E928 +:10011A0000936D0000E000936C0008E000936E000D :10012A0001E000936F0000270093690000936A00C2 -:10013A0000EF00936B006ED000917000083209F452 -:10014A0005C012E01093600056D101C050D180E082 -:10015A0090E000916000003031F4969823D147D0A6 -:10016A0001E009BF1CD0013019F496981BD1BCD00C +:10013A0000EF00936B00AED000917000083209F412 +:10014A0005C012E01093600096D101C090D180E002 +:10015A0090E000916000003031F4969863D187D026 +:10016A0001E009BF39D0013019F496985BD1FCD06F :10017A00023079F7969AEDCFEE24FF1841E1001F7D :10018A00111F4A9509F40895EE1CFF1CE21AF30A9E -:10019A0020F4E20EF31E8894F2CF0894F0CF0F9366 -:1001AA001F932F933F934F935F936F93009169002F -:1001BA0010916A0020916B003CE140E250916F007F -:1001CA000EF001C00195552309F409C030170CF44B -:1001DA0002C0909A04C004170CF401C090986F9161 -:1001EA005F914F913F912F911F910F9108951F9306 -:1001FA0065D05CE034E34DEF19D15CE034E34DEFB8 -:10020A0015D112D010916900812F10916A00912F97 -:10021A001F9108950F9376D003E3802E88D0A0E72C -:10022A00B0E0A6D00F9108950F931F932F933F9399 -:10023A004F9368D00CEC802E7AD00EEB802E77D0BC -:10024A00A9E6B0E095D0AAE6B0E092D01091690094 -:10025A0020916A002F93287F283F11F0E89409C063 -:10026A002F9168941095209531E0130F30E0231FE9 -:10027A0001C02F91269517952695179526951795BE -:10028A0026951795309169000EF43195432F3F70EA -:10029A00432F330F330F330F440F340F36953695F0 -:1002AA00369536951093690020936A0030936B0057 -:1002BA004F913F912F911F910F9108950F9322D043 -:1002CA000CEC802E34D004E4802E31D00F910895A6 -:1002DA000F930FB800E40EB90BE10DB9769BFDCF71 -:1002EA00C09AC0980F9108950F938CD0B29B019633 -:1002FA00B39B0197B49B01C003C000E00093600068 -:10030A000F910895F894B99A33E04EEB8BD0B998CF -:10031A0030E04AE887D005D033E042E383D07894CE -:10032A000895B19B716002C0B1997E7F08950F93C1 -:10033A001F93082D18E0069508F458F0F894B99A16 -:10034A0030E046E76FD0B99830E042E16BD078945C -:10035A000AC0F894B99A30E04AE064D0B99830E01B -:10036A004EE760D078941A9531F71F910F9108954E -:10037A000F931F93002718E0F8940695B99A30E076 -:10038A004AE050D0B99830E040E14CD0B1990068C9 -:10039A0030E04CE647D01A9581F70C9378941F9178 -:1003AA000F910895F8945F9354E0A3E6B0E0809328 -:1003BA0061009093620000916100109162002AE04E -:1003CA0030E0DADEED9200936100109362005A95F4 -:1003DA0091F75F91789408950F931F93E0E6F4E004 -:1003EA001127E00FF11F04901F910F910895C59AEC -:1003FA0022D0C5980895C59A1ED01DD01CD01BD0F6 -:10040A00C59808950F931F932F932AE01FEF0FEFBC -:10041A000A95F1F71A95D9F72A95C1F72F911F91E5 -:10042A000F91089541503040E8F708954150304007 -:10043A005040E0F708950F931F932F9326E00FEF94 -:10044A001FEF1A95F1F70A95D9F72A95C1F72F9157 -:10045A001F910F910895C0F9A4B0999282F88090E3 -:02046A009CBF35 +:10019A0020F4E20EF31E8894F2CF0894F0CFFF18F1 +:1001AA0029E0001F2A9509F40895FF1CF11A18F492 +:1001BA00F10E8894F6CF0894F4CF5527442760E1CE +:1001CA003695279510F4400F511F57954795379547 +:1001DA0027956A95B9F708950F931F932F933F9325 +:1001EA004F935F936F937F930091690010916A0018 +:1001FA002AE030E0E2DF022F132F20916B00332731 +:10020A00020F131F109371000093720040916D004A +:10021A0050916C0060916E004F935F937727461B55 +:10022A00570BB42EA52E5F914F917727460F571F74 +:10023A00D42EC52E0EF004C0009510950F5F1F4FE7 +:10024A0040916F00442301F4B016A10624F40D1561 +:10025A001C051CF403C0909A01C090987F916F917D +:10026A005F914F913F912F911F910F9108951F9385 +:10027A0065D05CE034E34DEF19D15CE034E34DEF37 +:10028A0015D112D010916900812F10916A00912F17 +:10029A001F9108950F9376D003E3802E88D0A0E7AC +:1002AA00B0E0A6D00F9108950F931F932F933F9319 +:1002BA004F9368D00CEC802E7AD00EEB802E77D03C +:1002CA00A9E6B0E095D0AAE6B0E092D01091690014 +:1002DA0020916A002F93287F283F11F0E89409C0E3 +:1002EA002F9168941095209531E0130F30E0231F69 +:1002FA0001C02F912695179526951795269517953E +:10030A0026951795309169000EF43195432F3F7069 +:10031A00432F330F330F330F440F340F369536956F +:10032A00369536951093690020936A0030936B00D6 +:10033A004F913F912F911F910F9108950F9322D0C2 +:10034A000CEC802E34D004E4802E31D00F91089525 +:10035A000F930FB800E40EB90BE10DB9769BFDCFF0 +:10036A00C09AC0980F9108950F938CD0B29B0196B2 +:10037A00B39B0197B49B01C003C000E000936000E7 +:10038A000F910895F894B99A33E04EEB8BD0B9984F +:10039A0030E04AE887D005D033E042E383D078944E +:1003AA000895B19B716002C0B1997E7F08950F9341 +:1003BA001F93082D18E0069508F458F0F894B99A96 +:1003CA0030E046E76FD0B99830E042E16BD07894DC +:1003DA000AC0F894B99A30E04AE064D0B99830E09B +:1003EA004EE760D078941A9531F71F910F910895CE +:1003FA000F931F93002718E0F8940695B99A30E0F6 +:10040A004AE050D0B99830E040E14CD0B199006848 +:10041A0030E04CE647D01A9581F70C9378941F91F7 +:10042A000F910895F8945F9354E0A3E6B0E08093A7 +:10043A0061009093620000916100109162002AE0CD +:10044A0030E09ADEED9200936100109362005A95B3 +:10045A0091F75F91789408950F931F93E0EEF4E07B +:10046A001127E00FF11F04901F910F910895C59A6B +:10047A0022D0C5980895C59A1ED01DD01CD01BD075 +:10048A00C59808950F931F932F932AE01FEF0FEF3C +:10049A000A95F1F71A95D9F72A95C1F72F911F9165 +:1004AA000F91089541503040E8F708954150304087 +:1004BA005040E0F708950F931F932F9326E00FEF14 +:1004CA001FEF1A95F1F70A95D9F72A95C1F72F91D7 +:1004DA001F910F910895C0F9A4B0999282F8809063 +:0204EA009CBFB5 :00000001FF diff --git a/dist/default/production/attiny2313a_thermostat.X.production.lss b/dist/default/production/attiny2313a_thermostat.X.production.lss index 9c65167..22a6bd2 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.lss +++ b/dist/default/production/attiny2313a_thermostat.X.production.lss @@ -1,26 +1,58 @@ -AVRASM ver. 2.2.7 main.asm Sun Jun 25 15:01:25 2023 +AVRASM ver. 2.2.7 main.asm Sun Jun 25 23:20:09 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(288): Including file 'div16u.asm' +main.asm(294): Including file 'div16u.asm' div16u.asm(22): warning: Register r16 already defined by the .DEF directive -main.asm(288): 'div16u.asm' included form here +main.asm(294): 'div16u.asm' included form here div16u.asm(23): warning: Register r17 already defined by the .DEF directive -main.asm(288): 'div16u.asm' included form here +main.asm(294): 'div16u.asm' included form here div16u.asm(24): warning: Register r16 already defined by the .DEF directive -main.asm(288): 'div16u.asm' included form here +main.asm(294): 'div16u.asm' included form here div16u.asm(25): warning: Register r17 already defined by the .DEF directive -main.asm(288): 'div16u.asm' included form here +main.asm(294): 'div16u.asm' included form here div16u.asm(27): warning: Register r19 already defined by the .DEF directive -main.asm(288): 'div16u.asm' included form here +main.asm(294): 'div16u.asm' included form here div16u.asm(28): warning: Register r20 already defined by the .DEF directive -main.asm(288): 'div16u.asm' included form here +main.asm(294): 'div16u.asm' included form here +main.asm(295): Including file 'div8u.asm' +div8u.asm(18): warning: Register r15 already defined by the .DEF directive +main.asm(295): 'div8u.asm' included form here +div8u.asm(19): warning: Register r16 already defined by the .DEF directive +main.asm(295): 'div8u.asm' included form here +div8u.asm(20): warning: Register r16 already defined by the .DEF directive +main.asm(295): 'div8u.asm' included form here +div8u.asm(21): warning: Register r17 already defined by the .DEF directive +main.asm(295): 'div8u.asm' included form here +div8u.asm(22): warning: Register r18 already defined by the .DEF directive +main.asm(295): 'div8u.asm' included form here +main.asm(296): Including file 'mpy16u.asm' +mpy16u.asm(19): warning: Register r16 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +mpy16u.asm(20): warning: Register r17 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +mpy16u.asm(21): warning: Register r18 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +mpy16u.asm(22): warning: Register r19 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +mpy16u.asm(23): warning: Register r18 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +mpy16u.asm(24): warning: Register r19 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +mpy16u.asm(25): warning: Register r20 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +mpy16u.asm(26): warning: Register r21 already defined by the .DEF directive +main.asm(296): 'mpy16u.asm' included form here +main.asm(318): warning: Register r16 already defined by the .DEF directive +main.asm(319): warning: Register r17 already defined by the .DEF directive [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(288): Including file 'div16u.asm' +main.asm(294): Including file 'div16u.asm' +main.asm(295): Including file 'div8u.asm' +main.asm(296): Including file 'mpy16u.asm' ; @@ -801,14 +833,17 @@ main.asm(288): Including file 'div16u.asm' ; **** СТАНДАРТНЫЕ ПАРАМЕТРЫ *********************************** ; Отдельно задается целая и дробная часть в точности до десятых - ; Например: 30.5 градусов - .EQU DEFAULT_SETTING_INT = 0 - .EQU DEFAULT_SETTING_F = 5 // 0.5 - - .EQU DEFAULT_SETTING_HYST = 15 // 1.5 + .EQU DEFAULT_TEMP = 150 ; 30.5 градусов + .EQU DEFAULT_HYST = 8 ; 1.2 градуса гистерезис .EQU HEAT_MODE = 1 .EQU COOLING_MODE = 0 + .EQU DEFAULT_MODE = HEAT_MODE + + + .EQU DEFAULT_SETTING_TEMP_L = LOW(DEFAULT_TEMP) + .EQU DEFAULT_SETTING_TEMP_H = HIGH(DEFAULT_TEMP) + .EQU DEFAULT_SETTING_HYST = DEFAULT_HYST .INCLUDE "macros.asm" ldi @0, @2 @@ -863,11 +898,13 @@ main.asm(288): Including file 'div16u.asm' 000069 TEMP_L: .BYTE 1 ; Младший байт температуры 00006a TEMP_H: .BYTE 1 ; Старший байт температуры 00006b TEMP_F: .BYTE 1 ; Дробная часть -00006c SETTING_INT: .BYTE 1 ; Уставка: целая часть -00006d SETTING_F: .BYTE 1 ; Уставка: дробная часть +00006c SETTING_TEMP_H: .BYTE 1 ; Уставка температуры (старший байт) +00006d SETTING_TEMP_L: .BYTE 1 ; Уставка температуры (младший байт) 00006e SETTING_HYST: .BYTE 1 ; Гистерезис: отклонение от уставки 00006f SETTING_MODE: .BYTE 1 ; Режим работы: '1' - нагрев; '0' - 'охлаждение' 000070 DEVICE_FAMILY_CODE: .BYTE 1 ; Должно быть 0x10 для DS18B20 +000071 SRAM_TEMP_2: .BYTE 1 +000072 SRAM_TEMP_3: .BYTE 1 ;// @@ -958,8 +995,8 @@ main.asm(288): Including file 'div16u.asm' 00003d 9a92 sbi PORTD, DIGIT_1_PIN 00003e c001 rjmp PC+2 00003f 9892 cbi PORTD, DIGIT_1_PIN -000040 d1b0 rcall DISPLAY_DECODER -000041 d12b rcall USI_TRANSMIT +000040 d1f0 rcall DISPLAY_DECODER +000041 d16b rcall USI_TRANSMIT _indicate_2: 000042 3041 cpi r20, 1 @@ -976,8 +1013,8 @@ main.asm(288): Including file 'div16u.asm' 00004e c001 rjmp PC+2 00004f 9893 cbi PORTD, DIGIT_2_PIN 000050 9100 0064 lds TEMP_REG_A, DIGITS+1 -000052 d19e rcall DISPLAY_DECODER -000053 d119 rcall USI_TRANSMIT +000052 d1de rcall DISPLAY_DECODER +000053 d159 rcall USI_TRANSMIT _indicate_3: 000054 3042 cpi r20, 2 @@ -988,12 +1025,12 @@ main.asm(288): Including file 'div16u.asm' 000058 9895 cbi PORTD, DIGIT_4_PIN 000059 9a94 sbi PORTD, DIGIT_3_PIN 00005a 9100 0063 lds TEMP_REG_A, DIGITS -00005c d194 rcall DISPLAY_DECODER +00005c d1d4 rcall DISPLAY_DECODER ; зажигаем точку 00005d 2d00 mov r16, r0 00005e 770f cbr r16, (1<<7) 00005f 2e00 mov r0, r16 -000060 d10c rcall USI_TRANSMIT +000060 d14c rcall USI_TRANSMIT _indicate_4: 000061 3043 cpi r20, 3 @@ -1004,8 +1041,8 @@ main.asm(288): Including file 'div16u.asm' 000065 9894 cbi PORTD, DIGIT_3_PIN 000066 9a95 sbi PORTD, DIGIT_4_PIN 000067 9100 006b lds TEMP_REG_A, TEMP_F -000069 d187 rcall DISPLAY_DECODER -00006a d102 rcall USI_TRANSMIT +000069 d1c7 rcall DISPLAY_DECODER +00006a d142 rcall USI_TRANSMIT _indicate_exit: 00006b 9543 inc r20 @@ -1062,14 +1099,18 @@ main.asm(288): Including file 'div16u.asm' 000089 e000 ldi r16, 0x00 00008a 9300 0060 sts MCU_STATE, r16 ; переводим МК сразу в режим измерения температуры -00008c e000 ldi r16, DEFAULT_SETTING_INT -00008d 9300 006c sts SETTING_INT, r16 -00008f e005 ldi r16, DEFAULT_SETTING_F -000090 9300 006d sts SETTING_F, r16 -000092 e00f ldi r16, DEFAULT_SETTING_HYST -000093 9300 006e sts SETTING_HYST, r16 + ; настройка параметров +00008c e906 ldi r16, DEFAULT_SETTING_TEMP_L +00008d 9300 006d sts SETTING_TEMP_L, r16 ; уставка LOW + +00008f e000 ldi r16, DEFAULT_SETTING_TEMP_H +000090 9300 006c sts SETTING_TEMP_H, r16 ; уставка HIGH + +000092 e008 ldi r16, DEFAULT_SETTING_HYST +000093 9300 006e sts SETTING_HYST, r16 ; гистерезис + 000095 e001 ldi r16, DEFAULT_SETTING_MODE -000096 9300 006f sts SETTING_MODE, r16 +000096 9300 006f sts SETTING_MODE, r16 ; режим работы 000098 2700 clr r16 000099 9300 0069 sts TEMP_L, r16 @@ -1079,7 +1120,7 @@ main.asm(288): Including file 'div16u.asm' ; **** СТАРТУЕМ ************************************************ -0000a0 d06e rcall RD_F_CODE ; проверяем что датчик есть на шине +0000a0 d0ae rcall RD_F_CODE ; проверяем что датчик есть на шине 0000a1 9100 0070 lds r16, DEVICE_FAMILY_CODE 0000a3 3208 cpi r16, 0x28 ; код семейства для DS18B20 = 0x28 @@ -1089,10 +1130,10 @@ main.asm(288): Including file 'div16u.asm' ERR_FAMILY_CODE: 0000a6 e012 ldi r17, MCU_STATE_ERROR 0000a7 9310 0060 sts MCU_STATE, r17 -0000a9 d156 rcall BEEP_LONG +0000a9 d196 rcall BEEP_LONG 0000aa c001 rjmp PC+2 START_PROGRAM: -0000ab d150 rcall BEEP_SHORT +0000ab d190 rcall BEEP_SHORT 0000ac e080 0000ad e090 display_load 0 @@ -1109,17 +1150,17 @@ main.asm(288): Including file 'div16u.asm' 0000b0 3000 cpi r16, MCU_STATE_DEFAULT 0000b1 f431 brne _STATE_PROGRAM 0000b2 9896 cbi LED_ERR_PORT, LED_ERR_PIN -0000b3 d123 rcall DISPLAY_UPD_DIGITS -0000b4 d047 rcall TEMP_UPD +0000b3 d163 rcall DISPLAY_UPD_DIGITS +0000b4 d087 rcall TEMP_UPD 0000b5 e001 0000b6 bf09 outi r16, TIMSK, (1<= TOP +00012f c003 rjmp _COMPARSION_EXIT _HEATING_ON: -0000ee 9a90 relay_on -0000ef c004 rjmp _COMPARSION_EXIT +000130 9a90 relay_on +000131 c001 rjmp _COMPARSION_EXIT _HEATING_OFF: -0000f0 1704 cp r16, r20 -0000f1 f40c brge PC+2 ; TEMP >= MAX -0000f2 c001 rjmp _COMPARSION_EXIT -0000f3 9890 relay_off +000132 9890 relay_off _COMPARSION_EXIT: -0000f4 916f pop r22 -0000f5 915f pop r21 -0000f6 914f pop r20 -0000f7 913f pop r19 -0000f8 912f pop r18 -0000f9 911f pop r17 -0000fa 910f pop r16 -0000fb 9508 ret +000133 917f pop r23 +000134 916f pop r22 +000135 915f pop r21 +000136 914f pop r20 +000137 913f pop r19 +000138 912f pop r18 +000139 911f pop r17 +00013a 910f pop r16 +00013b 9508 ret // TEMP_UPD: -0000fc 931f push r17 -0000fd d065 rcall TEMP_CONV -0000fe e05c -0000ff e334 -000100 ef4d -000101 d119 DELAY24 500000 -000102 e05c -000103 e334 -000104 ef4d -000105 d115 DELAY24 500000 -000106 d012 rcall TEMP_RD +00013c 931f push r17 +00013d d065 rcall TEMP_CONV +00013e e05c +00013f e334 +000140 ef4d +000141 d119 DELAY24 500000 +000142 e05c +000143 e334 +000144 ef4d +000145 d115 DELAY24 500000 +000146 d012 rcall TEMP_RD ; обновляем данные в ячейках -000107 9110 0069 lds r17, TEMP_L -000109 2f81 mov DISP_NUM_L, r17 -00010a 9110 006a lds r17, TEMP_H -00010c 2f91 mov DISP_NUM_H, r17 -00010d 911f pop r17 -00010e 9508 ret +000147 9110 0069 lds r17, TEMP_L +000149 2f81 mov DISP_NUM_L, r17 +00014a 9110 006a lds r17, TEMP_H +00014c 2f91 mov DISP_NUM_H, r17 +00014d 911f pop r17 +00014e 9508 ret // // RD_F_CODE: -00010f 930f push r16 +00014f 930f push r16 -000110 d076 rcall OW_PRESENCE -000111 e303 ldi r16, DS18B20_CMD_READROM -000112 2e80 mov OW_CMD_r, r16 -000113 d088 rcall OW_SEND_BYTE +000150 d076 rcall OW_PRESENCE +000151 e303 ldi r16, DS18B20_CMD_READROM +000152 2e80 mov OW_CMD_r, r16 +000153 d088 rcall OW_SEND_BYTE -000114 e7a0 ldi XL, LOW(DEVICE_FAMILY_CODE) -000115 e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) -000116 d0a6 rcall OW_RD_BYTE +000154 e7a0 ldi XL, LOW(DEVICE_FAMILY_CODE) +000155 e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) +000156 d0a6 rcall OW_RD_BYTE -000117 910f pop r16 -000118 9508 ret// +000157 910f pop r16 +000158 9508 ret// // TEMP_RD: -000119 930f push r16 -00011a 931f push r17 -00011b 932f push r18 -00011c 933f push r19 -00011d 934f push r20 +000159 930f push r16 +00015a 931f push r17 +00015b 932f push r18 +00015c 933f push r19 +00015d 934f push r20 ; cli -00011e d068 rcall OW_PRESENCE -00011f ec0c ldi r16, DS18B20_CMD_SKIPROM -000120 2e80 mov OW_CMD_r, r16 -000121 d07a rcall OW_SEND_BYTE +00015e d068 rcall OW_PRESENCE +00015f ec0c ldi r16, DS18B20_CMD_SKIPROM +000160 2e80 mov OW_CMD_r, r16 +000161 d07a rcall OW_SEND_BYTE -000122 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD -000123 2e80 mov OW_CMD_r, r16 -000124 d077 rcall OW_SEND_BYTE +000162 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD +000163 2e80 mov OW_CMD_r, r16 +000164 d077 rcall OW_SEND_BYTE -000125 e6a9 ldi XL, LOW(TEMP_L) -000126 e0b0 ldi XH, HIGH(TEMP_L) -000127 d095 rcall OW_RD_BYTE +000165 e6a9 ldi XL, LOW(TEMP_L) +000166 e0b0 ldi XH, HIGH(TEMP_L) +000167 d095 rcall OW_RD_BYTE -000128 e6aa ldi XL, LOW(TEMP_H) -000129 e0b0 ldi XH, HIGH(TEMP_H) -00012a d092 rcall OW_RD_BYTE +000168 e6aa ldi XL, LOW(TEMP_H) +000169 e0b0 ldi XH, HIGH(TEMP_H) +00016a d092 rcall OW_RD_BYTE -00012b 9110 0069 lds r17, TEMP_L -00012d 9120 006a lds r18, TEMP_H +00016b 9110 0069 lds r17, TEMP_L +00016d 9120 006a lds r18, TEMP_H -00012f 932f push r18 -000130 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) -000131 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой -000132 f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число -000133 94e8 clt -000134 c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) +00016f 932f push r18 +000170 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) +000171 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой +000172 f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число +000173 94e8 clt +000174 c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) _TEMP_RD_TO_UNSIGNED: -000135 912f pop r18 -000136 9468 set -000137 9510 com r17 -000138 9520 com r18 -000139 e031 ldi r19, 1 -00013a 0f13 add r17, r19 -00013b e030 ldi r19, 0 -00013c 1f23 adc r18, r19 -00013d c001 rjmp PC+2 +000175 912f pop r18 +000176 9468 set +000177 9510 com r17 +000178 9520 com r18 +000179 e031 ldi r19, 1 +00017a 0f13 add r17, r19 +00017b e030 ldi r19, 0 +00017c 1f23 adc r18, r19 +00017d c001 rjmp PC+2 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) -00013e 912f pop r18 -00013f 9526 lsr r18 -000140 9517 ror r17 -000141 9526 lsr r18 -000142 9517 ror r17 -000143 9526 lsr r18 -000144 9517 ror r17 -000145 9526 lsr r18 -000146 9517 ror r17 +00017e 912f pop r18 +00017f 9526 lsr r18 +000180 9517 ror r17 +000181 9526 lsr r18 +000182 9517 ror r17 +000183 9526 lsr r18 +000184 9517 ror r17 +000185 9526 lsr r18 +000186 9517 ror r17 _TEMP_RD_END: -000147 9130 0069 lds r19, TEMP_L -000149 f40e brtc PC+2 -00014a 9531 neg r19 ; переводим в беззнаковое число если минус +000187 9130 0069 lds r19, TEMP_L +000189 f40e brtc PC+2 +00018a 9531 neg r19 ; переводим в беззнаковое число если минус ; далее происходит такое для получения дробной части: ; ((n<<3) + (n<<1))>>4 или (n*10)/16 -00014b 2f43 mov r20, r19 -00014c 703f andi r19, 0x0f -00014d 2f43 mov r20, r19 -00014e 0f33 lsl r19 -00014f 0f33 lsl r19 -000150 0f33 lsl r19 +00018b 2f43 mov r20, r19 +00018c 703f andi r19, 0x0f +00018d 2f43 mov r20, r19 +00018e 0f33 lsl r19 +00018f 0f33 lsl r19 +000190 0f33 lsl r19 -000151 0f44 lsl r20 +000191 0f44 lsl r20 -000152 0f34 add r19, r20 +000192 0f34 add r19, r20 -000153 9536 lsr r19 -000154 9536 lsr r19 -000155 9536 lsr r19 -000156 9536 lsr r19 +000193 9536 lsr r19 +000194 9536 lsr r19 +000195 9536 lsr r19 +000196 9536 lsr r19 ; записываем данные -000157 9310 0069 sts TEMP_L, r17 -000159 9320 006a sts TEMP_H, r18 -00015b 9330 006b sts TEMP_F, r19 +000197 9310 0069 sts TEMP_L, r17 +000199 9320 006a sts TEMP_H, r18 +00019b 9330 006b sts TEMP_F, r19 ; sei -00015d 914f pop r20 -00015e 913f pop r19 -00015f 912f pop r18 -000160 911f pop r17 -000161 910f pop r16 -000162 9508 ret +00019d 914f pop r20 +00019e 913f pop r19 +00019f 912f pop r18 +0001a0 911f pop r17 +0001a1 910f pop r16 +0001a2 9508 ret ; TEMP_CONV: -000163 930f push r16 +0001a3 930f push r16 ; cli -000164 d022 rcall OW_PRESENCE -000165 ec0c ldi r16, DS18B20_CMD_SKIPROM -000166 2e80 mov OW_CMD_r, r16 -000167 d034 rcall OW_SEND_BYTE +0001a4 d022 rcall OW_PRESENCE +0001a5 ec0c ldi r16, DS18B20_CMD_SKIPROM +0001a6 2e80 mov OW_CMD_r, r16 +0001a7 d034 rcall OW_SEND_BYTE -000168 e404 ldi r16, DS18B20_CMD_CONVERTTEMP -000169 2e80 mov OW_CMD_r, r16 -00016a d031 rcall OW_SEND_BYTE +0001a8 e404 ldi r16, DS18B20_CMD_CONVERTTEMP +0001a9 2e80 mov OW_CMD_r, r16 +0001aa d031 rcall OW_SEND_BYTE ; sei -00016b 910f pop r16 -00016c 9508 ret +0001ab 910f pop r16 +0001ac 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: -00016d 930f push r16 -00016e b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. +0001ad 930f push r16 +0001ae b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) -00016f e400 ldi TEMP_REG_A, (1< USI Clock Source Select ; USICLK <--------------> USI Clock Strobe ; USITC <--------------> USI Toggle Clock (Enable clock generation) -000171 e10b ldi TEMP_REG_A, (1< +0001b5 9ac0 sbi PORTB, USI_LATCH_PIN +0001b6 98c0 cbi PORTB, USI_LATCH_PIN +0001b7 910f pop r16 +0001b8 9508 ret// // SW_CHECK_PROCESS: -000179 930f push r16 -00017a d08c rcall DEBOUNCE_SW -00017b 9bb2 sbis SW_PIN, SW_PLUS_PIN -00017c 9601 adiw DISP_NUM_L, 1 +0001b9 930f push r16 +0001ba d08c rcall DEBOUNCE_SW +0001bb 9bb2 sbis SW_PIN, SW_PLUS_PIN +0001bc 9601 adiw DISP_NUM_L, 1 -00017d 9bb3 sbis SW_PIN, SW_MINUS_PIN -00017e 9701 sbiw DISP_NUM_L, 1 +0001bd 9bb3 sbis SW_PIN, SW_MINUS_PIN +0001be 9701 sbiw DISP_NUM_L, 1 -00017f 9bb4 sbis SW_PIN, SW_SET_PIN -000180 c001 rjmp _INTO_DEFAULT_STATE -000181 c003 rjmp _SW_CHECK_PROCESS_END +0001bf 9bb4 sbis SW_PIN, SW_SET_PIN +0001c0 c001 rjmp _INTO_DEFAULT_STATE +0001c1 c003 rjmp _SW_CHECK_PROCESS_END _INTO_DEFAULT_STATE: -000182 e000 ldi r16, MCU_STATE_DEFAULT -000183 9300 0060 sts MCU_STATE, r16 +0001c2 e000 ldi r16, MCU_STATE_DEFAULT +0001c3 9300 0060 sts MCU_STATE, r16 _SW_CHECK_PROCESS_END: -000185 910f pop r16 -000186 9508 ret +0001c5 910f pop r16 +0001c6 9508 ret // // // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: -000187 94f8 cli -000188 9ab9 ow_pull -000189 e033 -00018a eb4e -00018b d08b DELAY16 480 -00018c 98b9 ow_release -00018d e030 -00018e e84a -00018f d087 DELAY16 70 -000190 d005 rcall OW_CHECK_PRESENCE -000191 e033 -000192 e342 -000193 d083 DELAY16 410 -000194 9478 sei -000195 9508 ret +0001c7 94f8 cli +0001c8 9ab9 ow_pull +0001c9 e033 +0001ca eb4e +0001cb d08b DELAY16 480 +0001cc 98b9 ow_release +0001cd e030 +0001ce e84a +0001cf d087 DELAY16 70 +0001d0 d005 rcall OW_CHECK_PRESENCE +0001d1 e033 +0001d2 e342 +0001d3 d083 DELAY16 410 +0001d4 9478 sei +0001d5 9508 ret // // @@ -1465,85 +1649,85 @@ main.asm(288): Including file 'div16u.asm' ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: -000196 9bb1 sbis OW_PIN, OW_LINE -000197 6071 sbr OWFR, (1< // OW_SEND_BYTE: -00019c 930f push r16 -00019d 931f push r17 -00019e 2d08 mov r16, OW_CMD_r -00019f e018 ldi r17, 8 +0001dc 930f push r16 +0001dd 931f push r17 +0001de 2d08 mov r16, OW_CMD_r +0001df e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: -0001a0 9506 lsr r16 -0001a1 f408 brcc _OW_SEND_0 -0001a2 f058 brcs _OW_SEND_1 +0001e0 9506 lsr r16 +0001e1 f408 brcc _OW_SEND_0 +0001e2 f058 brcs _OW_SEND_1 _OW_SEND_0: -0001a3 94f8 cli -0001a4 9ab9 ow_pull -0001a5 e030 -0001a6 e746 -0001a7 d06f DELAY16 60 -0001a8 98b9 ow_release -0001a9 e030 -0001aa e142 -0001ab d06b DELAY16 10 -0001ac 9478 sei -0001ad c00a rjmp _OW_SEND_BYTE_END +0001e3 94f8 cli +0001e4 9ab9 ow_pull +0001e5 e030 +0001e6 e746 +0001e7 d06f DELAY16 60 +0001e8 98b9 ow_release +0001e9 e030 +0001ea e142 +0001eb d06b DELAY16 10 +0001ec 9478 sei +0001ed c00a rjmp _OW_SEND_BYTE_END _OW_SEND_1: -0001ae 94f8 cli -0001af 9ab9 ow_pull -0001b0 e030 -0001b1 e04a -0001b2 d064 DELAY16 6 -0001b3 98b9 ow_release -0001b4 e030 -0001b5 e74e -0001b6 d060 DELAY16 64 -0001b7 9478 sei +0001ee 94f8 cli +0001ef 9ab9 ow_pull +0001f0 e030 +0001f1 e04a +0001f2 d064 DELAY16 6 +0001f3 98b9 ow_release +0001f4 e030 +0001f5 e74e +0001f6 d060 DELAY16 64 +0001f7 9478 sei _OW_SEND_BYTE_END: -0001b8 951a dec r17 -0001b9 f731 brne _OW_SEND_BYTE_LOOP -0001ba 911f pop r17 -0001bb 910f pop r16 -0001bc 9508 ret +0001f8 951a dec r17 +0001f9 f731 brne _OW_SEND_BYTE_LOOP +0001fa 911f pop r17 +0001fb 910f pop r16 +0001fc 9508 ret // // OW_RD_BYTE: -0001bd 930f push r16 -0001be 931f push r17 -0001bf 2700 clr r16 -0001c0 e018 ldi r17, 8 -0001c1 94f8 cli +0001fd 930f push r16 +0001fe 931f push r17 +0001ff 2700 clr r16 +000200 e018 ldi r17, 8 +000201 94f8 cli _OW_RD_BYTE_LP: -0001c2 9506 lsr r16 -0001c3 9ab9 ow_pull -0001c4 e030 -0001c5 e04a -0001c6 d050 DELAY16 6 -0001c7 98b9 ow_release -0001c8 e030 -0001c9 e140 -0001ca d04c DELAY16 9 -0001cb 99b1 sbic OW_PIN, OW_LINE -0001cc 6800 sbr r16, (1<<7) -0001cd e030 -0001ce e64c -0001cf d047 DELAY16 55 -0001d0 951a dec r17 -0001d1 f781 brne _OW_RD_BYTE_LP -0001d2 930c st X, r16 -0001d3 9478 sei -0001d4 911f pop r17 -0001d5 910f pop r16 -0001d6 9508 ret +000202 9506 lsr r16 +000203 9ab9 ow_pull +000204 e030 +000205 e04a +000206 d050 DELAY16 6 +000207 98b9 ow_release +000208 e030 +000209 e140 +00020a d04c DELAY16 9 +00020b 99b1 sbic OW_PIN, OW_LINE +00020c 6800 sbr r16, (1<<7) +00020d e030 +00020e e64c +00020f d047 DELAY16 55 +000210 951a dec r17 +000211 f781 brne _OW_RD_BYTE_LP +000212 930c st X, r16 +000213 9478 sei +000214 911f pop r17 +000215 910f pop r16 +000216 9508 ret // @@ -1554,156 +1738,156 @@ main.asm(288): Including file 'div16u.asm' ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: -0001d7 94f8 cli -0001d8 935f push r21 -0001d9 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный +000217 94f8 cli +000218 935f push r21 +000219 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный ; инициализация указателя (за каждый проход цикла будет инкрементироваться) -0001da e6a3 ldi XL, LOW(DIGITS) -0001db e0b0 ldi XH, HIGH(DIGITS) +00021a e6a3 ldi XL, LOW(DIGITS) +00021b e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого -0001dc 9380 0061 sts dividend, DISP_NUM_L -0001de 9390 0062 sts dividend+1, DISP_NUM_H +00021c 9380 0061 sts dividend, DISP_NUM_L +00021e 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры -0001e0 9100 0061 lds dd16uL, dividend -0001e2 9110 0062 lds dd16uH, dividend+1 -0001e4 e02a ldi dv16uL, LOW(divisor) -0001e5 e030 ldi dv16uH, HIGH(divisor) +000220 9100 0061 lds dd16uL, dividend +000222 9110 0062 lds dd16uH, dividend+1 +000224 e02a ldi dv16uL, LOW(divisor) +000225 e030 ldi dv16uH, HIGH(divisor) -0001e6 deda rcall div16u ; делим +000226 de9a rcall div16u ; делим -0001e7 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его +000227 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое -0001e8 9300 0061 sts dividend, dres16uL -0001ea 9310 0062 sts dividend+1, dres16uH +000228 9300 0061 sts dividend, dres16uL +00022a 9310 0062 sts dividend+1, dres16uH -0001ec 955a dec r21 ; декрементируем счетчик цикла -0001ed f791 brne DIV_LOOP ; делим еще раз если не 0 -0001ee 915f pop r21 -0001ef 9478 sei -0001f0 9508 ret +00022c 955a dec r21 ; декрементируем счетчик цикла +00022d f791 brne DIV_LOOP ; делим еще раз если не 0 +00022e 915f pop r21 +00022f 9478 sei +000230 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: -0001f1 930f push r16 -0001f2 931f push r17 -0001f3 e6e0 ldi ZL, LOW(2*DISPLAY_SYMBOLS) -0001f4 e0f4 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) +000231 930f push r16 +000232 931f push r17 +000233 eee0 ldi ZL, LOW(2*DISPLAY_SYMBOLS) +000234 e0f4 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) -0001f5 2711 clr TEMP_REG_B -0001f6 0fe0 add ZL, TEMP_REG_A -0001f7 1ff1 adc ZH, TEMP_REG_B +000235 2711 clr TEMP_REG_B +000236 0fe0 add ZL, TEMP_REG_A +000237 1ff1 adc ZH, TEMP_REG_B -0001f8 9004 lpm r0, Z -0001f9 911f pop r17 -0001fa 910f pop r16 -0001fb 9508 ret// +000238 9004 lpm r0, Z +000239 911f pop r17 +00023a 910f pop r16 +00023b 9508 ret// // BEEP_SHORT: -0001fc 9ac5 sbi BUZZER_PORT, BUZZER_PIN -0001fd d022 rcall DELAY -0001fe 98c5 cbi BUZZER_PORT, BUZZER_PIN -0001ff 9508 ret +00023c 9ac5 sbi BUZZER_PORT, BUZZER_PIN +00023d d022 rcall DELAY +00023e 98c5 cbi BUZZER_PORT, BUZZER_PIN +00023f 9508 ret // // BEEP_LONG: -000200 9ac5 sbi BUZZER_PORT, BUZZER_PIN -000201 d01e rcall DELAY -000202 d01d rcall DELAY -000203 d01c rcall DELAY -000204 d01b rcall DELAY -000205 98c5 cbi BUZZER_PORT, BUZZER_PIN -000206 9508 ret// +000240 9ac5 sbi BUZZER_PORT, BUZZER_PIN +000241 d01e rcall DELAY +000242 d01d rcall DELAY +000243 d01c rcall DELAY +000244 d01b rcall DELAY +000245 98c5 cbi BUZZER_PORT, BUZZER_PIN +000246 9508 ret// // DEBOUNCE_SW: -000207 930f push r16 -000208 931f push r17 -000209 932f push r18 +000247 930f push r16 +000248 931f push r17 +000249 932f push r18 -00020a e02a ldi r18, 10 +00024a e02a ldi r18, 10 _loop_2: -00020b ef1f ldi r17, 255 +00024b ef1f ldi r17, 255 _loop_0: -00020c ef0f ldi r16, 255 +00024c ef0f ldi r16, 255 _dec_0: -00020d 950a dec r16 -00020e f7f1 brne _dec_0 +00024d 950a dec r16 +00024e f7f1 brne _dec_0 _loop_1: -00020f 951a dec r17 -000210 f7d9 brne _loop_0 +00024f 951a dec r17 +000250 f7d9 brne _loop_0 _loop_3: -000211 952a dec r18 -000212 f7c1 brne _loop_2 +000251 952a dec r18 +000252 f7c1 brne _loop_2 -000213 912f pop r18 -000214 911f pop r17 -000215 910f pop r16 -000216 9508 ret// +000253 912f pop r18 +000254 911f pop r17 +000255 910f pop r16 +000256 9508 ret// // DELAY_LOOP_16: -000217 5041 subi DELAY_8_r, 1 -000218 4030 sbci DELAY_16_r, 0 -000219 f7e8 brcc DELAY_LOOP_16 -00021a 9508 ret +000257 5041 subi DELAY_8_r, 1 +000258 4030 sbci DELAY_16_r, 0 +000259 f7e8 brcc DELAY_LOOP_16 +00025a 9508 ret // // DELAY_LOOP_24: -00021b 5041 subi DELAY_8_r, 1 -00021c 4030 sbci DELAY_16_r, 0 -00021d 4050 sbci DELAY_24_r, 0 -00021e f7e0 brcc DELAY_LOOP_24 -00021f 9508 ret +00025b 5041 subi DELAY_8_r, 1 +00025c 4030 sbci DELAY_16_r, 0 +00025d 4050 sbci DELAY_24_r, 0 +00025e f7e0 brcc DELAY_LOOP_24 +00025f 9508 ret // // DELAY: -000220 930f push r16 -000221 931f push r17 -000222 932f push r18 +000260 930f push r16 +000261 931f push r17 +000262 932f push r18 -000223 e026 ldi r18, 6 +000263 e026 ldi r18, 6 _DELAY_0: -000224 ef0f ldi r16, 255 +000264 ef0f ldi r16, 255 _DELAY_1: -000225 ef1f ldi r17, 255 +000265 ef1f ldi r17, 255 _DELAY_2: -000226 951a dec r17 -000227 f7f1 brne _DELAY_2 +000266 951a dec r17 +000267 f7f1 brne _DELAY_2 -000228 950a dec r16 -000229 f7d9 brne _DELAY_1 -00022a 952a dec r18 -00022b f7c1 brne _DELAY_0 +000268 950a dec r16 +000269 f7d9 brne _DELAY_1 +00026a 952a dec r18 +00026b f7c1 brne _DELAY_0 -00022c 912f pop r18 -00022d 911f pop r17 -00022e 910f pop r16 -00022f 9508 ret // +00026c 912f pop r18 +00026d 911f pop r17 +00026e 910f pop r16 +00026f 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA -000230 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 -000231 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 -000232 9299 .DB 0b10011001, 0b10010010 ; 4, 5 -000233 f882 .DB 0b10000010, 0b11111000 ; 6, 7 -000234 9080 .DB 0b10000000, 0b10010000 ; 8, 9 -000235 bf9c .DB 0b10011100, 0b10111111 ; °, -// +000270 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 +000271 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 +000272 9299 .DB 0b10011001, 0b10010010 ; 4, 5 +000273 f882 .DB 0b10000010, 0b11111000 ; 6, 7 +000274 9080 .DB 0b10000000, 0b10010000 ; 8, 9 +000275 bf9c .DB 0b10011100, 0b10111111 ; °, -// // @@ -1730,38 +1914,38 @@ 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 : 6 r9 : 0 r10: 0 r11: 0 r12: 0 -r13: 0 r14: 5 r15: 5 r16: 114 r17: 50 r18: 33 r19: 45 r20: 38 -r21: 15 r22: 2 r23: 2 r24: 5 r25: 3 r26: 4 r27: 4 r28: 0 +r5 : 0 r6 : 0 r7 : 0 r8 : 6 r9 : 0 r10: 2 r11: 2 r12: 2 +r13: 2 r14: 5 r15: 10 r16: 120 r17: 60 r18: 40 r19: 49 r20: 48 +r21: 23 r22: 7 r23: 8 r24: 5 r25: 3 r26: 4 r27: 4 r28: 0 r29: 0 r30: 2 r31: 2 -Registers used: 21 out of 35 (60.0%) +Registers used: 25 out of 35 (71.4%) "ATtiny2313A" instruction use summary: -.lds : 0 .sts : 0 adc : 3 add : 4 adiw : 1 and : 0 +.lds : 0 .sts : 0 adc : 6 add : 8 adiw : 1 and : 0 andi : 1 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0 -brcc : 4 brcs : 1 break : 0 breq : 4 brge : 3 brhc : 0 +brcc : 6 brcs : 1 break : 0 breq : 4 brge : 3 brhc : 0 brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0 -brne : 19 brpl : 0 brsh : 0 brtc : 1 brts : 2 brvc : 0 -brvs : 0 bset : 0 bst : 0 cbi : 24 cbr : 3 clc : 1 -clh : 0 cli : 5 cln : 0 clr : 6 cls : 0 clt : 1 -clv : 0 clz : 0 com : 2 cp : 2 cpc : 0 cpi : 11 -cpse : 0 dec : 10 eor : 0 icall : 0 ijmp : 0 in : 2 -inc : 1 ld : 0 ldd : 0 ldi : 81 lds : 21 lpm : 2 -lsl : 4 lsr : 10 mov : 12 movw : 0 neg : 2 nop : 0 -or : 1 ori : 0 out : 15 pop : 40 push : 39 rcall : 49 -ret : 20 reti : 3 rjmp : 26 rol : 4 ror : 4 sbc : 1 -sbci : 3 sbi : 13 sbic : 3 sbis : 5 sbiw : 1 sbr : 2 -sbrc : 0 sbrs : 0 sec : 1 seh : 0 sei : 5 sen : 0 +brne : 21 brpl : 0 brsh : 0 brtc : 1 brts : 2 brvc : 0 +brvs : 0 bset : 0 bst : 0 cbi : 24 cbr : 3 clc : 2 +clh : 0 cli : 5 cln : 0 clr : 11 cls : 0 clt : 1 +clv : 0 clz : 0 com : 4 cp : 2 cpc : 2 cpi : 11 +cpse : 0 dec : 12 eor : 0 icall : 0 ijmp : 0 in : 2 +inc : 1 ld : 0 ldd : 0 ldi : 83 lds : 24 lpm : 2 +lsl : 4 lsr : 11 mov : 18 movw : 0 neg : 1 nop : 0 +or : 1 ori : 0 out : 15 pop : 43 push : 42 rcall : 50 +ret : 22 reti : 3 rjmp : 26 rol : 6 ror : 9 sbc : 2 +sbci : 4 sbi : 13 sbic : 3 sbis : 5 sbiw : 1 sbr : 2 +sbrc : 0 sbrs : 0 sec : 2 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 : 21 sub : 2 subi : 2 +spm : 0 st : 2 std : 0 sts : 23 sub : 5 subi : 3 swap : 0 tst : 2 wdr : 0 -Instructions used: 55 out of 105 (52.4%) +Instructions used: 56 out of 105 (53.3%) "ATtiny2313A" memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- -[.cseg] 0x000000 0x00046c 1098 12 1110 2048 54.2% -[.dseg] 0x000060 0x000071 0 17 17 128 13.3% +[.cseg] 0x000000 0x0004ec 1226 12 1238 2048 60.4% +[.dseg] 0x000060 0x000073 0 19 19 128 14.8% [.eseg] 0x000000 0x000000 0 0 0 128 0.0% -Assembly complete, 0 errors, 6 warnings +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 5b2bece..17b4f65 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 Sun Jun 25 15:01:25 2023 +AVRASM ver. 2.2.7 main.asm Sun Jun 25 23:20:09 2023 EQU SIGNATURE_000 0000001e @@ -526,11 +526,14 @@ EQU UART_TX_PIN 00000001 EQU MCU_STATE_DEFAULT 00000000 EQU MCU_STATE_PROGRAM 00000001 EQU MCU_STATE_ERROR 00000002 -EQU DEFAULT_SETTING_INT 00000000 -EQU DEFAULT_SETTING_F 00000005 -EQU DEFAULT_SETTING_HYST 0000000f +EQU DEFAULT_TEMP 00000096 +EQU DEFAULT_HYST 00000008 EQU HEAT_MODE 00000001 EQU COOLING_MODE 00000000 +EQU DEFAULT_MODE 00000001 +EQU DEFAULT_SETTING_TEMP_L 00000096 +EQU DEFAULT_SETTING_TEMP_H 00000000 +EQU DEFAULT_SETTING_HYST 00000008 EQU DEFAULT_SETTING_MODE 00000001 DSEG MCU_STATE 00000060 DSEG SRAM_TEMP_1 00000061 @@ -540,11 +543,13 @@ DSEG SW_FLAGS 00000068 DSEG TEMP_L 00000069 DSEG TEMP_H 0000006a DSEG TEMP_F 0000006b -DSEG SETTING_INT 0000006c -DSEG SETTING_F 0000006d +DSEG SETTING_TEMP_H 0000006c +DSEG SETTING_TEMP_L 0000006d DSEG SETTING_HYST 0000006e DSEG SETTING_MODE 0000006f DSEG DEVICE_FAMILY_CODE 00000070 +DSEG SRAM_TEMP_2 00000071 +DSEG SRAM_TEMP_3 00000072 CSEG RESET_vect 00000074 CSEG TIMER0_COMPA_vect 00000023 CSEG PCINT0_vect 0000000e @@ -553,25 +558,25 @@ CSEG _INTO_PROGRAM_STATE 0000001a CSEG _CLR_CURRENT_DIGIT 0000002d CSEG _indicate_1 00000030 CSEG _indicate_2 00000042 -CSEG DISPLAY_DECODER 000001f1 -CSEG USI_TRANSMIT 0000016d +CSEG DISPLAY_DECODER 00000231 +CSEG USI_TRANSMIT 000001ad CSEG _indicate_3 00000054 CSEG _indicate_4 00000061 CSEG _indicate_exit 0000006b CSEG MCU_INIT 00000076 -CSEG RD_F_CODE 0000010f +CSEG RD_F_CODE 0000014f CSEG ERR_FAMILY_CODE 000000a6 CSEG START_PROGRAM 000000ab -CSEG BEEP_LONG 00000200 -CSEG BEEP_SHORT 000001fc +CSEG BEEP_LONG 00000240 +CSEG BEEP_SHORT 0000023c CSEG LOOP 000000ae CSEG _STATE_DEFAULT 000000b0 CSEG _STATE_PROGRAM 000000b8 -CSEG DISPLAY_UPD_DIGITS 000001d7 -CSEG TEMP_UPD 000000fc -CSEG TEMP_COMPARSION 000000d4 +CSEG DISPLAY_UPD_DIGITS 00000217 +CSEG TEMP_UPD 0000013c +CSEG TEMP_COMPARSION 000000f1 CSEG _STATE_ERROR 000000bd -CSEG SW_CHECK_PROCESS 00000179 +CSEG SW_CHECK_PROCESS 000001b9 DEF drem16uL r14 DEF drem16uH r15 DEF dres16uL r16 @@ -585,41 +590,70 @@ CSEG div16u 000000c1 CSEG d16u_1 000000c4 CSEG d16u_2 000000c9 CSEG d16u_3 000000d2 -CSEG _HEATING_MODE 000000eb -CSEG _COMPARSION_EXIT 000000f4 -CSEG _HEATING_ON 000000ee -CSEG _HEATING_OFF 000000f0 -CSEG TEMP_CONV 00000163 -CSEG DELAY_LOOP_24 0000021b -CSEG TEMP_RD 00000119 -CSEG OW_PRESENCE 00000187 -CSEG OW_SEND_BYTE 0000019c -CSEG OW_RD_BYTE 000001bd -CSEG _TEMP_RD_TO_UNSIGNED 00000135 -CSEG _TEMP_RD_CONTINUE 0000013e -CSEG _TEMP_RD_END 00000147 -CSEG _USI_TRANSMIT_LOOP 00000172 -CSEG DEBOUNCE_SW 00000207 -CSEG _INTO_DEFAULT_STATE 00000182 -CSEG _SW_CHECK_PROCESS_END 00000185 -CSEG DELAY_LOOP_16 00000217 -CSEG OW_CHECK_PRESENCE 00000196 -CSEG _EXIT 0000019b -CSEG _OW_SEND_BYTE_LOOP 000001a0 -CSEG _OW_SEND_0 000001a3 -CSEG _OW_SEND_1 000001ae -CSEG _OW_SEND_BYTE_END 000001b8 -CSEG _OW_RD_BYTE_LP 000001c2 +DEF drem8u r15 +DEF dres8u r16 +DEF dd8u r16 +DEF dv8u r17 +DEF dcnt8u r18 +CSEG div8u 000000d4 +CSEG d8u_1 000000d6 +CSEG d8u_2 000000da +CSEG d8u_3 000000e0 +DEF mc16uL r16 +DEF mc16uH r17 +DEF mp16uL r18 +DEF mp16uH r19 +DEF m16u0 r18 +DEF m16u1 r19 +DEF m16u2 r20 +DEF m16u3 r21 +DEF mcnt16u r22 +CSEG mpy16u 000000e2 +CSEG m16u_1 000000e7 +CSEG noad8 000000ea +DEF temp_r_l r16 +DEF temp_r_h r17 +DEF min_r_trhd_l r11 +DEF min_r_trhd_h r10 +DEF max_r_trhd_l r13 +DEF max_r_trhd_h r12 +CSEG _NEGATE_TEMP 00000121 +CSEG _CHECK_MODE 00000125 +CSEG _HEATING_MODE 00000129 +CSEG _HEATING_ON 00000130 +CSEG _HEATING_OFF 00000132 +CSEG _COMPARSION_EXIT 00000133 +CSEG TEMP_CONV 000001a3 +CSEG DELAY_LOOP_24 0000025b +CSEG TEMP_RD 00000159 +CSEG OW_PRESENCE 000001c7 +CSEG OW_SEND_BYTE 000001dc +CSEG OW_RD_BYTE 000001fd +CSEG _TEMP_RD_TO_UNSIGNED 00000175 +CSEG _TEMP_RD_CONTINUE 0000017e +CSEG _TEMP_RD_END 00000187 +CSEG _USI_TRANSMIT_LOOP 000001b2 +CSEG DEBOUNCE_SW 00000247 +CSEG _INTO_DEFAULT_STATE 000001c2 +CSEG _SW_CHECK_PROCESS_END 000001c5 +CSEG DELAY_LOOP_16 00000257 +CSEG OW_CHECK_PRESENCE 000001d6 +CSEG _EXIT 000001db +CSEG _OW_SEND_BYTE_LOOP 000001e0 +CSEG _OW_SEND_0 000001e3 +CSEG _OW_SEND_1 000001ee +CSEG _OW_SEND_BYTE_END 000001f8 +CSEG _OW_RD_BYTE_LP 00000202 EQU dividend 00000061 EQU divisor 0000000a -CSEG DIV_LOOP 000001e0 -CSEG DISPLAY_SYMBOLS 00000230 -CSEG DELAY 00000220 -CSEG _loop_2 0000020b -CSEG _loop_0 0000020c -CSEG _dec_0 0000020d -CSEG _loop_1 0000020f -CSEG _loop_3 00000211 -CSEG _DELAY_0 00000224 -CSEG _DELAY_1 00000225 -CSEG _DELAY_2 00000226 +CSEG DIV_LOOP 00000220 +CSEG DISPLAY_SYMBOLS 00000270 +CSEG DELAY 00000260 +CSEG _loop_2 0000024b +CSEG _loop_0 0000024c +CSEG _dec_0 0000024d +CSEG _loop_1 0000024f +CSEG _loop_3 00000251 +CSEG _DELAY_0 00000264 +CSEG _DELAY_1 00000265 +CSEG _DELAY_2 00000266 diff --git a/dist/default/production/attiny2313a_thermostat.X.production.obj b/dist/default/production/attiny2313a_thermostat.X.production.obj index 32d19ae..e212664 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 2de4587..c004449 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.tmp +++ b/dist/default/production/attiny2313a_thermostat.X.production.tmp @@ -12,6 +12,8 @@ definitions.asm macros.asm div16u.asm + div8u.asm + mpy16u.asm dist/default/production/attiny2313a_thermostat.X.production.obj @@ -32,77 +34,88 @@ main.asm29 main.asm30 main.asm31 - main.asm32 - main.asm33 + main.asm32 + main.asm33 main.asm34 main.asm35 main.asm36 - main.asm189 - main.asm94 - main.asm57 - <_PCINT0_vect_end>main.asm84 - <_INTO_PROGRAM_STATE>main.asm80 - <_CLR_CURRENT_DIGIT>main.asm106 - <_indicate_1>main.asm110 - <_indicate_2>main.asm130 - main.asm674 - main.asm487 - <_indicate_3>main.asm148 - <_indicate_4>main.asm164 - <_indicate_exit>main.asm176 - main.asm195 - main.asm359 - main.asm247 - main.asm252 - main.asm698 - main.asm690 - main.asm261 - <_STATE_DEFAULT>main.asm265 - <_STATE_PROGRAM>main.asm273 - main.asm633 - main.asm342 - main.asm290 - <_STATE_ERROR>main.asm279 - main.asm518 + main.asm37 + main.asm38 + main.asm191 + main.asm96 + main.asm59 + <_PCINT0_vect_end>main.asm86 + <_INTO_PROGRAM_STATE>main.asm82 + <_CLR_CURRENT_DIGIT>main.asm108 + <_indicate_1>main.asm112 + <_indicate_2>main.asm132 + main.asm740 + main.asm553 + <_indicate_3>main.asm150 + <_indicate_4>main.asm166 + <_indicate_exit>main.asm178 + main.asm197 + main.asm425 + main.asm253 + main.asm258 + main.asm764 + main.asm756 + main.asm267 + <_STATE_DEFAULT>main.asm271 + <_STATE_PROGRAM>main.asm279 + main.asm699 + main.asm408 + main.asm298 + <_STATE_ERROR>main.asm285 + main.asm584 div16u.asm32 div16u.asm36 div16u.asm42 div16u.asm52 - <_HEATING_MODE>main.asm319 - <_COMPARSION_EXIT>main.asm331 - <_HEATING_ON>main.asm323 - <_HEATING_OFF>main.asm326 - main.asm467 - main.asm742 - main.asm375 - main.asm542 - main.asm569 - main.asm602 - <_TEMP_RD_TO_UNSIGNED>main.asm410 - <_TEMP_RD_CONTINUE>main.asm421 - <_TEMP_RD_END>main.asm431 - <_USI_TRANSMIT_LOOP>main.asm505 - main.asm708 - <_INTO_DEFAULT_STATE>main.asm531 - <_SW_CHECK_PROCESS_END>main.asm534 - main.asm734 - main.asm558 - <_EXIT>main.asm564 - <_OW_SEND_BYTE_LOOP>main.asm574 - <_OW_SEND_0>main.asm578 - <_OW_SEND_1>main.asm586 - <_OW_SEND_BYTE_END>main.asm593 - <_OW_RD_BYTE_LP>main.asm608 - main.asm650 - main.asm776 - main.asm751 - <_loop_2>main.asm714 - <_loop_0>main.asm716 - <_dec_0>main.asm718 - <_loop_1>main.asm721 - <_loop_3>main.asm724 - <_DELAY_0>main.asm757 - <_DELAY_1>main.asm759 - <_DELAY_2>main.asm761 + div8u.asm26 + div8u.asm28 + div8u.asm32 + div8u.asm38 + mpy16u.asm31 + mpy16u.asm37 + mpy16u.asm40 + <_NEGATE_TEMP>main.asm364 + <_CHECK_MODE>main.asm370 + <_HEATING_MODE>main.asm381 + <_HEATING_ON>main.asm391 + <_HEATING_OFF>main.asm394 + <_COMPARSION_EXIT>main.asm396 + main.asm533 + main.asm808 + main.asm441 + main.asm608 + main.asm635 + main.asm668 + <_TEMP_RD_TO_UNSIGNED>main.asm476 + <_TEMP_RD_CONTINUE>main.asm487 + <_TEMP_RD_END>main.asm497 + <_USI_TRANSMIT_LOOP>main.asm571 + main.asm774 + <_INTO_DEFAULT_STATE>main.asm597 + <_SW_CHECK_PROCESS_END>main.asm600 + main.asm800 + main.asm624 + <_EXIT>main.asm630 + <_OW_SEND_BYTE_LOOP>main.asm640 + <_OW_SEND_0>main.asm644 + <_OW_SEND_1>main.asm652 + <_OW_SEND_BYTE_END>main.asm659 + <_OW_RD_BYTE_LP>main.asm674 + main.asm716 + main.asm842 + main.asm817 + <_loop_2>main.asm780 + <_loop_0>main.asm782 + <_dec_0>main.asm784 + <_loop_1>main.asm787 + <_loop_3>main.asm790 + <_DELAY_0>main.asm823 + <_DELAY_1>main.asm825 + <_DELAY_2>main.asm827 diff --git a/div8u.asm b/div8u.asm new file mode 100644 index 0000000..4620fd9 --- /dev/null +++ b/div8u.asm @@ -0,0 +1,39 @@ +;*************************************************************************** +;* +;* "div8u" - 8/8 Bit Unsigned Division +;* +;* This subroutine divides the two register variables "dd8u" (dividend) and +;* "dv8u" (divisor). The result is placed in "dres8u" and the remainder in +;* "drem8u". +;* +;* Number of words :14 +;* Number of cycles :97 +;* Low registers used :1 (drem8u) +;* High registers used :3 (dres8u/dd8u,dv8u,dcnt8u) +;* +;*************************************************************************** + +;***** Subroutine Register Variables + +.def drem8u =r15 ;remainder +.def dres8u =r16 ;result +.def dd8u =r16 ;dividend +.def dv8u =r17 ;divisor +.def dcnt8u =r18 ;loop counter + +;***** Code + +div8u: sub drem8u,drem8u ;clear remainder and carry + ldi dcnt8u,9 ;init loop counter +d8u_1: rol dd8u ;shift left dividend + dec dcnt8u ;decrement counter + brne d8u_2 ;if done + ret ; return +d8u_2: rol drem8u ;shift dividend into remainder + sub drem8u,dv8u ;remainder = remainder - divisor + brcc d8u_3 ;if result negative + add drem8u,dv8u ; restore remainder + clc ; clear carry to be shifted into result + rjmp d8u_1 ;else +d8u_3: sec ; set carry to be shifted into result + rjmp d8u_1 \ No newline at end of file diff --git a/div8u.hex b/div8u.hex new file mode 100644 index 0000000..ab56053 --- /dev/null +++ b/div8u.hex @@ -0,0 +1,4 @@ +:020000020000FC +:10000000FF1829E0001F2A9509F40895FF1CF11A32 +:0C00100018F4F10E8894F6CF0894F4CF99 +:00000001FF diff --git a/main.asm b/main.asm index 8fb3ff7..52308f6 100644 --- a/main.asm +++ b/main.asm @@ -29,11 +29,13 @@ SW_FLAGS: .BYTE 1 ; Состояние кнопок TEMP_L: .BYTE 1 ; Младший байт температуры TEMP_H: .BYTE 1 ; Старший байт температуры TEMP_F: .BYTE 1 ; Дробная часть -SETTING_INT: .BYTE 1 ; Уставка: целая часть -SETTING_F: .BYTE 1 ; Уставка: дробная часть +SETTING_TEMP_H: .BYTE 1 ; Уставка температуры (старший байт) +SETTING_TEMP_L: .BYTE 1 ; Уставка температуры (младший байт) SETTING_HYST: .BYTE 1 ; Гистерезис: отклонение от уставки SETTING_MODE: .BYTE 1 ; Режим работы: '1' - нагрев; '0' - 'охлаждение' DEVICE_FAMILY_CODE: .BYTE 1 ; Должно быть 0x10 для DS18B20 +SRAM_TEMP_2: .BYTE 1 +SRAM_TEMP_3: .BYTE 1 ;// @@ -220,14 +222,18 @@ MCU_INIT: ldi r16, 0x00 sts MCU_STATE, r16 ; переводим МК сразу в режим измерения температуры - ldi r16, DEFAULT_SETTING_INT - sts SETTING_INT, r16 - ldi r16, DEFAULT_SETTING_F - sts SETTING_F, r16 + ; настройка параметров + ldi r16, DEFAULT_SETTING_TEMP_L + sts SETTING_TEMP_L, r16 ; уставка LOW + + ldi r16, DEFAULT_SETTING_TEMP_H + sts SETTING_TEMP_H, r16 ; уставка HIGH + ldi r16, DEFAULT_SETTING_HYST - sts SETTING_HYST, r16 + sts SETTING_HYST, r16 ; гистерезис + ldi r16, DEFAULT_SETTING_MODE - sts SETTING_MODE, r16 + sts SETTING_MODE, r16 ; режим работы clr r16 sts TEMP_L, r16 @@ -286,6 +292,8 @@ _STATE_ERROR: ; **** ПОДПРОГРАММЫ ********************************************** .INCLUDE "div16u.asm" +.INCLUDE "div8u.asm" +.INCLUDE "mpy16u.asm" TEMP_COMPARSION: push r16 @@ -295,40 +303,94 @@ TEMP_COMPARSION: push r20 push r21 push r22 - - lds r16, TEMP_L - lds r17, TEMP_H // всегда 0? - lds r18, TEMP_F + push r23 +; +; lds dd8u, SETTING_HYST +; ldi dv8u, 10 +; rcall div8u +; +; ; определение нижнего и верхнего порого срабатывания ; lds r19, SETTING_INT -; lds r20, SETTING_F +; mov r20, r19 +; sub r19, dres8u ; MIN = SET - HYST_INT +; add r20, dres8u ; MAX = SET + HYST_INT +; + .DEF temp_r_l = r16 + .DEF temp_r_h = r17 + .DEF min_r_trhd_l = r11 + .DEF min_r_trhd_h = r10 + .DEF max_r_trhd_l = r13 + .DEF max_r_trhd_h = r12 + ; умножаем температуру на 10 + lds mc16uL, TEMP_L // r16 + lds mc16uH, TEMP_H // r17 + ldi mp16uL, LOW(10) + ldi mp16uH, HIGH(10) + rcall mpy16u + mov temp_r_l, m16u0 ; L + mov temp_r_h, m16u1 ; H + ; добавляем дробную часть + lds r18, TEMP_F + clr r19 + add temp_r_l, r18 + adc temp_r_h, r19 + sts SRAM_TEMP_2, temp_r_h + sts SRAM_TEMP_3, temp_r_l - ldi r19, 28 ; min - ldi r20, 32 ; max - lds r21, SETTING_MODE ; mode + ; определяем нижний и верхний пороги + lds r20, SETTING_TEMP_L + lds r21, SETTING_TEMP_H + lds r22, SETTING_HYST + push r20 + push r21 + clr r23 + sub r20, r22 + sbc r21, r23 + mov min_r_trhd_l, r20 + mov min_r_trhd_h, r21 + pop r21 + pop r20 + clr r23 + add r20, r22 + adc r21, r23 + mov max_r_trhd_l, r20 + mov max_r_trhd_h, r21 - brts PC+2 - rjmp PC+2 - neg r16 + ; определяем знак температуры + brts _NEGATE_TEMP + rjmp _CHECK_MODE + +_NEGATE_TEMP: + com temp_r_l + com temp_r_h + subi temp_r_l, low(-1) + sbci temp_r_h, high(-1) - tst r21 +_CHECK_MODE: + ; определяем режим работы + lds r20, SETTING_MODE + tst r20 brne _HEATING_MODE - rjmp _COMPARSION_EXIT - + _HEATING_MODE: - cp r19, r16 - brge _HEATING_ON ; TEMP <= MIN - rjmp _HEATING_OFF + ; проверяем нижний порог + cp min_r_trhd_l, temp_r_l + cpc min_r_trhd_h, temp_r_h + brge _HEATING_ON ; TEMP <= MIN + ; проверяем верхний порог + cp temp_r_l, max_r_trhd_l + cpc temp_r_h, max_r_trhd_h + brge _HEATING_OFF ; TEMP >= TOP + rjmp _COMPARSION_EXIT _HEATING_ON: relay_on rjmp _COMPARSION_EXIT _HEATING_OFF: - cp r16, r20 - brge PC+2 ; TEMP >= MAX - rjmp _COMPARSION_EXIT relay_off _COMPARSION_EXIT: + pop r23 pop r22 pop r21 pop r20 diff --git a/main.hex b/main.hex index 95b9f48..15b4cf8 100644 --- a/main.hex +++ b/main.hex @@ -7,68 +7,69 @@ :10004A000F931F935FB74091670045300CF403C0CC :10005A00442740936700403081F493989498959888 :10006A000EF002C00BE002C000916500002311F0FF -:10007A00929A01C09298B5D130D1413081F49298C8 +:10007A00929A01C09298BDD138D1413081F49298B8 :10008A00949895980091640030916500032B11F0C3 -:10009A00939A01C0939800916400A3D11ED1423073 -:1000AA0059F4929893989598949A0091630099D1EB -:1000BA00002D0F77002E11D1433041F49298939876 -:1000CA009498959A00916B008CD107D143954093EF +:10009A00939A01C0939800916400ABD126D1423063 +:1000AA0059F4929893989598949A00916300A1D1E3 +:1000BA00002D0F77002E19D1433041F4929893986E +:1000CA009498959A00916B0094D10FD143954093DF :1000DA0067005FBF1F910F915F914F9118950FEDC8 :1000EA000DBF0FE701BB01EE07BB0CE108BB02E045 :1000FA0000BF05E003BF09E106BF00E20BBF0CE148 -:10010A0000BD11241092670000E0009360000FEF19 -:10011A0000936C0005E000936D0005E000936E000B -:10012A0001E000936F0000270093690000936A00C2 -:10013A0000EF00936B0060D180E090E000916000D6 -:10014A00003031F4969833D161D001E009BF25D04F -:10015A00013019F496982BD1CCD0023079F7969ABF -:10016A001BE01093630010936400109365001093D2 -:10017A006600E4CFEE24FF1841E1001F111F4A95E3 -:10018A0009F40895EE1CFF1CE21AF30A20F4E20EA9 -:10019A00F31E8894F2CF0894F0CF0F931F932F93F6 -:1001AA003F934F935F936F930091690010916A0098 -:1001BA0020916B0030916C0040916D0050916F005E -:1001CA000EF43195552309F419C003172CF416F4CB -:1001DA00909801C0909A12C0031729F016F4909AC9 -:1001EA0001C090980BC016F4909801C0909A2417F9 -:1001FA000CF404C016F4909A01C090986F915F9124 -:10020A004F913F912F911F910F9108951F935BD0AA -:10021A005CE034E34DEF0FD15CE034E34DEF0BD1FA -:10022A0008D010916900812F10916A00912F1F91B7 -:10023A0008950F931F932F933F934F9368D00CEC1D -:10024A00802E7AD00EEB802E77D0A9E6B0E095D03A -:10025A00AAE6B0E092D01091690020916A002F932B -:10026A00287F283F11F0E89409C02F9168941095CF -:10027A00209531E0130F30E0231F01C02F912695FE -:10028A0017952695179526951795269517953091C2 -:10029A0069000EF43195432F3F70432F330F330F0C -:1002AA00330F440F340F369536953695369510939D -:1002BA00690020936A0030936B004F913F912F9110 -:1002CA001F910F9108950F9322D00CEC802E34D0F9 -:1002DA0004E4802E31D00F9108950F930FB800E4F3 -:1002EA000EB90BE10DB9769BFDCFC09AC0980F915C -:1002FA0008950F938CD0B29B0196B39B0197B49B40 -:10030A0001C003C000E0009360000F910895F894C3 -:10031A00B99A33E04EEB8BD0B99830E04AE887D0EF -:10032A0005D033E042E383D078940895B19B71609D -:10033A0002C0B1997E7F08950F931F93082D18E08C -:10034A00069508F458F0F894B99A30E046E76FD069 -:10035A00B99830E042E16BD078940AC0F894B99A1F -:10036A0030E04AE064D0B99830E04EE760D0789443 -:10037A001A9531F71F910F9108950F931F93002734 -:10038A0018E0F8940695B99A30E04AE050D0B99846 -:10039A0030E040E14CD0B199006830E04CE647D0FB -:1003AA001A9581F70C9378941F910F910895F894F8 -:1003BA005F9354E0A3E6B0E08093610090936200FB -:1003CA0000916100109162002AE030E0D3DEED92E4 -:1003DA0000936100109362005A9591F75F917894A7 -:1003EA0008950F931F93EAE6F4E01127E00FF11F37 -:1003FA0004901F910F910895C59A22D0C598089527 -:10040A00C59A1ED01DD01CD01BD0C59808950F9335 -:10041A001F932F932AE01FEF0FEF0A95F1F71A9512 -:10042A00D9F72A95C1F72F911F910F91089541503D -:10043A003040E8F70895415030405040E0F70895C1 -:10044A000F931F932F9326E00FEF1FEF1A95F1F7E3 -:10045A000A95D9F72A95C1F72F911F910F910895FF -:0C046A00C0F9A4B0999282F880909CBF69 +:10010A0000BD11241092670000E0009360000CE229 +:10011A0000936D0001E000936C0005E000936E000F +:10012A0001E000936F0008E1102F000F000F000F8D +:10013A00110F010F009371000027009369000093CB +:10014A006A0000EF00936B0072D0009170000832D1 +:10015A0009F405C012E0109360005AD101C054D1CD +:10016A0080E090E000916000003031F4969827D149 +:10017A004BD001E009BF39D0013019F496981FD14C +:10018A00C0D0023079F7969AEDCFEE24FF1841E1FC +:10019A00001F111F4A9509F40895EE1CFF1CE21A6C +:1001AA00F30A20F4E20EF31E8894F2CF0894F0CFFB +:1001BA00FF1829E0001F2A9509F40895FF1CF11A77 +:1001CA0018F4F10E8894F6CF0894F4CF55274427F3 +:1001DA0060E13695279510F4400F511F57954795C2 +:1001EA00379527956A95B9F708950F931F932F931B +:1001FA003F934F935F936F936F915F914F913F91AD +:10020A002F911F910F9108951F9365D05CE034E3FD +:10021A004DEF19D15CE034E34DEF15D112D01091B6 +:10022A006900812F10916A00912F1F9108950F93F1 +:10023A0076D003E3802E88D0A0E7B0E0A6D00F9155 +:10024A0008950F931F932F933F934F9368D00CEC0D +:10025A00802E7AD00EEB802E77D0A9E6B0E095D02A +:10026A00AAE6B0E092D01091690020916A002F931B +:10027A00287F283F11F0E89409C02F9168941095BF +:10028A00209531E0130F30E0231F01C02F912695EE +:10029A0017952695179526951795269517953091B2 +:1002AA0069000EF43195432F3F70432F330F330FFC +:1002BA00330F440F340F369536953695369510938D +:1002CA00690020936A0030936B004F913F912F9100 +:1002DA001F910F9108950F9322D00CEC802E34D0E9 +:1002EA0004E4802E31D00F9108950F930FB800E4E3 +:1002FA000EB90BE10DB9769BFDCFC09AC0980F914C +:10030A0008950F938CD0B29B0196B39B0197B49B2F +:10031A0001C003C000E0009360000F910895F894B3 +:10032A00B99A33E04EEB8BD0B99830E04AE887D0DF +:10033A0005D033E042E383D078940895B19B71608D +:10034A0002C0B1997E7F08950F931F93082D18E07C +:10035A00069508F458F0F894B99A30E046E76FD059 +:10036A00B99830E042E16BD078940AC0F894B99A0F +:10037A0030E04AE064D0B99830E04EE760D0789433 +:10038A001A9531F71F910F9108950F931F93002724 +:10039A0018E0F8940695B99A30E04AE050D0B99836 +:1003AA0030E040E14CD0B199006830E04CE647D0EB +:1003BA001A9581F70C9378941F910F910895F894E8 +:1003CA005F9354E0A3E6B0E08093610090936200EB +:1003DA0000916100109162002AE030E0D6DEED92D1 +:1003EA0000936100109362005A9591F75F91789497 +:1003FA0008950F931F93EAE7F4E01127E00FF11F26 +:10040A0004901F910F910895C59A22D0C598089516 +:10041A00C59A1ED01DD01CD01BD0C59808950F9325 +:10042A001F932F932AE01FEF0FEF0A95F1F71A9502 +:10043A00D9F72A95C1F72F911F910F91089541502D +:10044A003040E8F70895415030405040E0F70895B1 +:10045A000F931F932F9326E00FEF1FEF1A95F1F7D3 +:10046A000A95D9F72A95C1F72F911F910F910895EF +:0C047A00C0F9A4B0999282F880909CBF59 :00000001FF diff --git a/mpy16u.asm b/mpy16u.asm new file mode 100644 index 0000000..ea71ba7 --- /dev/null +++ b/mpy16u.asm @@ -0,0 +1,46 @@ +;*************************************************************************** +;* +;* "mpy16u" - 16x16 Bit Unsigned Multiplication +;* +;* This subroutine multiplies the two 16-bit register variables +;* mp16uH:mp16uL and mc16uH:mc16uL. +;* The result is placed in m16u3:m16u2:m16u1:m16u0. +;* +;* Number of words :14 + return +;* Number of cycles :153 + return +;* Low registers used :None +;* High registers used :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2, +;* m16u3,mcnt16u) +;* +;*************************************************************************** + +;***** Subroutine Register Variables + +.def mc16uL =r16 ;multiplicand low byte +.def mc16uH =r17 ;multiplicand high byte +.def mp16uL =r18 ;multiplier low byte +.def mp16uH =r19 ;multiplier high byte +.def m16u0 =r18 ;result byte 0 (LSB) +.def m16u1 =r19 ;result byte 1 +.def m16u2 =r20 ;result byte 2 +.def m16u3 =r21 ;result byte 3 (MSB) +.def mcnt16u =r22 ;loop counter + +;***** Code + +mpy16u: clr m16u3 ;clear 2 highest bytes of result + clr m16u2 + ldi mcnt16u,16 ;init loop counter + lsr mp16uH + ror mp16uL + +m16u_1: brcc noad8 ;if bit 0 of multiplier set + add m16u2,mc16uL ;add multiplicand Low to byte 2 of res + adc m16u3,mc16uH ;add multiplicand high to byte 3 of res +noad8: ror m16u3 ;shift right result byte 3 + ror m16u2 ;rotate right result byte 2 + ror m16u1 ;rotate result byte 1 and multiplier High + ror m16u0 ;rotate result byte 0 and multiplier Low + dec mcnt16u ;decrement loop counter + brne m16u_1 ;if not done, loop more + ret \ No newline at end of file diff --git a/mpy16u.hex b/mpy16u.hex new file mode 100644 index 0000000..246e5d9 --- /dev/null +++ b/mpy16u.hex @@ -0,0 +1,4 @@ +:020000020000FC +:100000005527442760E13695279510F4400F511F7E +:0E00100057954795379527956A95B9F7089546 +:00000001FF diff --git a/nbproject/Makefile-genesis.properties b/nbproject/Makefile-genesis.properties index b723030..9b921d1 100644 --- a/nbproject/Makefile-genesis.properties +++ b/nbproject/Makefile-genesis.properties @@ -1,12 +1,12 @@ # -#Thu Jun 22 06:29:23 MSK 2023 +#Sun Jun 25 21:34:52 MSK 2023 default.languagetoolchain.version=2.2.7 default.Pack.dfplocation=/home/sergeyyarkov/.mchp_packs/Microchip/ATtiny_DFP/3.0.151 default.com-microchip-mplab-mdbcore-simulator-Simulator.md5=19e4dc0f223322f74cda227c3c12c71c conf.ids=default default.languagetoolchain.dir=/usr/bin host.id=2l3s-yrgx-1d -configurations-xml=cdd4b69d8607063199baa35f45d5db2e +configurations-xml=6a01ab9659d148a99244ed826cfd39c3 default.com-microchip-mplab-nbide-toolchain-avrasm-AVRASMLanguageToolchain.md5=0e94da8ed93e9650ffef50929833a79f com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=6e02ca5e9f5042ffd365b42ab82d3a9b user-defined-mime-resolver-xml=none diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index f25ff1e..35c4e4e 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -16,6 +16,8 @@ div16u.asm definitions.asm macros.asm + div8u.asm + mpy16u.asm + + + +