display digits

This commit is contained in:
Sergey Yarkov 2023-02-25 23:38:49 +03:00
parent f7c7e7d56e
commit 2855e84b11
No known key found for this signature in database
GPG Key ID: E91CE1FABC619B6F
8 changed files with 631 additions and 367 deletions

12
.gitignore vendored
View File

@ -1,11 +1 @@
CMakeLists.txt.user NOTES.md
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps

9
Makefile Normal file
View File

@ -0,0 +1,9 @@
SRC_FILE = firmware
MCU = t2313
PROGRAMMER = usbtiny
build:
avrasm2 -fI -W+ie $(SRC_FILE).asm -l $(SRC_FILE).lss
flash:
avrdude -c $(PROGRAMMER) -p $(MCU) -U flash:w:$(SRC_FILE).hex:i

0
README.md Normal file
View File

View File

@ -16,16 +16,34 @@
.DEF TEMP_REG_A = r16 .DEF TEMP_REG_A = r16
.DEF TEMP_REG_B = r17 .DEF TEMP_REG_B = r17
.DEF COUNTER = r20
;========================================; ;========================================;
; LABELS ; ; LABELS ;
;========================================; ;========================================;
.EQU LED_POWER_PORT = PD6 .EQU DIGIT_1_PIN = PD2
.EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595 .EQU DIGIT_2_PIN = PD3
.EQU USI_DO_PIN = PB6 ; DS on 74HC595 .EQU DIGIT_3_PIN = PD4
.EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595 .EQU DIGIT_4_PIN = PD5
.EQU LED_POWER_PIN = PD6
.EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595
.EQU USI_DO_PIN = PB6 ; DS on 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595
.EQU MCU_STATE_DEFAULT = 0x01 ; Temperature measurement and threshold comparison
.EQU MCU_STATE_PROGRAM = 0x02 ; Write settings of hysteresis into EEPROM
.EQU MCU_STATE_ERROR = 0x03 ; Cannot read data from temp sensor or something else
;========================================;
; DATA SEGMENT ;
;========================================;
.DSEG
.ORG SRAM_START
MCU_STATE: .BYTE 1
DISPLAY_DIGIT: .BYTE 4
;========================================; ;========================================;
; CODE SEGMENT ; ; CODE SEGMENT ;
@ -38,64 +56,87 @@
; VECTORS ; ; VECTORS ;
;========================================; ;========================================;
rjmp RESET_vect ; Program start at RESET vector rjmp RESET_vect ; Program start at RESET vector
;reti ; External Interrupt Request 0 / inactive ;reti ; External Interrupt Request 0 / inactive
;reti ; External Interrupt Request 1 / inactive ;reti ; External Interrupt Request 1 / inactive
;reti ; Timer/Counter1 Capture Event / inactive ;reti ; Timer/Counter1 Capture Event / inactive
;reti ; Timer/Counter1 Compare Match A / inactive ;reti ; Timer/Counter1 Compare Match A / inactive
;reti ; Timer/Counter1 Overflow / inactive ;reti ; Timer/Counter1 Overflow / inactive
;reti ; Timer/Counter0 Overflow / inactive ;reti ; Timer/Counter0 Overflow / inactive
;reti ; USART0, Rx Complete / inactive ;reti ; USART0, Rx Complete / inactive
;reti ; USART0 Data Register Empty / inactive ;reti ; USART0 Data Register Empty / inactive
;reti ; USART0, Tx Complete / inactive ;reti ; USART0, Tx Complete / inactive
;reti ; Analog Comparator / inactive ;reti ; Analog Comparator / inactive
;reti ; Pin Change Interrupt Request 0/ inactive ;reti ; Pin Change Interrupt Request 0/ inactive
;reti ; Timer/Counter1 Compare Match B / inactive ;reti ; Timer/Counter1 Compare Match B / inactive
;reti ; Timer/Counter0 Compare Match A / inactive ;reti ; Timer/Counter0 Compare Match A / inactive
;reti ; Timer/Counter0 Compare Match B / inactive ;reti ; Timer/Counter0 Compare Match B / inactive
;reti ; USI Start Condition/ inactive ;reti ; USI Start Condition/ inactive
;reti ; USI Overflow / inactive ;reti ; USI Overflow / inactive
;reti ; EEPROM Ready/ inactive ;reti ; EEPROM Ready/ inactive
;reti ; Watchdog Timer Overflow / inactive ;reti ; Watchdog Timer Overflow / inactive
;reti ; Pin Change Interrupt Request 1 / inactive ;reti ; Pin Change Interrupt Request 1 / inactive
;reti ; Pin Change Interrupt Request 2 / inactive ;reti ; Pin Change Interrupt Request 2 / inactive
RESET_vect: RESET_vect:
;========================================; ;========================================;
; INITIALIZE STACK POINTER ; ; INITIALIZE STACK POINTER ;
;========================================; ;========================================;
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:
;======================================================= ;=======================================================;
; POWER LED <------------> PD6 ; ; INITIALIZE PORTS ;
; - This LED is used to indicate that device ; ; ;
; is working correctly ; ; POWER LED <-------------> OUT PD6 ;
; ; ; - This LED is used to indicate that device ;
;======================================================= ; is working correctly ;
rcall INIT_PORTS ; 7SEG DIGIT 1 <-------------> OUT PD2 ;
ldi COUNTER, 0b00000001 ; 7SEG DIGIT 2 <-------------> OUT PD3 ;
rjmp LOOP ; 7SEG DIGIT 3 <-------------> OUT PD4 ;
; 7SEG DIGIT 4 <-------------> OUT PD5 ;
INIT_PORTS: ; ;
ldi r16, (1<<LED_POWER_PORT) ; USI CLOCK PIN <-------------> OUT PB0 ;
; USI DATA OUT PIN <-------------> OUT PB6 ;
; USI LATCH PIN <-------------> OUT PB7 ;
;=======================================================;
ldi r16, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN)
out DDRD, r16 out DDRD, r16
ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN) ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN)
out DDRB, r16 out DDRB, r16
ret ; sbi PORTD, PD2
; sbi PORTD, PD3
; sbi PORTD, PD4
; sbi PORTD, PD5
;========================================; ldi TEMP_REG_A, 4
; SEND BYTE TO 74HC595 ; sts DISPLAY_DIGIT, TEMP_REG_A
;========================================;
ldi TEMP_REG_A, 3
sts DISPLAY_DIGIT+1, TEMP_REG_A
ldi TEMP_REG_A, 2
sts DISPLAY_DIGIT+2, TEMP_REG_A
ldi TEMP_REG_A, 1
sts DISPLAY_DIGIT+3, TEMP_REG_A
clr r1
ldi ZL,LOW(2*DISPLAY_SYMBOLS)
ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
rjmp LOOP
;=START================================================================================================;
; Transmit byte into 74HC595 using USI
;======================================================================================================;
USI_TRANSMIT: USI_TRANSMIT:
mov r19, COUNTER out USIDR, r0 ; Move byte from temp register to USI Data Register
out USIDR, r19 ; Move byte into 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)
ldi r19, (1<<USIOIF) ldi TEMP_REG_A, (1<<USIOIF)
out USISR, r19 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)
@ -107,7 +148,7 @@ USI_TRANSMIT:
; USITC <--------------> USI Toggle Clock (Enable clock generation) ; USITC <--------------> USI Toggle Clock (Enable clock generation)
ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC) ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
_USI_TRANSMIT_LOOP: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
sbis USISR, USIOIF ; If transfer is comleted then move out of loop sbis USISR, USIOIF ; If transfer is comleted then move out of loop
rjmp _USI_TRANSMIT_LOOP rjmp _USI_TRANSMIT_LOOP
@ -117,11 +158,13 @@ USI_TRANSMIT:
sbi PORTB, USI_LATCH_PIN sbi PORTB, USI_LATCH_PIN
cbi PORTB, USI_LATCH_PIN cbi PORTB, USI_LATCH_PIN
ret ret
;=END==================================================================================================;
SUBPROGRAM_LED_SHIFTING: ; .MACRO DISPLAY_SEND
rcall USI_TRANSMIT ; ldi TEMP_REG_A, @0
rol COUNTER ; mov r0, TEMP_REG_A
ret ; rcall USI_TRANSMIT
; .ENDMACRO
;========================================; ;========================================;
; MAIN PROGRAM LOOP ; ; MAIN PROGRAM LOOP ;
@ -129,16 +172,55 @@ ret
LOOP: LOOP:
rcall TOGGLE_POWER_LED rcall TOGGLE_POWER_LED
rcall SUBPROGRAM_LED_SHIFTING rcall DISPLAY_INDICATE
rcall DELAY ; rcall USI_TRANSMIT
rcall DELAY
; ldi TEMP_REG_B, 10
; cp r1, TEMP_REG_B
; brge RESET_POINTER
; rjmp DISPLAY_SEND
; RESET_POINTER:
; clr r1
; ldi ZL,LOW(2*DISPLAY_SYMBOLS)
; ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
; DISPLAY_SEND:
; lpm
; adiw Z, 1
; inc r1
; rcall USI_TRANSMIT
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
rjmp LOOP rjmp LOOP
DISPLAY_INDICATE:
sbi PORTD, DIGIT_1_PIN
rcall DELAY
cbi PORTD, DIGIT_1_PIN
sbi PORTD, DIGIT_2_PIN
rcall DELAY
cbi PORTD, DIGIT_2_PIN
sbi PORTD, DIGIT_3_PIN
rcall DELAY
cbi PORTD, DIGIT_3_PIN
sbi PORTD, DIGIT_4_PIN
rcall DELAY
cbi PORTD, DIGIT_4_PIN
ret
DELAY: DELAY:
push r16 push r16
push r17 push r17
cli cli
ldi r16, 255 ldi r16, 100
_DELAY_1: _DELAY_1:
ldi r17, 255 ldi r17, 255
_DELAY_2: _DELAY_2:
@ -157,12 +239,19 @@ DELAY:
ret ret
TOGGLE_POWER_LED: TOGGLE_POWER_LED:
ldi r16, (1<<LED_POWER_PORT) ldi r16, (1<<LED_POWER_PIN)
in r17, PORTD in r17, PORTD
eor r17, r16 eor r17, r16
out PORTD, r17 out PORTD, r17
ret ret
DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA
.DB 0b11000000, 0b11111001 ; 0, 1
.DB 0b10100100, 0b10110000 ; 2, 3
.DB 0b10011001, 0b10010010 ; 4, 5
.DB 0b10000010, 0b11111000 ; 6, 7
.DB 0b10000000, 0b10010000 ; 8, 9
;========================================; ;========================================;
; EEPROM SEGMENT ; ; EEPROM SEGMENT ;

View File

@ -1,9 +1,11 @@
:020000020000FC :020000020000FC
:1000000000C00FED0DBF02D041E013C000E401BB02 :1000000000C00FED0DBF0CE701BB01EC07BB04E026
:1000100001EC07BB0895342F3FB930E43EB90BE142 :100010000093610003E00093620002E0009363003C
:100020000DB9769BFDCFC09AC0980895F4DF441FA8 :1000200001E0009364001124E6E8F0E00AC00FB894
:10003000089514D0FBDF02D001D0FBCF0F931F93A4 :1000300000E40EB90BE10DB9769BFDCFC09AC098D4
:10004000F8940FEF1FEF1A95000000000000D9F799 :1000400008951CD001D0FDCF929A08D09298939A2F
:100050000A95C1F778941F910F91089500E412B3A7 :1000500005D09398949A02D0949808950F931F9383
:06006000102712BB0895F9 :10006000F89404E61FEF1A95000000000000D9F78D
:100070000A95C1F778941F910F91089500E412B387
:10008000102712BB0895C0F9A4B0999282F880900D
:00000001FF :00000001FF

View File

@ -1,5 +1,5 @@
AVRASM ver. 2.2.7 firmware.asm Tue Jan 31 00:01:48 2023 AVRASM ver. 2.2.7 firmware.asm Sat Feb 25 23:36:49 2023
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc'
@ -720,16 +720,34 @@ firmware.asm(14): Including file 'tn2313Adef.inc'
.DEF TEMP_REG_A = r16 .DEF TEMP_REG_A = r16
.DEF TEMP_REG_B = r17 .DEF TEMP_REG_B = r17
.DEF COUNTER = r20
;========================================; ;========================================;
; LABELS ; ; LABELS ;
;========================================; ;========================================;
.EQU LED_POWER_PORT = PD6 .EQU DIGIT_1_PIN = PD2
.EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595 .EQU DIGIT_2_PIN = PD3
.EQU USI_DO_PIN = PB6 ; DS on 74HC595 .EQU DIGIT_3_PIN = PD4
.EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595 .EQU DIGIT_4_PIN = PD5
.EQU LED_POWER_PIN = PD6
.EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595
.EQU USI_DO_PIN = PB6 ; DS on 74HC595
.EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595
.EQU MCU_STATE_DEFAULT = 0x01 ; Temperature measurement and threshold comparison
.EQU MCU_STATE_PROGRAM = 0x02 ; Write settings of hysteresis into EEPROM
.EQU MCU_STATE_ERROR = 0x03 ; Cannot read data from temp sensor or something else
;========================================;
; DATA SEGMENT ;
;========================================;
.DSEG
.ORG SRAM_START
000060 MCU_STATE: .BYTE 1
000061 DISPLAY_DIGIT: .BYTE 4
;========================================; ;========================================;
; CODE SEGMENT ; ; CODE SEGMENT ;
@ -742,118 +760,202 @@ firmware.asm(14): Including file 'tn2313Adef.inc'
; VECTORS ; ; VECTORS ;
;========================================; ;========================================;
000000 c000 rjmp RESET_vect ; Program start at RESET vector 000000 c000 rjmp RESET_vect ; Program start at RESET vector
;reti ; External Interrupt Request 0 / inactive ;reti ; External Interrupt Request 0 / inactive
;reti ; External Interrupt Request 1 / inactive ;reti ; External Interrupt Request 1 / inactive
;reti ; Timer/Counter1 Capture Event / inactive ;reti ; Timer/Counter1 Capture Event / inactive
;reti ; Timer/Counter1 Compare Match A / inactive ;reti ; Timer/Counter1 Compare Match A / inactive
;reti ; Timer/Counter1 Overflow / inactive ;reti ; Timer/Counter1 Overflow / inactive
;reti ; Timer/Counter0 Overflow / inactive ;reti ; Timer/Counter0 Overflow / inactive
;reti ; USART0, Rx Complete / inactive ;reti ; USART0, Rx Complete / inactive
;reti ; USART0 Data Register Empty / inactive ;reti ; USART0 Data Register Empty / inactive
;reti ; USART0, Tx Complete / inactive ;reti ; USART0, Tx Complete / inactive
;reti ; Analog Comparator / inactive ;reti ; Analog Comparator / inactive
;reti ; Pin Change Interrupt Request 0/ inactive ;reti ; Pin Change Interrupt Request 0/ inactive
;reti ; Timer/Counter1 Compare Match B / inactive ;reti ; Timer/Counter1 Compare Match B / inactive
;reti ; Timer/Counter0 Compare Match A / inactive ;reti ; Timer/Counter0 Compare Match A / inactive
;reti ; Timer/Counter0 Compare Match B / inactive ;reti ; Timer/Counter0 Compare Match B / inactive
;reti ; USI Start Condition/ inactive ;reti ; USI Start Condition/ inactive
;reti ; USI Overflow / inactive ;reti ; USI Overflow / inactive
;reti ; EEPROM Ready/ inactive ;reti ; EEPROM Ready/ inactive
;reti ; Watchdog Timer Overflow / inactive ;reti ; Watchdog Timer Overflow / inactive
;reti ; Pin Change Interrupt Request 1 / inactive ;reti ; Pin Change Interrupt Request 1 / inactive
;reti ; Pin Change Interrupt Request 2 / inactive ;reti ; Pin Change Interrupt Request 2 / inactive
RESET_vect: RESET_vect:
;========================================; ;========================================;
; INITIALIZE STACK POINTER ; ; INITIALIZE STACK POINTER ;
;========================================; ;========================================;
000001 ed0f ldi TEMP_REG_A, low(RAMEND) 000001 ed0f ldi TEMP_REG_A, LOW(RAMEND)
000002 bf0d out SPL, TEMP_REG_A 000002 bf0d out SPL, TEMP_REG_A
MCU_INIT: MCU_INIT:
;======================================================= ;=======================================================;
; POWER LED <------------> PD6 ; ; INITIALIZE PORTS ;
; - This LED is used to indicate that device ; ; ;
; is working correctly ; ; POWER LED <-------------> OUT PD6 ;
; ; ; - This LED is used to indicate that device ;
;======================================================= ; is working correctly ;
000003 d002 rcall INIT_PORTS ; 7SEG DIGIT 1 <-------------> OUT PD2 ;
000004 e041 ldi COUNTER, 0b00000001 ; 7SEG DIGIT 2 <-------------> OUT PD3 ;
000005 c013 rjmp LOOP ; 7SEG DIGIT 3 <-------------> OUT PD4 ;
; 7SEG DIGIT 4 <-------------> OUT PD5 ;
; ;
; USI CLOCK PIN <-------------> OUT PB0 ;
; USI DATA OUT PIN <-------------> OUT PB6 ;
; USI LATCH PIN <-------------> OUT PB7 ;
;=======================================================;
000003 e70c ldi r16, (1<<LED_POWER_PIN) | (1<<DIGIT_1_PIN) | (1<<DIGIT_2_PIN) | (1<<DIGIT_3_PIN) | (1<<DIGIT_4_PIN)
000004 bb01 out DDRD, r16
000005 ec01 ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN)
000006 bb07 out DDRB, r16
; sbi PORTD, PD2
; sbi PORTD, PD3
; sbi PORTD, PD4
; sbi PORTD, PD5
INIT_PORTS: 000007 e004 ldi TEMP_REG_A, 4
000006 e400 ldi r16, (1<<LED_POWER_PORT) 000008 9300 0061 sts DISPLAY_DIGIT, TEMP_REG_A
000007 bb01 out DDRD, r16
000008 ec01 ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN)
000009 bb07 out DDRB, r16
00000a 9508 ret
;========================================;
; SEND BYTE TO 74HC595 ;
;========================================;
USI_TRANSMIT:
00000b 2f34 mov r19, COUNTER
00000c b93f out USIDR, r19
00000d e430 ldi r19, (1<<USIOIF)
00000e b93e out USISR, r19
00000f e10b ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
_USI_TRANSMIT_LOOP: 00000a e003 ldi TEMP_REG_A, 3
000010 b90d out USICR, TEMP_REG_A 00000b 9300 0062 sts DISPLAY_DIGIT+1, TEMP_REG_A
000011 9b76 sbis USISR, USIOIF
000012 cffd rjmp _USI_TRANSMIT_LOOP
000013 9ac0 sbi PORTB, USI_LATCH_PIN 00000d e002 ldi TEMP_REG_A, 2
000014 98c0 cbi PORTB, USI_LATCH_PIN 00000e 9300 0063 sts DISPLAY_DIGIT+2, TEMP_REG_A
000015 9508 ret
SUBPROGRAM_LED_SHIFTING: 000010 e001 ldi TEMP_REG_A, 1
000016 dff4 rcall USI_TRANSMIT 000011 9300 0064 sts DISPLAY_DIGIT+3, TEMP_REG_A
000017 1f44 rol COUNTER
000018 9508 ret 000013 2411 clr r1
000014 e8e6 ldi ZL,LOW(2*DISPLAY_SYMBOLS)
000015 e0f0 ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
000016 c00a rjmp LOOP
;=START================================================================================================;
; Transmit byte into 74HC595 using USI
;======================================================================================================;
USI_TRANSMIT:
000017 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)
000018 e400 ldi TEMP_REG_A, (1<<USIOIF)
000019 b90e out USISR, TEMP_REG_A
; Load settings of USI into temp register
; This will setup USI to Three-wire mode, Software clock strobe (USITC)
; with External, positive edge and toggle USCK
;
; USIWM0 <--------------> USI Wire Mode
; USICS1 <--------------> USI Clock Source Select
; USICLK <--------------> USI Clock Strobe
; USITC <--------------> USI Toggle Clock (Enable clock generation)
00001a e10b ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
_USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
00001b b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
00001c 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
00001d cffd rjmp _USI_TRANSMIT_LOOP
; Send pulse into LATCH pin.
; This will copy byte from 74hc595 shift register into 74hc595 storage register
00001e 9ac0 sbi PORTB, USI_LATCH_PIN
00001f 98c0 cbi PORTB, USI_LATCH_PIN
000020 9508 ret
;=END==================================================================================================;
; .MACRO DISPLAY_SEND
; ldi TEMP_REG_A, @0
; mov r0, TEMP_REG_A
; rcall USI_TRANSMIT
; .ENDMACRO
;========================================; ;========================================;
; MAIN PROGRAM LOOP ; ; MAIN PROGRAM LOOP ;
;========================================; ;========================================;
LOOP: LOOP:
000019 d014 rcall TOGGLE_POWER_LED 000021 d01c rcall TOGGLE_POWER_LED
00001a dffb rcall SUBPROGRAM_LED_SHIFTING 000022 d001 rcall DISPLAY_INDICATE
00001b d002 rcall DELAY ; rcall USI_TRANSMIT
00001c d001 rcall DELAY
00001d cffb rjmp LOOP ; ldi TEMP_REG_B, 10
; cp r1, TEMP_REG_B
; brge RESET_POINTER
; rjmp DISPLAY_SEND
; RESET_POINTER:
; clr r1
; ldi ZL,LOW(2*DISPLAY_SYMBOLS)
; ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
; DISPLAY_SEND:
; lpm
; adiw Z, 1
; inc r1
; rcall USI_TRANSMIT
; rcall DELAY
; rcall DELAY
; rcall DELAY
; rcall DELAY
000023 cffd rjmp LOOP
DISPLAY_INDICATE:
000024 9a92 sbi PORTD, DIGIT_1_PIN
000025 d008 rcall DELAY
000026 9892 cbi PORTD, DIGIT_1_PIN
000027 9a93 sbi PORTD, DIGIT_2_PIN
000028 d005 rcall DELAY
000029 9893 cbi PORTD, DIGIT_2_PIN
00002a 9a94 sbi PORTD, DIGIT_3_PIN
00002b d002 rcall DELAY
00002c 9894 cbi PORTD, DIGIT_3_PIN
; sbi PORTD, DIGIT_4_PIN
; rcall DELAY
; cbi PORTD, DIGIT_4_PIN
00002d 9508 ret
DELAY: DELAY:
00001e 930f push r16 00002e 930f push r16
00001f 931f push r17 00002f 931f push r17
000020 94f8 cli 000030 94f8 cli
000021 ef0f ldi r16, 255 000031 e604 ldi r16, 100
_DELAY_1: _DELAY_1:
000022 ef1f ldi r17, 255 000032 ef1f ldi r17, 255
_DELAY_2: _DELAY_2:
000023 951a dec r17 000033 951a dec r17
000024 0000 nop 000034 0000 nop
000025 0000 nop 000035 0000 nop
000026 0000 nop 000036 0000 nop
000027 f7d9 brne _DELAY_2 000037 f7d9 brne _DELAY_2
000028 950a dec r16 000038 950a dec r16
000029 f7c1 brne _DELAY_1 000039 f7c1 brne _DELAY_1
00002a 9478 sei 00003a 9478 sei
00002b 911f pop r17 00003b 911f pop r17
00002c 910f pop r16 00003c 910f pop r16
00002d 9508 ret 00003d 9508 ret
TOGGLE_POWER_LED: TOGGLE_POWER_LED:
00002e e400 ldi r16, (1<<LED_POWER_PORT) 00003e e400 ldi r16, (1<<LED_POWER_PIN)
00002f b312 in r17, PORTD 00003f b312 in r17, PORTD
000030 2710 eor r17, r16 000040 2710 eor r17, r16
000031 bb12 out PORTD, r17 000041 bb12 out PORTD, r17
000032 9508 ret 000042 9508 ret
DISPLAY_SYMBOLS:
; HGFEDCBA HGFEDCBA
000043 f9c0 .DB 0b11000000, 0b11111001 ; 0, 1
000044 b0a4 .DB 0b10100100, 0b10110000 ; 2, 3
000045 9299 .DB 0b10011001, 0b10010010 ; 4, 5
000046 f882 .DB 0b10000010, 0b11111000 ; 6, 7
000047 9080 .DB 0b10000000, 0b10010000 ; 8, 9
;========================================; ;========================================;
; EEPROM SEGMENT ; ; EEPROM SEGMENT ;
@ -927,12 +1029,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 : 0 y : 0 z : 0 r0 : 0 r1 : 0 r2 : 0 r3 : 0 r4 : 0 x : 0 y : 0 z : 0 r0 : 1 r1 : 1 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: 0 r15: 0 r16: 14 r17: 7 r18: 0 r19: 4 r20: 3 r13: 0 r14: 0 r15: 0 r16: 24 r17: 7 r18: 0 r19: 0 r20: 0
r21: 0 r22: 0 r23: 0 r24: 0 r25: 0 r26: 0 r27: 0 r28: 0 r21: 0 r22: 0 r23: 0 r24: 0 r25: 0 r26: 0 r27: 0 r28: 0
r29: 0 r30: 0 r31: 0 r29: 0 r30: 1 r31: 1
Registers used: 4 out of 35 (11.4%) Registers used: 6 out of 35 (17.1%)
"ATtiny2313A" instruction use summary: "ATtiny2313A" instruction use summary:
.lds : 0 .sts : 0 adc : 0 add : 0 adiw : 0 and : 0 .lds : 0 .sts : 0 adc : 0 add : 0 adiw : 0 and : 0
@ -940,26 +1042,26 @@ andi : 0 asr : 0 bclr : 0 bld : 0 brbc : 0 brbs : 0
brcc : 0 brcs : 0 break : 0 breq : 0 brge : 0 brhc : 0 brcc : 0 brcs : 0 break : 0 breq : 0 brge : 0 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 : 2 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 brne : 2 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
brvs : 0 bset : 0 bst : 0 cbi : 1 cbr : 0 clc : 0 brvs : 0 bset : 0 bst : 0 cbi : 4 cbr : 0 clc : 0
clh : 0 cli : 1 cln : 0 clr : 0 cls : 0 clt : 0 clh : 0 cli : 1 cln : 0 clr : 1 cls : 0 clt : 0
clv : 0 clz : 0 com : 0 cp : 0 cpc : 0 cpi : 0 clv : 0 clz : 0 com : 0 cp : 0 cpc : 0 cpi : 0
cpse : 0 dec : 2 eor : 1 icall : 0 ijmp : 0 in : 1 cpse : 0 dec : 2 eor : 1 icall : 0 ijmp : 0 in : 1
inc : 0 ld : 0 ldd : 0 ldi : 9 lds : 0 lpm : 0 inc : 0 ld : 0 ldd : 0 ldi : 14 lds : 0 lpm : 0
lsl : 0 lsr : 0 mov : 1 movw : 0 neg : 0 nop : 3 lsl : 0 lsr : 0 mov : 0 movw : 0 neg : 0 nop : 3
or : 0 ori : 0 out : 7 pop : 2 push : 2 rcall : 6 or : 0 ori : 0 out : 7 pop : 2 push : 2 rcall : 5
ret : 5 reti : 0 rjmp : 4 rol : 1 ror : 0 sbc : 0 ret : 4 reti : 0 rjmp : 4 rol : 0 ror : 0 sbc : 0
sbci : 0 sbi : 1 sbic : 0 sbis : 1 sbiw : 0 sbr : 0 sbci : 0 sbi : 4 sbic : 0 sbis : 1 sbiw : 0 sbr : 0
sbrc : 0 sbrs : 0 sec : 0 seh : 0 sei : 1 sen : 0 sbrc : 0 sbrs : 0 sec : 0 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 : 0 std : 0 sts : 0 sub : 0 subi : 0 spm : 0 st : 0 std : 0 sts : 4 sub : 0 subi : 0
swap : 0 tst : 0 wdr : 0 swap : 0 tst : 0 wdr : 0
Instructions used: 19 out of 105 (18.1%) Instructions used: 19 out of 105 (18.1%)
"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 0x000066 102 0 102 2048 5.0% [.cseg] 0x000000 0x000090 134 10 144 2048 7.0%
[.dseg] 0x000060 0x000060 0 0 0 128 0.0% [.dseg] 0x000060 0x000065 0 5 5 128 3.9%
[.eseg] 0x000000 0x000033 0 51 51 128 39.8% [.eseg] 0x000000 0x000033 0 51 51 128 39.8%
Assembly complete, 0 errors, 0 warnings Assembly complete, 0 errors, 0 warnings

View File

@ -5,7 +5,7 @@ Path: /home/sergeyyarkov/Documents/Applications/attiny2313a_thermostat/
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: 28.01.2023, 02:47:03 Compiled: 25.02.2023, 10:41:03
Pass: 2 Pass: 2
1: ; 1: ;
@ -16,8 +16,8 @@ Pass: 2
6: ; Device Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/doc8246.pdf 6: ; Device Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/doc8246.pdf
7: ; Package: SOIC-20W_7.5x12.8mm_P1.27mm 7: ; Package: SOIC-20W_7.5x12.8mm_P1.27mm
8: ; Assembler: AVR macro assembler 2.2.7 8: ; Assembler: AVR macro assembler 2.2.7
9: ; Clock frequency: 12 MHz External Crystal Oscillator 9: ; Clock frequency: 8 MHz External Crystal Oscillator
10: ; Fuses: lfuse: 0x4F, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF 10: ; Fuses: lfuse: 0xCF, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF
11: ; 11: ;
12: ; Written by Sergey Yarkov 22.01.2023 12: ; Written by Sergey Yarkov 22.01.2023
13: 13:
@ -27,164 +27,235 @@ Pass: 2
Source line: .INCLUDE "tn2313Adef.inc" Source line: .INCLUDE "tn2313Adef.inc"
15: .LIST 15: .LIST
16: 16:
17: .DEF tmp_r_a = r16 17: .DEF TEMP_REG_A = r16
18: .DEF COUNTER = r20 18: .DEF TEMP_REG_B = r17
19: 19:
20: ;========================================; 20: ;========================================;
21: ; LABELS ; 21: ; LABELS ;
22: ;========================================; 22: ;========================================;
23: 23:
24: .EQU LED_POWER_PORT = PD6 24: .EQU DISPLAY_1_PIN = PD2
25: .EQU CLOCK_PIN = PB0 ; ST_CP on 74HC595 25: .EQU DISPLAY_2_PIN = PD3
26: .EQU LATCH_PIN = PB1 ; SH_CP on 74HC595 26: .EQU DISPLAY_3_PIN = PD4
27: .EQU DATA_PIN = PB2 ; DS on 74HC595 27: .EQU DISPLAY_4_PIN = PD5
28: 28:
29: ;========================================; 29: .EQU LED_POWER_PIN = PD6
30: ; CODE SEGMENT ; 30:
31: ;========================================; 31: .EQU USI_LATCH_PIN = PB0 ; ST_CP on 74HC595
32: 32: .EQU USI_DO_PIN = PB6 ; DS on 74HC595
33: .CSEG 33: .EQU USI_CLK_PIN = PB7 ; SH_CP on 74HC595
34: .ORG 0x00 34:
35: 35: ;========================================;
36: ;========================================; 36: ; DATA SEGMENT ;
37: ; VECTORS ; 37: ;========================================;
38: ;========================================; 38: .DSEG
39: 39: .ORG SRAM_START
40: 000000 C000 rjmp RESET_vect ; Program start at RESET vector 40:
41: ;reti ; External Interrupt Request 0 / inactive 41: DISPLAY_DIGIT: .BYTE 4
42: ;reti ; External Interrupt Request 1 / inactive 42:
43: ;reti ; Timer/Counter1 Capture Event / inactive 43: ;========================================;
44: ;reti ; Timer/Counter1 Compare Match A / inactive 44: ; CODE SEGMENT ;
45: ;reti ; Timer/Counter1 Overflow / inactive 45: ;========================================;
46: ;reti ; Timer/Counter0 Overflow / inactive 46:
47: ;reti ; USART0, Rx Complete / inactive 47: .CSEG
48: ;reti ; USART0 Data Register Empty / inactive 48: .ORG 0x00
49: ;reti ; USART0, Tx Complete / inactive 49:
50: ;reti ; Analog Comparator / inactive 50: ;========================================;
51: ;reti ; Pin Change Interrupt Request 0/ inactive 51: ; VECTORS ;
52: ;reti ; Timer/Counter1 Compare Match B / inactive 52: ;========================================;
53: ;reti ; Timer/Counter0 Compare Match A / inactive 53:
54: ;reti ; Timer/Counter0 Compare Match B / inactive 54: 000000 C000 rjmp RESET_vect ; Program start at RESET vector
55: ;reti ; USI Start Condition/ inactive 55: ;reti ; External Interrupt Request 0 / inactive
56: ;reti ; USI Overflow / inactive 56: ;reti ; External Interrupt Request 1 / inactive
57: ;reti ; EEPROM Ready/ inactive 57: ;reti ; Timer/Counter1 Capture Event / inactive
58: ;reti ; Watchdog Timer Overflow / inactive 58: ;reti ; Timer/Counter1 Compare Match A / inactive
59: ;reti ; Pin Change Interrupt Request 1 / inactive 59: ;reti ; Timer/Counter1 Overflow / inactive
60: ;reti ; Pin Change Interrupt Request 2 / inactive 60: ;reti ; Timer/Counter0 Overflow / inactive
61: 61: ;reti ; USART0, Rx Complete / inactive
62: RESET_vect: 62: ;reti ; USART0 Data Register Empty / inactive
63: ;========================================; 63: ;reti ; USART0, Tx Complete / inactive
64: ; INITIALIZE STACK POINTER ; 64: ;reti ; Analog Comparator / inactive
65: ;========================================; 65: ;reti ; Pin Change Interrupt Request 0/ inactive
66: 000001 ED0F ldi tmp_r_a, low(RAMEND) 66: ;reti ; Timer/Counter1 Compare Match B / inactive
67: 000002 BF0D out SPL, tmp_r_a 67: ;reti ; Timer/Counter0 Compare Match A / inactive
68: 68: ;reti ; Timer/Counter0 Compare Match B / inactive
69: MCU_INIT: 69: ;reti ; USI Start Condition/ inactive
70: ;======================================================= 70: ;reti ; USI Overflow / inactive
71: ; POWER LED <------------> PD6 ; 71: ;reti ; EEPROM Ready/ inactive
72: ; - This LED is used to indicate that device ; 72: ;reti ; Watchdog Timer Overflow / inactive
73: ; is working correctly ; 73: ;reti ; Pin Change Interrupt Request 1 / inactive
74: ; ; 74: ;reti ; Pin Change Interrupt Request 2 / inactive
75: ;======================================================= 75:
76: 000003 D002 rcall INIT_PORTS 76: RESET_vect:
77: 77: ;========================================;
78: ;========================================; 78: ; INITIALIZE STACK POINTER ;
79: ; USI IS USED TO COMMUNICATE ; 79: ;========================================;
80: ; WITH SHIFT REGISTER (74HC595N) ; 80: 000001 ED0F ldi TEMP_REG_A, LOW(RAMEND)
81: ;========================================; 81: 000002 BF0D out SPL, TEMP_REG_A
82: 000004 D006 rcall INIT_USI 82:
83: 83: MCU_INIT:
84: 000005 C01D rjmp LOOP 84: ;=======================================================;
85: 85: ; INITIALIZE PORTS ;
86: INIT_PORTS: 86: ; ;
87: 000006 E400 ldi r16, (1<<LED_POWER_PORT) 87: ; POWER LED <-------------> OUT PD6 ;
88: 000007 BB01 out DDRD, r16 88: ; - This LED is used to indicate that device ;
89: 000008 E007 ldi r16, (1<<CLOCK_PIN) | (1<<LATCH_PIN) | (1<<DATA_PIN) 89: ; is working correctly ;
90: 000009 BB07 out DDRB, r16 90: ; 7SEG DIGIT 1 <-------------> OUT PD2 ;
91: 00000A 9508 ret 91: ; 7SEG DIGIT 2 <-------------> OUT PD3 ;
92: 92: ; 7SEG DIGIT 3 <-------------> OUT PD4 ;
93: INIT_USI: 93: ; 7SEG DIGIT 4 <-------------> OUT PD5 ;
94: 94: ; ;
95: 00000B 9508 ret 95: ; USI CLOCK PIN <-------------> OUT PB0 ;
96: 96: ; USI DATA OUT PIN <-------------> OUT PB6 ;
97: CLOCK_595: 97: ; USI LATCH PIN <-------------> OUT PB7 ;
98: 00000C 930F push r16 98: ;=======================================================;
99: 00000D E001 ldi r16, (1<<CLOCK_PIN) 99: 000003 E70C ldi r16, (1<<LED_POWER_PIN) | (1<<DISPLAY_1_PIN) | (1<<DISPLAY_2_PIN) | (1<<DISPLAY_3_PIN) | (1<<DISPLAY_4_PIN)
100: 00000E B318 in r17, PORTB 100: 000004 BB01 out DDRD, r16
101: 00000F 2710 eor r17, r16 101: 000005 EC01 ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN)
102: 000010 BB18 out PORTB, r17 102: 000006 BB07 out DDRB, r16
103: 000011 910F pop r16 103: 000007 9A92 sbi PORTD, PD2
104: 000012 9508 ret 104: 000008 9A93 sbi PORTD, PD3
105: 105: 000009 9A94 sbi PORTD, PD4
106: TRANSMIT_595: 106: 00000A 9A95 sbi PORTD, PD5
107: 000013 933F push r19 107:
108: 000014 E23A ldi r19, 0b00101010 ; Data to transmit 108: 00000B E004 ldi TEMP_REG_A, 4
109: 000015 E008 ldi r16, 8 109: 00000C 9300 sts DISPLAY_DIGIT, TEMP_REG_A
110: _TRANSMIT_595_LOOP: 00000D 0060
111: 000016 0F33 lsl r19 110:
112: 000017 F410 brcc _TRANSMIT_595_SEND_LOW 111: 00000E E003 ldi TEMP_REG_A, 3
113: 000018 F000 brcs _TRANSMIT_595_SEND_HIGH 112: 00000F 9300 sts DISPLAY_DIGIT+1, TEMP_REG_A
114: 000010 0061
115: _TRANSMIT_595_SEND_HIGH: 113:
116: 000019 C000 rjmp _TRANSMIT_595_PROCEED 114: 000011 E002 ldi TEMP_REG_A, 2
117: 115: 000012 9300 sts DISPLAY_DIGIT+2, TEMP_REG_A
118: 000013 0062
119: _TRANSMIT_595_SEND_LOW: 116:
120: 117: 000014 E001 ldi TEMP_REG_A, 1
121: _TRANSMIT_595_PROCEED: 118: 000015 9300 sts DISPLAY_DIGIT+3, TEMP_REG_A
122: 00001A DFF1 rcall CLOCK_595 000016 0063
123: 00001B DFF0 rcall CLOCK_595 119:
124: 00001C 950A dec r16 120: 000017 2411 clr r1
125: 00001D F7C1 brne _TRANSMIT_595_LOOP 121: 000018 E9E6 ldi ZL,LOW(2*DISPLAY_SYMBOLS)
126: 00001E 913F pop r19 122: 000019 E0F0 ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
127: 00001F 9508 ret 123:
128: 124: 00001A C00A rjmp LOOP
129: SUBPROGRAM_LED_SHIFTING: 125:
130: 000020 9543 inc COUNTER 126: ;=START================================================================================================;
131: 000021 DFF1 rcall TRANSMIT_595 127: ; Transmit byte into 74HC595 using USI
132: 000022 9508 ret 128: ;======================================================================================================;
133: 129: USI_TRANSMIT:
134: ;========================================; 130: 00001B B80F out USIDR, r0 ; Move byte from temp register to USI Data Register
135: ; MAIN PROGRAM LOOP ; 131:
136: ;========================================; 132: ; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
137: 133: 00001C E400 ldi TEMP_REG_A, (1<<USIOIF)
138: LOOP: 134: 00001D B90E out USISR, TEMP_REG_A
139: 000023 D00F rcall TOGGLE_POWER_LED 135:
140: 000024 DFFB rcall SUBPROGRAM_LED_SHIFTING 136: ; Load settings of USI into temp register
141: 000025 D001 rcall DELAY 137: ; This will setup USI to Three-wire mode, Software clock strobe (USITC)
142: 000026 CFFC rjmp LOOP 138: ; with External, positive edge and toggle USCK
143: 139: ;
144: DELAY: 140: ; USIWM0 <--------------> USI Wire Mode
145: 000027 94F8 cli 141: ; USICS1 <--------------> USI Clock Source Select
146: 000028 E00A ldi r16, 10 ; 1 142: ; USICLK <--------------> USI Clock Strobe
147: _DELAY_1: 143: ; USITC <--------------> USI Toggle Clock (Enable clock generation)
148: 000029 EF1F ldi r17, 255 ; 1 144: 00001E E10B ldi TEMP_REG_A, (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC)
149: _DELAY_2: 145:
150: 00002A 951A dec r17 ; 1 146: _USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
151: 00002B 0000 nop ; 1 147: 00001F B90D out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
152: 00002C 0000 nop ; 1 148: 000020 9B76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
153: 00002D 0000 nop ; 1 149: 000021 CFFD rjmp _USI_TRANSMIT_LOOP
154: 00002E F7D9 brne _DELAY_2 ; 2/1 150:
155: 151: ; Send pulse into LATCH pin.
156: 00002F 950A dec r16 152: ; This will copy byte from 74hc595 shift register into 74hc595 storage register
157: 000030 F7C1 brne _DELAY_1 ; 2/1 153: 000022 9AC0 sbi PORTB, USI_LATCH_PIN
158: 000031 9478 sei 154: 000023 98C0 cbi PORTB, USI_LATCH_PIN
159: 000032 9508 ret ; 4 155: 000024 9508 ret
160: 156: ;=END==================================================================================================;
161: TOGGLE_POWER_LED: 157:
162: 000033 E400 ldi r16, (1<<LED_POWER_PORT) 158: ; .MACRO DISPLAY_SEND
163: 000034 B312 in r17, PORTD 159: ; ldi TEMP_REG_A, @0
164: 000035 2710 eor r17, r16 160: ; mov r0, TEMP_REG_A
165: 000036 BB12 out PORTD, r17 161: ; rcall USI_TRANSMIT
166: 000037 9508 ret 162: ; .ENDMACRO
163:
164: ;========================================;
165: ; MAIN PROGRAM LOOP ;
166: ;========================================;
167: 167:
168: 168: LOOP:
169: ;========================================; 169: 000025 D020 rcall TOGGLE_POWER_LED
170: ; EEPROM SEGMENT ; 170:
171: ;========================================; 171: 000026 E01A ldi TEMP_REG_B, 10
172: 172: 000027 1611 cp r1, TEMP_REG_B
173: .ESEG 173: 000028 F40C brge RESET_POINTER
174: INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023" 174: 000029 C003 rjmp DISPLAY_SEND
175:
176: RESET_POINTER:
177: 00002A 2411 clr r1
178: 00002B E9E6 ldi ZL,LOW(2*DISPLAY_SYMBOLS)
179: 00002C E0F0 ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
180:
181: DISPLAY_SEND:
182: 00002D 9005 lpm r0, Z+
183: 00002E 9413 inc r1
184: 00002F DFEB rcall USI_TRANSMIT
185:
186: 000030 D005 rcall DELAY
187: 000031 D004 rcall DELAY
188: 000032 D003 rcall DELAY
189: 000033 D002 rcall DELAY
190: 000034 D001 rcall DELAY
191:
192: 000035 CFEF rjmp LOOP
193:
194: DELAY:
195: 000036 930F push r16
196: 000037 931F push r17
197: 000038 94F8 cli
198: 000039 EF0F ldi r16, 255
199: _DELAY_1:
200: 00003A EF1F ldi r17, 255
201: _DELAY_2:
202: 00003B 951A dec r17
203: 00003C 0000 nop
204: 00003D 0000 nop
205: 00003E 0000 nop
206: 00003F F7D9 brne _DELAY_2
207:
208: 000040 950A dec r16
209: 000041 F7C1 brne _DELAY_1
210: 000042 9478 sei
211:
212: 000043 911F pop r17
213: 000044 910F pop r16
214: 000045 9508 ret
215:
216: TOGGLE_POWER_LED:
217: 000046 E400 ldi r16, (1<<LED_POWER_PIN)
218: 000047 B312 in r17, PORTD
219: 000048 2710 eor r17, r16
220: 000049 BB12 out PORTD, r17
221: 00004A 9508 ret
222:
223: DISPLAY_SYMBOLS:
224: ; HGFEDCBA HGFEDCBA
225: .DB 0b11000000, 0b11111001 ; 0, 1
00004B F9C0
226: .DB 0b10100100, 0b10110000 ; 2, 3
00004C B0A4
227: .DB 0b10011001, 0b10010010 ; 4, 5
00004D 9299
228: .DB 0b10000010, 0b11111000 ; 6, 7
00004E F882
229: .DB 0b10000000, 0b10010000 ; 8, 9
00004F 9080
230:
231: ;========================================;
232: ; EEPROM SEGMENT ;
233: ;========================================;
234:
235: .ESEG
236: INFO: .DB "AVR Thermostat. Written by Sergey Yarkov 22.01.2023"
000000 41 56 52 20 54 48 45 52 000000 41 56 52 20 54 48 45 52
000008 4D 4F 53 54 41 54 2E 20 000008 4D 4F 53 54 41 54 2E 20
000010 57 52 49 54 54 45 4E 20 000010 57 52 49 54 54 45 4E 20
@ -196,39 +267,40 @@ Pass: 2
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 4 96 60 DISPLAY_DIGIT
L 1 2 1 01 RESET_VECT L 1 2 1 01 RESET_VECT
L 1 0 3 03 MCU_INIT L 1 0 3 03 MCU_INIT
L 1 2 6 06 INIT_PORTS L 1 2 27 1B USI_TRANSMIT
L 1 2 11 0B INIT_USI L 1 2 31 1F _USI_TRANSMIT_LOOP
L 1 4 12 0C CLOCK_595 L 1 4 37 25 LOOP
L 1 2 19 13 TRANSMIT_595 L 1 2 42 2A RESET_POINTER
L 1 2 22 16 _TRANSMIT_595_LOOP L 1 2 45 2D DISPLAY_SEND
L 1 2 25 19 _TRANSMIT_595_SEND_HIGH L 1 10 54 36 DELAY
L 1 2 26 1A _TRANSMIT_595_SEND_LOW L 1 2 58 3A _DELAY_1
L 1 2 26 1A _TRANSMIT_595_PROCEED L 1 2 59 3B _DELAY_2
L 1 2 32 20 SUBPROGRAM_LED_SHIFTING L 1 2 70 46 TOGGLE_POWER_LED
L 1 4 35 23 LOOP L 1 4 75 4B DISPLAY_SYMBOLS
L 1 2 39 27 DELAY
L 1 2 41 29 _DELAY_1
L 1 2 42 2A _DELAY_2
L 1 2 51 33 TOGGLE_POWER_LED
L 1 0 0 00 INFO L 1 0 0 00 INFO
R 1 2 16 10 TMP_R_A R 1 14 16 10 TEMP_REG_A
R 1 1 20 14 COUNTER R 1 2 17 11 TEMP_REG_B
C 1 0 23 17 NOW_Y C 1 0 23 17 NOW_Y
C 1 0 1 01 NOW_M C 1 0 2 02 NOW_M
C 1 0 28 1C NOW_D C 1 0 25 19 NOW_D
C 1 0 44954 AF9A NOW_I C 1 0 44982 AFB6 NOW_I
C 1 2 6 06 LED_POWER_PORT C 1 1 2 02 DISPLAY_1_PIN
C 1 2 0 00 CLOCK_PIN C 1 1 3 03 DISPLAY_2_PIN
C 1 1 1 01 LATCH_PIN C 1 1 4 04 DISPLAY_3_PIN
C 1 1 2 02 DATA_PIN C 1 1 5 05 DISPLAY_4_PIN
C 1 2 6 06 LED_POWER_PIN
C 1 3 0 00 USI_LATCH_PIN
C 1 1 6 06 USI_DO_PIN
C 1 1 7 07 USI_CLK_PIN
No macros. No macros.
Program : 56 words. Program : 75 words.
Constants : 0 words. Constants : 5 words.
Total program memory: 56 words. Total program memory: 80 words.
Eeprom space : 51 bytes. Eeprom space : 51 bytes.
Data segment : 0 bytes. Data segment : 4 bytes.
Compilation completed, no errors. Compilation completed, no errors.
Compilation ended 28.01.2023, 02:47:03 Compilation ended 25.02.2023, 10:41:03

View File

@ -1,10 +1,10 @@
/avr_sim_project_file /avr_sim_project_file
/home/sergeyyarkov/Documents/Applications/attiny2313a_thermostat/firmware.asm /home/sergeyyarkov/Documents/Applications/attiny2313a_thermostat/firmware.asm
mainasm=firmware.asm mainasm=firmware.asm
file=firmware.lst,120,20,63 file=firmware.lst,173,1,1
file=firmware.asm,1,1,1 file=firmware.asm,1,1,1
clock=12000000, Div8 clock=1000000, Div8
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