找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1003|回复: 9
收起左侧

C语言const修饰的数组里的数据中断调用全变成0了

[复制链接]
ID:1004920 发表于 2023-4-4 16:54 | 显示全部楼层 |阅读模式
单片机: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了。
回复

使用道具 举报

ID:146878 发表于 2023-4-4 17:22 | 显示全部楼层
首先看下中断时间够不够,读取ROM数据比RAM要慢的多。中断里边翻转IO应该就能看到。
然后进入中断后关闭总中断试试。
回复

使用道具 举报

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

中断时间不够,那放主程序为啥就够?还是看看 加与不加 这段数据放在哪里?也就语法问题对否(或编译器有啥特殊癖好跟你要实现的不一致),再看看这个PWM是否被其他函数操作了?
回复

使用道具 举报

ID:384109 发表于 2023-4-5 09:10 | 显示全部楼层
如果是常数的话,应该是用code,不是const
回复

使用道具 举报

ID:844772 发表于 2023-4-5 17:17 来自手机 | 显示全部楼层
Pic用const 好像是放到rom ,但应该不是读rom时间不够,感觉是没强制类转换,pic是小端格式,跟51的是相反的,pwn是char型吗?那正好赋零值
回复

使用道具 举报

ID:883242 发表于 2023-4-6 16:14 | 显示全部楼层
glinfei 发表于 2023-4-5 17:17
Pic用const 好像是放到rom ,但应该不是读rom时间不够,感觉是没强制类转换,pic是小端格式,跟51的是相反 ...

这代码跟大小端一点儿关系都没有。
回复

使用道具 举报

ID:879348 发表于 2023-4-6 16:42 | 显示全部楼层
用pic单片机非常多坑,希望你能抗住,特别是大功率电路容易重启,这单片机并没有传说中神奇,只是碰到高压不容易坏而已
回复

使用道具 举报

ID:1004920 发表于 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个脉宽调整量,时间上够了。
回复

使用道具 举报

ID:1004920 发表于 2023-4-6 16:57 | 显示全部楼层
wufa1986 发表于 2023-4-6 16:42
用pic单片机非常多坑,希望你能抗住,特别是大功率电路容易重启,这单片机并没有传说中神奇,只是碰到高压 ...

是的 我用PIC18去驱动一款 小的OLED12864屏  由于有232通讯  所以要中断,但是只要有中断函数(哪怕函数里啥都不写),屏幕就不显示了,用16系列就没事。也找不到原因后来改用了款ROM大点的16系列
回复

使用道具 举报

ID:844772 发表于 2023-4-7 22:48 来自手机 | 显示全部楼层
zch5200 发表于 2023-4-6 16:48
是int型数据,我估计跟编译器有关系,我本来想调压全做成各种数组直接调用,但DATA不够,就想const修饰了 ...

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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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