From 482bb3794c2c3e80113491774cf221eef2794d60 Mon Sep 17 00:00:00 2001 From: sergeyyarkov Date: Mon, 26 Jun 2023 12:30:38 +0300 Subject: [PATCH] send data to uart --- NOTES.md | 1 - .../attiny2313a_thermostat.X.production.hex | 140 +-- .../attiny2313a_thermostat.X.production.lss | 1092 +++++++++-------- .../attiny2313a_thermostat.X.production.map | 132 +- .../attiny2313a_thermostat.X.production.obj | Bin 5824 -> 6031 bytes .../attiny2313a_thermostat.X.production.tmp | 100 +- main.asm | 97 +- main.hex | 126 +- 8 files changed, 890 insertions(+), 798 deletions(-) diff --git a/NOTES.md b/NOTES.md index e03e012..21cffd9 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1,7 +1,6 @@ ОСНОВНОЕ: -- сделать подпрограмму, которая будет проверять текущую температуру с уставкой учитывая гистерезис - сделать подпрограмму, которя будет опрашивать кнопки и в зависимости от нажатия переключють состояние программы - сделать программу, которая будет сохранять уставку температуры и гистерезис в EEPROM (перед инициализации МК необходимо чтобы данные брались из EEPROM и записывались в соответствующие ячейки) diff --git a/dist/default/production/attiny2313a_thermostat.X.production.hex b/dist/default/production/attiny2313a_thermostat.X.production.hex index 4e1ffa5..bdbddf4 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.hex +++ b/dist/default/production/attiny2313a_thermostat.X.production.hex @@ -7,77 +7,79 @@ :10004A000F931F935FB74091670045300CF403C0CC :10005A00442740936700403081F493989498959888 :10006A000EF002C00BE002C000916500002311F0FF -:10007A00929A01C09298F8D173D1413081F4929842 +:10007A00929A01C092980FD28CD1413081F4929811 :10008A00949895980091640030916500032B11F0C3 -:10009A00939A01C0939800916400E6D161D14230ED -:1000AA0059F4929893989598949A00916300DCD1A8 -:1000BA00002D0F77002E54D1433041F49298939833 -:1000CA009498959A00916B00CFD14AD14395409369 +:10009A00939A01C0939800916400FDD17AD14230BD +:1000AA0059F4929893989598949A00916300F3D191 +:1000BA00002D0F77002E6DD1433041F4929893981A +:1000CA009498959A00916B00E6D163D14395409339 :1000DA0067005FBF1F910F915F914F9118950FEDC8 :1000EA000DBF0FE701BB01EE07BB0CE108BB02E045 :1000FA0000BF05E003BF09E106BF00E20BBF0CE148 -:10010A0000BD11241092670000E0009360000CE229 -:10011A0000936D0001E000936C0005E000936E000F -:10012A0001E000936F0000270093690000936A00C2 -:10013A0000EF00936B00B6D000917000083209F40A -:10014A0005C012E0109360009ED101C098D180E0F2 -:10015A0090E000916000003031F496986BD18FD016 -:10016A0001E009BF39D0013019F4969863D104D15E -:10017A00023079F7969AEDCFEE24FF1841E1001F7D -:10018A00111F4A9509F40895EE1CFF1CE21AF30A9E -:10019A0020F4E20EF31E8894F2CF0894F0CFFF18F1 -:1001AA0029E0001F2A9509F40895FF1CF11A18F492 -:1001BA00F10E8894F6CF0894F4CF5527442760E1CE -:1001CA003695279510F4400F511F57954795379547 -:1001DA0027956A95B9F708950F931F932F933F9325 -:1001EA004F935F936F937F930091690010916A0018 -:1001FA002AE030E0E2DF022F132F20916B00332731 -:10020A00020F131F109371000093720040916D004A -:10021A0050916C0060916E004F935F937727461B55 -:10022A00570BB42EA52E5F914F917727460F571F74 -:10023A00D42EC52E0EF004C0009510950F5F1F4FE7 -:10024A00B016A10624F40D151C054CF40FC04091FC -:10025A006F00442311F4909801C0909A07C040910E -:10026A006F00442311F4909A01C090987F916F9186 -:10027A005F914F913F912F911F910F9108951F9375 -:10028A0065D05CE034E34DEF19D15CE034E34DEF27 -:10029A0015D112D010916900812F10916A00912F07 -:1002AA001F9108950F9376D003E3802E88D0A0E79C -:1002BA00B0E0A6D00F9108950F931F932F933F9309 -:1002CA004F9368D00CEC802E7AD00EEB802E77D02C -:1002DA00A9E6B0E095D0AAE6B0E092D01091690004 -:1002EA0020916A002F93287F283F11F0E89409C0D3 -:1002FA002F9168941095209531E0130F30E0231F59 -:10030A0001C02F912695179526951795269517952D -:10031A0026951795309169000EF43195432F3F7059 -:10032A00432F330F330F330F440F340F369536955F -:10033A00369536951093690020936A0030936B00C6 -:10034A004F913F912F911F910F9108950F9322D0B2 -:10035A000CEC802E34D004E4802E31D00F91089515 -:10036A000F930FB800E40EB90BE10DB9769BFDCFE0 -:10037A00C09AC0980F9108950F938CD0B29B0196A2 -:10038A00B39B0197B49B01C003C000E000936000D7 -:10039A000F910895F894B99A33E04EEB8BD0B9983F -:1003AA0030E04AE887D005D033E042E383D078943E -:1003BA000895B19B716002C0B1997E7F08950F9331 -:1003CA001F93082D18E0069508F458F0F894B99A86 -:1003DA0030E046E76FD0B99830E042E16BD07894CC -:1003EA000AC0F894B99A30E04AE064D0B99830E08B -:1003FA004EE760D078941A9531F71F910F910895BE -:10040A000F931F93002718E0F8940695B99A30E0E5 -:10041A004AE050D0B99830E040E14CD0B199006838 -:10042A0030E04CE647D01A9581F70C9378941F91E7 -:10043A000F910895F8945F9354E0A3E6B0E0809397 -:10044A0061009093620000916100109162002AE0BD -:10045A0030E092DEED9200936100109362005A95AB -:10046A0091F75F91789408950F931F93E0EFF4E06A -:10047A001127E00FF11F04901F910F910895C59A5B -:10048A0022D0C5980895C59A1ED01DD01CD01BD065 -:10049A00C59808950F931F932F932AE01FEF0FEF2C -:1004AA000A95F1F71A95D9F72A95C1F72F911F9155 -:1004BA000F91089541503040E8F708954150304077 -:1004CA005040E0F708950F931F932F9326E00FEF04 -:1004DA001FEF1A95F1F70A95D9F72A95C1F72F91C7 -:1004EA001F910F910895C0F9A4B0999282F8809053 -:0204FA009CBFA5 +:10010A0000BD03E309B900E002B908E00AB906E054 +:10011A0003B911241092670000E0009360000CE21A +:10012A0000936D0001E000936C0005E000936E00FF +:10013A0001E000936F0000270093690000936A00B2 +:10014A0000EF00936B00C5D000917000083209F4EB +:10015A0005C012E010936000ADD101C0A7D180E0C4 +:10016A0090E000916000003039F496987AD1A2D0DC +:10017A0001E009BF50D039D0013019F4969871D1F5 +:10018A0014D1023071F7969AECCFEE24FF1841E1B0 +:10019A00001F111F4A9509F40895EE1CFF1CE21A6C +:1001AA00F30A20F4E20EF31E8894F2CF0894F0CFFB +:1001BA00FF1829E0001F2A9509F40895FF1CF11A77 +:1001CA0018F4F10E8894F6CF0894F4CF55274427F3 +:1001DA0060E13695279510F4400F511F57954795C2 +:1001EA00379527956A95B9F708950F930091690095 +:1001FA00502E0DD000916B00502E09D000B3017023 +:10020A00502E05D004E0502E02D00F9108955D9B28 +:10021A00FECF5CB808950F931F932F933F934F938C +:10022A005F930091690010916A002AE030E0CEDF06 +:10023A00022F132F20916B003327020F131F1093E5 +:10024A0071000093720040916D0050916C006091B2 +:10025A006E004F935F937727461B570BB42EA52E3C +:10026A005F914F917727460F571FD42EC52E0EF058 +:10027A0004C0009510950F5F1F4FB016A10624F415 +:10028A000D151C054CF40FC040916F00442311F466 +:10029A00909801C0909A07C040916F00442311F4CE +:1002AA00909A01C090985F914F913F912F911F9121 +:1002BA000F9108951F9361D053E137E84DEF15D19F +:1002CA0012D010916900812F10916A00912F1F910D +:1002DA0008950F9378D003E3802E8AD0A0E7B0E088 +:1002EA00A6D00F9108950F931F932F933F934F9387 +:1002FA006AD070FF3CC00CEC802E7AD00EEB802EB8 +:10030A0077D0A9E6B0E093D0AAE6B0E090D01091F9 +:10031A00690020916A002F93287F283F11F0E89402 +:10032A0007C02F916894109520951F5F2F4F01C029 +:10033A002F91269517952695179526951795269503 +:10034A001795309169000EF43195432F3F70432F72 +:10035A00330F330F330F440F340F369536953695D6 +:10036A0036951093690020936A0030936B004F9181 +:10037A003F912F911F910F9108950F9324D070FFF1 +:10038A0006C00CEC802E34D004E4802E31D00F91BC +:10039A0008950F930FB800E40EB90BE10DB9769BDF +:1003AA00FDCFC09AC0980F9108950F938AD0B29B3F +:1003BA000196B39B0197B49B01C003C000E0009370 +:1003CA0060000F910895F894B99A33E04EEB89D002 +:1003DA00B99830E04AE885D005D033E042E381D0CD +:1003EA0078940895B19B716002C0B1997E7F089597 +:1003FA000F931F93F894082D18E0069508F448F017 +:10040A00B99A30E046E76DD0B99830E042E169D058 +:10041A0008C0B99A30E04AE064D0B99830E04EE7B3 +:10042A0060D01A9551F778941F910F9108950F9300 +:10043A001F93F894002718E00695B99A30E04AE02D +:10044A0050D0B99830E040E14CD0B199006830E022 +:10045A004CE647D01A9581F70C9378941F910F9127 +:10046A000895F8945F9354E0A3E6B0E080936100A6 +:10047A009093620000916100109162002AE030E0DE +:10048A0084DEED9200936100109362005A9591F711 +:10049A005F91789408950F931F93EEE1F5E0112789 +:1004AA00E00FF11F04901F910F910895C59A22D071 +:1004BA00C5980895C59A1ED01DD01CD01BD0C598CA +:1004CA0008950F931F932F932AE01FEF0FEF0A95BA +:1004DA00F1F71A95D9F72A95C1F72F911F910F9124 +:1004EA00089541503040E8F7089541503040504057 +:1004FA00E0F708950F931F932F9326E00FEF1FEF56 +:10050A001A95F1F70A95D9F72A95C1F72F911F91F4 +:10051A000F910895C0F9A4B0999282F880909CBF77 :00000001FF diff --git a/dist/default/production/attiny2313a_thermostat.X.production.lss b/dist/default/production/attiny2313a_thermostat.X.production.lss index f764186..826590b 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.lss +++ b/dist/default/production/attiny2313a_thermostat.X.production.lss @@ -1,58 +1,58 @@ -AVRASM ver. 2.2.7 main.asm Mon Jun 26 09:43:03 2023 +AVRASM ver. 2.2.7 main.asm Mon Jun 26 12:19:45 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(295): 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(295): '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(295): '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(295): '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(295): '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(295): '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(295): Including file 'div8u.asm' +main.asm(295): 'div16u.asm' included form here +main.asm(296): Including file 'div8u.asm' div8u.asm(18): warning: Register r15 already defined by the .DEF directive -main.asm(295): 'div8u.asm' included form here +main.asm(296): '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 +main.asm(296): '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 +main.asm(296): '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 +main.asm(296): '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' +main.asm(296): 'div8u.asm' included form here +main.asm(297): Including file 'mpy16u.asm' mpy16u.asm(19): warning: Register r16 already defined by the .DEF directive -main.asm(296): 'mpy16u.asm' included form here +main.asm(297): '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 +main.asm(297): '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 +main.asm(297): '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 +main.asm(297): '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 +main.asm(297): '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 +main.asm(297): '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 +main.asm(297): '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 +main.asm(297): 'mpy16u.asm' included form here +main.asm(352): warning: Register r16 already defined by the .DEF directive +main.asm(353): 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(294): Including file 'div16u.asm' -main.asm(295): Including file 'div8u.asm' -main.asm(296): Including file 'mpy16u.asm' +main.asm(295): Including file 'div16u.asm' +main.asm(296): Including file 'div8u.asm' +main.asm(297): Including file 'mpy16u.asm' ; @@ -995,8 +995,8 @@ main.asm(296): Including file 'mpy16u.asm' 00003d 9a92 sbi PORTD, DIGIT_1_PIN 00003e c001 rjmp PC+2 00003f 9892 cbi PORTD, DIGIT_1_PIN -000040 d1f8 rcall DISPLAY_DECODER -000041 d173 rcall USI_TRANSMIT +000040 d20f rcall DISPLAY_DECODER +000041 d18c rcall USI_TRANSMIT _indicate_2: 000042 3041 cpi r20, 1 @@ -1013,8 +1013,8 @@ main.asm(296): Including file 'mpy16u.asm' 00004e c001 rjmp PC+2 00004f 9893 cbi PORTD, DIGIT_2_PIN 000050 9100 0064 lds TEMP_REG_A, DIGITS+1 -000052 d1e6 rcall DISPLAY_DECODER -000053 d161 rcall USI_TRANSMIT +000052 d1fd rcall DISPLAY_DECODER +000053 d17a rcall USI_TRANSMIT _indicate_3: 000054 3042 cpi r20, 2 @@ -1025,12 +1025,12 @@ main.asm(296): Including file 'mpy16u.asm' 000058 9895 cbi PORTD, DIGIT_4_PIN 000059 9a94 sbi PORTD, DIGIT_3_PIN 00005a 9100 0063 lds TEMP_REG_A, DIGITS -00005c d1dc rcall DISPLAY_DECODER +00005c d1f3 rcall DISPLAY_DECODER ; зажигаем точку 00005d 2d00 mov r16, r0 00005e 770f cbr r16, (1<<7) 00005f 2e00 mov r0, r16 -000060 d154 rcall USI_TRANSMIT +000060 d16d rcall USI_TRANSMIT _indicate_4: 000061 3043 cpi r20, 3 @@ -1041,8 +1041,8 @@ main.asm(296): Including file 'mpy16u.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 d1cf rcall DISPLAY_DECODER -00006a d14a rcall USI_TRANSMIT +000069 d1e6 rcall DISPLAY_DECODER +00006a d163 rcall USI_TRANSMIT _indicate_exit: 00006b 9543 inc r20 @@ -1087,55 +1087,59 @@ main.asm(296): Including file 'mpy16u.asm' 000085 bd00 outi r16, PCMSK0, (1< @@ -1144,28 +1148,29 @@ main.asm(296): Including file 'mpy16u.asm' ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** LOOP: ; rcall DISPLAY_UPD_DIGITS -0000ae 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК +0000b6 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК _STATE_DEFAULT: -0000b0 3000 cpi r16, MCU_STATE_DEFAULT -0000b1 f431 brne _STATE_PROGRAM -0000b2 9896 cbi LED_ERR_PORT, LED_ERR_PIN -0000b3 d16b rcall DISPLAY_UPD_DIGITS -0000b4 d08f rcall TEMP_UPD -0000b5 e001 -0000b6 bf09 outi r16, TIMSK, (1< @@ -1203,29 +1208,29 @@ main.asm(296): Including file 'mpy16u.asm' ;***** Code div16u: -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 +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 d16u_1: -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 +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 d16u_2: -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 +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 d16u_3: -0000d2 9408 sec ; set carry to be shifted into result +0000db 9408 sec ; set carry to be shifted into result .INCLUDE "div8u.asm" -0000d3 cff0 +0000dc cff0 ;* ;* "div8u" - 8/8 Bit Unsigned Division ;* @@ -1250,21 +1255,21 @@ main.asm(296): Including file 'mpy16u.asm' ;***** Code -0000d4 18ff div8u: sub drem8u,drem8u ;clear remainder and carry -0000d5 e029 ldi dcnt8u,9 ;init loop counter -0000d6 1f00 d8u_1: rol dd8u ;shift left dividend -0000d7 952a dec dcnt8u ;decrement counter -0000d8 f409 brne d8u_2 ;if done -0000d9 9508 ret ; return -0000da 1cff d8u_2: rol drem8u ;shift dividend into remainder -0000db 1af1 sub drem8u,dv8u ;remainder = remainder - divisor -0000dc f418 brcc d8u_3 ;if result negative -0000dd 0ef1 add drem8u,dv8u ; restore remainder -0000de 9488 clc ; clear carry to be shifted into result -0000df cff6 rjmp d8u_1 ;else -0000e0 9408 d8u_3: sec ; set carry to be shifted into result +0000dd 18ff div8u: sub drem8u,drem8u ;clear remainder and carry +0000de e029 ldi dcnt8u,9 ;init loop counter +0000df 1f00 d8u_1: rol dd8u ;shift left dividend +0000e0 952a dec dcnt8u ;decrement counter +0000e1 f409 brne d8u_2 ;if done +0000e2 9508 ret ; return +0000e3 1cff d8u_2: rol drem8u ;shift dividend into remainder +0000e4 1af1 sub drem8u,dv8u ;remainder = remainder - divisor +0000e5 f418 brcc d8u_3 ;if result negative +0000e6 0ef1 add drem8u,dv8u ; restore remainder +0000e7 9488 clc ; clear carry to be shifted into result +0000e8 cff6 rjmp d8u_1 ;else +0000e9 9408 d8u_3: sec ; set carry to be shifted into result .INCLUDE "mpy16u.asm" -0000e1 cff4 +0000ea cff4 ;* ;* "mpy16u" - 16x16 Bit Unsigned Multiplication ;* @@ -1294,31 +1299,64 @@ main.asm(296): Including file 'mpy16u.asm' ;***** Code -0000e2 2755 mpy16u: clr m16u3 ;clear 2 highest bytes of result -0000e3 2744 clr m16u2 -0000e4 e160 ldi mcnt16u,16 ;init loop counter -0000e5 9536 lsr mp16uH -0000e6 9527 ror mp16uL +0000eb 2755 mpy16u: clr m16u3 ;clear 2 highest bytes of result +0000ec 2744 clr m16u2 +0000ed e160 ldi mcnt16u,16 ;init loop counter +0000ee 9536 lsr mp16uH +0000ef 9527 ror mp16uL -0000e7 f410 m16u_1: brcc noad8 ;if bit 0 of multiplier set -0000e8 0f40 add m16u2,mc16uL ;add multiplicand Low to byte 2 of res -0000e9 1f51 adc m16u3,mc16uH ;add multiplicand high to byte 3 of res -0000ea 9557 noad8: ror m16u3 ;shift right result byte 3 -0000eb 9547 ror m16u2 ;rotate right result byte 2 -0000ec 9537 ror m16u1 ;rotate result byte 1 and multiplier High -0000ed 9527 ror m16u0 ;rotate result byte 0 and multiplier Low -0000ee 956a dec mcnt16u ;decrement loop counter -0000ef f7b9 brne m16u_1 ;if not done, loop more -0000f0 9508 +0000f0 f410 m16u_1: brcc noad8 ;if bit 0 of multiplier set +0000f1 0f40 add m16u2,mc16uL ;add multiplicand Low to byte 2 of res +0000f2 1f51 adc m16u3,mc16uH ;add multiplicand high to byte 3 of res +0000f3 9557 noad8: ror m16u3 ;shift right result byte 3 +0000f4 9547 ror m16u2 ;rotate right result byte 2 +0000f5 9537 ror m16u1 ;rotate result byte 1 and multiplier High +0000f6 9527 ror m16u0 ;rotate result byte 0 and multiplier Low +0000f7 956a dec mcnt16u ;decrement loop counter +0000f8 f7b9 brne m16u_1 ;if not done, loop more +0000f9 9508 + // + TEMP_SEND_UART: +0000fa 930f push r16 + ; целая часть +0000fb 9100 0069 lds r16, TEMP_L +0000fd 2e50 mov r5, r16 +0000fe d00d rcall UART_WR_BYTE + + ; дробная часть +0000ff 9100 006b lds r16, TEMP_F +000101 2e50 mov r5, r16 +000102 d009 rcall UART_WR_BYTE + + ; состояние реле +000103 b300 in r16, PIND +000104 7001 andi r16, (1< + + // + UART_WR_BYTE: +00010c 9b5d sbis UCSRA, UDRE +00010d cffe rjmp UART_WR_BYTE +00010e b85c out UDR, r5 +00010f 9508 ret// + + // TEMP_COMPARSION: -0000f1 930f push r16 -0000f2 931f push r17 -0000f3 932f push r18 -0000f4 933f push r19 -0000f5 934f push r20 -0000f6 935f push r21 -0000f7 936f push r22 -0000f8 937f push r23 +000110 930f push r16 +000111 931f push r17 +000112 932f push r18 +000113 933f push r19 +000114 934f push r20 +000115 935f push r21 ; ; lds dd8u, SETTING_HYST ; ldi dv8u, 10 @@ -1339,246 +1377,250 @@ main.asm(296): Including file 'mpy16u.asm' .DEF max_r_trhd_l = r13 .DEF max_r_trhd_h = r12 ; умножаем температуру на 10 -0000f9 9100 0069 lds mc16uL, TEMP_L // r16 -0000fb 9110 006a lds mc16uH, TEMP_H // r17 -0000fd e02a ldi mp16uL, LOW(10) -0000fe e030 ldi mp16uH, HIGH(10) -0000ff dfe2 rcall mpy16u -000100 2f02 mov temp_r_l, m16u0 ; L -000101 2f13 mov temp_r_h, m16u1 ; H +000116 9100 0069 lds mc16uL, TEMP_L // r16 +000118 9110 006a lds mc16uH, TEMP_H // r17 +00011a e02a ldi mp16uL, LOW(10) +00011b e030 ldi mp16uH, HIGH(10) +00011c dfce rcall mpy16u +00011d 2f02 mov temp_r_l, m16u0 ; L +00011e 2f13 mov temp_r_h, m16u1 ; H ; добавляем дробную часть -000102 9120 006b lds r18, TEMP_F -000104 2733 clr r19 -000105 0f02 add temp_r_l, r18 -000106 1f13 adc temp_r_h, r19 -000107 9310 0071 sts SRAM_TEMP_2, temp_r_h -000109 9300 0072 sts SRAM_TEMP_3, temp_r_l +00011f 9120 006b lds r18, TEMP_F +000121 2733 clr r19 +000122 0f02 add temp_r_l, r18 +000123 1f13 adc temp_r_h, r19 +000124 9310 0071 sts SRAM_TEMP_2, temp_r_h +000126 9300 0072 sts SRAM_TEMP_3, temp_r_l ; определяем нижний и верхний пороги -00010b 9140 006d lds r20, SETTING_TEMP_L -00010d 9150 006c lds r21, SETTING_TEMP_H -00010f 9160 006e lds r22, SETTING_HYST -000111 934f push r20 -000112 935f push r21 -000113 2777 clr r23 -000114 1b46 sub r20, r22 -000115 0b57 sbc r21, r23 -000116 2eb4 mov min_r_trhd_l, r20 -000117 2ea5 mov min_r_trhd_h, r21 -000118 915f pop r21 -000119 914f pop r20 -00011a 2777 clr r23 -00011b 0f46 add r20, r22 -00011c 1f57 adc r21, r23 -00011d 2ed4 mov max_r_trhd_l, r20 -00011e 2ec5 mov max_r_trhd_h, r21 +000128 9140 006d lds r20, SETTING_TEMP_L +00012a 9150 006c lds r21, SETTING_TEMP_H +00012c 9160 006e lds r22, SETTING_HYST +00012e 934f push r20 +00012f 935f push r21 +000130 2777 clr r23 +000131 1b46 sub r20, r22 +000132 0b57 sbc r21, r23 +000133 2eb4 mov min_r_trhd_l, r20 +000134 2ea5 mov min_r_trhd_h, r21 +000135 915f pop r21 +000136 914f pop r20 +000137 2777 clr r23 +000138 0f46 add r20, r22 +000139 1f57 adc r21, r23 +00013a 2ed4 mov max_r_trhd_l, r20 +00013b 2ec5 mov max_r_trhd_h, r21 ; определяем знак температуры -00011f f00e brts _NEGATE_TEMP -000120 c004 rjmp _COMPARE +00013c f00e brts _NEGATE_TEMP +00013d c004 rjmp _COMPARE _NEGATE_TEMP: -000121 9500 com temp_r_l -000122 9510 com temp_r_h -000123 5f0f subi temp_r_l, low(-1) -000124 4f1f sbci temp_r_h, high(-1) +00013e 9500 com temp_r_l +00013f 9510 com temp_r_h +000140 5f0f subi temp_r_l, low(-1) +000141 4f1f sbci temp_r_h, high(-1) _COMPARE: ; проверяем нижний порог -000125 16b0 cp min_r_trhd_l, temp_r_l -000126 06a1 cpc min_r_trhd_h, temp_r_h -000127 f424 brge _MIN_THRESHOLD ; TEMP <= MIN +000142 16b0 cp min_r_trhd_l, temp_r_l +000143 06a1 cpc min_r_trhd_h, temp_r_h +000144 f424 brge _MIN_THRESHOLD ; TEMP <= MIN ; проверяем верхний порог -000128 150d cp temp_r_l, max_r_trhd_l -000129 051c cpc temp_r_h, max_r_trhd_h -00012a f44c brge _MAX_THRESHOLD ; TEMP >= TOP -00012b c00f rjmp _COMPARSION_EXIT +000145 150d cp temp_r_l, max_r_trhd_l +000146 051c cpc temp_r_h, max_r_trhd_h +000147 f44c brge _MAX_THRESHOLD ; TEMP >= TOP +000148 c00f rjmp _COMPARSION_EXIT _MIN_THRESHOLD: ; определяем режим работы -00012c 9140 006f lds r20, SETTING_MODE -00012e 2344 tst r20 -00012f f411 brne PC+3 -000130 9890 relay_off -000131 c001 rjmp PC+2 -000132 9a90 relay_on -000133 c007 rjmp _COMPARSION_EXIT +000149 9140 006f lds r20, SETTING_MODE +00014b 2344 tst r20 +00014c f411 brne PC+3 +00014d 9890 relay_off +00014e c001 rjmp PC+2 +00014f 9a90 relay_on +000150 c007 rjmp _COMPARSION_EXIT _MAX_THRESHOLD: -000134 9140 006f lds r20, SETTING_MODE -000136 2344 tst r20 -000137 f411 brne PC+3 -000138 9a90 relay_on -000139 c001 rjmp PC+2 -00013a 9890 relay_off +000151 9140 006f lds r20, SETTING_MODE +000153 2344 tst r20 +000154 f411 brne PC+3 +000155 9a90 relay_on +000156 c001 rjmp PC+2 +000157 9890 relay_off _COMPARSION_EXIT: -00013b 917f pop r23 -00013c 916f pop r22 -00013d 915f pop r21 -00013e 914f pop r20 -00013f 913f pop r19 -000140 912f pop r18 -000141 911f pop r17 -000142 910f pop r16 -000143 9508 ret +000158 915f pop r21 +000159 914f pop r20 +00015a 913f pop r19 +00015b 912f pop r18 +00015c 911f pop r17 +00015d 910f pop r16 +00015e 9508 ret// // TEMP_UPD: -000144 931f push r17 -000145 d065 rcall TEMP_CONV -000146 e05c -000147 e334 -000148 ef4d -000149 d119 DELAY24 500000 -00014a e05c -00014b e334 -00014c ef4d -00014d d115 DELAY24 500000 -00014e d012 rcall TEMP_RD +00015f 931f push r17 +000160 d061 rcall TEMP_CONV +000161 e153 +000162 e837 +000163 ef4d +000164 d115 DELAY24 800000 +000165 d012 rcall TEMP_RD ; обновляем данные в ячейках -00014f 9110 0069 lds r17, TEMP_L -000151 2f81 mov DISP_NUM_L, r17 -000152 9110 006a lds r17, TEMP_H -000154 2f91 mov DISP_NUM_H, r17 -000155 911f pop r17 -000156 9508 ret +000166 9110 0069 lds r17, TEMP_L +000168 2f81 mov DISP_NUM_L, r17 +000169 9110 006a lds r17, TEMP_H +00016b 2f91 mov DISP_NUM_H, r17 +00016c 911f pop r17 +00016d 9508 ret // // RD_F_CODE: -000157 930f push r16 +00016e 930f push r16 -000158 d076 rcall OW_PRESENCE -000159 e303 ldi r16, DS18B20_CMD_READROM -00015a 2e80 mov OW_CMD_r, r16 -00015b d088 rcall OW_SEND_BYTE +00016f d078 rcall OW_PRESENCE +000170 e303 ldi r16, DS18B20_CMD_READROM +000171 2e80 mov OW_CMD_r, r16 +000172 d08a rcall OW_SEND_BYTE -00015c e7a0 ldi XL, LOW(DEVICE_FAMILY_CODE) -00015d e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) -00015e d0a6 rcall OW_RD_BYTE +000173 e7a0 ldi XL, LOW(DEVICE_FAMILY_CODE) +000174 e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) +000175 d0a6 rcall OW_RD_BYTE -00015f 910f pop r16 -000160 9508 ret// +000176 910f pop r16 +000177 9508 ret// // TEMP_RD: -000161 930f push r16 -000162 931f push r17 -000163 932f push r18 -000164 933f push r19 -000165 934f push r20 +000178 930f push r16 +000179 931f push r17 +00017a 932f push r18 +00017b 933f push r19 +00017c 934f push r20 ; cli -000166 d068 rcall OW_PRESENCE -000167 ec0c ldi r16, DS18B20_CMD_SKIPROM -000168 2e80 mov OW_CMD_r, r16 -000169 d07a rcall OW_SEND_BYTE +00017d d06a rcall OW_PRESENCE +00017e ff70 sbrs OWFR, OWPRF +00017f c03c rjmp _TEMP_RD_EXIT -00016a eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD -00016b 2e80 mov OW_CMD_r, r16 -00016c d077 rcall OW_SEND_BYTE +000180 ec0c ldi r16, DS18B20_CMD_SKIPROM +000181 2e80 mov OW_CMD_r, r16 +000182 d07a rcall OW_SEND_BYTE -00016d e6a9 ldi XL, LOW(TEMP_L) -00016e e0b0 ldi XH, HIGH(TEMP_L) -00016f d095 rcall OW_RD_BYTE +000183 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD +000184 2e80 mov OW_CMD_r, r16 +000185 d077 rcall OW_SEND_BYTE -000170 e6aa ldi XL, LOW(TEMP_H) -000171 e0b0 ldi XH, HIGH(TEMP_H) -000172 d092 rcall OW_RD_BYTE +000186 e6a9 ldi XL, LOW(TEMP_L) +000187 e0b0 ldi XH, HIGH(TEMP_L) +000188 d093 rcall OW_RD_BYTE -000173 9110 0069 lds r17, TEMP_L -000175 9120 006a lds r18, TEMP_H +000189 e6aa ldi XL, LOW(TEMP_H) +00018a e0b0 ldi XH, HIGH(TEMP_H) +00018b d090 rcall OW_RD_BYTE -000177 932f push r18 -000178 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) -000179 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой -00017a f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число -00017b 94e8 clt -00017c c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) +00018c 9110 0069 lds r17, TEMP_L +00018e 9120 006a lds r18, TEMP_H + +000190 932f push r18 +000191 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) +000192 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой +000193 f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число +000194 94e8 clt +000195 c007 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) _TEMP_RD_TO_UNSIGNED: -00017d 912f pop r18 -00017e 9468 set -00017f 9510 com r17 -000180 9520 com r18 -000181 e031 ldi r19, 1 -000182 0f13 add r17, r19 -000183 e030 ldi r19, 0 -000184 1f23 adc r18, r19 -000185 c001 rjmp PC+2 +000196 912f pop r18 +000197 9468 set +000198 9510 com r17 +000199 9520 com r18 +00019a 5f1f subi r17, low(-1) +00019b 4f2f sbci r18, high(-1) + ; ldi r19, 1 + ; add r17, r19 + ; ldi r19, 0 + ; adc r18, r19 +00019c c001 rjmp PC+2 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) -000186 912f pop r18 -000187 9526 lsr r18 -000188 9517 ror r17 -000189 9526 lsr r18 -00018a 9517 ror r17 -00018b 9526 lsr r18 -00018c 9517 ror r17 -00018d 9526 lsr r18 -00018e 9517 ror r17 +00019d 912f pop r18 +00019e 9526 lsr r18 +00019f 9517 ror r17 +0001a0 9526 lsr r18 +0001a1 9517 ror r17 +0001a2 9526 lsr r18 +0001a3 9517 ror r17 +0001a4 9526 lsr r18 +0001a5 9517 ror r17 _TEMP_RD_END: -00018f 9130 0069 lds r19, TEMP_L -000191 f40e brtc PC+2 -000192 9531 neg r19 ; переводим в беззнаковое число если минус +0001a6 9130 0069 lds r19, TEMP_L +0001a8 f40e brtc PC+2 +0001a9 9531 neg r19 ; переводим в беззнаковое число если минус ; далее происходит такое для получения дробной части: ; ((n<<3) + (n<<1))>>4 или (n*10)/16 -000193 2f43 mov r20, r19 -000194 703f andi r19, 0x0f -000195 2f43 mov r20, r19 -000196 0f33 lsl r19 -000197 0f33 lsl r19 -000198 0f33 lsl r19 +0001aa 2f43 mov r20, r19 +0001ab 703f andi r19, 0x0f +0001ac 2f43 mov r20, r19 +0001ad 0f33 lsl r19 +0001ae 0f33 lsl r19 +0001af 0f33 lsl r19 -000199 0f44 lsl r20 +0001b0 0f44 lsl r20 -00019a 0f34 add r19, r20 +0001b1 0f34 add r19, r20 -00019b 9536 lsr r19 -00019c 9536 lsr r19 -00019d 9536 lsr r19 -00019e 9536 lsr r19 +0001b2 9536 lsr r19 +0001b3 9536 lsr r19 +0001b4 9536 lsr r19 +0001b5 9536 lsr r19 ; записываем данные -00019f 9310 0069 sts TEMP_L, r17 -0001a1 9320 006a sts TEMP_H, r18 -0001a3 9330 006b sts TEMP_F, r19 +0001b6 9310 0069 sts TEMP_L, r17 +0001b8 9320 006a sts TEMP_H, r18 +0001ba 9330 006b sts TEMP_F, r19 ; sei -0001a5 914f pop r20 -0001a6 913f pop r19 -0001a7 912f pop r18 -0001a8 911f pop r17 -0001a9 910f pop r16 -0001aa 9508 ret + _TEMP_RD_EXIT: +0001bc 914f pop r20 +0001bd 913f pop r19 +0001be 912f pop r18 +0001bf 911f pop r17 +0001c0 910f pop r16 +0001c1 9508 ret ; TEMP_CONV: -0001ab 930f push r16 +0001c2 930f push r16 ; cli -0001ac d022 rcall OW_PRESENCE -0001ad ec0c ldi r16, DS18B20_CMD_SKIPROM -0001ae 2e80 mov OW_CMD_r, r16 -0001af d034 rcall OW_SEND_BYTE +0001c3 d024 rcall OW_PRESENCE +0001c4 ff70 sbrs OWFR, OWPRF +0001c5 c006 rjmp _TEMP_CONV_EXIT -0001b0 e404 ldi r16, DS18B20_CMD_CONVERTTEMP -0001b1 2e80 mov OW_CMD_r, r16 -0001b2 d031 rcall OW_SEND_BYTE +0001c6 ec0c ldi r16, DS18B20_CMD_SKIPROM +0001c7 2e80 mov OW_CMD_r, r16 +0001c8 d034 rcall OW_SEND_BYTE + +0001c9 e404 ldi r16, DS18B20_CMD_CONVERTTEMP +0001ca 2e80 mov OW_CMD_r, r16 +0001cb d031 rcall OW_SEND_BYTE ; sei -0001b3 910f pop r16 -0001b4 9508 ret + _TEMP_CONV_EXIT: +0001cc 910f pop r16 +0001cd 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: -0001b5 930f push r16 -0001b6 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. +0001ce 930f push r16 +0001cf b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) -0001b7 e400 ldi TEMP_REG_A, (1< USI Clock Source Select ; USICLK <--------------> USI Clock Strobe ; USITC <--------------> USI Toggle Clock (Enable clock generation) -0001b9 e10b ldi TEMP_REG_A, (1< +0001d6 9ac0 sbi PORTB, USI_LATCH_PIN +0001d7 98c0 cbi PORTB, USI_LATCH_PIN +0001d8 910f pop r16 +0001d9 9508 ret// // SW_CHECK_PROCESS: -0001c1 930f push r16 -0001c2 d08c rcall DEBOUNCE_SW -0001c3 9bb2 sbis SW_PIN, SW_PLUS_PIN -0001c4 9601 adiw DISP_NUM_L, 1 +0001da 930f push r16 +0001db d08a rcall DEBOUNCE_SW +0001dc 9bb2 sbis SW_PIN, SW_PLUS_PIN +0001dd 9601 adiw DISP_NUM_L, 1 -0001c5 9bb3 sbis SW_PIN, SW_MINUS_PIN -0001c6 9701 sbiw DISP_NUM_L, 1 +0001de 9bb3 sbis SW_PIN, SW_MINUS_PIN +0001df 9701 sbiw DISP_NUM_L, 1 -0001c7 9bb4 sbis SW_PIN, SW_SET_PIN -0001c8 c001 rjmp _INTO_DEFAULT_STATE -0001c9 c003 rjmp _SW_CHECK_PROCESS_END +0001e0 9bb4 sbis SW_PIN, SW_SET_PIN +0001e1 c001 rjmp _INTO_DEFAULT_STATE +0001e2 c003 rjmp _SW_CHECK_PROCESS_END _INTO_DEFAULT_STATE: -0001ca e000 ldi r16, MCU_STATE_DEFAULT -0001cb 9300 0060 sts MCU_STATE, r16 +0001e3 e000 ldi r16, MCU_STATE_DEFAULT +0001e4 9300 0060 sts MCU_STATE, r16 _SW_CHECK_PROCESS_END: -0001cd 910f pop r16 -0001ce 9508 ret +0001e6 910f pop r16 +0001e7 9508 ret // // // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: -0001cf 94f8 cli -0001d0 9ab9 ow_pull -0001d1 e033 -0001d2 eb4e -0001d3 d08b DELAY16 480 -0001d4 98b9 ow_release -0001d5 e030 -0001d6 e84a -0001d7 d087 DELAY16 70 -0001d8 d005 rcall OW_CHECK_PRESENCE -0001d9 e033 -0001da e342 -0001db d083 DELAY16 410 -0001dc 9478 sei -0001dd 9508 ret +0001e8 94f8 cli +0001e9 9ab9 ow_pull +0001ea e033 +0001eb eb4e +0001ec d089 DELAY16 480 +0001ed 98b9 ow_release +0001ee e030 +0001ef e84a +0001f0 d085 DELAY16 70 +0001f1 d005 rcall OW_CHECK_PRESENCE +0001f2 e033 +0001f3 e342 +0001f4 d081 DELAY16 410 +0001f5 9478 sei +0001f6 9508 ret // // @@ -1650,88 +1692,84 @@ main.asm(296): Including file 'mpy16u.asm' ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: -0001de 9bb1 sbis OW_PIN, OW_LINE -0001df 6071 sbr OWFR, (1< // OW_SEND_BYTE: -0001e4 930f push r16 -0001e5 931f push r17 -0001e6 2d08 mov r16, OW_CMD_r -0001e7 e018 ldi r17, 8 +0001fd 930f push r16 +0001fe 931f push r17 +0001ff 94f8 cli +000200 2d08 mov r16, OW_CMD_r +000201 e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: -0001e8 9506 lsr r16 -0001e9 f408 brcc _OW_SEND_0 -0001ea f058 brcs _OW_SEND_1 +000202 9506 lsr r16 +000203 f408 brcc _OW_SEND_0 +000204 f048 brcs _OW_SEND_1 _OW_SEND_0: -0001eb 94f8 cli -0001ec 9ab9 ow_pull -0001ed e030 -0001ee e746 -0001ef d06f DELAY16 60 -0001f0 98b9 ow_release -0001f1 e030 -0001f2 e142 -0001f3 d06b DELAY16 10 -0001f4 9478 sei -0001f5 c00a rjmp _OW_SEND_BYTE_END +000205 9ab9 ow_pull +000206 e030 +000207 e746 +000208 d06d DELAY16 60 +000209 98b9 ow_release +00020a e030 +00020b e142 +00020c d069 DELAY16 10 +00020d c008 rjmp _OW_SEND_BYTE_END _OW_SEND_1: -0001f6 94f8 cli -0001f7 9ab9 ow_pull -0001f8 e030 -0001f9 e04a -0001fa d064 DELAY16 6 -0001fb 98b9 ow_release -0001fc e030 -0001fd e74e -0001fe d060 DELAY16 64 -0001ff 9478 sei +00020e 9ab9 ow_pull +00020f e030 +000210 e04a +000211 d064 DELAY16 6 +000212 98b9 ow_release +000213 e030 +000214 e74e +000215 d060 DELAY16 64 _OW_SEND_BYTE_END: -000200 951a dec r17 -000201 f731 brne _OW_SEND_BYTE_LOOP -000202 911f pop r17 -000203 910f pop r16 -000204 9508 ret +000216 951a dec r17 +000217 f751 brne _OW_SEND_BYTE_LOOP +000218 9478 sei +000219 911f pop r17 +00021a 910f pop r16 +00021b 9508 ret // // OW_RD_BYTE: -000205 930f push r16 -000206 931f push r17 -000207 2700 clr r16 -000208 e018 ldi r17, 8 -000209 94f8 cli +00021c 930f push r16 +00021d 931f push r17 +00021e 94f8 cli +00021f 2700 clr r16 +000220 e018 ldi r17, 8 _OW_RD_BYTE_LP: -00020a 9506 lsr r16 -00020b 9ab9 ow_pull -00020c e030 -00020d e04a -00020e d050 DELAY16 6 -00020f 98b9 ow_release -000210 e030 -000211 e140 -000212 d04c DELAY16 9 -000213 99b1 sbic OW_PIN, OW_LINE -000214 6800 sbr r16, (1<<7) -000215 e030 -000216 e64c -000217 d047 DELAY16 55 -000218 951a dec r17 -000219 f781 brne _OW_RD_BYTE_LP -00021a 930c st X, r16 -00021b 9478 sei -00021c 911f pop r17 -00021d 910f pop r16 -00021e 9508 ret +000221 9506 lsr r16 +000222 9ab9 ow_pull +000223 e030 +000224 e04a +000225 d050 DELAY16 6 +000226 98b9 ow_release +000227 e030 +000228 e140 +000229 d04c DELAY16 9 +00022a 99b1 sbic OW_PIN, OW_LINE +00022b 6800 sbr r16, (1<<7) +00022c e030 +00022d e64c +00022e d047 DELAY16 55 +00022f 951a dec r17 +000230 f781 brne _OW_RD_BYTE_LP +000231 930c st X, r16 +000232 9478 sei +000233 911f pop r17 +000234 910f pop r16 +000235 9508 ret // - - // // @@ -1739,156 +1777,156 @@ main.asm(296): Including file 'mpy16u.asm' ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: -00021f 94f8 cli -000220 935f push r21 -000221 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный +000236 94f8 cli +000237 935f push r21 +000238 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный ; инициализация указателя (за каждый проход цикла будет инкрементироваться) -000222 e6a3 ldi XL, LOW(DIGITS) -000223 e0b0 ldi XH, HIGH(DIGITS) +000239 e6a3 ldi XL, LOW(DIGITS) +00023a e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого -000224 9380 0061 sts dividend, DISP_NUM_L -000226 9390 0062 sts dividend+1, DISP_NUM_H +00023b 9380 0061 sts dividend, DISP_NUM_L +00023d 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры -000228 9100 0061 lds dd16uL, dividend -00022a 9110 0062 lds dd16uH, dividend+1 -00022c e02a ldi dv16uL, LOW(divisor) -00022d e030 ldi dv16uH, HIGH(divisor) +00023f 9100 0061 lds dd16uL, dividend +000241 9110 0062 lds dd16uH, dividend+1 +000243 e02a ldi dv16uL, LOW(divisor) +000244 e030 ldi dv16uH, HIGH(divisor) -00022e de92 rcall div16u ; делим +000245 de84 rcall div16u ; делим -00022f 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его +000246 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое -000230 9300 0061 sts dividend, dres16uL -000232 9310 0062 sts dividend+1, dres16uH +000247 9300 0061 sts dividend, dres16uL +000249 9310 0062 sts dividend+1, dres16uH -000234 955a dec r21 ; декрементируем счетчик цикла -000235 f791 brne DIV_LOOP ; делим еще раз если не 0 -000236 915f pop r21 -000237 9478 sei -000238 9508 ret +00024b 955a dec r21 ; декрементируем счетчик цикла +00024c f791 brne DIV_LOOP ; делим еще раз если не 0 +00024d 915f pop r21 +00024e 9478 sei +00024f 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: -000239 930f push r16 -00023a 931f push r17 -00023b efe0 ldi ZL, LOW(2*DISPLAY_SYMBOLS) -00023c e0f4 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) +000250 930f push r16 +000251 931f push r17 +000252 e1ee ldi ZL, LOW(2*DISPLAY_SYMBOLS) +000253 e0f5 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) -00023d 2711 clr TEMP_REG_B -00023e 0fe0 add ZL, TEMP_REG_A -00023f 1ff1 adc ZH, TEMP_REG_B +000254 2711 clr TEMP_REG_B +000255 0fe0 add ZL, TEMP_REG_A +000256 1ff1 adc ZH, TEMP_REG_B -000240 9004 lpm r0, Z -000241 911f pop r17 -000242 910f pop r16 -000243 9508 ret// +000257 9004 lpm r0, Z +000258 911f pop r17 +000259 910f pop r16 +00025a 9508 ret// // BEEP_SHORT: -000244 9ac5 sbi BUZZER_PORT, BUZZER_PIN -000245 d022 rcall DELAY -000246 98c5 cbi BUZZER_PORT, BUZZER_PIN -000247 9508 ret +00025b 9ac5 sbi BUZZER_PORT, BUZZER_PIN +00025c d022 rcall DELAY +00025d 98c5 cbi BUZZER_PORT, BUZZER_PIN +00025e 9508 ret // // BEEP_LONG: -000248 9ac5 sbi BUZZER_PORT, BUZZER_PIN -000249 d01e rcall DELAY -00024a d01d rcall DELAY -00024b d01c rcall DELAY -00024c d01b rcall DELAY -00024d 98c5 cbi BUZZER_PORT, BUZZER_PIN -00024e 9508 ret// +00025f 9ac5 sbi BUZZER_PORT, BUZZER_PIN +000260 d01e rcall DELAY +000261 d01d rcall DELAY +000262 d01c rcall DELAY +000263 d01b rcall DELAY +000264 98c5 cbi BUZZER_PORT, BUZZER_PIN +000265 9508 ret// // DEBOUNCE_SW: -00024f 930f push r16 -000250 931f push r17 -000251 932f push r18 +000266 930f push r16 +000267 931f push r17 +000268 932f push r18 -000252 e02a ldi r18, 10 +000269 e02a ldi r18, 10 _loop_2: -000253 ef1f ldi r17, 255 +00026a ef1f ldi r17, 255 _loop_0: -000254 ef0f ldi r16, 255 +00026b ef0f ldi r16, 255 _dec_0: -000255 950a dec r16 -000256 f7f1 brne _dec_0 +00026c 950a dec r16 +00026d f7f1 brne _dec_0 _loop_1: -000257 951a dec r17 -000258 f7d9 brne _loop_0 +00026e 951a dec r17 +00026f f7d9 brne _loop_0 _loop_3: -000259 952a dec r18 -00025a f7c1 brne _loop_2 +000270 952a dec r18 +000271 f7c1 brne _loop_2 -00025b 912f pop r18 -00025c 911f pop r17 -00025d 910f pop r16 -00025e 9508 ret// +000272 912f pop r18 +000273 911f pop r17 +000274 910f pop r16 +000275 9508 ret// // DELAY_LOOP_16: -00025f 5041 subi DELAY_8_r, 1 -000260 4030 sbci DELAY_16_r, 0 -000261 f7e8 brcc DELAY_LOOP_16 -000262 9508 ret +000276 5041 subi DELAY_8_r, 1 +000277 4030 sbci DELAY_16_r, 0 +000278 f7e8 brcc DELAY_LOOP_16 +000279 9508 ret // // DELAY_LOOP_24: -000263 5041 subi DELAY_8_r, 1 -000264 4030 sbci DELAY_16_r, 0 -000265 4050 sbci DELAY_24_r, 0 -000266 f7e0 brcc DELAY_LOOP_24 -000267 9508 ret +00027a 5041 subi DELAY_8_r, 1 +00027b 4030 sbci DELAY_16_r, 0 +00027c 4050 sbci DELAY_24_r, 0 +00027d f7e0 brcc DELAY_LOOP_24 +00027e 9508 ret // // DELAY: -000268 930f push r16 -000269 931f push r17 -00026a 932f push r18 +00027f 930f push r16 +000280 931f push r17 +000281 932f push r18 -00026b e026 ldi r18, 6 +000282 e026 ldi r18, 6 _DELAY_0: -00026c ef0f ldi r16, 255 +000283 ef0f ldi r16, 255 _DELAY_1: -00026d ef1f ldi r17, 255 +000284 ef1f ldi r17, 255 _DELAY_2: -00026e 951a dec r17 -00026f f7f1 brne _DELAY_2 +000285 951a dec r17 +000286 f7f1 brne _DELAY_2 -000270 950a dec r16 -000271 f7d9 brne _DELAY_1 -000272 952a dec r18 -000273 f7c1 brne _DELAY_0 +000287 950a dec r16 +000288 f7d9 brne _DELAY_1 +000289 952a dec r18 +00028a f7c1 brne _DELAY_0 -000274 912f pop r18 -000275 911f pop r17 -000276 910f pop r16 -000277 9508 ret // +00028b 912f pop r18 +00028c 911f pop r17 +00028d 910f pop r16 +00028e 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA -000278 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 -000279 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 -00027a 9299 .DB 0b10011001, 0b10010010 ; 4, 5 -00027b f882 .DB 0b10000010, 0b11111000 ; 6, 7 -00027c 9080 .DB 0b10000000, 0b10010000 ; 8, 9 -00027d bf9c .DB 0b10011100, 0b10111111 ; °, -// +00028f f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 +000290 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 +000291 9299 .DB 0b10011001, 0b10010010 ; 4, 5 +000292 f882 .DB 0b10000010, 0b11111000 ; 6, 7 +000293 9080 .DB 0b10000000, 0b10010000 ; 8, 9 +000294 bf9c .DB 0b10011100, 0b10111111 ; °, -// // @@ -1915,37 +1953,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 : 6 r9 : 0 r10: 2 r11: 2 r12: 2 -r13: 2 r14: 5 r15: 10 r16: 120 r17: 60 r18: 40 r19: 49 r20: 50 -r21: 23 r22: 7 r23: 8 r24: 5 r25: 3 r26: 4 r27: 4 r28: 0 +r5 : 5 r6 : 0 r7 : 0 r8 : 6 r9 : 0 r10: 2 r11: 2 r12: 2 +r13: 2 r14: 5 r15: 10 r16: 139 r17: 60 r18: 40 r19: 44 r20: 49 +r21: 22 r22: 5 r23: 8 r24: 5 r25: 3 r26: 4 r27: 4 r28: 0 r29: 0 r30: 2 r31: 2 -Registers used: 25 out of 35 (71.4%) +Registers used: 26 out of 35 (74.3%) "ATtiny2313A" instruction use summary: -.lds : 0 .sts : 0 adc : 6 add : 8 adiw : 1 and : 0 -andi : 1 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0 +.lds : 0 .sts : 0 adc : 5 add : 7 adiw : 1 and : 0 +andi : 2 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 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 : 22 brpl : 0 brsh : 0 brtc : 1 brts : 2 brvc : 0 brvs : 0 bset : 0 bst : 0 cbi : 25 cbr : 3 clc : 2 -clh : 0 cli : 5 cln : 0 clr : 11 cls : 0 clt : 1 +clh : 0 cli : 4 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 : 25 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 : 28 rol : 6 ror : 9 sbc : 2 -sbci : 4 sbi : 14 sbic : 3 sbis : 5 sbiw : 1 sbr : 2 -sbrc : 0 sbrs : 0 sec : 2 seh : 0 sei : 5 sen : 0 +cpse : 0 dec : 12 eor : 0 icall : 0 ijmp : 0 in : 3 +inc : 1 ld : 0 ldd : 0 ldi : 83 lds : 27 lpm : 2 +lsl : 4 lsr : 11 mov : 22 movw : 0 neg : 1 nop : 0 +or : 1 ori : 0 out : 20 pop : 42 push : 41 rcall : 54 +ret : 24 reti : 3 rjmp : 31 rol : 6 ror : 9 sbc : 2 +sbci : 5 sbi : 14 sbic : 3 sbis : 6 sbiw : 1 sbr : 2 +sbrc : 0 sbrs : 2 sec : 2 seh : 0 sei : 4 sen : 0 ser : 0 ses : 0 set : 1 sev : 0 sez : 0 sleep : 0 -spm : 0 st : 2 std : 0 sts : 23 sub : 5 subi : 3 +spm : 0 st : 2 std : 0 sts : 23 sub : 5 subi : 4 swap : 0 tst : 3 wdr : 0 -Instructions used: 56 out of 105 (53.3%) +Instructions used: 57 out of 105 (54.3%) "ATtiny2313A" memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- -[.cseg] 0x000000 0x0004fc 1242 12 1254 2048 61.2% +[.cseg] 0x000000 0x00052a 1288 12 1300 2048 63.5% [.dseg] 0x000060 0x000073 0 19 19 128 14.8% [.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 d6c9f57..35d1183 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 Mon Jun 26 09:43:03 2023 +AVRASM ver. 2.2.7 main.asm Mon Jun 26 12:19:45 2023 EQU SIGNATURE_000 0000001e @@ -558,25 +558,26 @@ CSEG _INTO_PROGRAM_STATE 0000001a CSEG _CLR_CURRENT_DIGIT 0000002d CSEG _indicate_1 00000030 CSEG _indicate_2 00000042 -CSEG DISPLAY_DECODER 00000239 -CSEG USI_TRANSMIT 000001b5 +CSEG DISPLAY_DECODER 00000250 +CSEG USI_TRANSMIT 000001ce CSEG _indicate_3 00000054 CSEG _indicate_4 00000061 CSEG _indicate_exit 0000006b CSEG MCU_INIT 00000076 -CSEG RD_F_CODE 00000157 -CSEG ERR_FAMILY_CODE 000000a6 -CSEG START_PROGRAM 000000ab -CSEG BEEP_LONG 00000248 -CSEG BEEP_SHORT 00000244 -CSEG LOOP 000000ae -CSEG _STATE_DEFAULT 000000b0 -CSEG _STATE_PROGRAM 000000b8 -CSEG DISPLAY_UPD_DIGITS 0000021f -CSEG TEMP_UPD 00000144 -CSEG TEMP_COMPARSION 000000f1 -CSEG _STATE_ERROR 000000bd -CSEG SW_CHECK_PROCESS 000001c1 +CSEG RD_F_CODE 0000016e +CSEG ERR_FAMILY_CODE 000000ae +CSEG START_PROGRAM 000000b3 +CSEG BEEP_LONG 0000025f +CSEG BEEP_SHORT 0000025b +CSEG LOOP 000000b6 +CSEG _STATE_DEFAULT 000000b8 +CSEG _STATE_PROGRAM 000000c1 +CSEG DISPLAY_UPD_DIGITS 00000236 +CSEG TEMP_UPD 0000015f +CSEG TEMP_COMPARSION 00000110 +CSEG TEMP_SEND_UART 000000fa +CSEG _STATE_ERROR 000000c6 +CSEG SW_CHECK_PROCESS 000001da DEF drem16uL r14 DEF drem16uH r15 DEF dres16uL r16 @@ -586,19 +587,19 @@ DEF dd16uH r17 DEF dv16uL r18 DEF dv16uH r19 DEF dcnt16u r20 -CSEG div16u 000000c1 -CSEG d16u_1 000000c4 -CSEG d16u_2 000000c9 -CSEG d16u_3 000000d2 +CSEG div16u 000000ca +CSEG d16u_1 000000cd +CSEG d16u_2 000000d2 +CSEG d16u_3 000000db 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 +CSEG div8u 000000dd +CSEG d8u_1 000000df +CSEG d8u_2 000000e3 +CSEG d8u_3 000000e9 DEF mc16uL r16 DEF mc16uH r17 DEF mp16uL r18 @@ -608,51 +609,54 @@ DEF m16u1 r19 DEF m16u2 r20 DEF m16u3 r21 DEF mcnt16u r22 -CSEG mpy16u 000000e2 -CSEG m16u_1 000000e7 -CSEG noad8 000000ea +CSEG mpy16u 000000eb +CSEG m16u_1 000000f0 +CSEG noad8 000000f3 +CSEG UART_WR_BYTE 0000010c 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 _COMPARE 00000125 -CSEG _MIN_THRESHOLD 0000012c -CSEG _MAX_THRESHOLD 00000134 -CSEG _COMPARSION_EXIT 0000013b -CSEG TEMP_CONV 000001ab -CSEG DELAY_LOOP_24 00000263 -CSEG TEMP_RD 00000161 -CSEG OW_PRESENCE 000001cf -CSEG OW_SEND_BYTE 000001e4 -CSEG OW_RD_BYTE 00000205 -CSEG _TEMP_RD_TO_UNSIGNED 0000017d -CSEG _TEMP_RD_CONTINUE 00000186 -CSEG _TEMP_RD_END 0000018f -CSEG _USI_TRANSMIT_LOOP 000001ba -CSEG DEBOUNCE_SW 0000024f -CSEG _INTO_DEFAULT_STATE 000001ca -CSEG _SW_CHECK_PROCESS_END 000001cd -CSEG DELAY_LOOP_16 0000025f -CSEG OW_CHECK_PRESENCE 000001de -CSEG _EXIT 000001e3 -CSEG _OW_SEND_BYTE_LOOP 000001e8 -CSEG _OW_SEND_0 000001eb -CSEG _OW_SEND_1 000001f6 -CSEG _OW_SEND_BYTE_END 00000200 -CSEG _OW_RD_BYTE_LP 0000020a +CSEG _NEGATE_TEMP 0000013e +CSEG _COMPARE 00000142 +CSEG _MIN_THRESHOLD 00000149 +CSEG _MAX_THRESHOLD 00000151 +CSEG _COMPARSION_EXIT 00000158 +CSEG TEMP_CONV 000001c2 +CSEG DELAY_LOOP_24 0000027a +CSEG TEMP_RD 00000178 +CSEG OW_PRESENCE 000001e8 +CSEG OW_SEND_BYTE 000001fd +CSEG OW_RD_BYTE 0000021c +CSEG _TEMP_RD_EXIT 000001bc +CSEG _TEMP_RD_TO_UNSIGNED 00000196 +CSEG _TEMP_RD_CONTINUE 0000019d +CSEG _TEMP_RD_END 000001a6 +CSEG _TEMP_CONV_EXIT 000001cc +CSEG _USI_TRANSMIT_LOOP 000001d3 +CSEG DEBOUNCE_SW 00000266 +CSEG _INTO_DEFAULT_STATE 000001e3 +CSEG _SW_CHECK_PROCESS_END 000001e6 +CSEG DELAY_LOOP_16 00000276 +CSEG OW_CHECK_PRESENCE 000001f7 +CSEG _EXIT 000001fc +CSEG _OW_SEND_BYTE_LOOP 00000202 +CSEG _OW_SEND_0 00000205 +CSEG _OW_SEND_1 0000020e +CSEG _OW_SEND_BYTE_END 00000216 +CSEG _OW_RD_BYTE_LP 00000221 EQU dividend 00000061 EQU divisor 0000000a -CSEG DIV_LOOP 00000228 -CSEG DISPLAY_SYMBOLS 00000278 -CSEG DELAY 00000268 -CSEG _loop_2 00000253 -CSEG _loop_0 00000254 -CSEG _dec_0 00000255 -CSEG _loop_1 00000257 -CSEG _loop_3 00000259 -CSEG _DELAY_0 0000026c -CSEG _DELAY_1 0000026d -CSEG _DELAY_2 0000026e +CSEG DIV_LOOP 0000023f +CSEG DISPLAY_SYMBOLS 0000028f +CSEG DELAY 0000027f +CSEG _loop_2 0000026a +CSEG _loop_0 0000026b +CSEG _dec_0 0000026c +CSEG _loop_1 0000026e +CSEG _loop_3 00000270 +CSEG _DELAY_0 00000283 +CSEG _DELAY_1 00000284 +CSEG _DELAY_2 00000285 diff --git a/dist/default/production/attiny2313a_thermostat.X.production.obj b/dist/default/production/attiny2313a_thermostat.X.production.obj index 5032b19b225ec2d2dcc921b9bf68aa61c8186b28..14bbd60bd13b438d1477f2de7c1c14a01022d53b 100644 GIT binary patch literal 6031 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 HAC&(Crsu5d diff --git a/dist/default/production/attiny2313a_thermostat.X.production.tmp b/dist/default/production/attiny2313a_thermostat.X.production.tmp index a706d7d..49b312b 100644 --- a/dist/default/production/attiny2313a_thermostat.X.production.tmp +++ b/dist/default/production/attiny2313a_thermostat.X.production.tmp @@ -49,25 +49,26 @@ <_CLR_CURRENT_DIGIT>main.asm108 <_indicate_1>main.asm112 <_indicate_2>main.asm132 - main.asm741 - main.asm554 + main.asm778 + main.asm595 <_indicate_3>main.asm150 <_indicate_4>main.asm166 <_indicate_exit>main.asm178 main.asm197 - main.asm426 + main.asm457 main.asm253 main.asm258 - main.asm765 - main.asm757 + main.asm802 + main.asm794 main.asm267 <_STATE_DEFAULT>main.asm271 - <_STATE_PROGRAM>main.asm279 - main.asm700 - main.asm409 - main.asm298 - <_STATE_ERROR>main.asm285 - main.asm585 + <_STATE_PROGRAM>main.asm280 + main.asm737 + main.asm441 + main.asm334 + main.asm300 + <_STATE_ERROR>main.asm286 + main.asm626 div16u.asm32 div16u.asm36 div16u.asm42 @@ -79,42 +80,45 @@ mpy16u.asm31 mpy16u.asm37 mpy16u.asm40 - <_NEGATE_TEMP>main.asm365 - <_COMPARE>main.asm371 - <_MIN_THRESHOLD>main.asm381 - <_MAX_THRESHOLD>main.asm390 - <_COMPARSION_EXIT>main.asm397 - main.asm534 - main.asm809 - main.asm442 - main.asm609 - main.asm636 - main.asm669 - <_TEMP_RD_TO_UNSIGNED>main.asm477 - <_TEMP_RD_CONTINUE>main.asm488 - <_TEMP_RD_END>main.asm498 - <_USI_TRANSMIT_LOOP>main.asm572 - main.asm775 - <_INTO_DEFAULT_STATE>main.asm598 - <_SW_CHECK_PROCESS_END>main.asm601 - main.asm801 - main.asm625 - <_EXIT>main.asm631 - <_OW_SEND_BYTE_LOOP>main.asm641 - <_OW_SEND_0>main.asm645 - <_OW_SEND_1>main.asm653 - <_OW_SEND_BYTE_END>main.asm660 - <_OW_RD_BYTE_LP>main.asm675 - main.asm717 - main.asm843 - main.asm818 - <_loop_2>main.asm781 - <_loop_0>main.asm783 - <_dec_0>main.asm785 - <_loop_1>main.asm788 - <_loop_3>main.asm791 - <_DELAY_0>main.asm824 - <_DELAY_1>main.asm826 - <_DELAY_2>main.asm828 + main.asm327 + <_NEGATE_TEMP>main.asm399 + <_COMPARE>main.asm405 + <_MIN_THRESHOLD>main.asm415 + <_MAX_THRESHOLD>main.asm424 + <_COMPARSION_EXIT>main.asm431 + main.asm571 + main.asm846 + main.asm473 + main.asm650 + main.asm677 + main.asm708 + <_TEMP_RD_EXIT>main.asm563 + <_TEMP_RD_TO_UNSIGNED>main.asm511 + <_TEMP_RD_CONTINUE>main.asm524 + <_TEMP_RD_END>main.asm534 + <_TEMP_CONV_EXIT>main.asm588 + <_USI_TRANSMIT_LOOP>main.asm613 + main.asm812 + <_INTO_DEFAULT_STATE>main.asm639 + <_SW_CHECK_PROCESS_END>main.asm642 + main.asm838 + main.asm666 + <_EXIT>main.asm672 + <_OW_SEND_BYTE_LOOP>main.asm683 + <_OW_SEND_0>main.asm687 + <_OW_SEND_1>main.asm693 + <_OW_SEND_BYTE_END>main.asm698 + <_OW_RD_BYTE_LP>main.asm714 + main.asm754 + main.asm880 + main.asm855 + <_loop_2>main.asm818 + <_loop_0>main.asm820 + <_dec_0>main.asm822 + <_loop_1>main.asm825 + <_loop_3>main.asm828 + <_DELAY_0>main.asm861 + <_DELAY_1>main.asm863 + <_DELAY_2>main.asm865 diff --git a/main.asm b/main.asm index c54c573..c78708d 100644 --- a/main.asm +++ b/main.asm @@ -210,10 +210,10 @@ MCU_INIT: outi r16, PCMSK0, (1< +TEMP_SEND_UART: + push r16 + ; целая часть + lds r16, TEMP_L + mov r5, r16 + rcall UART_WR_BYTE + + ; дробная часть + lds r16, TEMP_F + mov r5, r16 + rcall UART_WR_BYTE + + ; состояние реле + in r16, PIND + andi r16, (1< + +// +UART_WR_BYTE: + sbis UCSRA, UDRE + rjmp UART_WR_BYTE + out UDR, r5 + ret// +// TEMP_COMPARSION: push r16 push r17 @@ -302,8 +338,6 @@ TEMP_COMPARSION: push r19 push r20 push r21 - push r22 - push r23 ; ; lds dd8u, SETTING_HYST ; ldi dv8u, 10 @@ -395,22 +429,19 @@ _MAX_THRESHOLD: rjmp PC+2 relay_off _COMPARSION_EXIT: - pop r23 - pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 pop r16 - ret + ret// // TEMP_UPD: push r17 rcall TEMP_CONV - DELAY24 500000 - DELAY24 500000 + DELAY24 800000 rcall TEMP_RD ; обновляем данные в ячейках @@ -448,6 +479,9 @@ TEMP_RD: ; cli rcall OW_PRESENCE + sbrs OWFR, OWPRF + rjmp _TEMP_RD_EXIT + ldi r16, DS18B20_CMD_SKIPROM mov OW_CMD_r, r16 rcall OW_SEND_BYTE @@ -475,14 +509,16 @@ TEMP_RD: rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) _TEMP_RD_TO_UNSIGNED: - pop r18 + pop r18 set - com r17 - com r18 - ldi r19, 1 - add r17, r19 - ldi r19, 0 - adc r18, r19 + com r17 + com r18 + subi r17, low(-1) + sbci r18, high(-1) +; ldi r19, 1 +; add r17, r19 +; ldi r19, 0 +; adc r18, r19 rjmp PC+2 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) @@ -524,6 +560,7 @@ _TEMP_RD_END: sts TEMP_F, r19 ; sei +_TEMP_RD_EXIT: pop r20 pop r19 pop r18 @@ -536,6 +573,9 @@ TEMP_CONV: ; cli rcall OW_PRESENCE + sbrs OWFR, OWPRF + rjmp _TEMP_CONV_EXIT + ldi r16, DS18B20_CMD_SKIPROM mov OW_CMD_r, r16 rcall OW_SEND_BYTE @@ -545,6 +585,7 @@ TEMP_CONV: rcall OW_SEND_BYTE ; sei +_TEMP_CONV_EXIT: pop r16 ret // @@ -636,6 +677,7 @@ _EXIT: OW_SEND_BYTE: push r16 push r17 + cli mov r16, OW_CMD_r ldi r17, 8 _OW_SEND_BYTE_LOOP: @@ -643,23 +685,20 @@ _OW_SEND_BYTE_LOOP: brcc _OW_SEND_0 brcs _OW_SEND_1 _OW_SEND_0: - cli ow_pull DELAY16 60 ow_release DELAY16 10 - sei rjmp _OW_SEND_BYTE_END _OW_SEND_1: - cli ow_pull DELAY16 6 ow_release DELAY16 64 - sei _OW_SEND_BYTE_END: dec r17 brne _OW_SEND_BYTE_LOOP + sei pop r17 pop r16 ret @@ -669,9 +708,9 @@ _OW_SEND_BYTE_END: OW_RD_BYTE: push r16 push r17 + cli clr r16 ldi r17, 8 - cli _OW_RD_BYTE_LP: lsr r16 ow_pull @@ -689,8 +728,6 @@ _OW_RD_BYTE_LP: pop r16 ret // - - // // diff --git a/main.hex b/main.hex index 15b4cf8..69e0737 100644 --- a/main.hex +++ b/main.hex @@ -7,69 +7,77 @@ :10004A000F931F935FB74091670045300CF403C0CC :10005A00442740936700403081F493989498959888 :10006A000EF002C00BE002C000916500002311F0FF -:10007A00929A01C09298BDD138D1413081F49298B8 +:10007A00929A01C09298FED17BD1413081F4929834 :10008A00949895980091640030916500032B11F0C3 -:10009A00939A01C0939800916400ABD126D1423063 -:1000AA0059F4929893989598949A00916300A1D1E3 -:1000BA00002D0F77002E19D1433041F4929893986E -:1000CA009498959A00916B0094D10FD143954093DF +:10009A00939A01C0939800916400ECD169D14230DF +:1000AA0059F4929893989598949A00916300E2D1A2 +:1000BA00002D0F77002E5CD1433041F4929893982B +:1000CA009498959A00916B00D5D152D1439540935B :1000DA0067005FBF1F910F915F914F9118950FEDC8 :1000EA000DBF0FE701BB01EE07BB0CE108BB02E045 :1000FA0000BF05E003BF09E106BF00E20BBF0CE148 :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 +:10012A0001E000936F0000270093690000936A00C2 +:10013A0000EF00936B0053E137E84DEFC5D15CE067 +:10014A0034E34DEFC1D1B2D000917000083209F406 +:10015A0005C012E0109360009CD101C096D180E0E6 +:10016A0090E000916000003031F4969869D18BD00C +:10017A0001E009BF39D0013019F4969861D104D150 +:10018A00023079F7969AEDCFEE24FF1841E1001F6D +:10019A00111F4A9509F40895EE1CFF1CE21AF30A8E +:1001AA0020F4E20EF31E8894F2CF0894F0CFFF18E1 +:1001BA0029E0001F2A9509F40895FF1CF11A18F482 +:1001CA00F10E8894F6CF0894F4CF5527442760E1BE +:1001DA003695279510F4400F511F57954795379537 +:1001EA0027956A95B9F708950F931F932F933F9315 +:1001FA004F935F930091690010916A002AE030E002 +:10020A00E4DF022F132F20916B003327020F131FF5 +:10021A00109371000093720040916D0050916C0030 +:10022A0060916E004F935F937727461B570BB42E4E +:10023A00A52E5F914F917727460F571FD42EC52EB3 +:10024A000EF004C0009510950F5F1F4FB016A1065F +:10025A0024F40D151C054CF40FC040916F00442383 +:10026A0011F4909801C0909A07C040916F004423FE +:10027A0011F4909A01C090985F914F913F912F91FC +:10028A001F910F9108951F9367D05CE034E34DEFFF +:10029A001BD15CE034E34DEF17D112D01091690005 +:1002AA00812F10916A00912F1F9108950F937AD090 +:1002BA0003E3802E8CD0A0E7B0E0A8D00F91089578 +:1002CA000F931F932F933F934F936CD070FF3EC0B1 +:1002DA000CEC802E7CD00EEB802E79D0A9E6B0E013 +:1002EA0095D0AAE6B0E092D01091690020916A00F8 +:1002FA002F93287F283F11F0E89409C02F91689422 +:10030A001095209531E0130F30E0231F01C02F9183 +:10031A002695179526951795269517952695179537 +:10032A00309169000EF43195432F3F70432F330FFC +:10033A00330F330F440F340F36953695369536956D +:10034A001093690020936A0030936B004F913F919C +:10035A002F911F910F9108950F9324D070FF06C01B +:10036A000CEC802E34D004E4802E31D00F91089505 +:10037A000F930FB800E40EB90BE10DB9769BFDCFD0 +:10038A00C09AC0980F9108950F938AD0B29B019694 +:10039A00B39B0197B49B01C003C000E000936000C7 +:1003AA000F910895F894B99A33E04EEB89D0B99831 +:1003BA0030E04AE885D005D033E042E381D0789432 +:1003CA000895B19B716002C0B1997E7F08950F9321 +:1003DA001F93F894082D18E0069508F448F0B99A86 +:1003EA0030E046E76DD0B99830E042E169D008C004 +:1003FA00B99A30E04AE064D0B99830E04EE760D06C +:10040A001A9551F778941F910F9108950F931F939E +:10041A00F894002718E00695B99A30E04AE050D0DF +:10042A00B99830E040E14CD0B199006830E04CE630 +:10043A0047D01A9581F70C9378941F910F910895DC +:10044A00F8945F9354E0A3E6B0E080936100909340 +:10045A00620000916100109162002AE030E094DEAF +:10046A00ED9200936100109362005A9591F75F91A3 +:10047A00789408950F931F93ECEFF4E01127E00F9F +:10048A00F11F04901F910F910895C59A22D0C59823 +:10049A000895C59A1ED01DD01CD01BD0C5980895AA +:1004AA000F931F932F932AE01FEF0FEF0A95F1F78F +:1004BA001A95D9F72A95C1F72F911F910F9108958F +:1004CA0041503040E8F70895415030405040E0F73D +:1004DA0008950F931F932F9326E00FEF1FEF1A959E +:1004EA00F1F70A95D9F72A95C1F72F911F910F9124 +:0E04FA000895C0F9A4B0999282F880909CBF3A :00000001FF