mirror of
https://github.com/sergeyyarkov/attiny2313a_thermostat.git
synced 2026-10-11 10:18:56 +03:00
display digits
This commit is contained in:
parent
f7c7e7d56e
commit
2855e84b11
12
.gitignore
vendored
12
.gitignore
vendored
@ -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
9
Makefile
Normal 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
|
||||
207
firmware.asm
207
firmware.asm
@ -16,16 +16,34 @@
|
||||
|
||||
.DEF TEMP_REG_A = r16
|
||||
.DEF TEMP_REG_B = r17
|
||||
.DEF COUNTER = r20
|
||||
|
||||
;========================================;
|
||||
; LABELS ;
|
||||
;========================================;
|
||||
|
||||
.EQU LED_POWER_PORT = 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 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 ;
|
||||
@ -38,64 +56,87 @@
|
||||
; VECTORS ;
|
||||
;========================================;
|
||||
|
||||
rjmp RESET_vect ; Program start at RESET vector
|
||||
;reti ; External Interrupt Request 0 / inactive
|
||||
;reti ; External Interrupt Request 1 / inactive
|
||||
;reti ; Timer/Counter1 Capture Event / inactive
|
||||
;reti ; Timer/Counter1 Compare Match A / inactive
|
||||
;reti ; Timer/Counter1 Overflow / inactive
|
||||
;reti ; Timer/Counter0 Overflow / inactive
|
||||
;reti ; USART0, Rx Complete / inactive
|
||||
;reti ; USART0 Data Register Empty / inactive
|
||||
;reti ; USART0, Tx Complete / inactive
|
||||
;reti ; Analog Comparator / inactive
|
||||
;reti ; Pin Change Interrupt Request 0/ inactive
|
||||
;reti ; Timer/Counter1 Compare Match B / inactive
|
||||
;reti ; Timer/Counter0 Compare Match A / inactive
|
||||
;reti ; Timer/Counter0 Compare Match B / inactive
|
||||
;reti ; USI Start Condition/ inactive
|
||||
;reti ; USI Overflow / inactive
|
||||
;reti ; EEPROM Ready/ inactive
|
||||
;reti ; Watchdog Timer Overflow / inactive
|
||||
;reti ; Pin Change Interrupt Request 1 / inactive
|
||||
;reti ; Pin Change Interrupt Request 2 / inactive
|
||||
rjmp RESET_vect ; Program start at RESET vector
|
||||
;reti ; External Interrupt Request 0 / inactive
|
||||
;reti ; External Interrupt Request 1 / inactive
|
||||
;reti ; Timer/Counter1 Capture Event / inactive
|
||||
;reti ; Timer/Counter1 Compare Match A / inactive
|
||||
;reti ; Timer/Counter1 Overflow / inactive
|
||||
;reti ; Timer/Counter0 Overflow / inactive
|
||||
;reti ; USART0, Rx Complete / inactive
|
||||
;reti ; USART0 Data Register Empty / inactive
|
||||
;reti ; USART0, Tx Complete / inactive
|
||||
;reti ; Analog Comparator / inactive
|
||||
;reti ; Pin Change Interrupt Request 0/ inactive
|
||||
;reti ; Timer/Counter1 Compare Match B / inactive
|
||||
;reti ; Timer/Counter0 Compare Match A / inactive
|
||||
;reti ; Timer/Counter0 Compare Match B / inactive
|
||||
;reti ; USI Start Condition/ inactive
|
||||
;reti ; USI Overflow / inactive
|
||||
;reti ; EEPROM Ready/ inactive
|
||||
;reti ; Watchdog Timer Overflow / inactive
|
||||
;reti ; Pin Change Interrupt Request 1 / inactive
|
||||
;reti ; Pin Change Interrupt Request 2 / inactive
|
||||
|
||||
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 ;
|
||||
; - This LED is used to indicate that device ;
|
||||
; is working correctly ;
|
||||
; ;
|
||||
;=======================================================
|
||||
rcall INIT_PORTS
|
||||
ldi COUNTER, 0b00000001
|
||||
rjmp LOOP
|
||||
|
||||
INIT_PORTS:
|
||||
ldi r16, (1<<LED_POWER_PORT)
|
||||
;=======================================================;
|
||||
; 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 ;
|
||||
; ;
|
||||
; 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)
|
||||
in r17, PORTD
|
||||
eor r17, r16
|
||||
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 ;
|
||||
|
||||
16
firmware.hex
16
firmware.hex
@ -1,9 +1,11 @@
|
||||
:020000020000FC
|
||||
:1000000000C00FED0DBF02D041E013C000E401BB02
|
||||
:1000100001EC07BB0895342F3FB930E43EB90BE142
|
||||
:100020000DB9769BFDCFC09AC0980895F4DF441FA8
|
||||
:10003000089514D0FBDF02D001D0FBCF0F931F93A4
|
||||
:10004000F8940FEF1FEF1A95000000000000D9F799
|
||||
:100050000A95C1F778941F910F91089500E412B3A7
|
||||
:06006000102712BB0895F9
|
||||
:1000000000C00FED0DBF0CE701BB01EC07BB04E026
|
||||
:100010000093610003E00093620002E0009363003C
|
||||
:1000200001E0009364001124E6E8F0E00AC00FB894
|
||||
:1000300000E40EB90BE10DB9769BFDCFC09AC098D4
|
||||
:1000400008951CD001D0FDCF929A08D09298939A2F
|
||||
:1000500005D09398949A02D0949808950F931F9383
|
||||
:10006000F89404E61FEF1A95000000000000D9F78D
|
||||
:100070000A95C1F778941F910F91089500E412B387
|
||||
:10008000102712BB0895C0F9A4B0999282F880900D
|
||||
:00000001FF
|
||||
|
||||
312
firmware.lss
312
firmware.lss
@ -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,16 +720,34 @@ 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 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 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 ;
|
||||
@ -742,118 +760,202 @@ firmware.asm(14): Including file 'tn2313Adef.inc'
|
||||
; VECTORS ;
|
||||
;========================================;
|
||||
|
||||
000000 c000 rjmp RESET_vect ; Program start at RESET vector
|
||||
;reti ; External Interrupt Request 0 / inactive
|
||||
;reti ; External Interrupt Request 1 / inactive
|
||||
;reti ; Timer/Counter1 Capture Event / inactive
|
||||
;reti ; Timer/Counter1 Compare Match A / inactive
|
||||
;reti ; Timer/Counter1 Overflow / inactive
|
||||
;reti ; Timer/Counter0 Overflow / inactive
|
||||
;reti ; USART0, Rx Complete / inactive
|
||||
;reti ; USART0 Data Register Empty / inactive
|
||||
;reti ; USART0, Tx Complete / inactive
|
||||
;reti ; Analog Comparator / inactive
|
||||
;reti ; Pin Change Interrupt Request 0/ inactive
|
||||
;reti ; Timer/Counter1 Compare Match B / inactive
|
||||
;reti ; Timer/Counter0 Compare Match A / inactive
|
||||
;reti ; Timer/Counter0 Compare Match B / inactive
|
||||
;reti ; USI Start Condition/ inactive
|
||||
;reti ; USI Overflow / inactive
|
||||
;reti ; EEPROM Ready/ inactive
|
||||
;reti ; Watchdog Timer Overflow / inactive
|
||||
;reti ; Pin Change Interrupt Request 1 / inactive
|
||||
;reti ; Pin Change Interrupt Request 2 / inactive
|
||||
000000 c000 rjmp RESET_vect ; Program start at RESET vector
|
||||
;reti ; External Interrupt Request 0 / inactive
|
||||
;reti ; External Interrupt Request 1 / inactive
|
||||
;reti ; Timer/Counter1 Capture Event / inactive
|
||||
;reti ; Timer/Counter1 Compare Match A / inactive
|
||||
;reti ; Timer/Counter1 Overflow / inactive
|
||||
;reti ; Timer/Counter0 Overflow / inactive
|
||||
;reti ; USART0, Rx Complete / inactive
|
||||
;reti ; USART0 Data Register Empty / inactive
|
||||
;reti ; USART0, Tx Complete / inactive
|
||||
;reti ; Analog Comparator / inactive
|
||||
;reti ; Pin Change Interrupt Request 0/ inactive
|
||||
;reti ; Timer/Counter1 Compare Match B / inactive
|
||||
;reti ; Timer/Counter0 Compare Match A / inactive
|
||||
;reti ; Timer/Counter0 Compare Match B / inactive
|
||||
;reti ; USI Start Condition/ inactive
|
||||
;reti ; USI Overflow / inactive
|
||||
;reti ; EEPROM Ready/ inactive
|
||||
;reti ; Watchdog Timer Overflow / inactive
|
||||
;reti ; Pin Change Interrupt Request 1 / inactive
|
||||
;reti ; Pin Change Interrupt Request 2 / inactive
|
||||
|
||||
RESET_vect:
|
||||
;========================================;
|
||||
; 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 ;
|
||||
; - This LED is used to indicate that device ;
|
||||
; is working correctly ;
|
||||
; ;
|
||||
;=======================================================
|
||||
000003 d002 rcall INIT_PORTS
|
||||
000004 e041 ldi COUNTER, 0b00000001
|
||||
000005 c013 rjmp LOOP
|
||||
;=======================================================;
|
||||
; 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 ;
|
||||
; ;
|
||||
; 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
|
||||
|
||||
;========================================;
|
||||
; 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)
|
||||
000007 e004 ldi TEMP_REG_A, 4
|
||||
000008 9300 0061 sts DISPLAY_DIGIT, TEMP_REG_A
|
||||
|
||||
_USI_TRANSMIT_LOOP:
|
||||
000010 b90d out USICR, TEMP_REG_A
|
||||
000011 9b76 sbis USISR, USIOIF
|
||||
000012 cffd rjmp _USI_TRANSMIT_LOOP
|
||||
00000a e003 ldi TEMP_REG_A, 3
|
||||
00000b 9300 0062 sts DISPLAY_DIGIT+1, TEMP_REG_A
|
||||
|
||||
000013 9ac0 sbi PORTB, USI_LATCH_PIN
|
||||
000014 98c0 cbi PORTB, USI_LATCH_PIN
|
||||
000015 9508 ret
|
||||
00000d e002 ldi TEMP_REG_A, 2
|
||||
00000e 9300 0063 sts DISPLAY_DIGIT+2, TEMP_REG_A
|
||||
|
||||
SUBPROGRAM_LED_SHIFTING:
|
||||
000016 dff4 rcall USI_TRANSMIT
|
||||
000017 1f44 rol COUNTER
|
||||
000018 9508 ret
|
||||
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:
|
||||
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 ;
|
||||
;========================================;
|
||||
|
||||
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
|
||||
|
||||
; 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:
|
||||
00001e 930f push r16
|
||||
00001f 931f push r17
|
||||
000020 94f8 cli
|
||||
000021 ef0f ldi r16, 255
|
||||
00002e 930f push r16
|
||||
00002f 931f push r17
|
||||
000030 94f8 cli
|
||||
000031 e604 ldi r16, 100
|
||||
_DELAY_1:
|
||||
000022 ef1f ldi r17, 255
|
||||
000032 ef1f ldi r17, 255
|
||||
_DELAY_2:
|
||||
000023 951a dec r17
|
||||
000024 0000 nop
|
||||
000025 0000 nop
|
||||
000026 0000 nop
|
||||
000027 f7d9 brne _DELAY_2
|
||||
000033 951a dec r17
|
||||
000034 0000 nop
|
||||
000035 0000 nop
|
||||
000036 0000 nop
|
||||
000037 f7d9 brne _DELAY_2
|
||||
|
||||
000028 950a dec r16
|
||||
000029 f7c1 brne _DELAY_1
|
||||
00002a 9478 sei
|
||||
000038 950a dec r16
|
||||
000039 f7c1 brne _DELAY_1
|
||||
00003a 9478 sei
|
||||
|
||||
00002b 911f pop r17
|
||||
00002c 910f pop r16
|
||||
00002d 9508 ret
|
||||
00003b 911f pop r17
|
||||
00003c 910f pop r16
|
||||
00003d 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
|
||||
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
|
||||
|
||||
436
firmware.lst
436
firmware.lst
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user