0

我在下面附上了我的代码(我正在闪烁一个 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;   
}
4

2 回答 2

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

您应该在“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
于 2011-08-01T09:10:48.663 回答
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.
于 2014-07-03T12:26:26.583 回答