presence step 1wire

This commit is contained in:
Sergey Yarkov 2023-04-29 03:34:49 +03:00
parent dd4fc0d12c
commit 9df148d8d0
No known key found for this signature in database
GPG Key ID: E91CE1FABC619B6F
7 changed files with 1008 additions and 667 deletions

View File

@ -1,27 +1,33 @@
:020000020000FC :020000020000FC
:0200000049C0F5 :020000005AC0E4
:020016003CC0EC :020016003EC0EA
:10001A0000C04F935F935FB74091670045300CF47F :10001A0000C04F935F930F935FB7409167004530DD
:10002A0003C0442740936700403041F49398949862 :10002A000CF403C0442740936700403041F493988E
:10003A009598929A009166007ED05DD0413041F445 :10003A0094989598929A00916600AAD06BD0413014
:10004A00929894989598939A0091650074D053D099 :10004A0041F4929894989598939A00916500A0D05B
:10005A00423041F4929893989598949A009164004A :10005A0061D0423041F4929893989598949A00917D
:10006A006AD049D0433041F4929893989498959ADB :10006A00640096D057D0433041F49298939894986C
:10007A000091630060D03FD04395409367005FBF13 :10007A00959A009163008CD04DD0439540936700C8
:10008A005F914F911895019618950FED0DBF0CE7EA :10008A005FBF0F915F914F9118950F930FB7B29B76
:10009A0001BB01EC07BB0CE108BB00E20BBF0CE1A2 :10009A0005C0B39B05C0B49B05C005C0019603C04B
:1000AA0000BD02E000BF05E003BF09E106BF01E0B1 :1000AA000A9601C0CF960FBF0F9118950FED0DBF9D
:1000BA0009BF11241092670080E090E0789425D05F :1000BA000EE701BB01EC07BB0CE108BB00E20BBF7A
:1000CA004FD040D03FD03ED03DD03CD03BD0F7CFF0 :1000CA000CE100BD02E000BF05E003BF09E106BF85
:1000DA00EE24FF1841E1001F111F4A9509F4089503 :1000DA0001E009BF11241092670080E090E026D069
:1000EA00EE1CFF1CE21AF30A20F4E20EF31E8894B7 :1000EA0078943ED070FD969A70FF9698FACFEE24D7
:1000FA00F2CF0894F0CF0FB800E40EB90BE10DB9B6 :1000FA00FF1841E1001F111F4A9509F40895EE1CEB
:10010A00769BFDCFC09AC098089554E0A3E6B0E06C :10010A00FF1CE21AF30A20F4E20EF31E8894F2CFDF
:10011A0080936100909362000091610010916200E7 :10011A000894F0CF0F930FB800E40EB90BE10DB9B4
:10012A002AE030E0D5DFED9200936100109362007F :10012A00769BFDCFC09AC0980F91089503E80CBD45
:10013A005A9591F70895ECE7F1E01127E00FF11FC6 :10013A0001EC0ABD09EC08BD03E00EBDB99A08B787
:10014A00049008950F931F930FEF1FEF1A95000065 :10014A0006FFFCCFB99808B705FFFDCF03D00027FB
:10015A0000000000D9F70A95C1F71F910F91089581 :10015A000EBD0895B19B02C07E7F01C071600895F3
:10016A000F931F9300E412B3102712BB1F910F9134 :10016A005F9354E0A3E6B0E080936100909362004D
:0E017A000895C0F9A4B0999282F880909C007C :10017A0000916100109162002AE030E0B8DFED9250
:10018A0000936100109362005A9591F75F91089568
:10019A000F931F93E4EDF1E01127E00FF11F049094
:1001AA001F910F91089503EB0A95F1F708950F93A4
:1001BA001F930FEF1FEF1A95000000000000D9F7F8
:1001CA000A95C1F71F910F910895C0F9A4B09992A9
:0601DA0082F880909C00F9
:00000001FF :00000001FF

View File

@ -1,20 +1,20 @@
AVRASM ver. 2.2.7 firmware.asm Mon Apr 24 00:59:18 2023 AVRASM ver. 2.2.7 firmware.asm Sat Apr 29 03:25:47 2023
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
firmware.asm(191): Including file 'div16u.asm' firmware.asm(257): Including file 'div16u.asm'
div16u.asm(22): warning: Register r16 already defined by the .DEF directive div16u.asm(22): warning: Register r16 already defined by the .DEF directive
firmware.asm(191): 'div16u.asm' included form here firmware.asm(257): 'div16u.asm' included form here
div16u.asm(23): warning: Register r17 already defined by the .DEF directive div16u.asm(23): warning: Register r17 already defined by the .DEF directive
firmware.asm(191): 'div16u.asm' included form here firmware.asm(257): 'div16u.asm' included form here
div16u.asm(24): warning: Register r16 already defined by the .DEF directive div16u.asm(24): warning: Register r16 already defined by the .DEF directive
firmware.asm(191): 'div16u.asm' included form here firmware.asm(257): 'div16u.asm' included form here
div16u.asm(25): warning: Register r17 already defined by the .DEF directive div16u.asm(25): warning: Register r17 already defined by the .DEF directive
firmware.asm(191): 'div16u.asm' included form here firmware.asm(257): 'div16u.asm' included form here
firmware.asm(192): Including file 'usi.asm' firmware.asm(258): Including file 'usi.asm'
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
firmware.asm(191): Including file 'div16u.asm' firmware.asm(257): Including file 'div16u.asm'
firmware.asm(192): Including file 'usi.asm' firmware.asm(258): Including file 'usi.asm'
; Project name: thermostat ; Project name: thermostat
@ -732,6 +732,7 @@ firmware.asm(192): Including file 'usi.asm'
.DEF TEMP_REG_A = r16 .DEF TEMP_REG_A = r16
.DEF TEMP_REG_B = r17 .DEF TEMP_REG_B = r17
.DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса
.DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе .DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе
.DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе .DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе
@ -742,13 +743,18 @@ firmware.asm(192): Including file 'usi.asm'
.EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано
.EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire
.EQU ONE_WIRE_DDR = DDRB
.EQU ONE_WIRE_PIN = PINB
.EQU OWPRF = 0 ; 1-Wire Флаг присутствия
.EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
.EQU USI_DO_PIN = PB6 ; DS на 74HC595 .EQU USI_DO_PIN = PB6 ; DS на 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
.EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус" .EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус"
.EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс" .EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс"
.EQU SW_SET_PIN = PB4 ; Кнопка "Установить" .EQU SW_SET_PIN = PB4 ; Кнопка "Установить"
.EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами
.EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM
@ -765,6 +771,14 @@ firmware.asm(192): Including file 'usi.asm'
ldi DISP_NUM_H, HIGH(@0) ldi DISP_NUM_H, HIGH(@0)
.ENDMACRO .ENDMACRO
.MACRO _1_wire_pull
sbi ONE_WIRE_DDR, ONE_WIRE_LINE
.ENDMACRO
.MACRO _1_wire_release
cbi ONE_WIRE_DDR, ONE_WIRE_LINE
.ENDMACRO
; **** СЕГМЕНТ ДАННЫХ ******************************************** ; **** СЕГМЕНТ ДАННЫХ ********************************************
.DSEG .DSEG
.ORG SRAM_START .ORG SRAM_START
@ -778,10 +792,10 @@ firmware.asm(192): Including file 'usi.asm'
.CSEG .CSEG
.ORG 0x00 .ORG 0x00
000000 c049 rjmp RESET_vect 000000 c05a rjmp RESET_vect
.ORG 0x000B .ORG 0x000B
00000b c03c rjmp PCINT0_vect 00000b c03e rjmp PCINT0_vect
.ORG 0x000D .ORG 0x000D
00000d c000 rjmp TIMER0_COMPA_vect 00000d c000 rjmp TIMER0_COMPA_vect
@ -791,127 +805,179 @@ firmware.asm(192): Including file 'usi.asm'
TIMER0_COMPA_vect: TIMER0_COMPA_vect:
00000e 934f push r20 00000e 934f push r20
00000f 935f push r21 00000f 935f push r21
000010 b75f in r21, SREG 000010 930f push r16
000011 9140 0067 lds r20, CURRENT_DIGIT 000011 b75f in r21, SREG
000013 3045 cpi r20, 5
000014 f40c brge reset_digit_idx 000012 9140 0067 lds r20, CURRENT_DIGIT
000015 c003 rjmp _indicate_1 000014 3045 cpi r20, 5
000015 f40c brge reset_digit_idx
000016 c003 rjmp _indicate_1
reset_digit_idx: reset_digit_idx:
000016 2744 clr r20 000017 2744 clr r20
000017 9340 0067 sts CURRENT_DIGIT, r20 000018 9340 0067 sts CURRENT_DIGIT, r20
_indicate_1: _indicate_1:
000019 3040 cpi r20, 0 00001a 3040 cpi r20, 0
00001a f441 brne _indicate_2 00001b f441 brne _indicate_2
00001b 9893 cbi PORTD, DIGIT_2_PIN 00001c 9893 cbi PORTD, DIGIT_2_PIN
00001c 9894 cbi PORTD, DIGIT_3_PIN 00001d 9894 cbi PORTD, DIGIT_3_PIN
00001d 9895 cbi PORTD, DIGIT_4_PIN 00001e 9895 cbi PORTD, DIGIT_4_PIN
00001e 9a92 sbi PORTD, DIGIT_1_PIN 00001f 9a92 sbi PORTD, DIGIT_1_PIN
00001f 9100 0066 lds TEMP_REG_A, DIGITS+3 000020 9100 0066 lds TEMP_REG_A, DIGITS+3
000021 d07e rcall DISPLAY_DECODER 000022 d0aa rcall DISPLAY_DECODER
000022 d05d rcall USI_TRANSMIT 000023 d06b rcall USI_TRANSMIT
_indicate_2: _indicate_2:
000023 3041 cpi r20, 1 000024 3041 cpi r20, 1
000024 f441 brne _indicate_3 000025 f441 brne _indicate_3
000025 9892 cbi PORTD, DIGIT_1_PIN 000026 9892 cbi PORTD, DIGIT_1_PIN
000026 9894 cbi PORTD, DIGIT_3_PIN 000027 9894 cbi PORTD, DIGIT_3_PIN
000027 9895 cbi PORTD, DIGIT_4_PIN 000028 9895 cbi PORTD, DIGIT_4_PIN
000028 9a93 sbi PORTD, DIGIT_2_PIN 000029 9a93 sbi PORTD, DIGIT_2_PIN
000029 9100 0065 lds TEMP_REG_A, DIGITS+2 00002a 9100 0065 lds TEMP_REG_A, DIGITS+2
00002b d074 rcall DISPLAY_DECODER 00002c d0a0 rcall DISPLAY_DECODER
00002c d053 rcall USI_TRANSMIT 00002d d061 rcall USI_TRANSMIT
_indicate_3: _indicate_3:
00002d 3042 cpi r20, 2 00002e 3042 cpi r20, 2
00002e f441 brne _indicate_4 00002f f441 brne _indicate_4
00002f 9892 cbi PORTD, DIGIT_1_PIN 000030 9892 cbi PORTD, DIGIT_1_PIN
000030 9893 cbi PORTD, DIGIT_2_PIN 000031 9893 cbi PORTD, DIGIT_2_PIN
000031 9895 cbi PORTD, DIGIT_4_PIN 000032 9895 cbi PORTD, DIGIT_4_PIN
000032 9a94 sbi PORTD, DIGIT_3_PIN 000033 9a94 sbi PORTD, DIGIT_3_PIN
000033 9100 0064 lds TEMP_REG_A, DIGITS+1 000034 9100 0064 lds TEMP_REG_A, DIGITS+1
000035 d06a rcall DISPLAY_DECODER 000036 d096 rcall DISPLAY_DECODER
000036 d049 rcall USI_TRANSMIT 000037 d057 rcall USI_TRANSMIT
_indicate_4: _indicate_4:
000037 3043 cpi r20, 3 000038 3043 cpi r20, 3
000038 f441 brne _indicate_exit 000039 f441 brne _indicate_exit
000039 9892 cbi PORTD, DIGIT_1_PIN 00003a 9892 cbi PORTD, DIGIT_1_PIN
00003a 9893 cbi PORTD, DIGIT_2_PIN 00003b 9893 cbi PORTD, DIGIT_2_PIN
00003b 9894 cbi PORTD, DIGIT_3_PIN 00003c 9894 cbi PORTD, DIGIT_3_PIN
00003c 9a95 sbi PORTD, DIGIT_4_PIN 00003d 9a95 sbi PORTD, DIGIT_4_PIN
00003d 9100 0063 lds TEMP_REG_A, DIGITS 00003e 9100 0063 lds TEMP_REG_A, DIGITS
00003f d060 rcall DISPLAY_DECODER 000040 d08c rcall DISPLAY_DECODER
000040 d03f rcall USI_TRANSMIT 000041 d04d rcall USI_TRANSMIT
_indicate_exit: _indicate_exit:
000041 9543 inc r20 000042 9543 inc r20
000042 9340 0067 sts CURRENT_DIGIT, r20 000043 9340 0067 sts CURRENT_DIGIT, r20
000044 bf5f out SREG, r21 000045 bf5f out SREG, r21
000045 915f pop r21
000046 914f pop r20 000046 910f pop r16
000047 9518 reti 000047 915f pop r21
000048 914f pop r20
000049 9518 reti
; **** ОБРАБОТКА КНОПОК ****************************************** ; **** ОБРАБОТКА КНОПОК ******************************************
PCINT0_vect: PCINT0_vect:
000048 9601 adiw DISP_NUM_L, 1 00004a 930f push r16
000049 9518 reti 00004b b70f in r16, SREG
00004c 9bb2 sbis PINB, SW_PLUS_PIN
00004d c005 rjmp _sw_plus
00004e 9bb3 sbis PINB, SW_MINUS_PIN
00004f c005 rjmp _sw_minus
000050 9bb4 sbis PINB, SW_SET_PIN
000051 c005 rjmp _sw_set
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:
000058 bf0f out SREG, r16
000059 910f pop r16
00005a 9518 reti
; **** СТАРТ ПРОГРАММЫ ******************************************* ; **** СТАРТ ПРОГРАММЫ *******************************************
RESET_vect: RESET_vect:
00004a ed0f ldi TEMP_REG_A, LOW(RAMEND) 00005b ed0f ldi TEMP_REG_A, LOW(RAMEND)
00004b bf0d out SPL, TEMP_REG_A 00005c bf0d out SPL, TEMP_REG_A
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
MCU_INIT: MCU_INIT:
; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
00004c e70c 00005d e70e
00004d bb01 outi r16, DDRD, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) 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)
00004e ec01 00005f ec01
00004f 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) 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)
000050 e10c 000061 e10c
000051 bb08 outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN) 000062 bb08 outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
; **** ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ ******************************** ; **** ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ ********************************
000052 e200 000063 e200
000053 bf0b outi r16, GIMSK, (1<<PCIE0) 000064 bf0b outi r16, GIMSK, (1<<PCIE0)
000054 e10c 000065 e10c
000055 bd00 outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие 000066 bd00 outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ ********************************** ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 0 **********************************
000056 e002 000067 e002
000057 bf00 outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A 000068 bf00 outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
000058 e005 000069 e005
000059 bf03 outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель 00006a bf03 outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
00005a e109 00006b e109
00005b bf06 outi r16, OCR0A, 25 ; число для сравнения. (60Hz) 00006c bf06 outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
00005c e001 00006d e001
00005d bf09 outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению 00006e bf09 outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
00005e 2411 clr r1 ; **** ИНИЦИАЛИЗАЦИЯ USART *************************************
00005f 9210 0067 sts CURRENT_DIGIT, r1 ; outi r16, UBRRL, LOW(3) ; 9600 БОД
; outi r16, UBRRH, HIGH(3) ; 9600 БОД
; outi r16, UCSRB, (1<<RXEN) | (1<<TXEN) ; Включение приема и передачии
; outi r16, UCSRC, (1<<UCSZ1) | (1<<UCSZ0) ; Асинхронный режим, 8 бит фрейм, 1 стоповый бит
000061 e080 00006f 2411 clr r1
000062 e090 display_load 0 ; загружаем число, которое нужно показать на индикатор 000070 9210 0067 sts CURRENT_DIGIT, r1
000063 9478 sei
000072 e080
000073 e090 display_load 0 ; загружаем число, которое нужно показать на индикатор
000074 d026 rcall ONE_WIRE_RESET ; проверяем наличие датчика на шине путем выполнения процедуры сброса
000075 9478 sei
; **** ГЛАВНЫЙ ЦИКЛ ********************************************** ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
LOOP: LOOP:
000064 d025 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM 000076 d03e rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
000065 d04f rcall TOGGLE_POWER_LED
000066 d040 rcall DELAY
000067 d03f rcall DELAY
000068 d03e rcall DELAY
000069 d03d rcall DELAY
00006a d03c rcall DELAY
00006b d03b rcall DELAY
00006c cff7 rjmp LOOP ; usart_t:
; sbis UCSRA, UDRE
; rjmp usart_t
; ldi r16, 'B'
; out UDR, r16
; usart_r:
; sbis UCSRA, RXC
; rjmp usart_r
; in DISP_NUM_L, UDR
000077 fd70 sbrc ONE_WIRE_FLAGS, OWPRF
000078 9a96 sbi PORTD, PD6
000079 ff70 sbrs ONE_WIRE_FLAGS, OWPRF
00007a 9896 cbi PORTD, PD6
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
00007b cffa rjmp LOOP
; **** ПОДПРОГРАММЫ ********************************************** ; **** ПОДПРОГРАММЫ **********************************************
.INCLUDE "div16u.asm" .INCLUDE "div16u.asm"
@ -947,35 +1013,36 @@ firmware.asm(192): Including file 'usi.asm'
;***** Code ;***** Code
div16u: div16u:
00006d 24ee clr drem16uL ; clear remainder Low byte 00007c 24ee clr drem16uL ; clear remainder Low byte
00006e 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry 00007d 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
00006f e141 ldi dcnt16u,17 ; init loop counter 00007e e141 ldi dcnt16u,17 ; init loop counter
d16u_1: d16u_1:
000070 1f00 rol dd16uL ; shift left dividend 00007f 1f00 rol dd16uL ; shift left dividend
000071 1f11 rol dd16uH 000080 1f11 rol dd16uH
000072 954a dec dcnt16u ; decrement counter 000081 954a dec dcnt16u ; decrement counter
000073 f409 brne d16u_2 ; if done 000082 f409 brne d16u_2 ; if done
000074 9508 ret ; return 000083 9508 ret ; return
d16u_2: d16u_2:
000075 1cee rol drem16uL ; shift dividend into remainder 000084 1cee rol drem16uL ; shift dividend into remainder
000076 1cff rol drem16uH 000085 1cff rol drem16uH
000077 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor 000086 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
000078 0af3 sbc drem16uH,dv16uH 000087 0af3 sbc drem16uH,dv16uH
000079 f420 brcc d16u_3 ; if result negative 000088 f420 brcc d16u_3 ; if result negative
00007a 0ee2 add drem16uL,dv16uL ; restore remainder 000089 0ee2 add drem16uL,dv16uL ; restore remainder
00007b 1ef3 adc drem16uH,dv16uH 00008a 1ef3 adc drem16uH,dv16uH
00007c 9488 clc ; clear carry to be shifted into result 00008b 9488 clc ; clear carry to be shifted into result
00007d cff2 rjmp d16u_1 ; else 00008c cff2 rjmp d16u_1 ; else
d16u_3: d16u_3:
00007e 9408 sec ; set carry to be shifted into result 00008d 9408 sec ; set carry to be shifted into result
.INCLUDE "usi.asm" .INCLUDE "usi.asm"
00007f cff0 00008e cff0
USI_TRANSMIT: USI_TRANSMIT:
000080 b80f out USIDR, r0 ; Move byte from temp register to USI Data Register 00008f 930f push r16
000090 b80f out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
000081 e400 ldi TEMP_REG_A, (1<<USIOIF) 000091 e400 ldi TEMP_REG_A, (1<<USIOIF)
000082 b90e out USISR, TEMP_REG_A 000092 b90e out USISR, TEMP_REG_A
; Load settings of USI into temp register ; Load settings of USI into temp register
; This will setup USI to Three-wire mode, Software clock strobe (USITC) ; This will setup USI to Three-wire mode, Software clock strobe (USITC)
@ -985,120 +1052,153 @@ firmware.asm(192): Including file 'usi.asm'
; USICS1 <--------------> USI Clock Source Select ; USICS1 <--------------> USI Clock Source Select
; USICLK <--------------> USI Clock Strobe ; USICLK <--------------> USI Clock Strobe
; USITC <--------------> USI Toggle Clock (Enable clock generation) ; USITC <--------------> USI Toggle Clock (Enable clock generation)
000083 e10b ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC) 000093 e10b ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
_USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0 _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
000084 b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register 000094 b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
000085 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop 000095 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
000086 cffd rjmp _USI_TRANSMIT_LOOP 000096 cffd rjmp _USI_TRANSMIT_LOOP
; Send pulse into LATCH pin. ; Send pulse into LATCH pin.
; This will copy byte from 74hc595 shift register into 74hc595 storage register ; This will copy byte from 74hc595 shift register into 74hc595 storage register
000087 9ac0 sbi PORTB, USI_LATCH_PIN 000097 9ac0 sbi PORTB, USI_LATCH_PIN
000088 98c0 cbi PORTB, USI_LATCH_PIN 000098 98c0 cbi PORTB, USI_LATCH_PIN
000089 9508 000099 910f pop r16
00009a 9508
; **** ПРОВЕРКА ДАТЧИКА НА ШИНЕ ***************************************************
ONE_WIRE_RESET:
; 62 тика
00009b e803
00009c bd0c outi r16, TCNT1L, 131
00009d ec01
00009e bd0a outi r16, OCR1AL, 193
00009f ec09
0000a0 bd08 outi r16, OCR1BL, 201
; запуск таймера в режиме Normal
0000a1 e003
0000a2 bd0e outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
0000a3 9ab9 s1: _1_wire_pull ; Шаг 1. притягиваем шину, ждем минимум 480мкс, отпускаем шину.
0000a4 b708 in r16, TIFR
0000a5 ff06 sbrs r16, OCF1A
0000a6 cffc rjmp s1
0000a7 98b9 _1_wire_release
0000a8 b708 s2: in r16, TIFR ; Шаг 2. Ждем где то 60-70мкс и проверяем есть ли устройство на шине, и если есть то устанавливаем флаг.
0000a9 ff05 sbrs r16, OCF1B
0000aa cffd rjmp s2
0000ab d003 rcall OCF1B_occured
0000ac 2700 s3: clr r16 ; Шаг 3. Останавливаем таймер.
0000ad bd0e out TCCR1B, r16
; s3: in r16, TIFR
; sbrs r16, TOV1
; rjmp s3
; rcall TOV1_occured
; ser r16
; out TIFR, r16
0000ae 9508 ret
OCF1B_occured:
0000af 9bb1 sbis ONE_WIRE_PIN, ONE_WIRE_LINE
0000b0 c002 rjmp _got_presence
_no_presence:
0000b1 7f7e cbr ONE_WIRE_FLAGS, (1<<OWPRF)
0000b2 c001 rjmp _ex
_got_presence:
0000b3 6071 sbr ONE_WIRE_FLAGS, (1<<OWPRF)
_ex:
0000b4 9508 ret
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
; путем деления этого числа несколько раз ; путем деления этого числа несколько раз
DISPLAY_UPD_DIGITS: DISPLAY_UPD_DIGITS:
00008a e054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный 0000b5 935f push r21
00008b e6a3 ldi XL, LOW(DIGITS) 0000b6 e054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
00008c e0b0 ldi XH, HIGH(DIGITS) 0000b7 e6a3 ldi XL, LOW(DIGITS)
0000b8 e0b0 ldi XH, HIGH(DIGITS)
.equ dividend = SRAM_TEMP_1 .equ dividend = SRAM_TEMP_1
.equ divisor = 10 .equ divisor = 10
; загружаем число которое хотим поделить в адрес SRAM делимого ; загружаем число которое хотим поделить в адрес SRAM делимого
00008d 9380 0061 sts dividend, DISP_NUM_L 0000b9 9380 0061 sts dividend, DISP_NUM_L
00008f 9390 0062 sts dividend+1, DISP_NUM_H 0000bb 9390 0062 sts dividend+1, DISP_NUM_H
; четыре раза производим деление для получения остатков ; четыре раза производим деление для получения остатков
DIV_LOOP: DIV_LOOP:
; заполняем нужные регистры ; заполняем нужные регистры
000091 9100 0061 lds dd16uL, dividend 0000bd 9100 0061 lds dd16uL, dividend
000093 9110 0062 lds dd16uH, dividend+1 0000bf 9110 0062 lds dd16uH, dividend+1
000095 e02a ldi dv16uL, LOW(divisor) 0000c1 e02a ldi dv16uL, LOW(divisor)
000096 e030 ldi dv16uH, HIGH(divisor) 0000c2 e030 ldi dv16uH, HIGH(divisor)
000097 dfd5 rcall div16u ; делим 0000c3 dfb8 rcall div16u ; делим
000098 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю 0000c4 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю
; обновляем делимое ; обновляем делимое
000099 9300 0061 sts dividend, dres16uL 0000c5 9300 0061 sts dividend, dres16uL
00009b 9310 0062 sts dividend+1, dres16uH 0000c7 9310 0062 sts dividend+1, dres16uH
00009d 955a dec r21 ; декрементируем счетчик цикла 0000c9 955a dec r21 ; декрементируем счетчик цикла
00009e f791 brne DIV_LOOP ; делим еще раз если не 0 0000ca f791 brne DIV_LOOP ; делим еще раз если не 0
00009f 9508 ret 0000cb 915f pop r21
0000cc 9508 ret
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
DISPLAY_DECODER: DISPLAY_DECODER:
0000a0 e7ec ldi ZL, LOW(2*DISPLAY_SYMBOLS) 0000cd 930f push r16
0000a1 e0f1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 0000ce 931f push r17
0000cf ede4 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
0000d0 e0f1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
0000a2 2711 clr TEMP_REG_B 0000d1 2711 clr TEMP_REG_B
0000a3 0fe0 add ZL, TEMP_REG_A 0000d2 0fe0 add ZL, TEMP_REG_A
0000a4 1ff1 adc ZH, TEMP_REG_B 0000d3 1ff1 adc ZH, TEMP_REG_B
0000a5 9004 lpm r0, Z 0000d4 9004 lpm r0, Z
0000a6 9508 ret 0000d5 911f pop r17
0000d6 910f pop r16
0000d7 9508 ret
DELAY_68us:
0000d8 eb03 ldi r16, 179 ; 1
_d1_loop:
0000d9 950a dec r16 ; 1
0000da f7f1 brne _d1_loop ; 2/1
0000db 9508 ret ; 4
DELAY: DELAY:
; cli 0000dc 930f push r16
; push r24 0000dd 931f push r17
; push r25
; .equ c1 = 50000 0000de ef0f ldi r16, 255
; ldi r24, LOW(c1)
; ldi r25, HIGH(c1)
; _d_loop:
; sbiw r24, 1
; brne _d_loop
; pop r25
; pop r24
; sei
0000a7 930f push r16
0000a8 931f push r17
0000a9 ef0f ldi r16, 255
_DELAY_1: _DELAY_1:
0000aa ef1f ldi r17, 255 0000df ef1f ldi r17, 255
_DELAY_2: _DELAY_2:
0000ab 951a dec r17 0000e0 951a dec r17
0000ac 0000 nop 0000e1 0000 nop
0000ad 0000 nop 0000e2 0000 nop
0000ae 0000 nop 0000e3 0000 nop
0000af f7d9 brne _DELAY_2 0000e4 f7d9 brne _DELAY_2
0000b0 950a dec r16 0000e5 950a dec r16
0000b1 f7c1 brne _DELAY_1 0000e6 f7c1 brne _DELAY_1
0000b2 911f pop r17 0000e7 911f pop r17
0000b3 910f pop r16 0000e8 910f pop r16
0000b4 9508 ret 0000e9 9508 ret
TOGGLE_POWER_LED:
0000b5 930f push r16
0000b6 931f push r17
0000b7 e400 ldi r16, (1<<LED_POWER_PIN)
0000b8 b312 in r17, PORTD
0000b9 2710 eor r17, r16
0000ba bb12 out PORTD, r17
0000bb 911f pop r17
0000bc 910f pop r16
0000bd 9508 ret
DISPLAY_SYMBOLS: DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA ; HGFEDCBA HGFEDCBA
0000be f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 0000ea f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
0000bf b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 0000eb b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
0000c0 9299 .DB 0b10011001, 0b10010010 ; 4, 5 0000ec 9299 .DB 0b10011001, 0b10010010 ; 4, 5
0000c1 f882 .DB 0b10000010, 0b11111000 ; 6, 7 0000ed f882 .DB 0b10000010, 0b11111000 ; 6, 7
0000c2 9080 .DB 0b10000000, 0b10010000 ; 8, 9 0000ee 9080 .DB 0b10000000, 0b10010000 ; 8, 9
firmware.asm(294): warning: .cseg .db misalignment - padding zero byte firmware.asm(388): warning: .cseg .db misalignment - padding zero byte
0000c3 009c .DB 0b10011100 ; ° 0000ef 009c .DB 0b10011100 ; °
; **** СЕГМЕНТ EEPROM ******************************************** ; **** СЕГМЕНТ EEPROM ********************************************
; .ESEG ; .ESEG
@ -1121,36 +1221,36 @@ counted separately from r26..r31 here.
"ATtiny2313A" register use summary: "ATtiny2313A" register use summary:
x : 1 y : 0 z : 1 r0 : 2 r1 : 2 r2 : 0 r3 : 0 r4 : 0 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 r5 : 0 r6 : 0 r7 : 0 r8 : 0 r9 : 0 r10: 0 r11: 0 r12: 0
r13: 0 r14: 5 r15: 5 r16: 40 r17: 14 r18: 3 r19: 3 r20: 14 r13: 0 r14: 5 r15: 5 r16: 62 r17: 11 r18: 3 r19: 3 r20: 14
r21: 6 r22: 0 r23: 0 r24: 3 r25: 2 r26: 1 r27: 1 r28: 0 r21: 8 r22: 0 r23: 4 r24: 5 r25: 2 r26: 1 r27: 1 r28: 0
r29: 0 r30: 2 r31: 2 r29: 0 r30: 2 r31: 2
Registers used: 18 out of 35 (51.4%) Registers used: 19 out of 35 (54.3%)
"ATtiny2313A" instruction use summary: "ATtiny2313A" instruction use summary:
.lds : 0 .sts : 0 adc : 2 add : 2 adiw : 1 and : 0 .lds : 0 .sts : 0 adc : 2 add : 2 adiw : 3 and : 0
andi : 0 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 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 brcc : 1 brcs : 0 break : 0 breq : 0 brge : 1 brhc : 0
brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0 brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 0
brne : 8 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 brne : 9 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
brvs : 0 bset : 0 bst : 0 cbi : 13 cbr : 0 clc : 1 brvs : 0 bset : 0 bst : 0 cbi : 15 cbr : 1 clc : 1
clh : 0 cli : 0 cln : 0 clr : 4 cls : 0 clt : 0 clh : 0 cli : 0 cln : 0 clr : 5 cls : 0 clt : 0
clv : 0 clz : 0 com : 0 cp : 0 cpc : 0 cpi : 5 clv : 0 clz : 0 com : 0 cp : 0 cpc : 0 cpi : 5
cpse : 0 dec : 4 eor : 1 icall : 0 ijmp : 0 in : 2 cpse : 0 dec : 5 eor : 0 icall : 0 ijmp : 0 in : 4
inc : 1 ld : 0 ldd : 0 ldi : 25 lds : 7 lpm : 2 inc : 1 ld : 0 ldd : 0 ldi : 29 lds : 7 lpm : 2
lsl : 0 lsr : 0 mov : 0 movw : 0 neg : 0 nop : 3 lsl : 0 lsr : 0 mov : 0 movw : 0 neg : 0 nop : 3
or : 0 ori : 0 out : 15 pop : 6 push : 6 rcall : 17 or : 0 ori : 0 out : 20 pop : 10 push : 10 rcall : 12
ret : 6 reti : 2 rjmp : 8 rol : 4 ror : 0 sbc : 1 ret : 8 reti : 2 rjmp : 18 rol : 4 ror : 0 sbc : 1
sbci : 0 sbi : 5 sbic : 0 sbis : 1 sbiw : 0 sbr : 0 sbci : 0 sbi : 7 sbic : 0 sbis : 5 sbiw : 0 sbr : 1
sbrc : 0 sbrs : 0 sec : 1 seh : 0 sei : 1 sen : 0 sbrc : 1 sbrs : 3 sec : 1 seh : 0 sei : 1 sen : 0
ser : 0 ses : 0 set : 0 sev : 0 sez : 0 sleep : 0 ser : 0 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 : 7 sub : 2 subi : 0
swap : 0 tst : 0 wdr : 0 swap : 0 tst : 0 wdr : 0
Instructions used: 34 out of 105 (32.4%) Instructions used: 37 out of 105 (35.2%)
"ATtiny2313A" memory use summary [bytes]: "ATtiny2313A" memory use summary [bytes]:
Segment Begin End Code Data Used Size Use% Segment Begin End Code Data Used Size Use%
--------------------------------------------------------------- ---------------------------------------------------------------
[.cseg] 0x000000 0x000188 358 12 370 2048 18.1% [.cseg] 0x000000 0x0001e0 446 12 458 2048 22.4%
[.dseg] 0x000060 0x000068 0 8 8 128 6.3% [.dseg] 0x000060 0x000068 0 8 8 128 6.3%
[.eseg] 0x000000 0x000000 0 0 0 128 0.0% [.eseg] 0x000000 0x000000 0 0 0 128 0.0%

View File

@ -16,6 +16,7 @@
.DEF TEMP_REG_A = r16 .DEF TEMP_REG_A = r16
.DEF TEMP_REG_B = r17 .DEF TEMP_REG_B = r17
.DEF ONE_WIRE_FLAGS = r23 ; Флаги состояния для 1-Wire интерфейса
.DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе .DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе
.DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе .DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе
@ -26,6 +27,11 @@
.EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано
.EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire
.EQU ONE_WIRE_DDR = DDRB
.EQU ONE_WIRE_PIN = PINB
.EQU OWPRF = 0 ; 1-Wire Флаг присутствия
.EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
.EQU USI_DO_PIN = PB6 ; DS на 74HC595 .EQU USI_DO_PIN = PB6 ; DS на 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
@ -49,6 +55,14 @@
ldi DISP_NUM_H, HIGH(@0) ldi DISP_NUM_H, HIGH(@0)
.ENDMACRO .ENDMACRO
.MACRO _1_wire_pull
sbi ONE_WIRE_DDR, ONE_WIRE_LINE
.ENDMACRO
.MACRO _1_wire_release
cbi ONE_WIRE_DDR, ONE_WIRE_LINE
.ENDMACRO
; **** СЕГМЕНТ ДАННЫХ ******************************************** ; **** СЕГМЕНТ ДАННЫХ ********************************************
.DSEG .DSEG
.ORG SRAM_START .ORG SRAM_START
@ -75,7 +89,9 @@ CURRENT_DIGIT: .BYTE 1 ; Номер разряда инди
TIMER0_COMPA_vect: TIMER0_COMPA_vect:
push r20 push r20
push r21 push r21
push r16
in r21, SREG in r21, SREG
lds r20, CURRENT_DIGIT lds r20, CURRENT_DIGIT
cpi r20, 5 cpi r20, 5
brge reset_digit_idx brge reset_digit_idx
@ -137,13 +153,39 @@ TIMER0_COMPA_vect:
inc r20 inc r20
sts CURRENT_DIGIT, r20 sts CURRENT_DIGIT, r20
out SREG, r21 out SREG, r21
pop r16
pop r21 pop r21
pop r20 pop r20
reti reti
; **** ОБРАБОТКА КНОПОК ****************************************** ; **** ОБРАБОТКА КНОПОК ******************************************
PCINT0_vect: PCINT0_vect:
adiw DISP_NUM_L, 1 push r16
in r16, SREG
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:
out SREG, r16
pop r16
reti reti
; **** СТАРТ ПРОГРАММЫ ******************************************* ; **** СТАРТ ПРОГРАММЫ *******************************************
@ -154,7 +196,7 @@ RESET_vect:
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
MCU_INIT: MCU_INIT:
; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ ************************************* ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
outi r16, DDRD, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) 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)
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) 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)
outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN) outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
@ -162,28 +204,52 @@ MCU_INIT:
outi r16, GIMSK, (1<<PCIE0) outi r16, GIMSK, (1<<PCIE0)
outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ ********************************** ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 0 **********************************
outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
outi r16, OCR0A, 25 ; число для сравнения. (60Hz) outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
; **** ИНИЦИАЛИЗАЦИЯ USART *************************************
; outi r16, UBRRL, LOW(3) ; 9600 БОД
; outi r16, UBRRH, HIGH(3) ; 9600 БОД
; outi r16, UCSRB, (1<<RXEN) | (1<<TXEN) ; Включение приема и передачии
; outi r16, UCSRC, (1<<UCSZ1) | (1<<UCSZ0) ; Асинхронный режим, 8 бит фрейм, 1 стоповый бит
clr r1 clr r1
sts CURRENT_DIGIT, r1 sts CURRENT_DIGIT, r1
display_load 0 ; загружаем число, которое нужно показать на индикатор display_load 0 ; загружаем число, которое нужно показать на индикатор
rcall ONE_WIRE_RESET ; проверяем наличие датчика на шине путем выполнения процедуры сброса
sei sei
; **** ГЛАВНЫЙ ЦИКЛ ********************************************** ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
LOOP: LOOP:
rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
rcall TOGGLE_POWER_LED
rcall DELAY ; usart_t:
rcall DELAY ; sbis UCSRA, UDRE
rcall DELAY ; rjmp usart_t
rcall DELAY ; ldi r16, 'B'
rcall DELAY ; out UDR, r16
rcall DELAY
; usart_r:
; sbis UCSRA, RXC
; rjmp usart_r
; in DISP_NUM_L, UDR
sbrc ONE_WIRE_FLAGS, OWPRF
sbi PORTD, PD6
sbrs ONE_WIRE_FLAGS, OWPRF
cbi PORTD, PD6
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
rjmp LOOP rjmp LOOP
@ -191,10 +257,51 @@ LOOP:
.INCLUDE "div16u.asm" .INCLUDE "div16u.asm"
.INCLUDE "usi.asm" .INCLUDE "usi.asm"
; **** ПРОВЕРКА ДАТЧИКА НА ШИНЕ ***************************************************
ONE_WIRE_RESET:
; 62 тика
outi r16, TCNT1L, 131
outi r16, OCR1AL, 193
outi r16, OCR1BL, 201
; запуск таймера в режиме Normal
outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
s1: _1_wire_pull ; Шаг 1. притягиваем шину, ждем минимум 480мкс, отпускаем шину.
in r16, TIFR
sbrs r16, OCF1A
rjmp s1
_1_wire_release
s2: in r16, TIFR ; Шаг 2. Ждем где то 60-70мкс и проверяем есть ли устройство на шине, и если есть то устанавливаем флаг.
sbrs r16, OCF1B
rjmp s2
rcall OCF1B_occured
s3: clr r16 ; Шаг 3. Останавливаем таймер.
out TCCR1B, r16
; s3: in r16, TIFR
; sbrs r16, TOV1
; rjmp s3
; rcall TOV1_occured
; ser r16
; out TIFR, r16
ret
OCF1B_occured:
sbis ONE_WIRE_PIN, ONE_WIRE_LINE
rjmp _got_presence
_no_presence:
cbr ONE_WIRE_FLAGS, (1<<OWPRF)
rjmp _ex
_got_presence:
sbr ONE_WIRE_FLAGS, (1<<OWPRF)
_ex:
ret
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
; путем деления этого числа несколько раз ; путем деления этого числа несколько раз
DISPLAY_UPD_DIGITS: DISPLAY_UPD_DIGITS:
push r21
ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
ldi XL, LOW(DIGITS) ldi XL, LOW(DIGITS)
ldi XH, HIGH(DIGITS) ldi XH, HIGH(DIGITS)
@ -224,10 +331,13 @@ DISPLAY_UPD_DIGITS:
dec r21 ; декрементируем счетчик цикла dec r21 ; декрементируем счетчик цикла
brne DIV_LOOP ; делим еще раз если не 0 brne DIV_LOOP ; делим еще раз если не 0
pop r21
ret ret
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
DISPLAY_DECODER: DISPLAY_DECODER:
push r16
push r17
ldi ZL, LOW(2*DISPLAY_SYMBOLS) ldi ZL, LOW(2*DISPLAY_SYMBOLS)
ldi ZH, HIGH(2*DISPLAY_SYMBOLS) ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
@ -236,26 +346,21 @@ DISPLAY_DECODER:
adc ZH, TEMP_REG_B adc ZH, TEMP_REG_B
lpm r0, Z lpm r0, Z
pop r17
pop r16
ret ret
DELAY_68us:
ldi r16, 179 ; 1
_d1_loop:
dec r16 ; 1
brne _d1_loop ; 2/1
ret ; 4
DELAY: DELAY:
; cli
; push r24
; push r25
; .equ c1 = 50000
; ldi r24, LOW(c1)
; ldi r25, HIGH(c1)
; _d_loop:
; sbiw r24, 1
; brne _d_loop
; pop r25
; pop r24
; sei
push r16 push r16
push r17 push r17
ldi r16, 255 ldi r16, 255
_DELAY_1: _DELAY_1:
ldi r17, 255 ldi r17, 255
@ -273,17 +378,6 @@ DELAY:
pop r16 pop r16
ret ret
TOGGLE_POWER_LED:
push r16
push r17
ldi r16, (1<<LED_POWER_PIN)
in r17, PORTD
eor r17, r16
out PORTD, r17
pop r17
pop r16
ret
DISPLAY_SYMBOLS: DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA ; HGFEDCBA HGFEDCBA
.DB 0b11000000, 0b11111001 ; 0, 1 .DB 0b11000000, 0b11111001 ; 0, 1

View File

@ -1,25 +1,33 @@
:020000020000FC :020000020000FC
:0200000043C0FB :020000005AC0E4
:10001A0000C04F934091670045300CF403C0442759 :020016003EC0EA
:10002A0040936700403041F4939894989598929A37 :10001A0000C04F935F930F935FB7409167004530DD
:10003A000091660072D051D0413041F49298949860 :10002A000CF403C0442740936700403041F493988E
:10004A009598939A0091650068D047D0423041F460 :10003A0094989598929A00916600AAD083D04130FC
:10005A00929893989598949A009164005ED03DD0B6 :10004A0041F4929894989598939A00916500A0D05B
:10006A00433041F4929893989498959A009163003A :10005A0079D0423041F4929893989598949A009165
:10007A0054D033D04395409367004F9118950FEDB4 :10006A00640096D06FD0433041F492989398949854
:10008A000DBF0CE701BB05EC07BB02E000BF05E0B2 :10007A00959A009163008CD065D0439540936700B0
:10009A0003BF09E106BF01E009BF1124E6E6F1E06A :10008A005FBF0F915F914F9118950F930FB7B29B76
:1000AA0010926700789460EF70E021D04ED03CD077 :10009A0005C0B39B05C0B49B05C005C0019603C04B
:1000BA006395FBCFEE24FF1841E1001F111F4A95FB :1000AA000A9601C0CF960FBF0F9118950FED0DBF9D
:1000CA0009F40895EE1CFF1CE21AF30A20F4E20E6A :1000BA000EE701BB01EC07BB0CE108BB00E20BBF7A
:1000DA00F31E8894F2CF0894F0CF0FB800E40EB95B :1000CA000CE100BD02E000BF05E003BF09E106BF85
:1000EA000BE10DB9769BFDCFC09AC098089584E0C4 :1000DA0001E009BF11241092670080E090E003E874
:1000FA00A3E6B0E060936100709362000091610032 :1000EA000CBD00E00DBD01EC0ABD00E00BBD03E054
:10010A00109162002AE030E0D5DFED9200936100A1 :1000FA000EBDB99A08B706FFFDCF30D0789430D03C
:10011A00109362008A9591F70895E6E6F1E01127B7 :10010A00969A55D054D053D052D051D050D09698B8
:10012A00E00FF11F049008950F931F930FEF1FEF35 :10011A004ED04DD04CD04BD04AD049D0F0CFEE245F
:10013A001A95000000000000000000000000C1F74E :10012A00FF1841E1001F111F4A9509F40895EE1CBA
:10014A000A95A9F71F910F9108950F931F9300E441 :10013A00FF1CE21AF30A20F4E20EF31E8894F2CFAF
:10015A0012B3102712BB1F910F910895C0F9A4B0D2 :10014A000894F0CF0F930FB800E40EB90BE10DB984
:08016A00999282F880909C003C :10015A00769BFDCFC09AC0980F910895B9980895DB
:10016A005F9354E0A3E6B0E080936100909362004D
:10017A0000916100109162002AE030E0D0DFED9238
:10018A0000936100109362005A9591F75F91089568
:10019A000F931F93E4EDF1E01127E00FF11F049094
:1001AA001F910F91089503EB0A95F1F708950F93A4
:1001BA001F930FEF1FEF1A95000000000000D9F7F8
:1001CA000A95C1F71F910F910895C0F9A4B09992A9
:0601DA0082F880909C00F9
:00000001FF :00000001FF

View File

@ -5,7 +5,7 @@ Path: /home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_the
Source file: firmware.asm Source file: firmware.asm
Hex file: firmware.hex Hex file: firmware.hex
Eeprom file: firmware.eep Eeprom file: firmware.eep
Compiled: 23.04.2023, 20:09:24 Compiled: 27.04.2023, 17:17:06
Pass: 2 Pass: 2
1: ; 1: ;
@ -29,180 +29,300 @@ Pass: 2
16: 16:
17: .DEF TEMP_REG_A = r16 17: .DEF TEMP_REG_A = r16
18: .DEF TEMP_REG_B = r17 18: .DEF TEMP_REG_B = r17
19: .DEF DISP_NUM_L = r22 19: .DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе
20: .DEF DISP_NUM_H = r23 20: .DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе
21: 21: .DEF ONE_WIRE_FLAGS = r10
22: .EQU DIGIT_1_PIN = PD2 22:
23: .EQU DIGIT_2_PIN = PD3 23: .EQU DIGIT_1_PIN = PD2 ; Пин разряда индикатора 1
24: .EQU DIGIT_3_PIN = PD4 24: .EQU DIGIT_2_PIN = PD3 ; Пин разряда индикатора 2
25: .EQU DIGIT_4_PIN = PD5 25: .EQU DIGIT_3_PIN = PD4 ; Пин разряда индикатора 3
26: 26: .EQU DIGIT_4_PIN = PD5 ; Пин разряда индикатора 4
27: .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано 27:
28: 28: .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано
29: .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595 29:
30: .EQU USI_DO_PIN = PB6 ; DS на 74HC595 30: .EQU ONE_WIRE_LINE = PB1 ; Пин шины 1-Wire
31: .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595 31: .EQU ONE_WIRE_DDR = DDRB
32: 32: .EQU ONE_WIRE_PIN = PINB
33: .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами 33:
34: .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM 34: .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
35: .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик 35: .EQU USI_DO_PIN = PB6 ; DS на 74HC595
36: 36: .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
37: ; **** МАКРОСЫ ************************************************** 37:
38: .MACRO outi 38: .EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус"
39: ldi @0, @2 39: .EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс"
40: out @1, @0 40: .EQU SW_SET_PIN = PB4 ; Кнопка "Установить"
41: .ENDMACRO 41:
42: 42: .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами
43: .MACRO display_load 43: .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM
44: ldi DISP_NUM_L, LOW(@0) 44: .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик
45: ldi DISP_NUM_H, HIGH(@0) 45:
46: .ENDMACRO 46: ; **** МАКРОСЫ **************************************************
47: 47: .MACRO outi
48: ; **** СЕГМЕНТ ДАННЫХ ******************************************** 48: ldi @0, @2
49: .DSEG 49: out @1, @0
50: .ORG SRAM_START 50: .ENDMACRO
51: 51:
52: MCU_STATE: .BYTE 1 ; Текущее состояние МК 52: .MACRO display_load
53: SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке 53: ldi DISP_NUM_L, LOW(@0)
54: DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор 54: ldi DISP_NUM_H, HIGH(@0)
55: CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит 55: .ENDMACRO
56: 56:
57: ; **** СЕГМЕНТ КОДА ********************************************** 57: ; **** СЕГМЕНТ ДАННЫХ ********************************************
58: .CSEG 58: .DSEG
59: 59: .ORG SRAM_START
60: .ORG 0x00 60:
61: 000000 C043 rjmp RESET_vect 61: MCU_STATE: .BYTE 1 ; Текущее состояние МК
62: 62: SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке
63: .ORG 0x000D 63: DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
64: 00000D C000 rjmp TIMER0_COMPA_vect 64: CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
65: 65:
66: ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ 66: ; **** СЕГМЕНТ КОДА **********************************************
67: TIMER0_COMPA_vect: 67: .CSEG
68: 00000E 934F push r20 68:
69: 00000F 9140 lds r20, CURRENT_DIGIT 69: .ORG 0x00
000010 0067 70: 000000 C05A rjmp RESET_vect
70: 000011 3045 cpi r20, 5 71:
71: 000012 F40C brge reset_digit_idx 72: .ORG 0x000B
72: 000013 C003 rjmp _indicate_1 73: 00000B C03E rjmp PCINT0_vect
73: 74:
74: reset_digit_idx: 75: .ORG 0x000D
75: 000014 2744 clr r20 76: 00000D C000 rjmp TIMER0_COMPA_vect
76: 000015 9340 sts CURRENT_DIGIT, r20
000016 0067
77: 77:
78: _indicate_1: 78:
79: 000017 3040 cpi r20, 0 79: ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************
80: 000018 F441 brne _indicate_2 80: TIMER0_COMPA_vect:
81: 81: 00000E 934F push r20
82: 000019 9893 cbi PORTD, DIGIT_2_PIN 82: 00000F 935F push r21
83: 00001A 9894 cbi PORTD, DIGIT_3_PIN 83: 000010 930F push r16
84: 00001B 9895 cbi PORTD, DIGIT_4_PIN 84: 000011 B75F in r21, SREG
85: 00001C 9A92 sbi PORTD, DIGIT_1_PIN 85:
86: 00001D 9100 lds TEMP_REG_A, DIGITS+3 86: 000012 9140 lds r20, CURRENT_DIGIT
00001E 0066 000013 0067
87: 00001F D072 rcall DISPLAY_DECODER 87: 000014 3045 cpi r20, 5
88: 000020 D051 rcall USI_TRANSMIT 88: 000015 F40C brge reset_digit_idx
89: 89: 000016 C003 rjmp _indicate_1
90: _indicate_2: 90:
91: 000021 3041 cpi r20, 1 91: reset_digit_idx:
92: 000022 F441 brne _indicate_3 92: 000017 2744 clr r20
93: 93: 000018 9340 sts CURRENT_DIGIT, r20
94: 000023 9892 cbi PORTD, DIGIT_1_PIN 000019 0067
95: 000024 9894 cbi PORTD, DIGIT_3_PIN 94:
96: 000025 9895 cbi PORTD, DIGIT_4_PIN 95: _indicate_1:
97: 000026 9A93 sbi PORTD, DIGIT_2_PIN 96: 00001A 3040 cpi r20, 0
98: 000027 9100 lds TEMP_REG_A, DIGITS+2 97: 00001B F441 brne _indicate_2
000028 0065 98:
99: 000029 D068 rcall DISPLAY_DECODER 99: 00001C 9893 cbi PORTD, DIGIT_2_PIN
100: 00002A D047 rcall USI_TRANSMIT 100: 00001D 9894 cbi PORTD, DIGIT_3_PIN
101: 101: 00001E 9895 cbi PORTD, DIGIT_4_PIN
102: _indicate_3: 102: 00001F 9A92 sbi PORTD, DIGIT_1_PIN
103: 00002B 3042 cpi r20, 2 103: 000020 9100 lds TEMP_REG_A, DIGITS+3
104: 00002C F441 brne _indicate_4 000021 0066
105: 104: 000022 D0AA rcall DISPLAY_DECODER
106: 00002D 9892 cbi PORTD, DIGIT_1_PIN 105: 000023 D083 rcall USI_TRANSMIT
107: 00002E 9893 cbi PORTD, DIGIT_2_PIN 106:
108: 00002F 9895 cbi PORTD, DIGIT_4_PIN 107: _indicate_2:
109: 000030 9A94 sbi PORTD, DIGIT_3_PIN 108: 000024 3041 cpi r20, 1
110: 000031 9100 lds TEMP_REG_A, DIGITS+1 109: 000025 F441 brne _indicate_3
000032 0064 110:
111: 000033 D05E rcall DISPLAY_DECODER 111: 000026 9892 cbi PORTD, DIGIT_1_PIN
112: 000034 D03D rcall USI_TRANSMIT 112: 000027 9894 cbi PORTD, DIGIT_3_PIN
113: 113: 000028 9895 cbi PORTD, DIGIT_4_PIN
114: _indicate_4: 114: 000029 9A93 sbi PORTD, DIGIT_2_PIN
115: 000035 3043 cpi r20, 3 115: 00002A 9100 lds TEMP_REG_A, DIGITS+2
116: 000036 F441 brne _indicate_exit 00002B 0065
117: 116: 00002C D0A0 rcall DISPLAY_DECODER
118: 000037 9892 cbi PORTD, DIGIT_1_PIN 117: 00002D D079 rcall USI_TRANSMIT
119: 000038 9893 cbi PORTD, DIGIT_2_PIN 118:
120: 000039 9894 cbi PORTD, DIGIT_3_PIN 119: _indicate_3:
121: 00003A 9A95 sbi PORTD, DIGIT_4_PIN 120: 00002E 3042 cpi r20, 2
122: 00003B 9100 lds TEMP_REG_A, DIGITS 121: 00002F F441 brne _indicate_4
00003C 0063 122:
123: 00003D D054 rcall DISPLAY_DECODER 123: 000030 9892 cbi PORTD, DIGIT_1_PIN
124: 00003E D033 rcall USI_TRANSMIT 124: 000031 9893 cbi PORTD, DIGIT_2_PIN
125: 125: 000032 9895 cbi PORTD, DIGIT_4_PIN
126: _indicate_exit: 126: 000033 9A94 sbi PORTD, DIGIT_3_PIN
127: 00003F 9543 inc r20 127: 000034 9100 lds TEMP_REG_A, DIGITS+1
128: 000040 9340 sts CURRENT_DIGIT, r20 000035 0064
000041 0067 128: 000036 D096 rcall DISPLAY_DECODER
129: 000042 914F pop r20 129: 000037 D06F rcall USI_TRANSMIT
130: 000043 9518 reti 130:
131: 131: _indicate_4:
132: ; **** СТАРТ ПРОГРАММЫ ******************************************* 132: 000038 3043 cpi r20, 3
133: RESET_vect: 133: 000039 F441 brne _indicate_exit
134: 000044 ED0F ldi TEMP_REG_A, LOW(RAMEND) 134:
135: 000045 BF0D out SPL, TEMP_REG_A 135: 00003A 9892 cbi PORTD, DIGIT_1_PIN
136: 136: 00003B 9893 cbi PORTD, DIGIT_2_PIN
137: ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК ********************************** 137: 00003C 9894 cbi PORTD, DIGIT_3_PIN
138: MCU_INIT: 138: 00003D 9A95 sbi PORTD, DIGIT_4_PIN
139: ; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************ 139: 00003E 9100 lds TEMP_REG_A, DIGITS
140: outi r16, DDRD, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) 00003F 0063
140: 000046 E70C ldi R16, (1<<LED_POWER_PIN)|(1<<DIGIT_1_PIN)|(1<<DIGIT_2_PIN)|(1<<DIGIT_3_PIN)|(1<<DIGIT_4_PIN) 140: 000040 D08C rcall DISPLAY_DECODER
140: 000047 BB01 out DDRD, R16 141: 000041 D065 rcall USI_TRANSMIT
141: outi r16, DDRB, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (1<<PB2)
141: 000048 EC05 ldi R16, (1<<USI_CLK_PIN)|(1<<USI_DO_PIN)|(1<<USI_LATCH_PIN)|(1<<PB2)
141: 000049 BB07 out DDRB, R16
142: 142:
143: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ ********************************** 143: _indicate_exit:
144: outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A 144: 000042 9543 inc r20
144: 00004A E002 ldi R16, (1<<WGM01) 145: 000043 9340 sts CURRENT_DIGIT, r20
144: 00004B BF00 out TCCR0A, R16 000044 0067
145: outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель 146: 000045 BF5F out SREG, r21
145: 00004C E005 ldi R16, (1<<CS02)|(1<<CS00) 147:
145: 00004D BF03 out TCCR0B, R16 148: 000046 910F pop r16
146: outi r16, OCR0A, 25 ; число для сравнения. (60Hz) 149: 000047 915F pop r21
146: 00004E E109 ldi R16, 25 150: 000048 914F pop r20
146: 00004F BF06 out OCR0A, R16 151: 000049 9518 reti
147: outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
147: 000050 E001 ldi R16, (1<<OCIE0A)
147: 000051 BF09 out TIMSK, R16
148:
149: 000052 2411 clr r1
150: 000053 E6E6 ldi ZL,LOW(2*DISPLAY_SYMBOLS)
151: 000054 E0F1 ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
152: 152:
153: 000055 9210 sts CURRENT_DIGIT, r1 153: ; **** ОБРАБОТКА КНОПОК ******************************************
000056 0067 154: PCINT0_vect:
154: 155: 00004A 930F push r16
155: 000057 9478 sei 156: 00004B B70F in r16, SREG
156: display_load 240 ; загружаем число, которое нужно показать на индикатор
156: 000058 EF60 ldi DISP_NUM_L, LOW(240)
156: 000059 E070 ldi DISP_NUM_H, HIGH(240)
157: 157:
158: ; **** ГЛАВНЫЙ ЦИКЛ ********************************************** 158: 00004C 9BB2 sbis PINB, SW_PLUS_PIN
159: LOOP: 159: 00004D C005 rjmp _sw_plus
160: 00005A D021 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM 160:
161: 161: 00004E 9BB3 sbis PINB, SW_MINUS_PIN
162: 00005B D04E rcall TOGGLE_POWER_LED 162: 00004F C005 rjmp _sw_minus
163: 00005C D03C rcall DELAY 163:
164: 164: 000050 9BB4 sbis PINB, SW_SET_PIN
165: 00005D 9563 inc DISP_NUM_L 165: 000051 C005 rjmp _sw_set
166: 166:
167: 00005E CFFB rjmp LOOP 167: 000052 C005 rjmp _sw_exit
168: 168: _sw_plus:
169: ; **** ПОДПРОГРАММЫ ********************************************** 169: 000053 9601 adiw DISP_NUM_L, 1
170: .INCLUDE "div16u.asm" 170: 000054 C003 rjmp _sw_exit
171: _sw_minus:
172: 000055 960A adiw DISP_NUM_L, 10
173: 000056 C001 rjmp _sw_exit
174: _sw_set:
175: 000057 96CF adiw DISP_NUM_L, 63
176: _sw_exit:
177:
178: 000058 BF0F out SREG, r16
179: 000059 910F pop r16
180: 00005A 9518 reti
181:
182: ; **** СТАРТ ПРОГРАММЫ *******************************************
183: RESET_vect:
184: 00005B ED0F ldi TEMP_REG_A, LOW(RAMEND)
185: 00005C BF0D out SPL, TEMP_REG_A
186:
187: ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
188: MCU_INIT:
189: ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
190: outi r16, DDRD, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) | (0<<PD0) | (1<<PD1)
190: 00005D E70E ldi R16, (1<<LED_POWER_PIN)|(1<<DIGIT_1_PIN)|(1<<DIGIT_2_PIN)|(1<<DIGIT_3_PIN)|(1<<DIGIT_4_PIN)|(0<<PD0)|(1<<PD1)
190: 00005E BB01 out DDRD, R16
191: outi r16, DDRB, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (0<<SW_PLUS_PIN) | (0<<SW_MINUS_PIN) | (0<<SW_SET_PIN)
191: 00005F EC01 ldi R16, (1<<USI_CLK_PIN)|(1<<USI_DO_PIN)|(1<<USI_LATCH_PIN)|(0<<SW_PLUS_PIN)|(0<<SW_MINUS_PIN)|(0<<SW_SET_PIN)
191: 000060 BB07 out DDRB, R16
192: outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
192: 000061 E10C ldi R16, (1<<SW_PLUS_PIN)|(1<<SW_MINUS_PIN)|(1<<SW_SET_PIN)
192: 000062 BB08 out PORTB, R16
193:
194: ; **** ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ ********************************
195: outi r16, GIMSK, (1<<PCIE0)
195: 000063 E200 ldi R16, (1<<PCIE0)
195: 000064 BF0B out GIMSK, R16
196: outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
196: 000065 E10C ldi R16, (1<<PCINT2)|(1<<PCINT3)|(1<<PCINT4)
196: 000066 BD00 out PCMSK0, R16
197:
198: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 0 **********************************
199: outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
199: 000067 E002 ldi R16, (1<<WGM01)
199: 000068 BF00 out TCCR0A, R16
200: outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
200: 000069 E005 ldi R16, (1<<CS02)|(1<<CS00)
200: 00006A BF03 out TCCR0B, R16
201: outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
201: 00006B E109 ldi R16, 25
201: 00006C BF06 out OCR0A, R16
202: outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
202: 00006D E001 ldi R16, (1<<OCIE0A)
202: 00006E BF09 out TIMSK, R16
203:
204: ; **** ИНИЦИАЛИЗАЦИЯ USART *************************************
205: ; outi r16, UBRRL, LOW(3) ; 9600 БОД
206: ; outi r16, UBRRH, HIGH(3) ; 9600 БОД
207: ; outi r16, UCSRB, (1<<RXEN) | (1<<TXEN) ; Включение приема и передачии
208: ; outi r16, UCSRC, (1<<UCSZ1) | (1<<UCSZ0) ; Асинхронный режим, 8 бит фрейм, 1 стоповый бит
209:
210: 00006F 2411 clr r1
211: 000070 9210 sts CURRENT_DIGIT, r1
000071 0067
212:
213: display_load 0 ; загружаем число, которое нужно показать на индикатор
213: 000072 E080 ldi DISP_NUM_L, LOW(0)
213: 000073 E090 ldi DISP_NUM_H, HIGH(0)
214: ONE_WIRE_RESET:
215: ; 62 тика
216: outi r16, TCNT1L, 131
216: 000074 E803 ldi R16, 131
216: 000075 BD0C out TCNT1L, R16
217: outi r16, TCNT1H, 0
217: 000076 E000 ldi R16, 0
217: 000077 BD0D out TCNT1H, R16
218: outi r16, OCR1AL, 193
218: 000078 EC01 ldi R16, 193
218: 000079 BD0A out OCR1AL, R16
219: outi r16, OCR1AH, 0
219: 00007A E000 ldi R16, 0
219: 00007B BD0B out OCR1AH, R16
220:
221: ; запуск таймера в режиме Normal
222: outi r16, TCCR1B, (1<<CS11) | (1<<CS10)
222: 00007C E003 ldi R16, (1<<CS11)|(1<<CS10)
222: 00007D BD0E out TCCR1B, R16
223:
224: ; притягиваем шину
225: 00007E 9AB9 sbi ONE_WIRE_DDR, ONE_WIRE_LINE
226:
227: ; ждем минимум 480 мкс
228: 00007F B708 in r16, TIFR
229: 000080 FF06 sbrs r16, OCF1A
230: 000081 CFFD rjmp d1
231: 000082 D030 rcall OCF1A_occured
232:
233:
234: 000083 9478 sei
235:
236:
237:
238: ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
239: LOOP:
240: 000084 D030 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
241:
242: ; usart_t:
243: ; sbis UCSRA, UDRE
244: ; rjmp usart_t
245: ; ldi r16, 'B'
246: ; out UDR, r16
247:
248: ; usart_r:
249: ; sbis UCSRA, RXC
250: ; rjmp usart_r
251: ; in DISP_NUM_L, UDR
252:
253: 000085 9A96 sbi PORTD, PD6
254:
255: 000086 D055 rcall DELAY
256: 000087 D054 rcall DELAY
257: 000088 D053 rcall DELAY
258: 000089 D052 rcall DELAY
259: 00008A D051 rcall DELAY
260: 00008B D050 rcall DELAY
261:
262: 00008C 9896 cbi PORTD, PD6
263:
264: 00008D D04E rcall DELAY
265: 00008E D04D rcall DELAY
266: 00008F D04C rcall DELAY
267: 000090 D04B rcall DELAY
268: 000091 D04A rcall DELAY
269: 000092 D049 rcall DELAY
270:
271: 000093 CFF0 rjmp LOOP
272:
273: ; **** ПОДПРОГРАММЫ **********************************************
274: .INCLUDE "div16u.asm"
Including file div16u.asm Including file div16u.asm
1: ;*************************************************************************** 1: ;***************************************************************************
@ -237,182 +357,177 @@ Pass: 2
30: ;***** Code 30: ;***** Code
31: 31:
32: div16u: 32: div16u:
33: 00005F 24EE clr drem16uL ; clear remainder Low byte 33: 000094 24EE clr drem16uL ; clear remainder Low byte
34: 000060 18FF sub drem16uH,drem16uH ; clear remainder High byte and carry 34: 000095 18FF sub drem16uH,drem16uH ; clear remainder High byte and carry
35: 000061 E141 ldi dcnt16u,17 ; init loop counter 35: 000096 E141 ldi dcnt16u,17 ; init loop counter
36: d16u_1: 36: d16u_1:
37: 000062 1F00 rol dd16uL ; shift left dividend 37: 000097 1F00 rol dd16uL ; shift left dividend
38: 000063 1F11 rol dd16uH 38: 000098 1F11 rol dd16uH
39: 000064 954A dec dcnt16u ; decrement counter 39: 000099 954A dec dcnt16u ; decrement counter
40: 000065 F409 brne d16u_2 ; if done 40: 00009A F409 brne d16u_2 ; if done
41: 000066 9508 ret ; return 41: 00009B 9508 ret ; return
42: d16u_2: 42: d16u_2:
43: 000067 1CEE rol drem16uL ; shift dividend into remainder 43: 00009C 1CEE rol drem16uL ; shift dividend into remainder
44: 000068 1CFF rol drem16uH 44: 00009D 1CFF rol drem16uH
45: 000069 1AE2 sub drem16uL,dv16uL ; remainder = remainder - divisor 45: 00009E 1AE2 sub drem16uL,dv16uL ; remainder = remainder - divisor
46: 00006A 0AF3 sbc drem16uH,dv16uH 46: 00009F 0AF3 sbc drem16uH,dv16uH
47: 00006B F420 brcc d16u_3 ; if result negative 47: 0000A0 F420 brcc d16u_3 ; if result negative
48: 00006C 0EE2 add drem16uL,dv16uL ; restore remainder 48: 0000A1 0EE2 add drem16uL,dv16uL ; restore remainder
49: 00006D 1EF3 adc drem16uH,dv16uH 49: 0000A2 1EF3 adc drem16uH,dv16uH
50: 00006E 9488 clc ; clear carry to be shifted into result 50: 0000A3 9488 clc ; clear carry to be shifted into result
51: 00006F CFF2 rjmp d16u_1 ; else 51: 0000A4 CFF2 rjmp d16u_1 ; else
52: d16u_3: 52: d16u_3:
53: 000070 9408 sec ; set carry to be shifted into result 53: 0000A5 9408 sec ; set carry to be shifted into result
54: 000071 CFF0 rjmp d16u_1 54: 0000A6 CFF0 rjmp d16u_1
Continuing file firmware.asm Continuing file firmware.asm
171: .INCLUDE "usi.asm" 275: .INCLUDE "usi.asm"
Including file usi.asm Including file usi.asm
1: ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* 1: ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
2: USI_TRANSMIT: 2: USI_TRANSMIT:
3: 000072 B80F out USIDR, r0 ; Move byte from temp register to USI Data Register 3: 0000A7 930F push r16
4: 4: 0000A8 B80F out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
5: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) 5:
6: 000073 E400 ldi TEMP_REG_A, (1<<USIOIF) 6: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
7: 000074 B90E out USISR, TEMP_REG_A 7: 0000A9 E400 ldi TEMP_REG_A, (1<<USIOIF)
8: 8: 0000AA B90E out USISR, TEMP_REG_A
9: ; Load settings of USI into temp register 9:
10: ; This will setup USI to Three-wire mode, Software clock strobe (USITC) 10: ; Load settings of USI into temp register
11: ; with External, positive edge and toggle USCK 11: ; This will setup USI to Three-wire mode, Software clock strobe (USITC)
12: ; 12: ; with External, positive edge and toggle USCK
13: ; USIWM0 <--------------> USI Wire Mode 13: ;
14: ; USICS1 <--------------> USI Clock Source Select 14: ; USIWM0 <--------------> USI Wire Mode
15: ; USICLK <--------------> USI Clock Strobe 15: ; USICS1 <--------------> USI Clock Source Select
16: ; USITC <--------------> USI Toggle Clock (Enable clock generation) 16: ; USICLK <--------------> USI Clock Strobe
17: 000075 E10B ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC) 17: ; USITC <--------------> USI Toggle Clock (Enable clock generation)
18: 18: 0000AB E10B ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
19: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0 19:
20: 000076 B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register 20: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
21: 000077 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop 21: 0000AC B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
22: 000078 CFFD rjmp _USI_TRANSMIT_LOOP 22: 0000AD 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
23: 23: 0000AE CFFD rjmp _USI_TRANSMIT_LOOP
24: ; Send pulse into LATCH pin. 24:
25: ; This will copy byte from 74hc595 shift register into 74hc595 storage register 25: ; Send pulse into LATCH pin.
26: 000079 9AC0 sbi PORTB, USI_LATCH_PIN 26: ; This will copy byte from 74hc595 shift register into 74hc595 storage register
27: 00007A 98C0 cbi PORTB, USI_LATCH_PIN 27: 0000AF 9AC0 sbi PORTB, USI_LATCH_PIN
28: 00007B 9508 ret 28: 0000B0 98C0 cbi PORTB, USI_LATCH_PIN
29: 0000B1 910F pop r16
30: 0000B2 9508 ret
Continuing file firmware.asm Continuing file firmware.asm
172: 276:
173: ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА ********************* 277: OCF1A_occured:
174: ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM 278: ; отпускаем шину
175: ; путем деления этого числа несколько раз 279: 0000B3 98B9 cbi ONE_WIRE_DDR, ONE_WIRE_LINE
176: DISPLAY_UPD_DIGITS: 280: 0000B4 9508 ret
177: 00007C E084 ldi r24, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный 281:
178: 00007D E6A3 ldi XL, LOW(DIGITS) 282: ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
179: 00007E E0B0 ldi XH, HIGH(DIGITS) 283: ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
180: 284: ; путем деления этого числа несколько раз
181: .equ dividend = SRAM_TEMP_1 285: DISPLAY_UPD_DIGITS:
182: .equ divisor = 10 286: 0000B5 935F push r21
183: 287: 0000B6 E054 ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
184: ; загружаем делимое в адрес SRAM делимого 288: 0000B7 E6A3 ldi XL, LOW(DIGITS)
185: 00007F 9360 sts dividend, r22 289: 0000B8 E0B0 ldi XH, HIGH(DIGITS)
000080 0061 290:
186: 000081 9370 sts dividend+1, r23 291: .equ dividend = SRAM_TEMP_1
000082 0062 292: .equ divisor = 10
187: 293:
188: ; четыре раза производим деление для получения остатков 294: ; загружаем число которое хотим поделить в адрес SRAM делимого
189: DIV_LOOP: 295: 0000B9 9380 sts dividend, DISP_NUM_L
190: ; заполняем нужные регистры 0000BA 0061
191: 000083 9100 lds dd16uL, dividend 296: 0000BB 9390 sts dividend+1, DISP_NUM_H
000084 0061 0000BC 0062
192: 000085 9110 lds dd16uH, dividend+1 297:
000086 0062 298: ; четыре раза производим деление для получения остатков
193: 000087 E02A ldi dv16uL, LOW(divisor) 299: DIV_LOOP:
194: 000088 E030 ldi dv16uH, HIGH(divisor) 300: ; заполняем нужные регистры
195: 301: 0000BD 9100 lds dd16uL, dividend
196: 000089 DFD5 rcall div16u ; делим 0000BE 0061
197: 302: 0000BF 9110 lds dd16uH, dividend+1
198: 00008A 92ED st X+, drem16uL ; сохраняем остаток в ячейку по указателю 0000C0 0062
199: 303: 0000C1 E02A ldi dv16uL, LOW(divisor)
200: ; обновляем делимое 304: 0000C2 E030 ldi dv16uH, HIGH(divisor)
201: 00008B 9300 sts dividend, dres16uL 305:
00008C 0061 306: 0000C3 DFD0 rcall div16u ; делим
202: 00008D 9310 sts dividend+1, dres16uH 307:
00008E 0062 308: 0000C4 92ED st X+, drem16uL ; сохраняем остаток в ячейку по указателю
203: 309:
204: 00008F 958A dec r24 ; декрементируем счетчик цикла 310: ; обновляем делимое
205: 000090 F791 brne DIV_LOOP ; делим еще раз если не 0 311: 0000C5 9300 sts dividend, dres16uL
206: 000091 9508 ret 0000C6 0061
207: 312: 0000C7 9310 sts dividend+1, dres16uH
208: ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 *********************** 0000C8 0062
209: DISPLAY_DECODER: 313:
210: 000092 E6E6 ldi ZL, LOW(2*DISPLAY_SYMBOLS) 314: 0000C9 955A dec r21 ; декрементируем счетчик цикла
211: 000093 E0F1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 315: 0000CA F791 brne DIV_LOOP ; делим еще раз если не 0
212: 316: 0000CB 915F pop r21
213: 000094 2711 clr TEMP_REG_B 317: 0000CC 9508 ret
214: 000095 0FE0 add ZL, TEMP_REG_A 318:
215: 000096 1FF1 adc ZH, TEMP_REG_B 319: ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
216: 320: DISPLAY_DECODER:
217: 000097 9004 lpm r0, Z 321: 0000CD 930F push r16
218: 000098 9508 ret 322: 0000CE 931F push r17
219: 323: 0000CF EDE4 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
220: DELAY: 324: 0000D0 E0F1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
221: 000099 930F push r16 325:
222: 00009A 931F push r17 326: 0000D1 2711 clr TEMP_REG_B
223: 327: 0000D2 0FE0 add ZL, TEMP_REG_A
224: 328: 0000D3 1FF1 adc ZH, TEMP_REG_B
225: 329:
226: 00009B EF0F ldi r16, 255 330: 0000D4 9004 lpm r0, Z
227: _l_1: 331: 0000D5 911F pop r17
228: 00009C EF1F ldi r17, 255 332: 0000D6 910F pop r16
229: _dec_1: 333: 0000D7 9508 ret
230: 00009D 951A dec r17 334:
231: 00009E 0000 nop 335: DELAY_68us:
232: 00009F 0000 nop 336: 0000D8 EB03 ldi r16, 179 ; 1
233: 0000A0 0000 nop 337: _d1_loop:
234: 0000A1 0000 nop 338: 0000D9 950A dec r16 ; 1
235: 0000A2 0000 nop 339: 0000DA F7F1 brne _d1_loop ; 2/1
236: 0000A3 0000 nop 340: 0000DB 9508 ret ; 4
237: 0000A4 F7C1 brne _dec_1 341:
238: 0000A5 950A dec r16 342: DELAY:
239: 0000A6 F7A9 brne _l_1 343: 0000DC 930F push r16
240: 344: 0000DD 931F push r17
241: ; ldi r16, 255 345:
242: ; _DELAY_3: 346: 0000DE EF0F ldi r16, 255
243: ; ldi r17, 255 347: _DELAY_1:
244: ; _DELAY_2: 348: 0000DF EF1F ldi r17, 255
245: ; dec r17 349: _DELAY_2:
246: ; brne _DELAY_2 350: 0000E0 951A dec r17
247: ; _DELAY_1: 351: 0000E1 0000 nop
248: ; dec r16 352: 0000E2 0000 nop
249: ; brne _DELAY_3 353: 0000E3 0000 nop
250: 354: 0000E4 F7D9 brne _DELAY_2
251: 0000A7 911F pop r17 355:
252: 0000A8 910F pop r16 356: 0000E5 950A dec r16
253: 0000A9 9508 ret 357: 0000E6 F7C1 brne _DELAY_1
254: 358:
255: TOGGLE_POWER_LED: 359: 0000E7 911F pop r17
256: 0000AA 930F push r16 360: 0000E8 910F pop r16
257: 0000AB 931F push r17 361: 0000E9 9508 ret
258: 0000AC E400 ldi r16, (1<<LED_POWER_PIN) 362:
259: 0000AD B312 in r17, PORTD 363: DISPLAY_SYMBOLS:
260: 0000AE 2710 eor r17, r16 364: ; HGFEDCBA HGFEDCBA
261: 0000AF BB12 out PORTD, r17 365: .DB 0b11000000, 0b11111001 ; 0, 1
262: 0000B0 911F pop r17 0000EA F9C0
263: 0000B1 910F pop r16 366: .DB 0b10100100, 0b10110000 ; 2, 3
264: 0000B2 9508 ret 0000EB B0A4
265: 367: .DB 0b10011001, 0b10010010 ; 4, 5
266: DISPLAY_SYMBOLS: 0000EC 9299
267: ; HGFEDCBA HGFEDCBA 368: .DB 0b10000010, 0b11111000 ; 6, 7
268: .DB 0b11000000, 0b11111001 ; 0, 1 0000ED F882
0000B3 F9C0 369: .DB 0b10000000, 0b10010000 ; 8, 9
269: .DB 0b10100100, 0b10110000 ; 2, 3 0000EE 9080
0000B4 B0A4 370: .DB 0b10011100 ; °
270: .DB 0b10011001, 0b10010010 ; 4, 5
0000B5 9299
271: .DB 0b10000010, 0b11111000 ; 6, 7
0000B6 F882
272: .DB 0b10000000, 0b10010000 ; 8, 9
0000B7 9080
273: .DB 0b10011100 ; °
-> Warning 004: Number of bytes on line is odd, added 00 to fit program memory! -> 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: 273 File: /home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/firmware.asm, Line: 370
Source line: .DB 0b10011100 ; ° Source line: .DB 0b10011100 ; °
0000B8 009C 0000EF 009C
274: 371:
275: ; **** СЕГМЕНТ EEPROM ******************************************** 372: ; **** СЕГМЕНТ EEPROM ********************************************
276: ; .ESEG 373: ; .ESEG
277: ; INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023" 374: ; INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023"
List of symbols: List of symbols:
Type nDef nUsed Decimalval Hexval Name Type nDef nUsed Decimalval Hexval Name
@ -422,33 +537,43 @@ Type nDef nUsed Decimalval Hexval Name
L 1 6 99 63 DIGITS L 1 6 99 63 DIGITS
L 1 4 103 67 CURRENT_DIGIT L 1 4 103 67 CURRENT_DIGIT
L 1 2 14 0E TIMER0_COMPA_VECT L 1 2 14 0E TIMER0_COMPA_VECT
L 1 2 20 14 RESET_DIGIT_IDX L 1 2 23 17 RESET_DIGIT_IDX
L 1 2 23 17 _INDICATE_1 L 1 2 26 1A _INDICATE_1
L 1 2 33 21 _INDICATE_2 L 1 2 36 24 _INDICATE_2
L 1 2 43 2B _INDICATE_3 L 1 2 46 2E _INDICATE_3
L 1 2 53 35 _INDICATE_4 L 1 2 56 38 _INDICATE_4
L 1 2 63 3F _INDICATE_EXIT L 1 2 66 42 _INDICATE_EXIT
L 1 2 68 44 RESET_VECT L 1 2 74 4A PCINT0_VECT
L 1 0 70 46 MCU_INIT L 1 2 83 53 _SW_PLUS
L 1 2 90 5A LOOP L 1 2 85 55 _SW_MINUS
L 1 2 95 5F DIV16U L 1 2 87 57 _SW_SET
L 1 4 98 62 D16U_1 L 1 6 88 58 _SW_EXIT
L 1 2 103 67 D16U_2 L 1 2 91 5B RESET_VECT
L 1 2 112 70 D16U_3 L 1 0 93 5D MCU_INIT
L 1 8 114 72 USI_TRANSMIT L 1 0 116 74 ONE_WIRE_RESET
L 1 2 118 76 _USI_TRANSMIT_LOOP L 1 2 127 7F D1
L 1 2 124 7C DISPLAY_UPD_DIGITS L 1 2 132 84 LOOP
L 1 2 131 83 DIV_LOOP L 1 2 148 94 DIV16U
L 1 8 146 92 DISPLAY_DECODER L 1 4 151 97 D16U_1
L 1 2 153 99 DELAY L 1 2 156 9C D16U_2
L 1 2 156 9C _L_1 L 1 2 165 A5 D16U_3
L 1 2 157 9D _DEC_1 L 1 8 167 A7 USI_TRANSMIT
L 1 2 170 AA TOGGLE_POWER_LED L 1 2 172 AC _USI_TRANSMIT_LOOP
L 1 4 179 B3 DISPLAY_SYMBOLS L 1 2 179 B3 OCF1A_OCCURED
L 1 2 181 B5 DISPLAY_UPD_DIGITS
L 1 2 189 BD DIV_LOOP
L 1 8 205 CD DISPLAY_DECODER
L 1 0 216 D8 DELAY_68US
L 1 2 217 D9 _D1_LOOP
L 1 24 220 DC DELAY
L 1 2 223 DF _DELAY_1
L 1 2 224 E0 _DELAY_2
L 1 2 234 EA DISPLAY_SYMBOLS
R 1 11 16 10 TEMP_REG_A R 1 11 16 10 TEMP_REG_A
R 1 2 17 11 TEMP_REG_B R 1 2 17 11 TEMP_REG_B
R 1 2 22 16 DISP_NUM_L R 1 5 24 18 DISP_NUM_L
R 1 1 23 17 DISP_NUM_H R 1 2 25 19 DISP_NUM_H
R 1 0 10 0A ONE_WIRE_FLAGS
R 1 5 14 0E DREM16UL R 1 5 14 0E DREM16UL
R 1 5 15 0F DREM16UH R 1 5 15 0F DREM16UH
R 1 1 16 10 DRES16UL R 1 1 16 10 DRES16UL
@ -460,16 +585,22 @@ Type nDef nUsed Decimalval Hexval Name
R 1 2 20 14 DCNT16U R 1 2 20 14 DCNT16U
C 1 0 23 17 NOW_Y C 1 0 23 17 NOW_Y
C 1 0 4 04 NOW_M C 1 0 4 04 NOW_M
C 1 0 23 17 NOW_D C 1 0 27 1B NOW_D
C 1 0 45039 AFEF NOW_I C 1 0 45043 AFF3 NOW_I
C 1 5 2 02 DIGIT_1_PIN C 1 5 2 02 DIGIT_1_PIN
C 1 5 3 03 DIGIT_2_PIN C 1 5 3 03 DIGIT_2_PIN
C 1 5 4 04 DIGIT_3_PIN C 1 5 4 04 DIGIT_3_PIN
C 1 5 5 05 DIGIT_4_PIN C 1 5 5 05 DIGIT_4_PIN
C 1 2 6 06 LED_POWER_PIN C 1 1 6 06 LED_POWER_PIN
C 1 2 1 01 ONE_WIRE_LINE
C 1 2 23 17 ONE_WIRE_DDR
C 1 0 22 16 ONE_WIRE_PIN
C 1 3 0 00 USI_LATCH_PIN C 1 3 0 00 USI_LATCH_PIN
C 1 1 6 06 USI_DO_PIN C 1 1 6 06 USI_DO_PIN
C 1 1 7 07 USI_CLK_PIN C 1 1 7 07 USI_CLK_PIN
C 1 3 2 02 SW_PLUS_PIN
C 1 3 3 03 SW_MINUS_PIN
C 1 3 4 04 SW_SET_PIN
C 1 0 1 01 MCU_STATE_DEFAULT C 1 0 1 01 MCU_STATE_DEFAULT
C 1 0 2 02 MCU_STATE_PROGRAM C 1 0 2 02 MCU_STATE_PROGRAM
C 1 0 3 03 MCU_STATE_ERROR C 1 0 3 03 MCU_STATE_ERROR
@ -478,13 +609,13 @@ Type nDef nUsed Decimalval Hexval Name
List of macros: List of macros:
nLines nUsed nParams Name nLines nUsed nParams Name
2 6 3 OUTI 2 14 3 OUTI
2 1 1 DISPLAY_LOAD 2 1 1 DISPLAY_LOAD
Program : 167 words. Program : 223 words.
Constants : 6 words. Constants : 6 words.
Total program memory: 173 words. Total program memory: 229 words.
Eeprom space : 0 bytes. Eeprom space : 0 bytes.
Data segment : 8 bytes. Data segment : 8 bytes.
Compilation completed, no errors. Compilation completed, no errors.
Compilation ended 23.04.2023, 20:09:24 Compilation ended 27.04.2023, 17:17:06

View File

@ -1,12 +1,12 @@
/avr_sim_project_file /avr_sim_project_file
/home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/firmware.asm /home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/firmware.asm
mainasm=firmware.asm mainasm=firmware.asm
file=firmware.lst,349,62,73 file=firmware.lst,265,35,266
file=firmware.asm,1,1,1 file=firmware.asm,1,1,1
file=div16u.asm,1,1,1 file=div16u.asm,1,1,1
file=usi.asm,1,1,1 file=usi.asm,1,1,1
clock=8000000 clock=8000000
device-type=ATtiny2313A device-type=ATtiny2313A
device-package=20-pin-PDIP_SOIC device-package=20-pin-PDIP_SOIC
windows=acepSTwz windows=acePSTwz
alert1=0,0,-1,-1,,0,0 alert1=0,0,-1,-1,,0,0

View File

@ -1,6 +1,7 @@
; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
USI_TRANSMIT: USI_TRANSMIT:
out USIDR, r0 ; Move byte from temp register to USI Data Register push r16
out USIDR, r0 ; Байт для отправки всегда находится в регистре r0. Помещаем данные в регистр USIDR.
; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
ldi TEMP_REG_A, (1<<USIOIF) ldi TEMP_REG_A, (1<<USIOIF)
@ -25,4 +26,5 @@ USI_TRANSMIT:
; This will copy byte from 74hc595 shift register into 74hc595 storage register ; This will copy byte from 74hc595 shift register into 74hc595 storage register
sbi PORTB, USI_LATCH_PIN sbi PORTB, USI_LATCH_PIN
cbi PORTB, USI_LATCH_PIN cbi PORTB, USI_LATCH_PIN
pop r16
ret ret