mirror of
https://github.com/sergeyyarkov/attiny2313a_thermostat.git
synced 2026-10-11 10:18:56 +03:00
744 lines
35 KiB
Plaintext
744 lines
35 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: 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
|