Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
09/01/07 18:45
Read: times


 
#143856 - Another Mode Added ,19200 problem solved
Responding to: ???'s previous message
Hello All . I was getting garble earlier, maybe due to some code error. the code below works fine both for 4800 and 19200 bauds. The crystal used is 11.0592Mhz.
I am writing the GPS data into NVRAM in MODE_0 and getting it back on serial port in MODE_3.

The code has been further refined and shortened by using only one display routine.

RS EQU P2.5
EN EQU P1.2
LCD EQU P0


ORG 0
LJMP MAIN
ORG 0030H
MAIN:
	ACALL CHK_MODE
	ACALL INIT_LCD; INITIALISE LCD
	MOV DPTR,#TITLE; Display Title
	ACALL DISP_ROUTINE
	LJMP DISP_MODE
	
CHK_MODE:SETB P1.0; MAKE THEM AS INPUT PINS  // USING R1
	SETB P1.1;
	MOV A,P1; READING MODE INFO
	ANL A,#03H; STORING ONLY P1.0 AND P1.1
	MOV R1,A; MODE INFO IN R1
RET

INIT_LCD:	
	MOV A, #38H
	ACALL LCDCMD
	MOV A,#02H
	ACALL LCDCMD
	MOV A,#0FH
	ACALL LCDCMD
	MOV A,#80H
	ACALL LCDCMD
	MOV A,#01H
	ACALL LCDCMD
RET

LCDCMD:	   ; COMMAND WORD TO LCD
	MOV LCD,A
	CLR RS
	SETB EN
	ACALL DELAY_INIT
	CLR EN
RET

DELAY_INIT:		 ; DELAY IN NITIALISING
	MOV R7,#0FFH
	LOOP_DELAY_INIT:MOV R0,#0FFH
	JUMPHERE_DELAY_INIT:DJNZ R0,JUMPHERE_DELAY_INIT
	DJNZ R7,LOOP_DELAY_INIT
RET

DISP_CHAR:
	SETB RS
	MOV LCD,A
	SETB EN
	ACALL DELAY_CHAR
	CLR EN
	ACALL DELAY_CHAR
RET

DELAY_CHAR:		;DELAY  	 ; USING R7,R0
	MOV R7,#0FFH
	LOOP_DELAY_CHAR:MOV R0,#0FFH
	JUMPHERE_DELAY_CHAR:DJNZ R0,JUMPHERE_DELAY_CHAR
	DJNZ R7,LOOP_DELAY_CHAR
RET

DISP_ROUTINE:ACALL CLR_LCD
	NEXT_CHAR_DISP_ROUTINE:CLR A
		MOVC A,@A+DPTR	  
		JZ EXIT_DISP_ROUTINE	  ; IF NULL THEN EXIT ELSE CONTINUE DISPLAY
		ACALL DISP_CHAR
		INC DPTR
		SJMP NEXT_CHAR_DISP_ROUTINE
EXIT_DISP_ROUTINE: 
RET
		
DISP_MODE: ACALL CLR_LCD
	MOV DPTR,#MODE	; DISPLAY "MODE"
	ACALL DISP_ROUTINE
	MOV A,#30H
		ORL A,R1
		ACALL DISP_CHAR
		CJNE R1,#0H,CHK_MODE1 ; If R1<>0 then goto LAST
		LJMP MODE_0	   ; if R1=0 then jump to MODE_0
	 CHK_MODE1:	CJNE R1,#1H,CHK_MODE2 ; If R1<>0 then goto LAST
		LJMP MODE_1   ; if R1=0 then jump to MODE_0
	 CHK_MODE2:	CJNE R1,#2H,CHK_MODE3 ; If R1<>0 then goto LAST
		LJMP MODE_2	   ; if R1=0 then jump to MODE_0
	 CHK_MODE3:	CJNE R1,#3H,INVALID_MODE ; If R1<>0 then goto LAST
		LJMP MODE_3	   ; if R1=0 then jump to MODE_0
	 INVALID_MODE:LJMP LAST

DELAY:MOV R7,A  ; USING R7,R0
	LOOP_DELAY:MOV R0,#0FFH
	JUMPHERE_DELAY:DJNZ R0,JUMPHERE_DELAY
		DJNZ R7,LOOP_DELAY
RET
 
CLR_LCD:MOV A,#01H	; CLEARING LCD
	ACALL LCDCMD
	MOV A,#80H
	ACALL LCDCMD
RET

SET_SRL_MODE_0:MOV TMOD,#20H  ; TIMER 1 , AUTO RELOAD MODE
	MOV SCON,#50H  ; 8N1
	MOV TH1,#0FDH; 4800 BAUDS
	MOV A,PCON	 ; DOUBLE THE BAUD RATE
	SETB ACC.7
	MOV PCON,A	; BAUD SET 19200
	SETB TR1	; START TIMER T1
RET

MODE_0:MOV IE,#0H ; DISABLE INTERRUPTS
	MOV DPTR,#ACQUIRING
	ACALL DISP_ROUTINE
	ACALL SET_SRL_MODE_0
	MOV A, #0FFH
	ACALL DELAY
	MOV DPTR,#0000H	
	CHK_NVRAM: ; CHECK IF 8Kx8 NVRAM FULL . ADDRESS 0000H TO 1FFFH
		MOV A,82H; DPTR LOWER BYTE (DPL) TO ACC
		CLR C; CLEAR CARRY
		SUBB A,#0FFH
		JC WAIT_HERE
		CLR C
		MOV A,83H ; DPTR HIGHER BYTE (DPH) TO ACC
		SUBB A,#1FH
		JNC FULL
	WAIT_HERE:JNB RI,WAIT_HERE; WAIT FOR CHAR TO COME IN
		MOV A,SBUF ; GET RECD BYTE 
		MOVX @DPTR,A
		INC DPTR
		CLR RI
		SJMP CHK_NVRAM
	FULL:MOV DPTR,#NVRAMFULL
		ACALL DISP_ROUTINE
		LJMP LAST

MODE_1:NOP  ; to be programmed
	LJMP LAST
MODE_2:NOP  ; to be programmed
	LJMP LAST
MODE_3:MOV IE,#0H	; Disable Interrupts
	MOV TMOD,#20H	; Setting BAUD rate
	MOV TH1,#0FDH  ; 9600 Bauds
	MOV A, PCON
	SETB ACC.7
	MOV PCON,A
	MOV SCON,#50H
	SETB TR1
	MOV DPTR,#UPLOADING
	ACALL DISP_ROUTINE
	MOV DPTR, #0000H
	CHK_NVRAM_3:; CHECK IF 8Kx8 NVRAM FULL . ADDRESS 0000H TO 1FFFH
		MOV A,82H; DPTR LOWER BYTE (DPL) TO ACC
		CLR C; CLEAR CARRY
		SUBB A,#0FFH
		JC SEND_NEXT_BYTE
		CLR C
		MOV A,83H ; DPTR HIGHER BYTE (DPH) TO ACC
		SUBB A,#1FH
		JNC OVER
	SEND_NEXT_BYTE:	MOVX A,@DPTR
		MOV SBUF,A
		WAIT:JNB TI,WAIT; WAIT FOR CHAR TO TRANSMIT
		INC DPTR
		CLR TI
		SJMP CHK_NVRAM_3
	OVER:MOV DPTR,#UPLOADOVER
		ACALL DISP_ROUTINE
	LJMP LAST

TITLE: DB "PROJECT-GPSH",0
MODE: DB "MODE",0
ACQUIRING: DB "ACQUIRING GPS",0
NVRAMFULL:DB "NVRAM IS FULL",0
UPLOADING: DB " UPLOADING DATA",0
UPLOADOVER: DB " UPLOAD OVER",0 

LAST:NOP
END

	

	


List of 24 messages in thread
TopicAuthorDate
Assembler Directive DB            01/01/70 00:00      
   Hmmm... Looks suspiciously like...            01/01/70 00:00      
   see the list file            01/01/70 00:00      
      movbe the db's to the end            01/01/70 00:00      
   Formatted again            01/01/70 00:00      
      highlight            01/01/70 00:00      
         What do you mean?            01/01/70 00:00      
   Keil DB syntax            01/01/70 00:00      
      I think i found the problem            01/01/70 00:00      
         you don't need to do that...            01/01/70 00:00      
            You are Right            01/01/70 00:00      
   Another Bug found            01/01/70 00:00      
      What is the crystal frequency?            01/01/70 00:00      
      I doubt it            01/01/70 00:00      
   Another Mode Added ,19200 problem solved            01/01/70 00:00      
      how do you mean this?            01/01/70 00:00      
         Couldnt get your query            01/01/70 00:00      
            END is not an instruction            01/01/70 00:00      
      END is not an instruction!!!            01/01/70 00:00      
         Got the point ; query about program loop            01/01/70 00:00      
            How microcontroller programs end (or don't)            01/01/70 00:00      
               Alternative to infinite loop            01/01/70 00:00      
            what is an infinite loop?            01/01/70 00:00      
               That must be the reason...            01/01/70 00:00      

Back to Subject List