|
樓主你好,我在調(diào)試你這個程序的時候發(fā)現(xiàn)了一個疑問,不知道是否可商榷?
在X軸反轉(zhuǎn)函數(shù)里面
void xn()//x軸反轉(zhuǎn)
{
uint i;
while(!K4)
{
for(i=8;i>0;i--)
{
P1=step_table[ i];
delay(10);
}
這個for循環(huán)for(i=8;i>0;i--)可以調(diào)試通,但是反轉(zhuǎn)實(shí)際運(yùn)行步數(shù)是少一步的,這樣會不會有丟步現(xiàn)象。
這是地址數(shù)組真值表:
uchar code step_table[]={0x8,0xa,0x2,0x6,0x4,0x5,0x1,0x9};
數(shù)組循環(huán)i++是正確,因?yàn)閄軸正轉(zhuǎn)的for循環(huán)是i++:for(i=0;i<8;i++)
數(shù)組的下標(biāo)是從零開始,這樣八位table取值是0,1,2,3,4,5,6,7,剛好匹配,
==========================重點(diǎn)
在反轉(zhuǎn)中采用for循環(huán)i--:for(i=8;i>0;i--),
當(dāng)?shù)谝淮窝h(huán)取的數(shù)值是step_table[i=8],實(shí)際上這已經(jīng)數(shù)組越界,但是越界為什么會能轉(zhuǎn),因?yàn)橹挥袔资撩氲耐娧h(huán),可能堵轉(zhuǎn),這樣第二步(step_table[i=7]是倒敘數(shù)組表也就是取的正傳最后一位是正確的)當(dāng)循環(huán)到step_table[i=0]時,因?yàn)榕袛鄺l件是i>0,這樣正轉(zhuǎn)第一步也就是i=0是不賦值的,出現(xiàn)舍棄現(xiàn)象, X軸反轉(zhuǎn)函數(shù)P1=step_table[0]是不執(zhí)行的;會不會出現(xiàn)丟步?
===========================測試過程
按照這個思路修改調(diào)試:
先修改反轉(zhuǎn)循環(huán)for(i=7;i>=0;i--),調(diào)試運(yùn)行到最后一步I=0第一次可以,隨后下一步出現(xiàn)堵轉(zhuǎn),
跟蹤發(fā)現(xiàn):在反轉(zhuǎn)函數(shù)中,當(dāng)i=0循環(huán)完畢后隨后下一步,會出現(xiàn)隨機(jī)數(shù)整數(shù),在看開始定義約定。
unsigned int i,j;
這個unsigned 參數(shù)類型約定了無符號整形,查詢一部分文檔才發(fā)現(xiàn)無符號隨機(jī)數(shù)的跳轉(zhuǎn),因?yàn)椴煌跀?shù)組賦值真值表,所以出現(xiàn)堵轉(zhuǎn)。
按照保險的做法,又聲明一個反轉(zhuǎn)數(shù)組,只是把位置顛倒過來:
正轉(zhuǎn):uchar code step_table[]={0x8,0xa,0x2,0x6,0x4,0x5,0x1,0x9};
反轉(zhuǎn):uchar code step_table[]={0x9,0x1,0x5,0x4,0x6,0x2,0xa,0x8};
然后反轉(zhuǎn)for循環(huán)是i++:for(i=0;i<8;i++)
這樣步數(shù)同步了。
還一種方法,聲明i參數(shù)不要unsigned 無符號聲明,原來您的代碼只是修改為for(i=7;i>=0;i--)其他不變,這樣改不知道在單片機(jī)編程中是否合規(guī)。
為什么會考慮這個問題呢?
當(dāng)需要循環(huán)計算指定角度步數(shù)的時候,需要累加循環(huán)次數(shù),每八拍丟一步,實(shí)際上道最后差別就大了。
不知道我的思路對不對,希望樓主指點(diǎn)。
謝謝! |
|