You are on page 1of 4

; K101 CPU PROM VER: ROPA 0.

032 for Magnetometer data interleaving


; K101 CPU PROM VER: Cascades TST 0.10.019 for Magnetometer data interleaving
; based on K101 CPU PROM VER: Cascades TST 0.016 which was based on TEST 0.014

;directives added to make MetaLink ASM51.EXE happy:


$MOD51
$TITLE(K101 CPU PROM VER: ROPA 0.032 for Magnetometer)
$PAGEWIDTH(132)
$NOPAGING
$NODEBUG
$SYMBOLS
$OBJECT

;FAST_OUT EQU 1 ;probably keep on for flight


FAST_OUT EQU 0
;SKIP_TWO EQU 1 ;on RESET skip two words out
SKIP_TWO EQU 0 ;on RESET skip two words out
IF (SKIP_TWO)
SKIP_ONE EQU 1 ;on RESET skip one word out
ELSE
SKIP_ONE EQU 1 ;on RESET skip one word out
;SKIP_ONE EQU 0 ;on RESET skip one word out
ENDIF ;IF (SKIP_TWO)

USING 0 ;Select addresses for Bank 0

; PORT USAGE
; P0 FIFO output
; P1 TEST bit & ADC serial interface bits
; P2 UNUSED (DAC serial interface bits)
; P3 SINGLE BIT I/O

; IO BITS
MAJF BIT P3.0
;MINF BIT P3.1
PPS1 BIT P3.2
;INT1 BIT P3.3
; BIT P3.4 ; (NOT USED)
EVENT BIT P3.5
;WR BIT P3.6 ;LOAD FIFO
; BIT P3.7

; IO BITS
TST BIT P1.1 ;PAYLOAD TEST INPUT

ADCK BIT P1.3 ;ADC CLOCK


ADCS BIT P1.4 ;ADC CHIP SELECT
ADX BIT P1.5 ;ADC DATA - magnetometer X
ADZ BIT P1.6 ;ADC DATA - magnetometer Z
ADY BIT P1.7 ;ADC DATA - magnetometer Y

;REG USAGE
;R0 SCRATCH
;R1 MAG X ADC high word
;R2 MAG Y ADC high word
;R3 MAG Z ADC high word
;R4 MAG X ADC low word
;R5 MAG Y ADC low word
;R6 MAG Z ADC low word
;R7

;INTERNAL RAM
;directive added to make MetaLink ASM51.EXE happy:
DSEG ;directly addressable Data memory SEGment definition

ORG 8H
IGNORE: DS 3

VEC1L: DS 1
VEC1H: DS 1

DS 8
ORG 3FH
STACK: DS 8

;directive added to make MetaLink ASM51.EXE happy:


CSEG ;code memory SEGment definition
ORG 0
JMP RESET ;1us JUMP AROUND INTR HANDLER

; ---------------------------------
ORG 13H
; External INT 1 vectors to here, so each external INT 1 will jump via this
; dispatch code to the appropriate PROGn
INTV1:
MOV SP,#VEC1H ;1us JUMP INDIRECT THRU VEC BY LOADING SP
RETI ;1us AND DOING A RET
; ---------------------------------

;-------------------------------------72 code -----------------------


; RESET HAPPENS ONLY ON POWER UP (OR ATTEMPT TO READ EMPTY FIFO)
RESET:
IF (FAST_OUT)
CLR ADCK
IF (SKIP_TWO)
; MOV A,#11 ;MAG X HIGH
; MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
; MOV A,#22 ;MAG X LOW
; MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
ELSE
IF (SKIP_ONE)
; MOV A,#11 ;MAG X HIGH
; MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
ELSE
MOV A,#11 ;MAG X HIGH
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
ENDIF ;IF (SKIP_ONE)
MOV A,#22 ;MAG X LOW
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
ENDIF ;IF (SKIP_TWO)
MOV A,#55 ;MAG Y HIGH
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
MOV A,#66 ;MAG Y LOW
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
MOV A,#33 ;MAG Z HIGH
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
MOV A,#44 ;MAG Z LOW
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
ENDIF ;IF (FAST_OUT)

MOV SP,#STACK
CLR ADCK
MOV VEC1H,#01H
MOV VEC1L,#00H ;1us 100H LEAVES ROOM FOR RESET CODE
MOV TCON,#04H ;1us EDGE TRIG FOR INT1

SETB ADCS ;DESELECT ADCs


SETB ADCK

MOV R1,#11 ;INITIALIZE DATA VALUES TO TEST VALUES in same order they will be output
MOV R4,#22
MOV R2,#55
MOV R5,#66
MOV R3,#33
MOV R6,#44

MOV IE,#84H ;1us ENABLE EXT INT1


JMP INTV1 ;1us

; EVENT WAIT LOOP


WT:

WT_: ; hang in wait loop until INT1 comes along


NOP
JMP WT_

; READ MAGS (??us)


RDMAG:
; ADCs were selected in INT1 handler prior to jumping here
MOV IE,#00H ;1us DISABLE EXT INT1

SETB ADCK ;8us DELAY FROM CS LOW


; MOV A,#0
CLR A
MOV R1,A ;ZERO R1 MAG X RESULT
MOV R2,A ;ZERO R2 MAG Y RESULT
MOV R3,A ;ZERO R3 MAG Z RESULT
MOV R4,A ;ZERO R4 MAG X RESULT
MOV R5,A ;ZERO R5 MAG Y RESULT
MOV R6,A ;ZERO R6 MAG Z RESULT
CLR ADCK

MOV R0,#7 ;SKIP HIGHEST EIGHT BITS WHICH ARE ALL ZEROS
;use 7 not 8 here because first bit is shifted out
;by selecting the chip, so need only shift 7 more out
;Originally used 8 here because of misunderstanding, so
;lowest bit of LSByte was always 0 and values were x2

NXBIT3:

MOV A,R1 ;12us/BIT


MOV C,ADX ;READ X BIT
RLC A ;SHIFT IT

MOV A,R2
MOV C,ADY ;READ Y BIT
SETB ADCK
RLC A ;SHIFT IT

MOV A,R3
MOV C,ADZ ;READ Z BIT
RLC A ;SHIFT IT
CLR ADCK
DJNZ R0,NXBIT3

MOV R0,#8 ;READ HIGHEST EIGHT BITS

NXBIT:

MOV A,R1 ;??us/BIT


MOV C,ADX ;READ X BIT
RLC A ;SHIFT IT
MOV R1,A ;SAVE X RESULT IN R1

MOV A,R2
MOV C,ADY ;READ Y BIT
SETB ADCK
RLC A ;SHIFT IT
MOV R2,A ;SAVE Y RESULT IN R2

MOV A,R3
MOV C,ADZ ;READ Z BIT
RLC A ;SHIFT IT
MOV R3,A ;SAVE Z RESULT IN R2
CLR ADCK
DJNZ R0,NXBIT

MOV R0,#8 ;READ LOWEST EIGHT BITS

NXBIT2:
MOV A,R4 ;??us/BIT
MOV C,ADX ;READ X BIT
RLC A ;SHIFT IT
MOV R4,A ;SAVE X RESULT IN R4

MOV A,R5
MOV C,ADY ;READ Y BIT
SETB ADCK
RLC A ;SHIFT IT
MOV R5,A ;SAVE Y RESULT IN R5

MOV A,R6
MOV C,ADZ ;READ Z BIT
RLC A ;SHIFT IT
MOV R6,A ;SAVE Z RESULT IN R6
CLR ADCK

DJNZ R0,NXBIT2

SETB ADCS ;DESELECT ADCs after reading all bits


SETB ADCK

MOV SP,#STACK
MOV IE,#84H ;1us ENABLE EXT INT1
JMP WT
;-------------------------------------------------------
ORG 100H

PROG0:
CLR ADCK ;CLEAR sclk prior to starting conversion
CLR ADCS ;START CONVERSION prior to writing out previous values

; WRITE OUT PREVIOUSLY READ MAGNETOMETER DATA


MOV A,R1 ;MAG X HIGH
MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
CLR A
MOV R1,A ;MAG X HIGH

MOV A,R4 ;MAG X LOW


MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
CLR A
MOV R4,A ;MAG X LOW

MOV A,R2 ;MAG Y HIGH


MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
CLR A
MOV R2,A ;MAG Y HIGH

MOV A,R5 ;MAG Y LOW


MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
CLR A
MOV R5,A ;MAG Y LOW

MOV A,R3 ;MAG Z HIGH


MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
CLR A
MOV R3,A ;MAG Z HIGH

MOV A,R6 ;MAG Z LOW


MOVX @R0,A ;WRITE TO FIFO. (ADDR NOT USED)
CLR A
MOV R6,A ;MAG Z LOW

JMP RDMAG

JMP RESET ;should never get here, so if we do RESET

END

You might also like