Embedded Lab Experiment 4 Final
Embedded Lab Experiment 4 Final
SBI DDRC,PINC0
CBI DDRD,PIND2
SBI PORTD,PIND2
CBI DDRD,PIND3
SBI PORTD,PIND3
SEI
LDI R16,0xC0
OUT GICR,R16
LDI R16,0x0F
OUT MCUCR,R16
LD R16,X
OUT PORTA,R16
EX0_ISR1:
ADIW R26,0x01
CPI R26,0x0A
BRGE RED
LD R16,X
OUT PORTA,R16
RETI
EX0_ISR2:
ADIW R26,0x09
CPI R26,0x0A
BRGE RED
LD R16,X
OUT PORTA,R16
RETI
RED: SBIW R26,0x0A
LD R16,X
OUT PORTA,R16
RETI
Delay: LDI R17,0xFF //Loop 1
L1: LDI R18,0xFF // Loop 2
L2: LDI R19,0x04 // Loop 3
L3: NOP
DEC R19
BRNE L3 //Loop 3 End
DEC R18
BRNE L2 //Loop 2 End
DEC R17
BRNE L1 // Loop 1 End
RET
4. C Code for Class Assignment 1
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int x = 0;
unsigned char segBits[] = {
0x3F, // Seven Segment Bits for 0
0x06, // Seven Segment Bits for 1
0x5B, // Seven Segment Bits for 2
0x4F, // Seven Segment Bits for 3
0x66, // Seven Segment Bits for 4
0x6D, // Seven Segment Bits for 5
0x7D, // Seven Segment Bits for 6
0x07, // Seven Segment Bits for 7
0x7F, // Seven Segment Bits for 8
0x6F // Seven Segment Bits for 9
};
int main(void)
{
DDRD = 0x00;
PORTD = 0x0C;
DDRA = 0xFF;
PORTA = segBits[x];
DDRC = DDRC | 0x01;
GICR = 0xC0;
MCUCR = 0x0F;
sei();
while (1)
{
PORTC = PORTC | 0x01;
_delay_ms(500);
PORTC = PORTC & 0xFE;
_delay_ms(500);
}
}
ISR(INT0_vect)
{
x = (x + 1) % 10;
PORTA = segBits[x];
}
ISR(INT1_vect)
{
x = (x + 9) % 10;
PORTA = segBits[x];
}
5. Assembly Code for Class Assignment 2
.INCLUDE "M32DEF.INC"
.ORG 0x0000
RJMP MAIN
.ORG 0x0002
RJMP INT0_ISR
.EQU flag=0x0100
MAIN:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, 0x3F ; Seven Segment Bits for 0
MOV R0, R16
LDI R16, 0x06 ; Seven Segment Bits for 1
MOV R1, R16
LDI R16, 0x5B ; Seven Segment Bits for 2
MOV R2, R16
LDI R16, 0x4F ; Seven Segment Bits for 3
MOV R3, R16
LDI R16, 0x66 ; Seven Segment Bits for 4
MOV R4, R16
LDI R16, 0x6D ; Seven Segment Bits for 5
MOV R5, R16
LDI R16, 0x7D ; Seven Segment Bits for 6
MOV R6, R16
LDI R16, 0x07 ; Seven Segment Bits for 7
MOV R7, R16
LDI R16, 0x7F ; Seven Segment Bits for 8
MOV R8, R16
LDI R16, 0x6F ; Seven Segment Bits for 9
MOV R9, R16
LDI R27, 0x00 ; XH of the register pair X
LDI R26, 0x00 ; XL of the register pair X
LDI R21,0x01;
LDI R22,0x09;
CBI DDRD,PIND2
SBI PORTD,PIND2
LDI R16, 0xFF
OUT DDRA, R16 ; Set PORTA as output
LD R16, X
OUT PORTA, R16 ; Initialize PORTA with segBits[x]
SEI ; Enable global interrupts
LDI R16, 0x40
OUT GICR, R16 ; Enable INT0 interrupt
LDI R16, 0x03
OUT MCUCR, R16 ; Trigger on rising edge
MAIN_LOOP:
LDS R16, flag
CPI R16,0x00
BRNE DOWN_COUNTER
; UP Counter logic
CPI R26,0x0A
BRGE RED
LD R16,X
ADIW R26,0x01
OUT PORTA,R16
RJMP WAIT_DELAY
DOWN_COUNTER:
; DOWN Counter logic
LD R16,-X
OUT PORTA,R16
CPI R26,0x00
BRNE WAIT_DELAY
LDI R26,0x0A
JMP WAIT_DELAY
RED:
SUBI R26,0x0A
RET
WAIT_DELAY:
RCALL DELAY
RJMP MAIN_LOOP
DELAY:
LDI R17, 0xFF ; Loop 1
L1:
LDI R18, 0xFF ; Loop 2
L2:
LDI R19, 0x04 ; Loop 3
L3:
NOP
DEC R19
BRNE L3 ; Loop 3 End
DEC R18
BRNE L2 ; Loop 2 End
DEC R17
BRNE L1 ; Loop 1 End
RETI
INT0_ISR:
LDS R16, flag
EOR R16, R21 ; Toggle flag on INT0 interrupt
STS flag, R16
RETI