打印
[PIC®/AVR®/dsPIC®产品]

PIC18F45K22中断函数里面写数组发生异常

[复制链接]
1829|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
roalychen|  楼主 | 2015-11-19 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC18F45K22中断函数里面写数组发生异常PIC18F45K22做逆变器
xc8编译器,PRO级逆变功能已经做好,添加串口通信程序时发生异常,
串口接受、发送中断定义为低优先级中断
逆变相关的 PWM中断和AD中断为高优先级中断
程序如下。
把程序中注释的那句打开,输出电压就变成48Hz了,即使不发生串口通信也是一样
如果把接收缓冲区定义成8bit 的数组,则会出现更多问题
请教是怎么会事?
另外发送中断程序中有一个用指针进行处理的也有类似问题

应该是编译链接的过程中发生了什么问题。请指教!

INT16U ucSCIRecBuf[10];
void sRS232RECCmd(void)
{

INT16U tmp;


tmp = RC1REG;

if(!FERR1)

{

ucSCIRecBuf[ucSCIRecCnt] = tmp;  // 这句打开就出现异常

/*

if(tmp == CHAR_ENTER)

{

tmp = ucSCIRecBuf[0];

if((tmp >= 'A') && (tmp <= 'Z'))

{

switch(ucSCIRecBuf[0])

{

case 'I':

sICommand();

break;


case 'F':

sFCommand();

break;


case 'Q':

sQCommand();

break;

}

}

ucSCIRecCnt = 0;

}

else

{

if(ucSCIRecCnt > 9)

{

ucSCIRecCnt = 0;

}

ucSCIRecBuf[ucSCIRecCnt] = tmp;

ucSCIRecCnt++;

}

*/

TX1IE = 0;


}


if(OERR1)

{

CREN1 = 0;

CREN1 = 1;

}

}


void interrupt low_priority Low_ISR(void)
{


if(TX1IF && TX1IE)

{

sRS232ISR();

}


if(RC1IF && RC1IE)

{

sRS232RECCmd();

}



if(TMR0IE && TMR0IF)

{



sTimeBaseISR();

}
}


沙发
yklstudent| | 2015-11-19 19:30 | 只看该作者
什么逆变器,竟然只用PIC18;
中断内处理的时间太长了吧

使用特权

评论回复
板凳
roalychen|  楼主 | 2015-11-20 15:52 | 只看该作者
发现这个问题是在PRO模式编译会出现,用FREE和STAND模式编译没问题。但是PRO模式编译运行速度才足够快
并且发现是把其他RAM位置的变量修改了

ucSCIRecBuf[ucSCIRecCnt] = tmp;这句写成
switch(ucSCIRecCnt)
{
     case 0:
        ucSCIRecBuf[0] = tmp;
         break;

     case 1:
        ucSCIRecBuf[1] = tmp;
         break;

..........
}

这样的话,之前发现的问题则暂时没发现

使用特权

评论回复
地板
roalychen|  楼主 | 2015-11-20 15:53 | 只看该作者
yklstudent 发表于 2015-11-19 19:30
什么逆变器,竟然只用PIC18;
中断内处理的时间太长了吧

类似在线互动式UPS。不需要锁相的,所以要求比较低

使用特权

评论回复
5
Rain_King| | 2015-11-28 10:16 | 只看该作者
应该是中断处理时间太长了.....和你说的那个数组应该是没有关系的.....你应该测一下你的函数运行的时间....

使用特权

评论回复
6
roalychen|  楼主 | 2015-11-28 12:03 | 只看该作者
那个数组的赋值改为switch,下标改为常数,
即switch判断下标后,再赋值给常数下标的数组元素,就没问题了

使用特权

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

本版积分规则

102

主题

227

帖子

0

粉丝