2011年2月28日 星期一

DIY - PIC:C18 Timers 函數庫程式 (廿十六)

DIY - PIC:C18 Timers 函數庫程式 (廿十六) :

Microchip C18 有內置支持 Timer 計時器函數庫模塊 (timers.h),衹需要用包括 timers 頭文件 ()。然後再呼叫不同的功能,便可控制 PIC18F4550 內的四個計時器。

 
功能 – CloseTimersx ( 禁止指定的計時器) 
原型:void CloseTimerx( void ); 
說明 – 該函數禁止中斷和指定的計時器

功能
– OpenTimer0 (配置timer0) 
原型:void OpenTimer0( unsigned char config ) ; 
參數:config 
說明:該函數按照指定的選項配置timer0 
範例:OpenTimer0( TIMER_INT_OFF & T0_8BIT & T0_SOURCE_INT & T0_PS_1_32 ) ;
 
OpenTimer0 選項配置 說明
允許Timer0 中斷 TIMER_INT_ON 允許中斷
TIMER_INT_OF 禁止中斷
計時器寬度 T0_8BIT 8 位元模式
T0_16BIT 16 位元模式
時鐘源 T0_SOURCE_EXT 外部時鐘源(I/O 引腳)
T0_SOURCE_INT 內部時鐘源(TOSC)
外部時鐘觸發(T0_SOURCE_EXT) T0_EDGE_FALL 外部時鐘下降沿
T0_EDGE_RISE 外部時鐘上升沿
預分頻值 T0_PS_1_1 1:1     預分頻
T0_PS_1_2 1:2     預分頻
T0_PS_1_4 1:4     預分頻
T0_PS_1_8 1:8     預分頻
T0_PS_1_16 1:16    預分頻
T0_PS_1_32 1:32    預分頻
T0_PS_1_64 1:64    預分頻
T0_PS_1_128 1:128   預分頻
T0_PS_1_256 1:256   預分頻

功能 – OpenTimer1 (配置timer1)
原型: void OpenTimer1( unsigned char config ) ;
參數: config
說明: 該函數按照指定的選項配置timer1
範例: OpenTimer1( TIMER_INT_ON & T1_8BIT_RW & T1_SOURCE_EXT & T1_PS_1_1 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF & T1_SOURCE_CCP ) ;

OpenTimer1 選項配置 說明
允許Timer1 中斷 TIMER_INT_ON 允許中斷
TIMER_INT_OF 禁止中斷
計時器寬度 T1_8BIT_RW 8 位元模式
T1_16BIT_RW 16 位元模式
時鐘源 T1_SOURCE_EXT 外部時鐘源(I/O 引腳)
T1_SOURCE_INT 內部時鐘源(TOSC)
振盪器使用 T1_OSC1EN_ON 使能Timer1 振盪器
T1_OSC1EN_OFF 禁止Timer1 振盪器
同步時鐘輸入 T1_SYNC_EXT_ON 同步外部時鐘輸入
T1_SYNC_EXT_OFF 不同步外部時鐘輸入
預分頻值 T1_PS_1_1 1:1     預分頻
T1_PS_1_2 1:2     預分頻
T1_PS_1_4 1:4     預分頻
T1_PS_1_8 1:8     預分頻

功能 – OpenTimer2 (配置timer2) 
原型:void OpenTimer2( unsigned char config ) ;
參數:config 
說明:該函數按照指定的選項配置timer2
範例:OpenTimer2( TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_8 ) ;


OpenTimer2 選項配置 說明
允許Timer2 中斷 TIMER_INT_ON 允許中斷
TIMER_INT_OF 禁止中斷
預分頻值 T2_PS_1_1 1:1     預分頻
T2_PS_1_4 1:4     預分頻
T2_PS_1_16 1:16   預分頻
後分頻值 T2_POST_1_1 1:1     後分頻
T2_POST_1_2 1:2     後分頻
T2_POST_1_3 1:3     後分頻
T2_POST_1_4 1:4     後分頻
T2_POST_1_5 1:5     後分頻
T2_POST_1_6 1:6     後分頻
T2_POST_1_7 1:7     後分頻
T2_POST_1_8 1:8     後分頻
T2_POST_1_9 1:9     後分頻
T2_POST_1_10 1:10   後分頻
T2_POST_1_11 1:11   後分頻
T2_POST_1_12 1:12   後分頻
T2_POST_1_13 1:13   後分頻
T2_POST_1_14 1:14   後分頻
T2_POST_1_15 1:15   後分頻
T2_POST_1_16 1:16   後分頻


功能 – OpenTimer3 (配置timer3)
原型:void OpenTimer3( unsigned char config ) ;
參數:config
說明:該函數按照指定的選項配置timer3
範例:OpenTimer3( TIMER_INT_ON & T3_8BIT_RW & T3_SOURCE_EXT & T3_PS_1_1 & T3_OSC1EN_OFF & T3_SYNC_EXT_OFF & T3_SOURCE_CCP ) ;

OpenTimer3 選項配置 說明
允許Timer3 中斷 TIMER_INT_ON 允許中斷
TIMER_INT_OF 禁止中斷
計時器寬度 T3_8BIT_RW 8 位元模式
T3_16BIT_RW 16 位元模式
時鐘源 T3_SOURCE_EXT 外部時鐘源(I/O 引腳)
T3_SOURCE_INT 內部時鐘源(TOSC)
預分頻值 T3_PS_1_1 1:1     預分頻
T3_PS_1_2 1:2     預分頻
T3_PS_1_4 1:4     預分頻
T3_PS_1_8 1:8     預分頻
同步時鐘輸入 T3_SYNC_EXT_ON 同步外部時鐘輸入
T3_SYNC_EXT_OFF 不同步外部時鐘輸入
供CCP 使用 T1_SOURCE_CCP Timer1作為兩個CCP 的時鐘源
T3_SOURCE_CCP Timer3作為兩個CCP 的時鐘源
T1_CCP1_T3_CCP2 Timer1作為CCP1 的時鐘源,Timer3 作為 CCP2 的時鐘源

功能 – OpenTimer4 (配置timer4)
原型:void OpenTimer4( unsigned char config ) ;
參數:config
說明:該函數按照指定的選項配置timer4
範例:OpenTimer4( TIMER_INT_OFF & T4_PS_1_1 & T4_POST_1_8 ) ;

OpenTimer4 選項配置 說明
允許Timer4 中斷 TIMER_INT_ON 允許中斷
TIMER_INT_OF 禁止中斷
預分頻值 T4_PS_1_1 1:1     預分頻
T4_PS_1_4 1:4     預分頻
T4_PS_1_16 1:16   預分頻
後分頻值 T4_POST_1_1 1:1     後分頻
T4_POST_1_2 1:2     後分頻
T4_POST_1_3 1:3     後分頻
T4_POST_1_4 1:4     後分頻
T4_POST_1_5 1:5     後分頻
T4_POST_1_6 1:6     後分頻
T4_POST_1_7 1:7     後分頻
T4_POST_1_8 1:8     後分頻
T4_POST_1_9 1:9     後分頻
T4_POST_1_10 1:10   後分頻
T4_POST_1_11 1:11   後分頻
T4_POST_1_12 1:12   後分頻
T4_POST_1_13 1:13   後分頻
T4_POST_1_14 1:14   後分頻
T4_POST_1_15 1:15   後分頻
T4_POST_1_16 1:16   後分頻

功能 – ReadTimerx (讀取指定計時器的值)
原型:unsigned int ReadTimerx( void ) ;
說明:這些函數讀取各個計時器寄存器的值。
Timer0: TMR0L,TMR0H
Timer1: TMR1L,TMR1H
Timer2: TMR2
Timer3: TMR3L,TMR3H4
Timer4: TMR4
注:當使用可配置為 16 位元模式、但工作在8 位元模式的計時器(如 timer0)時,高位元組並不保證為 0。用戶可能希望將結果強制轉換為字符型,以得到正確的結果。
範例:
// Example of reading a 16-bit result
// from a 16-bit timer operating in
// 8-bit mode:
unsigned int result;
result = (unsigned char) ReadTimer0();



功能 –WriteTimerx (讀取指定計時器的值) 
原型:void WriteTimerx( unsigned int timer ) ; 
說明:這些函數將值寫入到相應的計時器寄存器: 
Timer0: TMR0L,TMR0H 
Timer1: TMR1L,TMR1H 
Timer2: TMR2 
Timer3: TMR3L,TMR3H 
Timer4: TMR4 
範例:WriteTimer0( 10000 ) ; 

2011 年 02 月 28 日 天氣報告 
氣溫:21.5 度 @ 23:00 
相對濕度:百分之72% 
天氣:天色大致良好

2011年2月27日 星期日

DIY - PIC: PIC18F4550 Timer0 工作原理 (廿十五)

DIY - PIC: PIC18F4550 Timer0 工作原理 (廿十五) :

Microchip PIC18F4550 內置有四個 Timer (Timer0 / Timer1 / Timer2 / Timer3),每個 Timer都有不一樣的功能,深入了解 Timer 結構及工作原理,便可以運用作不同的設計。Timer0 (TMR0) 是所有 PIC 微控制器基本的 8 位定時器。


Timer0 模組具有以下特徵:
  • 可通過軟體選擇,作為8 位或16 位計時器/ 計數器
  • 可讀寫的寄存器
  • 專用的8 位元軟體可編程預分頻器
  • 可選的時鐘源(內部或外部)
  • 外部時鐘的邊沿選擇
  • 溢出中斷
Timer0 既可用作計時器 (Timer) 亦可用作計數器 (Counter) ,可作 8位元模式或 16 位元模式。當用作計時器 (Timer),Timer0 計時器可以看作同一個遞增寄存器,在每個指令週期 (¼的時鐘速率),不使用預分頻器。20MHz 振盪器,定時器寄存器的速度遞增為 0.2us。八位寄存器保存的值是在範圍 0 到 255 的十進制。當計數器溢出寄存器復位。如果寫入 TMR0 寄存器,那麼在隨後的兩個指令週期內,計數將不再遞增。用戶可通過將校正值寫入 TMR0 寄存器來避開上述問題。

▲ 8 位 及16 位模式計時器簡化框圖
Timer0 在計數器 (Counter) 模式下, Timer0 可在 RA4/T0CKI 引腳檢測輸入信號的每個上升沿或下降沿而遞增。可選擇上升沿或下降沿作觸發信號。

▲上升沿或下降沿作觸發信號工作框圖
Timer0 的中斷是當 TMR0 寄存器發生溢出時(8 位元模式下 - 從 FFh 到 00h;或16 位元模式下 - 從 FFFFh 到 0000h),將產生 TMR0 中斷。這種溢出會將標誌位元 TMR0IF 置1。可以通過清零 TMR0IE 位(INTCON<5>)來遮罩此中斷。在重新允許該中斷前,必須在中斷服務程式中用軟體清零 TMR0IF 位。由於 Timer0 在休眠模式下是關閉的,所以 TMR0 中斷無法將處理器從休眠狀態喚醒。

 
Timer0 模組的預分頻器為一個 8位計數器。此預分頻器不可直接讀寫。其值通過 PSA 和 T0PS2:T0PS0 位(T0CON<3:0>)來設置,此位決定預分頻器的分配和預分頻比值。預分頻比值可以在 1:2 到 1:256 之間進行選擇。
▲ Timer0 控制寄存器 (T0CON)
2011 年 02 月 27 日 天氣報告
氣溫:19.5 度 @ 23:00 
相對濕度:百分之90% 
天氣:天色大致良好

2011年2月26日 星期六

DIY - PIC: PIC18F4550 微控制器的時鐘結構 (廿十四)

DIY - PIC: PIC18F4550 微控制器的時鐘結構 (廿十四) :

Microchip PIC18F4550 的內部時鐘結構屬於帶有 USB 介面的特殊功能中檔微控制器,而內部的分頻結構原理也是不簡單,需要化時間來了解!PIC18F4550 的時鐘結構主要是分開為兩個部分,第一個是提供 USB 的時鐘,第二個是提供 MCU 的時鐘。產生原始時鐘可用外部電路 (主振盪器或輔助振盪器電路) 或內部電路 (內部振盪器電路) 提供,其中以用石英晶體組成的振盪電路為主,特別在要使用 USB 功能時。以下用 20MHz 用外部石英晶體的振盪電路作為例子。

▲PIC18F4550 時鐘簡化框圖
首先用 20MHz 石英晶體 (4MHz / 8MHz / 12MHZ / 16MHz / 20MHz 或 24MHz都可以) 及電容器接在 OSC1 和 OSC2 引腳(PIC18F4550 引腳 13和引腳 14),組成典型皮爾斯 (Pierce) 振盪器電路。

▲石英晶體振盪器電路
USB 時鐘產生原理,由於 USB 模塊必須要求工作於 6MHz 的(低速)或 48MHz 的(全速)時鐘,振盪頻率 20MHz 進入,為了適合這些要求, PIC18F4550 要提供 48 MHz 的時鐘以進行全速 USB 操作。在電路上增加了一個額外的預分頻器和後分頻器系統以提供不同範圍的振盪頻率。

▲USB 時鐘結構
由於 USB 的時序要求,當使能 USB 模組時,需要使用 6MHz 或 48MHz 的內部時鐘。在低速模式 (6MHz) 的 USB 時鐘信號來自於主振盪器,而並非直接來自 PLL (鎖相環)。它被四分頻以產生實際頻率為 6MHz 的時鐘信號。因此,當 USB 模組工作時微控制器只能使用 24 MHz 的時鐘,而且該時鐘源必須處於某種主振盪器模式(XT、HS 或EC,帶或不帶PLL)。如果微控制器時鐘源是輔助振盪器或內部振盪器電路,此限制則不適用。 

USB 模組在兩種模式下都能非同步於微控制器內核和其他外設運行。這意味著可以在使用主振盪器作為 USB 時鐘的同時,用一個獨立的時鐘源以較低的速率驅動微控制器。 如果必須只使用一個時鐘源為所有模組提供時鐘,採用全速模式可選擇較廣範圍的微控制器時鐘頻率。 

主振盪器的頻率首先會接到除頻器,除頻器會根據寄存器數據 (PLLDIV=5) 作出除頻 (÷ 1/2/3/4/5/6/10/12) ,除頻器的目的是要提供一個標準 4MHz 頻率給予 PLL (鎖相環 Phase Lock Loop),PLL 會產生一個 96MHz頻率,96MHz 頻率會除 2 (USBDIV=2) 變成 48MHz,便會提供給 USB 器件。 

USB配置1: 
PLLDIV=5      20MHz /5 = 4MHz           寄存器 CONFIG1L:PLLDIV=100  
USBDIV=2      96MHz /2 = 48MHz        寄存器 CONFIG1L:USBDIV=1  
FSEN=1           48MHz                            寄存器UCFG:FSEN1=1 

在 PIC18F4550 的 CPU 時鐘原理,時鐘源可以由主振盪器、輔助振盪器或內部振盪器電路提供,如用上同 USB 的振盪器 20MHz,20MHz 的頻率通過後分頻器 (CPUDIV)系統作出除頻 (÷ 1/2/3/4) ,然後會選擇 (XT、HS、EC、ECIO) (HSPLL、ECPLL、XTPLL、ECPIO) 的頻率,頻率便會提供給微控制器用。 

CPU配置1: 
FOSC=HS                                                         寄存器 CONFIG1H:FOSC=110x 
CPUDIV= OSC1_PLL2  20MHz /5 = 4MHz  寄存器 CONFIG1L:CPUDIV=100 

CPU配置2: 
FOSC=HSPLL_HS                                                 寄存器 CONFIG1H:FOSC=111x 
CPUDIV= OSC1_PLL2  96MHz /2 = 48MHz       寄存器 CONFIG1L:CPUDIV=100 

PIC18F4550 芯片的振盪器操作通過兩個配置寄存器和兩個控制寄存器控制。配置寄存器(CONFIG1L 和 CONFIG1H)用於選擇振盪模式和 USB 預分頻器 / 後分頻器選項。 在對器件編程時設置這兩個配置寄存器中的配置位元,這些位元將保留此配置直到重新編程為止。

▲CONFIG1L 寄存器
▲CONFIG1H 寄存器
▲OSCCIN 寄存器
2011 年 02 月 26 日 天氣報告
氣溫:19.1 度 @ 23:00 
相對濕度:百分之86% 
天氣:多雲