AVRASM ver. 2.2.7 main.asm Sat Jul 08 00:55:30 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(313): Including file 'div16u.asm' div16u.asm(22): warning: Register r16 already defined by the .DEF directive main.asm(313): 'div16u.asm' included form here div16u.asm(23): warning: Register r17 already defined by the .DEF directive main.asm(313): 'div16u.asm' included form here div16u.asm(24): warning: Register r16 already defined by the .DEF directive main.asm(313): 'div16u.asm' included form here div16u.asm(25): warning: Register r17 already defined by the .DEF directive main.asm(313): 'div16u.asm' included form here div16u.asm(27): warning: Register r19 already defined by the .DEF directive main.asm(313): 'div16u.asm' included form here div16u.asm(28): warning: Register r20 already defined by the .DEF directive main.asm(313): 'div16u.asm' included form here main.asm(314): Including file 'div8u.asm' div8u.asm(18): warning: Register r15 already defined by the .DEF directive main.asm(314): 'div8u.asm' included form here div8u.asm(19): warning: Register r16 already defined by the .DEF directive main.asm(314): 'div8u.asm' included form here div8u.asm(20): warning: Register r16 already defined by the .DEF directive main.asm(314): 'div8u.asm' included form here div8u.asm(21): warning: Register r17 already defined by the .DEF directive main.asm(314): 'div8u.asm' included form here div8u.asm(22): warning: Register r18 already defined by the .DEF directive main.asm(314): 'div8u.asm' included form here main.asm(315): Including file 'mpy16u.asm' mpy16u.asm(19): warning: Register r16 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here mpy16u.asm(20): warning: Register r17 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here mpy16u.asm(21): warning: Register r18 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here mpy16u.asm(22): warning: Register r19 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here mpy16u.asm(23): warning: Register r18 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here mpy16u.asm(24): warning: Register r19 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here mpy16u.asm(25): warning: Register r20 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here mpy16u.asm(26): warning: Register r21 already defined by the .DEF directive main.asm(315): 'mpy16u.asm' included form here main.asm(511): warning: Register r16 already defined by the .DEF directive main.asm(512): 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(313): Including file 'div16u.asm' main.asm(314): Including file 'div8u.asm' main.asm(315): 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 c071 rjmp RESET_vect .ORG 0x04 000004 9518 reti .ORG 0x000B 00000b c002 rjmp PCINT0_vect .ORG 0x000D 00000d c012 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: 000020 930f push r16 000021 931f push r17 000022 932f push r18 000023 933f push r19 000024 934f push r20 000025 935f push r21 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 9a93 sbi PORTD, DIGIT_2_PIN 000032 9a94 sbi PORTD, DIGIT_3_PIN 000033 9a95 sbi PORTD, DIGIT_4_PIN 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 9892 cbi PORTD, DIGIT_1_PIN 00003d c001 rjmp PC+2 00003e 9a92 sbi PORTD, DIGIT_1_PIN 00003f d36e rcall DISPLAY_DECODER 000040 d21a rcall USI_TRANSMIT _indicate_2: 000041 3041 cpi r20, 1 000042 f481 brne _indicate_3 000043 9a92 sbi PORTD, DIGIT_1_PIN 000044 9a94 sbi PORTD, DIGIT_3_PIN 000045 9a95 sbi PORTD, DIGIT_4_PIN 000046 9100 0064 lds TEMP_REG_A, DIGITS+1 000048 9130 0065 lds r19, DIGITS+2 00004a 2b03 or TEMP_REG_A, r19 00004b f011 breq PC+3 00004c 9893 cbi PORTD, DIGIT_2_PIN 00004d c001 rjmp PC+2 00004e 9a93 sbi PORTD, DIGIT_2_PIN 00004f 9100 0064 lds TEMP_REG_A, DIGITS+1 000051 d35c rcall DISPLAY_DECODER 000052 d208 rcall USI_TRANSMIT _indicate_3: 000053 3042 cpi r20, 2 000054 f441 brne _indicate_4 000055 9a92 sbi PORTD, DIGIT_1_PIN 000056 9a93 sbi PORTD, DIGIT_2_PIN 000057 9a95 sbi PORTD, DIGIT_4_PIN 000058 9894 cbi PORTD, DIGIT_3_PIN 000059 9100 0063 lds TEMP_REG_A, DIGITS 00005b d352 rcall DISPLAY_DECODER 00005c d1fe rcall USI_TRANSMIT _indicate_4: 00005d 3043 cpi r20, 3 00005e f441 brne _indicate_exit 00005f 9a92 sbi PORTD, DIGIT_1_PIN 000060 9a93 sbi PORTD, DIGIT_2_PIN 000061 9a94 sbi PORTD, DIGIT_3_PIN 000062 9895 cbi PORTD, DIGIT_4_PIN 000063 9100 0066 lds TEMP_REG_A, DIGITS+3 000065 d348 rcall DISPLAY_DECODER 000066 d1f4 rcall USI_TRANSMIT _indicate_exit: 000067 9543 inc r20 000068 9340 0067 sts CURRENT_DIGIT, r20 00006a bf5f out SREG, r21 00006b 915f pop r21 00006c 914f pop r20 00006d 913f pop r19 00006e 912f pop r18 00006f 911f pop r17 000070 910f pop r16 000071 9518 reti ;// ; **** СТАРТ ПРОГРАММЫ ******************************************* RESET_vect: 000072 ed0f ldi TEMP_REG_A, LOW(RAMEND) 000073 bf0d out SPL, TEMP_REG_A // ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** MCU_INIT: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* 000074 e70f 000075 bb01 outi r16, DDRD, (1< // ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** LOOP: 0000ca 9100 0060 lds r16, MCU_STATE ; получаем текущее состояние МК _STATE_DEFAULT: 0000cc 3000 cpi r16, MCU_STATE_DEFAULT 0000cd f451 brne _STATE_PROGRAM 0000ce 9120 006a lds r18, TEMP_F 0000d0 9320 0066 sts DIGITS+3, r18 0000d2 d119 rcall TEMP_UPD ; обновление данных о температуре 0000d3 d2c0 rcall DISPLAY_UPD_DIGITS 0000d4 d0ca rcall TEMP_COMPARSION ; логика термостата 0000d5 e011 0000d6 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: 0000e9 24ee clr drem16uL ; clear remainder Low byte 0000ea 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry 0000eb e141 ldi dcnt16u,17 ; init loop counter d16u_1: 0000ec 1f00 rol dd16uL ; shift left dividend 0000ed 1f11 rol dd16uH 0000ee 954a dec dcnt16u ; decrement counter 0000ef f409 brne d16u_2 ; if done 0000f0 9508 ret ; return d16u_2: 0000f1 1cee rol drem16uL ; shift dividend into remainder 0000f2 1cff rol drem16uH 0000f3 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor 0000f4 0af3 sbc drem16uH,dv16uH 0000f5 f420 brcc d16u_3 ; if result negative 0000f6 0ee2 add drem16uL,dv16uL ; restore remainder 0000f7 1ef3 adc drem16uH,dv16uH 0000f8 9488 clc ; clear carry to be shifted into result 0000f9 cff2 rjmp d16u_1 ; else d16u_3: 0000fa 9408 sec ; set carry to be shifted into result .INCLUDE "div8u.asm" 0000fb 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 0000fc 18ff div8u: sub drem8u,drem8u ;clear remainder and carry 0000fd e029 ldi dcnt8u,9 ;init loop counter 0000fe 1f00 d8u_1: rol dd8u ;shift left dividend 0000ff 952a dec dcnt8u ;decrement counter 000100 f409 brne d8u_2 ;if done 000101 9508 ret ; return 000102 1cff d8u_2: rol drem8u ;shift dividend into remainder 000103 1af1 sub drem8u,dv8u ;remainder = remainder - divisor 000104 f418 brcc d8u_3 ;if result negative 000105 0ef1 add drem8u,dv8u ; restore remainder 000106 9488 clc ; clear carry to be shifted into result 000107 cff6 rjmp d8u_1 ;else 000108 9408 d8u_3: sec ; set carry to be shifted into result .INCLUDE "mpy16u.asm" 000109 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 00010a 2755 mpy16u: clr m16u3 ;clear 2 highest bytes of result 00010b 2744 clr m16u2 00010c e160 ldi mcnt16u,16 ;init loop counter 00010d 9536 lsr mp16uH 00010e 9527 ror mp16uL 00010f f410 m16u_1: brcc noad8 ;if bit 0 of multiplier set 000110 0f40 add m16u2,mc16uL ;add multiplicand Low to byte 2 of res 000111 1f51 adc m16u3,mc16uH ;add multiplicand high to byte 3 of res 000112 9557 noad8: ror m16u3 ;shift right result byte 3 000113 9547 ror m16u2 ;rotate right result byte 2 000114 9537 ror m16u1 ;rotate result byte 1 and multiplier High 000115 9527 ror m16u0 ;rotate result byte 0 and multiplier Low 000116 956a dec mcnt16u ;decrement loop counter 000117 f7b9 brne m16u_1 ;if not done, loop more 000118 9508 // TEMP_SEND_UART: 000119 930f push r16 00011a 931f push r17 ; целая часть 00011b 9100 0068 lds r16, TEMP_L 00011d 2e50 mov r5, r16 00011e d02a rcall UART_WR_BYTE ; дробная часть 00011f 9100 006a lds r16, TEMP_F 000121 2e50 mov r5, r16 000122 d026 rcall UART_WR_BYTE ; состояние реле 000123 b300 in r16, PIND 000124 7001 andi r16, (1< // UART_WR_BYTE: 000149 9b5d sbis UCSRA, UDRE 00014a cffe rjmp UART_WR_BYTE 00014b b85c out UDR, r5 00014c 9508 ret // // INIT_DEFAULT_PARAMS: 00014d e001 ldi r16, DEFAULT_SETTING_TEMP_H 00014e 9300 006b sts SETTING_TEMP_H, r16 ; уставка HIGH 000150 2e40 mov EEP_D_r, r16 000151 e000 ldi r16, EEP_SETTING_TEMP_H 000152 2e30 mov EEP_A_r, r16 000153 d036 rcall EEP_WR_BYTE 000154 e20c ldi r16, DEFAULT_SETTING_TEMP_L 000155 9300 006c sts SETTING_TEMP_L, r16 ; уставка LOW 000157 2e40 mov EEP_D_r, r16 000158 e001 ldi r16, EEP_SETTING_TEMP_L 000159 2e30 mov EEP_A_r, r16 00015a d02f rcall EEP_WR_BYTE 00015b e005 ldi r16, DEFAULT_SETTING_HYST 00015c 9300 006d sts SETTING_HYST, r16 ; гистерезис 00015e 2e40 mov EEP_D_r, r16 00015f e002 ldi r16, EEP_SETTING_HYST 000160 2e30 mov EEP_A_r, r16 000161 d028 rcall EEP_WR_BYTE 000162 e001 ldi r16, DEFAULT_SETTING_MODE 000163 9300 006e sts SETTING_MODE, r16 ; режим 000165 2e40 mov EEP_D_r, r16 000166 e003 ldi r16, EEP_SETTING_MODE 000167 2e30 mov EEP_A_r, r16 000168 d021 rcall EEP_WR_BYTE 000169 e100 ldi r16, 0x10 00016a 2e40 mov EEP_D_r, r16 00016b e004 ldi r16, EEP_FIRST_TIME_RUN 00016c 2e30 mov EEP_A_r, r16 00016d d01c rcall EEP_WR_BYTE 00016e 9508 ret // // WRITE_PARAMS_TO_EEP: 00016f 930f push r16 000170 9100 006b lds r16, SETTING_TEMP_H ; уставка HIGH 000172 2e40 mov EEP_D_r, r16 000173 e000 ldi r16, EEP_SETTING_TEMP_H 000174 2e30 mov EEP_A_r, r16 000175 d014 rcall EEP_WR_BYTE 000176 9100 006c lds r16, SETTING_TEMP_L ; уставка LOW 000178 2e40 mov EEP_D_r, r16 000179 e001 ldi r16, EEP_SETTING_TEMP_L 00017a 2e30 mov EEP_A_r, r16 00017b d00e rcall EEP_WR_BYTE 00017c 9100 006d lds r16, SETTING_HYST ; гистерезис 00017e 2e40 mov EEP_D_r, r16 00017f e002 ldi r16, EEP_SETTING_HYST 000180 2e30 mov EEP_A_r, r16 000181 d008 rcall EEP_WR_BYTE 000182 9100 006e lds r16, SETTING_MODE ; режим 000184 2e40 mov EEP_D_r, r16 000185 e003 ldi r16, EEP_SETTING_MODE 000186 2e30 mov EEP_A_r, r16 000187 d002 rcall EEP_WR_BYTE 000188 910f pop r16 000189 9508 ret// // EEP_WR_BYTE: 00018a 94f8 cli 00018b 930f push r16 _EEP_WR_BYTE_LP: ; ждем завершения предыдущей записи 00018c 99e1 sbic EECR, EEPE 00018d cffe rjmp _EEP_WR_BYTE_LP ; режим программирования - атомарный 00018e e000 ldi r16, (0< // TEMP_COMPARSION: 00019f 930f push r16 0001a0 931f push r17 0001a1 932f push r18 0001a2 933f push r19 0001a3 934f push r20 0001a4 935f push r21 0001a5 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 0001a6 9100 0068 lds mc16uL, TEMP_L // r16 0001a8 9110 0069 lds mc16uH, TEMP_H // r17 0001aa e02a ldi mp16uL, LOW(10) 0001ab e030 ldi mp16uH, HIGH(10) 0001ac df5d rcall mpy16u 0001ad 2f02 mov temp_r_l, m16u0 ; L 0001ae 2f13 mov temp_r_h, m16u1 ; H ; добавляем дробную часть 0001af 9120 006a lds r18, TEMP_F 0001b1 2733 clr r19 0001b2 0f02 add temp_r_l, r18 0001b3 1f13 adc temp_r_h, r19 ; определяем нижний и верхний пороги 0001b4 9140 006c lds r20, SETTING_TEMP_L 0001b6 9150 006b lds r21, SETTING_TEMP_H 0001b8 9160 006d lds r22, SETTING_HYST 0001ba 934f push r20 0001bb 935f push r21 0001bc 2777 clr r23 0001bd 1b46 sub r20, r22 0001be 0b57 sbc r21, r23 0001bf 2eb4 mov min_r_trhd_l, r20 0001c0 2ea5 mov min_r_trhd_h, r21 0001c1 915f pop r21 0001c2 914f pop r20 0001c3 2777 clr r23 0001c4 0f46 add r20, r22 0001c5 1f57 adc r21, r23 0001c6 2ed4 mov max_r_trhd_l, r20 0001c7 2ec5 mov max_r_trhd_h, r21 ; определяем знак температуры 0001c8 f00e brts _NEGATE_TEMP 0001c9 c004 rjmp _COMPARE _NEGATE_TEMP: 0001ca 9500 com temp_r_l 0001cb 9510 com temp_r_h 0001cc 5f0f subi temp_r_l, low(-1) 0001cd 4f1f sbci temp_r_h, high(-1) _COMPARE: ; проверяем нижний порог 0001ce 16b0 cp min_r_trhd_l, temp_r_l 0001cf 06a1 cpc min_r_trhd_h, temp_r_h 0001d0 f424 brge _MIN_THRESHOLD ; TEMP <= MIN ; проверяем верхний порог 0001d1 150d cp temp_r_l, max_r_trhd_l 0001d2 051c cpc temp_r_h, max_r_trhd_h 0001d3 f44c brge _MAX_THRESHOLD ; TEMP >= TOP 0001d4 c00f rjmp _COMPARSION_EXIT _MIN_THRESHOLD: ; определяем режим работы 0001d5 9140 006e lds r20, SETTING_MODE 0001d7 2344 tst r20 0001d8 f411 brne PC+3 0001d9 9890 relay_off 0001da c001 rjmp PC+2 0001db 9a90 relay_on 0001dc c007 rjmp _COMPARSION_EXIT _MAX_THRESHOLD: 0001dd 9140 006e lds r20, SETTING_MODE 0001df 2344 tst r20 0001e0 f411 brne PC+3 0001e1 9a90 relay_on 0001e2 c001 rjmp PC+2 0001e3 9890 relay_off _COMPARSION_EXIT: 0001e4 917f pop r23 0001e5 915f pop r21 0001e6 914f pop r20 0001e7 913f pop r19 0001e8 912f pop r18 0001e9 911f pop r17 0001ea 910f pop r16 0001eb 9508 ret // // TEMP_UPD: 0001ec 931f push r17 0001ed d061 rcall TEMP_CONV 0001ee e152 0001ef e535 0001f0 eb4d 0001f1 d1fe DELAY24 751000 0001f2 d012 rcall TEMP_RD ; обновляем данные в ячейках 0001f3 9110 0068 lds r17, TEMP_L 0001f5 2f81 mov DISP_NUM_L, r17 0001f6 9110 0069 lds r17, TEMP_H 0001f8 2f91 mov DISP_NUM_H, r17 0001f9 911f pop r17 0001fa 9508 ret // // RD_F_CODE: 0001fb 930f push r16 0001fc d149 rcall OW_PRESENCE 0001fd e303 ldi r16, DS18B20_CMD_READROM 0001fe 2e80 mov OW_CMD_r, r16 0001ff d15b rcall OW_SEND_BYTE 000200 e6af ldi XL, LOW(DEVICE_FAMILY_CODE) 000201 e0b0 ldi XH, HIGH(DEVICE_FAMILY_CODE) 000202 d177 rcall OW_RD_BYTE 000203 910f pop r16 000204 9508 ret// // TEMP_RD: 000205 930f push r16 000206 931f push r17 000207 932f push r18 000208 933f push r19 000209 934f push r20 00020a d13b rcall OW_PRESENCE 00020b ff70 sbrs OWFR, OWPRF 00020c c03c rjmp _TEMP_RD_EXIT 00020d ec0c ldi r16, DS18B20_CMD_SKIPROM 00020e 2e80 mov OW_CMD_r, r16 00020f d14b rcall OW_SEND_BYTE 000210 eb0e ldi r16, DS18B20_CMD_RSCRATCHPAD 000211 2e80 mov OW_CMD_r, r16 000212 d148 rcall OW_SEND_BYTE 000213 e6a8 ldi XL, LOW(TEMP_L) 000214 e0b0 ldi XH, HIGH(TEMP_L) 000215 d164 rcall OW_RD_BYTE 000216 e6a9 ldi XL, LOW(TEMP_H) 000217 e0b0 ldi XH, HIGH(TEMP_H) 000218 d161 rcall OW_RD_BYTE 000219 9110 0068 lds r17, TEMP_L 00021b 9120 0069 lds r18, TEMP_H 00021d 932f push r18 00021e 7f28 cbr r18, (1<<0) | (1<<1) | (1<<2) ; убираем ненужные биты на время (интересуют последних битов в TEMP_H) 00021f 3f28 cpi r18, 0xf8 ; проверяется является ли число минусовой 000220 f011 breq _TEMP_RD_TO_UNSIGNED ; если да то конвертируем в беззнаковое число 000221 94e8 clt 000222 c007 rjmp _TEMP_RD_CONTINUE ; если нет то преобразуем значение АЦП в температуру (делим на 16) _TEMP_RD_TO_UNSIGNED: 000223 912f pop r18 000224 9468 set 000225 9510 com r17 000226 9520 com r18 000227 5f1f subi r17, low(-1) 000228 4f2f sbci r18, high(-1) ; ldi r19, 1 ; add r17, r19 ; ldi r19, 0 ; adc r18, r19 000229 c001 rjmp PC+2 _TEMP_RD_CONTINUE: ; Температура = Число с АЦП / 16 (сдвиг вправо 4) 00022a 912f pop r18 00022b 9526 lsr r18 00022c 9517 ror r17 00022d 9526 lsr r18 00022e 9517 ror r17 00022f 9526 lsr r18 000230 9517 ror r17 000231 9526 lsr r18 000232 9517 ror r17 _TEMP_RD_END: 000233 9130 0068 lds r19, TEMP_L 000235 f40e brtc PC+2 000236 9531 neg r19 ; переводим в беззнаковое число если минус ; далее происходит такое для получения дробной части: ; ((n<<3) + (n<<1))>>4 или (n*10)/16 000237 2f43 mov r20, r19 000238 703f andi r19, 0x0f 000239 2f43 mov r20, r19 00023a 0f33 lsl r19 00023b 0f33 lsl r19 00023c 0f33 lsl r19 00023d 0f44 lsl r20 00023e 0f34 add r19, r20 00023f 9536 lsr r19 000240 9536 lsr r19 000241 9536 lsr r19 000242 9536 lsr r19 ; записываем данные 000243 9310 0068 sts TEMP_L, r17 000245 9320 0069 sts TEMP_H, r18 000247 9330 006a sts TEMP_F, r19 _TEMP_RD_EXIT: 000249 914f pop r20 00024a 913f pop r19 00024b 912f pop r18 00024c 911f pop r17 00024d 910f pop r16 00024e 9508 ret ; TEMP_CONV: 00024f 930f push r16 000250 d0f5 rcall OW_PRESENCE 000251 ff70 sbrs OWFR, OWPRF 000252 c006 rjmp _TEMP_CONV_EXIT 000253 ec0c ldi r16, DS18B20_CMD_SKIPROM 000254 2e80 mov OW_CMD_r, r16 000255 d105 rcall OW_SEND_BYTE 000256 e404 ldi r16, DS18B20_CMD_CONVERTTEMP 000257 2e80 mov OW_CMD_r, r16 000258 d102 rcall OW_SEND_BYTE _TEMP_CONV_EXIT: 000259 910f pop r16 00025a 9508 ret // // ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* USI_TRANSMIT: 00025b 930f push r16 00025c 920f push r0 00025d b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR. ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) 00025e 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) 000260 e10b ldi TEMP_REG_A, (1< // BUTTON_PROCESS: 000269 930f push r16 _SW_CHECK_ON_0: 00026a 9bb4 sbis SW_PIN, SW_SET_PIN 00026b c001 rjmp _SW_SET_0 00026c c01c rjmp _SW_CHECK_ON_1 _SW_SET_0: 00026d 9100 0071 lds r16, SW_DATA 00026f 2300 tst r16 000270 f409 brne _SW_SET_FROM_0_TO_1 000271 c017 rjmp _SW_CHECK_ON_1 _SW_SET_FROM_0_TO_1: 000272 2700 clr r16 000273 9300 0071 sts SW_DATA, r16 000275 d166 rcall DEBOUNCE_SW 000276 9463 inc REPROGRAM_STEP_r 000277 2d16 mov r17, REPROGRAM_STEP_r 000278 3014 cpi r17, 4 000279 f414 brge _SAVE_SETTINGS 00027a d153 rcall BEEP_SHORT 00027b c00d rjmp _SW_CHECK_ON_1 _SAVE_SETTINGS: 00027c e010 00027d bf19 outi r17, TIMSK, (0< // REPROGRAM_SETTINGS: 000297 930f push r16 000298 931f push r17 000299 932f push r18 00029a 933f push r19 00029b 934f push r20 00029c 2d06 mov r16, REPROGRAM_STEP_r 00029d 2300 tst r16 00029e f009 breq _INTO 00029f c004 rjmp _REPROGRAM_SETTINGS_LOOP _INTO: 0002a0 9890 relay_off 0002a1 9a96 sbi PORTD, LED_PGM_PIN 0002a2 d12b rcall BEEP_SHORT 0002a3 9463 inc REPROGRAM_STEP_r _REPROGRAM_SETTINGS_LOOP: 0002a4 dfc4 rcall BUTTON_PROCESS _CHECK_STEP: 0002a5 3001 cpi r16, 1 0002a6 f029 breq _STEP_1 0002a7 3002 cpi r16, 2 0002a8 f151 breq _STEP_2 0002a9 3003 cpi r16, 3 0002aa f139 breq _S3_JMP 0002ab c094 rjmp _REPROGRAM_SETTINGS_END // _STEP_1: ; установка и отображение гистерезиса 0002ac d0e7 rcall DISPLAY_UPD_DIGITS _S1_CHECK_PLUS: 0002ad 9bb2 sbis SW_PIN, SW_PLUS_PIN 0002ae c004 rjmp _INCREASE_HYST 0002af c000 rjmp _S1_CHECK_MINUS _S1_CHECK_MINUS: 0002b0 9bb3 sbis SW_PIN, SW_MINUS_PIN 0002b1 c00a rjmp _DECREASE_HYST 0002b2 c011 rjmp _SHOW_HYST _INCREASE_HYST: 0002b3 d128 rcall DEBOUNCE_SW 0002b4 9110 006d lds r17, SETTING_HYST 0002b6 3c18 cpi r17, MAX_HYST 0002b7 f009 breq PC+2 0002b8 9513 inc r17 0002b9 9310 006d sts SETTING_HYST, r17 0002bb c008 rjmp _SHOW_HYST _DECREASE_HYST: 0002bc d11f rcall DEBOUNCE_SW 0002bd 9110 006d lds r17, SETTING_HYST 0002bf 3011 cpi r17, MIN_HYST 0002c0 f009 breq PC+2 0002c1 951a dec r17 0002c2 9310 006d sts SETTING_HYST, r17 _SHOW_HYST: 0002c4 94e8 clt 0002c5 930f push dd8u 0002c6 931f push dv8u 0002c7 9100 006d lds dd8u, SETTING_HYST 0002c9 e01a ldi dv8u, 10 0002ca de31 rcall div8u 0002cb 2f80 mov DISP_NUM_L, dres8u 0002cc 2799 clr DISP_NUM_H ; гистерезис 8 битный так что ноль пишем в старший байт 0002cd 92f0 0066 sts DIGITS+3, drem8u 0002cf 911f pop dv8u 0002d0 910f pop dd8u 0002d1 c06e rjmp _REPROGRAM_SETTINGS_END // _S3_JMP: ; просто прыжок на _STEP_3 0002d2 c047 rjmp _STEP_3 // _STEP_2: 0002d3 d0c0 rcall DISPLAY_UPD_DIGITS _S2_CHECK_PLUS: 0002d4 9bb2 sbis SW_PIN, SW_PLUS_PIN 0002d5 c004 rjmp _INCREASE_TEMP 0002d6 c000 rjmp _S2_CHECK_MINUS _S2_CHECK_MINUS: 0002d7 9bb3 sbis SW_PIN, SW_MINUS_PIN 0002d8 c013 rjmp _DECREASE_TEMP 0002d9 c021 rjmp _SHOW_TEMP _INCREASE_TEMP: 0002da d101 rcall DEBOUNCE_SW 0002db 9110 006c lds r17, SETTING_TEMP_L 0002dd 9120 006b lds r18, SETTING_TEMP_H 0002df 3b10 cpi r17, MAX_TEMP_L 0002e0 e034 ldi r19, MAX_TEMP_H 0002e1 0723 cpc r18, r19 0002e2 f031 breq PC+7 0002e3 e03a ldi r19, 10 0002e4 0f13 add r17, r19 0002e5 2733 clr r19 0002e6 1f23 adc r18, r19 0002e7 9310 006c sts SETTING_TEMP_L, r17 0002e9 9320 006b sts SETTING_TEMP_H, r18 0002eb c00f rjmp _SHOW_TEMP _DECREASE_TEMP: 0002ec d0ef rcall DEBOUNCE_SW 0002ed 9110 006c lds r17, SETTING_TEMP_L 0002ef 9120 006b lds r18, SETTING_TEMP_H 0002f1 301c cpi r17, MIN_TEMP_L 0002f2 ef3e ldi r19, MIN_TEMP_H 0002f3 0723 cpc r18, r19 0002f4 f011 breq PC+3 __DECREASE: 0002f5 501a subi r17, 10 0002f6 4020 sbci r18, 0 0002f7 9310 006c sts SETTING_TEMP_L, r17 0002f9 9320 006b sts SETTING_TEMP_H, r18 _SHOW_TEMP: 0002fb 930f push dd16uL 0002fc 931f push dd16uH 0002fd 932f push dv16uL 0002fe 933f push dv16uH 0002ff 9100 006c lds dd16uL, SETTING_TEMP_L 000301 9110 006b lds dd16uH, SETTING_TEMP_H 000303 2f21 mov r18, dd16uH 000304 7820 andi r18, (1<<7) 000305 f411 brne _NEGATE_SET_TEMP 000306 94e8 clt 000307 c005 rjmp _DIVIDE_SET_TEMP _NEGATE_SET_TEMP: 000308 9468 set 000309 9500 00030a 9510 00030b 5f0f 00030c 4f1f com16 dd16uL, dd16uH _DIVIDE_SET_TEMP: 00030d e02a ldi dv16uL, LOW(10) 00030e e030 ldi dv16uH, HIGH(10) 00030f ddd9 rcall div16u 000310 2f80 mov DISP_NUM_L, dres16uL 000311 2f91 mov DISP_NUM_H, dres16uH 000312 e00a ldi r16, 10 000313 9300 0066 sts DIGITS+3, r16 ; значок градуса 000315 913f pop dv16uH 000316 912f pop dv16uL 000317 911f pop dd16uH 000318 910f pop dd16uL 000319 c026 rjmp _REPROGRAM_SETTINGS_END // // _STEP_3: 00031a 94e8 clt _S3_CHECK_PLUS: 00031b 9bb2 sbis SW_PIN, SW_PLUS_PIN 00031c c004 rjmp _SET_HEAT_MODE 00031d c000 rjmp _S3_CHECK_MINUS _S3_CHECK_MINUS: 00031e 9bb3 sbis SW_PIN, SW_MINUS_PIN 00031f c006 rjmp _SET_COOLING_MODE 000320 c009 rjmp _SHOW_MODE _SET_HEAT_MODE: 000321 d0ba rcall DEBOUNCE_SW 000322 e011 ldi r17, HEAT_MODE 000323 9310 006e sts SETTING_MODE, r17 000325 c004 rjmp _SHOW_MODE _SET_COOLING_MODE: 000326 d0b5 rcall DEBOUNCE_SW 000327 e010 ldi r17, COOLING_MODE 000328 9310 006e sts SETTING_MODE, r17 _SHOW_MODE: 00032a 2711 clr r17 00032b 2f81 mov DISP_NUM_L, r17 00032c 2f91 mov DISP_NUM_H, r17 00032d e01e ldi r17, 14 00032e 9310 0063 sts DIGITS, r17 000330 9310 0064 sts DIGITS+1, r17 000332 9310 0065 sts DIGITS+2, r17 000334 9120 006e lds r18, SETTING_MODE 000336 2322 tst r18 000337 f009 breq _SHOW_COOLING 000338 c004 rjmp _SHOW_HEATING _SHOW_COOLING: 000339 e01c ldi r17, 12 00033a 9310 0066 sts DIGITS+3, r17 00033c c003 rjmp _REPROGRAM_SETTINGS_END _SHOW_HEATING: 00033d e01d ldi r17, 13 00033e 9310 0066 sts DIGITS+3, r17 // _REPROGRAM_SETTINGS_END: 000340 914f pop r20 000341 913f pop r19 000342 912f pop r18 000343 911f pop r17 000344 910f pop r16 000345 9508 ret // // // ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ****************************** OW_PRESENCE: 000346 94f8 cli 000347 9ab9 ow_pull 000348 e033 000349 eb4e 00034a d0a1 DELAY16 480 00034b 98b9 ow_release 00034c e030 00034d e84a 00034e d09d DELAY16 70 00034f d005 rcall OW_CHECK_PRESENCE 000350 e033 000351 e342 000352 d099 DELAY16 410 000353 9478 sei 000354 9508 ret // // ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА ******************************* ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов ; OW_CHECK_PRESENCE: 000355 9bb1 sbis OW_PIN, OW_LINE 000356 6071 sbr OWFR, (1< // OW_SEND_BYTE: 00035b 94f8 cli 00035c 930f push r16 00035d 931f push r17 00035e 2d08 mov r16, OW_CMD_r 00035f e018 ldi r17, 8 _OW_SEND_BYTE_LOOP: 000360 9506 lsr r16 000361 f408 brcc _OW_SEND_0 000362 f048 brcs _OW_SEND_1 _OW_SEND_0: 000363 9ab9 ow_pull 000364 e030 000365 e746 000366 d085 DELAY16 60 000367 98b9 ow_release 000368 e030 000369 e142 00036a d081 DELAY16 10 00036b c008 rjmp _OW_SEND_BYTE_END _OW_SEND_1: 00036c 9ab9 ow_pull 00036d e030 00036e e04a 00036f d07c DELAY16 6 000370 98b9 ow_release 000371 e030 000372 e74e 000373 d078 DELAY16 64 _OW_SEND_BYTE_END: 000374 951a dec r17 000375 f751 brne _OW_SEND_BYTE_LOOP 000376 911f pop r17 000377 910f pop r16 000378 9478 sei 000379 9508 ret // // OW_RD_BYTE: 00037a 94f8 cli 00037b 930f push r16 00037c 931f push r17 00037d 2700 clr r16 00037e e018 ldi r17, 8 _OW_RD_BYTE_LP: 00037f 9506 lsr r16 000380 9ab9 ow_pull 000381 e030 000382 e04a 000383 d068 DELAY16 6 000384 98b9 ow_release 000385 e030 000386 e140 000387 d064 DELAY16 9 000388 99b1 sbic OW_PIN, OW_LINE 000389 6800 sbr r16, (1<<7) 00038a e030 00038b e64c 00038c d05f DELAY16 55 00038d 951a dec r17 00038e f781 brne _OW_RD_BYTE_LP 00038f 930c st X, r16 000390 911f pop r17 000391 910f pop r16 000392 9478 sei 000393 9508 ret // // // ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; путем деления этого числа несколько раз DISPLAY_UPD_DIGITS: 000394 930f push r16 000395 935f push r21 000396 e053 ldi r21, 3 ; инициализация указателя (за каждый проход цикла будет инкрементироваться) 000397 e6a3 ldi XL, LOW(DIGITS) 000398 e0b0 ldi XH, HIGH(DIGITS) .equ dividend = SRAM_TEMP_1 ; число которе будем делить .equ divisor = 10 ; на что делим ; загружаем число которое хотим поделить в адрес SRAM делимого 000399 9380 0061 sts dividend, DISP_NUM_L 00039b 9390 0062 sts dividend+1, DISP_NUM_H ; четыре раза производим деление для получения остатков DIV_LOOP: ; заполняем нужные регистры 00039d 9100 0061 lds dd16uL, dividend 00039f 9110 0062 lds dd16uH, dividend+1 0003a1 e02a ldi dv16uL, LOW(divisor) 0003a2 e030 ldi dv16uH, HIGH(divisor) 0003a3 dd45 rcall div16u ; делим 0003a4 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его ; обновляем делимое 0003a5 9300 0061 sts dividend, dres16uL 0003a7 9310 0062 sts dividend+1, dres16uH 0003a9 955a dec r21 ; декрементируем счетчик цикла 0003aa f791 brne DIV_LOOP ; делим еще раз если не 0 0003ab 915f pop r21 0003ac 910f pop r16 0003ad 9508 ret // // ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** DISPLAY_DECODER: 0003ae 930f push r16 0003af 931f push r17 0003b0 eeea ldi ZL, LOW(2*DISPLAY_SYMBOLS) 0003b1 e0f7 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 0003b2 2711 clr TEMP_REG_B 0003b3 0fe0 add ZL, TEMP_REG_A 0003b4 1ff1 adc ZH, TEMP_REG_B 0003b5 9004 lpm r0, Z 0003b6 9100 0067 lds r16, CURRENT_DIGIT 0003b8 3002 cpi r16, 2 0003b9 f009 breq _DOT_ON 0003ba c010 rjmp _DISPLAY_DECODER_EXIT _DOT_ON: 0003bb 2d00 mov r16, r0 0003bc 770f cbr r16, (1<<7) 0003bd 2e00 mov r0, r16 0003be 2d06 mov r16, REPROGRAM_STEP_r 0003bf 3002 cpi r16, 2 0003c0 f42c brge _DOT_OFF 0003c1 9100 0060 lds r16, MCU_STATE 0003c3 3002 cpi r16, MCU_STATE_ERROR 0003c4 f029 breq _ERR_DOT_OFF 0003c5 c005 rjmp _DISPLAY_DECODER_EXIT _DOT_OFF: 0003c6 2d00 mov r16, r0 0003c7 6800 sbr r16, (1<<7) 0003c8 2e00 mov r0, r16 0003c9 c001 rjmp _DISPLAY_DECODER_EXIT _ERR_DOT_OFF: 0003ca cffb rjmp _DOT_OFF _DISPLAY_DECODER_EXIT: 0003cb 911f pop r17 0003cc 910f pop r16 0003cd 9508 ret // // BEEP_SHORT: 0003ce 9ac5 sbi BUZZER_PORT, BUZZER_PIN 0003cf e053 0003d0 ea39 0003d1 e74d 0003d2 d01d DELAY24 150000 0003d3 98c5 cbi BUZZER_PORT, BUZZER_PIN 0003d4 9508 ret // // BEEP_LONG: 0003d5 9ac5 sbi BUZZER_PORT, BUZZER_PIN 0003d6 e05c 0003d7 e334 0003d8 ef4d 0003d9 d016 DELAY24 500000 0003da 98c5 cbi BUZZER_PORT, BUZZER_PIN 0003db 9508 ret // // DEBOUNCE_SW: 0003dc 930f push r16 0003dd 931f push r17 0003de 932f push r18 0003df e02a ldi r18, 10 _loop_2: 0003e0 ef1f ldi r17, 255 _loop_0: 0003e1 ef0f ldi r16, 255 _dec_0: 0003e2 950a dec r16 0003e3 f7f1 brne _dec_0 _loop_1: 0003e4 951a dec r17 0003e5 f7d9 brne _loop_0 _loop_3: 0003e6 952a dec r18 0003e7 f7c1 brne _loop_2 0003e8 912f pop r18 0003e9 911f pop r17 0003ea 910f pop r16 0003eb 9508 ret// // DELAY_LOOP_16: 0003ec 5041 subi DELAY_8_r, 1 0003ed 4030 sbci DELAY_16_r, 0 0003ee f7e8 brcc DELAY_LOOP_16 0003ef 9508 ret // // DELAY_LOOP_24: 0003f0 5041 subi DELAY_8_r, 1 0003f1 4030 sbci DELAY_16_r, 0 0003f2 4050 sbci DELAY_24_r, 0 0003f3 f7e0 brcc DELAY_LOOP_24 0003f4 9508 ret // // DISPLAY_SYMBOLS: ; HGFEDCBA HGFEDCBA 0003f5 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 0003f6 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 0003f7 9299 .DB 0b10011001, 0b10010010 ; 4, 5 0003f8 f882 .DB 0b10000010, 0b11111000 ; 6, 7 0003f9 9080 .DB 0b10000000, 0b10010000 ; 8, 9 0003fa bf9c .DB 0b10011100, 0b10111111 ; °, - 0003fb 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 : 12 r6 : 7 r7 : 0 r8 : 6 r9 : 0 r10: 2 r11: 2 r12: 2 r13: 2 r14: 5 r15: 11 r16: 234 r17: 121 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 : 17 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 : 15 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 : 23 cpse : 0 dec : 11 eor : 0 icall : 0 ijmp : 0 in : 6 inc : 4 ld : 0 ldd : 0 ldi : 119 lds : 51 lpm : 2 lsl : 4 lsr : 11 mov : 63 movw : 0 neg : 1 nop : 0 or : 1 ori : 0 out : 27 pop : 56 push : 55 rcall : 88 ret : 28 reti : 3 rjmp : 66 rol : 6 ror : 9 sbc : 2 sbci : 7 sbi : 31 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 0x0007f8 2006 14 2020 2048 98.6% [.dseg] 0x000060 0x000072 0 18 18 128 14.1% [.eseg] 0x000030 0x000058 0 40 40 128 31.3% Assembly complete, 0 errors, 21 warnings