; ; This simple program uses interrupts and targets the atmega328P. It is ; presented in GNU assembler syntax. If you want to use the AVR assembler ; (AVRASM) to assemble it, you will need to modify the syntax slightly. ; ; ; Some equates to associate names with numbers ; .equ _spl, 0x5d .equ _ddrd, 0x2a .equ _portd, 0x2b .equ _mcucr, 0x55 .equ _eimsk, 0x3d .equ _eicra, 0x69 rjmp entry nop rjmp isr_0 nop .org 0x60 isr_0: add r17,r1 reti .org 0x100 entry: eor r1,r1 com r1 neg r1 ldi r16,0x80 ldi r17,0x88 sts _spl,r16 ; init stack ptr lds r24,_ddrd ; load DDRD andi r24,0xfb ; clear PD2 pin sts _ddrd,r24 ; write back to DDRD lds r24,_portd ; load PORTD ori r24,0x04 ; enable pullup for PORTD[2] sts _portd,r24 ; write back to PORTD ; this sets int0 to trigger on rising edge... lds r24,_eicra ; load EICRA ori r24,0x03 ; enable isc00,isc01 sts _eicra,r24 ; write back to EICRA lds r24,_eimsk ; load EIMSK ori r24,0x01 ; enable INT0 in EIMSK sts _eimsk,r24 ; write back to EIMSK ;sei ; enable interrupts sink: add r16,r1 rjmp sink