2011-08-01 59 views
0

我附上了我的代碼(我正在閃爍LED以便能夠看到環路正在發生)。我沒有收到通過UART發送的任何數據,我有Pic 16F913,並且引腳17是我試圖獲得的輸出,我把它連接到一個RF-42N藍牙模塊,我知道該模塊工作,因爲如果我連接rx到TX,我得到一個回聲。然後我嘗試了以下設置,將字母「z」發送到藍牙模塊(並希望使用blueterm在手機上閱讀)。 我沒有收到任何數據,我不知道默認的FOSC設置爲什麼,所以我嘗試了SPBRG的各種值,希望我能夠「猜出」正確的一個,但沒有一個看起來像上班。圖16F913 UART通信設置

我正在使用高科技C編譯器(免費版)。

我希望這是足夠的信息給大家,我只是不知道什麼,我缺少的,我「一直在幾個小時的戰鬥這一點。

//主文件

#include <uart.h> 

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS); 


int i, j; 
void wait(int z); 




int main() 
{ 

PORTA = 0x0; 
CMCON0 = 7; 
// Turn off Comparators 
ANSEL = 0; 
// Turn off ADC 
// Trisa4/5 0's mean output, 1's mean input 
TRISA4 = 0; 
// Make RA4/RA5 Outputs 
TRISA5 = 0; 


setupAsyncUart(); 
while (1==1) 
{ 
    RA4 = 0; 
    send('Z'); 
    wait(100); 
    RA4 = 1; 
    wait(100); 
} 
} 

// Wait routine. 
void wait(int z) 
{ 
    for (int a=0; a<z; a++) 
    { 
     for (int b=0; b<z; b++) 
     { 

     } 
    } 
} 

// UART .H

void send(char string) 
{ 
    TXREG = string; 
}  
void setupAsyncUart(int BAUDRATE) 
{ 
    SPBRG = 10; 
    BRGH = 1; //Low speed = 0 high speed = 1 
    SYNC = 0; 
    SPEN = 1; 
    TXEN = 1; 
} 

回答

1

首先你必須設置內部振盪器合適的CPU頻率。

因此首先在__CONFIG寄存器中設置FOSC < 2:0> =(100)選擇內部振盪器,然後在程序開始時將OSCCON寄存器中的IRCF2,IRCF1和IRCF0位設置爲期望的振盪器頻率,默認頻率爲4Mhz 。

比初始化的UART

  1. 啓動CPU的引腳,因爲一些管腳與其它MCPU周共享。
  2. 加載到SPBRG寄存器的正確數量取決於您的波特率和CPU時鐘頻率(檢查數據表)。
  3. 設置寄存器TXSTA中的BRGH位取決於所需的波特率發生器 (檢查數據表)。

編輯:

要配置內部時鐘使用:

#include <htc.h> 
__CONFIG(INTIO) 

你應該找到的所有其他位聲明中的 「pic16f91x.h」 文件。

// Configuration Mask Definitions 
#define CONFIG_ADDR 0x2007 
// Oscillator 
#define EXTCLK  0x3FFF // External RC Clockout 
#define EXTIO  0x3FFE // External RC No Clock 
#define INTCLK  0x3FFD // Internal RC Clockout 
#define INTIO  0x3FFC // Internal RC No Clock 
#define EC   0x3FFB // EC 
#define HS   0x3FFA // HS 
#define XT   0x3FF9 // XT 
#define LP   0x3FF8 // LP 
// Watchdog Timer 
#define WDTEN  0x3FFF // On 
#define WDTDIS  0x3FF7 // Disabled/SWDTEN control 
// Power Up Timer 
#define PWRTDIS  0x3FFF // Off 
#define PWRTEN  0x3FEF // On 
// Master Clear Enable 
#define MCLREN  0x3FFF // MCLR function is enabled 
#define MCLRDIS  0x3FDF // MCLR functions as IO 
// Code Protect 
#define UNPROTECT  0x3FFF // Code is not protected 
#define CP   0x3FBF // Code is protected 
#define PROTECT  CP //alternate 
// Data EE Read Protect 
#define UNPROTECT  0x3FFF // Do not read protect EEPROM data 
#define CPD   0x3F7F // Read protect EEPROM data 
// Brown Out Detect 
#define BORDIS  0x3CFF // BOD and SBOREN disabled 
#define SWBOREN  0x3DFF // SBOREN controls BOR function (Software control) 
#define BORXSLP  0x3EFF // BOD enabled in run, disabled in sleep, SBOREN disabled 
#define BOREN  0x3FFF // BOD Enabled, SBOREN Disabled 
// Internal External Switch Over Mode 
#define IESOEN  0x3FFF // Enabled 
#define IESODIS  0x3BFF // Disabled 
// Monitor Clock Fail-safe 
#define FCMEN  0x3FFF // Enabled 
#define FCMDIS  0x37FF // Disabled 
// In-Circuit Debugger Mode 
#define DEBUGEN  0x2FFF // Enable ICD2 debugging 
#define DEBUGDIS  0x3FFF // Disable ICD2 debugging 

OSCCON定義,你應該在 「cas16f913.h」 文件中找到......

OSCCON         equ 008Fh 
#define SCS_bit      BANKMASK(OSCCON), 0 
#define LTS_bit      BANKMASK(OSCCON), 1 
#define HTS_bit      BANKMASK(OSCCON), 2 
#define OSTS_bit      BANKMASK(OSCCON), 3 
#define IRCF0_bit      BANKMASK(OSCCON), 4 
#define IRCF1_bit      BANKMASK(OSCCON), 5 
#define IRCF2_bit      BANKMASK(OSCCON), 6 
+0

我不知道如何去這樣做,我想FOSC2(在配置線),但沒有工作,我想FOSC <2:0> = 100在配置行,你能澄清「如何」做它?比如Config行應該是什麼樣子? (也許我可以自己想出這一個也不錯) – onaclov2000

+0

好吧,我已經添加了在哪裏可以找到聲明...... :) –

+0

原來我需要使用外部振盪器,我得到了一個來自朋友的16Mhz水晶,我只需要弄清楚我打算如何實際連接它,一旦完成,我可以驗證你的建議,並且實際上將它標記爲正確,如果它解決了我的問題.... :)對不起很長的延遲 – onaclov2000

0

只是要確保您的TX功能將工作,使用這種方式:

void vTxChar (unsigned char ucByte) 
{ 
    while (!TXIF); //Waits for previous transfer to be done 
    TXREG = ucByte; //Loads TXREG with your value 
} 

此while循環會檢查發送中斷標誌(即使未設置),以查看TXREG是空還是仍然以前一個值設置。

根據您的XTAL頻率,您的SPBRG值會有所不同,計算正確,然後在計算機上檢查您是否有正確的波特率值。

16MHZ, BRGH=1, your SPBRG value for 9600 BDS = 0x68.