Re: 89C51ED2
- From: MooseFET <kensmith@xxxxxxxxx>
- Date: Sat, 6 Sep 2008 11:30:12 -0700 (PDT)
On Sep 6, 6:26 pm, "TT_Man" <Some...@xxxxxxxxxxxx> wrote:
">> > Now why does my code always start with an initialisation procedure for
variables
and the 8051 special function registers function I wonder ?
Mine usually starts:
LJMP Startup
.........................
StartUp:
MOV SP,#MainStack
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
WTF is that supposed to do ?
Graham
Set the stack pointer to where you want it to be- #mainStack
Set ports 1,2 and 3 to 0xFF
How hard is that?
BTW my text code didn't get attached in a previous post. So here are some
segments of it......sorry it's long.........
My remarks inserted below
;12 MHz
;CONSTANTS
;SOUND ADDRESSES
.EQU EMPTYS,H'2000 ;"NO ENERGY" will be replaced with new version
.EQU WARN01,H'4622 ;"WARNING" will now be good shot
.EQU HITSND,H'5D18 ;"YOU ARE HIT"
.EQU GOSND,H'85FC ;"GO"
.EQU GUNSND1,H'96A5 ;GUN SOUND1
.EQU GUNSND2,H'D4D9 ;GUN SOUND2
.EQU GUNSND3,H'E5CF ;GUN SOUND3
.EQU GUNSND4,GUNSND3 ;GUN SOUND4
.EQU GAMEND,H'ADF7 ;"GAME OVER"
.EQU BPS524,H'89 ;@16 MHZ = 61, @12 MHZ = 89, @11.0592=92
.EQU BPS600,H'98 ;@16 MHZ = 75, @12 MHZ = 98, @11.0592=A0
.EQU BPS1600,H'D9 ;@16 MHZ = CC, @12 MHZ =D9, @11.0592=DC
.EQU INT100,H'99 ;@16 MHZ = 77, @12 MHZ = 99,@ 11.0592= A4
.EQU CKFREQ,H'BF ;@16 MHZ = FF, @12 MHZ = BF
.EQU DEFID,H'FF ;INVALID GUN ID
.EQU DEFTCD,H'ff ;15 MINUTES DEFAULT TIME CODE
.EQU DEFGMF,H'00 ;TEAM DEFAULT GAME STYLE
.EQU DEFSTS,H'FF ; DEFAULT UNLIMITED SHOTS
.EQU DEFLVS,H'FF ; DEFAULT UNLIMITED LIVES
.EQU DEFINV,H'02 ;INVINCIBLE FOR 13 TO 18.5 SECONDS
.EQU DEFDEL,H'00 ;1 MINUTE INITIAL DELAY
.EQU SPSTRT,H'19 ;STACK POINTER START LOCATION
;BIT CONSTANTS
.EQU BAKLED,P3.7 ;BACK LEDS
.EQU SCL,P3.6 ;NOVA-RAM CLOCK BIT CPU PIN 16
.EQU SDA,P3.5 ;NOVA-RAM DATA BIT CPU PIN 15
I would want to check the levels on this with a scope. Reading from a
port pin on a signal that goes slowly through the 0/1 boundary may
make timing issues.
.EQU DATA,P3.4 ;LED DATA BIT CPU PIN 14
.EQU CLCK,P3.5 ;LED DATA BIT CPU PIN 15
.EQU TRGGER,P3.3 ;TRIGGER
.EQU LASER,P3.2 ;LASER
.EQU TXD,P3.1 ;I/R OUTPUT
.EQU DFLAG,PSW.5 ;DOWNLOAD FLAG
.EQU STFLAG,PSW.1 ;START TRIGGER FLAG
.EQU GFLAG,B.7 ;GAME FLAG, 1=GAME OVER, 0=GAME ON
.EQU TFLAG,B.6 ;TRIGGER FLAG, 1=TRIGGER PULLED
.EQU SFLAG,B.5 ;START FLAG, 1=DURING START DELAY
.EQU LFLAG,B.4 ;LOW FLAG, 1=LESS THAN 10 SHOTS LEFT
.EQU EFLAG,B.3 ;EMPTY FLAG, 1=NO ENERGY
.EQU HFLAG,B.2 ;HIT FLAG, 1=BEEN HIT
.EQU OTFLAG,B.1 ;OLD TRIGGER STATUS FLAG
.EQU IFLAG,B.0 ;INVINCIBLE FLAG, 1=INVINCIBLE
.EQU FLAGS,B ;ALL THE ABOVE FLAGS
;BYTE VARIABLES
.EQU TXCNTR,H'08 ;TX BUFFER COUNTER
.EQU TNFREQ,H'09 ;TONE FREQ
.EQU TNLEN,H'0A ;LENGTH OF BEEPS
.EQU FRQCTR,H'0B ;FREQUENCY COUNTER FOR TONE
.EQU BPNUM,H'0C ;NO OF BEEPS
.EQU DELSIX,H'0D ;SIX SECOND DELAY COUNTER
.EQU RXPREV,H'0E ;PREVIOUSLY RECEIVED IR BYTE
.EQU RXLAST,H'0F ;MOST RECENTLY RECEIVED BYTE
.EQU LEDTIM,H'10 ;256 mS LED CLOCK COUNTER
.EQU LEDRFR,H'11 ;REFRESH 256 mS LED CLOCK
.EQU RXCNTR,H'12 ;RX BUFFER COUNTER
.EQU R13,H'13 ;R13
.EQU R14,H'14 ;R14
.EQU R15,H'15 ;R15
.EQU LEDByte,R15
.EQU DELAYL,H'16 ;DELAY LSB
.EQU DELAYM,H'17 ;DELAY MSB
.EQU CTR100,H'18 ;DELAY REGISTER
.EQU GUNID,H'30 ;GUN ID
.EQU GAMESM,H'31 ;GAMES PLAYED MSB
.EQU GAMESL,H'32 ;GAMES PLAYED LSB
.EQU TIMCOD,H'33 ;TIME CODE 6.5 SECONDS
.EQU SHOTS,H'34 ;SHOTS PER RE-ENERGISE
.EQU LIVES,H'35 ;LIVES
.EQU INVRST,H'36 ;INVINCIBLE TIME CODE RESET VALUE
.EQU DLTIME,H'37 ;LED TIMER
.EQU GMFLAG,H'38 ;GAME FLAG $80 = SOLO $ = TEAM
.EQU SHTSDN,H'39 ;SHOTS DOWN COUNTER
.EQU SHOTSM,H'3A ;SHOTS FIRED MSB
.EQU SHOTSL,H'3B ;SHOTS FIRED LSB
.EQU REENGS,H'3C ;RE-ENERGISES NOW GOOD SHOT FLAG
.EQU LIVSDN,H'3D ;LIVES DOWN COUNTER
.EQU INVCTR,H'3E ;INVINCIBLE TIME CODE COUNTER
.EQU GUNSOUND,H'3F ;
.EQU PCON,H'87 ;POWER CONTROL REGISTER
.EQU EECON,H'0D2 ;EEPROM SFR
.EQU AUXR1,H'0A2
.EQU DAC,P1 ;DIGITAL TO ANALOGUE COUNTER
.ORG H'0000
AJMP START ;GOTO START
.DB " V9.3S" ;VERSION NUMBER
.ORG H'000B
AJMP TIMINT ;100 uS REAL TIME INTERRUPT
.ORG H'0013
AJMP TRGINT ;TRIGGER INTERRUPT
.DB "MINIGUN"
.ORG H'0023 ;SERIAL PORT INTERRUPT
JNB TI,NOTTXI
Are you certain that all of your interrupts don't use up so much time
that the TI or RI can happen a second time while you are processing
the interrupt? Do you handle the case of getting both?
AJMP TXINT ;TX INTERRUPT
NOTTXI: AJMP RXINT ;RX INTERRUPT
;****************************************************************************************************
DoAudio: MOV DAC,R3 ;last value
INC DPTR ;POINT TO NEXT SOUND BYTE
CLR A
MOVC A,@A+DPTR ;GET IT
MOV R3,A ;STORE IT READY FOR NEXT TIME INTERRUPT
JNZ NTimer
MOV DAC,#H'7F ;dac = 1/2 vref out/
SJMP NTimer
;
;
;
TIMINT: PUSH ACC ;SAVE ACCM
PUSH PSW ;SAVE CARRY
CJNE R3,#0,DoAudio
Does the main code or another interrupt touch R3?
NTIMER: DJNZ CTR100,TIMER ;GENERAL PURPOSE TIMER EVERY 100uS
MOV CTR100,DELAYL ;RELOAD LSB OF TIMER
DEC DELAYM ;DECREMENTS EVERY 100uS * DELAY LSB
TIMER: DJNZ R7,RETINT ;GAME TIMER EVERY 100uS
MOV C,TRGGER ;EVERY 25.6mS
MOV OTFLAG,C ;SAVE POSITION OF TRIGGER FOR DEBOUNCE
JB GFLAG,TIMERC ;GAME OVER, NO LEDS
JB HFLAG,TIMERC ;YOU ARE HIT, NO LEDS
TSTLED: DJNZ LEDTIM,TIMERC ;NOT YET 25.6mS * LED REFRESH, NO LEDS
JNB SFLAG,RANDOM ;LEDS, IF NOT DURING START DELAY, RANDOM
CLR DATA ;DURING START DELAY, TURN ON NEXT LED
LJMP CKLEDS ;CLOCK LEDS ROUND
;
;
;;
START: CLR LASER ;LASER OFF
LCALL RESLED ;RESET LED DISPLAYS & BACK LED
Big trouble? That call is before you set the stack. The SP starts
out as 8. Does this explain any problems?
MOV SCON,#H'70 ;MODE 3 WITH PARITY SM2 = 0
ORL PCON,#H'80 ;SMOD=1 ,FE IN SMOD
MOV TMOD,#H'22 ;AUTO RELOAD T1,T0
MOV TH1,#BPS524 ;GUN IR RATE
MOV TH0,#INT100 ;100 MICRO SEC RTC INT 12 MHZ
MOV TCON,#H'50 ;RUN T1 AND T0
SETB IT1 ;TRIGGER INTERRUPT EDGE TRIGGERED
MOV SP,#SPSTRT ;SET STACK POINTER
; NOW READ GUN ID DIP SWITCH
READPORT: MOV A,P0 ;READ PORT
CPL A
MOV B,A
ANL A,#H'0C0
CJNE A,#H'C0,TRYBIT8
AJMP TESTnovreset
TRYBIT8: RLC A
Why not a JB ACC.7 here? I don't see anything else done with ACC.
JC TESTMODE ;DO SPEECH TEST
LJMP NOTTEST ;
TESTnovreset:
JB TRGGER,READPORT
LJMP SETNOV
NOTCX: LJMP NOTTEST
;
;;
;
SETNOV: MOV GUNID,#DEFID ;DEFAULT GUN ID
MOV GAMESL,#H'00 ;ZERO
MOV GAMESM,#H'00 ;GAME COUNTER
MOV TIMCOD,#DEFTCD ;DEFAULT TIME CODE
MOV GMFLAG,#DEFGMF ;DEFAULT GAME STYLE
MOV SHOTS,#DEFSTS ;DEFAULT SHOTS
MOV LIVES,#DEFLVS ;DEFAULT LIVES
MOV DLTIME,#DEFDEL
MOV INVRST,#DEFINV
MOV R0,#GUNID
MOV R1,#H'08
LCALL NOVAWT
MOV H'08,#H'46 ;FMS1
MOV H'09,#H'4D
MOV H'0A,#H'53
MOV H'0B,#H'31
MOV R0,#H'08
MOV R1,#H'04
LCALL NOVAWT
LCALL BEEP5
LJMP ASLEEP
WAIT: ORL PCON,#H'01
JB SFLAG,WAIT ;start up delay while sflag=1
JNB GFLAG,AWAKE
LJMP GMOVER
;SAY GO GO GO, RESET ALL GAME PARAMETERS
AWAKE:
lcall reset_display
MOV FLAGS,#H'00 ;CLEAR FLAGS
MOV LEDRFR,#H'01
MOV LEDTIM,LEDRFR ;SET LEDS REFRESH RATE TO FAST
CLR ES ;STOP SERIAL STUFF WHILST SAYING "GO GO GO"
MOV R4,#H'03 ;3 "GO" S
NEXTGO: LCALL GO ;SET UP "GO" SOUND
LCALL WAITSP ;WAIT TIL IT'S DONE
LCALL GODEL ;A LITTLE DELAY
DJNZ R4,NEXTGO ;REPEAT TWICE MORE
JNB STFLAG,CONTIN ;TRIGGER WAS IN WHEN F3'ED SO CONTINUE GAME
; code jumps to NXTGUN and outputs a phrase 'good shot'somewhere here as
trigger is is not 'in'
MOV R0,#H'7F
NXTGUN: CJNE R0,#GUNSOUND,CLEARIT
LJMP TRYNXGUN
CLEARIT: MOV @R0,#H'00
TRYNXGUN: DEC R0
CJNE R0,#H'37,NXTGUN ;CLEAR GUN LOGGING AREA
CONTIN: MOV R3,#H'00 ;CLEAR AUDIO OUTPUT
MOV R7,#H'00
MOV R6,#H'00
MOV R5,TIMCOD ;SET GAME TIME
ETC ETC
;
;
;
GO: MOV DPTR,#GOSND
LJMP AUDIO
;
;
;
AUDIO: CLR A
MOVC A,@A+DPTR
MOV R3,A
RET
;
;
;
WAITSP: MOV A,R3
JNZ WAITSP
RET
.
- Follow-Ups:
- Re: 89C51ED2
- From: Eeyore
- Re: 89C51ED2
- From: Eeyore
- Re: 89C51ED2
- References:
- Re: 89C51ED2
- From: Robert Baer
- Re: 89C51ED2
- From: MooseFET
- Re: 89C51ED2
- From: Eeyore
- Re: 89C51ED2
- From: MooseFET
- Re: 89C51ED2
- From: Eeyore
- Re: 89C51ED2
- From: TT_Man
- Re: 89C51ED2
- Prev by Date: Re: Solar Panel question
- Next by Date: Re: Dual sine wave generator with variable frequency and 90 degree phase difference
- Previous by thread: Re: 89C51ED2
- Next by thread: Re: 89C51ED2
- Index(es):
Relevant Pages
|
Loading