attiny2313a_thermostat/firmware.lst
2023-04-24 01:24:08 +03:00

491 lines
22 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: 23.04.2023, 20:09:24
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 = r22
20: .DEF DISP_NUM_H = r23
21:
22: .EQU DIGIT_1_PIN = PD2
23: .EQU DIGIT_2_PIN = PD3
24: .EQU DIGIT_3_PIN = PD4
25: .EQU DIGIT_4_PIN = PD5
26:
27: .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано
28:
29: .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
30: .EQU USI_DO_PIN = PB6 ; DS на 74HC595
31: .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
32:
33: .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами
34: .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM
35: .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик
36:
37: ; **** МАКРОСЫ **************************************************
38: .MACRO outi
39: ldi @0, @2
40: out @1, @0
41: .ENDMACRO
42:
43: .MACRO display_load
44: ldi DISP_NUM_L, LOW(@0)
45: ldi DISP_NUM_H, HIGH(@0)
46: .ENDMACRO
47:
48: ; **** СЕГМЕНТ ДАННЫХ ********************************************
49: .DSEG
50: .ORG SRAM_START
51:
52: MCU_STATE: .BYTE 1 ; Текущее состояние МК
53: SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке
54: DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
55: CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
56:
57: ; **** СЕГМЕНТ КОДА **********************************************
58: .CSEG
59:
60: .ORG 0x00
61: 000000 C043 rjmp RESET_vect
62:
63: .ORG 0x000D
64: 00000D C000 rjmp TIMER0_COMPA_vect
65:
66: ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************
67: TIMER0_COMPA_vect:
68: 00000E 934F push r20
69: 00000F 9140 lds r20, CURRENT_DIGIT
000010 0067
70: 000011 3045 cpi r20, 5
71: 000012 F40C brge reset_digit_idx
72: 000013 C003 rjmp _indicate_1
73:
74: reset_digit_idx:
75: 000014 2744 clr r20
76: 000015 9340 sts CURRENT_DIGIT, r20
000016 0067
77:
78: _indicate_1:
79: 000017 3040 cpi r20, 0
80: 000018 F441 brne _indicate_2
81:
82: 000019 9893 cbi PORTD, DIGIT_2_PIN
83: 00001A 9894 cbi PORTD, DIGIT_3_PIN
84: 00001B 9895 cbi PORTD, DIGIT_4_PIN
85: 00001C 9A92 sbi PORTD, DIGIT_1_PIN
86: 00001D 9100 lds TEMP_REG_A, DIGITS+3
00001E 0066
87: 00001F D072 rcall DISPLAY_DECODER
88: 000020 D051 rcall USI_TRANSMIT
89:
90: _indicate_2:
91: 000021 3041 cpi r20, 1
92: 000022 F441 brne _indicate_3
93:
94: 000023 9892 cbi PORTD, DIGIT_1_PIN
95: 000024 9894 cbi PORTD, DIGIT_3_PIN
96: 000025 9895 cbi PORTD, DIGIT_4_PIN
97: 000026 9A93 sbi PORTD, DIGIT_2_PIN
98: 000027 9100 lds TEMP_REG_A, DIGITS+2
000028 0065
99: 000029 D068 rcall DISPLAY_DECODER
100: 00002A D047 rcall USI_TRANSMIT
101:
102: _indicate_3:
103: 00002B 3042 cpi r20, 2
104: 00002C F441 brne _indicate_4
105:
106: 00002D 9892 cbi PORTD, DIGIT_1_PIN
107: 00002E 9893 cbi PORTD, DIGIT_2_PIN
108: 00002F 9895 cbi PORTD, DIGIT_4_PIN
109: 000030 9A94 sbi PORTD, DIGIT_3_PIN
110: 000031 9100 lds TEMP_REG_A, DIGITS+1
000032 0064
111: 000033 D05E rcall DISPLAY_DECODER
112: 000034 D03D rcall USI_TRANSMIT
113:
114: _indicate_4:
115: 000035 3043 cpi r20, 3
116: 000036 F441 brne _indicate_exit
117:
118: 000037 9892 cbi PORTD, DIGIT_1_PIN
119: 000038 9893 cbi PORTD, DIGIT_2_PIN
120: 000039 9894 cbi PORTD, DIGIT_3_PIN
121: 00003A 9A95 sbi PORTD, DIGIT_4_PIN
122: 00003B 9100 lds TEMP_REG_A, DIGITS
00003C 0063
123: 00003D D054 rcall DISPLAY_DECODER
124: 00003E D033 rcall USI_TRANSMIT
125:
126: _indicate_exit:
127: 00003F 9543 inc r20
128: 000040 9340 sts CURRENT_DIGIT, r20
000041 0067
129: 000042 914F pop r20
130: 000043 9518 reti
131:
132: ; **** СТАРТ ПРОГРАММЫ *******************************************
133: RESET_vect:
134: 000044 ED0F ldi TEMP_REG_A, LOW(RAMEND)
135: 000045 BF0D out SPL, TEMP_REG_A
136:
137: ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
138: MCU_INIT:
139: ; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************
140: outi r16, DDRD, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN)
140: 000046 E70C ldi R16, (1<<LED_POWER_PIN)|(1<<DIGIT_1_PIN)|(1<<DIGIT_2_PIN)|(1<<DIGIT_3_PIN)|(1<<DIGIT_4_PIN)
140: 000047 BB01 out DDRD, R16
141: outi r16, DDRB, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (1<<PB2)
141: 000048 EC05 ldi R16, (1<<USI_CLK_PIN)|(1<<USI_DO_PIN)|(1<<USI_LATCH_PIN)|(1<<PB2)
141: 000049 BB07 out DDRB, R16
142:
143: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ **********************************
144: outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
144: 00004A E002 ldi R16, (1<<WGM01)
144: 00004B BF00 out TCCR0A, R16
145: outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
145: 00004C E005 ldi R16, (1<<CS02)|(1<<CS00)
145: 00004D BF03 out TCCR0B, R16
146: outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
146: 00004E E109 ldi R16, 25
146: 00004F BF06 out OCR0A, R16
147: outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
147: 000050 E001 ldi R16, (1<<OCIE0A)
147: 000051 BF09 out TIMSK, R16
148:
149: 000052 2411 clr r1
150: 000053 E6E6 ldi ZL,LOW(2*DISPLAY_SYMBOLS)
151: 000054 E0F1 ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
152:
153: 000055 9210 sts CURRENT_DIGIT, r1
000056 0067
154:
155: 000057 9478 sei
156: display_load 240 ; загружаем число, которое нужно показать на индикатор
156: 000058 EF60 ldi DISP_NUM_L, LOW(240)
156: 000059 E070 ldi DISP_NUM_H, HIGH(240)
157:
158: ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
159: LOOP:
160: 00005A D021 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
161:
162: 00005B D04E rcall TOGGLE_POWER_LED
163: 00005C D03C rcall DELAY
164:
165: 00005D 9563 inc DISP_NUM_L
166:
167: 00005E CFFB rjmp LOOP
168:
169: ; **** ПОДПРОГРАММЫ **********************************************
170: .INCLUDE "div16u.asm"
Including file div16u.asm
1: ;***************************************************************************
2: ;*
3: ;* "div16u" - 16/16 Bit Unsigned Division
4: ;*
5: ;* This subroutine divides the two 16-bit numbers
6: ;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).
7: ;* The result is placed in "dres16uH:dres16uL" and the remainder in
8: ;* "drem16uH:drem16uL".
9: ;*
10: ;* Number of words :19
11: ;* Number of cycles :235/251 (Min/Max)
12: ;* Low registers used :2 (drem16uL,drem16uH)
13: ;* High registers used :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,
14: ;* dcnt16u)
15: ;*
16: ;***************************************************************************
17:
18: ;***** Subroutine Register Variables
19:
20: .def drem16uL=r14
21: .def drem16uH=r15
22: .def dres16uL=r16
23: .def dres16uH=r17
24: .def dd16uL =r16
25: .def dd16uH =r17
26: .def dv16uL =r18
27: .def dv16uH =r19
28: .def dcnt16u =r20
29:
30: ;***** Code
31:
32: div16u:
33: 00005F 24EE clr drem16uL ; clear remainder Low byte
34: 000060 18FF sub drem16uH,drem16uH ; clear remainder High byte and carry
35: 000061 E141 ldi dcnt16u,17 ; init loop counter
36: d16u_1:
37: 000062 1F00 rol dd16uL ; shift left dividend
38: 000063 1F11 rol dd16uH
39: 000064 954A dec dcnt16u ; decrement counter
40: 000065 F409 brne d16u_2 ; if done
41: 000066 9508 ret ; return
42: d16u_2:
43: 000067 1CEE rol drem16uL ; shift dividend into remainder
44: 000068 1CFF rol drem16uH
45: 000069 1AE2 sub drem16uL,dv16uL ; remainder = remainder - divisor
46: 00006A 0AF3 sbc drem16uH,dv16uH
47: 00006B F420 brcc d16u_3 ; if result negative
48: 00006C 0EE2 add drem16uL,dv16uL ; restore remainder
49: 00006D 1EF3 adc drem16uH,dv16uH
50: 00006E 9488 clc ; clear carry to be shifted into result
51: 00006F CFF2 rjmp d16u_1 ; else
52: d16u_3:
53: 000070 9408 sec ; set carry to be shifted into result
54: 000071 CFF0 rjmp d16u_1
Continuing file firmware.asm
171: .INCLUDE "usi.asm"
Including file usi.asm
1: ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
2: USI_TRANSMIT:
3: 000072 B80F out USIDR, r0 ; Move byte from temp register to USI Data Register
4:
5: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
6: 000073 E400 ldi TEMP_REG_A, (1<<USIOIF)
7: 000074 B90E out USISR, TEMP_REG_A
8:
9: ; Load settings of USI into temp register
10: ; This will setup USI to Three-wire mode, Software clock strobe (USITC)
11: ; with External, positive edge and toggle USCK
12: ;
13: ; USIWM0 <--------------> USI Wire Mode
14: ; USICS1 <--------------> USI Clock Source Select
15: ; USICLK <--------------> USI Clock Strobe
16: ; USITC <--------------> USI Toggle Clock (Enable clock generation)
17: 000075 E10B ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
18:
19: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
20: 000076 B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
21: 000077 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
22: 000078 CFFD rjmp _USI_TRANSMIT_LOOP
23:
24: ; Send pulse into LATCH pin.
25: ; This will copy byte from 74hc595 shift register into 74hc595 storage register
26: 000079 9AC0 sbi PORTB, USI_LATCH_PIN
27: 00007A 98C0 cbi PORTB, USI_LATCH_PIN
28: 00007B 9508 ret
Continuing file firmware.asm
172:
173: ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
174: ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
175: ; путем деления этого числа несколько раз
176: DISPLAY_UPD_DIGITS:
177: 00007C E084 ldi r24, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
178: 00007D E6A3 ldi XL, LOW(DIGITS)
179: 00007E E0B0 ldi XH, HIGH(DIGITS)
180:
181: .equ dividend = SRAM_TEMP_1
182: .equ divisor = 10
183:
184: ; загружаем делимое в адрес SRAM делимого
185: 00007F 9360 sts dividend, r22
000080 0061
186: 000081 9370 sts dividend+1, r23
000082 0062
187:
188: ; четыре раза производим деление для получения остатков
189: DIV_LOOP:
190: ; заполняем нужные регистры
191: 000083 9100 lds dd16uL, dividend
000084 0061
192: 000085 9110 lds dd16uH, dividend+1
000086 0062
193: 000087 E02A ldi dv16uL, LOW(divisor)
194: 000088 E030 ldi dv16uH, HIGH(divisor)
195:
196: 000089 DFD5 rcall div16u ; делим
197:
198: 00008A 92ED st X+, drem16uL ; сохраняем остаток в ячейку по указателю
199:
200: ; обновляем делимое
201: 00008B 9300 sts dividend, dres16uL
00008C 0061
202: 00008D 9310 sts dividend+1, dres16uH
00008E 0062
203:
204: 00008F 958A dec r24 ; декрементируем счетчик цикла
205: 000090 F791 brne DIV_LOOP ; делим еще раз если не 0
206: 000091 9508 ret
207:
208: ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
209: DISPLAY_DECODER:
210: 000092 E6E6 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
211: 000093 E0F1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
212:
213: 000094 2711 clr TEMP_REG_B
214: 000095 0FE0 add ZL, TEMP_REG_A
215: 000096 1FF1 adc ZH, TEMP_REG_B
216:
217: 000097 9004 lpm r0, Z
218: 000098 9508 ret
219:
220: DELAY:
221: 000099 930F push r16
222: 00009A 931F push r17
223:
224:
225:
226: 00009B EF0F ldi r16, 255
227: _l_1:
228: 00009C EF1F ldi r17, 255
229: _dec_1:
230: 00009D 951A dec r17
231: 00009E 0000 nop
232: 00009F 0000 nop
233: 0000A0 0000 nop
234: 0000A1 0000 nop
235: 0000A2 0000 nop
236: 0000A3 0000 nop
237: 0000A4 F7C1 brne _dec_1
238: 0000A5 950A dec r16
239: 0000A6 F7A9 brne _l_1
240:
241: ; ldi r16, 255
242: ; _DELAY_3:
243: ; ldi r17, 255
244: ; _DELAY_2:
245: ; dec r17
246: ; brne _DELAY_2
247: ; _DELAY_1:
248: ; dec r16
249: ; brne _DELAY_3
250:
251: 0000A7 911F pop r17
252: 0000A8 910F pop r16
253: 0000A9 9508 ret
254:
255: TOGGLE_POWER_LED:
256: 0000AA 930F push r16
257: 0000AB 931F push r17
258: 0000AC E400 ldi r16, (1<<LED_POWER_PIN)
259: 0000AD B312 in r17, PORTD
260: 0000AE 2710 eor r17, r16
261: 0000AF BB12 out PORTD, r17
262: 0000B0 911F pop r17
263: 0000B1 910F pop r16
264: 0000B2 9508 ret
265:
266: DISPLAY_SYMBOLS:
267: ; HGFEDCBA HGFEDCBA
268: .DB 0b11000000, 0b11111001 ; 0, 1
0000B3 F9C0
269: .DB 0b10100100, 0b10110000 ; 2, 3
0000B4 B0A4
270: .DB 0b10011001, 0b10010010 ; 4, 5
0000B5 9299
271: .DB 0b10000010, 0b11111000 ; 6, 7
0000B6 F882
272: .DB 0b10000000, 0b10010000 ; 8, 9
0000B7 9080
273: .DB 0b10011100 ; °
-> 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: 273
Source line: .DB 0b10011100 ; °
0000B8 009C
274:
275: ; **** СЕГМЕНТ EEPROM ********************************************
276: ; .ESEG
277: ; 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 20 14 RESET_DIGIT_IDX
L 1 2 23 17 _INDICATE_1
L 1 2 33 21 _INDICATE_2
L 1 2 43 2B _INDICATE_3
L 1 2 53 35 _INDICATE_4
L 1 2 63 3F _INDICATE_EXIT
L 1 2 68 44 RESET_VECT
L 1 0 70 46 MCU_INIT
L 1 2 90 5A LOOP
L 1 2 95 5F DIV16U
L 1 4 98 62 D16U_1
L 1 2 103 67 D16U_2
L 1 2 112 70 D16U_3
L 1 8 114 72 USI_TRANSMIT
L 1 2 118 76 _USI_TRANSMIT_LOOP
L 1 2 124 7C DISPLAY_UPD_DIGITS
L 1 2 131 83 DIV_LOOP
L 1 8 146 92 DISPLAY_DECODER
L 1 2 153 99 DELAY
L 1 2 156 9C _L_1
L 1 2 157 9D _DEC_1
L 1 2 170 AA TOGGLE_POWER_LED
L 1 4 179 B3 DISPLAY_SYMBOLS
R 1 11 16 10 TEMP_REG_A
R 1 2 17 11 TEMP_REG_B
R 1 2 22 16 DISP_NUM_L
R 1 1 23 17 DISP_NUM_H
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 23 17 NOW_D
C 1 0 45039 AFEF 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 2 6 06 LED_POWER_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 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 6 3 OUTI
2 1 1 DISPLAY_LOAD
Program : 167 words.
Constants : 6 words.
Total program memory: 173 words.
Eeprom space : 0 bytes.
Data segment : 8 bytes.
Compilation completed, no errors.
Compilation ended 23.04.2023, 20:09:24