Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- ; 1DT301, Computer Technology I
- ; Date: 2015-09-03
- ; Author:
- ; Nikolaos Papadopoulos (np222fc)
- ;
- ; Lab number: 3
- ; Title: How to use interrupts
- ;
- ; Hardware: STK600, CPU ATmega2560
- ;
- ; Function: Switch – Ring counter / Johnson counter with interrupt
- ;
- ; Input ports: PORTD
- ;
- ; Output ports: PORTB
- ;
- ; Subroutines: Interrupt & delay as well as Shifts for the counters
- ; Included files: m2560def.inc
- ;
- ; Other information:
- ;
- ; Changes in program: (Description and date)
- ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- .include "m2560def.inc"
- .org 0x00
- rjmp start
- .org INT0addr
- rjmp right
- .org INT1addr
- rjmp normal
- .org INT2addr
- rjmp left
- ;Points to what registers to use
- .org 0x72
- start:
- ;Basic initialization
- ldi r16, 0xFF
- out DDRB, r16
- out PORTB, r16
- ldi r16, 0x00
- out DDRD, R16
- ;Initialize SP, Stack Pointer
- ldi r20, HIGH(RAMEND) ; R20 = high part of RAMEND address
- out SPH,R20 ; SPH = high part of RAMEND address
- ldi R20, low(RAMEND) ; R20 = low part of RAMEND address
- out SPL,R20 ; SPL = low part of RAMEND address
- ;Initialization of interrupt
- ldi r26, 0b00101010
- STS EICRA, r26
- ldi r26, 0b00000111 ;switch
- out EIMSK, r26
- Sei
- ldi r23,2 ;flag
- Main:
- cpi r23, 0
- breq turnR_start
- cpi r23, 1
- breq turnL_start
- cpi r23, 2
- breq normal_light
- rjmp Main
- ;============== Normal light ================
- normal_light:
- ldi r17, 0b00111100
- out portb, r17
- rjmp Main
- ;============== Turning right ================
- turnR:
- ldi r17, 0b00110111 ;and running normal ring counter
- ldi r18, 0b00111111
- ldi r19, 0b00100000
- turnR_start:
- out PORTB, r17
- cp r17, r18
- breq turnR
- lsr r17
- ADD r17, r19
- rcall delay
- rjmp Main
- ;============== Turning left ================
- turnL:
- ldi r17, 0b11101100 ;and running normal ring counter
- ldi r18, 0b11111100
- ldi r19, 0b00000100
- turnL_start:
- out PORTB, r17
- cp r17, r18
- breq turnL
- lsl r17
- ADD r17, r19
- rcall delay
- rjmp Main
- ;=============== Interrupts ====================
- right:
- ldi r17, 0b00110111
- ldi r18, 0b00111111
- ldi r19, 0b00100000
- ldi r23, 0
- reti
- normal:
- ldi r23,2
- reti
- left:
- ldi r17, 0b11101100 ;and running normal ring counter
- ldi r18, 0b11111100
- ldi r19, 0b00000100
- ldi r23,1
- reti
- ;================ DELAY =====================
- delay:
- ; Generated by delay loop calculator
- ; at http://www.bretmulvey.com/avrdelay.html
- ;
- ; Delay 500 000 cycles
- ; 500ms at 1 MHz
- ldi r24, 4
- ldi r25, 138
- ldi r20, 86
- L1: dec r20
- brne L1
- dec r25
- brne L1
- dec r24
- brne L1
- rjmp PC+1
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement