; MegaMazer Version 1.1 11/11/03 .nolist .include "c:\avrtools\AppNotes\m128def.inc" .list ;------ Display Commands ------------------------------------ .equ cmdBackSpace = 8 .equ cmdTab = 9 .equ cmdLF = 10 .equ cmdFormFeed = 12 .equ cmdCr = 13 .equ cmdReset = 14 .equ cmdSetGeometry = 15 .equ cmdSetTabSize = 16 ;send negative value of tab size .equ cmdCursorXY = 17 ;zero based row, then column .equ cmdSetContrast = 19 ;0-255 .equ cmdBacklight = 20 ;0-255 ;------ Key Constants --------------------------------------- .equ KeySelect = 1 .equ KeyUp = 2 .equ KeyDown = 3 .equ KeyLeft = 4 .equ KeyRight = 5 ;------ Serial Command Constants ---------------------------- .equ cmdSingle = 0x11 .equ cmdStatus = 0x22 .equ cmdRescan = 0x33 ;------ PortB Defines --------------------------------------- .equ SelectButton = 0 ;TPA Nav button .equ GreenLED = 1 ;green LED .equ RedLED = 2 ;red LED .equ Fled = 4 ;Floor LED enable (active high) ;------ PortD Defines --------------------------------------- .equ SCL = 0 ;TWI clock .equ SDA = 1 ;TWI data ;------ PortE Defines --------------------------------------- .equ RightButton = 2 .equ LeftButton = 3 .equ DownButton = 4 .equ UpButton = 5 .equ LeftBumper = 6 ;Left bumper switch .equ RightBumper = 7 ;Right bumper switch ;------ PortF Defines ---------------------------------------- .equ LeftFrontWall = 0 ;range sensors .equ RightFrontWall = 1 .equ FrontWallSensor = 2 .equ RearFloorSensor = 3 .equ FrontFloorSensor = 4 .equ RightSensor = 5 .equ LeftSensor = 6 .equ BatteryMonitor = 7 ;------ Macros for Port control ------------------------------ .macro GreenLEDon cbi portb,GreenLED ;turn on green LED .endm .macro GreenLEDoff sbi portb,GreenLED ;turn off green LED .endm .macro RedLEDon cbi portb,RedLED ;turn on red LED .endm .macro RedLEDoff sbi portb,RedLED ;turn off red LED .endm .macro FloorLEDon sbi portb,Fled ;turn on floor LED's .endm .macro FloorLEDoff cbi portb,Fled ;turn off floor LED's .endm .macro EnableBumperInt ldi r16,0b10100000 ;configure external interrupts for out eicrb,r16 ;falling edge triggering ldi r16,0b11000000 ;enable bumper interrupts out eimsk,r16 .endm .macro DisableBumperInt ldi r16,0 out eicrb,r16 ldi r16,0 ;disable bumper interrupts out eimsk,r16 .endm ;------ Mode Constants -------------------------------------- .equ mRun = 0 ;run the maze .equ mSingleStep = 1 ;debug mode .equ mDiagnostic = 2 ;display diagnostic information .equ mDataDump = 3 ;send data out serial port .equ mAlign = 4 ;wall alignment test .equ mSpinTest = 5 ;do 4 90 degree spins .equ mSetup = 6 ;select the direction priorities .equ mCustom = 7 ;custom testing .equ mLastMode = 8 ;last mode constant ;------ SingleStep Display Modes ------------------------ .equ ssdCell = 0 ;displays current cell .equ ssdHeading = 1 ;displays heading .equ ssdLive = 2 ;displays stored sensor readings .equ ssdStored = 3 ;displays live sensors .equ ssdLast = 4 ;last mode ;------ Flag Bits --------------------------------------- .equ Tick = 0 ;Timer Tick bit .equ SingleStep = 1 ;run the single step mode .equ Jogging = 2 ;a course adjustment is in progress .equ Bumper = 3 ;bumper flag .equ BallFound = 4 ;ball flag .equ InBallRoom = 5 ;let's us know when we're in the ball room ;------ MotorStatus Bits ------------------------------- .equ mtrRunning = 0 ;motors are running .equ mtrBackward = 1 ;set robot goes backwards .equ mtrTurning = 2 ;robot is turning ;------ Heading Constants ------------------------- .equ North = 0 .equ East = 1 .equ South = 2 .equ West = 3 ;------ Setup Constants --------------------------- .equ sNESW = 0 .equ sESWN = 1 .equ sSWNE = 2 .equ sWNES = 3 .equ sLastSetup = 4 ;------ Register Defines -------------------------------- .def SaveSreg = r0 ;used in all ISR's .def DelayTemp = r1 ;can be used in ISR routines .def MyLoop = r2 ;used for various loops .def CheckSum = r3 ;checksum for PC messages .def ADChi = r4 ;used in ADC ISR .def NewHeading = r5 ;used in ChangeHeading .def Setup = r6 ;contains setup (direction priority) .def NewPhase = r7 ;used in Timer2 to update stepper drive phase .def JogMask = r8 ;used in Timer2 to update stepper drive phase .def PhaseIndex = r9 ;current drive phase for motor .def BufferLo = r10 ;holds the datalog pointer .def BufferHi = r11 .def FrontReading = r12 ;used in wall alignment routines .def Acc = r16 ;used as accumulator .def Mode = r17 ;running mode .def Flags = r18 ;Flag bits .def MotorStatus = r19 ;Stepper motor status .def Heading = r20 ;current heading .def Cell = r21 ;current cell information .def PhaseCount = r22 ;counts number complete phases .def SSDmode = r23 ;current singlestep display mode ; r26 ;X register used as cell pointer ; r28 ;Y register used to store status block with ADC results ; r30 ;Z register used for IJMPs ;------ Ram Defines ------------------------------------- .equ StatusBlock = 0x100 ;begining of status block .equ sbLeftFrontWall = 0x100 ;current value for left front wall .equ sbRightFrontWall= 0x101 ;current value for right front wall .equ sbFrontWall = 0x102 ;current value for front wall .equ sbRearFloor = 0x103 ;current value for Rear floor .equ sbFrontFloor = 0x104 ;current value for Front Floor sensor .equ sbRightWall = 0x105 ;current value for right wall .equ sbLeftWall = 0x106 ;current value for left wall .equ sbBattery = 0x107 ;current value for battery .equ sbCompass = 0x108 ;no longer used .equ sbStartBearing = 0x10A .equ sbHeading = 0x10C ;0=N, 1=E, 2=S, 3=W .equ sbBumpers = 0x10D .equ sbCellNumber = 0x10E .equ sbScanCell = 0x10F .equ sbRunningMode = 0x110 ;Current Running Mode (Explore, Retreat, Finish) .equ sbCheckSum = 0x111 .equ StoredLeftWall = 0x112 ;save wall scans for debuging single-step .equ StoredRightWall = 0x113 .equ StoredFrontWall = 0x114 .equ PhaseTableN = 0x120 ;contains phase drive data for steppers .equ PhaseTableT = 0x130 ;contains phase drive data for turning steppers .equ CellArray = 0x200 ;cell used to map the maze .equ DataLog = 0x600 ;logs sensor data ;------ Interrupt Vactor Table -------------------------- .cseg .org 0 jmp start ;RESET .org 2 reti ;INT0 External Interrupt Request .org 4 reti ;INT1 External Interrupt Request .org 6 reti ;INT2 External Interrupt Request .org 8 reti ;INT3 External Interrupt Request .org 0xa reti ;INT4 External Interrupt Request .org 0xc reti ;INT5 External Interrupt Request .org 0xe jmp INT6isr ;INT6 External Interrupt Request (bumper) .org 0x10 jmp INT6isr ;INT7 External Interrupt Request (bumper) .org 0x12 jmp Timer2 ;TIMER2 COMP Timer/Counter2 Compare Match .org 0x14 reti ;TIMER2 OVF Timer/Counter2 Overflow .org 0x16 reti ;TIMER1 CAPT Timer/Counter1 Capture Event .org 0x18 reti ;TIMER1 COMPA Timer/Counter1 Compare Match A .org 0x1a reti ;TIMER1 COMPB Timer/Counter1 Compare Match B .org 0x1c reti ;TIMER1 OVF Timer/Counter1 Overflow .org 0x1e jmp Timer0 ;TIMER0 COMP Timer/Counter0 Compare Match .org 0x20 reti ;TIMER0 OVF Timer/Counter0 Overflow .org 0x22 reti ;SPI, STC SPI Serial Transfer Complete .org 0x24 reti ;USART0, RX USART0, Rx Complete .org 0x26 reti ;USART0, UDRE USART0 Data Register Empty .org 0x28 reti ;USART0, TX USART0, Tx Complete .org 0x2a jmp ADCisr ;ADC ADC Conversion Complete .org 0x2c reti ;EE READY EEPROM Ready .org 0x2e reti ;ANALOG COMP Analog Comparator .org 0x30 reti ;TIMER1 COMPC Timer/Countre1 Compare Match C .org 0x32 reti ;TIMER3 CAPT Timer/Counter3 Capture Event .org 0x34 reti ;TIMER3 COMPA Timer/Counter3 Compare Match A .org 0x36 reti ;TIMER3 COMPB Timer/Counter3 Compare Match B .org 0x38 reti ;TIMER3 COMPC Timer/Counter3 Compare Match C .org 0x3a reti ;TIMER3 OVF Timer/Counter3 Overflow .org 0x3c reti ;USART1, RX USART1, Rx Complete .org 0x3e reti ;USART1, UDRE USART1 Data Register Empty .org 0x40 reti ;USART1, TX USART1, Tx Complete .org 0x42 reti ;TWI Two-wire Serial Interface .org 0x44 reti ;SPM READY Store Program Memory Ready ;**************************************************************** ; Timer0 - Timer Interrupt Service Routine * ; Entry occurs every 1ms * ;**************************************************************** Timer0: in SaveSreg,sreg ;save status register sbr Flags,1<