roboforum.ru

Технический форум по робототехнике.

Проблема Работы c Uart

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Проблема Работы c Uart

Сообщение Chip115 » 29 мар 2011, 19:57

Доброго времени суток!
Программа рассчитана для 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;                                                                                 // запрещаем обработку передачи (можно и без него)
                                        }
                                }
                        }       
                           
                }       
      }
  }
}

Скрин того что передаю/принимаю
Изображение
Chip115
 
Сообщения: 1
Зарегистрирован: 04 май 2009, 07:46
Откуда: Новосибирск

Re: Проблема Работы c Uart

Сообщение boez » 30 мар 2011, 12:40

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


Вернуться в Микроконтроллеры

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

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