diff --git a/definitions.asm b/definitions.asm index e9bd29a..fde983e 100644 --- a/definitions.asm +++ b/definitions.asm @@ -64,10 +64,10 @@ ; Отдельно задается целая и дробная часть в точности до десятых ; Например: 30.5 градусов -.EQU DEFAULT_SETTING_INT = 29 +.EQU DEFAULT_SETTING_INT = 0 .EQU DEFAULT_SETTING_F = 5 // 0.5 -.EQU DEFAULT_SETTING_HYST = 5 // 0.5 +.EQU DEFAULT_SETTING_HYST = 15 // 1.5 .EQU HEAT_MODE = 1 .EQU COOLING_MODE = 0 diff --git a/dist/default/production/attiny2313a_thermostat.X.production.hex b/dist/default/production/attiny2313a_thermostat.X.production.hex index c61bc10..4b33515 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.hex +++ b/dist/default/production/attiny2313a_thermostat.X.production.hex @@ -7,65 +7,68 @@ :10004A000F931F935FB74091670045300CF403C0CC :10005A00442740936700403081F493989498959888 :10006A000EF002C00BE002C000916500002311F0FF -:10007A00929A01C0929898D113D1413081F4929802 +:10007A00929A01C09298B0D12BD1413081F49298D2 :10008A00949895980091640030916500032B11F0C3 -:10009A00939A01C093980091640086D101D14230AD -:1000AA0059F4929893989598949A009163007CD108 -:1000BA00002D0F77002EF4D0433041F49298939894 -:1000CA009498959A00916B006FD1EAD0439540932A +:10009A00939A01C09398009164009ED119D142307D +:1000AA0059F4929893989598949A0091630094D1F0 +:1000BA00002D0F77002E0CD1433041F4929893987B +:1000CA009498959A00916B0087D102D143954093F9 :1000DA0067005FBF1F910F915F914F9118950FEDC8 :1000EA000DBF0FE701BB01EE07BB0CE108BB02E045 :1000FA0000BF05E003BF09E106BF00E20BBF0CE148 -:10010A0000BD11241092670000E0009360000DE129 -:10011A0000936C0005E000936D0005E000936E000B +:10010A0000BD11241092670000E00093600000E037 +:10011A0000936C0005E000936D000FE000936E0001 :10012A0001E000936F0000270093690000936A00C2 -:10013A0000EF00936B0050D000917000003109F479 -:10014A0005C012E0109360003ED101C038D180E0B2 -:10015A0090E000916000003031F496980BD129D0DC -:10016A0001E009BF25D0013019F4969803D1A4D033 -:10017A00023079F7969A1BE010936300109364009B -:10018A001093650010936600E4CFEE24FF1841E156 -:10019A00001F111F4A9509F40895EE1CFF1CE21A6C -:1001AA00F30A20F4E20EF31E8894F2CF0894F0CFFB -:1001BA0008951F936BD05CE034E34DEF1FD15CE0F0 -:1001CA0034E34DEF1BD118D010916900812F1091A3 -:1001DA006A00912F1F9108950F937CD00CEC802E0A -:1001EA008ED00EEB802E8BD0A0E7B0E008E0A8D02E -:1001FA000A95E9F70F9108950F931F932F933F9351 -:10020A004F9368D00CEC802E7AD00EEB802E77D0EC -:10021A00A9E6B0E095D0AAE6B0E092D010916900C4 -:10022A0020916A002F93287F283F11F0E89409C093 -:10023A002F9168941095209531E0130F30E0231F19 -:10024A0001C02F91269517952695179526951795EE -:10025A0026951795309169000EF43195432F3F701A -:10026A00432F330F330F330F440F340F3695369520 -:10027A00369536951093690020936A0030936B0087 -:10028A004F913F912F911F910F9108950F9322D073 -:10029A000CEC802E34D004E4802E31D00F910895D6 -:1002AA000F930FB800E40EB90BE10DB9769BFDCFA1 -:1002BA00C09AC0980F9108950F938CD0B29B019663 -:1002CA00B39B0197B49B01C003C000E00093600098 -:1002DA000F910895F894B99A33E04EEB8BD0B99800 -:1002EA0030E04AE887D005D033E042E383D07894FF -:1002FA000895B19B716002C0B1997E7F08950F93F2 -:10030A001F93082D18E0069508F458F0F894B99A46 -:10031A0030E046E76FD0B99830E042E16BD078948C -:10032A000AC0F894B99A30E04AE064D0B99830E04B -:10033A004EE760D078941A9531F71F910F9108957E -:10034A000F931F93002718E0F8940695B99A30E0A6 -:10035A004AE050D0B99830E040E14CD0B1990068F9 -:10036A0030E04CE647D01A9581F70C9378941F91A8 -:10037A000F910895F8945F9354E0A3E6B0E0809358 -:10038A0061009093620000916100109162002AE07E -:10039A0030E0FBDEED9200936100109362005A9503 -:1003AA0091F75F91789408950F931F93E0E3F4E037 -:1003BA001127E00FF11F04901F910F910895C59A1C -:1003CA0022D0C5980895C59A1ED01DD01CD01BD026 -:1003DA00C59808950F931F932F932AE01FEF0FEFED -:1003EA000A95F1F71A95D9F72A95C1F72F911F9116 -:1003FA000F91089541503040E8F708954150304038 -:10040A005040E0F708950F931F932F9326E00FEFC4 -:10041A001FEF1A95F1F70A95D9F72A95C1F72F9187 -:10042A001F910F910895C0F9A4B0999282F8809013 -:02043A009CBF65 +:10013A0000EF00936B006ED000917000083209F452 +:10014A0005C012E01093600056D101C050D180E082 +:10015A0090E000916000003031F4969823D147D0A6 +:10016A0001E009BF1CD0013019F496981BD1BCD00C +: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 :00000001FF diff --git a/dist/default/production/attiny2313a_thermostat.X.production.lss b/dist/default/production/attiny2313a_thermostat.X.production.lss index 7167675..9c65167 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.lss +++ b/dist/default/production/attiny2313a_thermostat.X.production.lss @@ -1,26 +1,26 @@ -AVRASM ver. 2.2.7 main.asm Sat Jun 24 17:26:02 2023 +AVRASM ver. 2.2.7 main.asm Sun Jun 25 15:01:25 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(294): Including file 'div16u.asm' +main.asm(288): Including file 'div16u.asm' div16u.asm(22): warning: Register r16 already defined by the .DEF directive -main.asm(294): 'div16u.asm' included form here +main.asm(288): 'div16u.asm' included form here div16u.asm(23): warning: Register r17 already defined by the .DEF directive -main.asm(294): 'div16u.asm' included form here +main.asm(288): 'div16u.asm' included form here div16u.asm(24): warning: Register r16 already defined by the .DEF directive -main.asm(294): 'div16u.asm' included form here +main.asm(288): 'div16u.asm' included form here div16u.asm(25): warning: Register r17 already defined by the .DEF directive -main.asm(294): 'div16u.asm' included form here +main.asm(288): 'div16u.asm' included form here div16u.asm(27): warning: Register r19 already defined by the .DEF directive -main.asm(294): 'div16u.asm' included form here +main.asm(288): 'div16u.asm' included form here div16u.asm(28): warning: Register r20 already defined by the .DEF directive -main.asm(294): 'div16u.asm' included form here +main.asm(288): 'div16u.asm' included form here [builtin](2): Including file '/home/sergeyyarkov/.mchp_packs/Microchip/ATtiny_DFP/3.0.151/avrasm/inc\tn2313Adef.inc' main.asm(15): Including file 'definitions.asm' main.asm(16): Including file 'macros.asm' -main.asm(294): Including file 'div16u.asm' +main.asm(288): Including file 'div16u.asm' ; @@ -802,10 +802,10 @@ main.asm(294): Including file 'div16u.asm' ; Отдельно задается целая и дробная часть в точности до десятых ; Например: 30.5 градусов - .EQU DEFAULT_SETTING_INT = 29 + .EQU DEFAULT_SETTING_INT = 0 .EQU DEFAULT_SETTING_F = 5 // 0.5 - .EQU DEFAULT_SETTING_HYST = 5 // 0.5 + .EQU DEFAULT_SETTING_HYST = 15 // 1.5 .EQU HEAT_MODE = 1 .EQU COOLING_MODE = 0 @@ -958,8 +958,8 @@ main.asm(294): Including file 'div16u.asm' 00003d 9a92 sbi PORTD, DIGIT_1_PIN 00003e c001 rjmp PC+2 00003f 9892 cbi PORTD, DIGIT_1_PIN -000040 d198 rcall DISPLAY_DECODER -000041 d113 rcall USI_TRANSMIT +000040 d1b0 rcall DISPLAY_DECODER +000041 d12b rcall USI_TRANSMIT _indicate_2: 000042 3041 cpi r20, 1 @@ -976,8 +976,8 @@ main.asm(294): 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 d186 rcall DISPLAY_DECODER -000053 d101 rcall USI_TRANSMIT +000052 d19e rcall DISPLAY_DECODER +000053 d119 rcall USI_TRANSMIT _indicate_3: 000054 3042 cpi r20, 2 @@ -988,12 +988,12 @@ main.asm(294): 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 d17c rcall DISPLAY_DECODER +00005c d194 rcall DISPLAY_DECODER ; зажигаем точку 00005d 2d00 mov r16, r0 00005e 770f cbr r16, (1<<7) 00005f 2e00 mov r0, r16 -000060 d0f4 rcall USI_TRANSMIT +000060 d10c rcall USI_TRANSMIT _indicate_4: 000061 3043 cpi r20, 3 @@ -1004,8 +1004,8 @@ main.asm(294): 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 d16f rcall DISPLAY_DECODER -00006a d0ea rcall USI_TRANSMIT +000069 d187 rcall DISPLAY_DECODER +00006a d102 rcall USI_TRANSMIT _indicate_exit: 00006b 9543 inc r20 @@ -1062,11 +1062,11 @@ main.asm(294): Including file 'div16u.asm' 000089 e000 ldi r16, 0x00 00008a 9300 0060 sts MCU_STATE, r16 ; переводим МК сразу в режим измерения температуры -00008c e10d ldi r16, DEFAULT_SETTING_INT +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 e005 ldi r16, DEFAULT_SETTING_HYST +000092 e00f 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 @@ -1079,20 +1079,20 @@ main.asm(294): Including file 'div16u.asm' ; **** СТАРТУЕМ ************************************************ -0000a0 d050 rcall RD_F_CODE ; проверяем что датчик есть на шине +0000a0 d06e rcall RD_F_CODE ; проверяем что датчик есть на шине 0000a1 9100 0070 lds r16, DEVICE_FAMILY_CODE -0000a3 3100 cpi r16, 0x10 +0000a3 3208 cpi r16, 0x28 ; код семейства для DS18B20 = 0x28 0000a4 f409 brne ERR_FAMILY_CODE 0000a5 c005 rjmp START_PROGRAM ERR_FAMILY_CODE: 0000a6 e012 ldi r17, MCU_STATE_ERROR 0000a7 9310 0060 sts MCU_STATE, r17 -0000a9 d13e rcall BEEP_LONG +0000a9 d156 rcall BEEP_LONG 0000aa c001 rjmp PC+2 START_PROGRAM: -0000ab d138 rcall BEEP_SHORT +0000ab d150 rcall BEEP_SHORT 0000ac e080 0000ad e090 display_load 0 @@ -1109,28 +1109,22 @@ main.asm(294): 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 d10b rcall DISPLAY_UPD_DIGITS -0000b4 d029 rcall TEMP_UPD +0000b3 d123 rcall DISPLAY_UPD_DIGITS +0000b4 d047 rcall TEMP_UPD 0000b5 e001 0000b6 bf09 outi r16, TIMSK, (1< @@ -1168,268 +1162,238 @@ main.asm(294): Including file 'div16u.asm' ;***** Code div16u: -0000ca 24ee clr drem16uL ; clear remainder Low byte -0000cb 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry -0000cc e141 ldi dcnt16u,17 ; init loop counter +0000c1 24ee clr drem16uL ; clear remainder Low byte +0000c2 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry +0000c3 e141 ldi dcnt16u,17 ; init loop counter d16u_1: -0000cd 1f00 rol dd16uL ; shift left dividend -0000ce 1f11 rol dd16uH -0000cf 954a dec dcnt16u ; decrement counter -0000d0 f409 brne d16u_2 ; if done -0000d1 9508 ret ; return +0000c4 1f00 rol dd16uL ; shift left dividend +0000c5 1f11 rol dd16uH +0000c6 954a dec dcnt16u ; decrement counter +0000c7 f409 brne d16u_2 ; if done +0000c8 9508 ret ; return d16u_2: -0000d2 1cee rol drem16uL ; shift dividend into remainder -0000d3 1cff rol drem16uH -0000d4 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor -0000d5 0af3 sbc drem16uH,dv16uH -0000d6 f420 brcc d16u_3 ; if result negative -0000d7 0ee2 add drem16uL,dv16uL ; restore remainder -0000d8 1ef3 adc drem16uH,dv16uH -0000d9 9488 clc ; clear carry to be shifted into result -0000da cff2 rjmp d16u_1 ; else +0000c9 1cee rol drem16uL ; shift dividend into remainder +0000ca 1cff rol drem16uH +0000cb 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor +0000cc 0af3 sbc drem16uH,dv16uH +0000cd f420 brcc d16u_3 ; if result negative +0000ce 0ee2 add drem16uL,dv16uL ; restore remainder +0000cf 1ef3 adc drem16uH,dv16uH +0000d0 9488 clc ; clear carry to be shifted into result +0000d1 cff2 rjmp d16u_1 ; else d16u_3: -0000db 9408 sec ; set carry to be shifted into result -0000dc cff0 +0000d2 9408 sec ; set carry to be shifted into result +0000d3 cff0 TEMP_COMPARSION: - ; push r16 - ; push r17 - ; push r18 - ; push r19 - ; push r20 - ; push r21 - ; push r22 - ; - ; lds r16, TEMP_L - ; lds r17, TEMP_H // всегда 0? - ; lds r18, TEMP_F +0000d4 930f push r16 +0000d5 931f push r17 +0000d6 932f push r18 +0000d7 933f push r19 +0000d8 934f push r20 +0000d9 935f push r21 +0000da 936f push r22 + +0000db 9100 0069 lds r16, TEMP_L +0000dd 9110 006a lds r17, TEMP_H // всегда 0? +0000df 9120 006b lds r18, TEMP_F ; lds r19, SETTING_INT ; lds r20, SETTING_F - ; lds r21, SETTING_MODE - ; - ; brtc _START_COMPARSION - ; neg r19 - ; - ;_START_COMPARSION: - ; tst r21 - ; brne _HEATING - ;_COOLING: - ; rjmp _COMPARSION_EXIT - ;_HEATING: - ; cp r16, r19 - ; brge _HEATING_GREATER_OR_E ; если целая часть текущей температуры <= уставки - продолжаем сравнение - ; brtc PC+3 - ; relay_off - ; rjmp PC+2 - ; relay_on ; c - ; rjmp _COMPARSION_EXIT - ;_HEATING_GREATER_OR_E: - ; cp r16, r19 - ; breq _HEATING_GREATER_E - ; brtc PC+3 - ; relay_on - ; rjmp PC+2 - ; relay_off ; c - ; rjmp _COMPARSION_EXIT - ;_HEATING_GREATER_E: - ; brtc PC+3 - ; relay_off - ; rjmp PC+2 - ; relay_on ; c - ; cp r18, r20 - ; brge PC+2 ; если дробная часть текущей температуры >= уставки - выключаем реле - ; rjmp _COMPARSION_EXIT - ;_HEATING_GREATER_OR_E_F: - ; cp r18, r20 - ; breq _HEATING_GREATER_E_F - ; brtc PC+3 - ; relay_on - ; rjmp PC+2 - ; relay_off ; c - ; rjmp _COMPARSION_EXIT - ;_HEATING_GREATER_E_F: - ; brtc PC+3 - ; relay_on - ; rjmp PC+2 - ; relay_off ; c - ; - ;_COMPARSION_EXIT: - ; pop r22 - ; pop r21 - ; pop r20 - ; pop r19 - ; pop r18 - ; pop r17 - ; pop r16 -0000dd 9508 ret + + + +0000e1 e13c ldi r19, 28 ; min +0000e2 e240 ldi r20, 32 ; max +0000e3 9150 006f lds r21, SETTING_MODE ; mode + +0000e5 f00e brts PC+2 +0000e6 c001 rjmp PC+2 +0000e7 9501 neg r16 + +0000e8 2355 tst r21 +0000e9 f409 brne _HEATING_MODE +0000ea c009 rjmp _COMPARSION_EXIT + + _HEATING_MODE: +0000eb 1730 cp r19, r16 +0000ec f40c brge _HEATING_ON ; TEMP <= MIN +0000ed c002 rjmp _HEATING_OFF + _HEATING_ON: +0000ee 9a90 relay_on +0000ef c004 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 + _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 // TEMP_UPD: -0000de 931f push r17 -0000df d06b rcall TEMP_CONV -0000e0 e05c -0000e1 e334 -0000e2 ef4d -0000e3 d11f DELAY24 500000 -0000e4 e05c -0000e5 e334 -0000e6 ef4d -0000e7 d11b DELAY24 500000 -0000e8 d018 rcall TEMP_RD +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 ; обновляем данные в ячейках -0000e9 9110 0069 lds r17, TEMP_L -0000eb 2f81 mov DISP_NUM_L, r17 -0000ec 9110 006a lds r17, TEMP_H -0000ee 2f91 mov DISP_NUM_H, r17 -0000ef 911f pop r17 -0000f0 9508 ret +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 // // RD_F_CODE: -0000f1 930f push r16 +00010f 930f push r16 -0000f2 d07c rcall OW_PRESENCE -0000f3 ec0c ldi r16, DS18B20_CMD_SKIPROM -0000f4 2e80 mov OW_CMD_r, r16 -0000f5 d08e rcall OW_SEND_BYTE +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 + +000114 e7a0 ldi XL, LOW(DEVICE_FAMILY_CODE) +000115 e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) +000116 d0a6 rcall OW_RD_BYTE -0000f6 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD -0000f7 2e80 mov OW_CMD_r, r16 -0000f8 d08b rcall OW_SEND_BYTE - -0000f9 e7a0 ldi XL, LOW(DEVICE_FAMILY_CODE) -0000fa e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) - -0000fb e008 ldi r16, 8 - _RD_L: -0000fc d0a8 rcall OW_RD_BYTE -0000fd 950a dec r16 -0000fe f7e9 brne _RD_L - -0000ff 910f pop r16 -000100 9508 ret// +000117 910f pop r16 +000118 9508 ret// // TEMP_RD: -000101 930f push r16 -000102 931f push r17 -000103 932f push r18 -000104 933f push r19 -000105 934f push r20 +000119 930f push r16 +00011a 931f push r17 +00011b 932f push r18 +00011c 933f push r19 +00011d 934f push r20 ; cli -000106 d068 rcall OW_PRESENCE -000107 ec0c ldi r16, DS18B20_CMD_SKIPROM -000108 2e80 mov OW_CMD_r, r16 -000109 d07a rcall OW_SEND_BYTE +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 -00010a eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD -00010b 2e80 mov OW_CMD_r, r16 -00010c d077 rcall OW_SEND_BYTE +000122 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD +000123 2e80 mov OW_CMD_r, r16 +000124 d077 rcall OW_SEND_BYTE -00010d e6a9 ldi XL, LOW(TEMP_L) -00010e e0b0 ldi XH, HIGH(TEMP_L) -00010f d095 rcall OW_RD_BYTE +000125 e6a9 ldi XL, LOW(TEMP_L) +000126 e0b0 ldi XH, HIGH(TEMP_L) +000127 d095 rcall OW_RD_BYTE -000110 e6aa ldi XL, LOW(TEMP_H) -000111 e0b0 ldi XH, HIGH(TEMP_H) -000112 d092 rcall OW_RD_BYTE +000128 e6aa ldi XL, LOW(TEMP_H) +000129 e0b0 ldi XH, HIGH(TEMP_H) +00012a d092 rcall OW_RD_BYTE -000113 9110 0069 lds r17, TEMP_L -000115 9120 006a lds r18, TEMP_H +00012b 9110 0069 lds r17, TEMP_L +00012d 9120 006a lds r18, TEMP_H -000117 932f push r18 -000118 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) -000119 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой -00011a f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число -00011b 94e8 clt -00011c c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) +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) _TEMP_RD_TO_UNSIGNED: -00011d 912f pop r18 -00011e 9468 set -00011f 9510 com r17 -000120 9520 com r18 -000121 e031 ldi r19, 1 -000122 0f13 add r17, r19 -000123 e030 ldi r19, 0 -000124 1f23 adc r18, r19 -000125 c001 rjmp PC+2 +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 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) -000126 912f pop r18 -000127 9526 lsr r18 -000128 9517 ror r17 -000129 9526 lsr r18 -00012a 9517 ror r17 -00012b 9526 lsr r18 -00012c 9517 ror r17 -00012d 9526 lsr r18 -00012e 9517 ror r17 +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 _TEMP_RD_END: -00012f 9130 0069 lds r19, TEMP_L -000131 f40e brtc PC+2 -000132 9531 neg r19 ; переводим в беззнаковое число если минус +000147 9130 0069 lds r19, TEMP_L +000149 f40e brtc PC+2 +00014a 9531 neg r19 ; переводим в беззнаковое число если минус ; далее происходит такое для получения дробной части: ; ((n<<3) + (n<<1))>>4 или (n*10)/16 -000133 2f43 mov r20, r19 -000134 703f andi r19, 0x0f -000135 2f43 mov r20, r19 -000136 0f33 lsl r19 -000137 0f33 lsl r19 -000138 0f33 lsl r19 +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 -000139 0f44 lsl r20 +000151 0f44 lsl r20 -00013a 0f34 add r19, r20 +000152 0f34 add r19, r20 -00013b 9536 lsr r19 -00013c 9536 lsr r19 -00013d 9536 lsr r19 -00013e 9536 lsr r19 +000153 9536 lsr r19 +000154 9536 lsr r19 +000155 9536 lsr r19 +000156 9536 lsr r19 ; записываем данные -00013f 9310 0069 sts TEMP_L, r17 -000141 9320 006a sts TEMP_H, r18 -000143 9330 006b sts TEMP_F, r19 +000157 9310 0069 sts TEMP_L, r17 +000159 9320 006a sts TEMP_H, r18 +00015b 9330 006b sts TEMP_F, r19 ; sei -000145 914f pop r20 -000146 913f pop r19 -000147 912f pop r18 -000148 911f pop r17 -000149 910f pop r16 -00014a 9508 ret +00015d 914f pop r20 +00015e 913f pop r19 +00015f 912f pop r18 +000160 911f pop r17 +000161 910f pop r16 +000162 9508 ret ; TEMP_CONV: -00014b 930f push r16 +000163 930f push r16 ; cli -00014c d022 rcall OW_PRESENCE -00014d ec0c ldi r16, DS18B20_CMD_SKIPROM -00014e 2e80 mov OW_CMD_r, r16 -00014f d034 rcall OW_SEND_BYTE +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 -000150 e404 ldi r16, DS18B20_CMD_CONVERTTEMP -000151 2e80 mov OW_CMD_r, r16 -000152 d031 rcall OW_SEND_BYTE +000168 e404 ldi r16, DS18B20_CMD_CONVERTTEMP +000169 2e80 mov OW_CMD_r, r16 +00016a d031 rcall OW_SEND_BYTE ; sei -000153 910f pop r16 -000154 9508 ret +00016b 910f pop r16 +00016c 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: -000155 930f push r16 -000156 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. +00016d 930f push r16 +00016e b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) -000157 e400 ldi TEMP_REG_A, (1< USI Clock Source Select ; USICLK <--------------> USI Clock Strobe ; USITC <--------------> USI Toggle Clock (Enable clock generation) -000159 e10b ldi TEMP_REG_A, (1< +000175 9ac0 sbi PORTB, USI_LATCH_PIN +000176 98c0 cbi PORTB, USI_LATCH_PIN +000177 910f pop r16 +000178 9508 ret// // SW_CHECK_PROCESS: -000161 930f push r16 -000162 d08c rcall DEBOUNCE_SW -000163 9bb2 sbis SW_PIN, SW_PLUS_PIN -000164 9601 adiw DISP_NUM_L, 1 +000179 930f push r16 +00017a d08c rcall DEBOUNCE_SW +00017b 9bb2 sbis SW_PIN, SW_PLUS_PIN +00017c 9601 adiw DISP_NUM_L, 1 -000165 9bb3 sbis SW_PIN, SW_MINUS_PIN -000166 9701 sbiw DISP_NUM_L, 1 +00017d 9bb3 sbis SW_PIN, SW_MINUS_PIN +00017e 9701 sbiw DISP_NUM_L, 1 -000167 9bb4 sbis SW_PIN, SW_SET_PIN -000168 c001 rjmp _INTO_DEFAULT_STATE -000169 c003 rjmp _SW_CHECK_PROCESS_END +00017f 9bb4 sbis SW_PIN, SW_SET_PIN +000180 c001 rjmp _INTO_DEFAULT_STATE +000181 c003 rjmp _SW_CHECK_PROCESS_END _INTO_DEFAULT_STATE: -00016a e000 ldi r16, MCU_STATE_DEFAULT -00016b 9300 0060 sts MCU_STATE, r16 +000182 e000 ldi r16, MCU_STATE_DEFAULT +000183 9300 0060 sts MCU_STATE, r16 _SW_CHECK_PROCESS_END: -00016d 910f pop r16 -00016e 9508 ret +000185 910f pop r16 +000186 9508 ret // // // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: -00016f 94f8 cli -000170 9ab9 ow_pull -000171 e033 -000172 eb4e -000173 d08b DELAY16 480 -000174 98b9 ow_release -000175 e030 -000176 e84a -000177 d087 DELAY16 70 -000178 d005 rcall OW_CHECK_PRESENCE -000179 e033 -00017a e342 -00017b d083 DELAY16 410 -00017c 9478 sei -00017d 9508 ret +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 // // @@ -1501,85 +1465,85 @@ main.asm(294): Including file 'div16u.asm' ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: -00017e 9bb1 sbis OW_PIN, OW_LINE -00017f 6071 sbr OWFR, (1< // OW_SEND_BYTE: -000184 930f push r16 -000185 931f push r17 -000186 2d08 mov r16, OW_CMD_r -000187 e018 ldi r17, 8 +00019c 930f push r16 +00019d 931f push r17 +00019e 2d08 mov r16, OW_CMD_r +00019f e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: -000188 9506 lsr r16 -000189 f408 brcc _OW_SEND_0 -00018a f058 brcs _OW_SEND_1 +0001a0 9506 lsr r16 +0001a1 f408 brcc _OW_SEND_0 +0001a2 f058 brcs _OW_SEND_1 _OW_SEND_0: -00018b 94f8 cli -00018c 9ab9 ow_pull -00018d e030 -00018e e746 -00018f d06f DELAY16 60 -000190 98b9 ow_release -000191 e030 -000192 e142 -000193 d06b DELAY16 10 -000194 9478 sei -000195 c00a rjmp _OW_SEND_BYTE_END +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 _OW_SEND_1: -000196 94f8 cli -000197 9ab9 ow_pull -000198 e030 -000199 e04a -00019a d064 DELAY16 6 -00019b 98b9 ow_release -00019c e030 -00019d e74e -00019e d060 DELAY16 64 -00019f 9478 sei +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 _OW_SEND_BYTE_END: -0001a0 951a dec r17 -0001a1 f731 brne _OW_SEND_BYTE_LOOP -0001a2 911f pop r17 -0001a3 910f pop r16 -0001a4 9508 ret +0001b8 951a dec r17 +0001b9 f731 brne _OW_SEND_BYTE_LOOP +0001ba 911f pop r17 +0001bb 910f pop r16 +0001bc 9508 ret // // OW_RD_BYTE: -0001a5 930f push r16 -0001a6 931f push r17 -0001a7 2700 clr r16 -0001a8 e018 ldi r17, 8 -0001a9 94f8 cli +0001bd 930f push r16 +0001be 931f push r17 +0001bf 2700 clr r16 +0001c0 e018 ldi r17, 8 +0001c1 94f8 cli _OW_RD_BYTE_LP: -0001aa 9506 lsr r16 -0001ab 9ab9 ow_pull -0001ac e030 -0001ad e04a -0001ae d050 DELAY16 6 -0001af 98b9 ow_release -0001b0 e030 -0001b1 e140 -0001b2 d04c DELAY16 9 -0001b3 99b1 sbic OW_PIN, OW_LINE -0001b4 6800 sbr r16, (1<<7) -0001b5 e030 -0001b6 e64c -0001b7 d047 DELAY16 55 -0001b8 951a dec r17 -0001b9 f781 brne _OW_RD_BYTE_LP -0001ba 930c st X, r16 -0001bb 9478 sei -0001bc 911f pop r17 -0001bd 910f pop r16 -0001be 9508 ret +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 // @@ -1590,154 +1554,156 @@ main.asm(294): Including file 'div16u.asm' ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: -0001bf 94f8 cli -0001c0 935f push r21 -0001c1 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный +0001d7 94f8 cli +0001d8 935f push r21 +0001d9 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный ; инициализация указателя (за каждый проход цикла будет инкрементироваться) -0001c2 e6a3 ldi XL, LOW(DIGITS) -0001c3 e0b0 ldi XH, HIGH(DIGITS) +0001da e6a3 ldi XL, LOW(DIGITS) +0001db e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого -0001c4 9380 0061 sts dividend, DISP_NUM_L -0001c6 9390 0062 sts dividend+1, DISP_NUM_H +0001dc 9380 0061 sts dividend, DISP_NUM_L +0001de 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры -0001c8 9100 0061 lds dd16uL, dividend -0001ca 9110 0062 lds dd16uH, dividend+1 -0001cc e02a ldi dv16uL, LOW(divisor) -0001cd e030 ldi dv16uH, HIGH(divisor) +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) -0001ce defb rcall div16u ; делим +0001e6 deda rcall div16u ; делим -0001cf 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его +0001e7 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое -0001d0 9300 0061 sts dividend, dres16uL -0001d2 9310 0062 sts dividend+1, dres16uH +0001e8 9300 0061 sts dividend, dres16uL +0001ea 9310 0062 sts dividend+1, dres16uH -0001d4 955a dec r21 ; декрементируем счетчик цикла -0001d5 f791 brne DIV_LOOP ; делим еще раз если не 0 -0001d6 915f pop r21 -0001d7 9478 sei -0001d8 9508 ret +0001ec 955a dec r21 ; декрементируем счетчик цикла +0001ed f791 brne DIV_LOOP ; делим еще раз если не 0 +0001ee 915f pop r21 +0001ef 9478 sei +0001f0 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: -0001d9 930f push r16 -0001da 931f push r17 -0001db e3e0 ldi ZL, LOW(2*DISPLAY_SYMBOLS) -0001dc e0f4 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) +0001f1 930f push r16 +0001f2 931f push r17 +0001f3 e6e0 ldi ZL, LOW(2*DISPLAY_SYMBOLS) +0001f4 e0f4 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) -0001dd 2711 clr TEMP_REG_B -0001de 0fe0 add ZL, TEMP_REG_A -0001df 1ff1 adc ZH, TEMP_REG_B +0001f5 2711 clr TEMP_REG_B +0001f6 0fe0 add ZL, TEMP_REG_A +0001f7 1ff1 adc ZH, TEMP_REG_B -0001e0 9004 lpm r0, Z -0001e1 911f pop r17 -0001e2 910f pop r16 -0001e3 9508 ret// +0001f8 9004 lpm r0, Z +0001f9 911f pop r17 +0001fa 910f pop r16 +0001fb 9508 ret// // BEEP_SHORT: -0001e4 9ac5 sbi BUZZER_PORT, BUZZER_PIN -0001e5 d022 rcall DELAY -0001e6 98c5 cbi BUZZER_PORT, BUZZER_PIN -0001e7 9508 ret +0001fc 9ac5 sbi BUZZER_PORT, BUZZER_PIN +0001fd d022 rcall DELAY +0001fe 98c5 cbi BUZZER_PORT, BUZZER_PIN +0001ff 9508 ret // // BEEP_LONG: -0001e8 9ac5 sbi BUZZER_PORT, BUZZER_PIN -0001e9 d01e rcall DELAY -0001ea d01d rcall DELAY -0001eb d01c rcall DELAY -0001ec d01b rcall DELAY -0001ed 98c5 cbi BUZZER_PORT, BUZZER_PIN -0001ee 9508 ret// +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// // DEBOUNCE_SW: -0001ef 930f push r16 -0001f0 931f push r17 -0001f1 932f push r18 +000207 930f push r16 +000208 931f push r17 +000209 932f push r18 -0001f2 e02a ldi r18, 10 +00020a e02a ldi r18, 10 _loop_2: -0001f3 ef1f ldi r17, 255 +00020b ef1f ldi r17, 255 _loop_0: -0001f4 ef0f ldi r16, 255 +00020c ef0f ldi r16, 255 _dec_0: -0001f5 950a dec r16 -0001f6 f7f1 brne _dec_0 +00020d 950a dec r16 +00020e f7f1 brne _dec_0 _loop_1: -0001f7 951a dec r17 -0001f8 f7d9 brne _loop_0 +00020f 951a dec r17 +000210 f7d9 brne _loop_0 _loop_3: -0001f9 952a dec r18 -0001fa f7c1 brne _loop_2 +000211 952a dec r18 +000212 f7c1 brne _loop_2 -0001fb 912f pop r18 -0001fc 911f pop r17 -0001fd 910f pop r16 -0001fe 9508 ret// +000213 912f pop r18 +000214 911f pop r17 +000215 910f pop r16 +000216 9508 ret// // DELAY_LOOP_16: -0001ff 5041 subi DELAY_8_r, 1 -000200 4030 sbci DELAY_16_r, 0 -000201 f7e8 brcc DELAY_LOOP_16 -000202 9508 ret +000217 5041 subi DELAY_8_r, 1 +000218 4030 sbci DELAY_16_r, 0 +000219 f7e8 brcc DELAY_LOOP_16 +00021a 9508 ret // + // DELAY_LOOP_24: -000203 5041 subi DELAY_8_r, 1 -000204 4030 sbci DELAY_16_r, 0 -000205 4050 sbci DELAY_24_r, 0 -000206 f7e0 brcc DELAY_LOOP_24 -000207 9508 ret +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 + // // DELAY: -000208 930f push r16 -000209 931f push r17 -00020a 932f push r18 +000220 930f push r16 +000221 931f push r17 +000222 932f push r18 -00020b e026 ldi r18, 6 +000223 e026 ldi r18, 6 _DELAY_0: -00020c ef0f ldi r16, 255 +000224 ef0f ldi r16, 255 _DELAY_1: -00020d ef1f ldi r17, 255 +000225 ef1f ldi r17, 255 _DELAY_2: -00020e 951a dec r17 -00020f f7f1 brne _DELAY_2 +000226 951a dec r17 +000227 f7f1 brne _DELAY_2 -000210 950a dec r16 -000211 f7d9 brne _DELAY_1 -000212 952a dec r18 -000213 f7c1 brne _DELAY_0 +000228 950a dec r16 +000229 f7d9 brne _DELAY_1 +00022a 952a dec r18 +00022b f7c1 brne _DELAY_0 -000214 912f pop r18 -000215 911f pop r17 -000216 910f pop r16 -000217 9508 ret // +00022c 912f pop r18 +00022d 911f pop r17 +00022e 910f pop r16 +00022f 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA -000218 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 -000219 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 -00021a 9299 .DB 0b10011001, 0b10010010 ; 4, 5 -00021b f882 .DB 0b10000010, 0b11111000 ; 6, 7 -00021c 9080 .DB 0b10000000, 0b10010000 ; 8, 9 -00021d bf9c .DB 0b10011100, 0b10111111 ; °, -// +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 ; °, -// // @@ -1764,37 +1730,37 @@ counted separately from r26..r31 here. "ATtiny2313A" register use summary: x : 2 y : 0 z : 1 r0 : 4 r1 : 2 r2 : 0 r3 : 0 r4 : 0 -r5 : 0 r6 : 0 r7 : 0 r8 : 7 r9 : 0 r10: 0 r11: 0 r12: 0 -r13: 0 r14: 5 r15: 5 r16: 112 r17: 52 r18: 30 r19: 41 r20: 34 -r21: 11 r22: 0 r23: 2 r24: 5 r25: 3 r26: 4 r27: 4 r28: 0 +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 r29: 0 r30: 2 r31: 2 -Registers used: 20 out of 35 (57.1%) +Registers used: 21 out of 35 (60.0%) "ATtiny2313A" instruction use summary: .lds : 0 .sts : 0 adc : 3 add : 4 adiw : 1 and : 0 andi : 1 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0 -brcc : 4 brcs : 1 break : 0 breq : 4 brge : 1 brhc : 0 +brcc : 4 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 : 1 brvc : 0 -brvs : 0 bset : 0 bst : 0 cbi : 23 cbr : 3 clc : 1 +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 : 0 cpc : 0 cpi : 11 -cpse : 0 dec : 11 eor : 0 icall : 0 ijmp : 0 in : 2 -inc : 1 ld : 0 ldd : 0 ldi : 82 lds : 17 lpm : 2 -lsl : 4 lsr : 10 mov : 13 movw : 0 neg : 1 nop : 0 -or : 1 ori : 0 out : 15 pop : 33 push : 32 rcall : 50 -ret : 20 reti : 3 rjmp : 21 rol : 4 ror : 4 sbc : 1 -sbci : 3 sbi : 12 sbic : 3 sbis : 5 sbiw : 1 sbr : 2 +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 ser : 0 ses : 0 set : 1 sev : 0 sez : 0 sleep : 0 -spm : 0 st : 2 std : 0 sts : 25 sub : 2 subi : 2 -swap : 0 tst : 1 wdr : 0 -Instructions used: 54 out of 105 (51.4%) +spm : 0 st : 2 std : 0 sts : 21 sub : 2 subi : 2 +swap : 0 tst : 2 wdr : 0 +Instructions used: 55 out of 105 (52.4%) "ATtiny2313A" memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- -[.cseg] 0x000000 0x00043c 1050 12 1062 2048 51.9% +[.cseg] 0x000000 0x00046c 1098 12 1110 2048 54.2% [.dseg] 0x000060 0x000071 0 17 17 128 13.3% [.eseg] 0x000000 0x000000 0 0 0 128 0.0% diff --git a/dist/default/production/attiny2313a_thermostat.X.production.map b/dist/default/production/attiny2313a_thermostat.X.production.map index c953aa9..5b2bece 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 Sat Jun 24 17:26:02 2023 +AVRASM ver. 2.2.7 main.asm Sun Jun 25 15:01:25 2023 EQU SIGNATURE_000 0000001e @@ -526,9 +526,9 @@ EQU UART_TX_PIN 00000001 EQU MCU_STATE_DEFAULT 00000000 EQU MCU_STATE_PROGRAM 00000001 EQU MCU_STATE_ERROR 00000002 -EQU DEFAULT_SETTING_INT 0000001d +EQU DEFAULT_SETTING_INT 00000000 EQU DEFAULT_SETTING_F 00000005 -EQU DEFAULT_SETTING_HYST 00000005 +EQU DEFAULT_SETTING_HYST 0000000f EQU HEAT_MODE 00000001 EQU COOLING_MODE 00000000 EQU DEFAULT_SETTING_MODE 00000001 @@ -553,25 +553,25 @@ CSEG _INTO_PROGRAM_STATE 0000001a CSEG _CLR_CURRENT_DIGIT 0000002d CSEG _indicate_1 00000030 CSEG _indicate_2 00000042 -CSEG DISPLAY_DECODER 000001d9 -CSEG USI_TRANSMIT 00000155 +CSEG DISPLAY_DECODER 000001f1 +CSEG USI_TRANSMIT 0000016d CSEG _indicate_3 00000054 CSEG _indicate_4 00000061 CSEG _indicate_exit 0000006b CSEG MCU_INIT 00000076 -CSEG RD_F_CODE 000000f1 +CSEG RD_F_CODE 0000010f CSEG ERR_FAMILY_CODE 000000a6 CSEG START_PROGRAM 000000ab -CSEG BEEP_LONG 000001e8 -CSEG BEEP_SHORT 000001e4 +CSEG BEEP_LONG 00000200 +CSEG BEEP_SHORT 000001fc CSEG LOOP 000000ae CSEG _STATE_DEFAULT 000000b0 CSEG _STATE_PROGRAM 000000b8 -CSEG DISPLAY_UPD_DIGITS 000001bf -CSEG TEMP_UPD 000000de -CSEG TEMP_COMPARSION 000000dd +CSEG DISPLAY_UPD_DIGITS 000001d7 +CSEG TEMP_UPD 000000fc +CSEG TEMP_COMPARSION 000000d4 CSEG _STATE_ERROR 000000bd -CSEG SW_CHECK_PROCESS 00000161 +CSEG SW_CHECK_PROCESS 00000179 DEF drem16uL r14 DEF drem16uH r15 DEF dres16uL r16 @@ -581,42 +581,45 @@ DEF dd16uH r17 DEF dv16uL r18 DEF dv16uH r19 DEF dcnt16u r20 -CSEG div16u 000000ca -CSEG d16u_1 000000cd -CSEG d16u_2 000000d2 -CSEG d16u_3 000000db -CSEG TEMP_CONV 0000014b -CSEG DELAY_LOOP_24 00000203 -CSEG TEMP_RD 00000101 -CSEG OW_PRESENCE 0000016f -CSEG OW_SEND_BYTE 00000184 -CSEG _RD_L 000000fc -CSEG OW_RD_BYTE 000001a5 -CSEG _TEMP_RD_TO_UNSIGNED 0000011d -CSEG _TEMP_RD_CONTINUE 00000126 -CSEG _TEMP_RD_END 0000012f -CSEG _USI_TRANSMIT_LOOP 0000015a -CSEG DEBOUNCE_SW 000001ef -CSEG _INTO_DEFAULT_STATE 0000016a -CSEG _SW_CHECK_PROCESS_END 0000016d -CSEG DELAY_LOOP_16 000001ff -CSEG OW_CHECK_PRESENCE 0000017e -CSEG _EXIT 00000183 -CSEG _OW_SEND_BYTE_LOOP 00000188 -CSEG _OW_SEND_0 0000018b -CSEG _OW_SEND_1 00000196 -CSEG _OW_SEND_BYTE_END 000001a0 -CSEG _OW_RD_BYTE_LP 000001aa +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 EQU dividend 00000061 EQU divisor 0000000a -CSEG DIV_LOOP 000001c8 -CSEG DISPLAY_SYMBOLS 00000218 -CSEG DELAY 00000208 -CSEG _loop_2 000001f3 -CSEG _loop_0 000001f4 -CSEG _dec_0 000001f5 -CSEG _loop_1 000001f7 -CSEG _loop_3 000001f9 -CSEG _DELAY_0 0000020c -CSEG _DELAY_1 0000020d -CSEG _DELAY_2 0000020e +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 diff --git a/dist/default/production/attiny2313a_thermostat.X.production.obj b/dist/default/production/attiny2313a_thermostat.X.production.obj index 8f610be..32d19ae 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 f57d47f..2de4587 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.tmp +++ b/dist/default/production/attiny2313a_thermostat.X.production.tmp @@ -45,61 +45,64 @@ <_CLR_CURRENT_DIGIT>main.asm106 <_indicate_1>main.asm110 <_indicate_2>main.asm130 - main.asm710 - main.asm523 + main.asm674 + main.asm487 <_indicate_3>main.asm148 <_indicate_4>main.asm164 <_indicate_exit>main.asm176 main.asm195 - main.asm386 + main.asm359 main.asm247 main.asm252 - main.asm734 - main.asm726 + main.asm698 + main.asm690 main.asm261 <_STATE_DEFAULT>main.asm265 <_STATE_PROGRAM>main.asm273 - main.asm669 - main.asm369 - main.asm296 + main.asm633 + main.asm342 + main.asm290 <_STATE_ERROR>main.asm279 - main.asm554 + main.asm518 div16u.asm32 div16u.asm36 div16u.asm42 div16u.asm52 - main.asm503 - main.asm777 - main.asm411 - main.asm578 - main.asm605 - <_RD_L>main.asm402 - main.asm638 - <_TEMP_RD_TO_UNSIGNED>main.asm446 - <_TEMP_RD_CONTINUE>main.asm457 - <_TEMP_RD_END>main.asm467 - <_USI_TRANSMIT_LOOP>main.asm541 - main.asm744 - <_INTO_DEFAULT_STATE>main.asm567 - <_SW_CHECK_PROCESS_END>main.asm570 - main.asm770 - main.asm594 - <_EXIT>main.asm600 - <_OW_SEND_BYTE_LOOP>main.asm610 - <_OW_SEND_0>main.asm614 - <_OW_SEND_1>main.asm622 - <_OW_SEND_BYTE_END>main.asm629 - <_OW_RD_BYTE_LP>main.asm644 - main.asm686 - main.asm810 - main.asm785 - <_loop_2>main.asm750 - <_loop_0>main.asm752 - <_dec_0>main.asm754 - <_loop_1>main.asm757 - <_loop_3>main.asm760 - <_DELAY_0>main.asm791 - <_DELAY_1>main.asm793 - <_DELAY_2>main.asm795 + <_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 diff --git a/main.asm b/main.asm index 8a28489..8fb3ff7 100644 --- a/main.asm +++ b/main.asm @@ -240,7 +240,7 @@ MCU_INIT: rcall RD_F_CODE ; проверяем что датчик есть на шине lds r16, DEVICE_FAMILY_CODE - cpi r16, 0x10 + cpi r16, 0x28 ; код семейства для DS18B20 = 0x28 brne ERR_FAMILY_CODE rjmp START_PROGRAM @@ -280,12 +280,6 @@ _STATE_ERROR: cpi r16, MCU_STATE_ERROR brne LOOP sbi LED_ERR_PORT, LED_ERR_PIN - ldi r17, 11 - sts DIGITS, r17 - sts DIGITS+1, r17 - sts DIGITS+2, r17 - sts DIGITS+3, r17 - rjmp LOOP // @@ -294,75 +288,54 @@ _STATE_ERROR: .INCLUDE "div16u.asm" TEMP_COMPARSION: -; push r16 -; push r17 -; push r18 -; push r19 -; push r20 -; push r21 -; push r22 -; -; lds r16, TEMP_L -; lds r17, TEMP_H // всегда 0? -; lds r18, TEMP_F + push r16 + push r17 + push r18 + push r19 + push r20 + push r21 + push r22 + + lds r16, TEMP_L + lds r17, TEMP_H // всегда 0? + lds r18, TEMP_F ; lds r19, SETTING_INT ; lds r20, SETTING_F -; lds r21, SETTING_MODE -; -; brtc _START_COMPARSION -; neg r19 -; -;_START_COMPARSION: -; tst r21 -; brne _HEATING -;_COOLING: -; rjmp _COMPARSION_EXIT -;_HEATING: -; cp r16, r19 -; brge _HEATING_GREATER_OR_E ; если целая часть текущей температуры <= уставки - продолжаем сравнение -; brtc PC+3 -; relay_off -; rjmp PC+2 -; relay_on ; c -; rjmp _COMPARSION_EXIT -;_HEATING_GREATER_OR_E: -; cp r16, r19 -; breq _HEATING_GREATER_E -; brtc PC+3 -; relay_on -; rjmp PC+2 -; relay_off ; c -; rjmp _COMPARSION_EXIT -;_HEATING_GREATER_E: -; brtc PC+3 -; relay_off -; rjmp PC+2 -; relay_on ; c -; cp r18, r20 -; brge PC+2 ; если дробная часть текущей температуры >= уставки - выключаем реле -; rjmp _COMPARSION_EXIT -;_HEATING_GREATER_OR_E_F: -; cp r18, r20 -; breq _HEATING_GREATER_E_F -; brtc PC+3 -; relay_on -; rjmp PC+2 -; relay_off ; c -; rjmp _COMPARSION_EXIT -;_HEATING_GREATER_E_F: -; brtc PC+3 -; relay_on -; rjmp PC+2 -; relay_off ; c -; -;_COMPARSION_EXIT: -; pop r22 -; pop r21 -; pop r20 -; pop r19 -; pop r18 -; pop r17 -; pop r16 + + + + ldi r19, 28 ; min + ldi r20, 32 ; max + lds r21, SETTING_MODE ; mode + + brts PC+2 + rjmp PC+2 + neg r16 + + tst r21 + brne _HEATING_MODE + rjmp _COMPARSION_EXIT + +_HEATING_MODE: + cp r19, r16 + brge _HEATING_ON ; TEMP <= MIN + rjmp _HEATING_OFF +_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 r22 + pop r21 + pop r20 + pop r19 + pop r18 + pop r17 + pop r16 ret // @@ -387,22 +360,13 @@ RD_F_CODE: push r16 rcall OW_PRESENCE - ldi r16, DS18B20_CMD_SKIPROM + ldi r16, DS18B20_CMD_READROM mov OW_CMD_r, r16 rcall OW_SEND_BYTE - - ldi r16, DS18B20_CMD_RSCRATCHPAD - mov OW_CMD_r, r16 - rcall OW_SEND_BYTE - + ldi XL, LOW(DEVICE_FAMILY_CODE) ldi XH, HIGH(DEVICE_FAMILY_CODE) - - ldi r16, 8 -_RD_L: rcall OW_RD_BYTE - dec r16 - brne _RD_L pop r16 ret// @@ -774,12 +738,14 @@ DELAY_LOOP_16: ret // +// DELAY_LOOP_24: subi DELAY_8_r, 1 sbci DELAY_16_r, 0 sbci DELAY_24_r, 0 brcc DELAY_LOOP_24 ret +// // DELAY: