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.
You used wrong instruction to save value to EIMSK. EIMSK isn't memory mapped. You should use out instruction
out EIMSK, r16