| ??? 05/24/10 08:26 Modified: 05/24/10 08:57 Read: times |
#176142 - serial communication only works once |
I am talking to my mcu through my pc but it will only respond once.
there are 3 codes that i can send to it, no matter which code i send after reseting the device it responds properly but only to the first code after which i get no responce from the mcu here is my code, i have gone through it many times but can't see why its not working. Can anyone help $MOD51
count2 equ 20h
base equ 40H
; Program start
;;;;;;;;;;;;;;;;
start:
;;;;;;;;;;;;;;;;
MOV R0,#base ; 'WRITE' POINTER
MOV R1,#base ; 'READ' POINTER
MOV COUNT2, #06H
LCALL SERIAL_INIT
;;;;;;;;
endloop:
;;;;;;;;
JMP endloop
ORG 0032H
LJMP SERIAL_ISR
;;;;;;;;;;;;;;;;
SERIAL_INIT:
;;;;;;;;;;;;;;;;
MOV SCON,#52H ;8-BIT UART,REN
MOV TMOD,#20H ;8-BIT AUTO RELOAD MODE
MOV TH1,#-15 ;8333 BPS AUTO RELOAD VALUE
mov PCON, #080h ;To make SMOD =1
SETB EA ;GLOBAL INTERRUPT ENABLE
SETB ES ;SERIAL INTERRUPT ENABLE
SETB PS ;HIGH PRIORITY FOR SERIAL INTERRUPTS
SETB TR1 ;START TIMER
RET
;;;;;;;;;;;;;;;;
SERIAL_ISR:
;;;;;;;;;;;;;;;;
PUSH ACC
JNB RI,TMT
CLR RI
MOV A,SBUF
LCALL HEXCON
LJMP EXITA
;;;;
TMT:
;;;;
CLR TI
;;;;;;
EXITA:
;;;;;;
POP ACC
RETI
;;;;;;;;;;;;;;;;
WRITE_BUF:
;;;;;;;;;;;;;;;;
CJNE R0,#46H,NEXT1 ;CHECK FOR BUFFER RECYCLE
MOV R0,#40H ;CYCLE AGAIN
;;;;;;
NEXT1:
;;;;;;
MOV @R0,A
INC R0
RET
;;;;;
SEND:
;;;;;
MOV SBUF, A
JNB TI, $
CLR TI
RET
;;;;;;;
hexcon:
;;;;;;;
LCALL WRITE_BUF
dec count2
mov a,count2
jz check1
RET
;;;;;;;;;
check1:
;;;;;;;;;
;reads data sent to serial from buffer and compares to find which command was sent
;code1
LCALL BUFFER_READ
CJNE A,#0F1H,EXIT1
LCALL BUFFER_READ
CJNE A,#58H,EXIT1
LCALL BUFFER_READ
CJNE A,#4AH,CHECK2
LCALL BUFFER_READ
CJNE A,#57H,EXIT1
LCALL BUFFER_READ
CJNE A,#42H,EXIT1
LCALL BUFFER_READ
CJNE A,#0D4H,EXIT1
LCALL START_ENABLE
MOV COUNT2,#06H
RET
;;;;;;
EXIT1:
;;;;;;
MOV COUNT2,#06H
RET
;;;;;;;;
CHECK2:
;;;;;;;;
;;;;code2
CJNE A,#0EH,EXIT1
LCALL BUFFER_READ
CJNE A,#01H,EXIT1
LCALL BUFFER_READ
CJNE A,#01H,CHECK3
LCALL BUFFER_READ
CJNE A,#0A7H,EXIT1
LCALL LOW_SPEED_FAN_ON
MOV COUNT2,#06H
RET
;;;;;;;;;
CHECK3:
;;;;;;;;;
;;;code3
CJNE A,#00H,EXIT1
LCALL BUFFER_READ
CJNE A,#0A8H,EXIT1
LCALL LOW_SPEED_FAN_OFF
MOV COUNT2,#06H
RET
;;;;;;;;
DELAYa:
;;;;;;;;
MOV A,#010H
;;;;;;;;
DELAYRa:
;;;;;;;;
dec A
JNZ COUNTb
ret
;;;;;;;
COUNTb:
;;;;;;;
MOV R0,#0FFH
DJNZ R0,$
JMP DELAYRa
;;;;;;;;;;;;;
START_ENABLE:
;;;;;;;;;;;;;;
lcall delaya
MOV A,#0F1H
LCALL SEND
MOV A,#58H
LCALL SEND
MOV A,#47H
LCALL SEND
MOV A,#44H
LCALL SEND
MOV A,#43H
LCALL SEND
MOV A,#0E9H
LCALL SEND
ret
;;;;;;;;;;;;;;;;;
LOW_SPEED_FAN_ON:
;;;;;;;;;;;;;;;;;
lcall delayA
MOV A,#0F1H
LCALL SEND
MOV A,#57H
LCALL SEND
MOV A,#0EH
LCALL SEND
MOV A,#01H
LCALL SEND
MOV A,#0A9H
LCALL SEND
ret
;;;;;;;;;;;;;;;;;;
LOW_SPEED_FAN_OFF:
;;;;;;;;;;;;;;;;;;
lcall delayA
MOV A,#0F1H
LCALL SEND
MOV A,#57H
LCALL SEND
MOV A,#0EH
LCALL SEND
MOV A,#00H
LCALL SEND
MOV A,#0AAH
LCALL SEND
ret
;;;;;;;;;;;;
BUFFER_READ:
;;;;;;;;;;;;
MOV A,R0
MOV B,R1
CJNE A,B,NEXT2 ;COMPARE R0 & R1
LJMP EXIT4 ;NOTHING TO READ(BUFFER EMPTY)
;;;;;;
NEXT2:
;;;;;;
CJNE R1,#46H,NEXT3
MOV R1,#40H ;JUMP TO START (RECYCLE)
;;;;;;
NEXT3:
;;;;;;
MOV A,@R1
INC R1
;;;;;;
EXIT4:
;;;;;;
RET
END
|
| Topic | Author | Date |
| serial communication only works once | 01/01/70 00:00 | |
| Comments? | 01/01/70 00:00 | |
| think i found it | 01/01/70 00:00 | |
Comments! | 01/01/70 00:00 |



