Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;***********************************************************
- ;*
- ;* Enter Name of file here
- ;*
- ;* Enter the description of the program here
- ;*
- ;* This is the skeleton file Lab 5 of ECE 375
- ;*
- ;** *********************************************************
- ;*
- ;* Author: Enter your name
- ;* Date: Enter Date
- ;*
- ;***********************************************************
- .include "m128def.inc" ; Include definition file
- ;***********************************************************
- ;* Internal Register Definitions and Constants
- ;***********************************************************
- .def mpr = r16 ; Multi-Purpose Register
- .def button_reg = r17 ; Register for button input
- .def USART_reg = r20 ; Register for USART
- .def zero = r21
- .equ EngEnR = 4 ; Right Engine Enable Bit
- .equ EngEnL = 7 ; Left Engine Enable Bit
- .equ EngDirR = 5 ; Right Engine Direction Bit
- .equ EngDirL = 6 ; Left Engine Direction Bit
- ; Use these commands between the remote and TekBot
- ; MSB = 1 thus:
- ; commands are shifted right by one and ANDed with 0b10000000 = $80
- .equ MovFwd = ($80|1<<(EngDirR-1)|1<<(EngDirL-1));0b10110000 Move Forwards Command
- .equ MovBck = ($80|$00) ;0b10000000 Move Backwards Command
- .equ TurnR = ($80|1<<(EngDirL-1)) ;0b10100000 Turn Right Command
- .equ TurnL = ($80|1<<(EngDirR-1)) ;0b10010000 Turn Left Command
- .equ Halt = ($80|1<<(EngEnR-1)|1<<(EngEnL-1)) ;0b11001000 Halt Command
- .equ FreezRemote = (0b11111000) ;0b11111000 Freez Remote Command
- .equ FreezTag = (0b01010101) ;0b01010101
- ;/////////////////////////////////////////////////////////////
- ;Buttons on Mega128 Board
- ;/////////////////////////////////////////////////////////////
- .equ BUTTON_S1 = 0b00000001
- .equ BUTTON_S2 = 0b00000010
- .equ BUTTON_S3 = 0b00000100
- .equ BUTTON_S4 = 0b00001000
- .equ BUTTON_S5 = 0b00010000
- .equ BUTTON_S6 = 0b00100000
- .equ BUTTON_S7 = 0b01000000
- .equ BUTTON_S8 = 0b10000000
- ;/////////////////////////////////////////////////////////////
- ;USART register values
- ;/////////////////////////////////////////////////////////////
- .equ BAUD_UBRR_HIGH = high(832) ;Baud 2400 --> 832 = $0340 via page 197 of Mega128 datasheet
- .equ BAUD_UBRR_LOW = low(832)
- ;/////////////////////////////////////////////////////////////
- ;Unique TekBot ID
- ;/////////////////////////////////////////////////////////////
- .equ TekBot_ID = 0b01110010 ; Our totally random TekBot ID
- ;***********************************************************
- ;* Start of Code Segment
- ;***********************************************************
- .cseg ; Beginning of code segment
- ;-----------------------------------------------------------
- ; Interrupt Vectors
- ;-----------------------------------------------------------
- .org $0000 ; Beginning of IVs
- rjmp INIT ; Reset interrupt
- .org $0046 ; End of Interrupt Vectors
- ;-----------------------------------------------------------
- ; Program Initialization
- ;-----------------------------------------------------------
- INIT:
- ;Stack Pointer (VERY IMPORTANT!!!!)
- ; Initialize Stack Pointer
- ldi mpr, low(RAMEND)
- out SPL, mpr ; Load SPL with low byte of RAMEND
- ldi mpr, high(RAMEND)
- out SPH, mpr ; Load SPH with high byte of RAMEND
- ;I/O Ports
- ; Initialize Port B for output
- ldi mpr, $00 ; Initialize Port B for outputs
- out PORTB, mpr ; Port B outputs low
- ldi mpr, $ff ; Set Port B Directional Register
- out DDRB, mpr ; for output
- ; Initialize Port D for inputs
- ldi mpr, $FF ; Initialize Port D for inputs
- out PORTD, mpr ; with Tri-State
- ldi mpr, $00 ; Set Port D Directional Register
- out DDRD, mpr ; for inputs
- ;USART1
- ;Set baudrate at 2400bps
- ;Enable transmitter
- ;Set frame format: 8data, 2stop bit
- USART_Init:
- ; Baudrate = 2400
- ; 2400 --> UBRR = 416 by table on page 197 in Mega128 datasheet
- ; Set baud rate
- ldi mpr, BAUD_UBRR_HIGH
- sts UBRR1H, mpr
- ldi mpr, BAUD_UBRR_LOW
- sts UBRR1L, mpr
- ldi mpr, (1<<U2X1)
- sts UCSR1A, mpr
- ; Enable receiver and transmitter
- ldi mpr, (0<<RXEN1)|(1<<TXEN1) ;0 for receive, but 1 for transmit
- sts UCSR1B, mpr
- ; Set frame format: 8data, 2stop bit
- ldi mpr, (1<<USBS1)|(1<<UCSZ10)|(1<<UCSZ11)
- sts UCSR1C, mpr
- ;Other
- clr zero
- ;-----------------------------------------------------------
- ; Main Program
- ;-----------------------------------------------------------
- MAIN:
- ; Pull in button pushes and display on onboard leds
- in button_reg, PIND
- mov mpr, button_reg
- com mpr
- out PORTB, mpr
- mov mpr, button_reg
- andi mpr, BUTTON_S8
- breq BS8
- mov mpr, button_reg
- andi mpr, BUTTON_S7
- breq BS7
- mov mpr, button_reg
- andi mpr, BUTTON_S6
- breq BS6
- mov mpr, button_reg
- andi mpr, BUTTON_S5
- breq BS5
- mov mpr, button_reg
- andi mpr, BUTTON_S2
- breq BS2
- mov mpr, button_reg
- andi mpr, BUTTON_S1
- breq BS1
- rjmp MAIN
- BS8: ; Freez
- ldi USART_reg, TekBot_ID
- rcall USART_Transmit
- ldi USART_reg, FreezRemote
- rcall USART_Transmit
- rjmp DONE
- BS7: ; Halt
- ldi USART_reg, TekBot_ID
- rcall USART_Transmit
- ldi USART_reg, Halt
- rcall USART_Transmit
- rjmp DONE
- BS6: ; Turn Right
- ldi USART_reg, TekBot_ID
- rcall USART_Transmit
- ldi USART_reg, TurnR
- rcall USART_Transmit
- rjmp DONE
- BS5: ; Turn Left
- ldi USART_reg, TekBot_ID
- rcall USART_Transmit
- ldi USART_reg, TurnL
- rcall USART_Transmit
- rjmp DONE
- BS4: ; FREEZ Command
- ldi USART_reg, TekBot_ID
- rcall USART_Transmit
- ldi USART_reg, FreezTag
- rcall USART_Transmit
- rjmp DONE
- BS2: ; Move Forward
- ldi USART_reg, TekBot_ID
- rcall USART_Transmit
- ldi USART_reg, MovFwd
- rcall USART_Transmit
- rjmp DONE
- BS1: ; Move Backward
- ldi USART_reg, TekBot_ID
- rcall USART_Transmit
- ldi USART_reg, MovBck
- rcall USART_Transmit
- rjmp DONE
- DONE:
- rjmp MAIN
- ;***********************************************************
- ;* Functions and Subroutines
- ;***********************************************************
- USART_Transmit:
- ; Wait for empty transmit buffer
- lds mpr, UCSR1A
- sbrs mpr, UDRE1
- rjmp USART_Transmit
- ; Put data (USART_reg) into buffer, sends the data
- sts UDR1, USART_reg
- ret
- ;***********************************************************
- ;* Stored Program Data
- ;***********************************************************
- ;***********************************************************
- ;* Additional Program Includes
- ;***********************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement