attiny2313a_thermostat/firmware.lst
2023-06-15 23:41:16 +03:00

744 lines
35 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: 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<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) | (0<<PD0) | (1<<PD1)
216: 00005D E70E ldi R16, (1<<LED_POWER_PIN)|(1<<DIGIT_1_PIN)|(1<<DIGIT_2_PIN)|(1<<DIGIT_3_PIN)|(1<<DIGIT_4_PIN)|(0<<PD0)|(1<<PD1)
216: 00005E BB01 out DDRD, R16
217: outi r16, DDRB, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (0<<SW_PLUS_PIN) | (0<<SW_MINUS_PIN) | (0<<SW_SET_PIN)
217: 00005F EC01 ldi R16, (1<<USI_CLK_PIN)|(1<<USI_DO_PIN)|(1<<USI_LATCH_PIN)|(0<<SW_PLUS_PIN)|(0<<SW_MINUS_PIN)|(0<<SW_SET_PIN)
217: 000060 BB07 out DDRB, R16
218: outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
218: 000061 E10C ldi R16, (1<<SW_PLUS_PIN)|(1<<SW_MINUS_PIN)|(1<<SW_SET_PIN)
218: 000062 BB08 out PORTB, R16
219:
220: ; **** ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ ********************************
221: outi r16, GIMSK, (1<<PCIE0)
221: 000063 E200 ldi R16, (1<<PCIE0)
221: 000064 BF0B out GIMSK, R16
222: outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
222: 000065 E10C ldi R16, (1<<PCINT2)|(1<<PCINT3)|(1<<PCINT4)
222: 000066 BD00 out PCMSK0, R16
223:
224: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 0 **********************************
225: outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
225: 000067 E002 ldi R16, (1<<WGM01)
225: 000068 BF00 out TCCR0A, R16
226: outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
226: 000069 E005 ldi R16, (1<<CS02)|(1<<CS00)
226: 00006A BF03 out TCCR0B, R16
227: outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
227: 00006B E109 ldi R16, 25
227: 00006C BF06 out OCR0A, R16
228: outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
228: 00006D E001 ldi R16, (1<<OCIE0A)
228: 00006E BF09 out TIMSK, R16
229:
230: ; **** ИНИЦИАЛИЗАЦИЯ USART *************************************
231: ; outi r16, UBRRL, LOW(3) ; 9600 БОД
232: ; outi r16, UBRRH, HIGH(3) ; 9600 БОД
233: ; outi r16, UCSRB, (1<<RXEN) | (1<<TXEN) ; Включение приема и передачии
234: ; outi r16, UCSRC, (1<<UCSZ1) | (1<<UCSZ0) ; Асинхронный режим, 8 бит фрейм, 1 стоповый бит
235:
236: 00006F 2411 clr r1
237: 000070 9210 sts CURRENT_DIGIT, r1
000071 0067
238:
239: display_load 0 ; загружаем число, которое нужно показать на индикатор
239: 000072 E080 ldi DISP_NUM_L, LOW(0)
239: 000073 E090 ldi DISP_NUM_H, HIGH(0)
240: ; rcall _1_WIRE_DETECT_PRESENCE ; проверяем наличие датчика на шине путем выполнения процедуры сброса
241: 000074 9478 sei
242:
243: ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
244: LOOP:
245: 000075 D063 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
246:
247: ; usart_t:
248: ; sbis UCSRA, UDRE
249: ; rjmp usart_t
250: ; ldi r16, 'B'
251: ; out UDR, r16
252:
253: ; usart_r:
254: ; sbis UCSRA, RXC
255: ; rjmp usart_r
256: ; in DISP_NUM_L, UDR
257:
258: 000076 FD70 sbrc ONE_WIRE_FLAGS, OWPRF
259: 000077 9A96 sbi PORTD, PD6
260:
261: 000078 FF70 sbrs ONE_WIRE_FLAGS, OWPRF
262: 000079 9896 cbi PORTD, PD6
263:
264: ; rcall DELAY
265: ; rcall DELAY
266: ; rcall DELAY
267: ; rcall DELAY
268: ; rcall DELAY
269: ; rcall DELAY
270:
271: 00007A CFFA rjmp LOOP
272:
273: ; **** ПОДПРОГРАММЫ **********************************************
274: .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: 00007B 24EE clr drem16uL ; clear remainder Low byte
34: 00007C 18FF sub drem16uH,drem16uH ; clear remainder High byte and carry
35: 00007D E141 ldi dcnt16u,17 ; init loop counter
36: d16u_1:
37: 00007E 1F00 rol dd16uL ; shift left dividend
38: 00007F 1F11 rol dd16uH
39: 000080 954A dec dcnt16u ; decrement counter
40: 000081 F409 brne d16u_2 ; if done
41: 000082 9508 ret ; return
42: d16u_2:
43: 000083 1CEE rol drem16uL ; shift dividend into remainder
44: 000084 1CFF rol drem16uH
45: 000085 1AE2 sub drem16uL,dv16uL ; remainder = remainder - divisor
46: 000086 0AF3 sbc drem16uH,dv16uH
47: 000087 F420 brcc d16u_3 ; if result negative
48: 000088 0EE2 add drem16uL,dv16uL ; restore remainder
49: 000089 1EF3 adc drem16uH,dv16uH
50: 00008A 9488 clc ; clear carry to be shifted into result
51: 00008B CFF2 rjmp d16u_1 ; else
52: d16u_3:
53: 00008C 9408 sec ; set carry to be shifted into result
54: 00008D CFF0 rjmp d16u_1
Continuing file firmware.asm
275: .INCLUDE "usi.asm"
Including file usi.asm
1: ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
2: USI_TRANSMIT:
3: 00008E 930F push r16
4: 00008F B80F out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
5:
6: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
7: 000090 E400 ldi TEMP_REG_A, (1<<USIOIF)
8: 000091 B90E out USISR, TEMP_REG_A
9:
10: ; Load settings of USI into temp register
11: ; This will setup USI to Three-wire mode, Software clock strobe (USITC)
12: ; with External, positive edge and toggle USCK
13: ;
14: ; USIWM0 <--------------> 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<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
19:
20: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
21: 000093 B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
22: 000094 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
23: 000095 CFFD rjmp _USI_TRANSMIT_LOOP
24:
25: ; Send pulse into LATCH pin.
26: ; This will copy byte from 74hc595 shift register into 74hc595 storage register
27: 000096 9AC0 sbi PORTB, USI_LATCH_PIN
28: 000097 98C0 cbi PORTB, USI_LATCH_PIN
29: 000098 910F pop r16
30: 000099 9508 ret
Continuing file firmware.asm
276:
277: ; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ******************************
278: _1_WIRE_DETECT_PRESENCE:
279: 00009A 94F8 cli ; Шаг 1. выключаем глобальные прерывания
280:
281: ; 62 тика
282: outi r16, TCNT1L, 0
282: 00009B E000 ldi R16, 0
282: 00009C BD0C out TCNT1L, R16
283: outi r16, OCR1AL, 60 ; 480 мкс
283: 00009D E30C ldi R16, 60
283: 00009E BD0A out OCR1AL, R16
284: outi r16, OCR1BL, 69 ; 72 мкс
284: 00009F E405 ldi R16, 69
284: 0000A0 BD08 out OCR1BL, R16
285:
286: ; предделитель 64
287: outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
287: 0000A1 E003 ldi R16, (1<<CS11)|(1<<CS10)
287: 0000A2 BD0E out TCCR1B, R16
288:
289: _1_wire_pull ; Шаг 2. притягиваем шину
289: 0000A3 9AB9 sbi ONE_WIRE_DDR, ONE_WIRE_LINE
290:
291: S1:
292: 0000A4 B708 in r16, TIFR
293: 0000A5 FF06 sbrs r16, OCF1A ; Шаг 3. ждем минимум 480мкс
294: 0000A6 CFFD rjmp S1
295: _1_wire_release ; Шаг 4. отпускаем шину
295: 0000A7 98B9 cbi ONE_WIRE_DDR, ONE_WIRE_LINE
296: 0000A8 B708 in r16, TIFR
297: 0000A9 FF05 sbrs r16, OCF1B ; Шаг 5. ждем +- 70мкс
298: 0000AA CFFD rjmp S2
299: 0000AB D00D rcall _1_WIRE_CHECK_PRESENCE ; Шаг 6. проверяем есть ли устройство на шине, и если есть то устанавливаем флаг
300:
301: outi r16, TCNT1L, 0
301: 0000AC E000 ldi R16, 0
301: 0000AD BD0C out TCNT1L, R16
302: outi r16, OCR1AL, 52 ; 416 мкс
302: 0000AE E304 ldi R16, 52
302: 0000AF BD0A out OCR1AL, R16
303: S3:
304: 0000B0 B708 in r16, TIFR
305: 0000B1 FF06 sbrs r16, OCF1A
306: 0000B2 CFFD rjmp S3
307: 0000B3 2700 clr r16
308: 0000B4 BD0E out TCCR1B, r16
309: 0000B5 EF0F ser r16
310: 0000B6 BF08 out TIFR, r16
311: ; s3: in r16, TIFR
312: ; sbrs r16, TOV1
313: ; rjmp s3
314: ; rcall TOV1_occured
315: ; ser r16
316: ; out TIFR, r16
317: 0000B7 9478 sei
318: 0000B8 9508 ret
319:
320: ; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА *******************************
321: ; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов
322: ;
323: _1_WIRE_CHECK_PRESENCE:
324: 0000B9 9BB1 sbis ONE_WIRE_PIN, ONE_WIRE_LINE
325: 0000BA 6071 sbr ONE_WIRE_FLAGS, (1<<OWPRF)
326: 0000BB 9508 ret
327:
328: _1_WIRE_SEND_BYTE:
329: 0000BC 931F push r17
330: 0000BD E313 ldi r17, DS18B20_CMD_READROM
331: 0000BE E008 ldi r16, 8
332: _s_l:
333: ; rol r16
334: ; brcc
335: 0000BF 911F pop r17
336: 0000C0 9508 ret
337:
338: .DEF TRANSMIT_BIT = r9
339: _1_WIRE_SEND_BIT:
340: 0000C1 930F push r16
341: 0000C2 94F8 cli
342: 0000C3 6072 sbr ONE_WIRE_FLAGS, (1<<OWSB)
343: outi r16, TCNT1L, 0
343: 0000C4 E000 ldi R16, 0
343: 0000C5 BD0C out TCNT1L, R16
344: outi r16, OCR1AL, 1 ; 8 мкс
344: 0000C6 E001 ldi R16, 1
344: 0000C7 BD0A out OCR1AL, R16
345: outi r16, OCR1BL, 9 ; 64 мкс
345: 0000C8 E009 ldi R16, 9
345: 0000C9 BD08 out OCR1BL, R16
346:
347: _1_wire_pull
347: 0000CA 9AB9 sbi ONE_WIRE_DDR, ONE_WIRE_LINE
348: SB_1:
349: 0000CB B708 in r16, TIFR
350: 0000CC FF06 sbrs r16, OCF1A
351: 0000CD CFFD rjmp SB_1
352: 0000CE FC90 sbrc TRANSMIT_BIT, 0
353: _1_wire_release
353: 0000CF 98B9 cbi ONE_WIRE_DDR, ONE_WIRE_LINE
354: SB_2:
355: 0000D0 B708 in r16, TIFR
356: 0000D1 FF05 sbrs r16, OCF1B
357: 0000D2 CFFD rjmp SB_2
358:
359: 0000D3 2700 clr r16
360: 0000D4 BD0E out TCCR1B, r16
361: 0000D5 7F7D cbr ONE_WIRE_FLAGS, (1<<OWSB)
362: 0000D6 9478 sei
363: 0000D7 910F pop r16
364: 0000D8 9508 ret
365:
366: ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
367: ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
368: ; путем деления этого числа несколько раз
369: DISPLAY_UPD_DIGITS:
370: 0000D9 935F push r21
371: 0000DA E054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
372: 0000DB E6A3 ldi XL, LOW(DIGITS)
373: 0000DC E0B0 ldi XH, HIGH(DIGITS)
374:
375: .equ dividend = SRAM_TEMP_1
376: .equ divisor = 10
377:
378: ; загружаем число которое хотим поделить в адрес SRAM делимого
379: 0000DD 9380 sts dividend, DISP_NUM_L
0000DE 0061
380: 0000DF 9390 sts dividend+1, DISP_NUM_H
0000E0 0062
381:
382: ; четыре раза производим деление для получения остатков
383: DIV_LOOP:
384: ; заполняем нужные регистры
385: 0000E1 9100 lds dd16uL, dividend
0000E2 0061
386: 0000E3 9110 lds dd16uH, dividend+1
0000E4 0062
387: 0000E5 E02A ldi dv16uL, LOW(divisor)
388: 0000E6 E030 ldi dv16uH, HIGH(divisor)
389:
390: 0000E7 DF93 rcall div16u ; делим
391:
392: 0000E8 92ED st X+, drem16uL ; сохраняем остаток в ячейку по указателю
393:
394: ; обновляем делимое
395: 0000E9 9300 sts dividend, dres16uL
0000EA 0061
396: 0000EB 9310 sts dividend+1, dres16uH
0000EC 0062
397:
398: 0000ED 955A dec r21 ; декрементируем счетчик цикла
399: 0000EE F791 brne DIV_LOOP ; делим еще раз если не 0
400: 0000EF 915F pop r21
401: 0000F0 9508 ret
402:
403: ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
404: DISPLAY_DECODER:
405: 0000F1 930F push r16
406: 0000F2 931F push r17
407: 0000F3 E1EC ldi ZL, LOW(2*DISPLAY_SYMBOLS)
408: 0000F4 E0F2 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
409:
410: 0000F5 2711 clr TEMP_REG_B
411: 0000F6 0FE0 add ZL, TEMP_REG_A
412: 0000F7 1FF1 adc ZH, TEMP_REG_B
413:
414: 0000F8 9004 lpm r0, Z
415: 0000F9 911F pop r17
416: 0000FA 910F pop r16
417: 0000FB 9508 ret
418:
419: DELAY_68us:
420: 0000FC EB03 ldi r16, 179 ; 1
421: _d1_loop:
422: 0000FD 950A dec r16 ; 1
423: 0000FE F7F1 brne _d1_loop ; 2/1
424: 0000FF 9508 ret ; 4
425:
426: DELAY:
427: 000100 930F push r16
428: 000101 931F push r17
429:
430: 000102 EF0F ldi r16, 255
431: _DELAY_1:
432: 000103 EF1F ldi r17, 255
433: _DELAY_2:
434: 000104 951A dec r17
435: 000105 0000 nop
436: 000106 0000 nop
437: 000107 0000 nop
438: 000108 F7D9 brne _DELAY_2
439:
440: 000109 950A dec r16
441: 00010A F7C1 brne _DELAY_1
442:
443: 00010B 911F pop r17
444: 00010C 910F pop r16
445: 00010D 9508 ret
446:
447: DISPLAY_SYMBOLS:
448: ; HGFEDCBA HGFEDCBA
449: .DB 0b11000000, 0b11111001 ; 0, 1
00010E F9C0
450: .DB 0b10100100, 0b10110000 ; 2, 3
00010F B0A4
451: .DB 0b10011001, 0b10010010 ; 4, 5
000110 9299
452: .DB 0b10000010, 0b11111000 ; 6, 7
000111 F882
453: .DB 0b10000000, 0b10010000 ; 8, 9
000112 9080
454: .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: 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