feat: test simple pin interrupt impl

This commit is contained in:
Sergey Yarkov 2021-10-02 00:56:07 +03:00
parent affdc0f05f
commit 850fe2a25d
2 changed files with 135 additions and 26 deletions

View File

@ -44,6 +44,9 @@
.equ POLLING_STATE = 0x03 .equ POLLING_STATE = 0x03
.equ COMPLETION_STATE = 0x04 .equ COMPLETION_STATE = 0x04
.equ TRUE = 1
.equ FALSE = 0
.macro init_stack_p ; Setup stack pointer .macro init_stack_p ; Setup stack pointer
ldi @0, low(@1) ldi @0, low(@1)
out SPL, @0 out SPL, @0
@ -56,6 +59,9 @@
pop r16 pop r16
.endm .endm
;
; @0 - SRAM Address
; @1 - Data to write
.macro stsi ; Write to SRAM .macro stsi ; Write to SRAM
push r16 push r16
ldi r16, @1 ldi r16, @1
@ -72,16 +78,51 @@
pop r16 pop r16
.endm .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 .dseg ; Data segment
.org SRAM_START .org SRAM_START
;
; MCU Global states
CURRENT_STATE_ADDRESS: .byte 0x01 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 .cseg ; Code segment
.org 0x00 ; Start program at 0x00 .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 init_stack_p r16, RAMEND ; Init stack pointer of MCU
set_state INIT_STATE ; Turn MCU state to initialization set_state INIT_STATE ; Turn MCU state to initialization
@ -91,11 +132,21 @@ loop: ; Program loop
cpi r16, INIT_STATE cpi r16, INIT_STATE
brne showing brne showing
rcall MCU_Init rcall MCU_Init
; rcall delay_1s
set_state SHOWING_STATE set_state SHOWING_STATE
showing: ; Showing state showing: ; Showing state
cpi r16, SHOWING_STATE cpi r16, SHOWING_STATE
brne polling 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 polling: ; Polling state
cpi r16, POLLING_STATE cpi r16, POLLING_STATE
brne completion brne completion
@ -151,6 +202,36 @@ ret
MCU_Init: MCU_Init:
rcall init_ports 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<<PCIE0)
out GIMSK, r16
;
; Set Pin Change Mask Register
ldi r16, (1<<PCINT4) | (1<<PCINT5) | (1<<PCINT6) | (1<<PCINT7)
out PCMSK0, r16
clr r16
sei ; Enable Global Interrupts
pop r16
ret ret
init_ports: ; Init MCU ports init_ports: ; Init MCU ports
@ -169,20 +250,42 @@ init_ports: ; Init MCU ports
pop r16 pop r16
ret ret
delay_50ms: delay_50ms: ; For 1MHz frequency
push r18 push r18
push r19 push r19
ldi r18, 65 ; 1c ldi r18, 65
ldi r19, 239 ; 1c ldi r19, 239
_loop_d_50ms: _loop_d_50ms:
dec r19 ; 1c dec r19
brne _loop_d_50ms ; 2 or 1c = 665c brne _loop_d_50ms
dec r18 ; 1c dec r18
brne _loop_d_50ms ; 2 or 1c brne _loop_d_50ms
nop nop
pop r19 pop r19
pop r18 pop r18
ret ret
delay_1s: ; For 1MHz frequency
.equ outer_count = 100
.equ inner_count = 2499
push r24
push r25
ldi r18, outer_count
_reset:
ldi r24, low(inner_count)
ldi r25, high(inner_count)
_loop:
sbiw r24, 1
brne _loop
dec r18
brne _reset
ldi r18, outer_count
pop r25
pop r24
ret
info: .db "Memory led game. Written by Sergey Yarkov 27.09.2021" info: .db "Memory led game. Written by Sergey Yarkov 27.09.2021"

View File

@ -1,18 +1,24 @@
:020000020000FC :020000020000FC
:100000000FED0DBF0F9300916000009361000F93FF :100000000AC000C00F9301E0009362000F911895A1
:1000100001E0009360000F910F91009160000130AA :1000100020E0209362000FED0DBF0F930091600070
:1000200061F43AD00F9300916000009361000F9348 :10002000009361000F9301E0009360000F910F9126
:1000300002E0009360000F910F91023009F405D0A7 :1000300000916000013061F441D00F9300916000A5
:10004000033001F4043001F4E8CF1F932F933F9362 :10004000009361000F9302E0009360000F910F9105
:100050004F934BB30F9301EF0BBB0F9128D011E0DF :10005000023041F420916200213019F4DA9A4AD03A
:1000600033E020EF110F210F2BBB21D03A95C9F7B8 :1000600001C0DA98033001F4043001F4E1CF1F93AA
:100070000F9308EF0BBB0F911AD018E033E020EF7D :100070002F933F934F934BB30F9301EF0BBB0F9114
:100080001695210F2BBB13D03A95C9F74BBB4F9157 :1000800039D011E033E020EF110F210F2BBB32D01C
:100090003F912F911F91089501D008950F930FE084 :100090003A95C9F70F9308EF0BBB0F912BD018E0DF
:1000A0000ABB02950BBBBA9AC2980F9108952F9381 :1000A00033E020EF1695210F2BBB24D03A95C9F7EA
:1000B0003F9321E43FEE3A95F1F72A95E1F70000EE :1000B0004BBB4F913F912F911F91089512D008D0C3
:1000C0003F912F9108954D656D6F7279206C656435 :1000C00001D0089516E0D3DF1A95E9F71FD00895FF
:1000D0002067616D652E205772697474656E2062A9 :1000D0000F9300E10BBF00EF02BB002778940F9154
:1000E0007920536572676579205961726B6F76204C :1000E00008950F930FE00ABB02950BBBBA9AC29812
:0A00F00032372E30392E3230323113 :1000F0000F9108952F933F9321E43FEE3A95F1F746
:100100002A95E1F700003F912F9108958F939F93D7
:1001100024E683EC99E00197F1F72A95D1F724E6DC
:100120009F918F9108954D656D6F7279206C656414
:100130002067616D652E205772697474656E206248
:100140007920536572676579205961726B6F7620EB
:0A01500032372E30392E32303231B2
:00000001FF :00000001FF