AVRASM ver. 2.2.7 main.asm Thu Jun 22 18:27:57 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(277): Including file 'div16u.asm' div16u.asm(22): warning: Register r16 already defined by the .DEF directive main.asm(277): 'div16u.asm' included form here div16u.asm(23): warning: Register r17 already defined by the .DEF directive main.asm(277): 'div16u.asm' included form here div16u.asm(24): warning: Register r16 already defined by the .DEF directive main.asm(277): 'div16u.asm' included form here div16u.asm(25): warning: Register r17 already defined by the .DEF directive main.asm(277): 'div16u.asm' included form here div16u.asm(27): warning: Register r19 already defined by the .DEF directive main.asm(277): 'div16u.asm' included form here div16u.asm(28): warning: Register r20 already defined by the .DEF directive main.asm(277): '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(277): 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 HYSTERESIS: .BYTE 1 ; Отклонение температуры от уставки 00006a TEMP_L: .BYTE 1 ; Младший байт температуры 00006b TEMP_H: .BYTE 1 ; Старший байт температуры 00006c TEMP_F: .BYTE 1 ; Дробная часть ;// // ; **** СЕГМЕНТ КОДА ********************************************** .CSEG // .ORG 0x00 000000 c074 rjmp RESET_vect .ORG 0x000B ; rjmp PCINT0_vect 00000b 9518 reti .ORG 0x000D 00000d c016 rjmp TIMER0_COMPA_vect // // PCINT0_vect: 00000e 9518 reti 00000f 930f push r16 000010 931f push r17 000011 932f push r18 000012 933f push r19 000013 b70f in r16, SREG ; display_off ; in r17, SW_PIN ; clr r18 ; ldi r18, (1< // ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ TIMER0_COMPA_vect: 000024 934f push r20 000025 935f push r21 000026 930f push r16 000027 931f push r17 000028 b75f in r21, SREG 000029 9140 0067 lds r20, CURRENT_DIGIT 00002b 3045 cpi r20, 5 00002c f40c brge _CLR_CURRENT_DIGIT ; сброс активного разряда если >= 5 00002d c003 rjmp _indicate_1 _CLR_CURRENT_DIGIT: ; сброс текущего активного разряда в ноль 00002e 2744 clr r20 00002f 9340 0067 sts CURRENT_DIGIT, r20 _indicate_1: 000031 3040 cpi r20, 0 000032 f481 brne _indicate_2 000033 9893 cbi PORTD, DIGIT_2_PIN 000034 9894 cbi PORTD, DIGIT_3_PIN 000035 9895 cbi PORTD, DIGIT_4_PIN 000036 f00e brts PC+2 000037 c002 rjmp PC+3 000038 e00b ldi TEMP_REG_A, 11 ; // - 000039 c002 rjmp PC+3 00003a 9100 0065 lds TEMP_REG_A, DIGITS+2 00003c 2300 tst TEMP_REG_A 00003d f011 breq PC+3 00003e 9a92 sbi PORTD, DIGIT_1_PIN 00003f c001 rjmp PC+2 000040 9892 cbi PORTD, DIGIT_1_PIN 000041 d167 rcall DISPLAY_DECODER 000042 d0e2 rcall USI_TRANSMIT _indicate_2: 000043 3041 cpi r20, 1 000044 f481 brne _indicate_3 000045 9892 cbi PORTD, DIGIT_1_PIN 000046 9894 cbi PORTD, DIGIT_3_PIN 000047 9895 cbi PORTD, DIGIT_4_PIN 000048 9100 0064 lds TEMP_REG_A, DIGITS+1 00004a 9130 0065 lds r19, DIGITS+2 00004c 2b03 or TEMP_REG_A, r19 00004d f011 breq PC+3 00004e 9a93 sbi PORTD, DIGIT_2_PIN 00004f c001 rjmp PC+2 000050 9893 cbi PORTD, DIGIT_2_PIN 000051 9100 0064 lds TEMP_REG_A, DIGITS+1 000053 d155 rcall DISPLAY_DECODER 000054 d0d0 rcall USI_TRANSMIT _indicate_3: 000055 3042 cpi r20, 2 000056 f459 brne _indicate_4 000057 9892 cbi PORTD, DIGIT_1_PIN 000058 9893 cbi PORTD, DIGIT_2_PIN 000059 9895 cbi PORTD, DIGIT_4_PIN 00005a 9a94 sbi PORTD, DIGIT_3_PIN 00005b 9100 0063 lds TEMP_REG_A, DIGITS 00005d d14b rcall DISPLAY_DECODER ; зажигаем точку 00005e 2d00 mov r16, r0 00005f 770f cbr r16, (1<<7) 000060 2e00 mov r0, r16 000061 d0c3 rcall USI_TRANSMIT _indicate_4: 000062 3043 cpi r20, 3 000063 f441 brne _indicate_exit 000064 9892 cbi PORTD, DIGIT_1_PIN 000065 9893 cbi PORTD, DIGIT_2_PIN 000066 9894 cbi PORTD, DIGIT_3_PIN 000067 9a95 sbi PORTD, DIGIT_4_PIN 000068 9100 006c lds TEMP_REG_A, TEMP_F 00006a d13e rcall DISPLAY_DECODER 00006b d0b9 rcall USI_TRANSMIT _indicate_exit: 00006c 9543 inc r20 00006d 9340 0067 sts CURRENT_DIGIT, r20 00006f bf5f out SREG, r21 000070 911f pop r17 000071 910f pop r16 000072 915f pop r21 000073 914f pop r20 000074 9518 reti ;// ; **** СТАРТ ПРОГРАММЫ ******************************************* RESET_vect: 000075 ed0f ldi TEMP_REG_A, LOW(RAMEND) 000076 bf0d out SPL, TEMP_REG_A // ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* 000077 e70f 000078 bb01 outi r16, DDRD, (1< // ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** LOOP: ; rcall DISPLAY_UPD_DIGITS 000098 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК _STATE_DEFAULT: 00009a 3000 cpi r16, MCU_STATE_DEFAULT 00009b f481 brne _STATE_PROGRAM 00009c 9896 cbi LED_ERR_PORT, LED_ERR_PIN 00009d d0f1 rcall DISPLAY_UPD_DIGITS 00009e d07c rcall TEMP_CONV 00009f d11f rcall DEBOUNCE_SW 0000a0 d11e rcall DEBOUNCE_SW 0000a1 d02f rcall TEMP_RD 0000a2 9110 006a lds r17, TEMP_L 0000a4 2f81 mov DISP_NUM_L, r17 0000a5 9110 006b lds r17, TEMP_H 0000a7 2f91 mov DISP_NUM_H, r17 0000a8 930f 0000a9 e001 0000aa bf09 0000ab 910f display_on _STATE_PROGRAM: 0000ac 3001 cpi r16, MCU_STATE_PROGRAM 0000ad f419 brne _STATE_ERROR 0000ae 9896 cbi LED_ERR_PORT, LED_ERR_PIN 0000af d0df rcall DISPLAY_UPD_DIGITS 0000b0 d080 rcall SW_CHECK_PROCESS _STATE_ERROR: 0000b1 3002 cpi r16, MCU_STATE_ERROR 0000b2 f729 brne LOOP 0000b3 9a96 sbi LED_ERR_PORT, LED_ERR_PIN 0000b4 e01b ldi r17, 11 0000b5 9310 0063 sts DIGITS, r17 0000b7 9310 0064 sts DIGITS+1, r17 0000b9 9310 0065 sts DIGITS+2, r17 0000bb 9310 0066 sts DIGITS+3, r17 0000bd cfda rjmp LOOP // ; **** ПОДПРОГРАММЫ ********************************************** .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: 0000be 24ee clr drem16uL ; clear remainder Low byte 0000bf 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry 0000c0 e141 ldi dcnt16u,17 ; init loop counter d16u_1: 0000c1 1f00 rol dd16uL ; shift left dividend 0000c2 1f11 rol dd16uH 0000c3 954a dec dcnt16u ; decrement counter 0000c4 f409 brne d16u_2 ; if done 0000c5 9508 ret ; return d16u_2: 0000c6 1cee rol drem16uL ; shift dividend into remainder 0000c7 1cff rol drem16uH 0000c8 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor 0000c9 0af3 sbc drem16uH,dv16uH 0000ca f420 brcc d16u_3 ; if result negative 0000cb 0ee2 add drem16uL,dv16uL ; restore remainder 0000cc 1ef3 adc drem16uH,dv16uH 0000cd 9488 clc ; clear carry to be shifted into result 0000ce cff2 rjmp d16u_1 ; else d16u_3: 0000cf 9408 sec ; set carry to be shifted into result 0000d0 cff0 // TEMP_RD: 0000d1 930f push r16 0000d2 931f push r17 0000d3 932f push r18 0000d4 933f push r19 0000d5 934f push r20 ; cli 0000d6 d068 rcall OW_PRESENCE 0000d7 ec0c ldi r16, DS18B20_CMD_SKIPROM 0000d8 2e80 mov OW_CMD_r, r16 0000d9 d07a rcall OW_SEND_BYTE 0000da eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD 0000db 2e80 mov OW_CMD_r, r16 0000dc d077 rcall OW_SEND_BYTE 0000dd e6aa ldi XL, LOW(TEMP_L) 0000de e0b0 ldi XH, HIGH(TEMP_L) 0000df d095 rcall OW_RD_BYTE 0000e0 e6ab ldi XL, LOW(TEMP_H) 0000e1 e0b0 ldi XH, HIGH(TEMP_H) 0000e2 d092 rcall OW_RD_BYTE 0000e3 9110 006a lds r17, TEMP_L 0000e5 9120 006b lds r18, TEMP_H 0000e7 932f push r18 0000e8 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) 0000e9 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой 0000ea f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число 0000eb 94e8 clt 0000ec c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) _TEMP_RD_TO_UNSIGNED: 0000ed 912f pop r18 0000ee 9468 set 0000ef 9510 com r17 0000f0 9520 com r18 0000f1 e031 ldi r19, 1 0000f2 0f13 add r17, r19 0000f3 e030 ldi r19, 0 0000f4 1f23 adc r18, r19 0000f5 c001 rjmp PC+2 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) 0000f6 912f pop r18 0000f7 9526 lsr r18 0000f8 9517 ror r17 0000f9 9526 lsr r18 0000fa 9517 ror r17 0000fb 9526 lsr r18 0000fc 9517 ror r17 0000fd 9526 lsr r18 0000fe 9517 ror r17 _TEMP_RD_END: 0000ff 9130 006a lds r19, TEMP_L 000101 f40e brtc PC+2 000102 9531 neg r19 ; переводим в беззнаковое число если минус ; далее происходит такое для получения дробной части: ; ((n<<3) + (n<<1))>>4 или (n*10)/16 000103 2f43 mov r20, r19 000104 703f andi r19, 0x0f 000105 2f43 mov r20, r19 000106 0f33 lsl r19 000107 0f33 lsl r19 000108 0f33 lsl r19 000109 0f44 lsl r20 00010a 0f34 add r19, r20 00010b 9536 lsr r19 00010c 9536 lsr r19 00010d 9536 lsr r19 00010e 9536 lsr r19 ; записываем данные 00010f 9310 006a sts TEMP_L, r17 000111 9320 006b sts TEMP_H, r18 000113 9330 006c sts TEMP_F, r19 ; sei 000115 914f pop r20 000116 913f pop r19 000117 912f pop r18 000118 911f pop r17 000119 910f pop r16 00011a 9508 ret ; TEMP_CONV: 00011b 930f push r16 ; cli 00011c d022 rcall OW_PRESENCE 00011d ec0c ldi r16, DS18B20_CMD_SKIPROM 00011e 2e80 mov OW_CMD_r, r16 00011f d034 rcall OW_SEND_BYTE 000120 e404 ldi r16, DS18B20_CMD_CONVERTTEMP 000121 2e80 mov OW_CMD_r, r16 000122 d031 rcall OW_SEND_BYTE ; sei 000123 910f pop r16 000124 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: 000125 930f push r16 000126 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) 000127 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) 000129 e10b ldi TEMP_REG_A, (1< // SW_CHECK_PROCESS: 000131 930f push r16 000132 d08c rcall DEBOUNCE_SW 000133 9bb2 sbis SW_PIN, SW_PLUS_PIN 000134 9601 adiw DISP_NUM_L, 1 000135 9bb3 sbis SW_PIN, SW_MINUS_PIN 000136 9701 sbiw DISP_NUM_L, 1 000137 9bb4 sbis SW_PIN, SW_SET_PIN 000138 c001 rjmp _INTO_DEFAULT_STATE 000139 c003 rjmp _SW_CHECK_PROCESS_END _INTO_DEFAULT_STATE: 00013a e000 ldi r16, MCU_STATE_DEFAULT 00013b 9300 0060 sts MCU_STATE, r16 _SW_CHECK_PROCESS_END: 00013d 910f pop r16 00013e 9508 ret // // // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: 00013f 94f8 cli 000140 9ab9 ow_pull 000141 e033 000142 eb4e 000143 d08b DELAY16 480 000144 98b9 ow_release 000145 e030 000146 e84a 000147 d087 DELAY16 70 000148 d005 rcall OW_CHECK_PRESENCE 000149 e033 00014a e342 00014b d083 DELAY16 410 00014c 9478 sei 00014d 9508 ret // // ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА ******************************* ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: 00014e 9bb1 sbis OW_PIN, OW_LINE 00014f 6071 sbr OWFR, (1< // OW_SEND_BYTE: 000154 930f push r16 000155 931f push r17 000156 2d08 mov r16, OW_CMD_r 000157 e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: 000158 9506 lsr r16 000159 f408 brcc _OW_SEND_0 00015a f058 brcs _OW_SEND_1 _OW_SEND_0: 00015b 94f8 cli 00015c 9ab9 ow_pull 00015d e030 00015e e746 00015f d06f DELAY16 60 000160 98b9 ow_release 000161 e030 000162 e142 000163 d06b DELAY16 10 000164 9478 sei 000165 c00a rjmp _OW_SEND_BYTE_END _OW_SEND_1: 000166 94f8 cli 000167 9ab9 ow_pull 000168 e030 000169 e04a 00016a d064 DELAY16 6 00016b 98b9 ow_release 00016c e030 00016d e74e 00016e d060 DELAY16 64 00016f 9478 sei _OW_SEND_BYTE_END: 000170 951a dec r17 000171 f731 brne _OW_SEND_BYTE_LOOP 000172 911f pop r17 000173 910f pop r16 000174 9508 ret // // OW_RD_BYTE: 000175 930f push r16 000176 931f push r17 000177 2700 clr r16 000178 e018 ldi r17, 8 000179 94f8 cli _OW_RD_BYTE_LP: 00017a 9506 lsr r16 00017b 9ab9 ow_pull 00017c e030 00017d e04a 00017e d050 DELAY16 6 00017f 98b9 ow_release 000180 e030 000181 e140 000182 d04c DELAY16 9 000183 99b1 sbic OW_PIN, OW_LINE 000184 6800 sbr r16, (1<<7) 000185 e030 000186 e64c 000187 d047 DELAY16 55 000188 951a dec r17 000189 f781 brne _OW_RD_BYTE_LP 00018a 930c st X, r16 00018b 9478 sei 00018c 911f pop r17 00018d 910f pop r16 00018e 9508 ret // // // ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: 00018f 94f8 cli 000190 935f push r21 000191 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный ; инициализация указателя (за каждый проход цикла будет инкрементироваться) 000192 e6a3 ldi XL, LOW(DIGITS) 000193 e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого 000194 9380 0061 sts dividend, DISP_NUM_L 000196 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры 000198 9100 0061 lds dd16uL, dividend 00019a 9110 0062 lds dd16uH, dividend+1 00019c e02a ldi dv16uL, LOW(divisor) 00019d e030 ldi dv16uH, HIGH(divisor) 00019e df1f rcall div16u ; делим 00019f 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое 0001a0 9300 0061 sts dividend, dres16uL 0001a2 9310 0062 sts dividend+1, dres16uH 0001a4 955a dec r21 ; декрементируем счетчик цикла 0001a5 f791 brne DIV_LOOP ; делим еще раз если не 0 0001a6 915f pop r21 0001a7 9478 sei 0001a8 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: 0001a9 930f push r16 0001aa 931f push r17 0001ab ece6 ldi ZL, LOW(2*DISPLAY_SYMBOLS) 0001ac e0f3 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 0001ad 2711 clr TEMP_REG_B 0001ae 0fe0 add ZL, TEMP_REG_A 0001af 1ff1 adc ZH, TEMP_REG_B 0001b0 9004 lpm r0, Z 0001b1 911f pop r17 0001b2 910f pop r16 0001b3 9508 ret// // BEEP_SHORT: 0001b4 9ac5 sbi BUZZER_PORT, BUZZER_PIN 0001b5 d01d rcall DELAY 0001b6 98c5 cbi BUZZER_PORT, BUZZER_PIN 0001b7 9508 ret // // BEEP_LONG: 0001b8 9ac5 sbi BUZZER_PORT, BUZZER_PIN 0001b9 d019 rcall DELAY 0001ba d018 rcall DELAY 0001bb d017 rcall DELAY 0001bc d016 rcall DELAY 0001bd 98c5 cbi BUZZER_PORT, BUZZER_PIN 0001be 9508 ret// // DEBOUNCE_SW: 0001bf 930f push r16 0001c0 931f push r17 0001c1 932f push r18 0001c2 e02a ldi r18, 10 _loop_2: 0001c3 ef1f ldi r17, 255 _loop_0: 0001c4 ef0f ldi r16, 255 _dec_0: 0001c5 950a dec r16 0001c6 f7f1 brne _dec_0 _loop_1: 0001c7 951a dec r17 0001c8 f7d9 brne _loop_0 _loop_3: 0001c9 952a dec r18 0001ca f7c1 brne _loop_2 0001cb 912f pop r18 0001cc 911f pop r17 0001cd 910f pop r16 0001ce 9508 ret// // DELAY_LOOP_16: 0001cf 5041 subi DELAY_8_r, 1 0001d0 4030 sbci DELAY_16_r, 0 0001d1 f7e8 brcc DELAY_LOOP_16 0001d2 9508 ret// // DELAY: 0001d3 930f push r16 0001d4 931f push r17 0001d5 932f push r18 0001d6 e026 ldi r18, 6 _DELAY_0: 0001d7 ef0f ldi r16, 255 _DELAY_1: 0001d8 ef1f ldi r17, 255 _DELAY_2: 0001d9 951a dec r17 0001da f7f1 brne _DELAY_2 0001db 950a dec r16 0001dc f7d9 brne _DELAY_1 0001dd 952a dec r18 0001de f7c1 brne _DELAY_0 0001df 912f pop r18 0001e0 911f pop r17 0001e1 910f pop r16 0001e2 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA 0001e3 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 0001e4 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 0001e5 9299 .DB 0b10011001, 0b10010010 ; 4, 5 0001e6 f882 .DB 0b10000010, 0b11111000 ; 6, 7 0001e7 9080 .DB 0b10000000, 0b10010000 ; 8, 9 0001e8 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 : 5 r9 : 0 r10: 0 r11: 0 r12: 0 r13: 0 r14: 5 r15: 5 r16: 96 r17: 48 r18: 30 r19: 38 r20: 31 r21: 8 r22: 0 r23: 2 r24: 5 r25: 3 r26: 3 r27: 3 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 : 3 brcs : 1 break : 0 breq : 4 brge : 1 brhc : 0 brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0 brne : 17 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 : 10 cpse : 0 dec : 10 eor : 0 icall : 0 ijmp : 0 in : 2 inc : 1 ld : 0 ldd : 0 ldi : 66 lds : 16 lpm : 2 lsl : 4 lsr : 10 mov : 11 movw : 0 neg : 1 nop : 0 or : 1 ori : 0 out : 15 pop : 32 push : 31 rcall : 42 ret : 16 reti : 4 rjmp : 19 rol : 4 ror : 4 sbc : 1 sbci : 1 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 : 20 sub : 2 subi : 1 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 0x0003d2 944 12 956 2048 46.7% [.dseg] 0x000060 0x00006d 0 13 13 128 10.2% [.eseg] 0x000000 0x000000 0 0 0 128 0.0% Assembly complete, 0 errors, 6 warnings