mirror of
https://github.com/sergeyyarkov/attiny24a_memory-led-game.git
synced 2026-10-11 10:18:58 +03:00
feat: test simple pin interrupt impl
This commit is contained in:
parent
affdc0f05f
commit
850fe2a25d
123
firmware.asm
123
firmware.asm
@ -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"
|
||||||
38
firmware.hex
38
firmware.hex
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user