gavrasm Gerd's AVR assembler version 5.4 (C)2022 by DG4FAC ---------------------------------------------------------- Path: /home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/ Source file: firmware.asm Hex file: firmware.hex Eeprom file: firmware.eep Compiled: 27.04.2023, 17:17:06 Pass: 2 1: ; 2: ; Project name: thermostat 3: ; Description: Electronic thermostat on AVR Microcontroller 4: ; Source code: https://github.com/sergeyyarkov/attiny2313a_thermostat 5: ; Device: ATtiny2313A 6: ; Device Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/doc8246.pdf 7: ; Package: SOIC-20W_7.5x12.8mm_P1.27mm 8: ; Assembler: AVR macro assembler 2.2.7 9: ; Clock frequency: 8 MHz External Crystal Oscillator 10: ; Fuses: lfuse: 0xCF, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF 11: ; 12: ; Written by Sergey Yarkov 22.01.2023 13: 14: .INCLUDE "tn2313Adef.inc" -> Warning 009: Include defs not necessary, using internal values! File: /home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/firmware.asm, Line: 14 Source line: .INCLUDE "tn2313Adef.inc" 15: .LIST 16: 17: .DEF TEMP_REG_A = r16 18: .DEF TEMP_REG_B = r17 19: .DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе 20: .DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе 21: .DEF ONE_WIRE_FLAGS = r10 22: 23: .EQU DIGIT_1_PIN = PD2 ; Пин разряда индикатора 1 24: .EQU DIGIT_2_PIN = PD3 ; Пин разряда индикатора 2 25: .EQU DIGIT_3_PIN = PD4 ; Пин разряда индикатора 3 26: .EQU DIGIT_4_PIN = PD5 ; Пин разряда индикатора 4 27: 28: .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано 29: 30: .EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire 31: .EQU ONE_WIRE_DDR = DDRB 32: .EQU ONE_WIRE_PIN = PINB 33: 34: .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 35: .EQU USI_DO_PIN = PB6 ; DS на 74HC595 36: .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 37: 38: .EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус" 39: .EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс" 40: .EQU SW_SET_PIN = PB4 ; Кнопка "Установить" 41: 42: .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами 43: .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM 44: .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик 45: 46: ; **** МАКРОСЫ ************************************************** 47: .MACRO outi 48: ldi @0, @2 49: out @1, @0 50: .ENDMACRO 51: 52: .MACRO display_load 53: ldi DISP_NUM_L, LOW(@0) 54: ldi DISP_NUM_H, HIGH(@0) 55: .ENDMACRO 56: 57: ; **** СЕГМЕНТ ДАННЫХ ******************************************** 58: .DSEG 59: .ORG SRAM_START 60: 61: MCU_STATE: .BYTE 1 ; Текущее состояние МК 62: SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке 63: DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор 64: CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит 65: 66: ; **** СЕГМЕНТ КОДА ********************************************** 67: .CSEG 68: 69: .ORG 0x00 70: 000000 C05A rjmp RESET_vect 71: 72: .ORG 0x000B 73: 00000B C03E rjmp PCINT0_vect 74: 75: .ORG 0x000D 76: 00000D C000 rjmp TIMER0_COMPA_vect 77: 78: 79: ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ 80: TIMER0_COMPA_vect: 81: 00000E 934F push r20 82: 00000F 935F push r21 83: 000010 930F push r16 84: 000011 B75F in r21, SREG 85: 86: 000012 9140 lds r20, CURRENT_DIGIT 000013 0067 87: 000014 3045 cpi r20, 5 88: 000015 F40C brge reset_digit_idx 89: 000016 C003 rjmp _indicate_1 90: 91: reset_digit_idx: 92: 000017 2744 clr r20 93: 000018 9340 sts CURRENT_DIGIT, r20 000019 0067 94: 95: _indicate_1: 96: 00001A 3040 cpi r20, 0 97: 00001B F441 brne _indicate_2 98: 99: 00001C 9893 cbi PORTD, DIGIT_2_PIN 100: 00001D 9894 cbi PORTD, DIGIT_3_PIN 101: 00001E 9895 cbi PORTD, DIGIT_4_PIN 102: 00001F 9A92 sbi PORTD, DIGIT_1_PIN 103: 000020 9100 lds TEMP_REG_A, DIGITS+3 000021 0066 104: 000022 D0AA rcall DISPLAY_DECODER 105: 000023 D083 rcall USI_TRANSMIT 106: 107: _indicate_2: 108: 000024 3041 cpi r20, 1 109: 000025 F441 brne _indicate_3 110: 111: 000026 9892 cbi PORTD, DIGIT_1_PIN 112: 000027 9894 cbi PORTD, DIGIT_3_PIN 113: 000028 9895 cbi PORTD, DIGIT_4_PIN 114: 000029 9A93 sbi PORTD, DIGIT_2_PIN 115: 00002A 9100 lds TEMP_REG_A, DIGITS+2 00002B 0065 116: 00002C D0A0 rcall DISPLAY_DECODER 117: 00002D D079 rcall USI_TRANSMIT 118: 119: _indicate_3: 120: 00002E 3042 cpi r20, 2 121: 00002F F441 brne _indicate_4 122: 123: 000030 9892 cbi PORTD, DIGIT_1_PIN 124: 000031 9893 cbi PORTD, DIGIT_2_PIN 125: 000032 9895 cbi PORTD, DIGIT_4_PIN 126: 000033 9A94 sbi PORTD, DIGIT_3_PIN 127: 000034 9100 lds TEMP_REG_A, DIGITS+1 000035 0064 128: 000036 D096 rcall DISPLAY_DECODER 129: 000037 D06F rcall USI_TRANSMIT 130: 131: _indicate_4: 132: 000038 3043 cpi r20, 3 133: 000039 F441 brne _indicate_exit 134: 135: 00003A 9892 cbi PORTD, DIGIT_1_PIN 136: 00003B 9893 cbi PORTD, DIGIT_2_PIN 137: 00003C 9894 cbi PORTD, DIGIT_3_PIN 138: 00003D 9A95 sbi PORTD, DIGIT_4_PIN 139: 00003E 9100 lds TEMP_REG_A, DIGITS 00003F 0063 140: 000040 D08C rcall DISPLAY_DECODER 141: 000041 D065 rcall USI_TRANSMIT 142: 143: _indicate_exit: 144: 000042 9543 inc r20 145: 000043 9340 sts CURRENT_DIGIT, r20 000044 0067 146: 000045 BF5F out SREG, r21 147: 148: 000046 910F pop r16 149: 000047 915F pop r21 150: 000048 914F pop r20 151: 000049 9518 reti 152: 153: ; **** ОБРАБОТКА КНОПОК ****************************************** 154: PCINT0_vect: 155: 00004A 930F push r16 156: 00004B B70F in r16, SREG 157: 158: 00004C 9BB2 sbis PINB, SW_PLUS_PIN 159: 00004D C005 rjmp _sw_plus 160: 161: 00004E 9BB3 sbis PINB, SW_MINUS_PIN 162: 00004F C005 rjmp _sw_minus 163: 164: 000050 9BB4 sbis PINB, SW_SET_PIN 165: 000051 C005 rjmp _sw_set 166: 167: 000052 C005 rjmp _sw_exit 168: _sw_plus: 169: 000053 9601 adiw DISP_NUM_L, 1 170: 000054 C003 rjmp _sw_exit 171: _sw_minus: 172: 000055 960A adiw DISP_NUM_L, 10 173: 000056 C001 rjmp _sw_exit 174: _sw_set: 175: 000057 96CF adiw DISP_NUM_L, 63 176: _sw_exit: 177: 178: 000058 BF0F out SREG, r16 179: 000059 910F pop r16 180: 00005A 9518 reti 181: 182: ; **** СТАРТ ПРОГРАММЫ ******************************************* 183: RESET_vect: 184: 00005B ED0F ldi TEMP_REG_A, LOW(RAMEND) 185: 00005C BF0D out SPL, TEMP_REG_A 186: 187: ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** 188: MCU_INIT: 189: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* 190: outi r16, DDRD, (1< USI Wire Mode 15: ; USICS1 <--------------> USI Clock Source Select 16: ; USICLK <--------------> USI Clock Strobe 17: ; USITC <--------------> USI Toggle Clock (Enable clock generation) 18: 0000AB E10B ldi TEMP_REG_A, (1< Warning 004: Number of bytes on line is odd, added 00 to fit program memory! File: /home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/firmware.asm, Line: 370 Source line: .DB 0b10011100 ; ° 0000EF 009C 371: 372: ; **** СЕГМЕНТ EEPROM ******************************************** 373: ; .ESEG 374: ; INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023" List of symbols: Type nDef nUsed Decimalval Hexval Name T 1 1 89 59 ATTINY2313A L 1 0 96 60 MCU_STATE L 1 1 97 61 SRAM_TEMP_1 L 1 6 99 63 DIGITS L 1 4 103 67 CURRENT_DIGIT L 1 2 14 0E TIMER0_COMPA_VECT L 1 2 23 17 RESET_DIGIT_IDX L 1 2 26 1A _INDICATE_1 L 1 2 36 24 _INDICATE_2 L 1 2 46 2E _INDICATE_3 L 1 2 56 38 _INDICATE_4 L 1 2 66 42 _INDICATE_EXIT L 1 2 74 4A PCINT0_VECT L 1 2 83 53 _SW_PLUS L 1 2 85 55 _SW_MINUS L 1 2 87 57 _SW_SET L 1 6 88 58 _SW_EXIT L 1 2 91 5B RESET_VECT L 1 0 93 5D MCU_INIT L 1 0 116 74 ONE_WIRE_RESET L 1 2 127 7F D1 L 1 2 132 84 LOOP L 1 2 148 94 DIV16U L 1 4 151 97 D16U_1 L 1 2 156 9C D16U_2 L 1 2 165 A5 D16U_3 L 1 8 167 A7 USI_TRANSMIT L 1 2 172 AC _USI_TRANSMIT_LOOP L 1 2 179 B3 OCF1A_OCCURED L 1 2 181 B5 DISPLAY_UPD_DIGITS L 1 2 189 BD DIV_LOOP L 1 8 205 CD DISPLAY_DECODER L 1 0 216 D8 DELAY_68US L 1 2 217 D9 _D1_LOOP L 1 24 220 DC DELAY L 1 2 223 DF _DELAY_1 L 1 2 224 E0 _DELAY_2 L 1 2 234 EA DISPLAY_SYMBOLS R 1 11 16 10 TEMP_REG_A R 1 2 17 11 TEMP_REG_B R 1 5 24 18 DISP_NUM_L R 1 2 25 19 DISP_NUM_H R 1 0 10 0A ONE_WIRE_FLAGS R 1 5 14 0E DREM16UL R 1 5 15 0F DREM16UH R 1 1 16 10 DRES16UL R 1 1 17 11 DRES16UH R 1 2 16 10 DD16UL R 1 2 17 11 DD16UH R 1 3 18 12 DV16UL R 1 3 19 13 DV16UH R 1 2 20 14 DCNT16U C 1 0 23 17 NOW_Y C 1 0 4 04 NOW_M C 1 0 27 1B NOW_D C 1 0 45043 AFF3 NOW_I C 1 5 2 02 DIGIT_1_PIN C 1 5 3 03 DIGIT_2_PIN C 1 5 4 04 DIGIT_3_PIN C 1 5 5 05 DIGIT_4_PIN C 1 1 6 06 LED_POWER_PIN C 1 2 1 01 ONE_WIRE_LINE C 1 2 23 17 ONE_WIRE_DDR C 1 0 22 16 ONE_WIRE_PIN C 1 3 0 00 USI_LATCH_PIN C 1 1 6 06 USI_DO_PIN C 1 1 7 07 USI_CLK_PIN C 1 3 2 02 SW_PLUS_PIN C 1 3 3 03 SW_MINUS_PIN C 1 3 4 04 SW_SET_PIN C 1 0 1 01 MCU_STATE_DEFAULT C 1 0 2 02 MCU_STATE_PROGRAM C 1 0 3 03 MCU_STATE_ERROR C 1 6 97 61 DIVIDEND C 1 2 10 0A DIVISOR List of macros: nLines nUsed nParams Name 2 14 3 OUTI 2 1 1 DISPLAY_LOAD Program : 223 words. Constants : 6 words. Total program memory: 229 words. Eeprom space : 0 bytes. Data segment : 8 bytes. Compilation completed, no errors. Compilation ended 27.04.2023, 17:17:06