AVRASM ver. 2.2.7 main.asm Sat Jun 24 17:26:02 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' div16u.asm(22): warning: Register r16 already defined by the .DEF directive main.asm(294): '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 div16u.asm(24): warning: Register r16 already defined by the .DEF directive main.asm(294): '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 div16u.asm(27): warning: Register r19 already defined by the .DEF directive main.asm(294): '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 [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' ; ;***** Created: 2011-02-09 12:04 ******* Source: ATtiny2313A.xml ********* ;************************************************************************* ;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y ;* ;* Number : AVR000 ;* File Name : "tn2313Adef.inc" ;* Title : Register/Bit Definitions for the ATtiny2313A ;* Date : 2011-02-09 ;* Version : 2.35 ;* Support E-mail : avr@atmel.com ;* Target MCU : ATtiny2313A ;* ;* DESCRIPTION ;* When including this file in the assembly program file, all I/O register ;* names and I/O register bit names appearing in the data book can be used. ;* In addition, the six registers forming the three data pointers X, Y and ;* Z have been assigned names XL - ZH. Highest RAM address for Internal ;* SRAM is also defined ;* ;* The Register names are represented by their hexadecimal address. ;* ;* The Register Bit names are represented by their bit number (0-7). ;* ;* Please observe the difference in using the bit names with instructions ;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" ;* (skip if bit in register set/cleared). The following example illustrates ;* this: ;* ;* in r16,PORTB ;read PORTB latch ;* sbr r16,(1< ; **** СЕГМЕНТ ДАННЫХ ******************************************** .DSEG .ORG SRAM_START 000060 MCU_STATE: .BYTE 1 ; Текущее состояние МК 000061 SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке 000063 DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор 000067 CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит 000068 SW_FLAGS: .BYTE 1 ; Состояние кнопок 000069 TEMP_L: .BYTE 1 ; Младший байт температуры 00006a TEMP_H: .BYTE 1 ; Старший байт температуры 00006b TEMP_F: .BYTE 1 ; Дробная часть 00006c SETTING_INT: .BYTE 1 ; Уставка: целая часть 00006d SETTING_F: .BYTE 1 ; Уставка: дробная часть 00006e SETTING_HYST: .BYTE 1 ; Гистерезис: отклонение от уставки 00006f SETTING_MODE: .BYTE 1 ; Режим работы: '1' - нагрев; '0' - 'охлаждение' 000070 DEVICE_FAMILY_CODE: .BYTE 1 ; Должно быть 0x10 для DS18B20 ;// // ; **** СЕГМЕНТ КОДА ********************************************** .CSEG // .ORG 0x00 000000 c073 rjmp RESET_vect .ORG 0x000B ; rjmp PCINT0_vect 00000b 9518 reti .ORG 0x000D 00000d c015 rjmp TIMER0_COMPA_vect // // PCINT0_vect: 00000e 930f push r16 00000f 931f push r17 000010 932f push r18 000011 933f push r19 000012 b70f in r16, SREG ; display_off ; in r17, SW_PIN ; clr r18 ; ldi r18, (1< // ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ TIMER0_COMPA_vect: 000023 934f push r20 000024 935f push r21 000025 930f push r16 000026 931f push r17 000027 b75f in r21, SREG 000028 9140 0067 lds r20, CURRENT_DIGIT 00002a 3045 cpi r20, 5 00002b f40c brge _CLR_CURRENT_DIGIT ; сброс активного разряда если >= 5 00002c c003 rjmp _indicate_1 _CLR_CURRENT_DIGIT: ; сброс текущего активного разряда в ноль 00002d 2744 clr r20 00002e 9340 0067 sts CURRENT_DIGIT, r20 _indicate_1: 000030 3040 cpi r20, 0 000031 f481 brne _indicate_2 000032 9893 cbi PORTD, DIGIT_2_PIN 000033 9894 cbi PORTD, DIGIT_3_PIN 000034 9895 cbi PORTD, DIGIT_4_PIN 000035 f00e brts PC+2 000036 c002 rjmp PC+3 000037 e00b ldi TEMP_REG_A, 11 ; // - 000038 c002 rjmp PC+3 000039 9100 0065 lds TEMP_REG_A, DIGITS+2 00003b 2300 tst TEMP_REG_A 00003c f011 breq PC+3 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 _indicate_2: 000042 3041 cpi r20, 1 000043 f481 brne _indicate_3 000044 9892 cbi PORTD, DIGIT_1_PIN 000045 9894 cbi PORTD, DIGIT_3_PIN 000046 9895 cbi PORTD, DIGIT_4_PIN 000047 9100 0064 lds TEMP_REG_A, DIGITS+1 000049 9130 0065 lds r19, DIGITS+2 00004b 2b03 or TEMP_REG_A, r19 00004c f011 breq PC+3 00004d 9a93 sbi PORTD, DIGIT_2_PIN 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 _indicate_3: 000054 3042 cpi r20, 2 000055 f459 brne _indicate_4 000056 9892 cbi PORTD, DIGIT_1_PIN 000057 9893 cbi PORTD, DIGIT_2_PIN 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 ; зажигаем точку 00005d 2d00 mov r16, r0 00005e 770f cbr r16, (1<<7) 00005f 2e00 mov r0, r16 000060 d0f4 rcall USI_TRANSMIT _indicate_4: 000061 3043 cpi r20, 3 000062 f441 brne _indicate_exit 000063 9892 cbi PORTD, DIGIT_1_PIN 000064 9893 cbi PORTD, DIGIT_2_PIN 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 _indicate_exit: 00006b 9543 inc r20 00006c 9340 0067 sts CURRENT_DIGIT, r20 00006e bf5f out SREG, r21 00006f 911f pop r17 000070 910f pop r16 000071 915f pop r21 000072 914f pop r20 000073 9518 reti ;// ; **** СТАРТ ПРОГРАММЫ ******************************************* RESET_vect: 000074 ed0f ldi TEMP_REG_A, LOW(RAMEND) 000075 bf0d out SPL, TEMP_REG_A // ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* 000076 e70f 000077 bb01 outi r16, DDRD, (1< // ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** LOOP: ; rcall DISPLAY_UPD_DIGITS 0000ae 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 d10b rcall DISPLAY_UPD_DIGITS 0000b4 d029 rcall TEMP_UPD 0000b5 e001 0000b6 bf09 outi r16, TIMSK, (1< ; **** ПОДПРОГРАММЫ ********************************************** .INCLUDE "div16u.asm" ;* ;* "div16u" - 16/16 Bit Unsigned Division ;* ;* This subroutine divides the two 16-bit numbers ;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor). ;* The result is placed in "dres16uH:dres16uL" and the remainder in ;* "drem16uH:drem16uL". ;* ;* Number of words :19 ;* Number of cycles :235/251 (Min/Max) ;* Low registers used :2 (drem16uL,drem16uH) ;* High registers used :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH, ;* dcnt16u) ;* ;*************************************************************************** ;***** Subroutine Register Variables .def drem16uL=r14 .def drem16uH=r15 .def dres16uL=r16 .def dres16uH=r17 .def dd16uL =r16 .def dd16uH =r17 .def dv16uL =r18 .def dv16uH =r19 .def dcnt16u =r20 ;***** 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 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 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 d16u_3: 0000db 9408 sec ; set carry to be shifted into result 0000dc 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 ; 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 // 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 ; обновляем данные в ячейках 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 // // RD_F_CODE: 0000f1 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 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// // TEMP_RD: 000101 930f push r16 000102 931f push r17 000103 932f push r18 000104 933f push r19 000105 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 00010a eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD 00010b 2e80 mov OW_CMD_r, r16 00010c 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 000110 e6aa ldi XL, LOW(TEMP_H) 000111 e0b0 ldi XH, HIGH(TEMP_H) 000112 d092 rcall OW_RD_BYTE 000113 9110 0069 lds r17, TEMP_L 000115 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) _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 _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 _TEMP_RD_END: 00012f 9130 0069 lds r19, TEMP_L 000131 f40e brtc PC+2 000132 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 000139 0f44 lsl r20 00013a 0f34 add r19, r20 00013b 9536 lsr r19 00013c 9536 lsr r19 00013d 9536 lsr r19 00013e 9536 lsr r19 ; записываем данные 00013f 9310 0069 sts TEMP_L, r17 000141 9320 006a sts TEMP_H, r18 000143 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 ; TEMP_CONV: 00014b 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 000150 e404 ldi r16, DS18B20_CMD_CONVERTTEMP 000151 2e80 mov OW_CMD_r, r16 000152 d031 rcall OW_SEND_BYTE ; sei 000153 910f pop r16 000154 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: 000155 930f push r16 000156 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 Wire Mode ; USICS1 <--------------> USI Clock Source Select ; USICLK <--------------> USI Clock Strobe ; USITC <--------------> USI Toggle Clock (Enable clock generation) 000159 e10b ldi TEMP_REG_A, (1< // 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 000165 9bb3 sbis SW_PIN, SW_MINUS_PIN 000166 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 _INTO_DEFAULT_STATE: 00016a e000 ldi r16, MCU_STATE_DEFAULT 00016b 9300 0060 sts MCU_STATE, r16 _SW_CHECK_PROCESS_END: 00016d 910f pop r16 00016e 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 // // ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА ******************************* ; Если подчиненное устройство притянет шину, то устанавливаем флаг 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 _OW_SEND_BYTE_LOOP: 000188 9506 lsr r16 000189 f408 brcc _OW_SEND_0 00018a 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 _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 _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 // // OW_RD_BYTE: 0001a5 930f push r16 0001a6 931f push r17 0001a7 2700 clr r16 0001a8 e018 ldi r17, 8 0001a9 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 // // // ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: 0001bf 94f8 cli 0001c0 935f push r21 0001c1 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный ; инициализация указателя (за каждый проход цикла будет инкрементироваться) 0001c2 e6a3 ldi XL, LOW(DIGITS) 0001c3 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 ; четыре раза производим деление для получения остатков 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) 0001ce defb rcall div16u ; делим 0001cf 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое 0001d0 9300 0061 sts dividend, dres16uL 0001d2 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 // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В 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) 0001dd 2711 clr TEMP_REG_B 0001de 0fe0 add ZL, TEMP_REG_A 0001df 1ff1 adc ZH, TEMP_REG_B 0001e0 9004 lpm r0, Z 0001e1 911f pop r17 0001e2 910f pop r16 0001e3 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 // // 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// // DEBOUNCE_SW: 0001ef 930f push r16 0001f0 931f push r17 0001f1 932f push r18 0001f2 e02a ldi r18, 10 _loop_2: 0001f3 ef1f ldi r17, 255 _loop_0: 0001f4 ef0f ldi r16, 255 _dec_0: 0001f5 950a dec r16 0001f6 f7f1 brne _dec_0 _loop_1: 0001f7 951a dec r17 0001f8 f7d9 brne _loop_0 _loop_3: 0001f9 952a dec r18 0001fa f7c1 brne _loop_2 0001fb 912f pop r18 0001fc 911f pop r17 0001fd 910f pop r16 0001fe 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 // 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 // DELAY: 000208 930f push r16 000209 931f push r17 00020a 932f push r18 00020b e026 ldi r18, 6 _DELAY_0: 00020c ef0f ldi r16, 255 _DELAY_1: 00020d ef1f ldi r17, 255 _DELAY_2: 00020e 951a dec r17 00020f f7f1 brne _DELAY_2 000210 950a dec r16 000211 f7d9 brne _DELAY_1 000212 952a dec r18 000213 f7c1 brne _DELAY_0 000214 912f pop r18 000215 911f pop r17 000216 910f pop r16 000217 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 ; °, -// // // ; **** СЕГМЕНТ EEPROM ******************************************** ; .ESEG ; INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023" ; RESOURCE USE INFORMATION ------------------------ Notice: The register and instruction counts are symbol table hit counts, and hence implicitly used resources are not counted, eg, the 'lpm' instruction without operands implicitly uses r0 and z, none of which are counted. x,y,z are separate entities in the symbol table and are counted separately from r26..r31 here. .dseg memory usage only counts static data declared with .byte "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 r29: 0 r30: 2 r31: 2 Registers used: 20 out of 35 (57.1%) "ATtiny2313A" instruction use summary: .lds : 0 .sts : 0 adc : 3 add : 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 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 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 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%) "ATtiny2313A" memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- [.cseg] 0x000000 0x00043c 1050 12 1062 2048 51.9% [.dseg] 0x000060 0x000071 0 17 17 128 13.3% [.eseg] 0x000000 0x000000 0 0 0 128 0.0% Assembly complete, 0 errors, 6 warnings