.def tempreg=r16 .def counterreg=r17 .def outputreg=r22 .equ DIR_PORTA_MASK=0xA8 .equ DIR_PORTB_MASK=0x02 .equ KEY_INTERRUPT_MASK=0x04 .org 0x0 rjmp RESET .org PORTB_INT0_vect rjmp ISR .org INT_VECTORS_SIZE RESET: ; init section ; init counter variable ser outputreg ; initialize 32Mhz clock call SET_CLOCK_32MHZ call INIT_INTR ; init PORTs ; init PORTA (LEDs) ldi tempreg,DIR_PORTA_MASK sts PORTA_DIR,tempreg ; init PORTB ldi tempreg,DIR_PORTB_MASK sts PORTB_DIR,tempreg ; set pull up resitors for PORTB ldi tempreg,PORT_OPC_PULLUP_gc | PORT_ISC_FALLING_gc sts PORTB_PIN0CTRL,tempreg sts PORTB_PIN2CTRL,tempreg ; init LEDs ser tempreg sts PORTA_OUT,tempreg sts PORTB_OUT,tempreg ; global interrupt flag sei MAIN: call READKEYS rjmp MAIN READKEYS: ; check if keys are pressed lds tempreg,PORTB_IN ; is SW1 pressed? sbrs tempreg,2 call SW1_PROC ; is SW2 pressed sbrs tempreg,0 call SW2_PROC ret INIT_INTR: ; activate port interrupt ldi tempreg,PORT_INT0LVL_LO_gc sts PORTB_INTCTRL,tempreg ; select pin2 ldi tempreg,KEY_INTERRUPT_MASK sts PORTB_INT0MASK,tempreg ; set PMIC ldi tempreg,PMIC_LOLVLEN_bm sts PMIC_CTRL,tempreg ret