Рис 16F913 Настройка связи UART

Я прикрепил свой код ниже (кстати, я мигаю светодиодом, чтобы увидеть, что происходит цикл).

Я не получаю никаких данных, отправленных через UART, у меня есть Pic 16F913, и я пытаюсь получить вывод 17, я подключил его к модулю bluetooth RF-42N, я знаю, что модуль работает, потому что, если я подключу rx к tx, я получу эхо. Затем я попробовал следующую настройку, чтобы отправить букву «z» в модуль Bluetooth (и, надеюсь, прочитать на моем телефоне, используя 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;   
}

person onaclov2000    schedule 01.08.2011    source источник


Ответы (2)


Прежде всего, вы должны настроить внутренний генератор на соответствующую частоту процессора.

Поэтому установите сначала в регистре __CONFIG биты FOSC‹2:0> = (100) для выбора внутреннего генератора, после этого установите в самом начале программы биты IRCF2, IRCF1 и IRCF0 в регистре OSCCON на желаемую частоту генератора, частота по умолчанию 4 МГц.

Чем инициализировать UART

  1. Инициируйте выводы ЦП, поскольку некоторые выводы используются совместно с другими периферийными устройствами MCPU.
  2. Загрузите в регистр SPBRG правильный номер, зависящий от вашей скорости передачи данных и тактовой частоты процессора (см. техническое описание).
  3. Установка бита BRGH в регистре TXSTA зависит от желаемой скорости передачи данных генератора (см. техническое описание).

РЕДАКТИРОВАТЬ:

Для настройки внутренних часов используйте:

#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
person GJ.    schedule 01.08.2011
comment
Я не уверен, как это сделать. Я пробовал FOSC2 (в строке конфигурации), но это не сработало, я пробовал FOSC‹2:0› = 100 в строке конфигурации, можете ли вы пояснить, как это сделать? как должна выглядеть строка конфигурации? (может быть, как я могу понять это самостоятельно, было бы неплохо) - person onaclov2000; 08.08.2011
comment
Хорошо, я добавил, где найти объявления... :) - person GJ.; 08.08.2011
comment
Оказывается, мне нужно будет использовать внешний генератор, я получил 16 МГц кристалл от друга, мне просто нужно выяснить, как я планирую на самом деле подключить его, как только это будет сделано, я могу проверить ваше предложение, и на самом деле отметьте это как правильное, если это сработает для меня.... :) Извините за долгую задержку - person onaclov2000; 13.10.2011

Просто чтобы убедиться, что ваша функция 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.
person Jean-francois    schedule 03.07.2014