Intelligent Video Conferencing
MC68HC11 Assembly Code for Tracking Subsystem
TMSK1 EQU $22
TFLG1 EQU $23
TCTL2 EQU $21
TIC1 EQU $10
TIC2 EQU $12
INPUT EQU $FFAC
PORTC EQU $1003 ;WE WILL USE PORT C FOR HORIZONTAL ROTATION
DDRC EQU $1007
PORTB EQU $1004
ORG $C000
LDAA #$06
STAA VTOT
LDAA #$10
STAA HTOT
LDAA #$FF
STAA DDRC ;END OF OUTPUT INITIALIZATION
INIT: LDX #BSEQ ;THIS INITIALIZES THE POINTER TO THE SEQUENCE
LDAA 0,X
STAA PORTC
STX HROT
LDX #BSEQ
LDAA 0,X
STAA PORTB
STX VROT
LDAA #$7E
STAA $00E5
STAA $00E8
LDD #CAPT1A ; INITIALIZE PSEUDO VECTORS FOR IC1 AND IC2
STD $00E9
LDD #CAPT2A
STD $00E6
LDX #$1000 ; INITIALIZE INDEX REGISTER
START: CLR COUNT
LDAB #$28 ; CAPTURE FALLING EDGES FOR IC PINS 1 AND 2
STAB TCTL2,X
BCLR TFLG1,X $F8 ;CLEAR FLAGS
BCLR TMSK1,X $FF
BSET TMSK1,X $06 ; ENABLE INTERRUPTS
MAIN: BCLR TFLG1,X $F8
BSET TMSK1,X $06
CLI
WAI
SEI
LDAB STATUS
BEQ MAIN
ON: LDY #$2F
LDAB #$28 ; CAPTURE FALLING EDGES FOR IC PINS 1 AND 2
STAB TCTL2,X
BCLR TFLG1,X $F8 ;CLEAR FLAGS
NULL1: DEY
BEQ START
LDAB #$FF ; DELAY FOR ABOUT 1 SECOND AFTER USER RELEASES SWITCH
NULL2: BRSET TFLG1,X $04 ON
BRSET TFLG1,X $02 ON
BRSET TFLG1,X $06 ON
BRSET TFLG1,X $05 ON
BRSET TFLG1,X $01 ON
BRSET TFLG1,X $07 ON
BRSET TFLG1,X $03 ON
DECB
BNE NULL2
BRA NULL1
;***************** INTERRUPT ROUTINES **************
CAPT1A: CLR TMSK1,X ; DISABLE INTERRUPTS
LDY #15000
DELAY1: DEY
BNE DELAY1
BCLR TFLG1,X $F8 ;CLEAR FLAGS
CHECK: BRSET TFLG1,X $04 ONE
BRSET TFLG1,X $02 TWO
BRA CHECK
ONE: LDAA #2
BRA DONE
TWO: LDAA #1
DONE: CLR TCTL2,X ; DISABLE CAPTURES
LDAB COUNT
BEQ FIRST
BRA OTHER
FIRST: INC COUNT
STAA PREV
OTHER: CMPA PREV
BNE SWEEP
BRA NOSWEEP
SWEEP: LDAB #1 ; 1 MEANS STOP MOVEMENT
STAB STATUS
CLR COUNT
BRA FINISH
NOSWEEP: LDAB #0 ; 0 MEANS CONTINUE MOVEMENT
STAB STATUS
DECA ; CONVERT 2 TO 1 , 1 TO 0
STAA HDIR ; MOVE MOTOR
PSHX
JSR HOROT
PULX
BCLR TFLG1,X $F8 ;CLEAR FLAGS
LDAB #$28
STAB TCTL2,X ; CAPTURE ON FALLING EDGES
FINISH: RTI
CAPT2A: CLR TMSK1,X ; DISABLE INTERRUPTS
LDY #15000
DELAY2: DEY ; DELAY NEEDED TO GET OVER FIRST PSEUDO
BNE DELAY2 ; TRANSIENT
BCLR TFLG1,X $F8 ;CLEAR FLAGS
CHECK2: BRSET TFLG1,X $04 ONEB
BRSET TFLG1,X $02 TWOB
BRA CHECK2
ONEB: LDAA #2
BRA DONEB
TWOB: LDAA #1
DONEB: CLR TCTL2,X ; DISABLE CAPTURES
LDAB COUNT
BEQ FIRSTB
BRA OTHERB
FIRSTB: INC COUNT
STAA PREV
OTHERB: CMPA PREV
BNE SWEEPB
BRA NOSWEEPB
SWEEPB: LDAB #1 ; 1 MEANS STOP MOVEMENT
STAB STATUS
CLR COUNT
BRA FINISHB
NOSWEEPB: LDAB #0 ; 0 MEANS CONTINUE MOVEMENT
STAB STATUS
DECA ; CONVERT 2 TO 1 , 1 TO 0
STAA HDIR ; MOVE MOTOR
PSHX
JSR HOROT
PULX
BCLR TFLG1,X $F8 ;CLEAR FLAGS
LDAB #$28
STAB TCTL2,X ; CAPTURE ON FALLING EDGES
FINISHB: RTI
;**************** SUBROUTINES FOR MOTION ***********************
HOROT: LDX HROT ; THIS STARTS THE ROTATION WHERE IT LEFT OFF
LDAB HNUM ; KEEPS TRACK OF WHERE WE ARE IN SEQUENCE
LDAA HDIR ; THIS WILL GET DIRECTION
; ASSUME 1 IS POS AND 0 IS NEG
BEQ HRSTEP ; IF DIR IS NEG GO TO REVERSE STEP
;;;;;;; This is the forward horizontal movement.
HFSTEP: LDY #$04 ; THIS IS NUMBER OF STEPS TO TAKE
LDAA HTOT ; THIS CHECKS FOR TOO MANY STEPS
CMPA #72
BEQ ENDH
LOOP1: INC HTOT
INX
INCB
CMPB #$04
BEQ RESET1
CONT1: LDAA 0,X ; THIS IS FOR FORWARD HORIZONTAL ROTATION
STAA PORTC ;SENDS BIT PATTERN TO THE HORIZONTAL MOTOR
STY DELAY
LDY #$00FF ; this determines the delay time between steps
TIME1: NOP
NOP
NOP
NOP
NOP
NOP
DEY
BNE TIME1
LDY DELAY
DEY
BEQ ENDH
BRA LOOP1
RESET1: CLRB ; INITIALIZES THE STEP SEQUENCE AGAIN
LDX #BSEQ
BRA CONT1 ; GOES BACK AT BEGINNING OF SEQUENCE
;;;;; This is the reverse horizontal movement.
HRSTEP: LDY #$04 ; THIS IS FOR REVERSE HORIZONTAL ROTATION
LDAA HTOT
BEQ ENDH
LOOP2: DEC HTOT
DEX
DECB
BMI RESET2
CONT2: LDAA 0,X
STAA PORTC
STY DELAY
LDY #$00FF ; this determines the delay time between steps
TIME2: NOP
NOP
NOP
NOP
NOP
NOP
DEY
BNE TIME2
LDY DELAY
DEY
BEQ ENDH
BRA LOOP2
RESET2: LDAB #$03
LDX #ESEQ
BRA CONT2
ENDH: STX HROT
STAB HNUM
RTS
; END OF HORIZONTAL, PUT RETURN SUBROUTINE HERE
VEROT: LDX VROT ; THIS STARTS THE ROTATION WHERE IT LEFT OFF
LDAB VNUM ; KEEPS TRACK OF WHERE WE ARE IN SEQUENCE
LDAA VDIR ; THIS WILL GET DIRECTION
; ASSUME 1 IS POS AND 0 IS NEG
BEQ VRSTEP ; IF DIR IS NEG GO TO REVERSE STEP
VFSTEP: LDY #$02 ; THIS IS NUMBER OF STEPS TO TAKE
LDAA VTOT ; THIS CHECKS FOR TOO MANY STEPS
CMPA #$0C
BEQ ENDV
LOOP3: INC VTOT
INX
INCB
CMPB #04
BEQ RESET3
CONT3: LDAA 0,X ; THIS IS FOR FORWARD VERTICAL ROTATION
STAA PORTB ; SENDS BIT PATTERN TO THE VERTICAL MOTOR
STY DELAY
LDY #$0FFF ; This determines the delay time
TIME3: NOP
NOP
NOP
NOP
NOP
NOP
DEY
BNE TIME3
LDY DELAY
DEY
BEQ ENDV
BRA LOOP3 ; THIS LOOKS FOR THE END OF ONE CYCLE OF THE STEP SEQ.
RESET3: CLRB ; INITIALIZES THE STEP SEQUENCE AGAIN
LDX #BSEQ
BRA CONT3
VRSTEP: LDY #$02 ; THIS IS FOR REVERSE VERTICAL ROTATION
LDAA VTOT ; THIS CHECKS FOR TOO MANY STEPS
BEQ ENDV
LOOP4: DEC VTOT
DEX
DECB
BMI RESET4
CONT4: LDAA 0,X
STAA PORTB
STY DELAY
LDY #$0FFF
TIME4: NOP
NOP
NOP
NOP
NOP
NOP
DEY
BNE TIME4
LDY DELAY
DEY
BEQ ENDV
BRA LOOP4 ; THIS LOOKS FOR THE END OF ONE CYCLE
RESET4: LDAB #$03
LDX #ESEQ
BRA CONT4
ENDV: STX VROT
STAB VNUM
RTS
; END OF VERTICAL PUT RETURN SUBROUTINE HERE
NOP
PREV: BSZ 1
STATUS: BSZ 1
POINTER1: BSZ 1
POINTER2: BSZ 1
POINTER3: BSZ 1
POINTER4: BSZ 1
COUNT: BSZ 1
COUNTER: BSZ 2
COUNTER2: BSZ 2
BSEQ: FCB $0C
FCB $06
FCB $03
ESEQ: FCB $09
HROT: FDB $0000
HNUM: FCB $00
HDIR: FCB $01
VROT: FDB $0000
VNUM: FCB $00
VDIR: FCB $01
DELAY: FDB $0000
HTOT: FCB $24
VTOT:FCB $06
BSZ 500
BOT:BSZ 1