3349|5

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于奇异的中断问题 [复制链接]

请教各位高手:

我使用的单片机是STC89C54;
实现的功能是:单片机做为PC机应用程序和PCL6045B(注:(运动控制芯片)是一种通过总线接收CPU命令并产生脉冲来控制步进电机或脉冲驱动型伺服电机的CMOS大规模集成电路芯片)之间的桥梁;通过CH372(注:USB总线的通用设备接口芯片)传送数据.单片机控制PCL6045,向PCL6045读出或写入数据,并把PCL6045内读出的数据实时反馈给PC的应用程序.

现在出现了个奇怪的问题,当我给单片机上电后(程序已经烧到里面了),通过"超极终端"查看程序的执行流程;一开始程序是在MAIN函数中循环执行,当我起动PC应用程序后,处发了CH372中断,进入到CH372的中断程序中执行;正常情况下,当我把PC应用程序关闭后,单片机程序程序返回到主函数中,可是通过"超极终端"的反馈信息来看,程序回不去了,不知道为什么?

希望那位高手指点一下,谢谢








最新回复

怎么没人回答呀? 自己顶一下吧!  详情 回复 发表于 2009-3-30 13:31
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
说说你的中断处理函数是怎么做的
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
贴代码出来啊
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
/* CH372中断服务程序,使用寄存器组0 */
void mCh372Interrupt(void ) interrupt 2 using 0
{
        static xdata unsigned char InterruptStatus;
        static xdata unsigned char i, length;

        EA=0;
        CH372_CMD_PORT=        CMD_GET_STATUS ;  /* 获取中断状态并取消中断请求        */
        Delay1us_II();
        InterruptStatus        = CH372_DAT_PORT;  /* 获取中断状态 */

        switch ( InterruptStatus )         /* 分析中断状态处理 */
        {

                case USB_INT_EP2_OUT: /*        批量端点下传成功 */         
                {
                        CH372_CMD_PORT=CMD_RD_USB_DATA ;  /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
                        Delay1us_II();
                        length = CH372_DAT_PORT;  /* 首先读取后续数据长度 */

                        for        ( i        = 0; i < length; i ++ )       
                        {
                                buffer[        i ]        = CH372_DAT_PORT;  /* 接收数据包 */
                                Delay1us_II();
                        }

                        switch (buffer[7])
                        {
                                #if        1
                                                case 0x99:
                                                case 0x98:
                                                case 0x92:
                                                case 0x91:
                                                        //EA=0;
                                                        if(ORG_MODEL==0) NPM6045_Write(buffer);
                                                        //EA=1;
                                                        break;
                                                case 0x97:
                                                case 0x96:
                                                case 0x95:
                                                        //EA=0;
                                                        if(ORG_MODEL==0) NPM6045_Read(buffer);
                                                        //EA=1;
                                                        break;
                                                case 0x90:
                                                        //EA=0;
                                                        if(ORG_MODEL==0) PCL6045_CB1();
                                                        //EA=1;
                                                        break;
                                                case 0x8f:
                                                        //EA=0;
                                                        if(ORG_MODEL==0) PCL6045_CB2();
                                                        //EA=1;
                                                        break;
                                                case 0x8e:
                                                        ORG_ASX=buffer[0];
                                                        SET_ORG();
                                                        //RESET_MCU=0x000f;
                                                        //RESET_MCU();
                                                        break;
                                                case 0x8d:
                                                        CLOSE_ORG();
                                                        break;
                                                case 0x8c:
                                                        //EA=0;
                                                        SendORG_EP1_MESSAGE();
                                                        //EA=1;
                                                        break;
                                                case 0x8b://0x38
                                                        //EA=0;
                                                        ORG_ASX=buffer[0];
                                                        ORG_COUNT_FLAG=1;
                                                        SET_ORG();
                                                        //EA=1;
                                                        break;
                                                case 0x8a://0x39
                                                        //EA=0;
                                                        ORG_ASX=buffer[0];
                                                        ORG_COUNT_FLAG=2;
                                                        SET_ORG();
                                                        //EA=1;
                                                        break;
                                                case 0x89://0x3A
                                                        //EA=0;
                                                        ORG_ASX=buffer[0];
                                                        ORG_COUNT_FLAG=3;
                                                        SET_ORG();
                                                        //EA=1;
                                                        break;
                                                case 0x88://0x3A
                                                        //EA=0;
                                                        ORG_ASX=buffer[0];
                                                        ORG_COUNT_FLAG=4;
                                                        SET_ORG();
                                                        //EA=1;
                                                        break;
                                #endif
                                                case 0x87://0x3A
                                                        //EA=0;
                                                        if (USB_RDY>=1)        SendData_EP1(INIT_Buf);         //初始化CH372
                                                        //EA=1;
                                                        break;

                                                default:
                                                        break;
                        }          
                        /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */
                        //CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 );  /* 向USB端点2的发送缓冲区写入数据块 */
                        //CH372_WR_DAT_PORT( length        );        /* 首先写入后续数据长度,回传刚接收到的数据长度 */
                        //for (        i =        1; i < length; i ++        ) CH372_WR_DAT_PORT( ~ buffer[ i ] );  /* 数据取反后返回,由计算机应用程序测试数据是否正确 */
                        //CH372_WR_CMD_PORT( CMD_UNLOCK_USB        );       
                }
                break;

                case USB_INT_EP2_IN:         /* 批量数据发送成功        */
                {
                        CH372_WR_CMD_PORT( CMD_UNLOCK_USB );  /* 释放当前USB缓冲区 */
                }
                break;

                case USB_INT_EP1_IN: /* 批量数据发送成功        */
                {       
                        CH372_WR_CMD_PORT( CMD_UNLOCK_USB );  /* 释放当前USB缓冲区 */
                }
                break;

                default:          /* 其它中断,未用到,解锁后退出即可 */
                {       
                        CH372_WR_CMD_PORT( CMD_UNLOCK_USB );  /* 释放当前USB缓冲区 */
                }
                break;
        }

        Watch_DOG();
        EA=1;
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
在中断处理函数中主要是以下流程执行的:
------------------SendData_EP1-------------------
-----------------CLOSE_ORG--------------------
-----------------CLOSE_ORG--------------------
-----------------CLOSE_ORG--------------------
-----------------CLOSE_ORG--------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
------------------NPM6045_Read---------------------
--------------------SendData_EP2-----------------------
-------------------NPM6045_Write---------------------
我在NPM6045_Read/SendData_EP2/NPM6045_Write这三个函数之间加上printf执行就正常,加上延时都不行,执行都不正常.
目前我认为是这三个函数之间的延时问题.(这是我的猜测)
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
怎么没人回答呀?
自己顶一下吧!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表