找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2284|回復: 9
收起左側(cè)

C語言const修飾的數(shù)組里的數(shù)據(jù)中斷調(diào)用全變成0了

[復制鏈接]
ID:1004920 發(fā)表于 2023-4-4 16:54 | 顯示全部樓層 |閱讀模式
單片機:PIC18F45K80
編輯環(huán)境:MPLAB IDE V8.92
編譯器:XC8 V1.45
一個逆變器項目,輸出AC 0~15v 電壓連續(xù)可調(diào),用SPWM波來實現(xiàn),現(xiàn)在是產(chǎn)生SPWM波的數(shù)據(jù)放在一個數(shù)組里調(diào)用,為了省DATA空間用const修飾了,在主程序里調(diào)用沒事,但這個必須要放在中斷里去賦值調(diào)PWM。中斷里調(diào)用數(shù)組賦值全變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];這個數(shù)會變成0,如果數(shù)組不用const修飾就沒問題。(我用數(shù)碼管在中斷里調(diào)用顯示過,確實變成0了。)
有知道的大神么 為什么const修飾的數(shù)據(jù)放在中斷里使用就變成0了。
回復

使用道具 舉報

ID:146878 發(fā)表于 2023-4-4 17:22 | 顯示全部樓層
首先看下中斷時間夠不夠,讀取ROM數(shù)據(jù)比RAM要慢的多。中斷里邊翻轉(zhuǎn)IO應該就能看到。
然后進入中斷后關閉總中斷試試。
回復

使用道具 舉報

ID:712493 發(fā)表于 2023-4-5 08:48 | 顯示全部樓層
pdwdzz 發(fā)表于 2023-4-4 17:22
首先看下中斷時間夠不夠,讀取ROM數(shù)據(jù)比RAM要慢的多。中斷里邊翻轉(zhuǎn)IO應該就能看到。
然后進入中斷后關閉總 ...

中斷時間不夠,那放主程序為啥就夠?還是看看 加與不加 這段數(shù)據(jù)放在哪里?也就語法問題對否(或編譯器有啥特殊癖好跟你要實現(xiàn)的不一致),再看看這個PWM是否被其他函數(shù)操作了?
回復

使用道具 舉報

ID:384109 發(fā)表于 2023-4-5 09:10 | 顯示全部樓層
如果是常數(shù)的話,應該是用code,不是const
回復

使用道具 舉報

ID:844772 發(fā)表于 2023-4-5 17:17 來自觸屏版 | 顯示全部樓層
Pic用const 好像是放到rom ,但應該不是讀rom時間不夠,感覺是沒強制類轉(zhuǎn)換,pic是小端格式,跟51的是相反的,pwn是char型嗎?那正好賦零值
回復

使用道具 舉報

ID:883242 發(fā)表于 2023-4-6 16:14 | 顯示全部樓層
glinfei 發(fā)表于 2023-4-5 17:17
Pic用const 好像是放到rom ,但應該不是讀rom時間不夠,感覺是沒強制類轉(zhuǎn)換,pic是小端格式,跟51的是相反 ...

這代碼跟大小端一點兒關系都沒有。
回復

使用道具 舉報

ID:879348 發(fā)表于 2023-4-6 16:42 | 顯示全部樓層
用pic單片機非常多坑,希望你能抗住,特別是大功率電路容易重啟,這單片機并沒有傳說中神奇,只是碰到高壓不容易壞而已
回復

使用道具 舉報

ID:1004920 發(fā)表于 2023-4-6 16:48 | 顯示全部樓層
glinfei 發(fā)表于 2023-4-5 17:17
Pic用const 好像是放到rom ,但應該不是讀rom時間不夠,感覺是沒強制類轉(zhuǎn)換,pic是小端格式,跟51的是相反 ...

是int型數(shù)據(jù),我估計跟編譯器有關系,我本來想調(diào)壓全做成各種數(shù)組直接調(diào)用,但DATA不夠,就想const修飾了數(shù)組會放在ROM。我現(xiàn)在的解決辦法是數(shù)組不用const修飾,頻率提高到64MHz,然后弄個系數(shù)在中斷里直接計算SPWM數(shù)據(jù),我仿真調(diào)試了計算時間是21us,50HZ每HZ里50個脈寬調(diào)整量,時間上夠了。
回復

使用道具 舉報

ID:1004920 發(fā)表于 2023-4-6 16:57 | 顯示全部樓層
wufa1986 發(fā)表于 2023-4-6 16:42
用pic單片機非常多坑,希望你能抗住,特別是大功率電路容易重啟,這單片機并沒有傳說中神奇,只是碰到高壓 ...

是的 我用PIC18去驅(qū)動一款 小的OLED12864屏  由于有232通訊  所以要中斷,但是只要有中斷函數(shù)(哪怕函數(shù)里啥都不寫),屏幕就不顯示了,用16系列就沒事。也找不到原因后來改用了款ROM大點的16系列
回復

使用道具 舉報

ID:844772 發(fā)表于 2023-4-7 22:48 來自觸屏版 | 顯示全部樓層
zch5200 發(fā)表于 2023-4-6 16:48
是int型數(shù)據(jù),我估計跟編譯器有關系,我本來想調(diào)壓全做成各種數(shù)組直接調(diào)用,但DATA不夠,就想const修飾了 ...

看來沒猜對,不過就三個數(shù)超256,改成char型失真不大,會不會就行了?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表