當我們用一款單片機時,首先要考慮的就是它的指令週期,因爲只有明確指令週期是多少,才能運用延時,定時器,中斷,PWM模塊。
1、首先我們看一下單片機外部晶振一般爲多少?
從上圖可以知道,輸入頻率範圍一般爲4MHZ-10MHZ,即從OSC1和OSC2管腳外接晶振即可,現在我用的是DSPIC30F5015芯片。用的外接晶振是4MHZ的,在其他管腳沒有外接晶振。
然後我們可以從框圖中可以看出DSPIC中具有PLL模塊即倍頻模塊。它可以提高內部工作頻率。當時我用它的時候是四倍頻,只要在程序中加入
/*配置位*/
_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍頻晶振,Failsafe 時鐘關閉
即可,這樣外部晶振頻率輸入後內部鎖相環將它擴頻4倍後達到16MHZ。
在圖中註釋1可以看到指令週期爲系統時鐘的1/4即
系統Fcy=16M/4=4M
或者Tcy=4/FOSC=4/16=1/4us。
2、如果外設中用到定時怎麼用??
通過上面的例子可以知道。他使用的是外部晶振頻率是10M的,我用的是4M的,4倍頻後是40MHZ,而Fcy還要除以4,所以,Fcy=10M,Tcy=0.1us。
在程序中具體實現:
首先要定義一下
例如
#define Fcy 7370000 //7.37MHz外部晶振帶4倍頻,指令週期爲7.37MIPs,他用的外部晶振是7.37MHZ的
然後如果要使用的時候,你定義的是Fcy就不能用Tcy了(如果用Tcy前面就要定義#define Tcy 1/7370000 )
要求PR2(寄存器)的時候就要按照如下寫。
//6.1.4 程序清單
/* 該程序採用定時器 1(Timer 1)閃亮LED,同時按鍵可以使LED開關。 */
#include <p30f6014.h> //dsPIC30F6014標準頭文件
/*配置位*/
_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍頻晶振,Failsafe 時鐘關閉
_FWDT(WDT_OFF); //關閉看門狗定時器
_FBORPOR(PBOR_OFF & MCLR_EN); //掉電覆位禁止,MCLR復位使能。
_FGS(CODE_PROT_OFF); //代碼保護禁止
#define Fcy 7370000 //7.37MHz外部晶振帶4倍頻,指令週期爲7.37MIPs
int main(void)
{
/*設置LED控制寄存器和定時器*/
//初始化LED端口和按鍵開關端口
LATD = 0xFFFF; //關閉所有LED
TRISD = 0xFFF0; //設定LED引腳爲輸出
TRISA = 0xFFFF; //設定按鍵開關引腳爲輸入
//初始化定時器1爲1/2秒
T1CON = 0; //關閉定時器1
TMR1 = 0; //啓動定時器1的計數寄存器爲0
PR1 = (Fcy/256)/2; //設定1/2秒延時時間
T1CON = 0x8030; //配置定時器1 (定時器開, 在空閒模式定時器繼續工作,
//控時間累加禁止, 預分頻比是1:256, 內部時鐘)
while (1)
{
/*按1Hz的頻率閃亮LED*/
if(IFS0bits.T1IF == 1) //檢測定時器1的中斷標誌是否設定
{
IFS0bits.T1IF = 0; //清除定時器1中斷標誌
LATDbits.LATD0 = !LATDbits.LATD0; // LED1閃亮
}
/*按鍵控制LED開關*/
if(PORTAbits.RA12 == 0) //檢測SW1按鍵是否按下
{
LATDbits.LATD2 = 0; //LED3開
LATDbits.LATD3 = 1; // LED4關
}
if(PORTAbits.RA13 == 0) //檢測SW2按鍵是否按下
{
LATDbits.LATD3 = 0; // LED4開
LATDbits.LATD2 = 1; // LED3關
}
}
}
後面我會將陸續介紹一下PIC單片機的其他功能。希望和大家共同探討學習。