|
發布時間: 2020-10-20 10:03
正文摘要:現在手上使用的一款IAP15W4K58S4單片機,需要使用到的中斷有定時器T0中斷和串口中斷,使用內部時鐘22.1184Mhz,配置如下: /*配置并啟動T0,定時時間是5ms*/ void Timer0Init() { ... |
robinsonlin 發表于 2020-10-27 11:52 高手,我得趕緊弄個示波器來,這個邏輯分析儀不是也一樣用嗎? |
| 設置標志位 |
單片機研究協會 發表于 2020-10-27 21:15 這個怎么測試它的FLASH容量呢? |
單片機研究協會 發表于 2020-10-27 21:15 沒燒錄幾次程序芯片就壞了嗎?這也太出乎意料了,你怎么知道是芯片壞的呢? |
robinsonlin 發表于 2020-10-27 11:52 受教了,受教了! |
AAA實在 發表于 2020-10-27 10:26 使用的15W.H的頭文件 |
| 能不能實測一下這個單片機的FLASH容量是多少,我之前測試過是55K,然后沒燒錄幾次程序芯片就壞了,不知道是個例還是全部這樣,我之前用的型號是IAP15W4K58S4 |
Y_G_G 發表于 2020-10-27 09:43 不是說不發代碼,您需要看的代碼是那一部分的,我這邊截取一下給您發過來 |
|
仿真的坑很多的,測試定時器,我一般都是在定時器里面這樣做的 void t1int() interrupt 3 { P10 = 1; SysTick++; if(SysTick%1000 == 0)SysTickSec++; if(DIR==0) { if(MotoTick<=60) { switch(MotoTick) { case 0: PWM_Init(7200); break; case 10: PWM_Init(5400); break; case 25: PWM_Init(4200); break; case 35: PWM_Init(5400); break; case 50: PWM_Init(7200); break; } MotoTick++; } else { MotoTick = 0; DIR = 1; } } else if(DIR==1) { if(MotoTick<=55) { switch(MotoTick) { case 0: PWM_Init(7200); break; case 10: PWM_Init(5400); break; case 25: PWM_Init(4200); break; case 30: PWM_Init(5400); break; case 45: PWM_Init(7200); break; } MotoTick++; } else { MotoTick = 0; DIR = 0; } } P10 = 0; } 用示波器看看P10的波形,定時器周期和定時器效率都一目了然了。畢竟是做實物,不要在軟件層面去糾結。退一萬步說,你用的是有版權的軟件么? |
karolyte 發表于 2020-10-27 09:05 使用15W你要用 15W.H 頭文件 用51.h 是不行的 |
karolyte 發表于 2020-10-25 23:11 這個時間不一樣就是不一樣的,沒有什么多不多的問題,編程是一個嚴謹的東西,不是說差不多或者什么的就可以了 在實際應用中,最終要求的結果一定是以實際測試的結果為準的,不管你仿真出來怎樣的數據,最終還是要實際測試的,那仿真的意義何在呢? 如果你一定要仿真,那也沒有問題,但是,你始終沒有代碼出來,都是靠網友去猜的,這就是為什么一個一直搞不定有原因 KEIL不管是用STC什么型號,它都是以8051為內核運行的,這15系列和89系列還T0定時器上的應用是一樣的,進入T0定時器中斷的時序是這樣的:1:關閉TR0,2:賦值兩個定時器的值,3開啟TR0并返回 |
Y_G_G 發表于 2020-10-24 19:09 昨天又試了下,發現在KEIL中模型選擇89C2就可以正常使用,但是只能使用定時器的16位計數的12T模式,當然這跟使用的模型有關,但是選擇STC15系列的模型,定時器就不能正常計數,是不是我這個KEIL軟件有問題啊,還有就是STC官方給出的范例,頭文件調用的是“reg51.h”,這個頭文件里有缺省的15系列的寄存器,所以在程序里要進行sfr和初始化,那么15系列的現在也有專用的頭文件了,里面就包含了這些寄存器的sfr,調用這個頭文件庫應該跟之前的調用"reg51.h"再sfr和初始化效果是一樣的吧? |
Y_G_G 發表于 2020-10-24 19:09 STC的單片機,在時間一類的仿真結果確實是和實際結果不一樣的,但不至于相差太多,這個我也嘗試過了,現在的問題是我仿真STC89C52的定時器中斷,就沒有問題,但是仿真STC15的定時器中斷就有問題 |
|
哥們你整這玩意好幾天了都沒有搞定嗎?這根本不是什么特困難的事呀 你始終沒有把完整的代碼和仿真圖上傳上來,都N個網友分析來分析去,誰也不知道是你什么代碼 這個是很基礎的東西,手頭上要是有個學習板和一個LED,可以自己單獨寫一個定時器中斷程序,LED每1秒取反一次,不需要什么工具就可以看出來你定時器設定的時間對不對 這只是一個仿真問題,很多人可能覺得:仿真都不行,那實物更不行了,實際上卻是:用了STC的單片機,在時間一類的仿真結果一定是和實際結果不一樣的,那還不如直接燒錄驗證 |
jokez7 發表于 2020-10-23 22:44 謝謝您,這個是STC89C51系列的模式配置方式,我使用的是STC15系列的單片機 |
jokez7 發表于 2020-10-23 22:41 我使用的是STC15系列的單片機,模式配置跟51系列的不太一樣哦 |
jokez7 發表于 2020-10-23 22:34 我用的是STC15系列的單片機,模式1不是自動重載的,也試過這種模式,沒有用的,我發現把模型設置為STC89C52就沒問題,是不是模型的問題呀? |
robinsonlin 發表于 2020-10-23 18:41 是的,我也是用這個工具設置的參數,發現不是這里的問題,因為我把模型設置為STC89C52就沒有問題 |
|
你T0工作模式設置錯誤,應設置成模式1 void Timer0Init() { AUXR |= 0x80; //定時器時鐘1T模式 TMOD &= 0xF0; //清零T0的控制位 TMOD|=0x01; //工作模式1 TH0 = 0xFF; TL0 = 0xC9; ET0 = 1; //使能T0中斷 TF0 = 0; TR0 = 1; //啟動T0 } |
| 你定時器工作模式設置錯誤,設置在模式0,是13位計數器,應該設置成模式1;TMOD&=0xf0;TMOD|=0x01; |
| 你定時器工作模式設置錯誤,應該設置成模式1 TMOD=0x01; |
長風007 發表于 2020-10-23 18:02 /*按鍵驅動,根據掃描按鍵的狀態,確定哪個按鍵執行動作*/
|
| 我需要看一下你的KeyScan();和KeyDriver();這兩個函數! |
wulin 發表于 2020-10-23 08:02 不能通過編譯?為啥在我這里可以通過編譯啊,現在只能分步查找錯誤了,謝謝你! |
karolyte 發表于 2020-10-22 17:02 樓主的程序不能通過編譯,有3段子程序沒有被調用,1項地址空間溢出錯誤以及其它40多項錯誤。 要分步查找錯誤。先屏蔽一部分模塊,調試正常后逐一添加模塊,這樣比較容易找到問題點。 特別提示:使用IAP15Wxx單片機和STC15Wxx單片機是有區別的,STC15W的EEPROM地址是固定的,IAP15W的EEPROM地址是放在用戶程序區剩余區域。如安排不當會造成寫EEPROM數據時破壞用戶程序而發生不可預測的錯誤。 |
wulin 發表于 2020-10-22 06:48 這個就似源碼,可以看一下 |
| 把你的程序發上來,設置沒有問題了。 |
karolyte 發表于 2020-10-22 08:05 你的故障描述不可思議,肯定程序有錯。你把完整程序發上來幫你看看。 |
wulin 發表于 2020-10-22 06:48 是的,我寫的5us,發錯了,不過現在改過來了,但是問題還是老樣子,就是說不管你把時間改成什么樣,它總是維持5ms一半的時間(也就是說2.1ms、2.2ms)這個樣子進入中斷,改這個定時時間不管用。 |
karolyte 發表于 2020-10-20 16:36 定時器是單片機的一項基礎功能,并且使用上也沒有什么難度。樓主發的程序不完整,難以準確判斷問題所在。樓主發的定時器設置參數是5us不是5ms。中斷函數根本就不可能正常運行。 |
amandv 發表于 2020-10-21 19:32 是的,我寫錯了,已經改過來的,但是問題還是那樣,沒有改變 |
| 你的程序定時是5uS啊,仿真軟件有時因為單片機設置的問題并不準確. |
| 會不會是內存不足的原因導致的呢? |
wulin 發表于 2020-10-20 16:20 已經改為12T模式了,但是結果跟之前一樣 |
dzbj 發表于 2020-10-20 19:40 這個重裝模式已經在配置函數里設置過了,不需要在中斷服務函數里再重新設置了 |
karolyte 發表于 2020-10-20 16:35 你沒設置定時器T0的重裝模式 |
g2363451687 發表于 2020-10-20 16:06 這個本身就是計算出來的初值 |
wulin 發表于 2020-10-20 16:20 改過了,還是不管用的 |