Pic 16F913 Настройка связи UART - PullRequest
0 голосов
/ 01 августа 2011

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

Я не получаю никаких данных, отправленных через 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;   
}

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Прежде всего вам необходимо настроить внутренний генератор на соответствующую частоту процессора.

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

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

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

EDIT:

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

#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
0 голосов
/ 03 июля 2014

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