|
【讨论】我写的Aasembly有问题,但我抓不到虫。。。
[复制链接]
|
|
发表于 14-12-2004 10:54 PM
|
显示全部楼层
哎呀!你寄给我的是ASM,不过我需要用到HEX。因为我的Assembler没办法转换Port Number去memory location。结果要一个一个改。不如这样,你寄来你的HEX和你的Assembler。我的Hotmail有250MB。因该没问题吧…… |
|
|
|
|
|
|
|
楼主 |
发表于 15-12-2004 12:35 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 15-12-2004 12:38 AM
|
显示全部楼层
faiko 于 14-12-2004 10:54 PM 说 :
哎呀!你寄给我的是ASM,不过我需要用到HEX。因为我的Assembler没办法转换Port Number去memory location。结果要一个一个改。不如这样,你寄来你的HEX和你的Assembler。我的Hotmail有250MB。因该没问题吧……
哎呀!我真的是老人家。。。。搞糊涂了,明天我再SEND给你。。。SORRY!! |
|
|
|
|
|
|
|
发表于 15-12-2004 10:28 AM
|
显示全部楼层
pkl0001 于 15-12-2004 12:38 AM 说 :
哎呀!我真的是老人家。。。。搞糊涂了,明天我再SEND给你。。。SORRY!!
没关系。记得要尽早。因为下个星期开学了……剩下几天忙着包装东西,搬回宿舍。可能会迟一些答复你。
加油吧…… |
|
|
|
|
|
|
|
楼主 |
发表于 15-12-2004 08:04 PM
|
显示全部楼层
faiko 于 15-12-2004 10:28 AM 说 :
没关系。记得要尽早。因为下个星期开学了……剩下几天忙着包装东西,搬回宿舍。可能会迟一些答复你。
加油吧……
我已经把.hex file send 给你了,你试试吧!!!
开学了。。。。你的家在哪里。。。 |
|
|
|
|
|
|
|
发表于 15-12-2004 10:50 PM
|
显示全部楼层
pkl0001 于 15-12-2004 08:04 PM 说 :
我已经把.hex file send 给你了,你试试吧!!!
开学了。。。。你的家在哪里。。。
嗯,收到了……你可以告诉我哪里出现问题里吗?整个原码不能操作?还是什么情况下出现状况?
在J_TABLE那里, JNB T1,$ 不知道是否打错了么?应该是TI吧…其实,如果你没有用8051作传送用途的话,大可以不用去理会 TI。因为,当SBUF传送完了里面的single byte之后,TI自然就会变成 1。当TI=1的时候,SBUF就不会进行传送的工作了。这个时候,如果你要传送下一个byte,你就要clear掉TI。当然,如果你没有用来做Tx。那么,可以不用管它。因为Tx pin跟Rx pin是不同的。所以,根本就不会有影响。
而当SBUF接受一个完整的byte后,RI就会变成1。这个时候,你就必须要把SBUF的内容,拷贝到另外一个register里面。然后再clear RI,这样,SBUF才会接受下一个byte。
另外一件事情,我的simulator不可以function了!!!我也不知道发生了什么事。电脑没有办法RUN。所以不能够帮你run 那个code。可能是windows update的latest patch造成的吧……讨厌windows,但是也没办法。因为word documentation还有其他的软体都是用windows。只好低下头了
我本身住在Kepong。我记得你好像是在PJ那里工作么?我过去你那里好了。比较容易讨论跟了解状况,如果你要那个simulator,我也可以给你,记得要有USB port。因为我带pendrive过来。星期四(就是明天)行么?我短消息我的手机号码。你call我,然后在一个地方等。这个周末不行,因为晚上要跟家人出去。
[ Last edited by faiko on 15-12-2004 at 11:51 PM ] |
|
|
|
|
|
|
|
楼主 |
发表于 16-12-2004 12:05 AM
|
显示全部楼层
faiko 于 15-12-2004 10:50 PM 说 :
嗯,收到了……你可以告诉我哪里出现问题里吗?整个原码不能操作?还是什么情况下出现状况?好像看到了小错误,typing error。等我确定了在告诉你。然后再跟你讲TI跟RI的不同。
基本上当8051接受到PC发送过来的讯号后(顺着次序A - J),然后动作。
A - 打开电灯1
B - 打开电灯2
C - 打开电灯3
D - SETB SENSOR_1_BIT
E - SETB SENSOR_2_BIT
F - SETB SENSOR_3_BIT
G - SETB SENSOR_4_BIT
H - SETB SENSOR_5_BIT
I - MOTOR2启动
J - MOTOR1启动。。。
在J-TABLE,如果SENSOR_*_BIT被SETB了之后MOTOR1就应该会停下。
当我从PC发送"A""B""C""I""J"之后,
电灯1 - ON
电灯2 - ON
电灯3 - ON
MOTOR2 - ON
MOTOR1 - ON
因为我发送的讯号里并没有"D""E""F""G""H"。
照例不管SENSOR 1-5 有没有开/关MOTOR1应该不会停下来。
可是问题就是出现在当SENSOR 2和SENSOR 4的时候(没记错的话),MOTOR1竟然会停下。。。
没错的话问题应该是这样的。。。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 16-12-2004 12:11 AM
|
显示全部楼层
faiko 于 15-12-2004 10:50 PM 说 :
嗯,收到了……你可以告诉我哪里出现问题里吗?整个原码不能操作?还是什么情况下出现状况?
在J_TABLE那里, JNB T1,$ 不知道是否打错了么?应该是TI吧…其实,如果你没有用8051作传送用途的话,大可 ...
啊呀!!我看我是真的打错字了把TI打成T1。。。
明天我会再式式看,再回复你。。。谢谢你,你又帮了我一次。。。。。。感动中。。。。 |
|
|
|
|
|
|
|
发表于 16-12-2004 11:04 AM
|
显示全部楼层
pkl0001 于 16-12-2004 12:11 AM 说 :
啊呀!!我看我是真的打错字了把TI打成T1。。。
明天我会再式式看,再回复你。。。谢谢你,你又帮了我一次。。。。。。感动中。。。。
呵呵!没什么啦……偶又不是什么大内高手。大家互相学习罢了。programming最害怕的就是遇上打错别字。有些比较好的编译器(Assembler, Compiler),都会有很好的syntax error handling。不过就没有侦察错别字。 |
|
|
|
|
|
|
|
发表于 16-12-2004 12:12 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 16-12-2004 07:33 PM
|
显示全部楼层
目前暂时还没办法看到虫虫。检测过没有stack overflow。基本上,很大的可能是你的alghorithm有问题。在这里,你的TI bit不会影响整个程序的操作。
有几个小问题要您注意:
--你的short_delay和long_delay subroutine--
R5没有放置一个数值。我想你可能是要放 0 吧……应该要declare。因为按了reset button后,每个microcontroller的内置数值(default value),特别是scratch pad RAM,是会根据不同厂商有不同的东西。要留意datasheet。SFR应该是全部一致的。不过安全上策,看datasheet最好。
--on sensor all bit--
这个subroutine好像没有用到咧……若没有用的话,最好把它删掉。节省空间。因为,8051有不同的内存ROM容量。最大可以到64K,小的甚至有4K。当然价格会越大越贵。
--j table--
你的旁诉说明:if sensor_1_bit on, then jump to go_2。
我想知道一下:你的sensor_*_bit是如何定义on & off呢?
因为你的code跟你的旁诉好像有冲突。如果on = 1; off = 0, 那么JNB SENSOR_1_BIT, GO_2 的意思是:jump if sensor_1_bit is off。
不知道问题能够解决吗?因为不太了解你的问题,不过很大的可能性是你的alghorithm上出了问题。不是上次那个stack overflow。可以的话,找个时间出来一起讨论比较容易。一时三言两语很难讲清楚。
p/s:你的flow chart呢?如果可以画出来的话,那么就很容易解决了。 |
|
|
|
|
|
|
|
楼主 |
发表于 17-12-2004 05:07 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 17-12-2004 05:26 PM
|
显示全部楼层
faiko 于 16-12-2004 07:33 PM 说 :
--j table--
你的旁诉说明:if sensor_1_bit on, then jump to go_2。
我想知道一下:你的sensor_*_bit是如何定义on & off呢?
因为你的code跟你的旁诉好像有冲突。如果on = 1; off = 0, 那么JNB SENSOR_1_BIT, GO_2 的意思是:jump if sensor_1_bit is off。
旁诉if sensor_1_bit on, then jump to go_2是说SENSOR_1_BIT被CLR后就跳到GO_2。
当SENSOR_*_BIT被SETB后就是ON,被CLR后就是OFF。。。
对不起我的旁诉说明搞错了。
我想我的旁诉说明应该只有我一个人看得懂。。。。。。。。(没有专业水准)。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 17-12-2004 05:30 PM
|
显示全部楼层
热烘烘的Flow Chart来啦!!
这是我第一次画,不要损我,给点意见。。。。。
请问应该要用什么软件画Flow Chart。。。。
[ Last edited by pkl0001 on 17-12-2004 at 05:52 PM ] |
|
|
|
|
|
|
|
发表于 17-12-2004 06:00 PM
|
显示全部楼层
好,在给我看看下……不过我想多数是hardware的问题。应该不会是程序的问题。可能sensor太敏感了。 |
|
|
|
|
|
|
|
发表于 18-12-2004 12:06 AM
|
显示全部楼层
嗯……大致上,你的问题应该找出来了,但是不知该怎么解释好呢……首先,问题出现在你J_table的algorithm。之前你说过,加了sensor_*_bit后,问题就出现了。在此之前还好好的,对吗?当然,这个时候,所有的感应器都应该被启动了。
我猜想你要disable一些感应器,所以要想用sensor_*_bit来控制你要的感应器,对吗?
首先,看看你的flowchart:
--我想这句:if sensor 1 bit on then jump 应该是 if sensor 1 bit off(CLR) then jump。对吗?我想你是要skip掉感应器所执行的工作吧。
换句话说:当一个感应器被启动后,若该感应器回应bit 1的话,那么motor就会停下来。然后motor再继续操作;反之,bit 0的话,motor没受到影响。对吗?
很难解释你的原码……不是三言两语就可以讲完(一半的原因是给你的description弄到混淆了,呵呵!)。简单的说,原码的flowchart并不符合你画的flowchart。
你画的flowchart,感应器是从sensor 1,2,3,4,5,6来运作。但是,你的原码却是sensor 2,3,4,5,6,1的顺序来运作。
若给与 ABCIJ 的指令,我觉得SENSOR 1,3,5会有反应……因为我不知道你的Hardware configuration是怎样的,所以只是依据你的原码作出推断。
最后的结论的,虫虫并不存在。是你的J_table algorithm,出现了问题。
P/S:
因为你的microcontroller没有作transmission,所以TI的指令删掉也没问题。而且,对你的问题帮不了什么。
另外,MOV SP,#70H 对你的问题也是解决不了。因为,你没有用到register bank 01,02,03。call subroutine(addr), interrupt service routine(addr), stack 都会存入这里。而刚好是bank 01的R0开始存起。bank 00是default bank。每个bank都有R0 - R7。所以,MOV SP,#70H是要防止stack被overwrite(原因:用了bank 01,02,03的所有register -- R0-R7)。SP是stack pointer的简称。bank 01 & stack 是公用同样的RAM。
建议你用CLR SENSOR_*来DISABLE INPUT……这时候,INPUT脚就不理会感应器的回应(一直都是BIT 0)。 |
|
|
|
|
|
|
|
楼主 |
发表于 18-12-2004 01:11 AM
|
显示全部楼层
啊!对了!对了!
MOTOR1每走一回都会顺着次序经过SENSOR1-6。
因为MOTOR1不是每经过一个SENSOR就停,而是依据PC使用者的指令而动作。
所以我加了SENSOR_*_BIT来DISABLE感应器。
请问有什么指令可以DISABLE外面的INPUT????????????????????
我会再把资料整理一次然后再放上来。。。。。谢谢你。。。。。麻烦你了。。。。 |
|
|
|
|
|
|
|
发表于 18-12-2004 05:30 PM
|
显示全部楼层
pkl0001 于 18-12-2004 01:11 AM 说 :
啊!对了!对了!
MOTOR1每走一回都会顺着次序经过SENSOR1-6。
因为MOTOR1不是每经过一个SENSOR就停,而是依据PC使用者的指令而动作。
所以我加了SENSOR_*_BIT来DISABLE感应器。
请问有什么指令可以DISABLE外面的INPUT????
我想应该是没有……可以试试多用几个port pin来做sensor的 on/off switch。这样就可以disable外面的input了。 |
|
|
|
|
|
|
|
发表于 18-12-2004 05:31 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 19-12-2004 12:49 AM
|
显示全部楼层
;==============================================
; 89C2051 RS232 VIA PC <9600 N 8 1 >
;==============================================
; Input
SENSOR_1 EQU P3.7 ; MOTOR_1 Home Sensor
SENSOR_2 EQU P3.4 ; Sensor_2
SENSOR_3 EQU P3.5 ; Sensor_3
SENSOR_4 EQU P3.3 ; Sensor_4
SENSOR_5 EQU P3.2 ; Sensor_5
SENSOR_6 EQU P1.7 ; Sensor_6
; Output
LAMP_1 EQU P1.0 ; LAMP_1 Relay Card
LAMP_2 EQU P1.2 ; LAMP_2 Relay Card
LAMP_3 EQU P1.3 ; LAMP_3 Light Relay Card
MOTOR_1 EQU P1.1 ; MOTOR_1 Relay Card
MOTOR_2 EQU P1.4 ; MOTOR_2 Relay Card
LED EQU P1.5 ; Power LED
;===============START PROGRAM===================
ORG 0H
CLR LED ; On LED
CALL RS232 ; Open ComPort 9600 N 8 1
;-----------------------------------------------
START:
; Scan RS232 Comport
JNB RI,$ ; Wait Until RI=1
CLR RI ; Clear RI=0, Then Receive Next Byte
MOV A,SBUF ; Read Data Form PC
CJNE A,#'A',CHECK_B ; If PC Data = "A"
CALL A_TABLE ; Then Jump To A_TABLE - LAMP_1
JMP CHECK_B
CHECK_B: CJNE A,#'B',CHECK_C ; If PC Data = "B"
CALL B_TABLE ; Then Jump To B_TABLE - LAMP_2
JMP CHECK_C
CHECK_C: CJNE A,#'C',CHECK_D ; If PC Data = "C"
CALL C_TABLE ; Then Jump To C_TABLE - LAMP_3
JMP CHECK_D
CHECK_D: CJNE A,#'D',CHECK_E ; If PC Data = "D"
CALL D_TABLE ; Then Jump To D_TABLE - SENSOR_1
JMP CHECK_E
CHECK_E: CJNE A,#'E',CHECK_F ; If PC Data = "E"
CALL E_TABLE ; Then Jump To E_TABLE - SENSOR_2
JMP CHECK_F
CHECK_F: CJNE A,#'F',CHECK_G ; If PC Data = "F"
CALL F_TABLE ; Then Jump To F_TABLE - SENSOR_3
JMP CHECK_G
CHECK_G: CJNE A,#'G',CHECK_H ; If PC Data = "G"
CALL G_TABLE ; Then Jump To G_TABLE - SENSOR_4
JMP CHECK_H
CHECK_H: CJNE A,#'H',CHECK_I ; If PC Data = "H"
CALL H_TABLE ; Then Jump To H_TABLE - SENSOR_5
JMP CHECK_I
CHECK_I: CJNE A,#'I',CHECK_J ; If PC Data = "I"
CALL I_TABLE ; Then Jump To I_TABLE - MOTOR_2
JMP CHECK_J
CHECK_J: CJNE A,#'J',START ; If PC Data = "K"
CALL J_TABLE ; Then Jump To K_TABLE - MOTOR_1
CALL SHORT_DELAY
JMP START
;================================================================================
A_TABLE:
; LAMP_1
CLR LAMP_1 ; On LAMP_1 Relay Card
RET
;--------------------------------------------------------------------------------
B_TABLE:
; LAMP_2
CLR LAMP_2 ; On LAMP_2 Relay Card
RET
;--------------------------------------------------------------------------------
C_TABLE:
; LAMP_3
CLR LAMP_3 ; On LAMP_3 Relay Card
RET
;--------------------------------------------------------------------------------
D_TABLE:
; SENSOR_1
CLR SENSOR_1 ; Disable input pin of SENSOR_1
RET
;--------------------------------------------------------------------------------
E_TABLE:
; SENSOR_2
CLR SENSOR_2 ; Disable input pin of SENSOR_2
RET
;--------------------------------------------------------------------------------
F_TABLE:
; SENSOR_3
CLR SENSOR_3 ; Disable input pin of SENSOR_3
RET
;--------------------------------------------------------------------------------
G_TABLE:
; SENSOR_4
CLR SENSOR_4 ; Disable input pin of SENSOR_4
RET
;--------------------------------------------------------------------------------
H_TABLE:
; SENSOR_5
CLR SENSOR_5 ; Disable input pin of SENSOR_5
RET
;--------------------------------------------------------------------------------
I_TABLE:
; MOTOR_2
CLR MOTOR_2 ; On MOTOR_2 Relay Card
RET
;--------------------------------------------------------------------------------
J_TABLE:
; MOTOR_1
JNB SENSOR_1,GO1 ; -When sensor 1 is disable or no action taken,
CALL MOTOR_1_STOP ; --then jump to make motor further moving,
JMP SENSE2 ; ---or else no jump and stop motor 5 sec.
GO1: CALL MOTOR_1_MOVING ;----after then go to sensor 2 --(this apply till sensor 6)--
SENSE2: JNB SENSOR_2,GO2
CALL MOTOR_1_STOP
JMP SENSE3
GO2: CALL MOTOR_1_MOVING
SENSE3: JNB SENSOR_3,GO3
CALL MOTOR_1_STOP
JMP SENSE4
GO3: CALL MOTOR_1_MOVING
SENSE4: JNB SENSOR_4,GO4
CALL MOTOR_1_STOP
JMP SENSE5
GO4: CALL MOTOR_1_MOVING
SENSE5: JNB SENSOR_5,GO5
CALL MOTOR_1_STOP
JMP SENSE6
GO5: CALL MOTOR_1_MOVING
SENSE6: JNB SENSOR_6,GO6
CALL MOTOR_1_STOP
JMP OFF_ALL
GO6: CALL MOTOR_1_MOVING
OFF_ALL: CLR LAMP_1 ; Off LAMP_1 Relay Card
CLR LAMP_2 ; Off LAMP_2 Relay Card
CLR LAMP_3 ; Off LAMP_3 Relay Card
CLR MOTOR_2 ; Off MOTOR_2 Relay Card
CLR MOTOR_1 ; Off MOTOR_1 Relay Card
CALL ON_ALL_SENSOR ; ENABLE ALL THE SENSOR
RET
;===============================================================================
RS232:
; 9600 N 8 1
MOV SCON,#50H ; Set SCON Register In Mode 1 <8 Bit, 1 Stop, Enable Receive>
MOV TMOD,#20H ; Use The Timer 1, Mode 2
MOV TH1,#0FDH ; 9600 Baud Rate
SETB TR1 ; Start The Timer 1
SETB TI
RET
;--------------------------------------------------------------------------------
PROG: DB " CARI "
;--------------------------------------------------------------------------------
SHORT_DELAY:
MOV R6,#25
A1: MOV R7,#25
DJNZ R7,$
DJNZ R6,A1
DJNZ R5,SHORT_DELAY
RET
;--------------------------------------------------------------------------------
LONG_DELAY:
MOV R6,#100
B1: MOV R7,#100
DJNZ R7,$
DJNZ R6,B1
DJNZ R5,LONG_DELAY
RET
;--------------------------------------------------------------------------------
MOTOR_1_MOVING:
CLR MOTOR_1 ; On MOTOR_1 Relay Card
CALL SHORT_DELAY
SETB MOTOR_1 ; Off MOTOR_1 Relay Card
CALL SHORT_DELAY
RET
;--------------------------------------------------------------------------------
MOTOR_1_STOP:
CLR MOTOR_1 ; Off MOTOR_1 Relay Card
CALL LONG_DELAY
RET
;--------------------------------------------------------------------------------
ON_ALL_SENSOR:
SETB SENSOR_1
SETB SENSOR_2
SETB SENSOR_3
SETB SENSOR_4
SETB SENSOR_5
SETB SENSOR_6
RET
DB "SOURCE CODE MODIFIED BY -=fAiKo=- on 12:35 AM 19/12/2004"
;--------------------------------------------------------------------------------
END |
|
|
|
|
|
|
| |
本周最热论坛帖子
|