图16F913 UART通信设置

时间:2011-08-01 00:25:21

标签: microcontroller pic uart

我在下面附上了我的代码(我正在闪烁一个LED,以便能够看到循环正在发生BTW)。

我没有通过UART发送任何数据,我有Pic 16F913,而引脚17是我想要的输出,我把它连接到RF-42N蓝牙模块,我知道模块工作,因为如果我将rx连接到tx,我会得到一个回声。然后我尝试了以下设置将字母“z”发送到蓝牙模块(希望在我的手机上阅读,使用blueterm)。 我没有得到任何数据,我不知道默认的FOSC是什么设置的,所以我尝试了各种值的SPBRG希望我能够“猜测”正确的,但他们似乎没有工作

我正在使用Hi-Tech 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;   
}

2 个答案:

答案 0 :(得分:1)

首先,您必须将内部振荡器设置为适当的CPU频率。

因此首先在__CONFIG寄存器位中设置FOSC&lt; 2:0&gt; =(100)选择内部振荡器,在程序开始时设置OSCCON寄存器中的IRCF2,IRCF1和IRCF0位到所需的振荡器频率,默认频率为4Mhz。

比初始化UART

  1. 启动CPU引脚,因为某些引脚与其他MCPU外设共用。
  2. 加载到SPBRG寄存器中,正确的数字取决于您的波特率和 CPU时钟频率(检查数据表)。
  3. 将寄存器TXSTA中的BRGH位置1取决于所需的波特率发生器 (查看数据表)。
  4. 编辑:

    配置内部时钟使用:

    #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
    

    你应该在“cas16f913.h”文件中找到OSCCON定义...

    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
    

答案 1 :(得分: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.