0% found this document useful (0 votes)
16 views2 pages

AVR IntrrptHndtMdle Asm

This program implements an external interrupt on pin INT1 of an AVR microcontroller. It sets up the interrupt vector, enables the INT1 interrupt in the general interrupt control register, and defines an interrupt service routine (ISR) that will blink an LED 10 times when the interrupt occurs. The ISR saves the status register onto the stack, blinks the LED by decrementing a counter, adds delays between blinks, pops the status register off the stack when done, and returns from the interrupt.

Uploaded by

ee22b059
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views2 pages

AVR IntrrptHndtMdle Asm

This program implements an external interrupt on pin INT1 of an AVR microcontroller. It sets up the interrupt vector, enables the INT1 interrupt in the general interrupt control register, and defines an interrupt service routine (ISR) that will blink an LED 10 times when the interrupt occurs. The ISR saves the status register onto the stack, blinks the LED by decrementing a counter, adds delays between blinks, pops the status register off the stack when done, and returns from the interrupt.

Uploaded by

ee22b059
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 2

/* ASM program to implement External Interrupt INT1 in AVR

* intasm.asm written by Anand IE Lab


*
*/

.nolist ; turn list file generation OFF


.include "m8def.inc"
.list /* turn it ON again */

.org 0 ; set program origin


rjmp reset ; on reset, program starts here

.org 0x0004 ;
rjmp int1_ISR;

reset:

ldi R16, 0x70 ;


out spl, R16
ldi R16, 0x00 /* Guess, why it is done ??? */
out sph, R16

ldi R16, 0x02 ; make PB1 output


out DDRB, ..........; /* fill in here */

ldi R16, ......... ; fill in here


out DDRD, R16 ; make PORTD input

ldi R16,0x08 ; /* enable internal pull-up resistor. This avoids the high impe */
out PORTD, R16 ; /* -dance state while reading data from external world */

in R16, MCUCR ;
ori R16, 0x08 ; why it is Ored?
out MCUCR, R16 ;

in R16, GICR ; enable INT1 interrupt


ori R16, 0x80 ;
out GICR, ..... ; /* fill in here */

ldi R16, 0x00 ;


out PORTB, R16 ;

sei ; /* what does it do? */

indefiniteloop: rjmp indefiniteloop /* Stay here. Expecting interrupt? */


/* reset – the main - loop ends here */

int1_ISR: ; INT1 interrupt handler or ISR


in R16, SREG ; save status register SREG
PUSH ...... ; /* Fill in here. save the status register contents into the stack memory. */
/* StckPntr decremented. StckPntr tracks the lower end of ACTIVE stack. PC is */
/* PUSHed automatically, by default. No need for explicit instruction */

ldi R16,0x0a ; blink led 10 times by storing R0 a value of 10 & decrementing


mov R0, R16 /* to zero realises the LED blinking 10 times */
back5: ldi R16,0x02 ; Turn on LED
out PORTB, R16 /* LED connected to penultimate bit (B1) of PORTB */

delay1:LDI R16,0xFF ; delay

back2: LDI R17,0xFF ; /* back2 loop starts.. adds delay */


back1: DEC ....... /* fill in. Innermost delay loop. Each execution cycle is of T_clk */
BRNE back1 /* branch if not equal – means go on in loop till R* goes 0 */
DEC R16 /* for each inner loop run, an equal amount of delay in outer loop */
BRNE back2 /* how many clock cycles for ON period? */

/* Till this time LED is ON. First part of duty cycle ends */

ldi R16,0x00 ; Turn off LED


out PORTB, .... ; /* fill-in here */

delay2:LDI R16,0xFF ; delay – OFF period. Second part of duty cycle starts
back3: LDI R17,0xFF
back4: DEC R7
BRNE back4

DEC R16
BRNE back3

DEC ...... /* Fill in here. Initially R0 = 10. Completes ONE duty cycle */
BRNE back5 ; /* R0-- till 0. 10 times blinking */

POP R16 ; retrieve status register. The stack’s lower end is incremented
out SREG, R16 /* meaning stckPntr++; In “pop R16” instruction, the topend
/* stack location’s value is espewed out and is stored in R16 */

RETI ; go back to main program and set I = 1 (enabling interrupts as the current ISR is executed)

You might also like