pint setup

This commit is contained in:
Sergey Yarkov 2023-04-24 01:24:08 +03:00
parent 2b1f5bb754
commit dd4fc0d12c
No known key found for this signature in database
GPG Key ID: E91CE1FABC619B6F
9 changed files with 1911 additions and 616 deletions

View File

@ -1,9 +1,16 @@
SRC_FILE = firmware SRC_FILE = firmware
MCU = t2313 MCU = t2313
PROGRAMMER = usbtiny PROGRAMMER = usbtiny
BUILD_DIR = build
build: all: build_dir
avrasm2 -fI -W+ie $(SRC_FILE).asm -l $(SRC_FILE).lss avrasm2 -fI -W+ie $(SRC_FILE).asm -o ./$(BUILD_DIR)/$(SRC_FILE).hex -l ./$(BUILD_DIR)/$(SRC_FILE).lss
flash: flash:
avrdude -c $(PROGRAMMER) -p $(MCU) -U flash:w:$(SRC_FILE).hex:i avrdude -c $(PROGRAMMER) -p $(MCU) -U flash:w:./$(BUILD_DIR)/$(SRC_FILE).hex:i
clean:
rm -f $(BUILD_DIR)/*
build_dir:
mkdir -p ${BUILD_DIR}

27
build/firmware.hex Normal file
View File

@ -0,0 +1,27 @@
:020000020000FC
:0200000049C0F5
:020016003CC0EC
:10001A0000C04F935F935FB74091670045300CF47F
:10002A0003C0442740936700403041F49398949862
:10003A009598929A009166007ED05DD0413041F445
:10004A00929894989598939A0091650074D053D099
:10005A00423041F4929893989598949A009164004A
:10006A006AD049D0433041F4929893989498959ADB
:10007A000091630060D03FD04395409367005FBF13
:10008A005F914F911895019618950FED0DBF0CE7EA
:10009A0001BB01EC07BB0CE108BB00E20BBF0CE1A2
:1000AA0000BD02E000BF05E003BF09E106BF01E0B1
:1000BA0009BF11241092670080E090E0789425D05F
:1000CA004FD040D03FD03ED03DD03CD03BD0F7CFF0
:1000DA00EE24FF1841E1001F111F4A9509F4089503
:1000EA00EE1CFF1CE21AF30A20F4E20EF31E8894B7
:1000FA00F2CF0894F0CF0FB800E40EB90BE10DB9B6
:10010A00769BFDCFC09AC098089554E0A3E6B0E06C
:10011A0080936100909362000091610010916200E7
:10012A002AE030E0D5DFED9200936100109362007F
:10013A005A9591F70895ECE7F1E01127E00FF11FC6
:10014A00049008950F931F930FEF1FEF1A95000065
:10015A0000000000D9F70A95C1F71F910F91089581
:10016A000F931F9300E412B3102712BB1F910F9134
:0E017A000895C0F9A4B0999282F880909C007C
:00000001FF

1157
build/firmware.lss Normal file

File diff suppressed because it is too large Load Diff

View File

@ -29,22 +29,26 @@
;***** Code ;***** Code
div16u: clr drem16uL ;clear remainder Low byte div16u:
clr drem16uL ; clear remainder Low byte
sub drem16uH,drem16uH ; clear remainder High byte and carry sub drem16uH,drem16uH ; clear remainder High byte and carry
ldi dcnt16u,17 ; init loop counter ldi dcnt16u,17 ; init loop counter
d16u_1: rol dd16uL ;shift left dividend d16u_1:
rol dd16uL ; shift left dividend
rol dd16uH rol dd16uH
dec dcnt16u ; decrement counter dec dcnt16u ; decrement counter
brne d16u_2 ; if done brne d16u_2 ; if done
ret ; return ret ; return
d16u_2: rol drem16uL ;shift dividend into remainder d16u_2:
rol drem16uL ; shift dividend into remainder
rol drem16uH rol drem16uH
sub drem16uL,dv16uL ; remainder = remainder - divisor sub drem16uL,dv16uL ; remainder = remainder - divisor
sbc drem16uH,dv16uH ; sbc drem16uH,dv16uH
brcc d16u_3 ; if result negative brcc d16u_3 ; if result negative
add drem16uL,dv16uL ; restore remainder add drem16uL,dv16uL ; restore remainder
adc drem16uH,dv16uH adc drem16uH,dv16uH
clc ; clear carry to be shifted into result clc ; clear carry to be shifted into result
rjmp d16u_1 ; else rjmp d16u_1 ; else
d16u_3: sec ; set carry to be shifted into result d16u_3:
sec ; set carry to be shifted into result
rjmp d16u_1 rjmp d16u_1

View File

@ -16,28 +16,45 @@
.DEF TEMP_REG_A = r16 .DEF TEMP_REG_A = r16
.DEF TEMP_REG_B = r17 .DEF TEMP_REG_B = r17
.DEF DISP_NUM_L = r24 ; LSB числа которое сейчас на индикаторе
.DEF DISP_NUM_H = r25 ; MSB числа которое сейчас на индикаторе
.EQU DIGIT_1_PIN = PD2 .EQU DIGIT_1_PIN = PD2 ; Пин разряда индикатора 1
.EQU DIGIT_2_PIN = PD3 .EQU DIGIT_2_PIN = PD3 ; Пин разряда индикатора 2
.EQU DIGIT_3_PIN = PD4 .EQU DIGIT_3_PIN = PD4 ; Пин разряда индикатора 3
.EQU DIGIT_4_PIN = PD5 .EQU DIGIT_4_PIN = PD5 ; Пин разряда индикатора 4
.EQU LED_POWER_PIN = PD6 .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано
.EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595 .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
.EQU USI_DO_PIN = PB6 ; DS on 74HC595 .EQU USI_DO_PIN = PB6 ; DS на 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
.EQU SW_PLUS_PIN = PB2 ; Кнопка "Минус"
.EQU SW_MINUS_PIN = PB3 ; Кнопка "Плюс"
.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
.EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик
; **** МАКРОСЫ **************************************************
.MACRO outi
ldi @0, @2
out @1, @0
.ENDMACRO
.MACRO display_load
ldi DISP_NUM_L, LOW(@0)
ldi DISP_NUM_H, HIGH(@0)
.ENDMACRO
; **** СЕГМЕНТ ДАННЫХ ******************************************** ; **** СЕГМЕНТ ДАННЫХ ********************************************
.DSEG .DSEG
.ORG SRAM_START .ORG SRAM_START
MCU_STATE: .BYTE 1 ; Текущее состояние МК MCU_STATE: .BYTE 1 ; Текущее состояние МК
NUMBER: .BYTE 2 SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке
DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
@ -47,11 +64,18 @@ CURRENT_DIGIT: .BYTE 1 ; Номер разряда инди
.ORG 0x00 .ORG 0x00
rjmp RESET_vect rjmp RESET_vect
.ORG 0x000B
rjmp PCINT0_vect
.ORG 0x000D .ORG 0x000D
rjmp TIMER0_COMPA_vect rjmp TIMER0_COMPA_vect
; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************
TIMER0_COMPA_vect: TIMER0_COMPA_vect:
push r20
push r21
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
@ -112,74 +136,81 @@ TIMER0_COMPA_vect:
_indicate_exit: _indicate_exit:
inc r20 inc r20
sts CURRENT_DIGIT, r20 sts CURRENT_DIGIT, r20
out SREG, r21
pop r21
pop r20
reti reti
; **** ОБРАБОТКА КНОПОК ******************************************
PCINT0_vect:
adiw DISP_NUM_L, 1
reti
; **** СТАРТ ПРОГРАММЫ *******************************************
RESET_vect: RESET_vect:
ldi TEMP_REG_A, LOW(RAMEND) ldi TEMP_REG_A, LOW(RAMEND)
out SPL, TEMP_REG_A out SPL, TEMP_REG_A
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
MCU_INIT: MCU_INIT:
; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************ ; **** ИНИЦИАЛИЗАЦИЯ ПИНОВ *************************************
ldi r16, (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)
out DDRD, r16 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)
ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (1<<PB2) outi r16, PORTB, (1<<SW_PLUS_PIN) | (1<<SW_MINUS_PIN) | (1<<SW_SET_PIN)
out DDRB, r16
; **** ИНИЦИАЛИЗАЦИЯ ПРЕРЫВАНИЙ ********************************
outi r16, GIMSK, (1<<PCIE0)
outi r16, PCMSK0, (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) ; прерывание для кнопок на нажатие
; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ ********************************** ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ **********************************
ldi r16, (1<<COM0A0) | (1<<WGM01) outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
out TCCR0A, r16 outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
ldi r16, (1<<CS02) | (1<<CS00) outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
out TCCR0B, r16
ldi r16, 40
out OCR0A, r16
ldi r16, (1<<OCIE0A)
out TIMSK, r16
clr r1 clr r1
ldi ZL,LOW(2*DISPLAY_SYMBOLS)
ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
; загружаем число, которое нужно показать на индикатор
.EQU DISPLAY_NUMBER = 279
ldi r22, LOW(DISPLAY_NUMBER)
ldi r23, HIGH(DISPLAY_NUMBER)
sts CURRENT_DIGIT, r1 sts CURRENT_DIGIT, r1
display_load 0 ; загружаем число, которое нужно показать на индикатор
sei sei
; **** ГЛАВНЫЙ ЦИКЛ **********************************************
LOOP:
rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
rcall TOGGLE_POWER_LED
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rjmp LOOP rjmp LOOP
; **** ПОДПРОГРАММЫ ********************************************** ; **** ПОДПРОГРАММЫ **********************************************
.INCLUDE "div16u.asm" .INCLUDE "div16u.asm"
.INCLUDE "usi.asm" .INCLUDE "usi.asm"
; **** ГЛАВНЫЙ ЦИКЛ ********************************************** ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
LOOP:
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *******************
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
; путем деления этого числа несколько раз ; путем деления этого числа несколько раз
GET_DIGITS: DISPLAY_UPD_DIGITS:
cli ldi r21, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
ldi r24, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
ldi XL, LOW(DIGITS) ldi XL, LOW(DIGITS)
ldi XH, HIGH(DIGITS) ldi XH, HIGH(DIGITS)
.equ dividend_addr = $0060 .equ dividend = SRAM_TEMP_1
.equ divisor = 10 .equ divisor = 10
; загружаем делимое в адрес SRAM делимого ; загружаем число которое хотим поделить в адрес SRAM делимого
sts dividend_addr, r22 sts dividend, DISP_NUM_L
sts dividend_addr+1, r23 sts dividend+1, DISP_NUM_H
; четыре раза производим деление для получения остатков ; четыре раза производим деление для получения остатков
DIV_LOOP: DIV_LOOP:
; заполняем нужные регистры ; заполняем нужные регистры
lds dd16uL, dividend_addr lds dd16uL, dividend
lds dd16uH, dividend_addr+1 lds dd16uH, dividend+1
ldi dv16uL, LOW(divisor) ldi dv16uL, LOW(divisor)
ldi dv16uH, HIGH(divisor) ldi dv16uH, HIGH(divisor)
@ -188,34 +219,41 @@ LOOP:
st X+, drem16uL ; сохраняем остаток в ячейку по указателю st X+, drem16uL ; сохраняем остаток в ячейку по указателю
; обновляем делимое ; обновляем делимое
sts dividend_addr, dres16uL sts dividend, dres16uL
sts dividend_addr+1, dres16uH sts dividend+1, dres16uH
dec r24 ; декрементируем счетчик цикла dec r21 ; декрементируем счетчик цикла
brne DIV_LOOP ; делим еще раз если не 0 brne DIV_LOOP ; делим еще раз если не 0
sei ret
rcall TOGGLE_POWER_LED
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rcall DELAY
rjmp LOOP
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
DISPLAY_DECODER: DISPLAY_DECODER:
ldi ZL, LOW(2*DISPLAY_SYMBOLS) ldi ZL, LOW(2*DISPLAY_SYMBOLS)
ldi ZH, HIGH(2*DISPLAY_SYMBOLS) ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
ldi TEMP_REG_B, 0 clr TEMP_REG_B
add ZL, TEMP_REG_A add ZL, TEMP_REG_A
adc ZH, TEMP_REG_B adc ZH, TEMP_REG_B
lpm lpm r0, Z
ret ret
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
@ -253,6 +291,7 @@ DISPLAY_SYMBOLS:
.DB 0b10011001, 0b10010010 ; 4, 5 .DB 0b10011001, 0b10010010 ; 4, 5
.DB 0b10000010, 0b11111000 ; 6, 7 .DB 0b10000010, 0b11111000 ; 6, 7
.DB 0b10000000, 0b10010000 ; 8, 9 .DB 0b10000000, 0b10010000 ; 8, 9
.DB 0b10011100 ; °
; **** СЕГМЕНТ EEPROM ******************************************** ; **** СЕГМЕНТ EEPROM ********************************************
; .ESEG ; .ESEG

View File

@ -1,25 +1,25 @@
:020000020000FC :020000020000FC
:0200000041C0FD :0200000043C0FB
:10001A0000C04091670045300CF403C04427409368 :10001A0000C04F934091670045300CF403C0442759
:10002A006700403041F4939894989598929A009179 :10002A0040936700403041F4939894989598929A37
:10003A00660075D04CD0413041F4929894989598C6 :10003A000091660072D051D0413041F49298949860
:10004A00939A009165006BD042D0423041F4929865 :10004A009598939A0091650068D047D0423041F460
:10005A0093989598949A0091640061D038D043306F :10005A00929893989598949A009164005ED03DD0B6
:10006A0041F4929893989498959A0091630057D086 :10006A00433041F4929893989498959A009163003A
:10007A002ED043954093670018950FED0DBF0CE7FE :10007A0054D033D04395409367004F9118950FEDB4
:10008A0001BB05EC07BB02E400BF05E003BF08E2C1 :10008A000DBF0CE701BB05EC07BB02E000BF05E0B2
:10009A0006BF01E009BF1124E4E6F1E067E171E07F :10009A0003BF09E106BF01E009BF1124E6E6F1E06A
:1000AA001092670078941DC0EE24FF1841E1001FEA :1000AA0010926700789460EF70E021D04ED03CD077
:1000BA00111F4A9509F40895EE1CFF1CE21AF30A6F :1000BA006395FBCFEE24FF1841E1001F111F4A95FB
:1000CA0020F4E20EF31E8894F2CF0894F0CF0FB812 :1000CA0009F40895EE1CFF1CE21AF30A20F4E20E6A
:1000DA0000E40EB90BE10DB9769BFDCFC09AC0982A :1000DA00F31E8894F2CF0894F0CF0FB800E40EB95B
:1000EA000895F89484E0A3E6B0E06093600070930A :1000EA000BE10DB9769BFDCFC09AC098089584E0C4
:1000FA00610000916000109161002AE030E0D4DFD5 :1000FA00A3E6B0E060936100709362000091610032
:10010A00ED9200936000109361008A9591F77894BC :10010A00109162002AE030E0D5DFED9200936100A1
:10011A001BD00CD00BD00AD009D008D0E2CFE4E62D :10011A00109362008A9591F70895E6E6F1E01127B7
:10012A00F1E010E0E00FF11FC89508950F931F93B7 :10012A00E00FF11F049008950F931F930FEF1FEF35
:10013A000FEF1FEF1A95000000000000D9F70A958B :10013A001A95000000000000000000000000C1F74E
:10014A00C1F71F910F9108950F931F9300E412B303 :10014A000A95A9F71F910F9108950F931F9300E441
:10015A00102712BB1F910F910895C0F9A4B099926C :10015A0012B3102712BB1F910F910895C0F9A4B0D2
:04016A0082F8809007 :08016A00999282F880909C003C
:00000001FF :00000001FF

View File

@ -1,20 +1,20 @@
AVRASM ver. 2.2.7 firmware.asm Thu Apr 20 00:26:30 2023 AVRASM ver. 2.2.7 firmware.asm Fri Apr 21 19:34:03 2023
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
firmware.asm(157): Including file 'div16u.asm' firmware.asm(170): 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(157): 'div16u.asm' included form here firmware.asm(170): '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(157): 'div16u.asm' included form here firmware.asm(170): '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(157): 'div16u.asm' included form here firmware.asm(170): '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(157): 'div16u.asm' included form here firmware.asm(170): 'div16u.asm' included form here
firmware.asm(158): Including file 'usi.asm' firmware.asm(171): Including file 'usi.asm'
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
firmware.asm(157): Including file 'div16u.asm' firmware.asm(170): Including file 'div16u.asm'
firmware.asm(158): Including file 'usi.asm' firmware.asm(171): Including file 'usi.asm'
; Project name: thermostat ; Project name: thermostat
@ -732,28 +732,41 @@ firmware.asm(158): 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 DISP_NUM_L = r22
.DEF DISP_NUM_H = r23
.EQU DIGIT_1_PIN = PD2 .EQU DIGIT_1_PIN = PD2
.EQU DIGIT_2_PIN = PD3 .EQU DIGIT_2_PIN = PD3
.EQU DIGIT_3_PIN = PD4 .EQU DIGIT_3_PIN = PD4
.EQU DIGIT_4_PIN = PD5 .EQU DIGIT_4_PIN = PD5
.EQU LED_POWER_PIN = PD6 .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано
.EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595 .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
.EQU USI_DO_PIN = PB6 ; DS on 74HC595 .EQU USI_DO_PIN = PB6 ; DS на 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595 .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
.EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами
.EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM
.EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик
; **** МАКРОСЫ **************************************************
.MACRO outi
ldi @0, @2
out @1, @0
.ENDMACRO
.MACRO display_load
ldi DISP_NUM_L, LOW(@0)
ldi DISP_NUM_H, HIGH(@0)
.ENDMACRO
; **** СЕГМЕНТ ДАННЫХ ******************************************** ; **** СЕГМЕНТ ДАННЫХ ********************************************
.DSEG .DSEG
.ORG SRAM_START .ORG SRAM_START
000060 MCU_STATE: .BYTE 1 ; Текущее состояние МК 000060 MCU_STATE: .BYTE 1 ; Текущее состояние МК
000061 NUMBER: .BYTE 2 000061 SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке
000063 DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор 000063 DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
000067 CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит 000067 CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
@ -786,8 +799,8 @@ firmware.asm(158): Including file 'usi.asm'
00001a 9895 cbi PORTD, DIGIT_4_PIN 00001a 9895 cbi PORTD, DIGIT_4_PIN
00001b 9a92 sbi PORTD, DIGIT_1_PIN 00001b 9a92 sbi PORTD, DIGIT_1_PIN
00001c 9100 0066 lds TEMP_REG_A, DIGITS+3 00001c 9100 0066 lds TEMP_REG_A, DIGITS+3
00001e d075 rcall DISPLAY_DECODER 00001e d073 rcall DISPLAY_DECODER
00001f d04c rcall USI_TRANSMIT 00001f d052 rcall USI_TRANSMIT
_indicate_2: _indicate_2:
000020 3041 cpi r20, 1 000020 3041 cpi r20, 1
@ -798,8 +811,8 @@ firmware.asm(158): Including file 'usi.asm'
000024 9895 cbi PORTD, DIGIT_4_PIN 000024 9895 cbi PORTD, DIGIT_4_PIN
000025 9a93 sbi PORTD, DIGIT_2_PIN 000025 9a93 sbi PORTD, DIGIT_2_PIN
000026 9100 0065 lds TEMP_REG_A, DIGITS+2 000026 9100 0065 lds TEMP_REG_A, DIGITS+2
000028 d06b rcall DISPLAY_DECODER 000028 d069 rcall DISPLAY_DECODER
000029 d042 rcall USI_TRANSMIT 000029 d048 rcall USI_TRANSMIT
_indicate_3: _indicate_3:
00002a 3042 cpi r20, 2 00002a 3042 cpi r20, 2
@ -810,8 +823,8 @@ firmware.asm(158): Including file 'usi.asm'
00002e 9895 cbi PORTD, DIGIT_4_PIN 00002e 9895 cbi PORTD, DIGIT_4_PIN
00002f 9a94 sbi PORTD, DIGIT_3_PIN 00002f 9a94 sbi PORTD, DIGIT_3_PIN
000030 9100 0064 lds TEMP_REG_A, DIGITS+1 000030 9100 0064 lds TEMP_REG_A, DIGITS+1
000032 d061 rcall DISPLAY_DECODER 000032 d05f rcall DISPLAY_DECODER
000033 d038 rcall USI_TRANSMIT 000033 d03e rcall USI_TRANSMIT
_indicate_4: _indicate_4:
000034 3043 cpi r20, 3 000034 3043 cpi r20, 3
@ -822,52 +835,59 @@ firmware.asm(158): Including file 'usi.asm'
000038 9894 cbi PORTD, DIGIT_3_PIN 000038 9894 cbi PORTD, DIGIT_3_PIN
000039 9a95 sbi PORTD, DIGIT_4_PIN 000039 9a95 sbi PORTD, DIGIT_4_PIN
00003a 9100 0063 lds TEMP_REG_A, DIGITS 00003a 9100 0063 lds TEMP_REG_A, DIGITS
00003c d057 rcall DISPLAY_DECODER 00003c d055 rcall DISPLAY_DECODER
00003d d02e rcall USI_TRANSMIT 00003d d034 rcall USI_TRANSMIT
_indicate_exit: _indicate_exit:
00003e 9543 inc r20 00003e 9543 inc r20
00003f 9340 0067 sts CURRENT_DIGIT, r20 00003f 9340 0067 sts CURRENT_DIGIT, r20
000041 9518 reti 000041 9518 reti
; **** СТАРТ ПРОГРАММЫ *******************************************
RESET_vect: RESET_vect:
000042 ed0f ldi TEMP_REG_A, LOW(RAMEND) 000042 ed0f ldi TEMP_REG_A, LOW(RAMEND)
000043 bf0d out SPL, TEMP_REG_A 000043 bf0d out SPL, TEMP_REG_A
; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
MCU_INIT: MCU_INIT:
; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************ ; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************
000044 e70c ldi r16, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) 000044 e70c
000045 bb01 out DDRD, r16 000045 bb01 outi r16, DDRD, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN)
000046 ec05 ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (1<<PB2) 000046 ec05
000047 bb07 out DDRB, r16 000047 bb07 outi r16, DDRB, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (1<<PB2)
; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ ********************************** ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ **********************************
000048 e402 ldi r16, (1<<COM0A0) | (1<<WGM01) 000048 e002
000049 bf00 out TCCR0A, r16 000049 bf00 outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
00004a e005
00004a e005 ldi r16, (1<<CS02) | (1<<CS00) 00004b bf03 outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
00004b bf03 out TCCR0B, r16 00004c e109
00004d bf06 outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
00004c e208 ldi r16, 40 00004e e001
00004d bf06 out OCR0A, r16 00004f bf09 outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
00004e e001 ldi r16, (1<<OCIE0A)
00004f bf09 out TIMSK, r16
000050 2411 clr r1 000050 2411 clr r1
000051 e6e4 ldi ZL,LOW(2*DISPLAY_SYMBOLS) 000051 e6e0 ldi ZL,LOW(2*DISPLAY_SYMBOLS)
000052 e0f1 ldi ZH,HIGH(2*DISPLAY_SYMBOLS) 000052 e0f1 ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
; загружаем число, которое нужно показать на индикатор 000053 9210 0067 sts CURRENT_DIGIT, r1
.EQU DISPLAY_NUMBER = 279
000053 e167 ldi r22, LOW(DISPLAY_NUMBER)
000054 e071 ldi r23, HIGH(DISPLAY_NUMBER)
000055 9210 0067 sts CURRENT_DIGIT, r1 000055 9478 sei
000056 e66e
000057 e077 display_load 1902 ; загружаем число, которое нужно показать на индикатор
000057 9478 sei ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
LOOP:
000058 d023 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
000058 c01d rjmp LOOP 000059 d04d rcall TOGGLE_POWER_LED
00005a d03e rcall DELAY
00005b d03d rcall DELAY
00005c d03c rcall DELAY
00005d 9563 inc DISP_NUM_L
00005e cff9 rjmp LOOP
; **** ПОДПРОГРАММЫ ********************************************** ; **** ПОДПРОГРАММЫ **********************************************
.INCLUDE "div16u.asm" .INCLUDE "div16u.asm"
@ -902,32 +922,36 @@ firmware.asm(158): Including file 'usi.asm'
;***** Code ;***** Code
000059 24ee div16u: clr drem16uL ;clear remainder Low byte div16u:
00005a 18ff sub drem16uH,drem16uH;clear remainder High byte and carry 00005f 24ee clr drem16uL ; clear remainder Low byte
00005b e141 ldi dcnt16u,17 ;init loop counter 000060 18ff sub drem16uH,drem16uH ; clear remainder High byte and carry
00005c 1f00 d16u_1: rol dd16uL ;shift left dividend 000061 e141 ldi dcnt16u,17 ; init loop counter
00005d 1f11 rol dd16uH d16u_1:
00005e 954a dec dcnt16u ;decrement counter 000062 1f00 rol dd16uL ; shift left dividend
00005f f409 brne d16u_2 ;if done 000063 1f11 rol dd16uH
000060 9508 ret ; return 000064 954a dec dcnt16u ; decrement counter
000061 1cee d16u_2: rol drem16uL ;shift dividend into remainder 000065 f409 brne d16u_2 ; if done
000062 1cff rol drem16uH 000066 9508 ret ; return
000063 1ae2 sub drem16uL,dv16uL ;remainder = remainder - divisor d16u_2:
000064 0af3 sbc drem16uH,dv16uH ; 000067 1cee rol drem16uL ; shift dividend into remainder
000065 f420 brcc d16u_3 ;if result negative 000068 1cff rol drem16uH
000066 0ee2 add drem16uL,dv16uL ; restore remainder 000069 1ae2 sub drem16uL,dv16uL ; remainder = remainder - divisor
000067 1ef3 adc drem16uH,dv16uH 00006a 0af3 sbc drem16uH,dv16uH
000068 9488 clc ; clear carry to be shifted into result 00006b f420 brcc d16u_3 ; if result negative
000069 cff2 rjmp d16u_1 ;else 00006c 0ee2 add drem16uL,dv16uL ; restore remainder
00006a 9408 d16u_3: sec ; set carry to be shifted into result 00006d 1ef3 adc drem16uH,dv16uH
00006e 9488 clc ; clear carry to be shifted into result
00006f cff2 rjmp d16u_1 ; else
d16u_3:
000070 9408 sec ; set carry to be shifted into result
.INCLUDE "usi.asm" .INCLUDE "usi.asm"
00006b cff0 000071 cff0
USI_TRANSMIT: USI_TRANSMIT:
00006c b80f out USIDR, r0 ; Move byte from temp register to USI Data Register 000072 b80f out USIDR, r0 ; Move byte from temp register to USI Data Register
; 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)
00006d e400 ldi TEMP_REG_A, (1<<USIOIF) 000073 e400 ldi TEMP_REG_A, (1<<USIOIF)
00006e b90e out USISR, TEMP_REG_A 000074 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)
@ -937,114 +961,105 @@ firmware.asm(158): 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)
00006f e10b ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC) 000075 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
000070 b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register 000076 b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
000071 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop 000077 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
000072 cffd rjmp _USI_TRANSMIT_LOOP 000078 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
000073 9ac0 sbi PORTB, USI_LATCH_PIN 000079 9ac0 sbi PORTB, USI_LATCH_PIN
000074 98c0 cbi PORTB, USI_LATCH_PIN 00007a 98c0 cbi PORTB, USI_LATCH_PIN
000075 9508 00007b 9508
; **** ГЛАВНЫЙ ЦИКЛ ********************************************** ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
LOOP:
; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *******************
; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
; путем деления этого числа несколько раз ; путем деления этого числа несколько раз
GET_DIGITS: DISPLAY_UPD_DIGITS:
000076 94f8 cli 00007c e084 ldi r24, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
000077 e084 ldi r24, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный 00007d e6a3 ldi XL, LOW(DIGITS)
000078 e6a3 ldi XL, LOW(DIGITS) 00007e e0b0 ldi XH, HIGH(DIGITS)
000079 e0b0 ldi XH, HIGH(DIGITS)
.equ dividend_addr = $0060 .equ dividend = SRAM_TEMP_1
.equ divisor = 10 .equ divisor = 10
; загружаем делимое в адрес SRAM делимого ; загружаем делимое в адрес SRAM делимого
00007a 9360 0060 sts dividend_addr, r22 00007f 9360 0061 sts dividend, r22
00007c 9370 0061 sts dividend_addr+1, r23 000081 9370 0062 sts dividend+1, r23
; четыре раза производим деление для получения остатков ; четыре раза производим деление для получения остатков
DIV_LOOP: DIV_LOOP:
; заполняем нужные регистры ; заполняем нужные регистры
00007e 9100 0060 lds dd16uL, dividend_addr 000083 9100 0061 lds dd16uL, dividend
000080 9110 0061 lds dd16uH, dividend_addr+1 000085 9110 0062 lds dd16uH, dividend+1
000082 e02a ldi dv16uL, LOW(divisor) 000087 e02a ldi dv16uL, LOW(divisor)
000083 e030 ldi dv16uH, HIGH(divisor) 000088 e030 ldi dv16uH, HIGH(divisor)
000084 dfd4 rcall div16u ; делим 000089 dfd5 rcall div16u ; делим
000085 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю 00008a 92ed st X+, drem16uL ; сохраняем остаток в ячейку по указателю
; обновляем делимое ; обновляем делимое
000086 9300 0060 sts dividend_addr, dres16uL 00008b 9300 0061 sts dividend, dres16uL
000088 9310 0061 sts dividend_addr+1, dres16uH 00008d 9310 0062 sts dividend+1, dres16uH
00008a 958a dec r24 ; декрементируем счетчик цикла 00008f 958a dec r24 ; декрементируем счетчик цикла
00008b f791 brne DIV_LOOP ; делим еще раз если не 0 000090 f791 brne DIV_LOOP ; делим еще раз если не 0
00008c 9478 sei 000091 9508 ret
00008d d01b rcall TOGGLE_POWER_LED
00008e d00c rcall DELAY
00008f d00b rcall DELAY
000090 d00a rcall DELAY
000091 d009 rcall DELAY
000092 d008 rcall DELAY
000093 cfe2 rjmp LOOP
; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
DISPLAY_DECODER: DISPLAY_DECODER:
000094 e6e4 ldi ZL, LOW(2*DISPLAY_SYMBOLS) 000092 e6e0 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
000095 e0f1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 000093 e0f1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
000096 e010 ldi TEMP_REG_B, 0 000094 2711 clr TEMP_REG_B
000097 0fe0 add ZL, TEMP_REG_A 000095 0fe0 add ZL, TEMP_REG_A
000098 1ff1 adc ZH, TEMP_REG_B 000096 1ff1 adc ZH, TEMP_REG_B
000099 95c8 lpm 000097 9004 lpm r0, Z
00009a 9508 ret 000098 9508 ret
DELAY: DELAY:
00009b 930f push r16 000099 930f push r16
00009c 931f push r17 00009a 931f push r17
00009d ef0f ldi r16, 255 00009b ef0f ldi r16, 255
_DELAY_1: _DELAY_1:
00009e ef1f ldi r17, 255 00009c ef1f ldi r17, 255
_DELAY_2: _DELAY_2:
00009f 951a dec r17 00009d 951a dec r17
00009e 0000 nop
00009f 0000 nop
0000a0 0000 nop 0000a0 0000 nop
0000a1 0000 nop 0000a1 f7d9 brne _DELAY_2
0000a2 0000 nop
0000a3 f7d9 brne _DELAY_2
0000a4 950a dec r16 0000a2 950a dec r16
0000a5 f7c1 brne _DELAY_1 0000a3 f7c1 brne _DELAY_1
0000a6 911f pop r17 0000a4 911f pop r17
0000a7 910f pop r16 0000a5 910f pop r16
0000a8 9508 ret 0000a6 9508 ret
TOGGLE_POWER_LED: TOGGLE_POWER_LED:
0000a9 930f push r16 0000a7 930f push r16
0000aa 931f push r17 0000a8 931f push r17
0000ab e400 ldi r16, (1<<LED_POWER_PIN) 0000a9 e400 ldi r16, (1<<LED_POWER_PIN)
0000ac b312 in r17, PORTD 0000aa b312 in r17, PORTD
0000ad 2710 eor r17, r16 0000ab 2710 eor r17, r16
0000ae bb12 out PORTD, r17 0000ac bb12 out PORTD, r17
0000af 911f pop r17 0000ad 911f pop r17
0000b0 910f pop r16 0000ae 910f pop r16
0000b1 9508 ret 0000af 9508 ret
DISPLAY_SYMBOLS: DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA ; HGFEDCBA HGFEDCBA
0000b2 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1 0000b0 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
0000b3 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3 0000b1 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
0000b4 9299 .DB 0b10011001, 0b10010010 ; 4, 5 0000b2 9299 .DB 0b10011001, 0b10010010 ; 4, 5
0000b5 f882 .DB 0b10000010, 0b11111000 ; 6, 7 0000b3 f882 .DB 0b10000010, 0b11111000 ; 6, 7
0000b6 9080 .DB 0b10000000, 0b10010000 ; 8, 9 0000b4 9080 .DB 0b10000000, 0b10010000 ; 8, 9
firmware.asm(258): warning: .cseg .db misalignment - padding zero byte
0000b5 009c .DB 0b10011100 ; °
; **** СЕГМЕНТ EEPROM ******************************************** ; **** СЕГМЕНТ EEPROM ********************************************
; .ESEG ; .ESEG
@ -1065,12 +1080,12 @@ counted separately from r26..r31 here.
.dseg memory usage only counts static data declared with .byte .dseg memory usage only counts static data declared with .byte
"ATtiny2313A" register use summary: "ATtiny2313A" register use summary:
x : 1 y : 0 z : 0 r0 : 1 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: 34 r17: 14 r18: 3 r19: 3 r20: 12 r13: 0 r14: 5 r15: 5 r16: 34 r17: 14 r18: 3 r19: 3 r20: 12
r21: 0 r22: 2 r23: 2 r24: 2 r25: 0 r26: 1 r27: 1 r28: 0 r21: 0 r22: 3 r23: 2 r24: 2 r25: 0 r26: 1 r27: 1 r28: 0
r29: 0 r30: 3 r31: 3 r29: 0 r30: 3 r31: 3
Registers used: 17 out of 35 (48.6%) Registers used: 18 out of 35 (51.4%)
"ATtiny2313A" instruction use summary: "ATtiny2313A" instruction use summary:
.lds : 0 .sts : 0 adc : 2 add : 2 adiw : 0 and : 0 .lds : 0 .sts : 0 adc : 2 add : 2 adiw : 0 and : 0
@ -1079,25 +1094,25 @@ 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 : 8 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 : 13 cbr : 0 clc : 1
clh : 0 cli : 1 cln : 0 clr : 3 cls : 0 clt : 0 clh : 0 cli : 0 cln : 0 clr : 4 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 : 1 cpse : 0 dec : 4 eor : 1 icall : 0 ijmp : 0 in : 1
inc : 1 ld : 0 ldd : 0 ldi : 25 lds : 7 lpm : 3 inc : 2 ld : 0 ldd : 0 ldi : 24 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 : 11 pop : 4 push : 4 rcall : 15 or : 0 ori : 0 out : 11 pop : 4 push : 4 rcall : 14
ret : 5 reti : 1 rjmp : 8 rol : 4 ror : 0 sbc : 1 ret : 6 reti : 1 rjmp : 7 rol : 4 ror : 0 sbc : 1
sbci : 0 sbi : 5 sbic : 0 sbis : 1 sbiw : 0 sbr : 0 sbci : 0 sbi : 5 sbic : 0 sbis : 1 sbiw : 0 sbr : 0
sbrc : 0 sbrs : 0 sec : 1 seh : 0 sei : 2 sen : 0 sbrc : 0 sbrs : 0 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: 33 out of 105 (31.4%)
"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 0x00016e 332 10 342 2048 16.7% [.cseg] 0x000000 0x00016c 328 12 340 2048 16.6%
[.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%
Assembly complete, 0 errors, 4 warnings Assembly complete, 0 errors, 5 warnings

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: 20.04.2023, 00:25:25 Compiled: 23.04.2023, 20:09:24
Pass: 2 Pass: 2
1: ; 1: ;
@ -29,152 +29,180 @@ 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: 19: .DEF DISP_NUM_L = r22
20: .EQU DIGIT_1_PIN = PD2 20: .DEF DISP_NUM_H = r23
21: .EQU DIGIT_2_PIN = PD3 21:
22: .EQU DIGIT_3_PIN = PD4 22: .EQU DIGIT_1_PIN = PD2
23: .EQU DIGIT_4_PIN = PD5 23: .EQU DIGIT_2_PIN = PD3
24: 24: .EQU DIGIT_3_PIN = PD4
25: .EQU LED_POWER_PIN = PD6 25: .EQU DIGIT_4_PIN = PD5
26: 26:
27: .EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595 27: .EQU LED_POWER_PIN = PD6 ; Светодиод, который говорит о том что питание подано
28: .EQU USI_DO_PIN = PB6 ; DS on 74HC595 28:
29: .EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595 29: .EQU USI_LATCH_PIN = PB0 ; ST_CP на 74HC595
30: 30: .EQU USI_DO_PIN = PB6 ; DS на 74HC595
31: .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами 31: .EQU USI_CLK_PIN = PB7 ; SH_CP на 74HC595
32: .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM 32:
33: .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик 33: .EQU MCU_STATE_DEFAULT = 0x01 ; Режим измерения температуры и сравнения с заданными параметрами
34: 34: .EQU MCU_STATE_PROGRAM = 0x02 ; Режим настройки параметров в EEPROM
35: ; **** СЕГМЕНТ ДАННЫХ ******************************************** 35: .EQU MCU_STATE_ERROR = 0x03 ; Режим ошибки, например когда не подключен датчик
36: .DSEG 36:
37: .ORG SRAM_START 37: ; **** МАКРОСЫ **************************************************
38: 38: .MACRO outi
39: MCU_STATE: .BYTE 1 ; Текущее состояние МК 39: ldi @0, @2
40: NUMBER: .BYTE 2 40: out @1, @0
41: DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор 41: .ENDMACRO
42: CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит 42:
43: 43: .MACRO display_load
44: ; **** СЕГМЕНТ КОДА ********************************************** 44: ldi DISP_NUM_L, LOW(@0)
45: .CSEG 45: ldi DISP_NUM_H, HIGH(@0)
46: 46: .ENDMACRO
47: .ORG 0x00 47:
48: 000000 C040 rjmp RESET_vect 48: ; **** СЕГМЕНТ ДАННЫХ ********************************************
49: 49: .DSEG
50: .ORG 0x000D 50: .ORG SRAM_START
51: 00000D C000 rjmp TIMER0_COMPA_vect 51:
52: 52: MCU_STATE: .BYTE 1 ; Текущее состояние МК
53: ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************ 53: SRAM_TEMP_1: .BYTE 2 ; Хранения временного 16-бит числа в ячейке
54: TIMER0_COMPA_vect: 54: DIGITS: .BYTE 4 ; Ячейки, где хранятся символы, для вывода на индикатор
55: 00000E 9140 lds r20, CURRENT_DIGIT 55: CURRENT_DIGIT: .BYTE 1 ; Номер разряда индикатора, который сейчас горит
00000F 0067 56:
56: 000010 3045 cpi r20, 5 57: ; **** СЕГМЕНТ КОДА **********************************************
57: 000011 F40C brge reset_digit_idx 58: .CSEG
58: 000012 C003 rjmp _indicate_1
59: 59:
60: reset_digit_idx: 60: .ORG 0x00
61: 000013 2744 clr r20 61: 000000 C043 rjmp RESET_vect
62: 000014 9340 sts CURRENT_DIGIT, r20 62:
000015 0067 63: .ORG 0x000D
63: 64: 00000D C000 rjmp TIMER0_COMPA_vect
64: _indicate_1: 65:
65: 000016 3040 cpi r20, 0 66: ; **** ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ ************************************
66: 000017 F439 brne _indicate_2 67: TIMER0_COMPA_vect:
67: 68: 00000E 934F push r20
68: 000018 EF0B ldi r16, ~(1<<DIGIT_1_PIN) 69: 00000F 9140 lds r20, CURRENT_DIGIT
69: 000019 7102 andi r16, PORTD 000010 0067
70: 00001A BB02 out PORTD, r16 70: 000011 3045 cpi r20, 5
71: 00001B 9100 lds TEMP_REG_A, DIGITS+3 71: 000012 F40C brge reset_digit_idx
00001C 0066 72: 000013 C003 rjmp _indicate_1
72: 00001D D075 rcall DISPLAY_DECODER 73:
73: 00001E D04C rcall USI_TRANSMIT 74: reset_digit_idx:
74: 75: 000014 2744 clr r20
75: _indicate_2: 76: 000015 9340 sts CURRENT_DIGIT, r20
76: 00001F 3041 cpi r20, 1 000016 0067
77: 000020 F441 brne _indicate_3 77:
78: 78: _indicate_1:
79: 000021 9892 cbi PORTD, DIGIT_1_PIN 79: 000017 3040 cpi r20, 0
80: 000022 9894 cbi PORTD, DIGIT_3_PIN 80: 000018 F441 brne _indicate_2
81: 000023 9895 cbi PORTD, DIGIT_4_PIN 81:
82: 000024 9A93 sbi PORTD, DIGIT_2_PIN 82: 000019 9893 cbi PORTD, DIGIT_2_PIN
83: 000025 9100 lds TEMP_REG_A, DIGITS+2 83: 00001A 9894 cbi PORTD, DIGIT_3_PIN
000026 0065 84: 00001B 9895 cbi PORTD, DIGIT_4_PIN
84: 000027 D06B rcall DISPLAY_DECODER 85: 00001C 9A92 sbi PORTD, DIGIT_1_PIN
85: 000028 D042 rcall USI_TRANSMIT 86: 00001D 9100 lds TEMP_REG_A, DIGITS+3
86: 00001E 0066
87: _indicate_3: 87: 00001F D072 rcall DISPLAY_DECODER
88: 000029 3042 cpi r20, 2 88: 000020 D051 rcall USI_TRANSMIT
89: 00002A F441 brne _indicate_4 89:
90: 90: _indicate_2:
91: 00002B 9892 cbi PORTD, DIGIT_1_PIN 91: 000021 3041 cpi r20, 1
92: 00002C 9893 cbi PORTD, DIGIT_2_PIN 92: 000022 F441 brne _indicate_3
93: 00002D 9895 cbi PORTD, DIGIT_4_PIN 93:
94: 00002E 9A94 sbi PORTD, DIGIT_3_PIN 94: 000023 9892 cbi PORTD, DIGIT_1_PIN
95: 00002F 9100 lds TEMP_REG_A, DIGITS+1 95: 000024 9894 cbi PORTD, DIGIT_3_PIN
000030 0064 96: 000025 9895 cbi PORTD, DIGIT_4_PIN
96: 000031 D061 rcall DISPLAY_DECODER 97: 000026 9A93 sbi PORTD, DIGIT_2_PIN
97: 000032 D038 rcall USI_TRANSMIT 98: 000027 9100 lds TEMP_REG_A, DIGITS+2
98: 000028 0065
99: _indicate_4: 99: 000029 D068 rcall DISPLAY_DECODER
100: 000033 3043 cpi r20, 3 100: 00002A D047 rcall USI_TRANSMIT
101: 000034 F441 brne _indicate_exit 101:
102: 102: _indicate_3:
103: 000035 9892 cbi PORTD, DIGIT_1_PIN 103: 00002B 3042 cpi r20, 2
104: 000036 9893 cbi PORTD, DIGIT_2_PIN 104: 00002C F441 brne _indicate_4
105: 000037 9894 cbi PORTD, DIGIT_3_PIN 105:
106: 000038 9A95 sbi PORTD, DIGIT_4_PIN 106: 00002D 9892 cbi PORTD, DIGIT_1_PIN
107: 000039 9100 lds TEMP_REG_A, DIGITS 107: 00002E 9893 cbi PORTD, DIGIT_2_PIN
00003A 0063 108: 00002F 9895 cbi PORTD, DIGIT_4_PIN
108: 00003B D057 rcall DISPLAY_DECODER 109: 000030 9A94 sbi PORTD, DIGIT_3_PIN
109: 00003C D02E rcall USI_TRANSMIT 110: 000031 9100 lds TEMP_REG_A, DIGITS+1
110: 000032 0064
111: _indicate_exit: 111: 000033 D05E rcall DISPLAY_DECODER
112: 00003D 9543 inc r20 112: 000034 D03D rcall USI_TRANSMIT
113: 00003E 9340 sts CURRENT_DIGIT, r20 113:
00003F 0067 114: _indicate_4:
114: 000040 9518 reti 115: 000035 3043 cpi r20, 3
115: 116: 000036 F441 brne _indicate_exit
116: RESET_vect: 117:
117: 000041 ED0F ldi TEMP_REG_A, LOW(RAMEND) 118: 000037 9892 cbi PORTD, DIGIT_1_PIN
118: 000042 BF0D out SPL, TEMP_REG_A 119: 000038 9893 cbi PORTD, DIGIT_2_PIN
119: 120: 000039 9894 cbi PORTD, DIGIT_3_PIN
120: MCU_INIT: 121: 00003A 9A95 sbi PORTD, DIGIT_4_PIN
121: ; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************ 122: 00003B 9100 lds TEMP_REG_A, DIGITS
122: 000043 E70C ldi r16, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN) 00003C 0063
123: 000044 BB01 out DDRD, r16 123: 00003D D054 rcall DISPLAY_DECODER
124: 000045 EC05 ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (1<<PB2) 124: 00003E D033 rcall USI_TRANSMIT
125: 000046 BB07 out DDRB, r16 125:
126: 126: _indicate_exit:
127: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ ********************************** 127: 00003F 9543 inc r20
128: 000047 E402 ldi r16, (1<<COM0A0) | (1<<WGM01) 128: 000040 9340 sts CURRENT_DIGIT, r20
129: 000048 BF00 out TCCR0A, r16 000041 0067
130: 129: 000042 914F pop r20
131: 000049 E005 ldi r16, (1<<CS02) | (1<<CS00) 130: 000043 9518 reti
132: 00004A BF03 out TCCR0B, r16 131:
133: 132: ; **** СТАРТ ПРОГРАММЫ *******************************************
134: 00004B E208 ldi r16, 40 133: RESET_vect:
135: 00004C BF06 out OCR0A, r16 134: 000044 ED0F ldi TEMP_REG_A, LOW(RAMEND)
135: 000045 BF0D out SPL, TEMP_REG_A
136: 136:
137: 00004D E001 ldi r16, (1<<OCIE0A) 137: ; **** ПРОЦЕСС ИНИЦИАЛИЗАЦИИ МК **********************************
138: 00004E BF09 out TIMSK, r16 138: MCU_INIT:
139: 139: ; **** ИНИЦИАЛИЗАЦИЯ ПОРТОВ ************************************
140: 00004F 2411 clr r1 140: outi r16, DDRD, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN)
141: 000050 E6E2 ldi ZL,LOW(2*DISPLAY_SYMBOLS) 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)
142: 000051 E0F1 ldi ZH,HIGH(2*DISPLAY_SYMBOLS) 140: 000047 BB01 out DDRD, R16
143: 141: outi r16, DDRB, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) | (1<<PB2)
144: ; загружаем число, которое нужно показать на индикатор 141: 000048 EC05 ldi R16, (1<<USI_CLK_PIN)|(1<<USI_DO_PIN)|(1<<USI_LATCH_PIN)|(1<<PB2)
145: .EQU DISPLAY_NUMBER = 279 141: 000049 BB07 out DDRB, R16
146: 000052 E167 ldi r22, LOW(DISPLAY_NUMBER) 142:
147: 000053 E071 ldi r23, HIGH(DISPLAY_NUMBER) 143: ; **** ИНИЦИАЛИЗАЦИЯ ТАЙМЕРОВ **********************************
144: outi r16, TCCR0A, (1<<WGM01) ; режим CTC Compare A
144: 00004A E002 ldi R16, (1<<WGM01)
144: 00004B BF00 out TCCR0A, R16
145: outi r16, TCCR0B, (1<<CS02) | (1<<CS00) ; 1024 делитель
145: 00004C E005 ldi R16, (1<<CS02)|(1<<CS00)
145: 00004D BF03 out TCCR0B, R16
146: outi r16, OCR0A, 25 ; число для сравнения. (60Hz)
146: 00004E E109 ldi R16, 25
146: 00004F BF06 out OCR0A, R16
147: outi r16, TIMSK, (1<<OCIE0A) ; включение прерывания по совпадению
147: 000050 E001 ldi R16, (1<<OCIE0A)
147: 000051 BF09 out TIMSK, R16
148: 148:
149: 000054 9210 sts CURRENT_DIGIT, r1 149: 000052 2411 clr r1
000055 0067 150: 000053 E6E6 ldi ZL,LOW(2*DISPLAY_SYMBOLS)
150: 151: 000054 E0F1 ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
151: 000056 9478 sei
152: 152:
153: 000057 C01D rjmp LOOP 153: 000055 9210 sts CURRENT_DIGIT, r1
000056 0067
154: 154:
155: ; **** ПОДПРОГРАММЫ ********************************************** 155: 000057 9478 sei
156: .INCLUDE "div16u.asm" 156: display_load 240 ; загружаем число, которое нужно показать на индикатор
156: 000058 EF60 ldi DISP_NUM_L, LOW(240)
156: 000059 E070 ldi DISP_NUM_H, HIGH(240)
157:
158: ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
159: LOOP:
160: 00005A D021 rcall DISPLAY_UPD_DIGITS ; получаем из этого числа цифры путем деления и распределяем их по ячейкам в SRAM
161:
162: 00005B D04E rcall TOGGLE_POWER_LED
163: 00005C D03C rcall DELAY
164:
165: 00005D 9563 inc DISP_NUM_L
166:
167: 00005E CFFB rjmp LOOP
168:
169: ; **** ПОДПРОГРАММЫ **********************************************
170: .INCLUDE "div16u.asm"
Including file div16u.asm Including file div16u.asm
1: ;*************************************************************************** 1: ;***************************************************************************
@ -208,36 +236,40 @@ Pass: 2
29: 29:
30: ;***** Code 30: ;***** Code
31: 31:
32: 000058 24EE clr drem16uL ;clear remainder Low byte 32: div16u:
33: 000059 18FF sub drem16uH,drem16uH;clear remainder High byte and carry 33: 00005F 24EE clr drem16uL ; clear remainder Low byte
34: 00005A E141 ldi dcnt16u,17 ;init loop counter 34: 000060 18FF sub drem16uH,drem16uH ; clear remainder High byte and carry
35: 00005B 1F00 rol dd16uL ;shift left dividend 35: 000061 E141 ldi dcnt16u,17 ; init loop counter
36: 00005C 1F11 rol dd16uH 36: d16u_1:
37: 00005D 954A dec dcnt16u ;decrement counter 37: 000062 1F00 rol dd16uL ; shift left dividend
38: 00005E F409 brne d16u_2 ;if done 38: 000063 1F11 rol dd16uH
39: 00005F 9508 ret ; return 39: 000064 954A dec dcnt16u ; decrement counter
40: 000060 1CEE rol drem16uL ;shift dividend into remainder 40: 000065 F409 brne d16u_2 ; if done
41: 000061 1CFF rol drem16uH 41: 000066 9508 ret ; return
42: 000062 1AE2 sub drem16uL,dv16uL ;remainder = remainder - divisor 42: d16u_2:
43: 000063 0AF3 sbc drem16uH,dv16uH ; 43: 000067 1CEE rol drem16uL ; shift dividend into remainder
44: 000064 F420 brcc d16u_3 ;if result negative 44: 000068 1CFF rol drem16uH
45: 000065 0EE2 add drem16uL,dv16uL ; restore remainder 45: 000069 1AE2 sub drem16uL,dv16uL ; remainder = remainder - divisor
46: 000066 1EF3 adc drem16uH,dv16uH 46: 00006A 0AF3 sbc drem16uH,dv16uH
47: 000067 9488 clc ; clear carry to be shifted into result 47: 00006B F420 brcc d16u_3 ; if result negative
48: 000068 CFF2 rjmp d16u_1 ;else 48: 00006C 0EE2 add drem16uL,dv16uL ; restore remainder
49: 000069 9408 sec ; set carry to be shifted into result 49: 00006D 1EF3 adc drem16uH,dv16uH
50: 00006A CFF0 rjmp d16u_1 50: 00006E 9488 clc ; clear carry to be shifted into result
51: 00006F CFF2 rjmp d16u_1 ; else
52: d16u_3:
53: 000070 9408 sec ; set carry to be shifted into result
54: 000071 CFF0 rjmp d16u_1
Continuing file firmware.asm Continuing file firmware.asm
157: .INCLUDE "usi.asm" 171: .INCLUDE "usi.asm"
Including file usi.asm Including file usi.asm
1: ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР ************************* 1: ; **** ОТПРАВКА БАЙТА В СДВИГОВЫЙ РЕГИСТР *************************
2: USI_TRANSMIT: 2: USI_TRANSMIT:
3: 00006B B80F out USIDR, r0 ; Move byte from temp register to USI Data Register 3: 000072 B80F out USIDR, r0 ; Move byte from temp register to USI Data Register
4: 4:
5: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted) 5: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
6: 00006C E400 ldi TEMP_REG_A, (1<<USIOIF) 6: 000073 E400 ldi TEMP_REG_A, (1<<USIOIF)
7: 00006D B90E out USISR, TEMP_REG_A 7: 000074 B90E out USISR, TEMP_REG_A
8: 8:
9: ; Load settings of USI into temp register 9: ; Load settings of USI into temp register
10: ; This will setup USI to Three-wire mode, Software clock strobe (USITC) 10: ; This will setup USI to Three-wire mode, Software clock strobe (USITC)
@ -247,165 +279,176 @@ Pass: 2
14: ; USICS1 <--------------> USI Clock Source Select 14: ; USICS1 <--------------> USI Clock Source Select
15: ; USICLK <--------------> USI Clock Strobe 15: ; USICLK <--------------> USI Clock Strobe
16: ; USITC <--------------> USI Toggle Clock (Enable clock generation) 16: ; USITC <--------------> USI Toggle Clock (Enable clock generation)
17: 00006E E10B ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC) 17: 000075 E10B ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
18: 18:
19: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0 19: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
20: 00006F B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register 20: 000076 B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
21: 000070 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop 21: 000077 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
22: 000071 CFFD rjmp _USI_TRANSMIT_LOOP 22: 000078 CFFD rjmp _USI_TRANSMIT_LOOP
23: 23:
24: ; Send pulse into LATCH pin. 24: ; Send pulse into LATCH pin.
25: ; This will copy byte from 74hc595 shift register into 74hc595 storage register 25: ; This will copy byte from 74hc595 shift register into 74hc595 storage register
26: 000072 9AC0 sbi PORTB, USI_LATCH_PIN 26: 000079 9AC0 sbi PORTB, USI_LATCH_PIN
27: 000073 98C0 cbi PORTB, USI_LATCH_PIN 27: 00007A 98C0 cbi PORTB, USI_LATCH_PIN
28: 000074 9508 ret 28: 00007B 9508 ret
Continuing file firmware.asm Continuing file firmware.asm
158:
159: ; **** ГЛАВНЫЙ ЦИКЛ **********************************************
160: LOOP:
161: ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *******************
162: ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
163: ; путем деления этого числа несколько раз
164: GET_DIGITS:
165: 000075 94F8 cli
166: 000076 E084 ldi r24, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
167: 000077 E6A3 ldi XL, LOW(DIGITS)
168: 000078 E0B0 ldi XH, HIGH(DIGITS)
169:
170: .equ dividend_addr = $0060
171: .equ divisor = 10
172: 172:
173: ; загружаем делимое в адрес SRAM делимого 173: ; **** ПОЛУЧЕНИЕ ЦИФР ИЗ 16-ТИ БИТНОГО ЧИСЛА *********************
174: 000079 9360 sts dividend_addr, r22 174: ; Описание: Перемещает цифры числа в соответствующие ячейки памяти в SRAM
00007A 0060 175: ; путем деления этого числа несколько раз
175: 00007B 9370 sts dividend_addr+1, r23 176: DISPLAY_UPD_DIGITS:
00007C 0061 177: 00007C E084 ldi r24, 4 ; максимум 4 цифры, т.к индикатор четырех разрядный
176: 178: 00007D E6A3 ldi XL, LOW(DIGITS)
177: ; четыре раза производим деление для получения остатков 179: 00007E E0B0 ldi XH, HIGH(DIGITS)
178: DIV_LOOP: 180:
179: ; заполняем нужные регистры 181: .equ dividend = SRAM_TEMP_1
180: 00007D 9100 lds dd16uL, dividend_addr 182: .equ divisor = 10
00007E 0060 183:
181: 00007F 9110 lds dd16uH, dividend_addr+1 184: ; загружаем делимое в адрес SRAM делимого
185: 00007F 9360 sts dividend, r22
000080 0061 000080 0061
182: 000081 E02A ldi dv16uL, LOW(divisor) 186: 000081 9370 sts dividend+1, r23
183: 000082 E030 ldi dv16uH, HIGH(divisor) 000082 0062
184: 187:
185: 000083 DFD4 rcall div16u ; делим 188: ; четыре раза производим деление для получения остатков
186: 189: DIV_LOOP:
187: 000084 92ED st X+, drem16uL ; сохраняем остаток в ячейку по указателю 190: ; заполняем нужные регистры
188: 191: 000083 9100 lds dd16uL, dividend
189: ; обновляем делимое 000084 0061
190: 000085 9300 sts dividend_addr, dres16uL 192: 000085 9110 lds dd16uH, dividend+1
000086 0060 000086 0062
191: 000087 9310 sts dividend_addr+1, dres16uH 193: 000087 E02A ldi dv16uL, LOW(divisor)
000088 0061 194: 000088 E030 ldi dv16uH, HIGH(divisor)
192: 195:
193: 000089 958A dec r24 ; декрементируем счетчик цикла 196: 000089 DFD5 rcall div16u ; делим
194: 00008A F791 brne DIV_LOOP ; делим еще раз если не 0 197:
195: 00008B 9478 sei 198: 00008A 92ED st X+, drem16uL ; сохраняем остаток в ячейку по указателю
196: 199:
197: 00008C D01B rcall TOGGLE_POWER_LED 200: ; обновляем делимое
198: 00008D D00C rcall DELAY 201: 00008B 9300 sts dividend, dres16uL
199: 00008E D00B rcall DELAY 00008C 0061
200: 00008F D00A rcall DELAY 202: 00008D 9310 sts dividend+1, dres16uH
201: 000090 D009 rcall DELAY 00008E 0062
202: 000091 D008 rcall DELAY
203: 203:
204: 000092 CFE2 rjmp LOOP 204: 00008F 958A dec r24 ; декрементируем счетчик цикла
205: 205: 000090 F791 brne DIV_LOOP ; делим еще раз если не 0
206: DISPLAY_DECODER: 206: 000091 9508 ret
207: 000093 E6E2 ldi ZL, LOW(2*DISPLAY_SYMBOLS) 207:
208: 000094 E0F1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS) 208: ; **** ЗАГРУЖАЕТ НУЖНЫЙ АДРЕС СИМВОЛА В R0 ***********************
209: 209: DISPLAY_DECODER:
210: 000095 E010 ldi TEMP_REG_B, 0 210: 000092 E6E6 ldi ZL, LOW(2*DISPLAY_SYMBOLS)
211: 000096 0FE0 add ZL, TEMP_REG_A 211: 000093 E0F1 ldi ZH, HIGH(2*DISPLAY_SYMBOLS)
212: 000097 1FF1 adc ZH, TEMP_REG_B 212:
213: 213: 000094 2711 clr TEMP_REG_B
214: 000098 95C8 lpm 214: 000095 0FE0 add ZL, TEMP_REG_A
215: 000099 9508 ret 215: 000096 1FF1 adc ZH, TEMP_REG_B
216: 216:
217: DELAY: 217: 000097 9004 lpm r0, Z
218: 00009A 930F push r16 218: 000098 9508 ret
219: 00009B 931F push r17 219:
220: 00009C EF0F ldi r16, 255 220: DELAY:
221: _DELAY_1: 221: 000099 930F push r16
222: 00009D EF1F ldi r17, 255 222: 00009A 931F push r17
223: _DELAY_2: 223:
224: 00009E 951A dec r17 224:
225: 00009F 0000 nop 225:
226: 0000A0 0000 nop 226: 00009B EF0F ldi r16, 255
227: 0000A1 0000 nop 227: _l_1:
228: 0000A2 F7D9 brne _DELAY_2 228: 00009C EF1F ldi r17, 255
229: 229: _dec_1:
230: 0000A3 950A dec r16 230: 00009D 951A dec r17
231: 0000A4 F7C1 brne _DELAY_1 231: 00009E 0000 nop
232: 232: 00009F 0000 nop
233: 0000A5 911F pop r17 233: 0000A0 0000 nop
234: 0000A6 910F pop r16 234: 0000A1 0000 nop
235: 0000A7 9508 ret 235: 0000A2 0000 nop
236: 236: 0000A3 0000 nop
237: TOGGLE_POWER_LED: 237: 0000A4 F7C1 brne _dec_1
238: 0000A8 930F push r16 238: 0000A5 950A dec r16
239: 0000A9 931F push r17 239: 0000A6 F7A9 brne _l_1
240: 0000AA E400 ldi r16, (1<<LED_POWER_PIN) 240:
241: 0000AB B312 in r17, PORTD 241: ; ldi r16, 255
242: 0000AC 2710 eor r17, r16 242: ; _DELAY_3:
243: 0000AD BB12 out PORTD, r17 243: ; ldi r17, 255
244: 0000AE 911F pop r17 244: ; _DELAY_2:
245: 0000AF 910F pop r16 245: ; dec r17
246: 0000B0 9508 ret 246: ; brne _DELAY_2
247: 247: ; _DELAY_1:
248: DISPLAY_SYMBOLS: 248: ; dec r16
249: ; HGFEDCBA HGFEDCBA 249: ; brne _DELAY_3
250: .DB 0b11000000, 0b11111001 ; 0, 1 250:
0000B1 F9C0 251: 0000A7 911F pop r17
251: .DB 0b10100100, 0b10110000 ; 2, 3 252: 0000A8 910F pop r16
0000B2 B0A4 253: 0000A9 9508 ret
252: .DB 0b10011001, 0b10010010 ; 4, 5 254:
0000B3 9299 255: TOGGLE_POWER_LED:
253: .DB 0b10000010, 0b11111000 ; 6, 7 256: 0000AA 930F push r16
0000B4 F882 257: 0000AB 931F push r17
254: .DB 0b10000000, 0b10010000 ; 8, 9 258: 0000AC E400 ldi r16, (1<<LED_POWER_PIN)
0000B5 9080 259: 0000AD B312 in r17, PORTD
255: 260: 0000AE 2710 eor r17, r16
256: ; **** СЕГМЕНТ EEPROM ******************************************** 261: 0000AF BB12 out PORTD, r17
257: ; .ESEG 262: 0000B0 911F pop r17
258: ; INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023" 263: 0000B1 910F pop r16
264: 0000B2 9508 ret
265:
266: DISPLAY_SYMBOLS:
267: ; HGFEDCBA HGFEDCBA
268: .DB 0b11000000, 0b11111001 ; 0, 1
0000B3 F9C0
269: .DB 0b10100100, 0b10110000 ; 2, 3
0000B4 B0A4
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!
File: /home/sergeyyarkov/Documents/Projects/Firmwares/AVR/attiny2313a_thermostat/firmware.asm, Line: 273
Source line: .DB 0b10011100 ; °
0000B8 009C
274:
275: ; **** СЕГМЕНТ EEPROM ********************************************
276: ; .ESEG
277: ; 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
T 1 1 89 59 ATTINY2313A T 1 1 89 59 ATTINY2313A
L 1 0 96 60 MCU_STATE L 1 0 96 60 MCU_STATE
L 1 0 97 61 NUMBER L 1 1 97 61 SRAM_TEMP_1
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 19 13 RESET_DIGIT_IDX L 1 2 20 14 RESET_DIGIT_IDX
L 1 2 22 16 _INDICATE_1 L 1 2 23 17 _INDICATE_1
L 1 2 31 1F _INDICATE_2 L 1 2 33 21 _INDICATE_2
L 1 2 41 29 _INDICATE_3 L 1 2 43 2B _INDICATE_3
L 1 2 51 33 _INDICATE_4 L 1 2 53 35 _INDICATE_4
L 1 2 61 3D _INDICATE_EXIT L 1 2 63 3F _INDICATE_EXIT
L 1 2 65 41 RESET_VECT L 1 2 68 44 RESET_VECT
L 1 0 67 43 MCU_INIT L 1 0 70 46 MCU_INIT
L 1 2 88 58 DIV16U L 1 2 90 5A LOOP
L 1 4 91 5B D16U_1 L 1 2 95 5F DIV16U
L 1 2 96 60 D16U_2 L 1 4 98 62 D16U_1
L 1 2 105 69 D16U_3 L 1 2 103 67 D16U_2
L 1 8 107 6B USI_TRANSMIT L 1 2 112 70 D16U_3
L 1 2 111 6F _USI_TRANSMIT_LOOP L 1 8 114 72 USI_TRANSMIT
L 1 4 117 75 LOOP L 1 2 118 76 _USI_TRANSMIT_LOOP
L 1 0 117 75 GET_DIGITS L 1 2 124 7C DISPLAY_UPD_DIGITS
L 1 2 125 7D DIV_LOOP L 1 2 131 83 DIV_LOOP
L 1 8 147 93 DISPLAY_DECODER L 1 8 146 92 DISPLAY_DECODER
L 1 10 154 9A DELAY L 1 2 153 99 DELAY
L 1 2 157 9D _DELAY_1 L 1 2 156 9C _L_1
L 1 2 158 9E _DELAY_2 L 1 2 157 9D _DEC_1
L 1 2 168 A8 TOGGLE_POWER_LED L 1 2 170 AA TOGGLE_POWER_LED
L 1 4 177 B1 DISPLAY_SYMBOLS L 1 4 179 B3 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 1 23 17 DISP_NUM_H
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
@ -417,12 +460,12 @@ 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 20 14 NOW_D C 1 0 23 17 NOW_D
C 1 0 45036 AFEC NOW_I C 1 0 45039 AFEF NOW_I
C 1 5 2 02 DIGIT_1_PIN C 1 5 2 02 DIGIT_1_PIN
C 1 4 3 03 DIGIT_2_PIN C 1 5 3 03 DIGIT_2_PIN
C 1 4 4 04 DIGIT_3_PIN C 1 5 4 04 DIGIT_3_PIN
C 1 4 5 05 DIGIT_4_PIN C 1 5 5 05 DIGIT_4_PIN
C 1 2 6 06 LED_POWER_PIN C 1 2 6 06 LED_POWER_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
@ -430,15 +473,18 @@ Type nDef nUsed Decimalval Hexval Name
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
C 1 2 279 0117 DISPLAY_NUMBER C 1 6 97 61 DIVIDEND
C 1 6 96 60 DIVIDEND_ADDR
C 1 2 10 0A DIVISOR C 1 2 10 0A DIVISOR
No macros.
Program : 165 words. List of macros:
Constants : 5 words. nLines nUsed nParams Name
Total program memory: 170 words. 2 6 3 OUTI
2 1 1 DISPLAY_LOAD
Program : 167 words.
Constants : 6 words.
Total program memory: 173 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 20.04.2023, 00:25:25 Compilation ended 23.04.2023, 20:09:24

View File

@ -1,7 +1,7 @@
/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,122,33,48 file=firmware.lst,349,62,73
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