roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 22:50

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Проблема Работы c Uart
СообщениеДобавлено: 29 мар 2011, 19:57 
Не в сети

Зарегистрирован: 04 май 2009, 07:46
Сообщения: 1
Откуда: Новосибирск
Доброго времени суток!
Программа рассчитана для Silabs C8051F410.
отладка в кейле
В общем я хотел реализовать простой алгоритм. Отправляем четыре байта через терминал в контроллер, и принимаем от него те же 4 байта.
но почему то идет повтор первых двух байтов при передачи MCU->PC.
Не могу найти ошибку. Может Вы взглянете свежим взглядом?
Текст программы ниже. попытался как можно подробней за комментировать.
Код:
#include "D:\progects\test\macros\Includes.h"
/********** привел только объявление переменных. настройка УАПП взята из примера в IDE***********/

int UART_Buffer[3];
unsigned char TX_Ready =1;
static char Byte;
char i=0,temp;
bit stop=0,TxEn=0,RxEn=0;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------

void main (void)
{
   PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer
                                       // enable)
   PORT_Init();                        // Initialize Port I/O
   SYSCLK_Init ();                     // Initialize Oscillator
   UART0_Init();
   P2=0x00;
   EA = 0;                                                         
   MCE0 = 0;
   RI0=0;
   TI0=0;
   
   while (1)
   {
                RxEn=1;
                while(stop!=1)                                                                                                  // пока не передана посылка - остаемся в цикле
                {
                        while(RxEn==1)                                                                                          // разрешаем обработку приема
                        {               
                                REN0=1;                                                                                                 // разрешаем прием по UART
                                if(RI0==1)                                                                                              // как только пришел стоп-бит то...
                                {       
                                        UART_Buffer[i]=SBUF0;                                                           // помещаем первый принятый байт в ячейку 0 массива                                                                                                                             
                                        i++;                                                                                            // переходим к следующей ячейке
                                        RI0=0;                                                                                          // сбрасываем флаг для прием сделующего байта
                                        if (i==3)                                                                                       // если приняли 3 байта (заполненны 0...3 ячейки) то...
                                        {               
                                                REN0=0;                                                                                 // запрещаем чтение по УАПП
                                                RxEn=0;                                                                                 // запрещаем обработку предыдущего оператора while
                                                TxEn=1;                                                                                 // разрешаем обработку оператора while, отвечающего за передачу MCU->CPU
                                                i=0;                                                                                    // сбрасываем номер ячейки массива данных УАППа
                                        }       
                                        RI0=0;                                                                                          // обнуляем флаг
                                }                                       
                        while (TxEn==1)                                                                                         // обрабатываем передачу данных MCU->CPU
                        {
                                SBUF0=UART_Buffer[i];                                                                   // помещаем первый байт из ячекий 0 массива принятых данных
                                if(TI0==1)                                                                                              // при окончании передачи...
                                {       
                                        i++;                                                                                            // перемещаемся значение переменной на следующию ячейку массива
                                        TI0=0;                                                                                          // сбрасываем флаг для следующей передачи
                                        if (i==3)                                                                                       // если переданны все байты (из ячеек 0...3 массива) то....
                                        {
                                                i=0;                                                                                    // обнуляемся
                                                stop=1;                                                                                 // выходим из цикла
                                                TxEn=0;                                                                                 // запрещаем обработку передачи (можно и без него)
                                        }
                                }
                        }       
                           
                }       
      }
  }
}

Скрин того что передаю/принимаю
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема Работы c Uart
СообщениеДобавлено: 30 мар 2011, 12:40 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
Потому что SBUF0=UART_Buffer[i] выполняется постоянно. Его надо занести под условие TI0=1. А вначале дать SBUF0=UART_Buffer[i++] один раз при включении Tx.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO