From 9dbdb2458f9b7ac9d56f82a7eed8446e22855c62 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Sun, 3 Oct 2021 22:18:04 +0300 Subject: [PATCH] refactor: buttons handling --- firmware.asm | 80 ++++++++++++++++++++++------------------------------ firmware.hex | 51 ++++++++++++++++----------------- 2 files changed, 59 insertions(+), 72 deletions(-) diff --git a/firmware.asm b/firmware.asm index 758372f..a12cdce 100644 --- a/firmware.asm +++ b/firmware.asm @@ -81,10 +81,10 @@ .endm .macro set_sw_flag - push r16 - ldi r16, @0 - sts SW_FLAGS_ADDRESS, r16 - pop r16 + push r19 + ldi r19, @0 + sts SW_FLAGS_ADDRESS, r19 + pop r19 .endm .dseg ; Data segment @@ -125,42 +125,17 @@ reti ; USI Overflow / inactive ; ; Interrupt service routines PCINT0_vect: - push r17 + push r17 + push r18 - sbis PINA, PINA4 - rjmp sw_check_1 - sbic PINA, PINA4 - rjmp sw_2nd + in r18, SREG + in r17, PINA ; Load current pins status of PINA + andi r17, 0xf0 ; Get pins status of only buttons + rcall delay_50ms + sts SW_FLAGS_ADDRESS, r17 ; Update flag status in SRAM + out SREG, r18 - sw_2nd: - sbis PINA, PINA5 - rjmp sw_check_2 - sbic PINA, PINA5 - rjmp sw_clr - - rjmp PCINT0_vect_end - sw_1: - ; lds r17, SW_FLAGS_ADDRESS - ; cpi r17, 0x01 - ; breq sw_clr - sw_check_1: - set_sw_flag 0x01 - rjmp PCINT0_vect_end - sw_check_2: - set_sw_flag 0x02 - rjmp PCINT0_vect_end - ; sw_check_flag: - ; lds r16, SW_FLAGS_ADDRESS - ; sbis PINA, PINA4 - ; ldi r16, 0x01 - ; sw_flag_1: - ; cpi r16, 0x01 - ; brne sw_flag_not_found - ; sts SW_FLAGS_ADDRESS, r16 - ; sw_flag_not_found: - sw_clr: - set_sw_flag 0x00 - PCINT0_vect_end: + pop r18 pop r17 reti @@ -169,7 +144,7 @@ reti start: init_stack_p r16, RAMEND ; Init stack pointer of MCU set_state INIT_STATE ; Turn MCU state to initialization - + set_sw_flag 0x00 loop: ; Program loop lds r16, CURRENT_STATE_ADDRESS init: ; Init state @@ -182,26 +157,39 @@ loop: ; Program loop cpi r16, SHOWING_STATE brne polling + lds r18, SW_FLAGS_ADDRESS led_1: - lds r18, SW_FLAGS_ADDRESS - cpi r18, 0x01 + cpi r18, 0xe0 brne led_off_1 led_on_1: sbi LED_PORT, 0 - rcall delay_50ms rjmp led_2 led_off_1: cbi LED_PORT, 0 led_2: - lds r18, SW_FLAGS_ADDRESS - cpi r18, 0x02 + cpi r18, 0xd0 brne led_off_2 led_on_2: sbi LED_PORT, 1 - rcall delay_50ms - rjmp polling + rjmp led_3 led_off_2: cbi LED_PORT, 1 + led_3: + cpi r18, 0xb0 + brne led_off_3 + led_on_3: + sbi LED_PORT, 2 + rjmp led_4 + led_off_3: + cbi LED_PORT, 2 + led_4: + cpi r18, 0x70 + brne led_off_4 + led_on_4: + sbi LED_PORT, 3 + rjmp polling + led_off_4: + cbi LED_PORT, 3 polling: ; Polling state cpi r16, POLLING_STATE brne completion diff --git a/firmware.hex b/firmware.hex index 5a11101..ad57f48 100644 --- a/firmware.hex +++ b/firmware.hex @@ -1,29 +1,28 @@ :020000020000FC -:100000002DC018950EC01895189518951895189527 +:100000001CC018950EC01895189518951895189538 :100010001895189518951895189518951895189578 -:1000200018951F93CC9B07C0CC9900C0CD9B09C0ED -:10003000CD990DC011C00F9301E0009362000F91A4 -:100040000BC00F9302E0009362000F9105C00F9365 -:1000500000E0009362000F911F9118950FED0DBF06 -:100060000F9300916000009361000F9301E00093F3 -:1000700060000F910F9100916000013061F449D050 -:100080000F9300916000009361000F9302E00093D2 -:1000900060000F910F91023081F4209162002130B5 -:1000A00019F4D89A4ED001C0D8982091620022301D -:1000B00019F4D99A46D001C0D998033001F404301C -:1000C00001F4D9CF1F932F933F934F934BB30F93CB -:1000D00001EF0BBB0F9135D011E033E020EF110F92 -:1000E000210F2BBB2ED03A95C9F70F9308EF0BBB0E -:1000F0000F9127D018E033E020EF1695210F2BBB8E -:1001000020D03A95C9F74BBB4F913F912F911F914A -:10011000089510D008D001D0089516E0D3DF1A95C5 -:10012000E9F71BD0089500E10BBF00EF02BB0027E9 -:10013000789408950FE00ABB02950BBBBA9AC29857 -:1001400008952F933F9321E43FEE3A95F1F72A95D6 -:10015000E1F700003F912F9108958F939F9324E63C -:1001600083EC99E00197F1F72A95D1F724E69F9166 -:100170008F9108954D656D6F7279206C656420676D -:10018000616D652E205772697474656E20627920E6 -:10019000536572676579205961726B6F76203237CB -:0801A0002E30392E32303231CD +:1000200018951F932F932FB719B3107F84D0109377 +:1000300062002FBF2F911F9118950FED0DBF0F93E9 +:1000400000916000009361000F9301E00093600055 +:100050000F910F913F9330E0309362003F910091F8 +:100060006000013061F44FD00F9300916000009365 +:1000700061000F9302E0009360000F910F91023036 +:10008000B1F420916200203E11F4D89A01C0D898B2 +:10009000203D11F4D99A01C0D998203B11F4DA9A85 +:1000A00001C0DA98203711F4DB9A01C0DB980330E5 +:1000B00001F4043001F4D3CF1F932F933F934F9358 +:1000C0004BB30F9301EF0BBB0F9135D011E033E031 +:1000D00020EF110F210F2BBB2ED03A95C9F70F93AC +:1000E00008EF0BBB0F9127D018E033E020EF1695F7 +:1000F000210F2BBB20D03A95C9F74BBB4F913F91B5 +:100100002F911F91089510D008D001D0089516E0C6 +:10011000D3DF1A95E9F71BD0089500E10BBF00EF7C +:1001200002BB0027789408950FE00ABB02950BBB31 +:10013000BA9AC29808952F933F9321E43FEE3A95DF +:10014000F1F72A95E1F700003F912F9108958F93E1 +:100150009F9324E683EC99E00197F1F72A95D1F774 +:1001600024E69F918F9108954D656D6F7279206C93 +:1001700065642067616D652E205772697474656EC1 +:1001800020627920536572676579205961726B6FBF +:0C019000762032372E30392E32303231DA :00000001FF