From af37b72a242ec4972a24cbe15762d144f707b5da Mon Sep 17 00:00:00 2001 From: sergeyyarkov Date: Sun, 29 Jan 2023 21:32:58 +0300 Subject: [PATCH] 74hc595 transmit --- firmware.asm | 39 +++++++++++-------- firmware.hex | 16 ++++---- firmware.lss | 107 +++++++++++++++++++++++++++------------------------ 3 files changed, 88 insertions(+), 74 deletions(-) diff --git a/firmware.asm b/firmware.asm index 5228a78..aac0c11 100644 --- a/firmware.asm +++ b/firmware.asm @@ -6,16 +6,17 @@ ; Device Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/doc8246.pdf ; Package: SOIC-20W_7.5x12.8mm_P1.27mm ; Assembler: AVR macro assembler 2.2.7 -; Clock frequency: 12 MHz External Crystal Oscillator -; Fuses: lfuse: 0x4F, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF +; Clock frequency: 8 MHz External Crystal Oscillator +; Fuses: lfuse: 0xCF, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF ; ; Written by Sergey Yarkov 22.01.2023 .INCLUDE "tn2313Adef.inc" .LIST -.DEF tmp_r_a = r16 -.DEF COUNTER = r20 +.DEF TEMP_REG_A = r16 +.DEF TEMP_REG_B = r17 +.DEF COUNTER = r20 ;========================================; ; LABELS ; @@ -63,8 +64,8 @@ RESET_vect: ;========================================; ; INITIALIZE STACK POINTER ; ;========================================; - ldi tmp_r_a, low(RAMEND) - out SPL, tmp_r_a + ldi TEMP_REG_A, low(RAMEND) + out SPL, TEMP_REG_A MCU_INIT: ;======================================================= @@ -81,7 +82,7 @@ MCU_INIT: ;========================================; rcall INIT_USI - ldi COUNTER, 0 + ldi COUNTER, 0b00000001 rjmp LOOP INIT_PORTS: @@ -99,10 +100,12 @@ ret ; SEND BYTE TO 74HC595 ; ;========================================; TRANSMIT_595: - push r19 + in r21, SREG mov r19, COUNTER - ldi r16, 8 + ldi TEMP_REG_B, 8 _TRANSMIT_595_LOOP: + ; + ; Shift a bit into the Carry flag and check if it is set to 1 or 0. lsl r19 brcc _TRANSMIT_595_SEND_LOW brcs _TRANSMIT_595_SEND_HIGH @@ -115,18 +118,21 @@ TRANSMIT_595: cbi PORTB, DATA_PIN _TRANSMIT_595_COMMIT: - sbi PORTB, CLOCK_PIN cbi PORTB, CLOCK_PIN - sbi PORTB, LATCH_PIN - cbi PORTB, LATCH_PIN - dec r16 + sbi PORTB, CLOCK_PIN + dec TEMP_REG_B brne _TRANSMIT_595_LOOP - pop r19 + + ; + ; Copy data from shift register to storage register + sbi PORTB, LATCH_PIN + cbi PORTB, LATCH_PIN + out SREG, r21 ret SUBPROGRAM_LED_SHIFTING: rcall TRANSMIT_595 - inc COUNTER + rol COUNTER ret ;========================================; @@ -137,13 +143,14 @@ LOOP: rcall TOGGLE_POWER_LED rcall SUBPROGRAM_LED_SHIFTING rcall DELAY + rcall DELAY rjmp LOOP DELAY: push r16 push r17 cli - ldi r16, 20 ; 1 + ldi r16, 255 _DELAY_1: ldi r17, 255 _DELAY_2: diff --git a/firmware.hex b/firmware.hex index d9d8952..6814670 100644 --- a/firmware.hex +++ b/firmware.hex @@ -1,10 +1,10 @@ :020000020000FC -:1000000000C00FED0DBF03D007D040E01AC000E4E0 -:1000100001BB07E007BB089508953F93342F08E024 -:10002000330F18F400F0C19A01C0C198C09AC0986B -:10003000C29AC2980A95A1F73F910895EEDF4395C1 -:10004000089513D0FBDF01D0FCCF0F931F93F894DA -:1000500004E11FEF1A95000000000000D9F70A958F -:10006000C1F778941F910F91089500E412B31027FF -:0400700012BB089522 +:1000000000C00FED0DBF03D007D041E01AC000E4DF +:1000100001BB07E007BB089508955FB7342F18E0D0 +:10002000330F18F400F0C19A01C0C198C098C09A6B +:100030001A95B1F7C29AC2985FBF0895EEDF441FC8 +:10004000089514D0FBDF02D001D0FBCF0F931F9394 +:10005000F8940FEF1FEF1A95000000000000D9F789 +:100060000A95C1F778941F910F91089500E412B397 +:06007000102712BB0895E9 :00000001FF diff --git a/firmware.lss b/firmware.lss index 8e8fba8..faa39c2 100644 --- a/firmware.lss +++ b/firmware.lss @@ -1,5 +1,5 @@ -AVRASM ver. 2.2.7 firmware.asm Sat Jan 28 03:33:17 2023 +AVRASM ver. 2.2.7 firmware.asm Sun Jan 29 21:32:32 2023 firmware.asm(14): Including file 'tn2313Adef.inc' firmware.asm(14): Including file 'tn2313Adef.inc' @@ -12,8 +12,8 @@ firmware.asm(14): Including file 'tn2313Adef.inc' ; Device Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/doc8246.pdf ; Package: SOIC-20W_7.5x12.8mm_P1.27mm ; Assembler: AVR macro assembler 2.2.7 - ; Clock frequency: 12 MHz External Crystal Oscillator - ; Fuses: lfuse: 0x4F, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF + ; Clock frequency: 8 MHz External Crystal Oscillator + ; Fuses: lfuse: 0xCF, hfuse: 0x9F, efuse: 0xFF, lock: 0xFF ; ; Written by Sergey Yarkov 22.01.2023 @@ -718,8 +718,9 @@ firmware.asm(14): Including file 'tn2313Adef.inc' ; ***** END OF FILE ****************************************************** .LIST - .DEF tmp_r_a = r16 - .DEF COUNTER = r20 + .DEF TEMP_REG_A = r16 + .DEF TEMP_REG_B = r17 + .DEF COUNTER = r20 ;========================================; ; LABELS ; @@ -767,8 +768,8 @@ firmware.asm(14): Including file 'tn2313Adef.inc' ;========================================; ; INITIALIZE STACK POINTER ; ;========================================; -000001 ed0f ldi tmp_r_a, low(RAMEND) -000002 bf0d out SPL, tmp_r_a +000001 ed0f ldi TEMP_REG_A, low(RAMEND) +000002 bf0d out SPL, TEMP_REG_A MCU_INIT: ;======================================================= @@ -785,7 +786,7 @@ firmware.asm(14): Including file 'tn2313Adef.inc' ;========================================; 000004 d007 rcall INIT_USI -000005 e040 ldi COUNTER, 0 +000005 e041 ldi COUNTER, 0b00000001 000006 c01a rjmp LOOP INIT_PORTS: @@ -803,10 +804,12 @@ firmware.asm(14): Including file 'tn2313Adef.inc' ; SEND BYTE TO 74HC595 ; ;========================================; TRANSMIT_595: -00000d 933f push r19 +00000d b75f in r21, SREG 00000e 2f34 mov r19, COUNTER -00000f e008 ldi r16, 8 +00000f e018 ldi TEMP_REG_B, 8 _TRANSMIT_595_LOOP: + ; + ; Shift a bit into the Carry flag and check if it is set to 1 or 0. 000010 0f33 lsl r19 000011 f418 brcc _TRANSMIT_595_SEND_LOW 000012 f000 brcs _TRANSMIT_595_SEND_HIGH @@ -819,18 +822,21 @@ firmware.asm(14): Including file 'tn2313Adef.inc' 000015 98c1 cbi PORTB, DATA_PIN _TRANSMIT_595_COMMIT: -000016 9ac0 sbi PORTB, CLOCK_PIN -000017 98c0 cbi PORTB, CLOCK_PIN -000018 9ac2 sbi PORTB, LATCH_PIN -000019 98c2 cbi PORTB, LATCH_PIN -00001a 950a dec r16 -00001b f7a1 brne _TRANSMIT_595_LOOP -00001c 913f pop r19 +000016 98c0 cbi PORTB, CLOCK_PIN +000017 9ac0 sbi PORTB, CLOCK_PIN +000018 951a dec TEMP_REG_B +000019 f7b1 brne _TRANSMIT_595_LOOP + + ; + ; Copy data from shift register to storage register +00001a 9ac2 sbi PORTB, LATCH_PIN +00001b 98c2 cbi PORTB, LATCH_PIN +00001c bf5f out SREG, r21 00001d 9508 ret SUBPROGRAM_LED_SHIFTING: 00001e dfee rcall TRANSMIT_595 -00001f 9543 inc COUNTER +00001f 1f44 rol COUNTER 000020 9508 ret ;========================================; @@ -838,39 +844,40 @@ firmware.asm(14): Including file 'tn2313Adef.inc' ;========================================; LOOP: -000021 d013 rcall TOGGLE_POWER_LED +000021 d014 rcall TOGGLE_POWER_LED 000022 dffb rcall SUBPROGRAM_LED_SHIFTING -000023 d001 rcall DELAY -000024 cffc rjmp LOOP +000023 d002 rcall DELAY +000024 d001 rcall DELAY +000025 cffb rjmp LOOP DELAY: -000025 930f push r16 -000026 931f push r17 -000027 94f8 cli -000028 e104 ldi r16, 20 ; 1 +000026 930f push r16 +000027 931f push r17 +000028 94f8 cli +000029 ef0f ldi r16, 255 _DELAY_1: -000029 ef1f ldi r17, 255 +00002a ef1f ldi r17, 255 _DELAY_2: -00002a 951a dec r17 -00002b 0000 nop -00002c 0000 nop -00002d 0000 nop -00002e f7d9 brne _DELAY_2 +00002b 951a dec r17 +00002c 0000 nop +00002d 0000 nop +00002e 0000 nop +00002f f7d9 brne _DELAY_2 -00002f 950a dec r16 -000030 f7c1 brne _DELAY_1 -000031 9478 sei +000030 950a dec r16 +000031 f7c1 brne _DELAY_1 +000032 9478 sei -000032 911f pop r17 -000033 910f pop r16 -000034 9508 ret +000033 911f pop r17 +000034 910f pop r16 +000035 9508 ret TOGGLE_POWER_LED: -000035 e400 ldi r16, (1<