mirror of
https://github.com/sergeyyarkov/attiny2313a_thermostat.git
synced 2026-10-11 10:18:56 +03:00
622 lines
28 KiB
Plaintext
622 lines
28 KiB
Plaintext
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<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) | (0<<PD0) | (1<<PD1)
|
||
190: 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)
|
||
190: 00005E BB01 out DDRD, R16
|
||
191: 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)
|
||
191: 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)
|
||
191: 000060 BB07 out DDRB, R16
|
||
192: outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
|
||
192: 000061 E10C ldi R16, (1<<SW_PLUS_PIN)|(1<<SW_MINUS_PIN)|(1<<SW_SET_PIN)
|
||
192: 000062 BB08 out PORTB, R16
|
||
193:
|
||
194: ; **** ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ ********************************
|
||
195: outi r16, GIMSK, (1<<PCIE0)
|
||
195: 000063 E200 ldi R16, (1<<PCIE0)
|
||
195: 000064 BF0B out GIMSK, R16
|
||
196: outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
|
||
196: 000065 E10C ldi R16, (1<<PCINT2)|(1<<PCINT3)|(1<<PCINT4)
|
||
196: 000066 BD00 out PCMSK0, R16
|
||
197:
|
||
198: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 0 **********************************
|
||
199: outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
|
||
199: 000067 E002 ldi R16, (1<<WGM01)
|
||
199: 000068 BF00 out TCCR0A, R16
|
||
200: outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
|
||
200: 000069 E005 ldi R16, (1<<CS02)|(1<<CS00)
|
||
200: 00006A BF03 out TCCR0B, R16
|
||
201: outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
|
||
201: 00006B E109 ldi R16, 25
|
||
201: 00006C BF06 out OCR0A, R16
|
||
202: outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
|
||
202: 00006D E001 ldi R16, (1<<OCIE0A)
|
||
202: 00006E BF09 out TIMSK, R16
|
||
203:
|
||
204: ; **** ИНИЦИАЛИЗАЦИЯ USART *************************************
|
||
205: ; outi r16, UBRRL, LOW(3) ; 9600 БОД
|
||
206: ; outi r16, UBRRH, HIGH(3) ; 9600 БОД
|
||
207: ; outi r16, UCSRB, (1<<RXEN) | (1<<TXEN) ; Включение приема и передачии
|
||
208: ; outi r16, UCSRC, (1<<UCSZ1) | (1<<UCSZ0) ; Асинхронный режим, 8 бит фрейм, 1 стоповый бит
|
||
209:
|
||
210: 00006F 2411 clr r1
|
||
211: 000070 9210 sts CURRENT_DIGIT, r1
|
||
000071 0067
|
||
212:
|
||
213: display_load 0 ; загружаем число, которое нужно показать на индикатор
|
||
213: 000072 E080 ldi DISP_NUM_L, LOW(0)
|
||
213: 000073 E090 ldi DISP_NUM_H, HIGH(0)
|
||
214: ONE_WIRE_RESET:
|
||
215: ; 62 тика
|
||
216: outi r16, TCNT1L, 131
|
||
216: 000074 E803 ldi R16, 131
|
||
216: 000075 BD0C out TCNT1L, R16
|
||
217: outi r16, TCNT1H, 0
|
||
217: 000076 E000 ldi R16, 0
|
||
217: 000077 BD0D out TCNT1H, R16
|
||
218: outi r16, OCR1AL, 193
|
||
218: 000078 EC01 ldi R16, 193
|
||
218: 000079 BD0A out OCR1AL, R16
|
||
219: outi r16, OCR1AH, 0
|
||
219: 00007A E000 ldi R16, 0
|
||
219: 00007B BD0B out OCR1AH, R16
|
||
220:
|
||
221: ; запуск таймера в режиме Normal
|
||
222: outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
|
||
222: 00007C E003 ldi R16, (1<<CS11)|(1<<CS10)
|
||
222: 00007D BD0E out TCCR1B, R16
|
||
223:
|
||
224: ; притягиваем шину
|
||
225: 00007E 9AB9 sbi ONE_WIRE_DDR, ONE_WIRE_LINE
|
||
226:
|
||
227: ; ждем минимум 480 мкс
|
||
228: 00007F B708 in r16, TIFR
|
||
229: 000080 FF06 sbrs r16, OCF1A
|
||
230: 000081 CFFD rjmp d1
|
||
231: 000082 D030 rcall OCF1A_occured
|
||
232:
|
||
233:
|
||
234: 000083 9478 sei
|
||
235:
|
||
236:
|
||
237:
|
||
238: ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
|
||
239: LOOP:
|
||
240: 000084 D030 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
|
||
241:
|
||
242: ; usart_t:
|
||
243: ; sbis UCSRA, UDRE
|
||
244: ; rjmp usart_t
|
||
245: ; ldi r16, 'B'
|
||
246: ; out UDR, r16
|
||
247:
|
||
248: ; usart_r:
|
||
249: ; sbis UCSRA, RXC
|
||
250: ; rjmp usart_r
|
||
251: ; in DISP_NUM_L, UDR
|
||
252:
|
||
253: 000085 9A96 sbi PORTD, PD6
|
||
254:
|
||
255: 000086 D055 rcall DELAY
|
||
256: 000087 D054 rcall DELAY
|
||
257: 000088 D053 rcall DELAY
|
||
258: 000089 D052 rcall DELAY
|
||
259: 00008A D051 rcall DELAY
|
||
260: 00008B D050 rcall DELAY
|
||
261:
|
||
262: 00008C 9896 cbi PORTD, PD6
|
||
263:
|
||
264: 00008D D04E rcall DELAY
|
||
265: 00008E D04D rcall DELAY
|
||
266: 00008F D04C rcall DELAY
|
||
267: 000090 D04B rcall DELAY
|
||
268: 000091 D04A rcall DELAY
|
||
269: 000092 D049 rcall DELAY
|
||
270:
|
||
271: 000093 CFF0 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: 000094 24EE clr drem16uL ; clear remainder Low byte
|
||
34: 000095 18FF sub drem16uH,drem16uH ; clear remainder High byte and carry
|
||
35: 000096 E141 ldi dcnt16u,17 ; init loop counter
|
||
36: d16u_1:
|
||
37: 000097 1F00 rol dd16uL ; shift left dividend
|
||
38: 000098 1F11 rol dd16uH
|
||
39: 000099 954A dec dcnt16u ; decrement counter
|
||
40: 00009A F409 brne d16u_2 ; if done
|
||
41: 00009B 9508 ret ; return
|
||
42: d16u_2:
|
||
43: 00009C 1CEE rol drem16uL ; shift dividend into remainder
|
||
44: 00009D 1CFF rol drem16uH
|
||
45: 00009E 1AE2 sub drem16uL,dv16uL ; remainder = remainder - divisor
|
||
46: 00009F 0AF3 sbc drem16uH,dv16uH
|
||
47: 0000A0 F420 brcc d16u_3 ; if result negative
|
||
48: 0000A1 0EE2 add drem16uL,dv16uL ; restore remainder
|
||
49: 0000A2 1EF3 adc drem16uH,dv16uH
|
||
50: 0000A3 9488 clc ; clear carry to be shifted into result
|
||
51: 0000A4 CFF2 rjmp d16u_1 ; else
|
||
52: d16u_3:
|
||
53: 0000A5 9408 sec ; set carry to be shifted into result
|
||
54: 0000A6 CFF0 rjmp d16u_1
|
||
Continuing file firmware.asm
|
||
275: .INCLUDE "usi.asm"
|
||
Including file usi.asm
|
||
|
||
1: ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
|
||
2: USI_TRANSMIT:
|
||
3: 0000A7 930F push r16
|
||
4: 0000A8 B80F out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
|
||
5:
|
||
6: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
|
||
7: 0000A9 E400 ldi TEMP_REG_A, (1<<USIOIF)
|
||
8: 0000AA 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: 0000AB 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: 0000AC B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
|
||
22: 0000AD 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
|
||
23: 0000AE 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: 0000AF 9AC0 sbi PORTB, USI_LATCH_PIN
|
||
28: 0000B0 98C0 cbi PORTB, USI_LATCH_PIN
|
||
29: 0000B1 910F pop r16
|
||
30: 0000B2 9508 ret
|
||
Continuing file firmware.asm
|
||
276:
|
||
277: OCF1A_occured:
|
||
278: ; отпускаем шину
|
||
279: 0000B3 98B9 cbi ONE_WIRE_DDR, ONE_WIRE_LINE
|
||
280: 0000B4 9508 ret
|
||
281:
|
||
282: ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
|
||
283: ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
|
||
284: ; путем деления этого числа несколько раз
|
||
285: DISPLAY_UPD_DIGITS:
|
||
286: 0000B5 935F push r21
|
||
287: 0000B6 E054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
|
||
288: 0000B7 E6A3 ldi XL, LOW(DIGITS)
|
||
289: 0000B8 E0B0 ldi XH, HIGH(DIGITS)
|
||
290:
|
||
291: .equ dividend = SRAM_TEMP_1
|
||
292: .equ divisor = 10
|
||
293:
|
||
294: ; загружаем число которое хотим поделить в адрес SRAM делимого
|
||
295: 0000B9 9380 sts dividend, DISP_NUM_L
|
||
0000BA 0061
|
||
296: 0000BB 9390 sts dividend+1, DISP_NUM_H
|
||
0000BC 0062
|
||
297:
|
||
298: ; четыре раза производим деление для получения остатков
|
||
299: DIV_LOOP:
|
||
300: ; заполняем нужные регистры
|
||
301: 0000BD 9100 lds dd16uL, dividend
|
||
0000BE 0061
|
||
302: 0000BF 9110 lds dd16uH, dividend+1
|
||
0000C0 0062
|
||
303: 0000C1 E02A ldi dv16uL, LOW(divisor)
|
||
304: 0000C2 E030 ldi dv16uH, HIGH(divisor)
|
||
305:
|
||
306: 0000C3 DFD0 rcall div16u ; делим
|
||
307:
|
||
308: 0000C4 92ED st X+, drem16uL ; сохраняем остаток в ячейку по указателю
|
||
309:
|
||
310: ; обновляем делимое
|
||
311: 0000C5 9300 sts dividend, dres16uL
|
||
0000C6 0061
|
||
312: 0000C7 9310 sts dividend+1, dres16uH
|
||
0000C8 0062
|
||
313:
|
||
314: 0000C9 955A dec r21 ; декрементируем счетчик цикла
|
||
315: 0000CA F791 brne DIV_LOOP ; делим еще раз если не 0
|
||
316: 0000CB 915F pop r21
|
||
317: 0000CC 9508 ret
|
||
318:
|
||
319: ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
|
||
320: DISPLAY_DECODER:
|
||
321: 0000CD 930F push r16
|
||
322: 0000CE 931F push r17
|
||
323: 0000CF EDE4 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
|
||
324: 0000D0 E0F1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
|
||
325:
|
||
326: 0000D1 2711 clr TEMP_REG_B
|
||
327: 0000D2 0FE0 add ZL, TEMP_REG_A
|
||
328: 0000D3 1FF1 adc ZH, TEMP_REG_B
|
||
329:
|
||
330: 0000D4 9004 lpm r0, Z
|
||
331: 0000D5 911F pop r17
|
||
332: 0000D6 910F pop r16
|
||
333: 0000D7 9508 ret
|
||
334:
|
||
335: DELAY_68us:
|
||
336: 0000D8 EB03 ldi r16, 179 ; 1
|
||
337: _d1_loop:
|
||
338: 0000D9 950A dec r16 ; 1
|
||
339: 0000DA F7F1 brne _d1_loop ; 2/1
|
||
340: 0000DB 9508 ret ; 4
|
||
341:
|
||
342: DELAY:
|
||
343: 0000DC 930F push r16
|
||
344: 0000DD 931F push r17
|
||
345:
|
||
346: 0000DE EF0F ldi r16, 255
|
||
347: _DELAY_1:
|
||
348: 0000DF EF1F ldi r17, 255
|
||
349: _DELAY_2:
|
||
350: 0000E0 951A dec r17
|
||
351: 0000E1 0000 nop
|
||
352: 0000E2 0000 nop
|
||
353: 0000E3 0000 nop
|
||
354: 0000E4 F7D9 brne _DELAY_2
|
||
355:
|
||
356: 0000E5 950A dec r16
|
||
357: 0000E6 F7C1 brne _DELAY_1
|
||
358:
|
||
359: 0000E7 911F pop r17
|
||
360: 0000E8 910F pop r16
|
||
361: 0000E9 9508 ret
|
||
362:
|
||
363: DISPLAY_SYMBOLS:
|
||
364: ; HGFEDCBA HGFEDCBA
|
||
365: .DB 0b11000000, 0b11111001 ; 0, 1
|
||
0000EA F9C0
|
||
366: .DB 0b10100100, 0b10110000 ; 2, 3
|
||
0000EB B0A4
|
||
367: .DB 0b10011001, 0b10010010 ; 4, 5
|
||
0000EC 9299
|
||
368: .DB 0b10000010, 0b11111000 ; 6, 7
|
||
0000ED F882
|
||
369: .DB 0b10000000, 0b10010000 ; 8, 9
|
||
0000EE 9080
|
||
370: .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: 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
|