#include <avr/io.h>
#include <avr/interrupt.h>
.global main
.global int0_isr
; Configuraci贸n inicial
.org 0x00
rjmp main
.org 0x02
rjmp int0_isr
main:
; configuraci贸n del puntero de pila
; SPH:SPL = 0x08FF (La parte final de la memoria SRAM)
; ATMega328P tiene 2KB de SRAM (del 0x0800 al 0x08FF)
ldi r20, 0xFF
sts _SFR_MEM_ADDR(SPL), r20
ldi r20, 0x08
sts _SFR_MEM_ADDR(SPH), r20
; Se configura INT0 en flanco de bajada (falling edge)
ldi r20, 0x02
sts _SFR_MEM_ADDR(EICRA), r20
; Activamos INT0 - 0b 0000 0001
ldi r20, 0x01
out _SFR_MEM_ADDR(EIMSK), r20 ; M谩scara de Interrupci贸n
; Activamos de forma glboal las interrupciones
sei
; Se activa el Pull-up interno en el Pin2 del Puerto D (PD2)
sbi _SFR_IO_ADDR(PORTD), 2
; PortB como Salida
ldi r17, 0xFF
out _SFR_IO_ADDR(DDRB), r17
; Pone un LED conectado PB3 encendido siempre
repeat:
sbi _SFR_IO_ADDR(PORTB), 3
jmp repeat
int0_isr:
; Manejo de la interrupci贸n
in r16, _SFR_IO_ADDR(PORTB) ; Lee el puerto B
ldi r17, 0x04 ; PB3 - 0000 0100
eor r16, r17
reti