PIC18x Timer 分享 IV
這一次我們就來看看 CCP1 的輸出功能
有人可能會問,CCP1 是甚麼東東?有這一 pin 嗎?
原來 CCP1 就是 RC2,因為 PIC 的功能很多,但接腳有限,所以經常會有這種共用接腳的方式。
接下來讓我們來看看 Compare mode 的另一項功能:Toggle output。顧名思義就是每次 Timer1 與 CCPR1 比較相符時就反轉輸出,這樣要產生一個固定頻率的輸出就很方便了。有興趣的人可以參考前面的方式觀察一下,以下我們就直接用程式碼從 CCP1 產生一個 500KHz 的方波輸出。
執行的結果如下
程式前半段都是一些初始化的設定,唯一比較特殊的是,這個模式在 Timer1 與 CCPR1 比較相符並設定 CCP1IF 旗標後,並不會重置 Timer,所以變成我們要用手動的方式將 CCPR1 往後加 1000 cycles。
看到這裡有一些 Idea 嗎?我們是不是可以設定非 50% Duty cycle 的方波呢?我們下次再見吧!
有人可能會問,CCP1 是甚麼東東?有這一 pin 嗎?
PIC18F4520 Data Sheet (Page 4)
原來 CCP1 就是 RC2,因為 PIC 的功能很多,但接腳有限,所以經常會有這種共用接腳的方式。
接下來讓我們來看看 Compare mode 的另一項功能:Toggle output。顧名思義就是每次 Timer1 與 CCPR1 比較相符時就反轉輸出,這樣要產生一個固定頻率的輸出就很方便了。有興趣的人可以參考前面的方式觀察一下,以下我們就直接用程式碼從 CCP1 產生一個 500KHz 的方波輸出。
#include <myapp.h> void main(void) { TMR1H = TMR1L = 0; // Reset timer1 CCPR1 = 1000; // 1us x 1000 = 1ms CLR(TRISC, BIT2); // Enable CCP1 (RC2) output CLR(LATC, BIT2); // Clear CCP1 CCP1CON = 0x02; // CCP1 compare mode toggle output T1CON = 0x01; // Timer1 Enable while (1) { CLR(PIR1, BIT2); // Clear CCP1IF flag while (!GET(PIR1, BIT2)) { } CCPR1 += 1000; // Set next timeout point } }
執行的結果如下
程式前半段都是一些初始化的設定,唯一比較特殊的是,這個模式在 Timer1 與 CCPR1 比較相符並設定 CCP1IF 旗標後,並不會重置 Timer,所以變成我們要用手動的方式將 CCPR1 往後加 1000 cycles。
看到這裡有一些 Idea 嗎?我們是不是可以設定非 50% Duty cycle 的方波呢?我們下次再見吧!
留言