标题: C语言const修饰的数组里的数据中断调用全变成0了 [打印本页]

作者: zch5200    时间: 2023-4-4 16:54
标题: C语言const修饰的数组里的数据中断调用全变成0了
单片机:PIC18F45K80
编辑环境:MPLAB IDE V8.92
编译器:XC8 V1.45
一个逆变器项目,输出AC 0~15v 电压连续可调,用SPWM波来实现,现在是产生SPWM波的数据放在一个数组里调用,为了省DATA空间用const修饰了,在主程序里调用没事,但这个必须要放在中断里去赋值调PWM。中断里调用数组赋值全变0了,把const去掉就好了。
const uint spwm_data[]=
{130,146,162,177,192,206,218,230,239,247,253,257,259,259,257,253,247,239,230,218,206,192,177,162,146,
130,113,97,82,67,53,41,29,20,12,6,2,0,0,2,6,12,20,29,41,53,67,82,97,113};

if(TMR0IF == 1)
{
                TMR0IF = 0;
                TMR0 = 57;               
                pwm = spwm_data[x];
                DC2B0 = pwm;
                DC2B1 = pwm>>1;
                CCPR2L = pwm>>2;               
                x++;if(x>=50){x=0;}
}

就是这句
pwm = spwm_data[x];这个数会变成0,如果数组不用const修饰就没问题。(我用数码管在中断里调用显示过,确实变成0了。)
有知道的大神么 为什么const修饰的数据放在中断里使用就变成0了。

作者: pdwdzz    时间: 2023-4-4 17:22
首先看下中断时间够不够,读取ROM数据比RAM要慢的多。中断里边翻转IO应该就能看到。
然后进入中断后关闭总中断试试。
作者: fj51hei    时间: 2023-4-5 08:48
pdwdzz 发表于 2023-4-4 17:22
首先看下中断时间够不够,读取ROM数据比RAM要慢的多。中断里边翻转IO应该就能看到。
然后进入中断后关闭总 ...

中断时间不够,那放主程序为啥就够?还是看看 加与不加 这段数据放在哪里?也就语法问题对否(或编译器有啥特殊癖好跟你要实现的不一致),再看看这个PWM是否被其他函数操作了?
作者: 人中狼    时间: 2023-4-5 09:10
如果是常数的话,应该是用code,不是const
作者: glinfei    时间: 2023-4-5 17:17
Pic用const 好像是放到rom ,但应该不是读rom时间不够,感觉是没强制类转换,pic是小端格式,跟51的是相反的,pwn是char型吗?那正好赋零值
作者: Hephaestus    时间: 2023-4-6 16:14
glinfei 发表于 2023-4-5 17:17
Pic用const 好像是放到rom ,但应该不是读rom时间不够,感觉是没强制类转换,pic是小端格式,跟51的是相反 ...

这代码跟大小端一点儿关系都没有。
作者: wufa1986    时间: 2023-4-6 16:42
用pic单片机非常多坑,希望你能抗住,特别是大功率电路容易重启,这单片机并没有传说中神奇,只是碰到高压不容易坏而已
作者: zch5200    时间: 2023-4-6 16:48
glinfei 发表于 2023-4-5 17:17
Pic用const 好像是放到rom ,但应该不是读rom时间不够,感觉是没强制类转换,pic是小端格式,跟51的是相反 ...

是int型数据,我估计跟编译器有关系,我本来想调压全做成各种数组直接调用,但DATA不够,就想const修饰了数组会放在ROM。我现在的解决办法是数组不用const修饰,频率提高到64MHz,然后弄个系数在中断里直接计算SPWM数据,我仿真调试了计算时间是21us,50HZ每HZ里50个脉宽调整量,时间上够了。
作者: zch5200    时间: 2023-4-6 16:57
wufa1986 发表于 2023-4-6 16:42
用pic单片机非常多坑,希望你能抗住,特别是大功率电路容易重启,这单片机并没有传说中神奇,只是碰到高压 ...

是的 我用PIC18去驱动一款 小的OLED12864屏  由于有232通讯  所以要中断,但是只要有中断函数(哪怕函数里啥都不写),屏幕就不显示了,用16系列就没事。也找不到原因后来改用了款ROM大点的16系列
作者: glinfei    时间: 2023-4-7 22:48
zch5200 发表于 2023-4-6 16:48
是int型数据,我估计跟编译器有关系,我本来想调压全做成各种数组直接调用,但DATA不够,就想const修饰了 ...

看来没猜对,不过就三个数超256,改成char型失真不大,会不会就行了?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1