ATMEGA32 Code

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 3

/*

* code1.asm
*
* Created: 17/12/2015 12:31:52 PM
* Author: UTMSKUDAI
*/
/*
* code.asm
*
* Created: 16/12/2015 5:35:16 PM
* Author: Nik-Faisal
*/
.INCLUDE "M32ADEF.INC"
.org 0x00
JMP MAIN

//On Reset, jump to MAIN

.org 0x02
JMP ISRINT0

//Vector Table
//On INT0 interrupt, jump to ISRINT0

.org 0x04
JMP ISRINT1

//Vector Table
//On INT1 interrupt, jump to ISRINT1

.org 0x200
//Reserved number in Program Memory
PESALIC : .DB 0X10 ,0x30 , 0X40 , 0X10 ,0X40 ,0X12 ,0X40 ,0X30 ,0X12 ,0X10 ,0X19 ,0XF8 ;(930905035947)
KEROLIC : .DB 0x90 ,0xB0 , 0XC0 , 0X82 ,0XFC ,0XC0 ,0XC0 ,0XB0 ,0X92 ,0XA4 ,0XB0 ,0XF8 ;(930610035237)
SHUKIC : .DB 0x90 ,0xB0 , 0XC0 , 0X80 ,0XA4 ,0X90 ,0XFC ,0XA4 ,0X92 ,0XF8 ,0X92 ,0X92 ;(930829125755)
KDIC:
.DB 0x90 ,0xB0 , 0XFC , 0XC0 ,0XC0 ,0X80 ,0XC0 ,0X99 ,0X92 ,0X82 ,0X99 ,0X80 ;(931008045648)
MAIN:

LDI R17,HIGH(RAMEND)
OUT SPH,R17
LDI R17,LOW(RAMEND)
OUT SPL,R17
LDI R17,0XFF
OUT DDRB, R17
OUT PORTB, R17
LDI R17, 0X00
OUT DDRD,R17
LDI R17, 0XFF
OUT PORTD,R17
LDI R17, 0b11000000
OUT GICR, R17
LDI R17, 0b00001111
OUT MCUCR,R17
SEI

LOOP:

SBIS PIND, 7
CALL PESAL
SBIS PIND, 6
CALL KEROL
SBIS PIND, 5
CALL SHUK
SBIS PIND, 4
CALL KD
LDI R17,0XFF
OUT PORTB,R17
JMP LOOP

; Iniltialise STACK
; LOAD SPH
; LOAD SPL
; SET PORTB AS OUTPUT
; OFF ALL PORTB/LED
; SET PORTD AS INPUT
; PULL UP RESISTOR AT PORTD
; ENABLE INT0,INT1
; BOTH INT0,INT1 RISING EDGE DETECTION
; ENABLE GLOBAL INTERRUPT
;
;
;
;
;
;
;
;

MONITOR PORTD.7
CALL "PESAL" IF PORTD.7=0
MONITOR PORTD.6
CALL "KEROL" IF PORTD.6=0
MONITOR PORTD.5
CALL "SHUK" IF PORTD.5=0
MONITOR PORTD.4
CALL "KD" IF PORTD.4=0

; OFF ALL LED (COMMON ANODE)

;BLINKING 5 TIMES WHENEVER INT0 IS PRESSED


ISRINT0:
LDI R21,5
LDI R20,0X00
; ALL LED LIGHT UP
REPEATINT0:
OUT PORTB,R20 ; DISPLAY THE LED

CALL DELAY100MS ; DELAY 100MS


COM R20
; COMPLIMENT R20
DEC R21
; LOOPING 5 TIMES
BRNE REPEATINT0 ; IF Z=0 IT WILL REPEATINT0, IF Z=1 EXECUTED RETI
RETI
; RETURNS TO THE PLACE WHERE IT WAS INTERRUPTED
;RUNNING LIGHT WHENEVER INT1 IS PRESSED
ISRINT1:
LDI R21,9
; LOAD COUNTER
LDI R20,0b11111110
; LED1 LIGHT UP WHILE THE REST IS OFF
REPEATINT1:
OUT PORTB,R20
; DISPLAY THE LED
CALL DELAY100MS
; DELAY 100MS
ROL R20
; ROTATE LEFT THROUGH CARRY
DEC R21
; LED MOVES FROM LED1 TO LED8 THEN BACK TO LED1
BRNE REPEATINT1
; IF Z=0 IT WILL REPEATINT1, IF Z=1 EXECUTED RETI
RETI
; RETURNS TO THE PLACE WHERE IT WAS INTERRUPTED
;SUBROUTINE CALL PESAL
PESAL:
LDI ZH,HIGH(PESALIC<<1);
LDI ZL,LOW(PESALIC<<1) ;
LDI R17,12
;
REPE1:
LPM R18,Z
;
OUT PORTB,R18
;
CALL DELAY2S
;
INC ZL
DEC R17
;
BRNE REPE1
;
RET
;
;SUBROUTINE CALL KEROL
KEROL:
LDI ZH,HIGH(KEROLIC<<1)
LDI ZL,LOW(KEROLIC<<1) ;
LDI R17,12
;
REPE2:
LPM R18,Z
;
OUT PORTB,R18
CALL DELAY2S
;
INC ZL
DEC R17
;
BRNE REPE2
;
RET
;
;SUBROUTINE CALL SHUK
SHUK:
LDI ZH,HIGH(SHUKIC<<1)
LDI ZL,LOW(SHUKIC<<1)
LDI R17,12
REPE3:
LPM R18,Z
OUT PORTB,R18
CALL DELAY2S
INC ZL
DEC R17
BRNE REPE3
RET
;SUBROUTINE CALL KD
KD:
LDI ZH,HIGH(KDIC<<1)
LDI ZL,LOW(KDIC<<1)
LDI R17,12
REPE4:
LPM R18,Z
OUT PORTB,R18
CALL DELAY2S
INC ZL
DEC R17
BRNE REPE4
RET

;
;
;
;
;
;

LOAD $02
LOAD $00
LOAD COUNTER
LOAD PROGRAM MEMORY
DISPLAY LED
CALL DELAY SUBROUTINE
LOOPING 12 TIMES
IF Z=0 IT WILL GO TO REPE1, IF Z=1 EXECUTED RET
RETURN TO THE ADRESS STORED IN THE STACK
; LOAD $02
LOAD $00
LOAD COUNTER
LOAD PROGRAM MEMORY
; DISPLAY LED
CALL DELAY SUBROUTINE
LOOPING 12 TIMES
IF Z=0 IT WILL GO TO REPE2, IF Z=1 EXECUTED RET
RETURN TO THE ADRESS STORED IN THE STACK
LOAD $02
LOAD $00
LOAD COUNTER
LOAD PROGRAM MEMORY
DISPLAY LED
CALL DELAY SUBROUTINE

; LOOPING 12 TIMES
; IF Z=0 IT WILL GO TO REPE3, IF Z=1 EXECUTED RET
; RETURN TO THE ADRESS STORED IN THE STACK
;
;
;
;
;
;

LOAD $02
LOAD $00
LOAD COUNTER
LOAD PROGRAM MEMORY
DISPLAY LED
CALL DELAY SUBROUTINE

; LOOPING 12 TIMES
; IF Z=0 IT WILL GO TO REPE4, IF Z=1 EXECUTED RET
; RETURN TO THE ADRESS STORED IN THE STACK

;SUBROUTINE CALL DELAY100MS USING TIMER0


DELAY100MS:
LDI R24,0X3D
; COUNTER=C3 : TCTNT=$FF-COUNTER+1
OUT TCNT0,R24
; LOAD TCNT0
LDI R24, 0b00000101
; NORMAL MODE WITH PRESCALE=1024

AGAIN1 :

OUT TCCR0, R24


IN R24,TIFR
SBRS R24,TOV0
RJMP AGAIN1
LDI R24,0X00
OUT TCCR0, R24
LDI R24, (1<<TOV0)
OUT TIFR, R24
RET

;SUBROUTINE CALL DELAY2S USING TIMER1


DELAY2S:
LDI R23, 0X00
OUT TCNT1H, R23
OUT TCNT1L, R23
LDI R23, 0XF4
OUT OCR1AH,R23
LDI R23, 0X23
OUT OCR1AL,R23
LDI R23,0X00
OUT TCCR1A,R23
LDI R23,0b00001011
OUT TCCR1B,R23
AGAIN2:

IN R23, TIFR
SBRS R23,OCF1A
RJMP AGAIN2
LDI R23, 0X00
OUT TCCR1B, R23
LDI R23, (1<<OCF1A)
OUT TIFR, R23
RET

; MONITOR TOV0 FLAG


; STOP TIMER
; RESET TOV=0
; RETURN TO THE ADRESS STORED IN THE STACK
; CTC MODE
; 16 bit,LOAD TNCT1 HIGH
; LOAD TNCT1 LOW
; USE PRESCALE=64, OCR=TCNT+COUNTER-1
; LOAD OCR1A HIGH
; LOAD OCR1A HIGH
; DISABLED PWM
; CTC MODE, CLOCK DIVIDE BY 64
; READ TIFR
; IF OCF1A=1,SKIP NEXT INSTRUCTION
; STOP TIMER
; CLEAR OCF1A FLAG
; RETURN TO THE ADRESS STORED IN THE STACK

You might also like