佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: pkl0001

【讨论】我写的Aasembly有问题,但我抓不到虫。。。

[复制链接]
发表于 14-12-2004 10:54 PM | 显示全部楼层
哎呀!你寄给我的是ASM,不过我需要用到HEX。因为我的Assembler没办法转换Port Number去memory location。结果要一个一个改。不如这样,你寄来你的HEX和你的Assembler。我的Hotmail有250MB。因该没问题吧……
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 15-12-2004 12:35 AM | 显示全部楼层
faiko 于 14-12-2004 10:26 PM  说 :
没有问题~~~!!大家都是交流交流罢了。我也是闲着在家没事做……刚刚才连线上网。
已经收到你的HEX了。慢慢参悟你的原码。迟些答复你!


能跟你和simon交流真的获益不浅。谢谢你们了!!
回复

使用道具 举报

 楼主| 发表于 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 ]
回复

使用道具 举报

Follow Us
 楼主| 发表于 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。。。
明天我会再式式看,再回复你。。。谢谢你,你又帮了我一次。。。。。。感动中。。。。
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
pkl0001 于 16-12-2004 12:05 AM  说 :



基本上当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竟然会停下。。。


没错的话问题应该是这样的。。。。。


只是sensor 2 and sensor 4而已吗?还是全部都会变成这样?要弄清楚一点哦。不然,就很难捉到那只讨厌的虫了。呵呵!!除虫特工队来咯~~~~
回复

使用道具 举报

发表于 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 | 显示全部楼层
faiko 于 16-12-2004 12:12 PM  说 :

只是sensor 2 and sensor 4而已吗?还是全部都会变成这样?要弄清楚一点哦。不然,就很难捉到那只讨厌的虫了。呵呵!!除虫特工队来咯~~~~


对!只是sensor 2 and sensor 4会有动作。。。。。

可是奇怪的是,在我没加sensor_*_bit指令之前这程式是没有问题的。。。。
问题是在我加sensor_*_bit指令之后才出现。。。。
回复

使用道具 举报

 楼主| 发表于 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)。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 2-6-2024 07:34 PM , Processed in 0.067979 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表