找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4551|回復(fù): 35
打印 上一主題 下一主題
收起左側(cè)

關(guān)于STC8單片機(jī)改用內(nèi)部上拉電阻后每次上電按鍵INT0誤觸發(fā)1次原因探討

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:975054 發(fā)表于 2022-12-20 22:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
一、問題
近日碰到個奇怪的問題:STC8單片機(jī)按鍵接P32腳INT0(邊沿或下降沿),用外部上拉電阻本來很正常的,后來改用內(nèi)部上拉4.1K電阻后,每次上電INT0誤觸發(fā)+1次!理應(yīng)等同,已驗(yàn)證內(nèi)部上拉電阻設(shè)置成功,已排除其他干擾,百思不得其解!決定必須一查到底!
二、之前代碼
  1. void BOOT()                     //總初始化 最簡整理221215;      (STC8G1K08)        
  2. {                                                         
  3.     dl_ms(100);                 //上電適當(dāng)延時一下好些;
  4.     P1M1=P5M1=0x00, P1=P5=0xff, //P1P5口:均設(shè)雙向置1;    其他默認(rèn);   
  5.     P3M1=0x0C;       P3 |=0xf3; //P3  口:P32按鍵、P33腳都是邊沿中斷設(shè)高阻不置1,其余雙向置1;   
  6.    
  7.     status=Kc= 0;               //初值: status工作狀態(tài)標(biāo)志 (開機(jī)0/待機(jī)1/復(fù)位2), Kc短按次數(shù));           
  8.     G=R=b=W=0, dl_ms(1000);     //開機(jī)/復(fù)位后: 綠紅藍(lán)白燈 全亮1s滅1s;
  9.     G=R=b=W=1, dl_ms(1000);     //               問題發(fā)現(xiàn): 以上3行放最后面編譯代碼少1B;奇怪?   

  10.     P_SW2 |= 0x80;              //訪問XSRF先BIT7=1; 統(tǒng)一放前無需歸零(有外擴(kuò)64K擴(kuò)展RAM時才要);   
  11.     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //輸入只留P32、P33、P55(其余全關(guān));
  12.                                 //P55控制大燈W(用到if W==1讀端口還是讀引腳?先不關(guān));
  13.     P3PU=0x04;                  //使能內(nèi)部上拉電阻;
  14.     TMOD= 0x01;                 //T0:模式01;16位不自動重載(默認(rèn)12T);消抖用的查詢方式;
  15.     EX0=EX1=EA =1;              //開中斷;
  16.                               
  17. }
復(fù)制代碼
三、措施對策
1、 先暫時軟件處理-1次�?梢越鉀Q。但還得追究根本原因;
2、先后試了開中斷前后加空操作或足夠的延時等辦法,均無效;
3、最后,調(diào)整段落,發(fā)現(xiàn)將第3段代碼(最后5行)改到第2段代碼(中間3行)的前面后,居然就正常了(終于用內(nèi)部上拉或外部上拉都完全一樣了)!代碼附后;
4、但還是百思不得其解! 后面有空再繼續(xù)研究,走過路過感興趣的朋友不妨一起查查具體原因。
      理論上:  上拉電阻用外接或內(nèi)置完全等同, 只需注意先設(shè)置好后再開中斷;
      問題是:后2段代碼前后調(diào)換,究竟哪里不同了?  注意到編譯后代碼量還會差1B; 為什么?        
四、目前代碼
  1. void BOOT()                         //總初始化 最簡整理221217改;      (STC8G1K08)        
  2. {                                                         
  3.     dl_ms(100);                      //不變;
  4.     P1M1=P5M1=0x00, P1=P5=0xff,      //不變;   
  5.     P3M1=0x0C;       P3 |=0xf3;      //不變;   

  6.     P_SW2 |= 0x80;                   //;
  7.     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //;
  8.     P3PU=0x04;                       //;
  9.     TMOD= 0x01;                      //;
  10.     EX0=EX1=EA =1;                   //開中斷; 前4行任1條放最后面多1B;奇怪?  
  11.   //以上5行改放最后每次上電int0誤觸發(fā)1次! 但加外接上拉電阻隨便幾K就不會!奇怪?
  12.    
  13.     status=Kc= 0;                    //;           
  14.     G=R=b=W=0, dl_ms(1000);          //;
  15.     G=R=b=W=1, dl_ms(1000);
  16. }
復(fù)制代碼






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:975054 發(fā)表于 2022-12-21 11:24 | 只看該作者
csdn上面也有此文,均為本人所發(fā),暫未有人答復(fù)。
回復(fù)

使用道具 舉報

板凳
ID:624769 發(fā)表于 2022-12-21 16:07 來自觸屏版 | 只看該作者
要先開上拉,再清 IE0,IE1, 最后, 再開中斷。
回復(fù)

使用道具 舉報

地板
ID:1034262 發(fā)表于 2022-12-21 16:51 | 只看該作者
上電時INT0已經(jīng)檢測到一次上升沿,所以你一允許外部中斷,立刻進(jìn)去中斷。
正確的初始化應(yīng)該是:每次允許外部中斷前,設(shè)置中斷方式,清除外部中斷標(biāo)志,加3個NOP,然后允許外部中斷。
原則上,其余的中斷我都會先清除中斷標(biāo)志再允許,比如定時器,如果溢出過,則溢出標(biāo)志會置1,一旦允許定時器中斷,則馬上就進(jìn)去中斷了,所以要先清除中斷標(biāo)志。
回復(fù)

使用道具 舉報

5#
ID:213173 發(fā)表于 2022-12-21 21:16 | 只看該作者
代碼書寫不規(guī)范所致。
回復(fù)

使用道具 舉報

6#
ID:401564 發(fā)表于 2022-12-21 21:38 | 只看該作者
代碼一段一段的,也不知道你要干嘛
P3端口要讀取外部電平,必需 P3 = 0xff

也就是說,你之前的程序并不對,只是誤打誤撞而已
回復(fù)

使用道具 舉報

7#
ID:879348 發(fā)表于 2022-12-22 08:51 | 只看該作者
不用探討,任何外部中斷開啟前都要清理標(biāo)記位

評分

參與人數(shù) 1黑幣 +15 收起 理由
ax6808 + 15 徹底解決問題的稻草!

查看全部評分

回復(fù)

使用道具 舉報

8#
ID:975054 發(fā)表于 2022-12-25 12:02 | 只看該作者
188610329 發(fā)表于 2022-12-21 16:07
要先開上拉,再清 IE0,IE1, 最后, 再開中斷。

收到,謝謝! 近日全羊在家休息,能量恢復(fù)中...   
其實(shí)就1段5行代碼,其他用上電復(fù)位值(如默認(rèn)采用邊沿中斷IT0=IT2=0等):
    P_SW2 |= 0x80;                               //必須放前面的,訪問XSRF先BIT7=1;
    P3IE=0x0C, P1IE=0x00, P5IE=0x20;  //輸入允許設(shè)置(省電考慮的事情,只留P32等3個腳,寫成一行而已);
    P3PU=0x04;                                    //使能P32上拉;
    TMOD= 0x01;                                 //T0:設(shè)模式01,消抖用;
    EX0=EX1=EA =1;                           //最后開中斷; 寫成1行而已;
                                                         //其他都是默認(rèn)上電復(fù)位值(如邊沿中斷IT0=IT2=0等)
回復(fù)

使用道具 舉報

9#
ID:975054 發(fā)表于 2022-12-25 12:11 | 只看該作者
coody_sz 發(fā)表于 2022-12-21 16:51
上電時INT0已經(jīng)檢測到一次上升沿,所以你一允許外部中斷,立刻進(jìn)去中斷。
正確的初始化應(yīng)該是:每次允許外 ...

收到,謝謝指導(dǎo)!
分析的有道理! 因只涉及到上電或軟復(fù)位,而我只用了復(fù)位后已有的默認(rèn)值,可能偷工減料了!
回復(fù)

使用道具 舉報

10#
ID:975054 發(fā)表于 2022-12-25 12:18 | 只看該作者
wulin 發(fā)表于 2022-12-21 21:16
代碼書寫不規(guī)范所致。

感謝總工指導(dǎo)!  
近期我在代碼整理中,確實(shí)大量使用了簡寫連寫等,不過已盡量完善注釋:
1、一行中好幾條同類代碼的連寫;
2、甚至用;代替NOP等等;
3、大量使用了默認(rèn)復(fù)位值;
回復(fù)

使用道具 舉報

11#
ID:975054 發(fā)表于 2022-12-25 13:01 | 只看該作者
本帖最后由 ax6808 于 2022-12-25 15:27 編輯
Y_G_G 發(fā)表于 2022-12-21 21:38
代碼一段一段的,也不知道你要干嘛
P3端口要讀取外部電平,必需 P3 = 0xff

感謝總工指導(dǎo)!近日全羊在家休息研究暫停了幾天;
1.  其實(shí)代碼功能很簡單:主要就是想好好利用邊沿中斷(INT0/P32判斷按鍵長短按,用INT1/P33判斷充電狀態(tài));其他就好說了,都是陪襯;
2.  其實(shí)關(guān)鍵就2行:
    P3M1=0x0C;  P3 |=0xf3; //P3口:P32、P33都默認(rèn)邊沿中斷,設(shè)高阻不置1,其余雙向置1;
                                        // P3口要讀外部電平,必需P3=0xff : P3 |=0xf3: 其實(shí)都可省掉,反正復(fù)位都是1;
    P3PU=0x04;                  //使能內(nèi)部上拉電阻;
   說明:I/O口設(shè)置:P32按鍵腳采用內(nèi)部上拉電阻省個外接電阻,可設(shè)雙向或高阻,最后統(tǒng)一設(shè)成高阻了;
                          P33腳平時未充電已外部拉低,充電:上升沿+外部電平檢測,設(shè)高阻省電,拔電:下降沿+電平實(shí)時判斷;
3.  之前的程序并不對,只是誤打誤撞而已: 我也懷疑多處使用了上電復(fù)位值等,可能真是誤打誤撞;
4.等感冒完全恢復(fù)了,我再一條條試試;
回復(fù)

使用道具 舉報

12#
ID:975054 發(fā)表于 2022-12-25 13:05 | 只看該作者
wufa1986 發(fā)表于 2022-12-22 08:51
不用探討,任何外部中斷開啟前都要清理標(biāo)記位

感謝指導(dǎo)!
任何外部中斷開啟前都要清理標(biāo)記位? 我暫時是盡量使用的上電復(fù)位值,及硬件自動置位或清0,有空我再試試...
回復(fù)

使用道具 舉報

13#
ID:975054 發(fā)表于 2022-12-25 13:13 | 只看該作者
wufa1986 發(fā)表于 2022-12-22 08:51
不用探討,任何外部中斷開啟前都要清理標(biāo)記位

外部中斷0的中斷標(biāo)志位必須由(硬件) 清零。
回復(fù)

使用道具 舉報

14#
ID:975054 發(fā)表于 2022-12-25 13:15 | 只看該作者
  1. void INT0() interrupt 0              //INT0:長短按: 改邊沿觸發(fā)+20msT0消抖+電平檢測; 理論上:按鍵檢測用邊沿觸發(fā)+定時消抖最可靠;                                                                                                
  2. {                                                                                          //關(guān)鍵:短按一般0.1~0.3s,彈起很快;
  3.     TH0=TL0=0xB8, TR0=1;             //消抖: 20ms(B8實(shí)20.2),每次跳變抖動都重新計(jì)時;
  4.     while(!TF0) ; TF0=0;             //查詢: 一直等TF0=1才往下執(zhí)行,注意用;號;查詢方式要清0; 雙沿EA=0沒必要;
  5.     if(key==1) {Kc++, Kc=Kc%6;}      //短按: 上升沿有效; 彈起20ms即可切換1次彩燈:6次循環(huán); Kc=Kc%6等效if(Kc>=6) Kc=0;         
  6.     else                                         //長按: 下降沿有效; 短按一般0.1~0.3s,超過為長按,彈起很快;
  7.    { dl_ms( 480);                                 //      按下0.3-0.5s仍未彈起趕緊執(zhí)行長按代碼(不然總體太慢);
  8.      if(key==0)                             //           未彈起(再處理大白燈和待機(jī)):
  9.     {dl_ms(1000);                                 //           再延時1s,總1.5s;
  10.      if(key==0)   W=!W;              //白燈: 長按1.5s則:白燈開/關(guān); Kc要-1;                    
  11.      dl_ms(1000);                                 //           再延時1s,總2.5s;
  12.      if(key==1)   Kc--;                       //           按下1.5-2s期間已經(jīng)彈起, Kc先-1;
  13.       else                                         //復(fù)位: 按下1.5-2s期間仍未彈起, 則準(zhǔn)備處理復(fù)位;
  14.      {dl_ms(500), W=!W;              //           先延時0.5s,總3s;白燈閃1次再準(zhǔn)備進(jìn)復(fù)位,方便觀察;效果很好!
  15.              dl_ms(100), status=2;                 //           長按超3s則:復(fù)位;狀態(tài)標(biāo)志2(開機(jī)0/待機(jī)1/復(fù)位2); ok!很好!
  16.    }}}                                          //效果: 改雙沿后短按迅速(之前等0.5秒), 無需開關(guān)中斷防干擾;
  17. }

  18. void INT1() interrupt 2            //INT1:充電監(jiān)控: 邊沿觸發(fā)+20msT0消抖+電平檢測;主要實(shí)時喚醒掉電狀態(tài); 1212;
  19. {                                          //理論: 本監(jiān)控電路其實(shí)只用中斷+20ms軟件消抖也可靠,暫統(tǒng)一用邊沿觸發(fā)+定時消抖好了;
  20.     TH0=TL0=0xB8, TR0=1;             //消抖: 20ms(實(shí)20.2),每次跳變抖動都重新計(jì)時;
  21.     while(!TF0) ; TF0=0;             //查詢: 一直等到TF0=1才往下執(zhí)行,注意;號; 查詢方式要清0; EA=0防干擾沒必要;
  22. }
復(fù)制代碼


回復(fù)

使用道具 舉報

15#
ID:975054 發(fā)表于 2022-12-25 13:19 | 只看該作者
前面補(bǔ)充上傳了長短按及充電狀態(tài)監(jiān)控中斷服務(wù)代碼, 最后都回主函數(shù)主循環(huán)處理(較簡單,未貼出代碼)
目前總體代碼運(yùn)行還是很穩(wěn)定的.P32長短按功能手感也很好.
回復(fù)

使用道具 舉報

16#
ID:401564 發(fā)表于 2022-12-25 14:23 | 只看該作者
ax6808 發(fā)表于 2022-12-25 13:19
前面補(bǔ)充上傳了長短按及充電狀態(tài)監(jiān)控中斷服務(wù)代碼, 最后都回主函數(shù)主循環(huán)處理(較簡單,未貼出代碼)
目前總 ...

這種程序,最好是上傳工程文件,想必也不是什么商業(yè)機(jī)密
人家有條件的,可以直接下載打開
代碼不全,很難看明白的,雖說都是C,但是,每個人編程的思維是不一樣的

評分

參與人數(shù) 1黑幣 +5 收起 理由
ax6808 + 5

查看全部評分

回復(fù)

使用道具 舉報

17#
ID:1034262 發(fā)表于 2022-12-25 14:24 | 只看該作者
ax6808 發(fā)表于 2022-12-25 13:13
外部中斷0的中斷標(biāo)志位必須由(硬件) 清零。

外部中斷0的中斷標(biāo)志位,在進(jìn)入中斷時會自動清零。但是如果沒允許INT0中斷,則開中斷前,要手動清零。

評分

參與人數(shù) 1黑幣 +7 收起 理由
ax6808 + 7

查看全部評分

回復(fù)

使用道具 舉報

18#
ID:975054 發(fā)表于 2022-12-25 22:32 來自觸屏版 | 只看該作者
Y_G_G 發(fā)表于 2022-12-25 14:23
這種程序,最好是上傳工程文件,想必也不是什么商業(yè)機(jī)密
人家有條件的,可以直接下載打開
代碼不全,很難看 ...

感謝批評指正!老射頻工程師,才搞嵌入式一年多,個人經(jīng)驗(yàn)不足,有些基本功能還在逐步探索應(yīng)用中,沒有任何商業(yè)秘密可言…
這個問題:是本人用內(nèi)置上拉電阻替換外部上拉電阻的反復(fù)拷機(jī)試驗(yàn)中才發(fā)現(xiàn)的,千真萬確存在的一個莫名其妙問題!幾乎與設(shè)置無關(guān),只與上電期間某些機(jī)理有關(guān)。
等我感冒恢復(fù)了,會繼續(xù)查下去……
回復(fù)

使用道具 舉報

19#
ID:975054 發(fā)表于 2022-12-25 22:36 來自觸屏版 | 只看該作者
統(tǒng)一回復(fù):感謝大家出謀獻(xiàn)策!等我感冒好利索了,會繼續(xù)進(jìn)行各種對比試驗(yàn)!務(wù)必查出本案內(nèi)/外部上拉電阻效果就是不同的根本原因!究竟
回復(fù)

使用道具 舉報

20#
ID:401564 發(fā)表于 2022-12-26 22:50 | 只看該作者
ax6808 發(fā)表于 2022-12-25 22:32
感謝批評指正!老射頻工程師,才搞嵌入式一年多,個人經(jīng)驗(yàn)不足,有些基本功能還在逐步探索應(yīng)用中,沒有任 ...

我并沒有非常認(rèn)真的看你的程序,只是大概的看了一下
但我還是認(rèn)為:很多時候,問題出在人身上,或者是說單片機(jī)本身就是這個特性,你只是"自我的"覺得它不正常而已
STC雖說不是ST這樣的大公司,但上拉這種小問題肯定是不會有的,而且,STC也是一直在進(jìn)步的
所以,更多的把精力放在自身的問題上,不要想著單片機(jī)有什么問題

評分

參與人數(shù) 1黑幣 +5 收起 理由
ax6808 + 5

查看全部評分

回復(fù)

使用道具 舉報

21#
ID:77589 發(fā)表于 2022-12-27 11:14 | 只看該作者
兄弟,這個問題不是禿子頭上的虱子嗎?
外部上拉,只要系統(tǒng)供電正常,P32就馬上拉成高電平,不管你MCU是否工作。
如果是內(nèi)部上拉呢?必須要等MCU正常啟動后(最起碼要系統(tǒng)時鐘正常穩(wěn)定后),運(yùn)行代碼去配置P32內(nèi)部上拉。在你的程序還沒有執(zhí)行到配置P32內(nèi)部上拉的時候,P32就響應(yīng)了一次外中斷。

所以,外部上拉還是靠譜的多。如果要堅(jiān)持使用內(nèi)部上拉,估計(jì)得調(diào)整代碼,先讓程序配置P32內(nèi)部上拉,穩(wěn)定后,再開啟外中斷。
回復(fù)

使用道具 舉報

22#
ID:1042619 發(fā)表于 2022-12-27 15:05 | 只看該作者
       這種小問題,您應(yīng)該去他們新官網(wǎng)下載個正規(guī)的新資料看下 I/O 部分,不就懂了1 現(xiàn)在的MCU太快,外部上拉,是MCU 正式開跑之前,外部已被拉高;外部無上拉,程序開跑時,你才打開內(nèi)部上拉,你要等1段時間,外部才被拉高,現(xiàn)在是高速數(shù)字電路的時代
      如有問題您@我頭像

回復(fù)

使用道具 舉報

23#
ID:1042619 發(fā)表于 2022-12-27 15:12 | 只看該作者
不是誤觸發(fā),是 MCU 太快
這種小問題,看下 I/O 部分,不就懂了, 現(xiàn)在的MCU 太快  !
外部上拉,是MCU 正式開跑之前,外部已被拉高;
外部無上拉,程序開跑時,你才打開內(nèi)部上拉,你要等1段時間,外部才會被拉高到2V以上,
===你程序要加延時�。�!
STC8/STC32G系列是高速M(fèi)CU 時代

評分

參與人數(shù) 1黑幣 +9 收起 理由
ax6808 + 9 感謝支持和鼓勵!

查看全部評分

回復(fù)

使用道具 舉報

24#
ID:975054 發(fā)表于 2022-12-28 00:40 | 只看該作者
wufa1986 發(fā)表于 2022-12-22 08:51
不用探討,任何外部中斷開啟前都要清理標(biāo)記位

統(tǒng)一回復(fù):
拜讀查閱了大量案例, 結(jié)論:
1. 確實(shí)"不用探討,任何外部中斷開啟前都要清理標(biāo)志位"才可靠! 本案我反復(fù)測試在EX0=EX1=EA =1前加上IE0=0就ok了(IE1=0可加可不加,無影響,是P33充電檢測腳,平時已拉低);
2. 外接上拉電阻和內(nèi)置上拉電阻正常運(yùn)行時完全一樣,但注意在剛上電或軟復(fù)位或剛設(shè)置上拉未穩(wěn)定期間一定有所不同,需要以自行測試結(jié)果為準(zhǔn),無需大驚小怪;
    例如本案:若開中斷前未清理IE0標(biāo)志位,不管我怎么弄,開機(jī)后狀態(tài)兩者就是不同,我不再繼續(xù)鉆牛角尖了,解決了就好!
3.其他: 因我這次的按鍵P32及串口P30和P31還想復(fù)用兼容軟件復(fù)位進(jìn)入模擬USB下載等等,所以又好好學(xué)習(xí)了一下最新版手冊;
      附:   STC8最新版手冊又增加了一些新的說明(特別是第4-5條,呵呵,學(xué)無止境):
  關(guān)于 I/O 的注意事項(xiàng):
  1、 P3.0 和 P3.1 口上電后的狀態(tài)為弱上拉雙向口模式
  2、 除 P3.0 和 P3.1 外,其余所有 IO 口上電后的狀態(tài)均為高阻輸入狀態(tài),用戶在使用 IO 口
前必須先設(shè)置 IO 口模式
  3、 芯片上電時如果不需要使用 USB 進(jìn)行 ISP 下載, P3.0/P3.1/P3.2 這 3 個 I/O 口不能同時
為低電平,否則會進(jìn)入 USB 下載模式而無法運(yùn)行用戶代碼
  4、 芯片上電時,若 P3.0 和 P3.1 同時為低電平, P3.2 口會短時間由高阻輸入狀態(tài)切換到雙
向口模式,用以讀取 P3.2 口外部狀態(tài)來判斷是否需要進(jìn)入 USB 下載模式
  5、 當(dāng)使用 P5.4 當(dāng)作復(fù)位腳時,這個端口內(nèi)部的 4K 上拉電阻會一直打開; 但 P5.4 做普通
I/O 口時,基于這個 I/O 口與復(fù)位腳共享管腳的特殊考量, 端口內(nèi)部的 4K 上拉電阻依
然會打開大約 6.5 毫秒時間,再自動關(guān)閉( 當(dāng)用戶的電路設(shè)計(jì)需要使用 P5.4 口驅(qū)動外
部電路時,請務(wù)必考慮上電瞬間會有 6.5 毫秒時間的高電平的問題)
回復(fù)

使用道具 舉報

25#
ID:975054 發(fā)表于 2022-12-28 00:58 | 只看該作者
統(tǒng)一補(bǔ)充回復(fù): 目前:
1.  反正用“四、目前代碼”: 開中斷前無需清0,  用內(nèi)置電阻就很正常,跟用外部上拉一模一樣;
2.  反正用“二、之前代碼“: 開中斷前必須清0,  用內(nèi)置電阻就很正常,跟用外部上拉一模一樣;
    若不先清0:無論我怎么處理內(nèi)置上拉電阻,如前后延遲1秒或幾秒,都會誤觸發(fā)1次,而外接上拉就永遠(yuǎn)不會;
3.  情況就是這么個情況,呵呵呵! 謝謝大家一起研究!
回復(fù)

使用道具 舉報

26#
ID:975054 發(fā)表于 2022-12-28 01:09 | 只看該作者
Y_G_G 發(fā)表于 2022-12-26 22:50
我并沒有非常認(rèn)真的看你的程序,只是大概的看了一下
但我還是認(rèn)為:很多時候,問題出在人身上,或者是說單片 ...

嗯!有道理! 我91年畢業(yè)后在某通信研究所專業(yè)從事射頻空間抗干擾研究多年,對某些干擾類機(jī)理比較敏感;學(xué)無止境,喜歡STC!
回復(fù)

使用道具 舉報

27#
ID:383215 發(fā)表于 2022-12-28 15:19 | 只看該作者
我的一些程序,經(jīng)常在STC和AVR之間移植過來移植過去,就發(fā)現(xiàn)STC單片機(jī)只要把端口設(shè)置為推挽輸出,端口立即就是高電平,假如這個端口驅(qū)動繼電器,繼電器就吸合,即使后面加一句這個端口=0,也不行,每次上電繼電器都會“喀嗒”一聲,AVR單片機(jī)就沒有這個問題,我立即就知道這是因?yàn)?1內(nèi)核上電之后的端口為高,所以我在端口設(shè)置為推挽輸出之前加一句這個端口=0,之后再設(shè)置為推挽輸出,繼電器就不會吸合了。說具體點(diǎn),傳統(tǒng)51單片機(jī)上電復(fù)位期間端口為高電平,STC單片機(jī)上電復(fù)位期間端口為高阻高電平,而AVR單片機(jī)上電復(fù)位期間端口為高阻低電平,所以AVR單片機(jī)就不存在這個問題。
樓主發(fā)現(xiàn)“每次上電按鍵INT0誤觸發(fā)1次”和我發(fā)現(xiàn)的每次上電繼電器都會“喀嗒”一聲可能是一樣的原因,這個原因就是STC單片機(jī)自身的原因,和自己的編程沒有關(guān)系,STC單片機(jī)把51架構(gòu)玩成一朵花,你就得把這些怪異的問題用代碼解決。樓上有人說“更多的把精力放在自身的問題上,不要想著單片機(jī)有什么問題”,這個就是單片機(jī)自身的問題。我多次說過,至少要學(xué)會兩種以上單片機(jī),互相對比編程,比只學(xué)一種單片機(jī)學(xué)到的東西更多更實(shí)在,只會一種單片機(jī),有的問題百思不得其解。假如樓主用AVR單片機(jī)編程,“每次上電按鍵INT0誤觸發(fā)1次”這個問題可能并不存在。我并不是說AVR單片機(jī)比STC單片機(jī)好,目前來看,AVR單片機(jī)除了抗干擾略比STC強(qiáng)一點(diǎn),其它優(yōu)勢不值一提,最大問題是AVR單片機(jī)價格太高了,我已經(jīng)放棄AVR單片機(jī),用STC8H1K08替換ATMEG8,試驗(yàn)已經(jīng)成功。
回復(fù)

使用道具 舉報

28#
ID:401564 發(fā)表于 2022-12-29 19:52 | 只看該作者
kmsj 發(fā)表于 2022-12-28 15:19
我的一些程序,經(jīng)常在STC和AVR之間移植過來移植過去,就發(fā)現(xiàn)STC單片機(jī)只要把端口設(shè)置為推挽輸出,端口立即 ...

個人玩的東西,我還是很喜歡STC的單片機(jī)的,當(dāng)然,就功能而言,還是更喜歡STM32,用STM32很多時候壓根就用考慮內(nèi)存,浮點(diǎn)數(shù)據(jù)運(yùn)算速度之類的
但做產(chǎn)品的話,基本上沒用過STC做產(chǎn)品,沒什么優(yōu)勢可言,畢竟低到3毛的STC單片機(jī)是沒有的,人家OTP型單片機(jī)3毛錢就能有幾路12位的ADC......
回復(fù)

使用道具 舉報

29#
ID:1059700 發(fā)表于 2022-12-29 22:29 | 只看該作者
代碼書寫的邏輯問題。
回復(fù)

使用道具 舉報

30#
ID:1034262 發(fā)表于 2022-12-31 17:36 | 只看該作者
kmsj 發(fā)表于 2022-12-28 15:19
我的一些程序,經(jīng)常在STC和AVR之間移植過來移植過去,就發(fā)現(xiàn)STC單片機(jī)只要把端口設(shè)置為推挽輸出,端口立即 ...

那是因?yàn)槟悴皇煜?1架構(gòu)造成的。51架構(gòu)的MCU出現(xiàn)與上世紀(jì)80年代初,復(fù)位后準(zhǔn)雙向口輸出高電平,后來的8086、8098、80186都是類似的。
STC8系列的改為上電為高阻,不會再出現(xiàn)你所說的問題。而AVR上電后也是高阻。
先輸出低電平,再設(shè)置為推挽輸出。
回復(fù)

使用道具 舉報

31#
ID:383215 發(fā)表于 2022-12-31 22:03 | 只看該作者
Y_G_G 發(fā)表于 2022-12-29 19:52
個人玩的東西,我還是很喜歡STC的單片機(jī)的,當(dāng)然,就功能而言,還是更喜歡STM32,用STM32很多時候壓根就用考慮 ...

對于我而言,一塊多錢的STC8H1K08我非常滿意,之前ATMEGA8只用了1兆的內(nèi)部RC振蕩器,移植程序到STC8H1K08也只用了1兆的內(nèi)部RC振蕩器,后來發(fā)現(xiàn),有的STC8H1K08無法使用1兆的內(nèi)部RC振蕩器,就被迫把內(nèi)部RC振蕩器提高到1.2兆,至于STM32,我只學(xué)習(xí)到流水燈就沒有學(xué)下去了,一塊多錢的STC8H1K08能做到的事情,我為什么要用七、八塊錢甚至十幾塊錢的STM32?至于那些幾毛錢的單片機(jī),目前我用不上,有個老朋友的一個老產(chǎn)品要是可以上量的話,我可能會考慮幾毛錢的單片機(jī),但是,那個產(chǎn)品上量的可能性幾乎為零。

評分

參與人數(shù) 1黑幣 +5 收起 理由
ax6808 + 5

查看全部評分

回復(fù)

使用道具 舉報

32#
ID:383215 發(fā)表于 2022-12-31 22:31 | 只看該作者
coody_sz 發(fā)表于 2022-12-31 17:36
那是因?yàn)槟悴皇煜?1架構(gòu)造成的。51架構(gòu)的MCU出現(xiàn)與上世紀(jì)80年代初,復(fù)位后準(zhǔn)雙向口輸出高電平,后來的808 ...

我為什么一定要熟悉51架構(gòu)?我學(xué)單片機(jī)是從48單片機(jī)開始的,傳統(tǒng)51單片機(jī)的代表芯片是8031,你知道48單片機(jī)的代表芯片是什么嗎?我只知道51單片機(jī)是48單片機(jī)的改進(jìn)型單片機(jī),還真不知道什么是51架構(gòu),我覺得我學(xué)單片機(jī)對我提高最大的就是48單片機(jī),而且是本子京三制作所用48單片機(jī)制造的一個老設(shè)備,從這個48單片機(jī)的老設(shè)備我悟出了步驟式編程和CPU應(yīng)用率編程,并且應(yīng)用到51、430、AVR、STM32,經(jīng)過20多年的總結(jié),我可以讓我的程序占用CPU時間最短,我可以讓我的程序運(yùn)行速度有的可以提高10倍以上。我為樓主回答的問題,是告訴樓主,沒有什么墨守成規(guī)的編程方法,多學(xué)幾種單片機(jī)就很容易發(fā)現(xiàn)不同單片機(jī)正確的編程方法。不過話又說回來,單片機(jī)編程只是我的業(yè)余愛好,懂不懂51架構(gòu)對我編程沒有什么影響。
回復(fù)

使用道具 舉報

33#
ID:975054 發(fā)表于 2023-1-1 22:10 | 只看該作者
嗯!大家新年快樂!
可笑的三年!剛好有個小設(shè)備沒人愿意做我就頂上去了,沒想到讓我這個射頻工程師老鳥學(xué)會了STC嵌入式單片機(jī),可以隨型所欲的極簡設(shè)計(jì)一些傳感+控制+3D小外殼設(shè)計(jì)全套玩意,也是一種莫大的收獲及樂趣! 共勉!
回復(fù)

使用道具 舉報

34#
ID:975054 發(fā)表于 2023-1-2 02:38 | 只看該作者
今天又碰到個問題:
STC8省電: 平時2秒掉電喚醒1次正常, 但自動待機(jī)后4秒還會誤喚醒1次?想了好一會,原來是我在自動待機(jī)前忘關(guān)掉電喚醒定時器了,呵呵! 原來如此!  
自動待機(jī)前關(guān)掉掉電喚醒定時器后,拿高精度萬用表測試了一下待機(jī)電流,工作電壓約3.8V時約0.5μA(手冊5V時0.6μA),很舒服哦!  
之前只測過最低2.3μA,原來是含掉電喚醒定時器工作電流,而一直待機(jī)不含(手冊里的數(shù)據(jù)得到比較精確的驗(yàn)證,呵呵!)
回復(fù)

使用道具 舉報

35#
ID:308903 發(fā)表于 2023-1-3 08:55 | 只看該作者
感覺~好高端的問題
回復(fù)

使用道具 舉報

36#
ID:975054 發(fā)表于 2023-4-30 16:35 | 只看該作者

見笑了!我是射頻總體技術(shù)工作三十幾年的老鳥,但嵌入式還只是近二年自己感興趣自學(xué)的菜鳥,好在系統(tǒng)總體經(jīng)驗(yàn)教訓(xùn)相對較足,普通硬件外圍應(yīng)用電路設(shè)計(jì)及PCB布板電裝測試驗(yàn)證可以一條龍搞定,不然我老人家就根本吃不消了。。。
近期仍在不斷研究優(yōu)化,力求小東西設(shè)計(jì)最簡、好用且最可靠、最省電...把簡單的東西做到越來越精致當(dāng)快樂了!
很多東西都要具體問題具體分析,就如我前面上傳的單按鍵長短按中斷檢測消抖代碼(說明:當(dāng)時T0定時器消抖用的還是查詢方式while(!TF0),其實(shí)與隨便調(diào)用一句20ms延時完全等效)。一般中斷里都盡量少調(diào)用延時(主要會延長處理時間,系統(tǒng)復(fù)雜時代碼執(zhí)行易混亂),但我東西簡單主要就處理按鍵中斷,里面暫時全是延時,反正又不是鍵盤一直在按,可靠就好,另外的原因是我用的最小8腳MCU,配合外圍四個LED控制及早晚光控及充電電池檢測指示省電等等等基本特性功能,有幾個腳都復(fù)用了,包括這個關(guān)鍵引腳P32,代碼邏輯策略設(shè)計(jì)原因,暫時只能這樣處理,不排除后面還會繼續(xù)綜合優(yōu)化。。。學(xué)海無涯回頭是岸

節(jié)日無事,偶來這里學(xué)習(xí)學(xué)習(xí),順便留言! 順祝大家節(jié)日快樂!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表