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: 14.06.2023, 22:56:32 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: 22: .EQU DIGIT_1_PIN = PD2 ; Пин разряда индикатора 1 23: .EQU DIGIT_2_PIN = PD3 ; Пин разряда индикатора 2 24: .EQU DIGIT_3_PIN = PD4 ; Пин разряда индикатора 3 25: .EQU DIGIT_4_PIN = PD5 ; Пин разряда индикатора 4 26: 27: .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано 28: 29: .EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire 30: .EQU ONE_WIRE_DDR = DDRB 31: .EQU ONE_WIRE_PIN = PINB 32: .DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса 33: .EQU OWPRF = 0 ; 1-Wire Флаг присутствия 34: .EQU OWSB = 1 ; Флаг передачи одного бита 35: 36: ; **** КОМАНДЫ ДАТЧИКА ***************************************** 37: .EQU DS18B20_CMD_CONVERTTEMP = 0x44 38: .EQU DS18B20_CMD_RSCRATCHPAD = 0xbe 39: .EQU DS18B20_CMD_WSCRATCHPAD = 0x4e 40: .EQU DS18B20_CMD_CPYSCRATCHPAD = 0x48 41: .EQU DS18B20_CMD_RECEEPROM = 0xb8 42: .EQU DS18B20_CMD_RPWRSUPPLY = 0xb4 43: .EQU DS18B20_CMD_SEARCHROM = 0xf0 44: .EQU DS18B20_CMD_READROM = 0x33 45: .EQU DS18B20_CMD_MATCHROM = 0x55 46: .EQU DS18B20_CMD_SKIPROM = 0xcc 47: .EQU DS18B20_CMD_ALARMSEARCH = 0xec 48: 49: .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 50: .EQU USI_DO_PIN = PB6 ; DS на 74HC595 51: .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 52: 53: .EQU SW_PORT = PORTB 54: .EQU SW_PIN = PINB 55: .EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус" 56: .EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс" 57: .EQU SW_SET_PIN = PB4 ; Кнопка "Установить" 58: 59: .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами 60: .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM 61: .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик 62: 63: ; **** МАКРОСЫ ************************************************** 64: .MACRO outi 65: ldi @0, @2 66: out @1, @0 67: .ENDMACRO 68: 69: .MACRO display_load 70: ldi DISP_NUM_L, LOW(@0) 71: ldi DISP_NUM_H, HIGH(@0) 72: .ENDMACRO 73: 74: .MACRO _1_wire_pull 75: sbi ONE_WIRE_DDR, ONE_WIRE_LINE 76: .ENDMACRO 77: 78: .MACRO _1_wire_release 79: cbi ONE_WIRE_DDR, ONE_WIRE_LINE 80: .ENDMACRO 81: 82: ; **** СЕГМЕНТ ДАННЫХ ******************************************** 83: .DSEG 84: .ORG SRAM_START 85: 86: MCU_STATE: .BYTE 1 ; Текущее состояние МК 87: SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке 88: DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор 89: CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит 90: PC_HISTORY: .BYTE 1 ; История изменений состояния кнопок (необходимо для прерываня по изменению состояния пина) 91: 92: ; **** СЕГМЕНТ КОДА ********************************************** 93: .CSEG 94: 95: .ORG 0x00 96: 000000 C05A rjmp RESET_vect 97: 98: .ORG 0x000B 99: 00000B C03E rjmp PCINT0_vect 100: 101: .ORG 0x000D 102: 00000D C000 rjmp TIMER0_COMPA_vect 103: 104: 105: ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ 106: TIMER0_COMPA_vect: 107: 00000E 934F push r20 108: 00000F 935F push r21 109: 000010 930F push r16 110: 000011 B75F in r21, SREG 111: 112: 000012 9140 lds r20, CURRENT_DIGIT 000013 0067 113: 000014 3045 cpi r20, 5 114: 000015 F40C brge reset_digit_idx 115: 000016 C003 rjmp _indicate_1 116: 117: reset_digit_idx: 118: 000017 2744 clr r20 119: 000018 9340 sts CURRENT_DIGIT, r20 000019 0067 120: 121: _indicate_1: 122: 00001A 3040 cpi r20, 0 123: 00001B F441 brne _indicate_2 124: 125: 00001C 9893 cbi PORTD, DIGIT_2_PIN 126: 00001D 9894 cbi PORTD, DIGIT_3_PIN 127: 00001E 9895 cbi PORTD, DIGIT_4_PIN 128: 00001F 9A92 sbi PORTD, DIGIT_1_PIN 129: 000020 9100 lds TEMP_REG_A, DIGITS+3 000021 0066 130: 000022 D0CE rcall DISPLAY_DECODER 131: 000023 D06A rcall USI_TRANSMIT 132: 133: _indicate_2: 134: 000024 3041 cpi r20, 1 135: 000025 F441 brne _indicate_3 136: 137: 000026 9892 cbi PORTD, DIGIT_1_PIN 138: 000027 9894 cbi PORTD, DIGIT_3_PIN 139: 000028 9895 cbi PORTD, DIGIT_4_PIN 140: 000029 9A93 sbi PORTD, DIGIT_2_PIN 141: 00002A 9100 lds TEMP_REG_A, DIGITS+2 00002B 0065 142: 00002C D0C4 rcall DISPLAY_DECODER 143: 00002D D060 rcall USI_TRANSMIT 144: 145: _indicate_3: 146: 00002E 3042 cpi r20, 2 147: 00002F F441 brne _indicate_4 148: 149: 000030 9892 cbi PORTD, DIGIT_1_PIN 150: 000031 9893 cbi PORTD, DIGIT_2_PIN 151: 000032 9895 cbi PORTD, DIGIT_4_PIN 152: 000033 9A94 sbi PORTD, DIGIT_3_PIN 153: 000034 9100 lds TEMP_REG_A, DIGITS+1 000035 0064 154: 000036 D0BA rcall DISPLAY_DECODER 155: 000037 D056 rcall USI_TRANSMIT 156: 157: _indicate_4: 158: 000038 3043 cpi r20, 3 159: 000039 F441 brne _indicate_exit 160: 161: 00003A 9892 cbi PORTD, DIGIT_1_PIN 162: 00003B 9893 cbi PORTD, DIGIT_2_PIN 163: 00003C 9894 cbi PORTD, DIGIT_3_PIN 164: 00003D 9A95 sbi PORTD, DIGIT_4_PIN 165: 00003E 9100 lds TEMP_REG_A, DIGITS 00003F 0063 166: 000040 D0B0 rcall DISPLAY_DECODER 167: 000041 D04C rcall USI_TRANSMIT 168: 169: _indicate_exit: 170: 000042 9543 inc r20 171: 000043 9340 sts CURRENT_DIGIT, r20 000044 0067 172: 000045 BF5F out SREG, r21 173: 174: 000046 910F pop r16 175: 000047 915F pop r21 176: 000048 914F pop r20 177: 000049 9518 reti 178: 179: ; **** ОБРАБОТКА КНОПОК ****************************************** 180: PCINT0_vect: 181: 00004A 930F push r16 182: 00004B B70F in r16, SREG 183: 184: 00004C 9BB2 sbis PINB, SW_PLUS_PIN 185: 00004D C005 rjmp _sw_plus 186: 187: 00004E 9BB3 sbis PINB, SW_MINUS_PIN 188: 00004F C005 rjmp _sw_minus 189: 190: 000050 9BB4 sbis PINB, SW_SET_PIN 191: 000051 C005 rjmp _sw_set 192: 193: 000052 C005 rjmp _sw_exit 194: _sw_plus: 195: 000053 9601 adiw DISP_NUM_L, 1 196: 000054 C003 rjmp _sw_exit 197: _sw_minus: 198: 000055 960A adiw DISP_NUM_L, 10 199: 000056 C001 rjmp _sw_exit 200: _sw_set: 201: 000057 96CF adiw DISP_NUM_L, 63 202: _sw_exit: 203: 204: 000058 BF0F out SREG, r16 205: 000059 910F pop r16 206: 00005A 9518 reti 207: 208: ; **** СТАРТ ПРОГРАММЫ ******************************************* 209: RESET_vect: 210: 00005B ED0F ldi TEMP_REG_A, LOW(RAMEND) 211: 00005C BF0D out SPL, TEMP_REG_A 212: 213: ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** 214: MCU_INIT: 215: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* 216: 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: 000092 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: 454 Source line: .DB 0b10011100 ; ° 000113 009C 455: 456: ; **** СЕГМЕНТ EEPROM ******************************************** 457: ; .ESEG 458: ; 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 0 104 68 PC_HISTORY 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 2 117 75 LOOP L 1 2 123 7B DIV16U L 1 4 126 7E D16U_1 L 1 2 131 83 D16U_2 L 1 2 140 8C D16U_3 L 1 8 142 8E USI_TRANSMIT L 1 2 147 93 _USI_TRANSMIT_LOOP L 1 0 154 9A _1_WIRE_DETECT_PRESENCE L 1 2 164 A4 S1 L 1 2 168 A8 S2 L 1 2 176 B0 S3 L 1 2 185 B9 _1_WIRE_CHECK_PRESENCE L 1 0 188 BC _1_WIRE_SEND_BYTE L 1 0 191 BF _S_L L 1 0 193 C1 _1_WIRE_SEND_BIT L 1 2 203 CB SB_1 L 1 2 208 D0 SB_2 L 1 2 217 D9 DISPLAY_UPD_DIGITS L 1 2 225 E1 DIV_LOOP L 1 8 241 F1 DISPLAY_DECODER L 1 0 252 FC DELAY_68US L 1 2 253 FD _D1_LOOP L 1 0 256 0100 DELAY L 1 2 259 0103 _DELAY_1 L 1 2 260 0104 _DELAY_2 L 1 2 270 010E 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 5 23 17 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 R 1 1 9 09 TRANSMIT_BIT C 1 0 23 17 NOW_Y C 1 0 6 06 NOW_M C 1 0 14 0E NOW_D C 1 0 45091 B023 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 5 1 01 ONE_WIRE_LINE C 1 4 23 17 ONE_WIRE_DDR C 1 1 22 16 ONE_WIRE_PIN C 1 3 0 00 OWPRF C 1 2 1 01 OWSB C 1 0 68 44 DS18B20_CMD_CONVERTTEMP C 1 0 190 BE DS18B20_CMD_RSCRATCHPAD C 1 0 78 4E DS18B20_CMD_WSCRATCHPAD C 1 0 72 48 DS18B20_CMD_CPYSCRATCHPAD C 1 0 184 B8 DS18B20_CMD_RECEEPROM C 1 0 180 B4 DS18B20_CMD_RPWRSUPPLY C 1 0 240 F0 DS18B20_CMD_SEARCHROM C 1 1 51 33 DS18B20_CMD_READROM C 1 0 85 55 DS18B20_CMD_MATCHROM C 1 0 204 CC DS18B20_CMD_SKIPROM C 1 0 236 EC DS18B20_CMD_ALARMSEARCH 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 0 24 18 SW_PORT C 1 0 22 16 SW_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 18 3 OUTI 2 1 1 DISPLAY_LOAD 1 2 0 _1_WIRE_PULL 1 2 0 _1_WIRE_RELEASE Program : 259 words. Constants : 6 words. Total program memory: 265 words. Eeprom space : 0 bytes. Data segment : 9 bytes. Compilation completed, no errors. Compilation ended 14.06.2023, 22:56:32