So, I’m very new to assembly language programming for microcontrollers.
I’m using an AVR XMega A3BU X-plained board, and I’ve got a program where I need to interface with 7 buttons. 3 of them are on the board, and 4 are connected to a cheap 4 button membrane keypad.
I need to debounce the switches (hardware solutions are not an option), and I’ve constructed the following routine to do it; I feel like it’s horribly inefficient and has several design flaws, but I can’t tell.
(The CPU clock is running at 32 MHz and the timer interrupt occurs every 100ms.)
C programming is not an option, I must use assembly.
Is there a better way to do this?
;------------------------------------------------------------------------------ ; Timer interrupt service routine - tcf0_isr ;------------------------------------------------------------------------------ ; TODO - document this routine ;------------------------------------------------------------------------------ .equ DEBOUNCE_VALUE =0xFF ; tcf0_isr: ; push r16 ; check_ib1: ; lds r16,PORTE_IN ; sbrs r16,5 ; if(ib1 is down) rjmp ib1_is_down ; debounce ib1 clr r16 ; else reset debounce counter sts ib1downcnt,r16 ; * jmp check_ib2 ; * ib1_is_down: ; lds r16,ib1downcnt ; Debounce ib1 inc r16 ; * sts ib1downcnt,r16 ; * cpi r16,DEBOUNCE_VALUE ; * breq ib1_debounced ; * ib1_debounced: ; * call sel_wng_pressed ; Call ib1 handling routine check_ib2: ; Check 2nd button on board ; todo check_ib3: ; Check 3rd button on board ; and so on check_eb1: ; Check 1st external button ; and so on check_eb2: ; Check 2nd external button check_eb3: ; Check 3rd external button check_eb4: ; Check 4th external button pop r16 ; reti ; ;------------------------------------------------------------------------------