【问题标题】:Pic 16F913 UART communications setup图 16F913 UART 通讯设置
【发布时间】:2023-03-12 22:30:01
【问题描述】:

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

【问题讨论】:

    标签: microcontroller pic uart


    【解决方案1】:

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

    所以首先在 __CONFIG 寄存器中设置 FOSC = (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
    

    【讨论】:

    • 我不知道该怎么做我尝试了 FOSC2(在配置行中)但是没有用,我在配置行中尝试了 FOSC = 100,可以你澄清“如何”做到这一点?像 Config 行应该是什么样子? (也许我自己能解决这个问题也不错)
    • 好的,我已经添加了在哪里可以找到声明... :)
    • 原来我需要使用外部振荡器,我从朋友那里得到了一个 16Mhz 晶体,我只需要弄清楚我打算如何实际连接它,一旦完成,我可以验证您的建议,如果它对我有用,实际上将其标记为正确.... :) 抱歉耽搁了这么久
    【解决方案2】:

    为了确保您的 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      相关资源
      最近更新 更多