AVRASM ver. 2.2.7 main.asm Tue Jun 20 12:55:26 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(286): Including file 'div16u.asm' div16u.asm(22): warning: Register r16 already defined by the .DEF directive main.asm(286): 'div16u.asm' included form here div16u.asm(23): warning: Register r17 already defined by the .DEF directive main.asm(286): 'div16u.asm' included form here div16u.asm(24): warning: Register r16 already defined by the .DEF directive main.asm(286): 'div16u.asm' included form here div16u.asm(25): warning: Register r17 already defined by the .DEF directive main.asm(286): 'div16u.asm' included form here div16u.asm(27): warning: Register r19 already defined by the .DEF directive main.asm(286): 'div16u.asm' included form here div16u.asm(28): warning: Register r20 already defined by the .DEF directive main.asm(286): '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(286): 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 ;// // ; **** СЕГМЕНТ КОДА ********************************************** .CSEG // .ORG 0x00 000000 c068 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 ; 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 b75f in r21, SREG 000027 9140 0067 lds r20, CURRENT_DIGIT 000029 3045 cpi r20, 5 00002a f40c brge _CLR_CURRENT_DIGIT ; сброс активного разряда если >= 5 00002b c003 rjmp _indicate_1 _CLR_CURRENT_DIGIT: ; сброс текущего активного разряда в ноль 00002c 2744 clr r20 00002d 9340 0067 sts CURRENT_DIGIT, r20 _indicate_1: 00002f 3040 cpi r20, 0 000030 f481 brne _indicate_2 000031 9893 cbi PORTD, DIGIT_2_PIN 000032 9894 cbi PORTD, DIGIT_3_PIN 000033 9895 cbi PORTD, DIGIT_4_PIN ; lds TEMP_REG_A, DIGITS+2 000034 f00e brts PC+2 000035 c002 rjmp PC+3 000036 e00b ldi TEMP_REG_A, 11 ; // - 000037 c002 rjmp PC+3 000038 9100 0065 lds TEMP_REG_A, DIGITS+2 00003a 2300 tst TEMP_REG_A 00003b f011 breq PC+3 00003c 9a92 sbi PORTD, DIGIT_1_PIN 00003d c001 rjmp PC+2 00003e 9892 cbi PORTD, DIGIT_1_PIN ; lds TEMP_REG_A, DIGITS+2 00003f d151 rcall DISPLAY_DECODER 000040 d0cc rcall USI_TRANSMIT _indicate_2: 000041 3041 cpi r20, 1 000042 f441 brne _indicate_3 000043 9892 cbi PORTD, DIGIT_1_PIN 000044 9894 cbi PORTD, DIGIT_3_PIN 000045 9895 cbi PORTD, DIGIT_4_PIN ; lds TEMP_REG_A, DIGITS+1 ; tst TEMP_REG_A ; breq PC+3 000046 9a93 sbi PORTD, DIGIT_2_PIN ; rjmp PC+2 ; cbi PORTD, DIGIT_1_PIN 000047 9100 0064 lds TEMP_REG_A, DIGITS+1 000049 d147 rcall DISPLAY_DECODER 00004a d0c2 rcall USI_TRANSMIT _indicate_3: 00004b 3042 cpi r20, 2 00004c f459 brne _indicate_4 00004d 9892 cbi PORTD, DIGIT_1_PIN 00004e 9893 cbi PORTD, DIGIT_2_PIN 00004f 9895 cbi PORTD, DIGIT_4_PIN 000050 9a94 sbi PORTD, DIGIT_3_PIN 000051 9100 0063 lds TEMP_REG_A, DIGITS 000053 d13d rcall DISPLAY_DECODER ; зажигаем точку 000054 2d00 mov r16, r0 000055 770f cbr r16, (1<<7) 000056 2e00 mov r0, r16 000057 d0b5 rcall USI_TRANSMIT _indicate_4: 000058 3043 cpi r20, 3 000059 f439 brne _indicate_exit 00005a 9892 cbi PORTD, DIGIT_1_PIN 00005b 9893 cbi PORTD, DIGIT_2_PIN 00005c 9894 cbi PORTD, DIGIT_3_PIN 00005d 9a95 sbi PORTD, DIGIT_4_PIN ; lds TEMP_REG_A, DIGITS 00005e e000 ldi TEMP_REG_A, 0 00005f d131 rcall DISPLAY_DECODER 000060 d0ac rcall USI_TRANSMIT _indicate_exit: 000061 9543 inc r20 000062 9340 0067 sts CURRENT_DIGIT, r20 000064 bf5f out SREG, r21 000065 910f pop r16 000066 915f pop r21 000067 914f pop r20 000068 9518 reti ;// ; **** СТАРТ ПРОГРАММЫ ******************************************* RESET_vect: 000069 ed0f ldi TEMP_REG_A, LOW(RAMEND) 00006a bf0d out SPL, TEMP_REG_A // ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* 00006b e70e 00006c bb01 outi r16, DDRD, (1< // ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** LOOP: ; rcall DISPLAY_UPD_DIGITS 000092 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК _STATE_DEFAULT: 000094 3000 cpi r16, MCU_STATE_DEFAULT 000095 f479 brne _STATE_PROGRAM 000096 d0e0 rcall DISPLAY_UPD_DIGITS 000097 fd70 sbrc OWFR, OWPRF 000098 9a96 sbi PORTD, PD6 000099 ff70 sbrs OWFR, OWPRF 00009a 9896 cbi PORTD, PD6 00009b d067 rcall TEMP_CONV 00009c d0ff rcall DEBOUNCE_SW 00009d d0fe rcall DEBOUNCE_SW 00009e d02e rcall TEMP_RD 00009f 9110 006a lds r17, TEMP_L 0000a1 2f81 mov DISP_NUM_L, r17 0000a2 9110 006b lds r17, TEMP_H 0000a4 2f91 mov DISP_NUM_H, r17 _STATE_PROGRAM: 0000a5 3001 cpi r16, MCU_STATE_PROGRAM 0000a6 f411 brne _STATE_ERROR 0000a7 d0cf rcall DISPLAY_UPD_DIGITS 0000a8 d070 rcall SW_CHECK_PROCESS _STATE_ERROR: 0000a9 3002 cpi r16, MCU_STATE_ERROR 0000aa f739 brne LOOP 0000ab e01b ldi r17, 11 0000ac 9310 0063 sts DIGITS, r17 0000ae 9310 0064 sts DIGITS+1, r17 0000b0 9310 0065 sts DIGITS+2, r17 0000b2 9310 0066 sts DIGITS+3, r17 0000b4 0000 nop 0000b5 cfdc 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: 0000b6 24ee clr drem16uL ; clear remainder Low byte 0000b7 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry 0000b8 e141 ldi dcnt16u,17 ; init loop counter d16u_1: 0000b9 1f00 rol dd16uL ; shift left dividend 0000ba 1f11 rol dd16uH 0000bb 954a dec dcnt16u ; decrement counter 0000bc f409 brne d16u_2 ; if done 0000bd 9508 ret ; return d16u_2: 0000be 1cee rol drem16uL ; shift dividend into remainder 0000bf 1cff rol drem16uH 0000c0 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor 0000c1 0af3 sbc drem16uH,dv16uH 0000c2 f420 brcc d16u_3 ; if result negative 0000c3 0ee2 add drem16uL,dv16uL ; restore remainder 0000c4 1ef3 adc drem16uH,dv16uH 0000c5 9488 clc ; clear carry to be shifted into result 0000c6 cff2 rjmp d16u_1 ; else d16u_3: 0000c7 9408 sec ; set carry to be shifted into result 0000c8 cff0 DELAY_LOOP_16: 0000c9 5041 subi DELAY_8_r, 1 0000ca 4030 sbci DELAY_16_r, 0 0000cb f7e8 brcc DELAY_LOOP_16 0000cc 9508 ret // TEMP_RD: 0000cd 930f push r16 0000ce 931f push r17 0000cf 932f push r18 0000d0 933f push r19 ; cli 0000d1 d055 rcall OW_PRESENCE 0000d2 ec0c ldi r16, DS18B20_CMD_SKIPROM 0000d3 2e80 mov OW_CMD_r, r16 0000d4 d067 rcall OW_SEND_BYTE 0000d5 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD 0000d6 2e80 mov OW_CMD_r, r16 0000d7 d064 rcall OW_SEND_BYTE 0000d8 e6aa ldi XL, LOW(TEMP_L) 0000d9 e0b0 ldi XH, HIGH(TEMP_L) 0000da d082 rcall OW_RD_BYTE 0000db e6ab ldi XL, LOW(TEMP_H) 0000dc e0b0 ldi XH, HIGH(TEMP_H) 0000dd d07f rcall OW_RD_BYTE 0000de 9110 006a lds r17, TEMP_L 0000e0 9120 006b lds r18, TEMP_H 0000e2 932f push r18 0000e3 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) 0000e4 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой 0000e5 f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число 0000e6 94e8 clt 0000e7 c009 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) _TEMP_RD_TO_UNSIGNED: 0000e8 912f pop r18 0000e9 9468 set 0000ea 9510 com r17 0000eb 9520 com r18 0000ec e031 ldi r19, 1 0000ed 0f13 add r17, r19 0000ee e030 ldi r19, 0 0000ef 1f23 adc r18, r19 0000f0 c001 rjmp PC+2 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) 0000f1 912f pop r18 0000f2 9526 lsr r18 0000f3 9517 ror r17 0000f4 9526 lsr r18 0000f5 9517 ror r17 0000f6 9526 lsr r18 0000f7 9517 ror r17 0000f8 9526 lsr r18 0000f9 9517 ror r17 _TEMP_RD_END: 0000fa 9310 006a sts TEMP_L, r17 0000fc 9320 006b sts TEMP_H, r18 ; sei 0000fe 913f pop r19 0000ff 912f pop r18 000100 911f pop r17 000101 910f pop r16 000102 9508 ret ; TEMP_CONV: 000103 930f push r16 ; cli 000104 d022 rcall OW_PRESENCE 000105 ec0c ldi r16, DS18B20_CMD_SKIPROM 000106 2e80 mov OW_CMD_r, r16 000107 d034 rcall OW_SEND_BYTE 000108 e404 ldi r16, DS18B20_CMD_CONVERTTEMP 000109 2e80 mov OW_CMD_r, r16 00010a d031 rcall OW_SEND_BYTE ; sei 00010b 910f pop r16 00010c 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: 00010d 930f push r16 00010e b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) 00010f 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) 000111 e10b ldi TEMP_REG_A, (1< // SW_CHECK_PROCESS: 000119 930f push r16 00011a d081 rcall DEBOUNCE_SW 00011b 9bb2 sbis SW_PIN, SW_PLUS_PIN 00011c 9601 adiw DISP_NUM_L, 1 00011d 9bb3 sbis SW_PIN, SW_MINUS_PIN 00011e 9701 sbiw DISP_NUM_L, 1 00011f 9bb4 sbis SW_PIN, SW_SET_PIN 000120 c001 rjmp _INTO_DEFAULT_STATE 000121 c003 rjmp _SW_CHECK_PROCESS_END _INTO_DEFAULT_STATE: 000122 e000 ldi r16, MCU_STATE_DEFAULT 000123 9300 0060 sts MCU_STATE, r16 _SW_CHECK_PROCESS_END: 000125 910f pop r16 000126 9508 ret // // // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: 000127 94f8 cli 000128 9ab9 ow_pull 000129 e033 00012a eb4e 00012b df9d DELAY16 480 00012c 98b9 ow_release 00012d e030 00012e e84a 00012f df99 DELAY16 70 000130 d005 rcall OW_CHECK_PRESENCE 000131 e033 000132 e342 000133 df95 DELAY16 410 000134 9478 sei 000135 9508 ret // // ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА ******************************* ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: 000136 9bb1 sbis OW_PIN, OW_LINE 000137 6071 sbr OWFR, (1< // OW_SEND_BYTE: 00013c 930f push r16 00013d 931f push r17 00013e 2d08 mov r16, OW_CMD_r 00013f e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: 000140 9506 lsr r16 000141 f408 brcc _OW_SEND_0 000142 f058 brcs _OW_SEND_1 _OW_SEND_0: 000143 94f8 cli 000144 9ab9 ow_pull 000145 e030 000146 e746 000147 df81 DELAY16 60 000148 98b9 ow_release 000149 e030 00014a e142 00014b df7d DELAY16 10 00014c 9478 sei 00014d c00a rjmp _OW_SEND_BYTE_END _OW_SEND_1: 00014e 94f8 cli 00014f 9ab9 ow_pull 000150 e030 000151 e04a 000152 df76 DELAY16 6 000153 98b9 ow_release 000154 e030 000155 e74e 000156 df72 DELAY16 64 000157 9478 sei _OW_SEND_BYTE_END: 000158 951a dec r17 000159 f731 brne _OW_SEND_BYTE_LOOP 00015a 911f pop r17 00015b 910f pop r16 00015c 9508 ret // // OW_RD_BYTE: 00015d 930f push r16 00015e 931f push r17 00015f 2700 clr r16 000160 e018 ldi r17, 8 000161 94f8 cli _OW_RD_BYTE_LP: 000162 9506 lsr r16 000163 9ab9 ow_pull 000164 e030 000165 e04a 000166 df62 DELAY16 6 000167 98b9 ow_release 000168 e030 000169 e140 00016a df5e DELAY16 9 00016b 99b1 sbic OW_PIN, OW_LINE 00016c 6800 sbr r16, (1<<7) 00016d e030 00016e e64c 00016f df59 DELAY16 55 000170 951a dec r17 000171 f781 brne _OW_RD_BYTE_LP 000172 930c st X, r16 000173 9478 sei 000174 911f pop r17 000175 910f pop r16 000176 9508 ret // // // ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: 000177 94f8 cli 000178 935f push r21 000179 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный ; инициализация указателя (за каждый проход цикла будет инкрементироваться) 00017a e6a3 ldi XL, LOW(DIGITS) 00017b e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого 00017c 9380 0061 sts dividend, DISP_NUM_L 00017e 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры 000180 9100 0061 lds dd16uL, dividend 000182 9110 0062 lds dd16uH, dividend+1 000184 e02a ldi dv16uL, LOW(divisor) 000185 e030 ldi dv16uH, HIGH(divisor) 000186 df2f rcall div16u ; делим 000187 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое 000188 9300 0061 sts dividend, dres16uL 00018a 9310 0062 sts dividend+1, dres16uH 00018c 955a dec r21 ; декрементируем счетчик цикла 00018d f791 brne DIV_LOOP ; делим еще раз если не 0 00018e 915f pop r21 00018f 9478 sei 000190 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: 000191 930f push r16 000192 931f push r17 000193 e7e4 ldi ZL, LOW(2*DISPLAY_SYMBOLS) 000194 e0f3 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 000195 2711 clr TEMP_REG_B 000196 0fe0 add ZL, TEMP_REG_A 000197 1ff1 adc ZH, TEMP_REG_B 000198 9004 lpm r0, Z 000199 911f pop r17 00019a 910f pop r16 00019b 9508 ret// // DEBOUNCE_SW: 00019c 930f push r16 00019d 931f push r17 00019e 932f push r18 00019f e02a ldi r18, 10 _loop_2: 0001a0 ef1f ldi r17, 255 _loop_0: 0001a1 ef0f ldi r16, 255 _dec_0: 0001a2 950a dec r16 0001a3 f7f1 brne _dec_0 _loop_1: 0001a4 951a dec r17 0001a5 f7d9 brne _loop_0 _loop_3: 0001a6 952a dec r18 0001a7 f7c1 brne _loop_2 0001a8 912f pop r18 0001a9 911f pop r17 0001aa 910f pop r16 0001ab 9508 ret// // DELAY: 0001ac 930f push r16 0001ad 931f push r17 0001ae ef0f ldi r16, 255 _DELAY_1: 0001af ef1f ldi r17, 255 _DELAY_2: 0001b0 951a dec r17 0001b1 0000 nop 0001b2 0000 nop 0001b3 0000 nop 0001b4 f7d9 brne _DELAY_2 0001b5 950a dec r16 0001b6 f7c1 brne _DELAY_1 0001b7 911f pop r17 0001b8 910f pop r16 0001b9 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA 0001ba f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 0001bb b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 0001bc 9299 .DB 0b10011001, 0b10010010 ; 4, 5 0001bd f882 .DB 0b10000010, 0b11111000 ; 6, 7 0001be 9080 .DB 0b10000000, 0b10010000 ; 8, 9 0001bf 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: 98 r17: 46 r18: 26 r19: 22 r20: 25 r21: 8 r22: 0 r23: 4 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 : 3 adiw : 1 and : 0 andi : 0 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0 brcc : 3 brcs : 1 break : 0 breq : 3 brge : 1 brhc : 0 brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0 brne : 16 brpl : 0 brsh : 0 brtc : 0 brts : 1 brvc : 0 brvs : 0 bset : 0 bst : 0 cbi : 19 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 : 9 eor : 0 icall : 0 ijmp : 0 in : 2 inc : 1 ld : 0 ldd : 0 ldi : 69 lds : 12 lpm : 2 lsl : 0 lsr : 6 mov : 9 movw : 0 neg : 0 nop : 4 or : 0 ori : 0 out : 19 pop : 28 push : 27 rcall : 36 ret : 14 reti : 3 rjmp : 18 rol : 4 ror : 4 sbc : 1 sbci : 1 sbi : 10 sbic : 3 sbis : 5 sbiw : 1 sbr : 2 sbrc : 1 sbrs : 1 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 : 18 sub : 2 subi : 1 swap : 0 tst : 1 wdr : 0 Instructions used: 52 out of 105 (49.5%) "ATtiny2313A" memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- [.cseg] 0x000000 0x000380 862 12 874 2048 42.7% [.dseg] 0x000060 0x00006c 0 12 12 128 9.4% [.eseg] 0x000000 0x000000 0 0 0 128 0.0% Assembly complete, 0 errors, 6 warnings