2017-10-19 93 views
-1

我正在嘗試設置一個延遲0.25秒的定時器1,並且遇到困難。在PIC16F723上設置定時器

我用下面的計算來獲得的寄存器值:

FCPU = FOSC/4 = 16兆赫/ 4 = 4 MHz的

Ftimer = FCPU /預分頻器= 4MHz的/ 8 = 0.5兆赫

Ttimer = 1/Ftimer = 1/0.5兆赫= 2我們

計數=期望的延遲/ Ftimer = 0.25/2 =我們125000

這種特殊的芯片具有以下presc ALER值:

定時器0:2,4,8,16,32,64,128,256

定時器1:1,2,4,8

定時器2:1,4, 16

由於這個計數對於16位寄存器來說太大了,我在計算錯誤嗎?或者,我只是因爲我想要的那個特殊延遲而走平了?

+0

如果定時器1上的預分頻器'8'不夠用:使用定時器2或定時器0. –

+0

發佈用於這些計算的真實代碼。問題可能包括計算FP數學的整數數學。 – chux

+0

Chux這些是用來設置計時器的計算,所以目前還沒有代碼。 – Schwagmister

回答

0

如果你想要一個純粹的硬件解決方案,你的運氣不好。你的想法並不遙遠,如果你的應用程序允許的話,將CPU速度減半會給你你正在尋找的時間間隔。另一種選擇是使用軟件計數器來追蹤溢出次數。在你的上面的例子中,你想要每隔兩次溢出時採取行動。

+0

我在數據手冊中發現,如果將PLLEN位設置爲1並更改OSCCON寄存器的IRCF位,我可以更改時鐘速度。 11 = 16兆赫 10 = 8兆赫 01 = 4 MHz的 00 = 2兆赫 如果我慢下來和返工我得到的值即實際上將配合在寄存器中的計算。您認爲這是一個可行的解決方案嗎? – Schwagmister

+0

這將取決於您的特定應用程序。如果你不需要額外的速度,這絕對是一個可行的選擇。在某些情況下,您需要獲得所有的處理能力,但通常您可能會放慢CPU速度,因此不會有任何問題。 –

0

您可以隨時使用與計時器綁定的中斷。

在該中斷上設置一個計數器,然後在計數器達到必要的數值後運行該過程。

這不是最優雅的解決方案,但它通常對PIC很好。

+0

我在數據手冊中發現,如果將PLLEN位設置爲1並更改OSCCON寄存器的IRCF位,我可以更改時鐘速度。 11 = 16兆赫 10 = 8兆赫 01 = 4 MHz的 00 = 2兆赫 如果我慢下來和返工我得到的值即實際上將配合在寄存器中的計算。您認爲這是一個可行的解決方案嗎? – Schwagmister

+0

當然是這樣,但前提是你不需要別處的處理能力。 最佳實踐會告訴您急於進入睡眠技術,您可以以更高的處理能力運行,執行操作,然後休眠,直到需要喚醒以再次執行操作以降低功耗。 如果您不關心功耗或者任務不是非常複雜,那麼以低時鐘速度運行應該沒有關係。 – GMoney

0
  1. 無論誰下降,請提供反饋意見,爲什麼。如果問題顯示沒有研究,不清楚或者沒有用處,那麼您就會冷靜下來。我的問題屬於這些類別之一。正如你所看到的,除非你是盲人,其他人明白我在問什麼。

  2. 要回答我的原始問題,我原來的想法是從硬件生成我想要的延遲。我甚至沒有考慮過使用「tick計數器」,因爲mplab稱之爲「tick計數器」。基本上,滴答計數器計算最大延遲發生的次數以儘可能接近期望的延遲。

例如,

如果我有一個32兆赫振盪器,4的時鐘分頻器的4預分頻器和8

一個寄存器大小我會:

32/4 = 8 MHz(時鐘分頻器) 8/4 = 2 MHz(預分頻器)

所以我的指令頻率是2 MHz 這是一個指令週期1/8000000 = 0.0000005秒。 這也是我能給出當前振盪頻率,時鐘分頻器和預分頻器的最小延遲時間。

由於我必須具有的256 最大十進制值的8位寄存器,我將具有256 * 0.0000005 =0.000128秒

如果我的期望的延遲不落在這些邊界是內的最大延遲太大,我會得到一個負值寄存器值

延遲的計數=期望的延遲/計時器週期 如果我想要一個250毫秒的延遲,這將是0.25/0.0000005,這會給我一個遠遠大於8位寄存器將成立。

對於PR寄存器值,如果計數遠大於最大寄存器值,我們將採用256計數,這會給我一個負數。

要計算產生所需延遲所需的刻度值(給定我們可能具有的最大延遲),我們將採用所需的延遲/最大延遲。

所以0.25/0.000128 = 1,953.125 四捨五入向上/向下,我們得到以下值:

截至1954年:0.250112

下到1953年:0.249984

因此,根據如何準確的,我們需要它看起來像1954年將是正確的滴答櫃檯。因此,爲了在給定32MHz振盪器,4的時鐘分頻器,4的預分頻器和8的最大值爲256的寄存器大小的情況下得到0.25秒的延遲,我們將具有0.000128秒的最大延遲,並且1954年蜱計數器拿到造成的

1954年* 0.000128 =0.250112秒延遲

  • 我做了,它計算所有這一切都基於什麼給出一個Windows圖形用戶界面應用程序。它會自動計算任何值如果更改。所以如果我改變我的寄存器大小,它會自動重新計算最大延遲和PR值。如果有人有興趣,我會願意公開回購。
  • 感謝您的幫助!