打印

D12的通讯与数据采样,愁死了!

[复制链接]
1851|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wy3168|  楼主 | 2007-8-27 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看一下这个程序:
while(1)
{
usbserve();    //处理USB事件

if (bEPPflags.bits.configuration == 1)       
{
while(1)
{
//MCU_D12CS=1;
func();              //采样程序
//MCU_D12CS=0;        
if (bEPPflags.bits.ep2_rxdone == 1)    //端点2收到数据                
{                            DISABLE();
    bEPPflags.bits.ep2_rxdone = 0;    //清空端点2收到数据标志
    D12_WriteEndpoint(5,64,p);    //发10个字节到PC机批P为数据地址
    ENABLE();
                
  }
 }        
}
}
func();是个40路的采样程序,当端点2收到任意的数据时就把采样数据(地址为P)送到主机上,但是现在主程序里没有采样程序func()时USB枚举与数据收发正常,把采样程序放到主程序里时,数据收发就不可以了,枚举正常.一些网友的评论D12的片选一直有效对片外RAM,A/D等没有影响,那么D12不会对采样程序产生影响啊,我试着采样时释放D12,产生中断时片选D12,但是没有用.谁帮忙解决一下啊,捆绕我好几天了,好郁闷啊!

相关帖子

沙发
jxyhome| | 2007-8-27 19:11 | 只看该作者

看下空间够不

为什么用两个while(1)?

使用特权

评论回复
板凳
wy3168|  楼主 | 2007-8-27 23:26 | 只看该作者

为什么2个while(1)

哦, 刚开始调试的时候没有第二个while(1)总是不能正常枚举,后来才发现是受到干扰,第二个while(1)有没有一样,都能枚举和数据收发。

使用特权

评论回复
地板
wy3168|  楼主 | 2007-8-28 08:17 | 只看该作者

D12

12位A/D的采样地址为8000H和8001H,采样通道为40H-67H,
片为RAM地址为0000H-7FFFH,
D12_DATA=FF02H
D12_COMMANGD=FF03H
拜托大家提点意见了,月底就要交任务了,整个程序的调试就卡在这里了。

使用特权

评论回复
5
gjg191| | 2007-8-28 09:06 | 只看该作者

dd

LZ说得一点也不清楚啊,对 usb影响一可能是速度跟不上二可能是中断影响了

使用特权

评论回复
6
wy3168|  楼主 | 2007-8-28 10:17 | 只看该作者

D12

AD2:MOV R0,#54H       
III:MOV A,R5          ;R5=采样通道
    MOV DPTR,#8000H     ;采样地址
    MOVX @DPTR,A        ;选通采样通道,启动A/D转换
    MOV DPTR,#8001H
LOOP:MOVX A,@DPTR
    JB ACC.7,LOOP       ;等待A/D转换结束
    MOV DPTR,#8001H   ;
    MOVX A,@DPTR       ;读出高位采样数据
    ANL A,#0FH          ;屏蔽掉前4位,留下后4位作为A/D转换高4位(共12位)
    MOVX @R0,A           ;存放采样数据高4位    
    INC R0                                    
    MOV DPTR,#8000H   ;
    MOVX A,@DPTR       ;读出低8位采样数据
    MOVX @R0,A   ;存放采样数据低8位            
    RET
我找到原因了,问题就是这段程序,它是采样程序里A/D转换一个子程序,问题在于这几句:
         MOV DPTR,#8000H     ;采样地址
    MOVX @DPTR,A        ;选通采样通道,启动A/D转换
    MOV DPTR,#8001H
它也类似于片外的一个RAM啊,怎么会影响USB通讯呢?楼上说的速度跟不上我调试过了,不是速度问题;如果说中断受到影响,这几句不会对中断影响吧!

使用特权

评论回复
7
gjg191| | 2007-8-28 10:22 | 只看该作者

dd

你给片外送地址,就会改变I/O口 你再看看硬件

使用特权

评论回复
8
wy3168|  楼主 | 2007-8-28 10:58 | 只看该作者

to dd

具体来说是这句的问题:MOVX @DPTR,A
我知道给片外送地址会改变I/O状态,但是为什么读写片外的RAM对USB没有影响呢?偏偏对A/D操作对USB有影响呢?A/D也是类似片外的RAM啊,再者D12的片选一直有效对片外RAM没有影响, 我试了一下,确实是没影响.但是我在采样之前把D12释放,问题还是存在.

使用特权

评论回复
9
gjg191| | 2007-8-28 11:04 | 只看该作者

dd

在ad转换过程中有个等待过程,如果你的ad转换速度在100多个us那么40个数据就会占用4ms多的时间。

使用特权

评论回复
10
wy3168|  楼主 | 2007-8-28 14:27 | 只看该作者

D12

我用的A/D转换速度资料上说的是10us.
原因应该是gjg191所说的了,在整个采样程序中去掉MOVX @DPTR,A这句,即不启动A/D转换,数据能正常收发了.谢谢你了!
不明白MCU在启动A/D转换后,怎么不能进入中断呢?想不出用什么办法来处理,能给提个建议吗?

使用特权

评论回复
11
gjg191| | 2007-8-28 14:56 | 只看该作者

dd

你用的单片机型号?不应该的阿

使用特权

评论回复
12
gjg191| | 2007-8-28 14:59 | 只看该作者

dd

看你的中断里是否用到ACC寄存器,你压栈了吗?

使用特权

评论回复
13
wy3168|  楼主 | 2007-8-28 15:31 | 只看该作者

D12

单片机型号是AT89C51RC,原来的时候用的是AT89S52,可是S52不支持片外RAM,@R0和@R1的间接寻址指令,MOVX @R0,A ...MOVX @R1,A就是这几条指令在S52中不能正常运行,就换成了C51RC.主程序和中断程序都是用c写的,只有采样程序是用汇编写的啊.ACC应该会自动入栈的啊.

使用特权

评论回复
14
gjg191| | 2007-8-28 15:40 | 只看该作者

dd

你嵌入汇编要很小心的,可能就是这个问题。在调用汇编的时候acc不会自己入栈的

使用特权

评论回复
15
wy3168|  楼主 | 2007-8-28 16:10 | 只看该作者

D12

能给点建议吗?我是第一次用c调用汇编啊.

使用特权

评论回复
16
gjg191| | 2007-8-28 16:24 | 只看该作者

dd

在汇编里你应该对ACC和DPTR压栈还有你用到的通用寄存器都要压栈完了出栈 试试行吗?我也没用过51c调用汇编其实c就可以的阿,你没必要用汇编的

使用特权

评论回复
17
wy3168|  楼主 | 2007-8-28 16:37 | 只看该作者

D12

不行啊,试过了.采样程序几年前就写出来了,用的是汇编,只是想在原来的基础上加上USB通讯.如果把采样程序再用C写恐怕时间不够了.杂办呀?

使用特权

评论回复
18
gjg191| | 2007-8-28 16:47 | 只看该作者

dd

用c写为什么不行啊,也很简单啊!

使用特权

评论回复
19
doob| | 2007-8-28 18:25 | 只看该作者

hi,不主张c嵌汇编

汇编改成c会很难吗?

使用特权

评论回复
20
wy3168|  楼主 | 2007-8-28 18:56 | 只看该作者

该写C

好,听大家的,我用c再写出来吧。希望不会再出问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

88

帖子

1

粉丝