This commit is contained in:
Sergey Yarkov 2023-06-15 23:41:16 +03:00
parent a74e7008ff
commit 4f3f21246e
No known key found for this signature in database
GPG Key ID: E91CE1FABC619B6F
7 changed files with 1092 additions and 771 deletions

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"cmake.configureOnOpen": false
}

View File

@ -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

View File

@ -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
@ -890,63 +894,90 @@ firmware.asm(271): Including file 'usi.asm'
; **** ОБРАБОТКА КНОПОК ******************************************
PCINT0_vect:
00004a 930f push r16
00004b b70f in r16, SREG
00004a 930f push r16
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

View File

@ -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
@ -174,31 +178,58 @@ reti
; **** ОБРАБОТКА КНОПОК ******************************************
PCINT0_vect:
push r16
in r16, SREG
push r16
push r17
push r18
push r19
sbis PINB, SW_PLUS_PIN
rjmp _sw_plus
in r16, SREG
sbis PINB, SW_MINUS_PIN
rjmp _sw_minus
in r17, SW_PIN
lds r18, PC_HISTORY
sbis PINB, SW_SET_PIN
rjmp _sw_set
eor r17, r18
in r19, SW_PIN
sts PC_HISTORY, r19
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_PLUS_CHECK:
sbrs r17, SW_PLUS_PIN
rjmp _SW_EXIT
rjmp _SW_PLUS_HANDLER
out SREG, r16
pop r16
_SW_PLUS_HANDLER:
; rcall DEBOUNCE_SW
sbis SW_PIN, SW_PLUS_PIN
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:
out SREG, r16
pop r19
pop r18
pop r17
pop r16
reti
; **** СТАРТ ПРОГРАММЫ *******************************************
@ -230,10 +261,10 @@ MCU_INIT:
; outi r16, UCSRC, (1<<UCSZ1) | (1<<UCSZ0) ; Асинхронный режим, 8 бит фрейм, 1 стоповый бит
clr r1
sts CURRENT_DIGIT, r1
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
sbi PORTD, PD6
; sbrc ONE_WIRE_FLAGS, OWPRF
; sbi PORTD, PD6
sbrs ONE_WIRE_FLAGS, OWPRF
cbi PORTD, PD6
; sbrs ONE_WIRE_FLAGS, OWPRF
; cbi PORTD, PD6
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
sbi PORTD, PD6
rcall DEBOUNCE_SW
cbi PORTD, PD6
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

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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