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
|
NOTES.md
|
||||||
CMakeCache.txt
|
|
||||||
CMakeFiles
|
|
||||||
CMakeScripts
|
|
||||||
Testing
|
|
||||||
Makefile
|
|
||||||
cmake_install.cmake
|
|
||||||
install_manifest.txt
|
|
||||||
compile_commands.json
|
|
||||||
CTestTestfile.cmake
|
|
||||||
_deps
|
|
||||||
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_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 ;
|
||||||
|
|||||||
16
firmware.hex
16
firmware.hex
@ -1,9 +1,11 @@
|
|||||||
:020000020000FC
|
:020000020000FC
|
||||||
:1000000000C00FED0DBF02D041E013C000E401BB02
|
:1000000000C00FED0DBF0CE701BB01EC07BB04E026
|
||||||
:1000100001EC07BB0895342F3FB930E43EB90BE142
|
:100010000093610003E00093620002E0009363003C
|
||||||
:100020000DB9769BFDCFC09AC0980895F4DF441FA8
|
:1000200001E0009364001124E6E8F0E00AC00FB894
|
||||||
:10003000089514D0FBDF02D001D0FBCF0F931F93A4
|
:1000300000E40EB90BE10DB9769BFDCFC09AC098D4
|
||||||
:10004000F8940FEF1FEF1A95000000000000D9F799
|
:1000400008951CD001D0FDCF929A08D09298939A2F
|
||||||
:100050000A95C1F778941F910F91089500E412B3A7
|
:1000500005D09398949A02D0949808950F931F9383
|
||||||
:06006000102712BB0895F9
|
:10006000F89404E61FEF1A95000000000000D9F78D
|
||||||
|
:100070000A95C1F778941F910F91089500E412B387
|
||||||
|
:10008000102712BB0895C0F9A4B0999282F880900D
|
||||||
:00000001FF
|
: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'
|
||||||
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
|
|
||||||
|
|
||||||
;========================================;
|
00000a e003 ldi TEMP_REG_A, 3
|
||||||
; SEND BYTE TO 74HC595 ;
|
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:
|
USI_TRANSMIT:
|
||||||
00000b 2f34 mov r19, COUNTER
|
000017 b80f out USIDR, r0 ; Move byte from temp register to USI Data Register
|
||||||
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:
|
; Enable USI Overflow Interrupt Flag (will be 0 if transfer is not compeleted)
|
||||||
000010 b90d out USICR, TEMP_REG_A
|
000018 e400 ldi TEMP_REG_A, (1<<USIOIF)
|
||||||
000011 9b76 sbis USISR, USIOIF
|
000019 b90e out USISR, TEMP_REG_A
|
||||||
000012 cffd rjmp _USI_TRANSMIT_LOOP
|
|
||||||
|
|
||||||
000013 9ac0 sbi PORTB, USI_LATCH_PIN
|
; Load settings of USI into temp register
|
||||||
000014 98c0 cbi PORTB, USI_LATCH_PIN
|
; This will setup USI to Three-wire mode, Software clock strobe (USITC)
|
||||||
000015 9508 ret
|
; 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:
|
_USI_TRANSMIT_LOOP: ; Execute loop when USIOIF is 0
|
||||||
000016 dff4 rcall USI_TRANSMIT
|
00001b b90d out USICR, TEMP_REG_A ; Load settings from temp register into USI Control Register
|
||||||
000017 1f44 rol COUNTER
|
00001c 9b76 sbis USISR, USIOIF ; If transfer is comleted then move out of loop
|
||||||
000018 9508 ret
|
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
|
|
||||||
|
|
||||||
DELAY:
|
; ldi TEMP_REG_B, 10
|
||||||
00001e 930f push r16
|
; cp r1, TEMP_REG_B
|
||||||
00001f 931f push r17
|
; brge RESET_POINTER
|
||||||
000020 94f8 cli
|
; rjmp DISPLAY_SEND
|
||||||
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
|
|
||||||
|
|
||||||
000028 950a dec r16
|
; RESET_POINTER:
|
||||||
000029 f7c1 brne _DELAY_1
|
; clr r1
|
||||||
00002a 9478 sei
|
; ldi ZL,LOW(2*DISPLAY_SYMBOLS)
|
||||||
|
; ldi ZH,HIGH(2*DISPLAY_SYMBOLS)
|
||||||
|
|
||||||
00002b 911f pop r17
|
; DISPLAY_SEND:
|
||||||
00002c 910f pop r16
|
; 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
|
00002d 9508 ret
|
||||||
|
|
||||||
TOGGLE_POWER_LED:
|
DELAY:
|
||||||
00002e e400 ldi r16, (1<<LED_POWER_PORT)
|
00002e 930f push r16
|
||||||
00002f b312 in r17, PORTD
|
00002f 931f push r17
|
||||||
000030 2710 eor r17, r16
|
000030 94f8 cli
|
||||||
000031 bb12 out PORTD, r17
|
000031 e604 ldi r16, 100
|
||||||
000032 9508 ret
|
_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 ;
|
; 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
|
||||||
|
|||||||
436
firmware.lst
436
firmware.lst
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user