Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Симуляция UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
asp
Подскажите пожалуйста!

Вопрос в том что вывести в окно символ получается, а ввести пишет

UART-W0002: Read attempted from an Empty RCREG SFR, invalid data

Примеры в Хелпе для PIC18, а у меня PIC16F877A

Подскажите что я делаю не так?

Создао специально простой пример для теста:

#include <pic.h>
__CONFIG(0x03F72);

unsigned char indata;
unsigned char outdata;

void main(void)
{
// Инициализация USART
SPBRG = 25; // Установка скорости обмена данными 2400 при 4 МГц
BRGH = 0; // Низкоскоростной режим генератора частоты обмена
SYNC = 0; // Асинхронный режим передачи данных
SPEN = 1; // Включаем модуль USART
CREN = 1; // Разрешаем прием данных
TXEN = 1; // Разрешаем передачу данных


while(1)
{
if(RCIF)
{
indata = RCREG;
if(indata==100)
{
TXREG=indata;
}
}
}
}

Оздаю файл indata.txt

//single-packet example
wait 20 ms
10 20 34

Подключаю его Debugger>Settings, UART IO tab.

# Устанавливаю "Enable UART1 I/O".
# Выбираю indata.txt as the "Input" file. Check "Rewind Input" so the program will read the input file again once it has reached the end-of-file.
# Выбираю "Window" under "Output" to display USART output on the SIM UART1 tab of the Output window

Компилирую.

Прохожу МПЛАБ СИМ:

1. Флаг RCIF не устанавливается, соответственно не попаем на фрагмент считывания из RCREG.

2. Изменяю if(RCIF) на if(!RCIF) получаю sad.gif

UART-W0002: Read attempted from an Empty RCREG SFR, invalid data

Подскажите пожалуйста где копать.
George!
Условие if(RCIF) правильное.
Прерывания запрещены? Может ты не попадаешь в блок if(RCIF){...} потому что программа блуждает где-то в прерываниях?
Попробуй вводить данные другим способом.
Debuger->Stimulus->New Workbook
Появится окно. Там выбери закладкуAsynch. В ячейке под Pin/SFR выбери из списка RCREG. В Action установи Direct Message. Commen/Message - произвольноя строка.
Чтоб запустить передачу этой строки надо нажать на символ ">" в столбце Fire
DL36
Так я вроде ответил

Код
    if((RCIE)&&(RCIF)){
        if((FERR)||(OERR))
        {
            unsigned char tmp;
            tmp = RCREG;
            tmp = RCREG;
            RCIE=0; // Заперет приема
            StatusUsart.err=1;
            SPEN    =0;
        }//if((FERR)||(OERR))
        else
        {  
            if (ADDEN)
            {
                if (RCREG==AddressRx)
                {                    
                    ADDEN=0;
                    IndexRx=sizeof(UsartDataRx)-1;
                    UsartDataRx[IndexRx--]=RCREG;
                }//if (RCREG==AddressRx)    
            }//if (ADDEN)
            else
            {
                UsartDataRx[IndexRx]=RCREG;                
                if (!(IndexRx--)) {StatusUsart.rx=1;ADDEN=1;}
            }//else if (ADDEN)
        }//else if((FERR)||(OERR))
    }//if((RCIE)&&(RCIF))



Код
#define BAUD 4800      
#define FOSC 4000000L
#define NINE 1     /* Use 9bit communication? FALSE=8bit */
#define ADD_EN 1

#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1

#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif

#if ADD_EN == 1
#define ADD_EN_BITS 0x08
#else
#define ADD_EN_BITS 0
#endif


#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif

#if defined(_16F87) || defined(_16F88)
    #define RX_PIN TRISB2
    #define TX_PIN TRISB5
#else
    #define RX_PIN TRISC7
    #define TX_PIN TRISC6
#endif

/* Serial initialization */
#define INIT_USART()\
    RX_PIN = 1;    \
    TX_PIN = 1;          \
    SPBRG = DIVIDER;         \
    RCSTA = (NINE_BITS|ADD_EN_BITS|NINE_BITS);    \
    TXSTA = (SPEED|NINE_BITS)

В приложении файлы настройки симуляции usart правда мплаб приблизительно 7.20-7.40
asp
Огромное спасибо всем откликнувшимся!

С Вашей помощью начало получаться!

Буду разбираться более детально!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.