mirror of
https://github.com/sergeyyarkov/attiny2313a_thermostat.git
synced 2026-10-11 10:18:56 +03:00
upd
This commit is contained in:
parent
a74e7008ff
commit
4f3f21246e
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"cmake.configureOnOpen": false
|
||||
}
|
||||
@ -1,34 +1,40 @@
|
||||
:020000020000FC
|
||||
:020000005AC0E4
|
||||
:0200000060C0DE
|
||||
:020016003EC0EA
|
||||
:10001A0000C04F935F930F935FB7409167004530DD
|
||||
:10002A000CF403C0442740936700403041F493988E
|
||||
:10003A0094989598929A00916600B5D06BD0413009
|
||||
:10004A0041F4929894989598939A00916500ABD050
|
||||
:10005A0061D0423041F4929893989598949A00917D
|
||||
:10006A006400A1D057D0433041F492989398949861
|
||||
:10007A00959A0091630097D04DD0439540936700BD
|
||||
:10008A005FBF0F915F914F9118950F930FB7B29B76
|
||||
:10009A0005C0B39B05C0B49B05C005C0019603C04B
|
||||
:1000AA000A9601C0CF960FBF0F9118950FED0DBF9D
|
||||
:1000BA000EE701BB01EC07BB0CE108BB00E20BBF7A
|
||||
:1000CA000CE100BD02E000BF05E003BF09E106BF85
|
||||
:1000DA0001E009BF11241092670080E090E026D069
|
||||
:1000EA00789449D070FD969A70FF9698FACFEE24CC
|
||||
:1000FA00FF1841E1001F111F4A9509F40895EE1CEB
|
||||
:10010A00FF1CE21AF30A20F4E20EF31E8894F2CFDF
|
||||
:10011A000894F0CF0F930FB800E40EB90BE10DB9B4
|
||||
:10012A00769BFDCFC09AC0980F910895F89400E08D
|
||||
:10013A000CBD0CE30ABD05E408BD03E00EBDB99A87
|
||||
:10014A0008B706FFFCCFB99808B705FFFDCF0DD059
|
||||
:10015A0000E00CBD04E30ABD08B706FFFDCF002787
|
||||
:10016A000EBD0FEF08BF78940895B19B7160089592
|
||||
:10017A00F894789408955F9354E0A3E6B0E08093EE
|
||||
:10018A0061009093620000916100109162002AE080
|
||||
:10019A0030E0ADDFED9200936100109362005A9552
|
||||
:1001AA0091F75F9108950F931F93EAEEF1E01127FB
|
||||
:1001BA00E00FF11F04901F910F91089503EB0A9528
|
||||
:1001CA00F1F708950F931F930FEF1FEF1A95000091
|
||||
:1001DA0000000000D9F70A95C1F71F910F91089501
|
||||
:0C01EA00C0F9A4B0999282F880909C00AB
|
||||
:10003A0094989598929A00916600D6D070D04130E3
|
||||
:10004A0041F4929894989598939A00916500CCD02F
|
||||
:10005A0066D0423041F4929893989598949A009178
|
||||
:10006A006400C2D05CD0433041F49298939894983B
|
||||
:10007A00959A00916300B8D052D043954093670097
|
||||
:10008A005FBF0F915F914F9118950F931F932F9315
|
||||
:10009A003F930FB716B320916800122736B33093F7
|
||||
:1000AA00680012FF03C000C0B29B01960FBF3F91C8
|
||||
:1000BA002F911F910F9118950FED0DBF0EE701BB00
|
||||
:1000CA0001EC07BB0CE108BB00E20BBF0CE100BD71
|
||||
:1000DA0002E000BF05E003BF09E106BF01E009BF76
|
||||
:1000EA0011241092670080E090E0789463D0969A89
|
||||
:1000FA008AD0969888D0FACFEE24FF1841E1001FE3
|
||||
:10010A00111F4A9509F40895EE1CFF1CE21AF30A1E
|
||||
:10011A0020F4E20EF31E8894F2CF0894F0CF0F93E6
|
||||
:10012A000FB800E40EB90BE10DB9769BFDCFC09A6A
|
||||
:10013A00C0980F910895F89400E00CBD0CE30ABD35
|
||||
:10014A0005E408BD03E00EBDB99A08B706FFFDCF66
|
||||
:10015A00B99808B705FFFDCF0DD000E00CBD04E348
|
||||
:10016A000ABD08B706FFFDCF00270EBD0FEF08BF77
|
||||
:10017A0078940895B19B716008951F9313E308E082
|
||||
:10018A001F9108950F93F894726000E00CBD01E08E
|
||||
:10019A000ABD09E008BDB99A08B706FFFDCF90FC71
|
||||
:1001AA00B99808B705FFFDCF00270EBD7D7F78946B
|
||||
:1001BA000F910895F8945F9354E0A3E6B0E080931A
|
||||
:1001CA0061009093620000916100109162002AE040
|
||||
:1001DA0030E092DFED9200936100109362005A952D
|
||||
:1001EA0091F75F91789408950F931F93ECE4F2E0EE
|
||||
:1001FA001127E00FF11F04901F910F91089503EB4F
|
||||
:10020A000A95F1F708950F931F932F9325E01FEF97
|
||||
:10021A000FEF0A95F1F71A95D9F72A95C1F72F9199
|
||||
:10022A001F910F9108950F931F930FEF1FEF1A95C8
|
||||
:10023A00000000000000D9F70A95C1F71F910F913D
|
||||
:0E024A000895C0F9A4B0999282F880909C00AB
|
||||
:00000001FF
|
||||
|
||||
@ -1,20 +1,20 @@
|
||||
|
||||
AVRASM ver. 2.2.7 firmware.asm Wed May 10 21:22:23 2023
|
||||
AVRASM ver. 2.2.7 firmware.asm Thu Jun 15 23:21:29 2023
|
||||
|
||||
firmware.asm(14): Including file 'tn2313Adef.inc'
|
||||
firmware.asm(270): Including file 'div16u.asm'
|
||||
firmware.asm(302): Including file 'div16u.asm'
|
||||
div16u.asm(22): warning: Register r16 already defined by the .DEF directive
|
||||
firmware.asm(270): 'div16u.asm' included form here
|
||||
firmware.asm(302): 'div16u.asm' included form here
|
||||
div16u.asm(23): warning: Register r17 already defined by the .DEF directive
|
||||
firmware.asm(270): 'div16u.asm' included form here
|
||||
firmware.asm(302): 'div16u.asm' included form here
|
||||
div16u.asm(24): warning: Register r16 already defined by the .DEF directive
|
||||
firmware.asm(270): 'div16u.asm' included form here
|
||||
firmware.asm(302): 'div16u.asm' included form here
|
||||
div16u.asm(25): warning: Register r17 already defined by the .DEF directive
|
||||
firmware.asm(270): 'div16u.asm' included form here
|
||||
firmware.asm(271): Including file 'usi.asm'
|
||||
firmware.asm(302): 'div16u.asm' included form here
|
||||
firmware.asm(303): Including file 'usi.asm'
|
||||
firmware.asm(14): Including file 'tn2313Adef.inc'
|
||||
firmware.asm(270): Including file 'div16u.asm'
|
||||
firmware.asm(271): Including file 'usi.asm'
|
||||
firmware.asm(302): Including file 'div16u.asm'
|
||||
firmware.asm(303): Including file 'usi.asm'
|
||||
|
||||
|
||||
; Project name: thermostat
|
||||
@ -732,7 +732,6 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
|
||||
.DEF TEMP_REG_A = r16
|
||||
.DEF TEMP_REG_B = r17
|
||||
.DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса
|
||||
.DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе
|
||||
.DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе
|
||||
|
||||
@ -746,7 +745,9 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
.EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire
|
||||
.EQU ONE_WIRE_DDR = DDRB
|
||||
.EQU ONE_WIRE_PIN = PINB
|
||||
.DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса
|
||||
.EQU OWPRF = 0 ; 1-Wire Флаг присутствия
|
||||
.EQU OWSB = 1 ; Флаг передачи одного бита
|
||||
|
||||
; **** КОМАНДЫ ДАТЧИКА *****************************************
|
||||
.EQU DS18B20_CMD_CONVERTTEMP = 0x44
|
||||
@ -765,6 +766,8 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
.EQU USI_DO_PIN = PB6 ; DS на 74HC595
|
||||
.EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
|
||||
|
||||
.EQU SW_PORT = PORTB
|
||||
.EQU SW_PIN = PINB
|
||||
.EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус"
|
||||
.EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс"
|
||||
.EQU SW_SET_PIN = PB4 ; Кнопка "Установить"
|
||||
@ -800,12 +803,13 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
000061 SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке
|
||||
000063 DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
|
||||
000067 CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
|
||||
000068 PC_HISTORY: .BYTE 1 ; История изменений состояния кнопок (необходимо для прерываня по изменению состояния пина)
|
||||
|
||||
; **** СЕГМЕНТ КОДА **********************************************
|
||||
.CSEG
|
||||
|
||||
.ORG 0x00
|
||||
000000 c05a rjmp RESET_vect
|
||||
000000 c060 rjmp RESET_vect
|
||||
|
||||
.ORG 0x000B
|
||||
00000b c03e rjmp PCINT0_vect
|
||||
@ -839,8 +843,8 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
00001e 9895 cbi PORTD, DIGIT_4_PIN
|
||||
00001f 9a92 sbi PORTD, DIGIT_1_PIN
|
||||
000020 9100 0066 lds TEMP_REG_A, DIGITS+3
|
||||
000022 d0b5 rcall DISPLAY_DECODER
|
||||
000023 d06b rcall USI_TRANSMIT
|
||||
000022 d0d6 rcall DISPLAY_DECODER
|
||||
000023 d070 rcall USI_TRANSMIT
|
||||
|
||||
_indicate_2:
|
||||
000024 3041 cpi r20, 1
|
||||
@ -851,8 +855,8 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
000028 9895 cbi PORTD, DIGIT_4_PIN
|
||||
000029 9a93 sbi PORTD, DIGIT_2_PIN
|
||||
00002a 9100 0065 lds TEMP_REG_A, DIGITS+2
|
||||
00002c d0ab rcall DISPLAY_DECODER
|
||||
00002d d061 rcall USI_TRANSMIT
|
||||
00002c d0cc rcall DISPLAY_DECODER
|
||||
00002d d066 rcall USI_TRANSMIT
|
||||
|
||||
_indicate_3:
|
||||
00002e 3042 cpi r20, 2
|
||||
@ -863,8 +867,8 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
000032 9895 cbi PORTD, DIGIT_4_PIN
|
||||
000033 9a94 sbi PORTD, DIGIT_3_PIN
|
||||
000034 9100 0064 lds TEMP_REG_A, DIGITS+1
|
||||
000036 d0a1 rcall DISPLAY_DECODER
|
||||
000037 d057 rcall USI_TRANSMIT
|
||||
000036 d0c2 rcall DISPLAY_DECODER
|
||||
000037 d05c rcall USI_TRANSMIT
|
||||
|
||||
_indicate_4:
|
||||
000038 3043 cpi r20, 3
|
||||
@ -875,8 +879,8 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
00003c 9894 cbi PORTD, DIGIT_3_PIN
|
||||
00003d 9a95 sbi PORTD, DIGIT_4_PIN
|
||||
00003e 9100 0063 lds TEMP_REG_A, DIGITS
|
||||
000040 d097 rcall DISPLAY_DECODER
|
||||
000041 d04d rcall USI_TRANSMIT
|
||||
000040 d0b8 rcall DISPLAY_DECODER
|
||||
000041 d052 rcall USI_TRANSMIT
|
||||
|
||||
_indicate_exit:
|
||||
000042 9543 inc r20
|
||||
@ -891,62 +895,89 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
; **** ОБРАБОТКА КНОПОК ******************************************
|
||||
PCINT0_vect:
|
||||
00004a 930f push r16
|
||||
00004b b70f in r16, SREG
|
||||
00004b 931f push r17
|
||||
00004c 932f push r18
|
||||
00004d 933f push r19
|
||||
|
||||
00004c 9bb2 sbis PINB, SW_PLUS_PIN
|
||||
00004d c005 rjmp _sw_plus
|
||||
00004e b70f in r16, SREG
|
||||
|
||||
00004e 9bb3 sbis PINB, SW_MINUS_PIN
|
||||
00004f c005 rjmp _sw_minus
|
||||
00004f b316 in r17, SW_PIN
|
||||
000050 9120 0068 lds r18, PC_HISTORY
|
||||
|
||||
000050 9bb4 sbis PINB, SW_SET_PIN
|
||||
000051 c005 rjmp _sw_set
|
||||
000052 2712 eor r17, r18
|
||||
000053 b336 in r19, SW_PIN
|
||||
000054 9330 0068 sts PC_HISTORY, r19
|
||||
|
||||
000052 c005 rjmp _sw_exit
|
||||
_sw_plus:
|
||||
000053 9601 adiw DISP_NUM_L, 1
|
||||
000054 c003 rjmp _sw_exit
|
||||
_sw_minus:
|
||||
000055 960a adiw DISP_NUM_L, 10
|
||||
000056 c001 rjmp _sw_exit
|
||||
_sw_set:
|
||||
000057 96cf adiw DISP_NUM_L, 63
|
||||
_sw_exit:
|
||||
_SW_PLUS_CHECK:
|
||||
000056 ff12 sbrs r17, SW_PLUS_PIN
|
||||
000057 c003 rjmp _SW_EXIT
|
||||
000058 c000 rjmp _SW_PLUS_HANDLER
|
||||
|
||||
000058 bf0f out SREG, r16
|
||||
000059 910f pop r16
|
||||
00005a 9518 reti
|
||||
_SW_PLUS_HANDLER:
|
||||
; rcall DEBOUNCE_SW
|
||||
000059 9bb2 sbis SW_PIN, SW_PLUS_PIN
|
||||
00005a 9601 adiw DISP_NUM_L, 1
|
||||
;exit
|
||||
|
||||
|
||||
; sbis PINB, SW_PLUS_PIN
|
||||
; rjmp _sw_plus
|
||||
|
||||
; sbis PINB, SW_MINUS_PIN
|
||||
; rjmp _sw_minus
|
||||
|
||||
; sbis PINB, SW_SET_PIN
|
||||
; rjmp _sw_set
|
||||
|
||||
; rjmp _sw_exit
|
||||
; _sw_plus:
|
||||
; adiw DISP_NUM_L, 1
|
||||
; rjmp _sw_exit
|
||||
; _sw_minus:
|
||||
; adiw DISP_NUM_L, 10
|
||||
; rjmp _sw_exit
|
||||
; _sw_set:
|
||||
; adiw DISP_NUM_L, 63
|
||||
; _sw_exit:
|
||||
|
||||
_SW_EXIT:
|
||||
00005b bf0f out SREG, r16
|
||||
00005c 913f pop r19
|
||||
00005d 912f pop r18
|
||||
00005e 911f pop r17
|
||||
00005f 910f pop r16
|
||||
000060 9518 reti
|
||||
|
||||
; **** СТАРТ ПРОГРАММЫ *******************************************
|
||||
RESET_vect:
|
||||
00005b ed0f ldi TEMP_REG_A, LOW(RAMEND)
|
||||
00005c bf0d out SPL, TEMP_REG_A
|
||||
000061 ed0f ldi TEMP_REG_A, LOW(RAMEND)
|
||||
000062 bf0d out SPL, TEMP_REG_A
|
||||
|
||||
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
|
||||
MCU_INIT:
|
||||
; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
|
||||
00005d e70e
|
||||
00005e bb01 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)
|
||||
00005f ec01
|
||||
000060 bb07 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)
|
||||
000061 e10c
|
||||
000062 bb08 outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
|
||||
000063 e70e
|
||||
000064 bb01 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)
|
||||
000065 ec01
|
||||
000066 bb07 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)
|
||||
000067 e10c
|
||||
000068 bb08 outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
|
||||
|
||||
; **** ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ ********************************
|
||||
000063 e200
|
||||
000064 bf0b outi r16, GIMSK, (1<<PCIE0)
|
||||
000065 e10c
|
||||
000066 bd00 outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
|
||||
000069 e200
|
||||
00006a bf0b outi r16, GIMSK, (1<<PCIE0)
|
||||
00006b e10c
|
||||
00006c bd00 outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
|
||||
|
||||
; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 0 **********************************
|
||||
000067 e002
|
||||
000068 bf00 outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
|
||||
000069 e005
|
||||
00006a bf03 outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
|
||||
00006b e109
|
||||
00006c bf06 outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
|
||||
00006d e001
|
||||
00006e bf09 outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
|
||||
00006d e002
|
||||
00006e bf00 outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
|
||||
00006f e005
|
||||
000070 bf03 outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
|
||||
000071 e109
|
||||
000072 bf06 outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
|
||||
000073 e001
|
||||
000074 bf09 outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
|
||||
|
||||
; **** ИНИЦИАЛИЗАЦИЯ USART *************************************
|
||||
; outi r16, UBRRL, LOW(3) ; 9600 БОД
|
||||
@ -954,17 +985,17 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
; outi r16, UCSRB, (1<<RXEN) | (1<<TXEN) ; Включение приема и передачии
|
||||
; outi r16, UCSRC, (1<<UCSZ1) | (1<<UCSZ0) ; Асинхронный режим, 8 бит фрейм, 1 стоповый бит
|
||||
|
||||
00006f 2411 clr r1
|
||||
000070 9210 0067 sts CURRENT_DIGIT, r1
|
||||
000075 2411 clr r1
|
||||
000076 9210 0067 sts CURRENT_DIGIT, r1
|
||||
|
||||
000072 e080
|
||||
000073 e090 display_load 0 ; загружаем число, которое нужно показать на индикатор
|
||||
000074 d026 rcall _1_WIRE_DETECT_PRESENCE ; проверяем наличие датчика на шине путем выполнения процедуры сброса
|
||||
000075 9478 sei
|
||||
000078 e080
|
||||
000079 e090 display_load 0 ; загружаем число, которое нужно показать на индикатор
|
||||
; rcall _1_WIRE_DETECT_PRESENCE ; проверяем наличие датчика на шине путем выполнения процедуры сброса
|
||||
00007a 9478 sei
|
||||
|
||||
; **** ГЛАВНЫЙ ЦИКЛ **********************************************
|
||||
LOOP:
|
||||
000076 d049 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
|
||||
00007b d063 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
|
||||
|
||||
; usart_t:
|
||||
; sbis UCSRA, UDRE
|
||||
@ -977,20 +1008,21 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
; rjmp usart_r
|
||||
; in DISP_NUM_L, UDR
|
||||
|
||||
000077 fd70 sbrc ONE_WIRE_FLAGS, OWPRF
|
||||
000078 9a96 sbi PORTD, PD6
|
||||
; sbrc ONE_WIRE_FLAGS, OWPRF
|
||||
; sbi PORTD, PD6
|
||||
|
||||
000079 ff70 sbrs ONE_WIRE_FLAGS, OWPRF
|
||||
00007a 9896 cbi PORTD, PD6
|
||||
; sbrs ONE_WIRE_FLAGS, OWPRF
|
||||
; cbi PORTD, PD6
|
||||
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
00007c 9a96 sbi PORTD, PD6
|
||||
|
||||
00007b cffa rjmp LOOP
|
||||
00007d d08a rcall DEBOUNCE_SW
|
||||
|
||||
00007e 9896 cbi PORTD, PD6
|
||||
|
||||
00007f d088 rcall DEBOUNCE_SW
|
||||
|
||||
000080 cffa rjmp LOOP
|
||||
|
||||
; **** ПОДПРОГРАММЫ **********************************************
|
||||
.INCLUDE "div16u.asm"
|
||||
@ -1026,36 +1058,36 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
;***** Code
|
||||
|
||||
div16u:
|
||||
00007c 24ee clr drem16uL ; clear remainder Low byte
|
||||
00007d 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
|
||||
00007e e141 ldi dcnt16u,17 ; init loop counter
|
||||
000081 24ee clr drem16uL ; clear remainder Low byte
|
||||
000082 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
|
||||
000083 e141 ldi dcnt16u,17 ; init loop counter
|
||||
d16u_1:
|
||||
00007f 1f00 rol dd16uL ; shift left dividend
|
||||
000080 1f11 rol dd16uH
|
||||
000081 954a dec dcnt16u ; decrement counter
|
||||
000082 f409 brne d16u_2 ; if done
|
||||
000083 9508 ret ; return
|
||||
000084 1f00 rol dd16uL ; shift left dividend
|
||||
000085 1f11 rol dd16uH
|
||||
000086 954a dec dcnt16u ; decrement counter
|
||||
000087 f409 brne d16u_2 ; if done
|
||||
000088 9508 ret ; return
|
||||
d16u_2:
|
||||
000084 1cee rol drem16uL ; shift dividend into remainder
|
||||
000085 1cff rol drem16uH
|
||||
000086 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
|
||||
000087 0af3 sbc drem16uH,dv16uH
|
||||
000088 f420 brcc d16u_3 ; if result negative
|
||||
000089 0ee2 add drem16uL,dv16uL ; restore remainder
|
||||
00008a 1ef3 adc drem16uH,dv16uH
|
||||
00008b 9488 clc ; clear carry to be shifted into result
|
||||
00008c cff2 rjmp d16u_1 ; else
|
||||
000089 1cee rol drem16uL ; shift dividend into remainder
|
||||
00008a 1cff rol drem16uH
|
||||
00008b 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
|
||||
00008c 0af3 sbc drem16uH,dv16uH
|
||||
00008d f420 brcc d16u_3 ; if result negative
|
||||
00008e 0ee2 add drem16uL,dv16uL ; restore remainder
|
||||
00008f 1ef3 adc drem16uH,dv16uH
|
||||
000090 9488 clc ; clear carry to be shifted into result
|
||||
000091 cff2 rjmp d16u_1 ; else
|
||||
d16u_3:
|
||||
00008d 9408 sec ; set carry to be shifted into result
|
||||
000092 9408 sec ; set carry to be shifted into result
|
||||
.INCLUDE "usi.asm"
|
||||
00008e cff0
|
||||
000093 cff0
|
||||
USI_TRANSMIT:
|
||||
00008f 930f push r16
|
||||
000090 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
|
||||
000094 930f push r16
|
||||
000095 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
|
||||
|
||||
; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
|
||||
000091 e400 ldi TEMP_REG_A, (1<<USIOIF)
|
||||
000092 b90e out USISR, TEMP_REG_A
|
||||
000096 e400 ldi TEMP_REG_A, (1<<USIOIF)
|
||||
000097 b90e out USISR, TEMP_REG_A
|
||||
|
||||
; Load settings of USI into temp register
|
||||
; This will setup USI to Three-wire mode, Software clock strobe (USITC)
|
||||
@ -1065,170 +1097,236 @@ firmware.asm(271): Including file 'usi.asm'
|
||||
; USICS1 <--------------> USI Clock Source Select
|
||||
; USICLK <--------------> USI Clock Strobe
|
||||
; USITC <--------------> USI Toggle Clock (Enable clock generation)
|
||||
000093 e10b ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
|
||||
000098 e10b ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
|
||||
|
||||
_USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
|
||||
000094 b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
|
||||
000095 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
|
||||
000096 cffd rjmp _USI_TRANSMIT_LOOP
|
||||
000099 b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
|
||||
00009a 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
|
||||
00009b cffd rjmp _USI_TRANSMIT_LOOP
|
||||
|
||||
; Send pulse into LATCH pin.
|
||||
; This will copy byte from 74hc595 shift register into 74hc595 storage register
|
||||
000097 9ac0 sbi PORTB, USI_LATCH_PIN
|
||||
000098 98c0 cbi PORTB, USI_LATCH_PIN
|
||||
000099 910f pop r16
|
||||
00009a 9508
|
||||
00009c 9ac0 sbi PORTB, USI_LATCH_PIN
|
||||
00009d 98c0 cbi PORTB, USI_LATCH_PIN
|
||||
00009e 910f pop r16
|
||||
00009f 9508
|
||||
; **** ОПРОС ПРИСУТСТВИЯ УСТРОЙСТВА ******************************
|
||||
_1_WIRE_DETECT_PRESENCE:
|
||||
00009b 94f8 cli ; Шаг 1. выключаем глобальные прерывания
|
||||
0000a0 94f8 cli ; Шаг 1. выключаем глобальные прерывания
|
||||
|
||||
; 62 тика
|
||||
00009c e000
|
||||
00009d bd0c outi r16, TCNT1L, 0
|
||||
00009e e30c
|
||||
00009f bd0a outi r16, OCR1AL, 60 ; 480 мкс
|
||||
0000a0 e405
|
||||
0000a1 bd08 outi r16, OCR1BL, 69 ; 72 мкс
|
||||
0000a1 e000
|
||||
0000a2 bd0c outi r16, TCNT1L, 0
|
||||
0000a3 e30c
|
||||
0000a4 bd0a outi r16, OCR1AL, 60 ; 480 мкс
|
||||
0000a5 e405
|
||||
0000a6 bd08 outi r16, OCR1BL, 69 ; 72 мкс
|
||||
|
||||
; предделитель 64
|
||||
0000a2 e003
|
||||
0000a3 bd0e outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
|
||||
0000a7 e003
|
||||
0000a8 bd0e outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
|
||||
|
||||
0000a4 9ab9 S1: _1_wire_pull ; Шаг 2. притягиваем шину
|
||||
0000a5 b708 in r16, TIFR
|
||||
0000a6 ff06 sbrs r16, OCF1A ; Шаг 3. ждем минимум 480мкс
|
||||
0000a7 cffc rjmp S1
|
||||
0000a8 98b9 _1_wire_release ; Шаг 4. отпускаем шину
|
||||
0000a9 b708 S2: in r16, TIFR
|
||||
0000aa ff05 sbrs r16, OCF1B ; Шаг 5. ждем +- 70мкс
|
||||
0000ab cffd rjmp S2
|
||||
0000ac d00d rcall _1_WIRE_CHECK_PRESENCE ; Шаг 6. проверяем есть ли устройство на шине, и если есть то устанавливаем флаг
|
||||
0000a9 9ab9 _1_wire_pull ; Шаг 2. притягиваем шину
|
||||
|
||||
0000ad e000
|
||||
0000ae bd0c outi r16, TCNT1L, 0
|
||||
0000af e304
|
||||
0000b0 bd0a outi r16, OCR1AL, 52 ; 416 мкс
|
||||
S1:
|
||||
0000aa b708 in r16, TIFR
|
||||
0000ab ff06 sbrs r16, OCF1A ; Шаг 3. ждем минимум 480мкс
|
||||
0000ac cffd rjmp S1
|
||||
0000ad 98b9 _1_wire_release ; Шаг 4. отпускаем шину
|
||||
0000ae b708 S2: in r16, TIFR
|
||||
0000af ff05 sbrs r16, OCF1B ; Шаг 5. ждем +- 70мкс
|
||||
0000b0 cffd rjmp S2
|
||||
0000b1 d00d rcall _1_WIRE_CHECK_PRESENCE ; Шаг 6. проверяем есть ли устройство на шине, и если есть то устанавливаем флаг
|
||||
|
||||
0000b2 e000
|
||||
0000b3 bd0c outi r16, TCNT1L, 0
|
||||
0000b4 e304
|
||||
0000b5 bd0a outi r16, OCR1AL, 52 ; 416 мкс
|
||||
S3:
|
||||
0000b1 b708 in r16, TIFR
|
||||
0000b2 ff06 sbrs r16, OCF1A
|
||||
0000b3 cffd rjmp S3
|
||||
0000b4 2700 clr r16
|
||||
0000b5 bd0e out TCCR1B, r16
|
||||
0000b6 ef0f ser r16
|
||||
0000b7 bf08 out TIFR, r16
|
||||
0000b6 b708 in r16, TIFR
|
||||
0000b7 ff06 sbrs r16, OCF1A
|
||||
0000b8 cffd rjmp S3
|
||||
0000b9 2700 clr r16
|
||||
0000ba bd0e out TCCR1B, r16
|
||||
0000bb ef0f ser r16
|
||||
0000bc bf08 out TIFR, r16
|
||||
; s3: in r16, TIFR
|
||||
; sbrs r16, TOV1
|
||||
; rjmp s3
|
||||
; rcall TOV1_occured
|
||||
; ser r16
|
||||
; out TIFR, r16
|
||||
0000b8 9478 sei
|
||||
0000b9 9508 ret
|
||||
0000bd 9478 sei
|
||||
0000be 9508 ret
|
||||
|
||||
; **** ПРОВЕРКА НАЛИЧИЯ УСТРОЙСТВА *******************************
|
||||
; Если подчиненное устройство притянет шину, то устанавливаем флаг OWPRF в единицу в регистре флагов
|
||||
;
|
||||
_1_WIRE_CHECK_PRESENCE:
|
||||
0000ba 9bb1 sbis ONE_WIRE_PIN, ONE_WIRE_LINE
|
||||
0000bb 6071 sbr ONE_WIRE_FLAGS, (1<<OWPRF)
|
||||
0000bc 9508 ret
|
||||
0000bf 9bb1 sbis ONE_WIRE_PIN, ONE_WIRE_LINE
|
||||
0000c0 6071 sbr ONE_WIRE_FLAGS, (1<<OWPRF)
|
||||
0000c1 9508 ret
|
||||
|
||||
_1_WIRE_SEND_BYTE:
|
||||
0000c2 931f push r17
|
||||
0000c3 e313 ldi r17, DS18B20_CMD_READROM
|
||||
0000c4 e008 ldi r16, 8
|
||||
_s_l:
|
||||
; rol r16
|
||||
; brcc
|
||||
0000c5 911f pop r17
|
||||
0000c6 9508 ret
|
||||
|
||||
.DEF TRANSMIT_BIT = r9
|
||||
_1_WIRE_SEND_BIT:
|
||||
0000bd 94f8 cli
|
||||
0000c7 930f push r16
|
||||
0000c8 94f8 cli
|
||||
0000c9 6072 sbr ONE_WIRE_FLAGS, (1<<OWSB)
|
||||
0000ca e000
|
||||
0000cb bd0c outi r16, TCNT1L, 0
|
||||
0000cc e001
|
||||
0000cd bd0a outi r16, OCR1AL, 1 ; 8 мкс
|
||||
0000ce e009
|
||||
0000cf bd08 outi r16, OCR1BL, 9 ; 64 мкс
|
||||
|
||||
0000be 9478 sei
|
||||
0000bf 9508 ret
|
||||
0000d0 9ab9 _1_wire_pull
|
||||
SB_1:
|
||||
0000d1 b708 in r16, TIFR
|
||||
0000d2 ff06 sbrs r16, OCF1A
|
||||
0000d3 cffd rjmp SB_1
|
||||
0000d4 fc90 sbrc TRANSMIT_BIT, 0
|
||||
0000d5 98b9 _1_wire_release
|
||||
SB_2:
|
||||
0000d6 b708 in r16, TIFR
|
||||
0000d7 ff05 sbrs r16, OCF1B
|
||||
0000d8 cffd rjmp SB_2
|
||||
|
||||
0000d9 2700 clr r16
|
||||
0000da bd0e out TCCR1B, r16
|
||||
0000db 7f7d cbr ONE_WIRE_FLAGS, (1<<OWSB)
|
||||
0000dc 9478 sei
|
||||
0000dd 910f pop r16
|
||||
0000de 9508 ret
|
||||
|
||||
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
|
||||
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
|
||||
; путем деления этого числа несколько раз
|
||||
DISPLAY_UPD_DIGITS:
|
||||
0000c0 935f push r21
|
||||
0000c1 e054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
|
||||
0000c2 e6a3 ldi XL, LOW(DIGITS)
|
||||
0000c3 e0b0 ldi XH, HIGH(DIGITS)
|
||||
0000df 94f8 cli
|
||||
0000e0 935f push r21
|
||||
0000e1 e054 ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный
|
||||
|
||||
.equ dividend = SRAM_TEMP_1
|
||||
.equ divisor = 10
|
||||
; инициализация указателя (за каждый проход цикла будет инкрементироваться)
|
||||
0000e2 e6a3 ldi XL, LOW(DIGITS)
|
||||
0000e3 e0b0 ldi XH, HIGH(DIGITS)
|
||||
|
||||
.equ dividend = SRAM_TEMP_1 ; число которе будем делить
|
||||
.equ divisor = 10 ; на что делим
|
||||
|
||||
; загружаем число которое хотим поделить в адрес SRAM делимого
|
||||
0000c4 9380 0061 sts dividend, DISP_NUM_L
|
||||
0000c6 9390 0062 sts dividend+1, DISP_NUM_H
|
||||
0000e4 9380 0061 sts dividend, DISP_NUM_L
|
||||
0000e6 9390 0062 sts dividend+1, DISP_NUM_H
|
||||
|
||||
; четыре раза производим деление для получения остатков
|
||||
DIV_LOOP:
|
||||
; заполняем нужные регистры
|
||||
0000c8 9100 0061 lds dd16uL, dividend
|
||||
0000ca 9110 0062 lds dd16uH, dividend+1
|
||||
0000cc e02a ldi dv16uL, LOW(divisor)
|
||||
0000cd e030 ldi dv16uH, HIGH(divisor)
|
||||
0000e8 9100 0061 lds dd16uL, dividend
|
||||
0000ea 9110 0062 lds dd16uH, dividend+1
|
||||
0000ec e02a ldi dv16uL, LOW(divisor)
|
||||
0000ed e030 ldi dv16uH, HIGH(divisor)
|
||||
|
||||
0000ce dfad rcall div16u ; делим
|
||||
0000ee df92 rcall div16u ; делим
|
||||
|
||||
0000cf 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю
|
||||
0000ef 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его
|
||||
|
||||
; обновляем делимое
|
||||
0000d0 9300 0061 sts dividend, dres16uL
|
||||
0000d2 9310 0062 sts dividend+1, dres16uH
|
||||
0000f0 9300 0061 sts dividend, dres16uL
|
||||
0000f2 9310 0062 sts dividend+1, dres16uH
|
||||
|
||||
0000d4 955a dec r21 ; декрементируем счетчик цикла
|
||||
0000d5 f791 brne DIV_LOOP ; делим еще раз если не 0
|
||||
0000d6 915f pop r21
|
||||
0000d7 9508 ret
|
||||
0000f4 955a dec r21 ; декрементируем счетчик цикла
|
||||
0000f5 f791 brne DIV_LOOP ; делим еще раз если не 0
|
||||
0000f6 915f pop r21
|
||||
0000f7 9478 sei
|
||||
0000f8 9508 ret
|
||||
|
||||
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
|
||||
DISPLAY_DECODER:
|
||||
0000d8 930f push r16
|
||||
0000d9 931f push r17
|
||||
0000da eeea ldi ZL, LOW(2*DISPLAY_SYMBOLS)
|
||||
0000db e0f1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
|
||||
0000f9 930f push r16
|
||||
0000fa 931f push r17
|
||||
0000fb e4ec ldi ZL, LOW(2*DISPLAY_SYMBOLS)
|
||||
0000fc e0f2 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
|
||||
|
||||
0000dc 2711 clr TEMP_REG_B
|
||||
0000dd 0fe0 add ZL, TEMP_REG_A
|
||||
0000de 1ff1 adc ZH, TEMP_REG_B
|
||||
0000fd 2711 clr TEMP_REG_B
|
||||
0000fe 0fe0 add ZL, TEMP_REG_A
|
||||
0000ff 1ff1 adc ZH, TEMP_REG_B
|
||||
|
||||
0000df 9004 lpm r0, Z
|
||||
0000e0 911f pop r17
|
||||
0000e1 910f pop r16
|
||||
0000e2 9508 ret
|
||||
000100 9004 lpm r0, Z
|
||||
000101 911f pop r17
|
||||
000102 910f pop r16
|
||||
000103 9508 ret
|
||||
|
||||
DELAY_68us:
|
||||
0000e3 eb03 ldi r16, 179 ; 1
|
||||
000104 eb03 ldi r16, 179 ; 1
|
||||
_d1_loop:
|
||||
0000e4 950a dec r16 ; 1
|
||||
0000e5 f7f1 brne _d1_loop ; 2/1
|
||||
0000e6 9508 ret ; 4
|
||||
000105 950a dec r16 ; 1
|
||||
000106 f7f1 brne _d1_loop ; 2/1
|
||||
000107 9508 ret ; 4
|
||||
|
||||
DEBOUNCE_SW:
|
||||
000108 930f push r16
|
||||
000109 931f push r17
|
||||
00010a 932f push r18
|
||||
|
||||
00010b e025 ldi r18, 5
|
||||
_loop_2:
|
||||
00010c ef1f ldi r17, 255
|
||||
_loop_0:
|
||||
00010d ef0f ldi r16, 255
|
||||
_dec_0:
|
||||
00010e 950a dec r16
|
||||
00010f f7f1 brne _dec_0
|
||||
_loop_1:
|
||||
000110 951a dec r17
|
||||
000111 f7d9 brne _loop_0
|
||||
_loop_3:
|
||||
000112 952a dec r18
|
||||
000113 f7c1 brne _loop_2
|
||||
|
||||
000114 912f pop r18
|
||||
000115 911f pop r17
|
||||
000116 910f pop r16
|
||||
000117 9508 ret
|
||||
|
||||
DELAY:
|
||||
0000e7 930f push r16
|
||||
0000e8 931f push r17
|
||||
000118 930f push r16
|
||||
000119 931f push r17
|
||||
|
||||
0000e9 ef0f ldi r16, 255
|
||||
00011a ef0f ldi r16, 255
|
||||
_DELAY_1:
|
||||
0000ea ef1f ldi r17, 255
|
||||
00011b ef1f ldi r17, 255
|
||||
_DELAY_2:
|
||||
0000eb 951a dec r17
|
||||
0000ec 0000 nop
|
||||
0000ed 0000 nop
|
||||
0000ee 0000 nop
|
||||
0000ef f7d9 brne _DELAY_2
|
||||
00011c 951a dec r17
|
||||
00011d 0000 nop
|
||||
00011e 0000 nop
|
||||
00011f 0000 nop
|
||||
000120 f7d9 brne _DELAY_2
|
||||
|
||||
0000f0 950a dec r16
|
||||
0000f1 f7c1 brne _DELAY_1
|
||||
000121 950a dec r16
|
||||
000122 f7c1 brne _DELAY_1
|
||||
|
||||
0000f2 911f pop r17
|
||||
0000f3 910f pop r16
|
||||
0000f4 9508 ret
|
||||
000123 911f pop r17
|
||||
000124 910f pop r16
|
||||
000125 9508 ret
|
||||
|
||||
DISPLAY_SYMBOLS:
|
||||
; HGFEDCBA HGFEDCBA
|
||||
0000f5 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
|
||||
0000f6 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
|
||||
0000f7 9299 .DB 0b10011001, 0b10010010 ; 4, 5
|
||||
0000f8 f882 .DB 0b10000010, 0b11111000 ; 6, 7
|
||||
0000f9 9080 .DB 0b10000000, 0b10010000 ; 8, 9
|
||||
firmware.asm(416): warning: .cseg .db misalignment - padding zero byte
|
||||
0000fa 009c .DB 0b10011100 ; °
|
||||
000126 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
|
||||
000127 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
|
||||
000128 9299 .DB 0b10011001, 0b10010010 ; 4, 5
|
||||
000129 f882 .DB 0b10000010, 0b11111000 ; 6, 7
|
||||
00012a 9080 .DB 0b10000000, 0b10010000 ; 8, 9
|
||||
firmware.asm(511): warning: .cseg .db misalignment - padding zero byte
|
||||
00012b 009c .DB 0b10011100 ; °
|
||||
|
||||
; **** СЕГМЕНТ EEPROM ********************************************
|
||||
; .ESEG
|
||||
@ -1250,38 +1348,38 @@ counted separately from r26..r31 here.
|
||||
|
||||
"ATtiny2313A" register use summary:
|
||||
x : 1 y : 0 z : 1 r0 : 2 r1 : 2 r2 : 0 r3 : 0 r4 : 0
|
||||
r5 : 0 r6 : 0 r7 : 0 r8 : 0 r9 : 0 r10: 0 r11: 0 r12: 0
|
||||
r13: 0 r14: 5 r15: 5 r16: 70 r17: 11 r18: 3 r19: 3 r20: 14
|
||||
r21: 8 r22: 0 r23: 3 r24: 5 r25: 2 r26: 1 r27: 1 r28: 0
|
||||
r5 : 0 r6 : 0 r7 : 0 r8 : 0 r9 : 1 r10: 0 r11: 0 r12: 0
|
||||
r13: 0 r14: 5 r15: 5 r16: 89 r17: 23 r18: 11 r19: 7 r20: 14
|
||||
r21: 8 r22: 0 r23: 3 r24: 3 r25: 2 r26: 1 r27: 1 r28: 0
|
||||
r29: 0 r30: 2 r31: 2
|
||||
Registers used: 19 out of 35 (54.3%)
|
||||
Registers used: 20 out of 35 (57.1%)
|
||||
|
||||
"ATtiny2313A" instruction use summary:
|
||||
.lds : 0 .sts : 0 adc : 2 add : 2 adiw : 3 and : 0
|
||||
.lds : 0 .sts : 0 adc : 2 add : 2 adiw : 1 and : 0
|
||||
andi : 0 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0
|
||||
brcc : 1 brcs : 0 break : 0 breq : 0 brge : 1 brhc : 0
|
||||
brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0
|
||||
brne : 9 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
|
||||
brvs : 0 bset : 0 bst : 0 cbi : 15 cbr : 0 clc : 1
|
||||
clh : 0 cli : 2 cln : 0 clr : 5 cls : 0 clt : 0
|
||||
brne : 12 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
|
||||
brvs : 0 bset : 0 bst : 0 cbi : 16 cbr : 1 clc : 1
|
||||
clh : 0 cli : 3 cln : 0 clr : 6 cls : 0 clt : 0
|
||||
clv : 0 clz : 0 com : 0 cp : 0 cpc : 0 cpi : 5
|
||||
cpse : 0 dec : 5 eor : 0 icall : 0 ijmp : 0 in : 5
|
||||
inc : 1 ld : 0 ldd : 0 ldi : 31 lds : 7 lpm : 2
|
||||
cpse : 0 dec : 8 eor : 1 icall : 0 ijmp : 0 in : 9
|
||||
inc : 1 ld : 0 ldd : 0 ldi : 39 lds : 8 lpm : 2
|
||||
lsl : 0 lsr : 0 mov : 0 movw : 0 neg : 0 nop : 3
|
||||
or : 0 ori : 0 out : 23 pop : 10 push : 10 rcall : 12
|
||||
ret : 9 reti : 2 rjmp : 17 rol : 4 ror : 0 sbc : 1
|
||||
sbci : 0 sbi : 7 sbic : 0 sbis : 5 sbiw : 0 sbr : 1
|
||||
sbrc : 1 sbrs : 4 sec : 1 seh : 0 sei : 3 sen : 0
|
||||
or : 0 ori : 0 out : 27 pop : 18 push : 18 rcall : 13
|
||||
ret : 11 reti : 2 rjmp : 15 rol : 4 ror : 0 sbc : 1
|
||||
sbci : 0 sbi : 8 sbic : 0 sbis : 3 sbiw : 0 sbr : 2
|
||||
sbrc : 1 sbrs : 6 sec : 1 seh : 0 sei : 4 sen : 0
|
||||
ser : 1 ses : 0 set : 0 sev : 0 sez : 0 sleep : 0
|
||||
spm : 0 st : 1 std : 0 sts : 7 sub : 2 subi : 0
|
||||
spm : 0 st : 1 std : 0 sts : 8 sub : 2 subi : 0
|
||||
swap : 0 tst : 0 wdr : 0
|
||||
Instructions used: 38 out of 105 (36.2%)
|
||||
Instructions used: 40 out of 105 (38.1%)
|
||||
|
||||
"ATtiny2313A" memory use summary [bytes]:
|
||||
Segment Begin End Code Data Used Size Use%
|
||||
---------------------------------------------------------------
|
||||
[.cseg] 0x000000 0x0001f6 468 12 480 2048 23.4%
|
||||
[.dseg] 0x000060 0x000068 0 8 8 128 6.3%
|
||||
[.cseg] 0x000000 0x000258 566 12 578 2048 28.2%
|
||||
[.dseg] 0x000060 0x000069 0 9 9 128 7.0%
|
||||
[.eseg] 0x000000 0x000000 0 0 0 128 0.0%
|
||||
|
||||
Assembly complete, 0 errors, 5 warnings
|
||||
|
||||
168
firmware.asm
168
firmware.asm
@ -16,7 +16,6 @@
|
||||
|
||||
.DEF TEMP_REG_A = r16
|
||||
.DEF TEMP_REG_B = r17
|
||||
.DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса
|
||||
.DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе
|
||||
.DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе
|
||||
|
||||
@ -30,7 +29,9 @@
|
||||
.EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire
|
||||
.EQU ONE_WIRE_DDR = DDRB
|
||||
.EQU ONE_WIRE_PIN = PINB
|
||||
.DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса
|
||||
.EQU OWPRF = 0 ; 1-Wire Флаг присутствия
|
||||
.EQU OWSB = 1 ; Флаг передачи одного бита
|
||||
|
||||
; **** КОМАНДЫ ДАТЧИКА *****************************************
|
||||
.EQU DS18B20_CMD_CONVERTTEMP = 0x44
|
||||
@ -49,6 +50,8 @@
|
||||
.EQU USI_DO_PIN = PB6 ; DS на 74HC595
|
||||
.EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
|
||||
|
||||
.EQU SW_PORT = PORTB
|
||||
.EQU SW_PIN = PINB
|
||||
.EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус"
|
||||
.EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс"
|
||||
.EQU SW_SET_PIN = PB4 ; Кнопка "Установить"
|
||||
@ -84,6 +87,7 @@ MCU_STATE: .BYTE 1 ; Текущее состояние
|
||||
SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке
|
||||
DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
|
||||
CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
|
||||
PC_HISTORY: .BYTE 1 ; История изменений состояния кнопок (необходимо для прерываня по изменению состояния пина)
|
||||
|
||||
; **** СЕГМЕНТ КОДА **********************************************
|
||||
.CSEG
|
||||
@ -107,10 +111,10 @@ TIMER0_COMPA_vect:
|
||||
|
||||
lds r20, CURRENT_DIGIT
|
||||
cpi r20, 5
|
||||
brge reset_digit_idx
|
||||
brge _CLR_CURRENT_DIGIT ; сброс активного разряда если >= 5
|
||||
rjmp _indicate_1
|
||||
|
||||
reset_digit_idx:
|
||||
_CLR_CURRENT_DIGIT: ; сброс текущего активного разряда в ноль
|
||||
clr r20
|
||||
sts CURRENT_DIGIT, r20
|
||||
|
||||
@ -175,29 +179,56 @@ reti
|
||||
; **** ОБРАБОТКА КНОПОК ******************************************
|
||||
PCINT0_vect:
|
||||
push r16
|
||||
push r17
|
||||
push r18
|
||||
push r19
|
||||
|
||||
in r16, SREG
|
||||
|
||||
sbis PINB, SW_PLUS_PIN
|
||||
rjmp _sw_plus
|
||||
in r17, SW_PIN
|
||||
lds r18, PC_HISTORY
|
||||
|
||||
sbis PINB, SW_MINUS_PIN
|
||||
rjmp _sw_minus
|
||||
eor r17, r18
|
||||
in r19, SW_PIN
|
||||
sts PC_HISTORY, r19
|
||||
|
||||
sbis PINB, SW_SET_PIN
|
||||
rjmp _sw_set
|
||||
_SW_PLUS_CHECK:
|
||||
sbrs r17, SW_PLUS_PIN
|
||||
rjmp _SW_EXIT
|
||||
rjmp _SW_PLUS_HANDLER
|
||||
|
||||
rjmp _sw_exit
|
||||
_sw_plus:
|
||||
_SW_PLUS_HANDLER:
|
||||
; rcall DEBOUNCE_SW
|
||||
sbis SW_PIN, SW_PLUS_PIN
|
||||
adiw DISP_NUM_L, 1
|
||||
rjmp _sw_exit
|
||||
_sw_minus:
|
||||
adiw DISP_NUM_L, 10
|
||||
rjmp _sw_exit
|
||||
_sw_set:
|
||||
adiw DISP_NUM_L, 63
|
||||
_sw_exit:
|
||||
;exit
|
||||
|
||||
|
||||
; sbis PINB, SW_PLUS_PIN
|
||||
; rjmp _sw_plus
|
||||
|
||||
; sbis PINB, SW_MINUS_PIN
|
||||
; rjmp _sw_minus
|
||||
|
||||
; sbis PINB, SW_SET_PIN
|
||||
; rjmp _sw_set
|
||||
|
||||
; rjmp _sw_exit
|
||||
; _sw_plus:
|
||||
; adiw DISP_NUM_L, 1
|
||||
; rjmp _sw_exit
|
||||
; _sw_minus:
|
||||
; adiw DISP_NUM_L, 10
|
||||
; rjmp _sw_exit
|
||||
; _sw_set:
|
||||
; adiw DISP_NUM_L, 63
|
||||
; _sw_exit:
|
||||
|
||||
_SW_EXIT:
|
||||
out SREG, r16
|
||||
pop r19
|
||||
pop r18
|
||||
pop r17
|
||||
pop r16
|
||||
reti
|
||||
|
||||
@ -233,7 +264,7 @@ MCU_INIT:
|
||||
sts CURRENT_DIGIT, r1
|
||||
|
||||
display_load 0 ; загружаем число, которое нужно показать на индикатор
|
||||
rcall _1_WIRE_DETECT_PRESENCE ; проверяем наличие датчика на шине путем выполнения процедуры сброса
|
||||
; rcall _1_WIRE_DETECT_PRESENCE ; проверяем наличие датчика на шине путем выполнения процедуры сброса
|
||||
sei
|
||||
|
||||
; **** ГЛАВНЫЙ ЦИКЛ **********************************************
|
||||
@ -251,18 +282,19 @@ LOOP:
|
||||
; rjmp usart_r
|
||||
; in DISP_NUM_L, UDR
|
||||
|
||||
sbrc ONE_WIRE_FLAGS, OWPRF
|
||||
; sbrc ONE_WIRE_FLAGS, OWPRF
|
||||
; sbi PORTD, PD6
|
||||
|
||||
; sbrs ONE_WIRE_FLAGS, OWPRF
|
||||
; cbi PORTD, PD6
|
||||
|
||||
sbi PORTD, PD6
|
||||
|
||||
sbrs ONE_WIRE_FLAGS, OWPRF
|
||||
rcall DEBOUNCE_SW
|
||||
|
||||
cbi PORTD, PD6
|
||||
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
; rcall DELAY
|
||||
rcall DEBOUNCE_SW
|
||||
|
||||
rjmp LOOP
|
||||
|
||||
@ -282,7 +314,9 @@ _1_WIRE_DETECT_PRESENCE:
|
||||
; предделитель 64
|
||||
outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
|
||||
|
||||
S1: _1_wire_pull ; Шаг 2. притягиваем шину
|
||||
_1_wire_pull ; Шаг 2. притягиваем шину
|
||||
|
||||
S1:
|
||||
in r16, TIFR
|
||||
sbrs r16, OCF1A ; Шаг 3. ждем минимум 480мкс
|
||||
rjmp S1
|
||||
@ -319,23 +353,58 @@ _1_WIRE_CHECK_PRESENCE:
|
||||
sbr ONE_WIRE_FLAGS, (1<<OWPRF)
|
||||
ret
|
||||
|
||||
_1_WIRE_SEND_BIT:
|
||||
cli
|
||||
_1_WIRE_SEND_BYTE:
|
||||
push r17
|
||||
ldi r17, DS18B20_CMD_READROM
|
||||
ldi r16, 8
|
||||
_s_l:
|
||||
; rol r16
|
||||
; brcc
|
||||
pop r17
|
||||
ret
|
||||
|
||||
.DEF TRANSMIT_BIT = r9
|
||||
_1_WIRE_SEND_BIT:
|
||||
push r16
|
||||
cli
|
||||
sbr ONE_WIRE_FLAGS, (1<<OWSB)
|
||||
outi r16, TCNT1L, 0
|
||||
outi r16, OCR1AL, 1 ; 8 мкс
|
||||
outi r16, OCR1BL, 9 ; 64 мкс
|
||||
|
||||
_1_wire_pull
|
||||
SB_1:
|
||||
in r16, TIFR
|
||||
sbrs r16, OCF1A
|
||||
rjmp SB_1
|
||||
sbrc TRANSMIT_BIT, 0
|
||||
_1_wire_release
|
||||
SB_2:
|
||||
in r16, TIFR
|
||||
sbrs r16, OCF1B
|
||||
rjmp SB_2
|
||||
|
||||
clr r16
|
||||
out TCCR1B, r16
|
||||
cbr ONE_WIRE_FLAGS, (1<<OWSB)
|
||||
sei
|
||||
pop r16
|
||||
ret
|
||||
|
||||
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
|
||||
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
|
||||
; путем деления этого числа несколько раз
|
||||
DISPLAY_UPD_DIGITS:
|
||||
cli
|
||||
push r21
|
||||
ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
|
||||
ldi r21, 4 ; (4 раза делим) т.к индикатор четырех разрядный
|
||||
|
||||
; инициализация указателя (за каждый проход цикла будет инкрементироваться)
|
||||
ldi XL, LOW(DIGITS)
|
||||
ldi XH, HIGH(DIGITS)
|
||||
|
||||
.equ dividend = SRAM_TEMP_1
|
||||
.equ divisor = 10
|
||||
.equ dividend = SRAM_TEMP_1 ; число которе будем делить
|
||||
.equ divisor = 10 ; на что делим
|
||||
|
||||
; загружаем число которое хотим поделить в адрес SRAM делимого
|
||||
sts dividend, DISP_NUM_L
|
||||
@ -351,7 +420,7 @@ DISPLAY_UPD_DIGITS:
|
||||
|
||||
rcall div16u ; делим
|
||||
|
||||
st X+, drem16uL ; сохраняем остаток в ячейку по указателю
|
||||
st X+, drem16uL ; сохраняем остаток в ячейку по указателю и увеличиваем его
|
||||
|
||||
; обновляем делимое
|
||||
sts dividend, dres16uL
|
||||
@ -360,6 +429,7 @@ DISPLAY_UPD_DIGITS:
|
||||
dec r21 ; декрементируем счетчик цикла
|
||||
brne DIV_LOOP ; делим еще раз если не 0
|
||||
pop r21
|
||||
sei
|
||||
ret
|
||||
|
||||
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
|
||||
@ -378,12 +448,30 @@ DISPLAY_DECODER:
|
||||
pop r16
|
||||
ret
|
||||
|
||||
DELAY_68us:
|
||||
ldi r16, 179 ; 1
|
||||
_d1_loop:
|
||||
dec r16 ; 1
|
||||
brne _d1_loop ; 2/1
|
||||
ret ; 4
|
||||
DEBOUNCE_SW:
|
||||
push r16
|
||||
push r17
|
||||
push r18
|
||||
|
||||
ldi r18, 5
|
||||
_loop_2:
|
||||
ldi r17, 255
|
||||
_loop_0:
|
||||
ldi r16, 255
|
||||
_dec_0:
|
||||
dec r16
|
||||
brne _dec_0
|
||||
_loop_1:
|
||||
dec r17
|
||||
brne _loop_0
|
||||
_loop_3:
|
||||
dec r18
|
||||
brne _loop_2
|
||||
|
||||
pop r18
|
||||
pop r17
|
||||
pop r16
|
||||
ret
|
||||
|
||||
DELAY:
|
||||
push r16
|
||||
|
||||
48
firmware.hex
48
firmware.hex
@ -3,31 +3,35 @@
|
||||
:020016003EC0EA
|
||||
:10001A0000C04F935F930F935FB7409167004530DD
|
||||
:10002A000CF403C0442740936700403041F493988E
|
||||
:10003A0094989598929A00916600AAD083D04130FC
|
||||
:10004A0041F4929894989598939A00916500A0D05B
|
||||
:10005A0079D0423041F4929893989598949A009165
|
||||
:10006A00640096D06FD0433041F492989398949854
|
||||
:10007A00959A009163008CD065D0439540936700B0
|
||||
:10003A0094989598929A00916600CED06AD04130F1
|
||||
:10004A0041F4929894989598939A00916500C4D037
|
||||
:10005A0060D0423041F4929893989598949A00917E
|
||||
:10006A006400BAD056D0433041F492989398949849
|
||||
:10007A00959A00916300B0D04CD0439540936700A5
|
||||
:10008A005FBF0F915F914F9118950F930FB7B29B76
|
||||
:10009A0005C0B39B05C0B49B05C005C0019603C04B
|
||||
:1000AA000A9601C0CF960FBF0F9118950FED0DBF9D
|
||||
:1000BA000EE701BB01EC07BB0CE108BB00E20BBF7A
|
||||
:1000CA000CE100BD02E000BF05E003BF09E106BF85
|
||||
:1000DA0001E009BF11241092670080E090E003E874
|
||||
:1000EA000CBD00E00DBD01EC0ABD00E00BBD03E054
|
||||
:1000FA000EBDB99A08B706FFFDCF30D0789430D03C
|
||||
:10010A00969A55D054D053D052D051D050D09698B8
|
||||
:10011A004ED04DD04CD04BD04AD049D0F0CFEE245F
|
||||
:10012A00FF1841E1001F111F4A9509F40895EE1CBA
|
||||
:10013A00FF1CE21AF30A20F4E20EF31E8894F2CFAF
|
||||
:10014A000894F0CF0F930FB800E40EB90BE10DB984
|
||||
:10015A00769BFDCFC09AC0980F910895B9980895DB
|
||||
:10016A005F9354E0A3E6B0E080936100909362004D
|
||||
:10017A0000916100109162002AE030E0D0DFED9238
|
||||
:10018A0000936100109362005A9591F75F91089568
|
||||
:10019A000F931F93E4EDF1E01127E00FF11F049094
|
||||
:1001AA001F910F91089503EB0A95F1F708950F93A4
|
||||
:1001BA001F930FEF1FEF1A95000000000000D9F7F8
|
||||
:1001CA000A95C1F71F910F910895C0F9A4B09992A9
|
||||
:0601DA0082F880909C00F9
|
||||
:1000DA0001E009BF11241092670080E090E0789453
|
||||
:1000EA0063D070FD969A70FF9698FACFEE24FF18A7
|
||||
:1000FA0041E1001F111F4A9509F40895EE1CFF1CE7
|
||||
:10010A00E21AF30A20F4E20EF31E8894F2CF08945E
|
||||
:10011A00F0CF0F930FB800E40EB90BE10DB9769B3F
|
||||
:10012A00FDCFC09AC0980F910895F89400E00CBDD5
|
||||
:10013A000CE30ABD05E408BD03E00EBDB99A08B791
|
||||
:10014A0006FFFDCFB99808B705FFFDCF0DD000E037
|
||||
:10015A000CBD04E30ABD08B706FFFDCF00270EBD9C
|
||||
:10016A000FEF08BF78940895B19B716008951F93AB
|
||||
:10017A0013E308E01F9108950F93F894726000E06A
|
||||
:10018A000CBD01E00ABD09E008BDB99A08B706FF2F
|
||||
:10019A00FDCF90FCB99808B705FFFDCF00270EBD2B
|
||||
:1001AA007D7F78940F9108955F9354E0A3E6B0E0C1
|
||||
:1001BA008093610090936200009161001091620047
|
||||
:1001CA002AE030E093DFED92009361001093620021
|
||||
:1001DA005A9591F75F9108950F931F93ECE1F2E01E
|
||||
:1001EA001127E00FF11F04901F910F91089503EB5F
|
||||
:1001FA000A95F1F708950F931F930FEF1FEF1A95C2
|
||||
:10020A00000000000000D9F70A95C1F71F910F916D
|
||||
:0E021A000895C0F9A4B0999282F880909C00DB
|
||||
:00000001FF
|
||||
|
||||
1012
firmware.lst
1012
firmware.lst
File diff suppressed because it is too large
Load Diff
@ -1,12 +1,12 @@
|
||||
/avr_sim_project_file
|
||||
/home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/firmware.asm
|
||||
mainasm=firmware.asm
|
||||
file=firmware.lst,265,35,266
|
||||
file=firmware.lst,345,35,266
|
||||
file=firmware.asm,1,1,1
|
||||
file=div16u.asm,1,1,1
|
||||
file=usi.asm,1,1,1
|
||||
clock=8000000
|
||||
device-type=ATtiny2313A
|
||||
device-package=20-pin-PDIP_SOIC
|
||||
windows=acePSTwz
|
||||
windows=acepSTwz
|
||||
alert1=0,0,-1,-1,,0,0
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user