diff --git a/firmware.asm b/firmware.asm index 707af04..8299b66 100644 --- a/firmware.asm +++ b/firmware.asm @@ -11,49 +11,50 @@ ; Written by Sergey Yarkov 27.09.2021 .include "def.inc" ; Include type definitions of MCU -.list ; Enable listing +.list ; Enable listing ; ; Registers -.def seq_length_r = r10 ; Current length of sequence -.def temp_r = r16 ; Temp general register A -.def temp_r_b = r23 ; Temp general register B -.def temp_r_c = r26 ; Temp general register C -.def mcu_state_r = r17 ; Current state of MCU. This register will be compared in an main loop -.def delay_counter_r = r19 ; Register for storing delay counter -.def poll_step_r = r20 ; Current poll step for checking the input with answer +.def seq_length_r = r10 ; Current length of sequence +.def wdt_counter = r11 ; Counter for wathdog timer +.def temp_r = r16 ; Temp general register A +.def temp_r_b = r23 ; Temp general register B +.def temp_r_c = r26 ; Temp general register C +.def mcu_state_r = r17 ; Current state of MCU. This register will be compared in an main loop +.def delay_counter_r = r19 ; Register for storing delay counter +.def poll_step_r = r20 ; Current poll step for checking the input with answer ; ; LEDS constants -.equ LED_DIR = DDRA -.equ LED_PORT = PORTA -.equ LED_PIN = PINA -.equ LED_PIN_0 = PINA0 -.equ LED_PIN_1 = PINA1 -.equ LED_PIN_2 = PINA2 -.equ LED_PIN_3 = PINA3 +.equ LED_DIR = DDRA +.equ LED_PORT = PORTA +.equ LED_PIN = PINA +.equ LED_PIN_0 = PINA0 +.equ LED_PIN_1 = PINA1 +.equ LED_PIN_2 = PINA2 +.equ LED_PIN_3 = PINA3 ; ; Buttons constants -.equ SW_DIR = DDRA -.equ SW_PORT = PORTA -.equ SW_PIN = PINA -.equ SW_PIN_4 = PINA4 -.equ SW_PIN_5 = PINA5 -.equ SW_PIN_6 = PINA6 -.equ SW_PIN_7 = PINA7 +.equ SW_DIR = DDRA +.equ SW_PORT = PORTA +.equ SW_PIN = PINA +.equ SW_PIN_4 = PINA4 +.equ SW_PIN_5 = PINA5 +.equ SW_PIN_6 = PINA6 +.equ SW_PIN_7 = PINA7 ; ; Buzzer constants -.equ BUZZ_DIR = DDRB -.equ BUZZ_PORT = PORTB -.equ BUZZ_PIN = PINB2 +.equ BUZZ_DIR = DDRB +.equ BUZZ_PORT = PORTB +.equ BUZZ_PIN = PINB2 ; ; States constants -.equ INIT_STATE = 0x01 -.equ SHOWING_STATE = 0x02 -.equ POLLING_STATE = 0x03 +.equ INIT_STATE = 0x01 +.equ SHOWING_STATE = 0x02 +.equ POLLING_STATE = 0x03 ; ; SW Flags states constants @@ -75,530 +76,603 @@ .dseg ; Data segment .org SRAM_START -; ; MCU Global states addresses CURRENT_STATE_ADDRESS: .byte 0x01 -PREVIOUS_STATE_ADDRESS: .byte 0x01 +PREVIOUS_STATE_ADDRESS: .byte 0x01 -; ; Button flags -SW_FLAGS_ADDRESS: .byte 0x01 +SW_FLAGS_ADDRESS: .byte 0x01 .cseg ; Code segment .org 0x00 -; -; Setup vectors -rjmp start ; Program start at RESET vector +; MCU vectors +rjmp RESET_vect ; Program start at RESET vector reti ; External Interrupt Request 0 / inactive -rjmp PCINT0_vect ; Pin Change Interrupt Request 0 / active +rjmp PCINT0_vect ; Pin Change Interrupt Request 0 / active reti ; Pin Change Interrupt Request 1 / inactive -reti ; Watchdog Time-out / inactive +rjmp WDT_vect ; Watchdog Time-out / active reti ; Timer/Counter1 Capture Event / inactive reti ; Timer/Counter1 Compare Match A / inactive reti ; Timer/Counter1 Compare Match B / inactive reti ; Timer/Counter1 Overflow / inactive -reti ; Timer/Counter0 Compare Match A / inactive +reti ; Timer/Counter0 Compare Match A / inactive reti ; Timer/Counter0 Compare Match B / inactive -rjmp TIM0_OVF_vect ; Timer/Counter0 Overflow / active +rjmp TIM0_OVF_vect ; Timer/Counter0 Overflow / active reti ; Analog Comparator / inactive reti ; ADC Conversion Complete / inactive reti ; EEPROM Ready / inactive reti ; USI START / inactive reti ; USI Overflow / inactive -; -; Interrupt service routines -PCINT0_vect: ; Button handler - push r17 - push r18 - in r18, SREG ; Save status register - lds mcu_state_r, CURRENT_STATE_ADDRESS - cpi mcu_state_r, POLLING_STATE - brne quit ; Do not change button flags unless in POLLING state of mcu - in r17, PINA ; Load current pins status of PINA - andi r17, 0xf0 ; Get pins status of only buttons - rcall delay_20ms ; Delay for button - sts SW_FLAGS_ADDRESS, r17 ; Update flag status in SRAM - out SREG, r18 +; watchdog time-out interrupt handler +WDT_vect: + in temp_r_c, WDTCSR + ldi temp_r_c, (1<