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
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
NOTES.md

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,17 +16,35 @@
.DEF TEMP_REG_A = r16
.DEF TEMP_REG_B = r17
.DEF COUNTER = r20
;========================================;
; LABELS ;
;========================================;
.EQU LED_POWER_PORT = PD6
.EQU DIGIT_1_PIN = PD2
.EQU DIGIT_2_PIN = PD3
.EQU DIGIT_3_PIN = PD4
.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 ;
;========================================;
@ -64,38 +82,61 @@ RESET_vect:
;========================================;
; INITIALIZE STACK POINTER ;
;========================================;
ldi TEMP_REG_A, low(RAMEND)
ldi TEMP_REG_A, LOW(RAMEND)
out SPL, TEMP_REG_A
MCU_INIT:
;=======================================================
; POWER LED <------------> PD6 ;
;=======================================================;
; INITIALIZE PORTS ;
; ;
; POWER LED <-------------> OUT PD6 ;
; - This LED is used to indicate that device ;
; is working correctly ;
; 7SEG DIGIT 1 <-------------> OUT PD2 ;
; 7SEG DIGIT 2 <-------------> OUT PD3 ;
; 7SEG DIGIT 3 <-------------> OUT PD4 ;
; 7SEG DIGIT 4 <-------------> OUT PD5 ;
; ;
;=======================================================
rcall INIT_PORTS
ldi COUNTER, 0b00000001
rjmp LOOP
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
ldi r16, (1<<USI_CLK_PIN) | (1<<USI_DO_PIN) | (1<<USI_LATCH_PIN)
out DDRB, r16
ret
; sbi PORTD, PD2
; sbi PORTD, PD3
; sbi PORTD, PD4
; sbi PORTD, PD5
;========================================;
; SEND BYTE TO 74HC595 ;
;========================================;
ldi TEMP_REG_A, 4
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:
mov r19, COUNTER
out USIDR, r19 ; Move byte into USI Data Register
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)
ldi r19, (1<<USIOIF)
out USISR, r19
ldi TEMP_REG_A, (1<<USIOIF)
out USISR, TEMP_REG_A
; Load settings of USI into temp register
; 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)
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
sbis USISR, USIOIF ; If transfer is comleted then move out of loop
rjmp _USI_TRANSMIT_LOOP
@ -117,11 +158,13 @@ USI_TRANSMIT:
sbi PORTB, USI_LATCH_PIN
cbi PORTB, USI_LATCH_PIN
ret
;=END==================================================================================================;
SUBPROGRAM_LED_SHIFTING:
rcall USI_TRANSMIT
rol COUNTER
ret
; .MACRO DISPLAY_SEND
; ldi TEMP_REG_A, @0
; mov r0, TEMP_REG_A
; rcall USI_TRANSMIT
; .ENDMACRO
;========================================;
; MAIN PROGRAM LOOP ;
@ -129,16 +172,55 @@ ret
LOOP:
rcall TOGGLE_POWER_LED
rcall SUBPROGRAM_LED_SHIFTING
rcall DELAY
rcall DELAY
rcall DISPLAY_INDICATE
; rcall USI_TRANSMIT
; 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
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:
push r16
push r17
cli
ldi r16, 255
ldi r16, 100
_DELAY_1:
ldi r17, 255
_DELAY_2:
@ -157,12 +239,19 @@ DELAY:
ret
TOGGLE_POWER_LED:
ldi r16, (1<<LED_POWER_PORT)
ldi r16, (1<<LED_POWER_PIN)
in r17, PORTD
eor r17, r16
out PORTD, r17
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 ;

View File

@ -1,9 +1,11 @@
:020000020000FC
:1000000000C00FED0DBF02D041E013C000E401BB02
:1000100001EC07BB0895342F3FB930E43EB90BE142
:100020000DB9769BFDCFC09AC0980895F4DF441FA8
:10003000089514D0FBDF02D001D0FBCF0F931F93A4
:10004000F8940FEF1FEF1A95000000000000D9F799
:100050000A95C1F778941F910F91089500E412B3A7
:06006000102712BB0895F9
:1000000000C00FED0DBF0CE701BB01EC07BB04E026
:100010000093610003E00093620002E0009363003C
:1000200001E0009364001124E6E8F0E00AC00FB894
:1000300000E40EB90BE10DB9769BFDCFC09AC098D4
:1000400008951CD001D0FDCF929A08D09298939A2F
:1000500005D09398949A02D0949808950F931F9383
:10006000F89404E61FEF1A95000000000000D9F78D
:100070000A95C1F778941F910F91089500E412B387
:10008000102712BB0895C0F9A4B0999282F880900D
: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'
@ -720,17 +720,35 @@ firmware.asm(14): Including file 'tn2313Adef.inc'
.DEF TEMP_REG_A = r16
.DEF TEMP_REG_B = r17
.DEF COUNTER = r20
;========================================;
; LABELS ;
;========================================;
.EQU LED_POWER_PORT = PD6
.EQU DIGIT_1_PIN = PD2
.EQU DIGIT_2_PIN = PD3
.EQU DIGIT_3_PIN = PD4
.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 ;
;========================================;
@ -768,92 +786,176 @@ firmware.asm(14): Including file 'tn2313Adef.inc'
;========================================;
; 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
MCU_INIT:
;=======================================================
; POWER LED <------------> PD6 ;
;=======================================================;
; INITIALIZE PORTS ;
; ;
; POWER LED <-------------> OUT PD6 ;
; - This LED is used to indicate that device ;
; is working correctly ;
; 7SEG DIGIT 1 <-------------> OUT PD2 ;
; 7SEG DIGIT 2 <-------------> OUT PD3 ;
; 7SEG DIGIT 3 <-------------> OUT PD4 ;
; 7SEG DIGIT 4 <-------------> OUT PD5 ;
; ;
;=======================================================
000003 d002 rcall INIT_PORTS
000004 e041 ldi COUNTER, 0b00000001
000005 c013 rjmp LOOP
; 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:
000006 e400 ldi r16, (1<<LED_POWER_PORT)
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
000007 e004 ldi TEMP_REG_A, 4
000008 9300 0061 sts DISPLAY_DIGIT, TEMP_REG_A
;========================================;
; SEND BYTE TO 74HC595 ;
;========================================;
00000a e003 ldi TEMP_REG_A, 3
00000b 9300 0062 sts DISPLAY_DIGIT+1, TEMP_REG_A
00000d e002 ldi TEMP_REG_A, 2
00000e 9300 0063 sts DISPLAY_DIGIT+2, TEMP_REG_A
000010 e001 ldi TEMP_REG_A, 1
000011 9300 0064 sts DISPLAY_DIGIT+3, TEMP_REG_A
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:
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)
000017 b80f out USIDR, r0 ; Move byte from temp register to USI Data Register
_USI_TRANSMIT_LOOP:
000010 b90d out USICR, TEMP_REG_A
000011 9b76 sbis USISR, USIOIF
000012 cffd rjmp _USI_TRANSMIT_LOOP
; 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
000013 9ac0 sbi PORTB, USI_LATCH_PIN
000014 98c0 cbi PORTB, USI_LATCH_PIN
000015 9508 ret
; 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)
SUBPROGRAM_LED_SHIFTING:
000016 dff4 rcall USI_TRANSMIT
000017 1f44 rol COUNTER
000018 9508 ret
_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 ;
;========================================;
LOOP:
000019 d014 rcall TOGGLE_POWER_LED
00001a dffb rcall SUBPROGRAM_LED_SHIFTING
00001b d002 rcall DELAY
00001c d001 rcall DELAY
00001d cffb rjmp LOOP
000021 d01c rcall TOGGLE_POWER_LED
000022 d001 rcall DISPLAY_INDICATE
; rcall USI_TRANSMIT
DELAY:
00001e 930f push r16
00001f 931f push r17
000020 94f8 cli
000021 ef0f ldi r16, 255
_DELAY_1:
000022 ef1f ldi r17, 255
_DELAY_2:
000023 951a dec r17
000024 0000 nop
000025 0000 nop
000026 0000 nop
000027 f7d9 brne _DELAY_2
; ldi TEMP_REG_B, 10
; cp r1, TEMP_REG_B
; brge RESET_POINTER
; rjmp DISPLAY_SEND
000028 950a dec r16
000029 f7c1 brne _DELAY_1
00002a 9478 sei
; RESET_POINTER:
; clr r1
; ldi ZL,LOW(2*DISPLAY_SYMBOLS)
; ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
00002b 911f pop r17
00002c 910f pop r16
; 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
TOGGLE_POWER_LED:
00002e e400 ldi r16, (1<<LED_POWER_PORT)
00002f b312 in r17, PORTD
000030 2710 eor r17, r16
000031 bb12 out PORTD, r17
000032 9508 ret
DELAY:
00002e 930f push r16
00002f 931f push r17
000030 94f8 cli
000031 e604 ldi r16, 100
_DELAY_1:
000032 ef1f ldi r17, 255
_DELAY_2:
000033 951a dec r17
000034 0000 nop
000035 0000 nop
000036 0000 nop
000037 f7d9 brne _DELAY_2
000038 950a dec r16
000039 f7c1 brne _DELAY_1
00003a 9478 sei
00003b 911f pop r17
00003c 910f pop r16
00003d 9508 ret
TOGGLE_POWER_LED:
00003e e400 ldi r16, (1<<LED_POWER_PIN)
00003f b312 in r17, PORTD
000040 2710 eor r17, r16
000041 bb12 out PORTD, r17
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 ;
@ -927,12 +1029,12 @@ counted separately from r26..r31 here.
.dseg memory usage only counts static data declared with .byte
"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
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
r29: 0 r30: 0 r31: 0
Registers used: 4 out of 35 (11.4%)
r29: 0 r30: 1 r31: 1
Registers used: 6 out of 35 (17.1%)
"ATtiny2313A" instruction use summary:
.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
brhs : 0 brid : 0 brie : 0 brlo : 0 brlt : 0 brmi : 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
clh : 0 cli : 1 cln : 0 clr : 0 cls : 0 clt : 0
brvs : 0 bset : 0 bst : 0 cbi : 4 cbr : 0 clc : 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
cpse : 0 dec : 2 eor : 1 icall : 0 ijmp : 0 in : 1
inc : 0 ld : 0 ldd : 0 ldi : 9 lds : 0 lpm : 0
lsl : 0 lsr : 0 mov : 1 movw : 0 neg : 0 nop : 3
or : 0 ori : 0 out : 7 pop : 2 push : 2 rcall : 6
ret : 5 reti : 0 rjmp : 4 rol : 1 ror : 0 sbc : 0
sbci : 0 sbi : 1 sbic : 0 sbis : 1 sbiw : 0 sbr : 0
inc : 0 ld : 0 ldd : 0 ldi : 14 lds : 0 lpm : 0
lsl : 0 lsr : 0 mov : 0 movw : 0 neg : 0 nop : 3
or : 0 ori : 0 out : 7 pop : 2 push : 2 rcall : 5
ret : 4 reti : 0 rjmp : 4 rol : 0 ror : 0 sbc : 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
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
Instructions used: 19 out of 105 (18.1%)
"ATtiny2313A" memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x000066 102 0 102 2048 5.0%
[.dseg] 0x000060 0x000060 0 0 0 128 0.0%
[.cseg] 0x000000 0x000090 134 10 144 2048 7.0%
[.dseg] 0x000060 0x000065 0 5 5 128 3.9%
[.eseg] 0x000000 0x000033 0 51 51 128 39.8%
Assembly complete, 0 errors, 0 warnings

View File

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