diff --git a/firmware.asm b/firmware.asm index b8f82d4..5b8307b 100644 --- a/firmware.asm +++ b/firmware.asm @@ -44,6 +44,9 @@ .equ POLLING_STATE = 0x03 .equ COMPLETION_STATE = 0x04 +.equ TRUE = 1 +.equ FALSE = 0 + .macro init_stack_p ; Setup stack pointer ldi @0, low(@1) out SPL, @0 @@ -56,6 +59,9 @@ pop r16 .endm +; +; @0 - SRAM Address +; @1 - Data to write .macro stsi ; Write to SRAM push r16 ldi r16, @1 @@ -72,16 +78,51 @@ pop r16 .endm +.macro set_btn_flag + push r16 + ldi r16, @0 + sts BTN_FLAGS_ADDRESS, r16 + pop r16 +.endm + +.macro clr_btn_flag + push r16 + lds r16, BTN_FLAGS_ADDRESS + cbr r16, @0 + sts BTN_FLAGS_ADDRESS, r16 + pop r16 +.endm + .dseg ; Data segment .org SRAM_START +; +; MCU Global states CURRENT_STATE_ADDRESS: .byte 0x01 -PREVIOUS_STATE_ADDRESS: .byte 0x02 +PREVIOUS_STATE_ADDRESS: .byte 0x01 + +; +; Button flags +BTN_FLAGS_ADDRESS: .byte 0x01 .cseg ; Code segment .org 0x00 ; Start program at 0x00 -setup: ; Setup program +rjmp start +rjmp PCINT4_ISR + +; +; Interrupt service routines +PCINT4_ISR: ; First button + set_btn_flag 0x01 +reti + +ldi r18, 0x00 +sts BTN_FLAGS_ADDRESS, r18 + +; +; Program start at reset +start: init_stack_p r16, RAMEND ; Init stack pointer of MCU set_state INIT_STATE ; Turn MCU state to initialization @@ -91,11 +132,21 @@ loop: ; Program loop cpi r16, INIT_STATE brne showing rcall MCU_Init + ; rcall delay_1s set_state SHOWING_STATE showing: ; Showing state cpi r16, SHOWING_STATE brne polling - rcall effect_1 + + lds r18, BTN_FLAGS_ADDRESS + cpi r18, 0x01 + brne led_off + led_on: + sbi LED_PORT, 2 + rcall delay_50ms + rjmp polling + led_off: + cbi LED_PORT, 2 polling: ; Polling state cpi r16, POLLING_STATE brne completion @@ -151,6 +202,36 @@ ret MCU_Init: rcall init_ports + rcall init_interrupts + rcall delay_before_start ; Init MCU and delay before start main program +ret + +delay_before_start: + ldi r17, 6 + _init_loop_loading: + rcall effect_1 + dec r17 + brne _init_loop_loading + rcall delay_1s +ret + +init_interrupts: + push r16 + + ; + ; Enable Port Change Interrupt + ldi r16, (1<