我在下面附上了我的代码(我正在闪烁一个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;
}
答案 0 :(得分:1)
首先,您必须将内部振荡器设置为适当的CPU频率。
因此首先在__CONFIG寄存器位中设置FOSC&lt; 2:0&gt; =(100)选择内部振荡器,在程序开始时设置OSCCON寄存器中的IRCF2,IRCF1和IRCF0位到所需的振荡器频率,默认频率为4Mhz。
比初始化UART
编辑:
配置内部时钟使用:
#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.