Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
版主
|
剛在看了一下 OpenUART( ) 的函數,他只支援 USART 的功能,而 PIC18F4620 是 Enhanced USART 的功能,有些暫存器的設定就沒有設到所以要額外的去設定,如 : BAUDCON & RCSTS Register.
基本上你是使用 8 bit Baud Rage 除法器,所以設成 Baud-High 時 Fosc/16 後其值為 312 已經超過 8-bit 的範圍值了。所以選用 Baud-Low 的設定 Fosc/64 後為 77 才可以符合 8-bit Baud-Rate Register 的設定。 所以你是一直認為 所計算出來的Baud 值是可以直接用 INT 的格式填到 16-bit Baud Rate Generater 的,其實因為 default 的設定是 8-bit 所以就不對了。 USB 在 Full-Speed 底下是要 48MHz 的速度,我所講的是 CPU 的執行速度,因為48MHz 被 CPUDIV<1:0> 除過了所以 CPU 的執行速度變慢了不再是 48MHz 了。USB 與 CPU 的頻率是分開的。
發表於: 2008/12/3 11:26
|
|||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
中級會員
|
Ryang 寫道:
<1> ANS: 可是你在 Baud-Read Register 卻選用了 8 bit mode (BRG16 = 0) ,所以就錯了。 com: 謝謝指導, 不過在 openuart 參數裡並只有以下二種mode Transmission Width: USART_EIGHT_BIT 8-bit transmit/receive USART_NINE_BIT 9-bit transmit/receive 你指 9-bit 嗎? 不對喔,我的data bit 是 8-bit 既然 API 指明 input 是 unsigned int, 就不可能call進去後又把你shrink成8bit 另外,你講的是直接控制register吧,我程式碼上寫明很清楚喔,我是call MC 的 lib <2> ANS: Data Sheet 沒有看清楚,裡面的計算公式裡有標示: BRGH=0 時,Fosc/64 BRGH=1 時,Fosc/16 com: 你好, 謝謝, 不過, 可能你沒看清我的問題喔, 我很明白清楚的寫USART_BRGH_HIGH 或者跟上一題一樣,你沒弄清 openusart API 喔 不過照你這麼說我也知道了, 其沒有什麼9600要low , 19200就high這種東西,還是以自己輸入為主. 我本來還被嚇一跳,怎有這種怪定義喔 <3> ANS: 這樣只是將 CPU 的頻率降下來而已,實際上還是沒有真正的解決問題。 com: 謝謝, 不過好像沒有喔, 因為我測過了, 我 USB 還是以 48MHz速度在跑, 你可以看 fig 2-1 , PIC18F87J50 FAMILY CLOCK DIAGRAM 我除頻只是除 圖的右下角那塊 Peripherals 喔, 對於 uart, 24MHz 這個速度對我已經綽綽有餘了 不過,非常謝謝你的指教,還希望我有不懂的地方你能再幫忙幫忙 對於 MicroChip 我是新手
發表於: 2008/12/3 9:33
|
|||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
版主
|
<1>
void Open1USART( unsigned char config, unsigned int spbrg); spbrg 是 unsinged int 超過 256 不會有問題 ANS: 可是你在 Baud-Read Register 卻選用了 8 bit mode (BRG16 = 0) ,所以就錯了。 <2> DataSheet 是這樣寫的 BRGH: High Baud Rate Select bit Asynchronous mode: 1 = High speed 0 = Low speed 但它並沒有定義何謂 High Speed?何謂 Low? ANS: Data Sheet 沒有看清楚,裡面的計算公式裡有標示: BRGH=0 時,Fosc/64 BRGH=1 時,Fosc/16 <3> 我一樣是設 high speed, 但頻率調降/除頻 #pragma config CPUDIV = OSC2_PLL2 // OSC2 = [CPU System clock/2] baudrate 一樣是9600, 但問題就解決了 ANS: 這樣只是將 CPU 的頻率降下來而已,實際上還是沒有真正的解決問題。
發表於: 2008/12/3 7:59
|
|||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
中級會員
|
<1>
void Open1USART( unsigned char config, unsigned int spbrg); spbrg 是 unsinged int 超過 256 不會有問題 <2> DataSheet 是這樣寫的 BRGH: High Baud Rate Select bit Asynchronous mode: 1 = High speed 0 = Low speed 但它並沒有定義何謂 High Speed?何謂 Low? <3> 我一樣是設 high speed, 但頻率調降/除頻 #pragma config CPUDIV = OSC2_PLL2 // OSC2 = [CPU System clock/2] baudrate 一樣是9600, 但問題就解決了
發表於: 2008/12/2 18:49
|
|||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
版主
|
9600bps 屬於低速的,工作在 48MHz 時,請設定成 SYNC = 0, BRGH = 0, BRG16 = 0 (如果使使用 8-bit Baud-Rate Generator),這樣計算公式為 : FOSC/[64 (n + 1)]
9600bps=48000000/[64(n+1)] 78=n+1 n=77
發表於: 2008/12/2 8:13
|
|||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
資深會員
|
假設您的頻率真的是48MHz,那麼套用您的公式
BRGVAL = (F_OSC/16/(BAUDRATE + 1)) = 48000000 / 16 / 9601 = 312 大於1 Bytes 255了 看一下Datasheet裡有關"BRGH"的設定 參照:
發表於: 2008/12/2 1:14
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
資深會員
|
最簡單的方法,就是讓PIC18F87J50送0X55出去,再用示波器看看速度差了幾倍。
然後,仔細看看 http://ww1.microchip.com/downloads/en/DeviceDoc/39775b.pdf 裏的FIGURE2-1,看是不是那裏設的不對,或者誤解了。 我最近做PIC18F2455也碰到類似的問題,最後才知道是自己資料沒看懂所致。
發表於: 2008/12/1 22:05
|
|||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
中級會員
|
不, 很抱歉, 可能我沒寫清楚, 如同我寫的, 我 48 也試過了
>我的外部是 12MHz, 我試過48, 8, 6, ....等頻率. 皆無法運作 > #define F_OSC 48000000
發表於: 2008/12/1 16:22
|
|||
|
Re: PLL enable 後 UART 就有問題了
|
||||
---|---|---|---|---|
版主
|
如果你沒有 Enable PLL 的畫室跑 12MHz 的。如果 Enable PLL 後 12MHz 會現除三得到4MHz 後送給PLL產生 96MHz的頻率,經除二電路得到 48MHz 後送給 USB Peripheral 及 CPU, 如果 CPUDIV<0:1> 是除以1:1 的話,那你的 CPU 是執行 48MHz 的速度,所以 UART 就快了 4 倍,單然收不到正確的資料。
發表於: 2008/12/1 15:19
|
|||
|