Search code examples
assemblyarduinointerruptavrinterrupt-handling

AVR External Interrupts Triggering in Assembly


I would like to change Arduino Nano (ATMega328p) led pin (13 - PB5) state by triggering an External Interrupt (using pin INT0 - PD2) in AVR Assembly Code.

I am using Atmel's avrasm2 assembler to compile to .hex file. The code is:

.list               
.org 0x0000
    rjmp main
.org 0x0002 
    rjmp INT0_ISR       
.org INT_VECTORS_SIZE
.def dreg = r18
main:           
    cli                
    ldi r17, LOW(RAMEND)
    out SPL, r17
    ldi r17, HIGH(RAMEND)
    out SPH, r17            ; set Stack Pointer
    sbi DDRB, 0x05          ; set PINB5 as output (Pin 13)
    sbi PORTB, 0x05         ; set PINB5
    cbi DDRD, 0x02          ; set PIND2 as input
    cbi PORTD, 0x02
    ldi r16, 0x01           ; enable external interrupts
    sts EIMSK, r16
    ldi r16, 0x05           ; change triggers
    sts EICRA, r16
    ldi r16, 0x20
    sei    
loop:          
    rjmp loop
INT0_ISR:    
    push r17
    in r17, SREG            ; push status register to SP
    com r16
    out PORTB, r16          ; negate PORTB (PINB5)
    out SREG, r17           ; restore status register
    pop r17            
    reti                    ; return from ISR (INT0)

Trying the code both in Atmel Studio's Simulator and Microcontroller the INT0 External Interrupt is not triggering. Could someone tell me what is wrong?

Note: the bouncing effect is solved due to hardware solution, don't mind about that.


Solution

  • You used wrong instruction to save value to EIMSK. EIMSK isn't memory mapped. You should use out instruction

        out EIMSK, r16