AVRASM ver. 2.2.7 main.asm Sat Jul 01 12:22:06 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(310): Including file 'div16u.asm' div16u.asm(22): warning: Register r16 already defined by the .DEF directive main.asm(310): 'div16u.asm' included form here div16u.asm(23): warning: Register r17 already defined by the .DEF directive main.asm(310): 'div16u.asm' included form here div16u.asm(24): warning: Register r16 already defined by the .DEF directive main.asm(310): 'div16u.asm' included form here div16u.asm(25): warning: Register r17 already defined by the .DEF directive main.asm(310): 'div16u.asm' included form here div16u.asm(27): warning: Register r19 already defined by the .DEF directive main.asm(310): 'div16u.asm' included form here div16u.asm(28): warning: Register r20 already defined by the .DEF directive main.asm(310): 'div16u.asm' included form here main.asm(311): Including file 'div8u.asm' div8u.asm(18): warning: Register r15 already defined by the .DEF directive main.asm(311): 'div8u.asm' included form here div8u.asm(19): warning: Register r16 already defined by the .DEF directive main.asm(311): 'div8u.asm' included form here div8u.asm(20): warning: Register r16 already defined by the .DEF directive main.asm(311): 'div8u.asm' included form here div8u.asm(21): warning: Register r17 already defined by the .DEF directive main.asm(311): 'div8u.asm' included form here div8u.asm(22): warning: Register r18 already defined by the .DEF directive main.asm(311): 'div8u.asm' included form here main.asm(312): Including file 'mpy16u.asm' mpy16u.asm(19): warning: Register r16 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here mpy16u.asm(20): warning: Register r17 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here mpy16u.asm(21): warning: Register r18 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here mpy16u.asm(22): warning: Register r19 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here mpy16u.asm(23): warning: Register r18 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here mpy16u.asm(24): warning: Register r19 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here mpy16u.asm(25): warning: Register r20 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here mpy16u.asm(26): warning: Register r21 already defined by the .DEF directive main.asm(312): 'mpy16u.asm' included form here main.asm(479): warning: Register r16 already defined by the .DEF directive main.asm(480): 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(310): Including file 'div16u.asm' main.asm(311): Including file 'div8u.asm' main.asm(312): Including file 'mpy16u.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 TEMP_L: .BYTE 1 ; Младший байт температуры 000069 TEMP_H: .BYTE 1 ; Старший байт температуры 00006a TEMP_F: .BYTE 1 ; Дробная часть 00006b SETTING_TEMP_H: .BYTE 1 ; Уставка температуры (старший байт) 00006c SETTING_TEMP_L: .BYTE 1 ; Уставка температуры (младший байт) 00006d SETTING_HYST: .BYTE 1 ; Гистерезис: отклонение от уставки 00006e SETTING_MODE: .BYTE 1 ; Режим работы: '1' - нагрев; '0' - 'охлаждение' 00006f DEVICE_FAMILY_CODE: .BYTE 1 ; Должно быть 0x10 для DS18B20 000070 PROGRAM_STEPS: .BYTE 1 ; Текущий "шаг" для настройки (0 - ничего; 1 - уставка T; 2 - гистерезис) 000071 SW_DATA: .BYTE 1 ;// // ; **** СЕГМЕНТ КОДА ********************************************** .CSEG // .ORG 0x00 000000 c06c rjmp RESET_vect .ORG 0x04 000004 9518 reti .ORG 0x000B 00000b c002 rjmp PCINT0_vect .ORG 0x000D 00000d c00d rjmp TIMER0_COMPA_vect // // PCINT0_vect: 00000e 930f push r16 00000f 931f push r17 000010 b70f in r16, SREG 000011 b316 in r17, SW_PIN ; если нажаты две кнопки то входим в режим программирования 000012 701c andi r17, (1< // ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ TIMER0_COMPA_vect: 00001b 930f push r16 00001c 931f push r17 00001d 932f push r18 00001e 933f push r19 00001f 934f push r20 000020 935f push r21 000021 b75f in r21, SREG 000022 9140 0067 lds r20, CURRENT_DIGIT 000024 3045 cpi r20, 5 000025 f40c brge _CLR_CURRENT_DIGIT ; сброс активного разряда если >= 5 000026 c003 rjmp _indicate_1 _CLR_CURRENT_DIGIT: ; сброс текущего активного разряда в ноль 000027 2744 clr r20 000028 9340 0067 sts CURRENT_DIGIT, r20 _indicate_1: 00002a 3040 cpi r20, 0 00002b f481 brne _indicate_2 00002c 9893 cbi PORTD, DIGIT_2_PIN 00002d 9894 cbi PORTD, DIGIT_3_PIN 00002e 9895 cbi PORTD, DIGIT_4_PIN 00002f f00e brts PC+2 000030 c002 rjmp PC+3 000031 e00b ldi TEMP_REG_A, 11 ; // - 000032 c002 rjmp PC+3 000033 9100 0065 lds TEMP_REG_A, DIGITS+2 000035 2300 tst TEMP_REG_A 000036 f011 breq PC+3 000037 9a92 sbi PORTD, DIGIT_1_PIN 000038 c001 rjmp PC+2 000039 9892 cbi PORTD, DIGIT_1_PIN 00003a d356 rcall DISPLAY_DECODER 00003b d202 rcall USI_TRANSMIT _indicate_2: 00003c 3041 cpi r20, 1 00003d f481 brne _indicate_3 00003e 9892 cbi PORTD, DIGIT_1_PIN 00003f 9894 cbi PORTD, DIGIT_3_PIN 000040 9895 cbi PORTD, DIGIT_4_PIN 000041 9100 0064 lds TEMP_REG_A, DIGITS+1 000043 9130 0065 lds r19, DIGITS+2 000045 2b03 or TEMP_REG_A, r19 000046 f011 breq PC+3 000047 9a93 sbi PORTD, DIGIT_2_PIN 000048 c001 rjmp PC+2 000049 9893 cbi PORTD, DIGIT_2_PIN 00004a 9100 0064 lds TEMP_REG_A, DIGITS+1 00004c d344 rcall DISPLAY_DECODER 00004d d1f0 rcall USI_TRANSMIT _indicate_3: 00004e 3042 cpi r20, 2 00004f f441 brne _indicate_4 000050 9892 cbi PORTD, DIGIT_1_PIN 000051 9893 cbi PORTD, DIGIT_2_PIN 000052 9895 cbi PORTD, DIGIT_4_PIN 000053 9a94 sbi PORTD, DIGIT_3_PIN 000054 9100 0063 lds TEMP_REG_A, DIGITS 000056 d33a rcall DISPLAY_DECODER 000057 d1e6 rcall USI_TRANSMIT _indicate_4: 000058 3043 cpi r20, 3 000059 f441 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 00005e 9100 0066 lds TEMP_REG_A, DIGITS+3 000060 d330 rcall DISPLAY_DECODER 000061 d1dc rcall USI_TRANSMIT _indicate_exit: 000062 9543 inc r20 000063 9340 0067 sts CURRENT_DIGIT, r20 000065 bf5f out SREG, r21 000066 915f pop r21 000067 914f pop r20 000068 913f pop r19 000069 912f pop r18 00006a 911f pop r17 00006b 910f pop r16 00006c 9518 reti ;// ; **** СТАРТ ПРОГРАММЫ ******************************************* RESET_vect: 00006d ed0f ldi TEMP_REG_A, LOW(RAMEND) 00006e bf0d out SPL, TEMP_REG_A // ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* 00006f e70f 000070 bb01 outi r16, DDRD, (1< // ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** LOOP: 0000c3 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК _STATE_DEFAULT: 0000c5 3000 cpi r16, MCU_STATE_DEFAULT 0000c6 f451 brne _STATE_PROGRAM 0000c7 9120 006a lds r18, TEMP_F 0000c9 9320 0066 sts DIGITS+3, r18 0000cb d103 rcall TEMP_UPD ; обновление данных о температуре 0000cc d2aa rcall DISPLAY_UPD_DIGITS 0000cd d0b4 rcall TEMP_COMPARSION ; логика термостата 0000ce e011 0000cf bf19 outi r17, 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: 0000e2 24ee clr drem16uL ; clear remainder Low byte 0000e3 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry 0000e4 e141 ldi dcnt16u,17 ; init loop counter d16u_1: 0000e5 1f00 rol dd16uL ; shift left dividend 0000e6 1f11 rol dd16uH 0000e7 954a dec dcnt16u ; decrement counter 0000e8 f409 brne d16u_2 ; if done 0000e9 9508 ret ; return d16u_2: 0000ea 1cee rol drem16uL ; shift dividend into remainder 0000eb 1cff rol drem16uH 0000ec 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor 0000ed 0af3 sbc drem16uH,dv16uH 0000ee f420 brcc d16u_3 ; if result negative 0000ef 0ee2 add drem16uL,dv16uL ; restore remainder 0000f0 1ef3 adc drem16uH,dv16uH 0000f1 9488 clc ; clear carry to be shifted into result 0000f2 cff2 rjmp d16u_1 ; else d16u_3: 0000f3 9408 sec ; set carry to be shifted into result .INCLUDE "div8u.asm" 0000f4 cff0 ;* ;* "div8u" - 8/8 Bit Unsigned Division ;* ;* This subroutine divides the two register variables "dd8u" (dividend) and ;* "dv8u" (divisor). The result is placed in "dres8u" and the remainder in ;* "drem8u". ;* ;* Number of words :14 ;* Number of cycles :97 ;* Low registers used :1 (drem8u) ;* High registers used :3 (dres8u/dd8u,dv8u,dcnt8u) ;* ;*************************************************************************** ;***** Subroutine Register Variables .def drem8u =r15 ;remainder .def dres8u =r16 ;result .def dd8u =r16 ;dividend .def dv8u =r17 ;divisor .def dcnt8u =r18 ;loop counter ;***** Code 0000f5 18ff div8u: sub drem8u,drem8u ;clear remainder and carry 0000f6 e029 ldi dcnt8u,9 ;init loop counter 0000f7 1f00 d8u_1: rol dd8u ;shift left dividend 0000f8 952a dec dcnt8u ;decrement counter 0000f9 f409 brne d8u_2 ;if done 0000fa 9508 ret ; return 0000fb 1cff d8u_2: rol drem8u ;shift dividend into remainder 0000fc 1af1 sub drem8u,dv8u ;remainder = remainder - divisor 0000fd f418 brcc d8u_3 ;if result negative 0000fe 0ef1 add drem8u,dv8u ; restore remainder 0000ff 9488 clc ; clear carry to be shifted into result 000100 cff6 rjmp d8u_1 ;else 000101 9408 d8u_3: sec ; set carry to be shifted into result .INCLUDE "mpy16u.asm" 000102 cff4 ;* ;* "mpy16u" - 16x16 Bit Unsigned Multiplication ;* ;* This subroutine multiplies the two 16-bit register variables ;* mp16uH:mp16uL and mc16uH:mc16uL. ;* The result is placed in m16u3:m16u2:m16u1:m16u0. ;* ;* Number of words :14 + return ;* Number of cycles :153 + return ;* Low registers used :None ;* High registers used :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2, ;* m16u3,mcnt16u) ;* ;*************************************************************************** ;***** Subroutine Register Variables .def mc16uL =r16 ;multiplicand low byte .def mc16uH =r17 ;multiplicand high byte .def mp16uL =r18 ;multiplier low byte .def mp16uH =r19 ;multiplier high byte .def m16u0 =r18 ;result byte 0 (LSB) .def m16u1 =r19 ;result byte 1 .def m16u2 =r20 ;result byte 2 .def m16u3 =r21 ;result byte 3 (MSB) .def mcnt16u =r22 ;loop counter ;***** Code 000103 2755 mpy16u: clr m16u3 ;clear 2 highest bytes of result 000104 2744 clr m16u2 000105 e160 ldi mcnt16u,16 ;init loop counter 000106 9536 lsr mp16uH 000107 9527 ror mp16uL 000108 f410 m16u_1: brcc noad8 ;if bit 0 of multiplier set 000109 0f40 add m16u2,mc16uL ;add multiplicand Low to byte 2 of res 00010a 1f51 adc m16u3,mc16uH ;add multiplicand high to byte 3 of res 00010b 9557 noad8: ror m16u3 ;shift right result byte 3 00010c 9547 ror m16u2 ;rotate right result byte 2 00010d 9537 ror m16u1 ;rotate result byte 1 and multiplier High 00010e 9527 ror m16u0 ;rotate result byte 0 and multiplier Low 00010f 956a dec mcnt16u ;decrement loop counter 000110 f7b9 brne m16u_1 ;if not done, loop more 000111 9508 // TEMP_SEND_UART: 000112 930f push r16 000113 931f push r17 ; целая часть 000114 9100 0068 lds r16, TEMP_L 000116 2e50 mov r5, r16 000117 d014 rcall UART_WR_BYTE ; дробная часть 000118 9100 006a lds r16, TEMP_F 00011a 2e50 mov r5, r16 00011b d010 rcall UART_WR_BYTE ; состояние реле 00011c b300 in r16, PIND 00011d 7001 andi r16, (1< // UART_WR_BYTE: 00012c 9b5d sbis UCSRA, UDRE 00012d cffe rjmp UART_WR_BYTE 00012e b85c out UDR, r5 00012f 9508 ret // // INIT_DEFAULT_PARAMS: 000130 e001 ldi r16, DEFAULT_SETTING_TEMP_H 000131 9300 006b sts SETTING_TEMP_H, r16 ; уставка HIGH 000133 2e40 mov EEP_D_r, r16 000134 e000 ldi r16, EEP_SETTING_TEMP_H 000135 2e30 mov EEP_A_r, r16 000136 d036 rcall EEP_WR_BYTE 000137 e20c ldi r16, DEFAULT_SETTING_TEMP_L 000138 9300 006c sts SETTING_TEMP_L, r16 ; уставка LOW 00013a 2e40 mov EEP_D_r, r16 00013b e001 ldi r16, EEP_SETTING_TEMP_L 00013c 2e30 mov EEP_A_r, r16 00013d d02f rcall EEP_WR_BYTE 00013e e005 ldi r16, DEFAULT_SETTING_HYST 00013f 9300 006d sts SETTING_HYST, r16 ; гистерезис 000141 2e40 mov EEP_D_r, r16 000142 e002 ldi r16, EEP_SETTING_HYST 000143 2e30 mov EEP_A_r, r16 000144 d028 rcall EEP_WR_BYTE 000145 e001 ldi r16, DEFAULT_SETTING_MODE 000146 9300 006e sts SETTING_MODE, r16 ; режим 000148 2e40 mov EEP_D_r, r16 000149 e003 ldi r16, EEP_SETTING_MODE 00014a 2e30 mov EEP_A_r, r16 00014b d021 rcall EEP_WR_BYTE 00014c e100 ldi r16, 0x10 00014d 2e40 mov EEP_D_r, r16 00014e e004 ldi r16, EEP_FIRST_TIME_RUN 00014f 2e30 mov EEP_A_r, r16 000150 d01c rcall EEP_WR_BYTE 000151 9508 ret // // WRITE_PARAMS_TO_EEP: 000152 930f push r16 000153 9100 006b lds r16, SETTING_TEMP_H ; уставка HIGH 000155 2e40 mov EEP_D_r, r16 000156 e000 ldi r16, EEP_SETTING_TEMP_H 000157 2e30 mov EEP_A_r, r16 000158 d014 rcall EEP_WR_BYTE 000159 9100 006c lds r16, SETTING_TEMP_L ; уставка LOW 00015b 2e40 mov EEP_D_r, r16 00015c e001 ldi r16, EEP_SETTING_TEMP_L 00015d 2e30 mov EEP_A_r, r16 00015e d00e rcall EEP_WR_BYTE 00015f 9100 006d lds r16, SETTING_HYST ; гистерезис 000161 2e40 mov EEP_D_r, r16 000162 e002 ldi r16, EEP_SETTING_HYST 000163 2e30 mov EEP_A_r, r16 000164 d008 rcall EEP_WR_BYTE 000165 9100 006e lds r16, SETTING_MODE ; режим 000167 2e40 mov EEP_D_r, r16 000168 e003 ldi r16, EEP_SETTING_MODE 000169 2e30 mov EEP_A_r, r16 00016a d002 rcall EEP_WR_BYTE 00016b 910f pop r16 00016c 9508 ret// // EEP_WR_BYTE: 00016d 94f8 cli 00016e 930f push r16 _EEP_WR_BYTE_LP: ; ждем завершения предыдущей записи 00016f 99e1 sbic EECR, EEPE 000170 cffe rjmp _EEP_WR_BYTE_LP ; режим программирования - атомарный 000171 e000 ldi r16, (0< // TEMP_COMPARSION: 000182 930f push r16 000183 931f push r17 000184 932f push r18 000185 933f push r19 000186 934f push r20 000187 935f push r21 000188 937f push r23 .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 ; умножаем температуру на 10 000189 9100 0068 lds mc16uL, TEMP_L // r16 00018b 9110 0069 lds mc16uH, TEMP_H // r17 00018d e02a ldi mp16uL, LOW(10) 00018e e030 ldi mp16uH, HIGH(10) 00018f df73 rcall mpy16u 000190 2f02 mov temp_r_l, m16u0 ; L 000191 2f13 mov temp_r_h, m16u1 ; H ; добавляем дробную часть 000192 9120 006a lds r18, TEMP_F 000194 2733 clr r19 000195 0f02 add temp_r_l, r18 000196 1f13 adc temp_r_h, r19 ; определяем нижний и верхний пороги 000197 9140 006c lds r20, SETTING_TEMP_L 000199 9150 006b lds r21, SETTING_TEMP_H 00019b 9160 006d lds r22, SETTING_HYST 00019d 934f push r20 00019e 935f push r21 00019f 2777 clr r23 0001a0 1b46 sub r20, r22 0001a1 0b57 sbc r21, r23 0001a2 2eb4 mov min_r_trhd_l, r20 0001a3 2ea5 mov min_r_trhd_h, r21 0001a4 915f pop r21 0001a5 914f pop r20 0001a6 2777 clr r23 0001a7 0f46 add r20, r22 0001a8 1f57 adc r21, r23 0001a9 2ed4 mov max_r_trhd_l, r20 0001aa 2ec5 mov max_r_trhd_h, r21 ; определяем знак температуры 0001ab f00e brts _NEGATE_TEMP 0001ac c004 rjmp _COMPARE _NEGATE_TEMP: 0001ad 9500 com temp_r_l 0001ae 9510 com temp_r_h 0001af 5f0f subi temp_r_l, low(-1) 0001b0 4f1f sbci temp_r_h, high(-1) _COMPARE: ; проверяем нижний порог 0001b1 16b0 cp min_r_trhd_l, temp_r_l 0001b2 06a1 cpc min_r_trhd_h, temp_r_h 0001b3 f424 brge _MIN_THRESHOLD ; TEMP <= MIN ; проверяем верхний порог 0001b4 150d cp temp_r_l, max_r_trhd_l 0001b5 051c cpc temp_r_h, max_r_trhd_h 0001b6 f44c brge _MAX_THRESHOLD ; TEMP >= TOP 0001b7 c00f rjmp _COMPARSION_EXIT _MIN_THRESHOLD: ; определяем режим работы 0001b8 9140 006e lds r20, SETTING_MODE 0001ba 2344 tst r20 0001bb f411 brne PC+3 0001bc 9890 relay_off 0001bd c001 rjmp PC+2 0001be 9a90 relay_on 0001bf c007 rjmp _COMPARSION_EXIT _MAX_THRESHOLD: 0001c0 9140 006e lds r20, SETTING_MODE 0001c2 2344 tst r20 0001c3 f411 brne PC+3 0001c4 9a90 relay_on 0001c5 c001 rjmp PC+2 0001c6 9890 relay_off _COMPARSION_EXIT: 0001c7 917f pop r23 0001c8 915f pop r21 0001c9 914f pop r20 0001ca 913f pop r19 0001cb 912f pop r18 0001cc 911f pop r17 0001cd 910f pop r16 0001ce 9508 ret // // TEMP_UPD: 0001cf 931f push r17 0001d0 d061 rcall TEMP_CONV 0001d1 e152 0001d2 e535 0001d3 eb4d 0001d4 d1f8 DELAY24 751000 0001d5 d012 rcall TEMP_RD ; обновляем данные в ячейках 0001d6 9110 0068 lds r17, TEMP_L 0001d8 2f81 mov DISP_NUM_L, r17 0001d9 9110 0069 lds r17, TEMP_H 0001db 2f91 mov DISP_NUM_H, r17 0001dc 911f pop r17 0001dd 9508 ret // // RD_F_CODE: 0001de 930f push r16 0001df d149 rcall OW_PRESENCE 0001e0 e303 ldi r16, DS18B20_CMD_READROM 0001e1 2e80 mov OW_CMD_r, r16 0001e2 d15b rcall OW_SEND_BYTE 0001e3 e6af ldi XL, LOW(DEVICE_FAMILY_CODE) 0001e4 e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) 0001e5 d177 rcall OW_RD_BYTE 0001e6 910f pop r16 0001e7 9508 ret// // TEMP_RD: 0001e8 930f push r16 0001e9 931f push r17 0001ea 932f push r18 0001eb 933f push r19 0001ec 934f push r20 0001ed d13b rcall OW_PRESENCE 0001ee ff70 sbrs OWFR, OWPRF 0001ef c03c rjmp _TEMP_RD_EXIT 0001f0 ec0c ldi r16, DS18B20_CMD_SKIPROM 0001f1 2e80 mov OW_CMD_r, r16 0001f2 d14b rcall OW_SEND_BYTE 0001f3 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD 0001f4 2e80 mov OW_CMD_r, r16 0001f5 d148 rcall OW_SEND_BYTE 0001f6 e6a8 ldi XL, LOW(TEMP_L) 0001f7 e0b0 ldi XH, HIGH(TEMP_L) 0001f8 d164 rcall OW_RD_BYTE 0001f9 e6a9 ldi XL, LOW(TEMP_H) 0001fa e0b0 ldi XH, HIGH(TEMP_H) 0001fb d161 rcall OW_RD_BYTE 0001fc 9110 0068 lds r17, TEMP_L 0001fe 9120 0069 lds r18, TEMP_H 000200 932f push r18 000201 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) 000202 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой 000203 f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число 000204 94e8 clt 000205 c007 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) _TEMP_RD_TO_UNSIGNED: 000206 912f pop r18 000207 9468 set 000208 9510 com r17 000209 9520 com r18 00020a 5f1f subi r17, low(-1) 00020b 4f2f sbci r18, high(-1) ; ldi r19, 1 ; add r17, r19 ; ldi r19, 0 ; adc r18, r19 00020c c001 rjmp PC+2 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) 00020d 912f pop r18 00020e 9526 lsr r18 00020f 9517 ror r17 000210 9526 lsr r18 000211 9517 ror r17 000212 9526 lsr r18 000213 9517 ror r17 000214 9526 lsr r18 000215 9517 ror r17 _TEMP_RD_END: 000216 9130 0068 lds r19, TEMP_L 000218 f40e brtc PC+2 000219 9531 neg r19 ; переводим в беззнаковое число если минус ; далее происходит такое для получения дробной части: ; ((n<<3) + (n<<1))>>4 или (n*10)/16 00021a 2f43 mov r20, r19 00021b 703f andi r19, 0x0f 00021c 2f43 mov r20, r19 00021d 0f33 lsl r19 00021e 0f33 lsl r19 00021f 0f33 lsl r19 000220 0f44 lsl r20 000221 0f34 add r19, r20 000222 9536 lsr r19 000223 9536 lsr r19 000224 9536 lsr r19 000225 9536 lsr r19 ; записываем данные 000226 9310 0068 sts TEMP_L, r17 000228 9320 0069 sts TEMP_H, r18 00022a 9330 006a sts TEMP_F, r19 _TEMP_RD_EXIT: 00022c 914f pop r20 00022d 913f pop r19 00022e 912f pop r18 00022f 911f pop r17 000230 910f pop r16 000231 9508 ret ; TEMP_CONV: 000232 930f push r16 000233 d0f5 rcall OW_PRESENCE 000234 ff70 sbrs OWFR, OWPRF 000235 c006 rjmp _TEMP_CONV_EXIT 000236 ec0c ldi r16, DS18B20_CMD_SKIPROM 000237 2e80 mov OW_CMD_r, r16 000238 d105 rcall OW_SEND_BYTE 000239 e404 ldi r16, DS18B20_CMD_CONVERTTEMP 00023a 2e80 mov OW_CMD_r, r16 00023b d102 rcall OW_SEND_BYTE _TEMP_CONV_EXIT: 00023c 910f pop r16 00023d 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: 00023e 930f push r16 00023f 920f push r0 000240 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) 000241 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) 000243 e10b ldi TEMP_REG_A, (1< BUTTON_PROCESS: 00024c 930f push r16 _SW_CHECK_ON_0: 00024d 9bb4 sbis SW_PIN, SW_SET_PIN 00024e c001 rjmp _SW_SET_0 00024f c01c rjmp _SW_CHECK_ON_1 _SW_SET_0: 000250 9100 0071 lds r16, SW_DATA 000252 2300 tst r16 000253 f409 brne _SW_SET_FROM_0_TO_1 000254 c017 rjmp _SW_CHECK_ON_1 _SW_SET_FROM_0_TO_1: 000255 2700 clr r16 000256 9300 0071 sts SW_DATA, r16 000258 d160 rcall DEBOUNCE_SW 000259 9463 inc REPROGRAM_STEP_r 00025a 2d16 mov r17, REPROGRAM_STEP_r 00025b 3014 cpi r17, 4 00025c f414 brge _SAVE_SETTINGS 00025d d14d rcall BEEP_SHORT 00025e c00d rjmp _SW_CHECK_ON_1 _SAVE_SETTINGS: 00025f e010 000260 bf19 outi r17, TIMSK, (0< REPROGRAM_SETTINGS: 00027a 930f push r16 00027b 931f push r17 00027c 932f push r18 00027d 933f push r19 00027e 934f push r20 00027f 2d06 mov r16, REPROGRAM_STEP_r 000280 2300 tst r16 000281 f009 breq _INTO 000282 c004 rjmp _REPROGRAM_SETTINGS_LOOP _INTO: 000283 9890 relay_off 000284 9a96 sbi PORTD, LED_PGM_PIN 000285 d125 rcall BEEP_SHORT 000286 9463 inc REPROGRAM_STEP_r _REPROGRAM_SETTINGS_LOOP: 000287 dfc4 rcall BUTTON_PROCESS _CHECK_STEP: 000288 3001 cpi r16, 1 000289 f029 breq _STEP_1 00028a 3002 cpi r16, 2 00028b f151 breq _STEP_2 00028c 3003 cpi r16, 3 00028d f139 breq _S3_JMP 00028e c094 rjmp _REPROGRAM_SETTINGS_END // _STEP_1: ; установка и отображение гистерезиса 00028f d0e7 rcall DISPLAY_UPD_DIGITS _S1_CHECK_PLUS: 000290 9bb2 sbis SW_PIN, SW_PLUS_PIN 000291 c004 rjmp _INCREASE_HYST 000292 c000 rjmp _S1_CHECK_MINUS _S1_CHECK_MINUS: 000293 9bb3 sbis SW_PIN, SW_MINUS_PIN 000294 c00a rjmp _DECREASE_HYST 000295 c011 rjmp _SHOW_HYST _INCREASE_HYST: 000296 d122 rcall DEBOUNCE_SW 000297 9110 006d lds r17, SETTING_HYST 000299 3c18 cpi r17, MAX_HYST 00029a f009 breq PC+2 00029b 9513 inc r17 00029c 9310 006d sts SETTING_HYST, r17 00029e c008 rjmp _SHOW_HYST _DECREASE_HYST: 00029f d119 rcall DEBOUNCE_SW 0002a0 9110 006d lds r17, SETTING_HYST 0002a2 3011 cpi r17, MIN_HYST 0002a3 f009 breq PC+2 0002a4 951a dec r17 0002a5 9310 006d sts SETTING_HYST, r17 _SHOW_HYST: 0002a7 94e8 clt 0002a8 930f push dd8u 0002a9 931f push dv8u 0002aa 9100 006d lds dd8u, SETTING_HYST 0002ac e01a ldi dv8u, 10 0002ad de47 rcall div8u 0002ae 2f80 mov DISP_NUM_L, dres8u 0002af 2799 clr DISP_NUM_H ; гистерезис 8 битный так что ноль пишем в старший байт 0002b0 92f0 0066 sts DIGITS+3, drem8u 0002b2 911f pop dv8u 0002b3 910f pop dd8u 0002b4 c06e rjmp _REPROGRAM_SETTINGS_END // _S3_JMP: ; просто прыжок на _STEP_3 0002b5 c047 rjmp _STEP_3 // _STEP_2: 0002b6 d0c0 rcall DISPLAY_UPD_DIGITS _S2_CHECK_PLUS: 0002b7 9bb2 sbis SW_PIN, SW_PLUS_PIN 0002b8 c004 rjmp _INCREASE_TEMP 0002b9 c000 rjmp _S2_CHECK_MINUS _S2_CHECK_MINUS: 0002ba 9bb3 sbis SW_PIN, SW_MINUS_PIN 0002bb c013 rjmp _DECREASE_TEMP 0002bc c021 rjmp _SHOW_TEMP _INCREASE_TEMP: 0002bd d0fb rcall DEBOUNCE_SW 0002be 9110 006c lds r17, SETTING_TEMP_L 0002c0 9120 006b lds r18, SETTING_TEMP_H 0002c2 3b10 cpi r17, MAX_TEMP_L 0002c3 e034 ldi r19, MAX_TEMP_H 0002c4 0723 cpc r18, r19 0002c5 f031 breq PC+7 0002c6 e03a ldi r19, 10 0002c7 0f13 add r17, r19 0002c8 2733 clr r19 0002c9 1f23 adc r18, r19 0002ca 9310 006c sts SETTING_TEMP_L, r17 0002cc 9320 006b sts SETTING_TEMP_H, r18 0002ce c00f rjmp _SHOW_TEMP _DECREASE_TEMP: 0002cf d0e9 rcall DEBOUNCE_SW 0002d0 9110 006c lds r17, SETTING_TEMP_L 0002d2 9120 006b lds r18, SETTING_TEMP_H 0002d4 301c cpi r17, MIN_TEMP_L 0002d5 ef3e ldi r19, MIN_TEMP_H 0002d6 0723 cpc r18, r19 0002d7 f011 breq PC+3 __DECREASE: 0002d8 501a subi r17, 10 0002d9 4020 sbci r18, 0 0002da 9310 006c sts SETTING_TEMP_L, r17 0002dc 9320 006b sts SETTING_TEMP_H, r18 _SHOW_TEMP: 0002de 930f push dd16uL 0002df 931f push dd16uH 0002e0 932f push dv16uL 0002e1 933f push dv16uH 0002e2 9100 006c lds dd16uL, SETTING_TEMP_L 0002e4 9110 006b lds dd16uH, SETTING_TEMP_H 0002e6 2f21 mov r18, dd16uH 0002e7 7820 andi r18, (1<<7) 0002e8 f411 brne _NEGATE_SET_TEMP 0002e9 94e8 clt 0002ea c005 rjmp _DIVIDE_SET_TEMP _NEGATE_SET_TEMP: 0002eb 9468 set 0002ec 9500 0002ed 9510 0002ee 5f0f 0002ef 4f1f com16 dd16uL, dd16uH _DIVIDE_SET_TEMP: 0002f0 e02a ldi dv16uL, LOW(10) 0002f1 e030 ldi dv16uH, HIGH(10) 0002f2 ddef rcall div16u 0002f3 2f80 mov DISP_NUM_L, dres16uL 0002f4 2f91 mov DISP_NUM_H, dres16uH 0002f5 e00a ldi r16, 10 0002f6 9300 0066 sts DIGITS+3, r16 ; значок градуса 0002f8 913f pop dv16uH 0002f9 912f pop dv16uL 0002fa 911f pop dd16uH 0002fb 910f pop dd16uL 0002fc c026 rjmp _REPROGRAM_SETTINGS_END // // _STEP_3: 0002fd 94e8 clt _S3_CHECK_PLUS: 0002fe 9bb2 sbis SW_PIN, SW_PLUS_PIN 0002ff c004 rjmp _SET_HEAT_MODE 000300 c000 rjmp _S3_CHECK_MINUS _S3_CHECK_MINUS: 000301 9bb3 sbis SW_PIN, SW_MINUS_PIN 000302 c006 rjmp _SET_COOLING_MODE 000303 c009 rjmp _SHOW_MODE _SET_HEAT_MODE: 000304 d0b4 rcall DEBOUNCE_SW 000305 e011 ldi r17, HEAT_MODE 000306 9310 006e sts SETTING_MODE, r17 000308 c004 rjmp _SHOW_MODE _SET_COOLING_MODE: 000309 d0af rcall DEBOUNCE_SW 00030a e010 ldi r17, COOLING_MODE 00030b 9310 006e sts SETTING_MODE, r17 _SHOW_MODE: 00030d 2711 clr r17 00030e 2f81 mov DISP_NUM_L, r17 00030f 2f91 mov DISP_NUM_H, r17 000310 e01e ldi r17, 14 000311 9310 0063 sts DIGITS, r17 000313 9310 0064 sts DIGITS+1, r17 000315 9310 0065 sts DIGITS+2, r17 000317 9120 006e lds r18, SETTING_MODE 000319 2322 tst r18 00031a f009 breq _SHOW_COOLING 00031b c004 rjmp _SHOW_HEATING _SHOW_COOLING: 00031c e01c ldi r17, 12 00031d 9310 0066 sts DIGITS+3, r17 00031f c003 rjmp _REPROGRAM_SETTINGS_END _SHOW_HEATING: 000320 e01d ldi r17, 13 000321 9310 0066 sts DIGITS+3, r17 // _REPROGRAM_SETTINGS_END: 000323 914f pop r20 000324 913f pop r19 000325 912f pop r18 000326 911f pop r17 000327 910f pop r16 000328 9508 ret // // // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: 000329 94f8 cli 00032a 9ab9 ow_pull 00032b e033 00032c eb4e 00032d d09b DELAY16 480 00032e 98b9 ow_release 00032f e030 000330 e84a 000331 d097 DELAY16 70 000332 d005 rcall OW_CHECK_PRESENCE 000333 e033 000334 e342 000335 d093 DELAY16 410 000336 9478 sei 000337 9508 ret // // ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА ******************************* ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: 000338 9bb1 sbis OW_PIN, OW_LINE 000339 6071 sbr OWFR, (1< // OW_SEND_BYTE: 00033e 94f8 cli 00033f 930f push r16 000340 931f push r17 000341 2d08 mov r16, OW_CMD_r 000342 e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: 000343 9506 lsr r16 000344 f408 brcc _OW_SEND_0 000345 f048 brcs _OW_SEND_1 _OW_SEND_0: 000346 9ab9 ow_pull 000347 e030 000348 e746 000349 d07f DELAY16 60 00034a 98b9 ow_release 00034b e030 00034c e142 00034d d07b DELAY16 10 00034e c008 rjmp _OW_SEND_BYTE_END _OW_SEND_1: 00034f 9ab9 ow_pull 000350 e030 000351 e04a 000352 d076 DELAY16 6 000353 98b9 ow_release 000354 e030 000355 e74e 000356 d072 DELAY16 64 _OW_SEND_BYTE_END: 000357 951a dec r17 000358 f751 brne _OW_SEND_BYTE_LOOP 000359 911f pop r17 00035a 910f pop r16 00035b 9478 sei 00035c 9508 ret // // OW_RD_BYTE: 00035d 94f8 cli 00035e 930f push r16 00035f 931f push r17 000360 2700 clr r16 000361 e018 ldi r17, 8 _OW_RD_BYTE_LP: 000362 9506 lsr r16 000363 9ab9 ow_pull 000364 e030 000365 e04a 000366 d062 DELAY16 6 000367 98b9 ow_release 000368 e030 000369 e140 00036a d05e DELAY16 9 00036b 99b1 sbic OW_PIN, OW_LINE 00036c 6800 sbr r16, (1<<7) 00036d e030 00036e e64c 00036f d059 DELAY16 55 000370 951a dec r17 000371 f781 brne _OW_RD_BYTE_LP 000372 930c st X, r16 000373 911f pop r17 000374 910f pop r16 000375 9478 sei 000376 9508 ret // // // ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: 000377 930f push r16 000378 935f push r21 000379 e053 ldi r21, 3 ; инициализация указателя (за каждый проход цикла будет инкрементироваться) 00037a e6a3 ldi XL, LOW(DIGITS) 00037b e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого 00037c 9380 0061 sts dividend, DISP_NUM_L 00037e 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры 000380 9100 0061 lds dd16uL, dividend 000382 9110 0062 lds dd16uH, dividend+1 000384 e02a ldi dv16uL, LOW(divisor) 000385 e030 ldi dv16uH, HIGH(divisor) 000386 dd5b rcall div16u ; делим 000387 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое 000388 9300 0061 sts dividend, dres16uL 00038a 9310 0062 sts dividend+1, dres16uH 00038c 955a dec r21 ; декрементируем счетчик цикла 00038d f791 brne DIV_LOOP ; делим еще раз если не 0 00038e 915f pop r21 00038f 910f pop r16 000390 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: 000391 930f push r16 000392 931f push r17 000393 eae4 ldi ZL, LOW(2*DISPLAY_SYMBOLS) 000394 e0f7 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 000395 2711 clr TEMP_REG_B 000396 0fe0 add ZL, TEMP_REG_A 000397 1ff1 adc ZH, TEMP_REG_B 000398 9004 lpm r0, Z 000399 9100 0067 lds r16, CURRENT_DIGIT 00039b 3002 cpi r16, 2 00039c f009 breq _DOT_ON 00039d c00a rjmp _DISPLAY_DECODER_EXIT _DOT_ON: 00039e 2d00 mov r16, r0 00039f 770f cbr r16, (1<<7) 0003a0 2e00 mov r0, r16 0003a1 2d06 mov r16, REPROGRAM_STEP_r 0003a2 3002 cpi r16, 2 0003a3 f40c brge _DOT_OFF 0003a4 c003 rjmp _DISPLAY_DECODER_EXIT _DOT_OFF: 0003a5 2d00 mov r16, r0 0003a6 6800 sbr r16, (1<<7) 0003a7 2e00 mov r0, r16 _DISPLAY_DECODER_EXIT: 0003a8 911f pop r17 0003a9 910f pop r16 0003aa 9508 ret // // BEEP_SHORT: 0003ab 9ac5 sbi BUZZER_PORT, BUZZER_PIN 0003ac e053 0003ad ea39 0003ae e74d 0003af d01d DELAY24 150000 0003b0 98c5 cbi BUZZER_PORT, BUZZER_PIN 0003b1 9508 ret // // BEEP_LONG: 0003b2 9ac5 sbi BUZZER_PORT, BUZZER_PIN 0003b3 e05c 0003b4 e334 0003b5 ef4d 0003b6 d016 DELAY24 500000 0003b7 98c5 cbi BUZZER_PORT, BUZZER_PIN 0003b8 9508 ret // // DEBOUNCE_SW: 0003b9 930f push r16 0003ba 931f push r17 0003bb 932f push r18 0003bc e02a ldi r18, 10 _loop_2: 0003bd ef1f ldi r17, 255 _loop_0: 0003be ef0f ldi r16, 255 _dec_0: 0003bf 950a dec r16 0003c0 f7f1 brne _dec_0 _loop_1: 0003c1 951a dec r17 0003c2 f7d9 brne _loop_0 _loop_3: 0003c3 952a dec r18 0003c4 f7c1 brne _loop_2 0003c5 912f pop r18 0003c6 911f pop r17 0003c7 910f pop r16 0003c8 9508 ret// // DELAY_LOOP_16: 0003c9 5041 subi DELAY_8_r, 1 0003ca 4030 sbci DELAY_16_r, 0 0003cb f7e8 brcc DELAY_LOOP_16 0003cc 9508 ret // // DELAY_LOOP_24: 0003cd 5041 subi DELAY_8_r, 1 0003ce 4030 sbci DELAY_16_r, 0 0003cf 4050 sbci DELAY_24_r, 0 0003d0 f7e0 brcc DELAY_LOOP_24 0003d1 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA 0003d2 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 0003d3 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 0003d4 9299 .DB 0b10011001, 0b10010010 ; 4, 5 0003d5 f882 .DB 0b10000010, 0b11111000 ; 6, 7 0003d6 9080 .DB 0b10000000, 0b10010000 ; 8, 9 0003d7 bf9c .DB 0b10011100, 0b10111111 ; °, - 0003d8 89c6 .DB 0b11000110, 0b10001001 ; C, H // // // ; **** СЕГМЕНТ EEPROM ******************************************** .ESEG .ORG 0x30 000030 41 000031 56 000032 52 000033 20 000034 54 000035 68 000036 65 000037 72 000038 6d 000039 6f 00003a 73 00003b 74 00003c 61 00003d 74 00003e 2e 00003f 20 000040 57 000041 72 000042 69 000043 74 000044 74 000045 65 000046 6e 000047 20 000048 62 000049 79 00004a 20 00004b 53 00004c 65 00004d 72 00004e 67 00004f 65 000050 79 000051 20 000052 59 000053 61 000054 72 000055 6b 000056 6f 000057 76 INFO: .DB "AVR Thermostat. Written by Sergey Yarkov" ; 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 : 8 r1 : 2 r2 : 0 r3 : 16 r4 : 16 r5 : 6 r6 : 7 r7 : 0 r8 : 6 r9 : 0 r10: 2 r11: 2 r12: 2 r13: 2 r14: 5 r15: 11 r16: 220 r17: 119 r18: 53 r19: 59 r20: 53 r21: 24 r22: 5 r23: 10 r24: 6 r25: 6 r26: 4 r27: 4 r28: 0 r29: 0 r30: 2 r31: 2 Registers used: 29 out of 35 (82.9%) "ATtiny2313A" instruction use summary: .lds : 0 .sts : 0 adc : 6 add : 8 adiw : 0 and : 0 andi : 4 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0 brcc : 6 brcs : 1 break : 0 breq : 15 brge : 5 brhc : 0 brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0 brne : 23 brpl : 0 brsh : 0 brtc : 1 brts : 2 brvc : 0 brvs : 0 bset : 0 bst : 0 cbi : 29 cbr : 3 clc : 2 clh : 0 cli : 5 cln : 0 clr : 18 cls : 0 clt : 4 clv : 0 clz : 0 com : 6 cp : 2 cpc : 4 cpi : 21 cpse : 0 dec : 11 eor : 0 icall : 0 ijmp : 0 in : 5 inc : 4 ld : 0 ldd : 0 ldi : 118 lds : 44 lpm : 2 lsl : 4 lsr : 11 mov : 58 movw : 0 neg : 1 nop : 0 or : 1 ori : 0 out : 26 pop : 56 push : 55 rcall : 82 ret : 28 reti : 3 rjmp : 63 rol : 6 ror : 9 sbc : 2 sbci : 7 sbi : 17 sbic : 5 sbis : 10 sbiw : 0 sbr : 3 sbrc : 0 sbrs : 2 sec : 2 seh : 0 sei : 5 sen : 0 ser : 2 ses : 0 set : 2 sev : 0 sez : 0 sleep : 0 spm : 0 st : 2 std : 0 sts : 48 sub : 5 subi : 6 swap : 0 tst : 7 wdr : 0 Instructions used: 56 out of 105 (53.3%) "ATtiny2313A" memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- [.cseg] 0x000000 0x0007b2 1936 14 1950 2048 95.2% [.dseg] 0x000060 0x000072 0 18 18 128 14.1% [.eseg] 0x000030 0x000058 0 40 40 128 31.3% Assembly complete, 0 errors, 21 warnings